From bb087aad196217ab308c03a3fd5917c6ef7df395 Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 11:58:56 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- .fvmrc | 3 + .github/FUNDING.yml | 1 + .github/ISSUE_TEMPLATE/bug_report.yml | 95 + .github/ISSUE_TEMPLATE/config.yml | 18 + .github/ISSUE_TEMPLATE/feature_request.yml | 59 + .github/dependabot.yml | 7 + .github/release-drafter.yml | 10 + .github/workflows/ci.yml | 105 + .github/workflows/clear_workflows.yml | 57 + .github/workflows/compile_apk.yml | 86 + .github/workflows/compile_arm64_appimage.yml | 72 + .github/workflows/linux_build.yml | 101 + .github/workflows/release.yml | 575 ++ .github/workflows/test_arm64_deb.yml | 75 + .github/workflows/test_arm64_tar.yml | 55 + .github/workflows/test_rpm.yml | 81 + .github/workflows/test_zip.yml | 67 + .github/workflows/winget.yml | 13 + .gitignore | 12 + .gitmodules | 3 + CHANGELOG.md | 1 + CONTRIBUTING.md | 200 + LICENSE | 201 + README.md | 263 + README.wehub.md | 7 + app/.gitignore | 47 + app/analysis_options.yaml | 33 + app/android/.gitignore | 13 + app/android/app/build.gradle | 102 + app/android/app/src/debug/AndroidManifest.xml | 13 + app/android/app/src/main/AndroidManifest.xml | 90 + .../app/src/main/ic_launcher-playstore.png | Bin 0 -> 22574 bytes .../localsend_app/FastDocumentFile.kt | 141 + .../org/localsend/localsend_app/FileOpener.kt | 93 + .../localsend/localsend_app/MainActivity.kt | 302 + .../localsend_app/QuickTileService.kt | 101 + .../res/drawable-v21/launch_background.xml | 12 + .../app/src/main/res/drawable/banner.png | Bin 0 -> 8472 bytes .../res/drawable/ic_launcher_foreground.xml | 26 + .../main/res/drawable/launch_background.xml | 12 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4080 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 1235 bytes .../mipmap-hdpi/ic_launcher_monochrome.png | Bin 0 -> 1722 bytes .../ic_launcher_quicktile_foreground.png | Bin 0 -> 3301 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2120 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 844 bytes .../mipmap-mdpi/ic_launcher_monochrome.png | Bin 0 -> 1218 bytes .../ic_launcher_quicktile_foreground.png | Bin 0 -> 1905 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5757 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 1683 bytes .../mipmap-xhdpi/ic_launcher_monochrome.png | Bin 0 -> 2497 bytes .../ic_launcher_quicktile_foreground.png | Bin 0 -> 4713 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9022 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 3028 bytes .../mipmap-xxhdpi/ic_launcher_monochrome.png | Bin 0 -> 4291 bytes .../ic_launcher_quicktile_foreground.png | Bin 0 -> 7712 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 13034 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 4365 bytes .../mipmap-xxxhdpi/ic_launcher_monochrome.png | Bin 0 -> 6000 bytes .../ic_launcher_quicktile_foreground.png | Bin 0 -> 11052 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 13034 bytes .../app/src/main/res/values-night/styles.xml | 20 + .../res/values/ic_launcher_background.xml | 4 + .../app/src/main/res/values/styles.xml | 20 + .../app/src/profile/AndroidManifest.xml | 8 + app/android/build.gradle | 34 + app/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + app/android/settings.gradle | 25 + app/assets/CHANGELOG.md | 360 ++ app/assets/i18n/_missing_translations_ar.json | 6 + app/assets/i18n/_missing_translations_az.json | 341 ++ app/assets/i18n/_missing_translations_bg.json | 6 + app/assets/i18n/_missing_translations_bn.json | 6 + app/assets/i18n/_missing_translations_ca.json | 42 + app/assets/i18n/_missing_translations_cs.json | 6 + app/assets/i18n/_missing_translations_da.json | 44 + app/assets/i18n/_missing_translations_de.json | 6 + app/assets/i18n/_missing_translations_el.json | 6 + .../i18n/_missing_translations_en_IN.json | 6 + .../i18n/_missing_translations_es_ES.json | 6 + app/assets/i18n/_missing_translations_et.json | 6 + app/assets/i18n/_missing_translations_eu.json | 130 + app/assets/i18n/_missing_translations_fa.json | 6 + app/assets/i18n/_missing_translations_fi.json | 40 + .../i18n/_missing_translations_fil_PH.json | 6 + app/assets/i18n/_missing_translations_fr.json | 6 + app/assets/i18n/_missing_translations_gl.json | 351 ++ app/assets/i18n/_missing_translations_gu.json | 91 + app/assets/i18n/_missing_translations_he.json | 6 + app/assets/i18n/_missing_translations_hi.json | 6 + app/assets/i18n/_missing_translations_hu.json | 6 + app/assets/i18n/_missing_translations_id.json | 6 + app/assets/i18n/_missing_translations_it.json | 6 + app/assets/i18n/_missing_translations_ja.json | 22 + app/assets/i18n/_missing_translations_km.json | 22 + app/assets/i18n/_missing_translations_ko.json | 6 + app/assets/i18n/_missing_translations_ml.json | 269 + app/assets/i18n/_missing_translations_mn.json | 209 + app/assets/i18n/_missing_translations_ms.json | 59 + app/assets/i18n/_missing_translations_ne.json | 19 + app/assets/i18n/_missing_translations_nl.json | 6 + app/assets/i18n/_missing_translations_pl.json | 6 + .../i18n/_missing_translations_pt_BR.json | 6 + .../i18n/_missing_translations_pt_PT.json | 91 + app/assets/i18n/_missing_translations_ro.json | 6 + app/assets/i18n/_missing_translations_ru.json | 6 + app/assets/i18n/_missing_translations_si.json | 22 + app/assets/i18n/_missing_translations_sk.json | 6 + app/assets/i18n/_missing_translations_sl.json | 42 + app/assets/i18n/_missing_translations_sr.json | 6 + .../i18n/_missing_translations_sr_Cyrl.json | 6 + app/assets/i18n/_missing_translations_sv.json | 6 + app/assets/i18n/_missing_translations_ta.json | 6 + app/assets/i18n/_missing_translations_th.json | 60 + app/assets/i18n/_missing_translations_tr.json | 29 + app/assets/i18n/_missing_translations_uk.json | 6 + app/assets/i18n/_missing_translations_ur.json | 51 + app/assets/i18n/_missing_translations_vi.json | 22 + .../i18n/_missing_translations_zh_CN.json | 6 + .../i18n/_missing_translations_zh_HK.json | 22 + .../i18n/_missing_translations_zh_TW.json | 6 + app/assets/i18n/_unused_translations.json | 73 + app/assets/i18n/ar.json | 535 ++ app/assets/i18n/az.json | 457 ++ app/assets/i18n/bg.json | 465 ++ app/assets/i18n/bn.json | 535 ++ app/assets/i18n/ca.json | 527 ++ app/assets/i18n/cs.json | 457 ++ app/assets/i18n/da.json | 457 ++ app/assets/i18n/de.json | 465 ++ app/assets/i18n/el.json | 527 ++ app/assets/i18n/en-IN.json | 535 ++ app/assets/i18n/en.json | 535 ++ app/assets/i18n/es-ES.json | 465 ++ app/assets/i18n/et.json | 465 ++ app/assets/i18n/eu.json | 405 ++ app/assets/i18n/fa.json | 527 ++ app/assets/i18n/fi.json | 542 ++ app/assets/i18n/fil-PH.json | 527 ++ app/assets/i18n/fr.json | 465 ++ app/assets/i18n/gl.json | 465 ++ app/assets/i18n/gu.json | 535 ++ app/assets/i18n/he.json | 457 ++ app/assets/i18n/hi.json | 527 ++ app/assets/i18n/hu.json | 465 ++ app/assets/i18n/id.json | 455 ++ app/assets/i18n/it.json | 465 ++ app/assets/i18n/ja.json | 461 ++ app/assets/i18n/km.json | 520 ++ app/assets/i18n/ko.json | 457 ++ app/assets/i18n/ml.json | 443 ++ app/assets/i18n/mn.json | 266 + app/assets/i18n/ms.json | 524 ++ app/assets/i18n/ne.json | 525 ++ app/assets/i18n/nl.json | 465 ++ app/assets/i18n/pl.json | 465 ++ app/assets/i18n/pt-BR.json | 525 ++ app/assets/i18n/pt-PT.json | 538 ++ app/assets/i18n/ro.json | 525 ++ app/assets/i18n/ru.json | 465 ++ app/assets/i18n/si.json | 457 ++ app/assets/i18n/sk.json | 535 ++ app/assets/i18n/sl.json | 501 ++ app/assets/i18n/sr-Cyrl.json | 527 ++ app/assets/i18n/sr.json | 527 ++ app/assets/i18n/sv.json | 535 ++ app/assets/i18n/ta.json | 527 ++ app/assets/i18n/th.json | 527 ++ app/assets/i18n/tr.json | 465 ++ app/assets/i18n/uk.json | 465 ++ app/assets/i18n/ur.json | 424 ++ app/assets/i18n/vi.json | 457 ++ app/assets/i18n/zh-CN.json | 534 ++ app/assets/i18n/zh-HK.json | 458 ++ app/assets/i18n/zh-TW.json | 461 ++ app/assets/img/logo-128.png | Bin 0 -> 1042 bytes app/assets/img/logo-256.png | Bin 0 -> 2098 bytes app/assets/img/logo-32-black.png | Bin 0 -> 578 bytes app/assets/img/logo-32-white.png | Bin 0 -> 913 bytes app/assets/img/logo-32.png | Bin 0 -> 599 bytes app/assets/img/logo-512-white.png | Bin 0 -> 6234 bytes app/assets/img/logo-512.png | Bin 0 -> 4688 bytes app/assets/img/logo.ico | Bin 0 -> 109492 bytes app/assets/packaging/logo.ico | Bin 0 -> 109492 bytes app/assets/web/error-403.html | 11 + app/assets/web/index.html | 98 + app/assets/web/main.js | 178 + app/build.yaml | 22 + app/flutter_rust_bridge.yaml | 3 + app/ios/.gitignore | 34 + app/ios/Flutter/AppFrameworkInfo.plist | 24 + app/ios/Flutter/Debug.xcconfig | 2 + app/ios/Flutter/Release.xcconfig | 2 + app/ios/MyLocalSendStoreKit.storekit | 140 + app/ios/Podfile | 48 + app/ios/Podfile.lock | 210 + app/ios/Runner.xcodeproj/project.pbxproj | 845 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 93 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + app/ios/Runner/AppDelegate.swift | 27 + .../AppIcon.appiconset/Contents.json | 116 + .../AppIcon.appiconset/Icon-App-1024.png | Bin 0 -> 46025 bytes .../AppIcon.appiconset/Icon-App-20.png | Bin 0 -> 1340 bytes .../AppIcon.appiconset/Icon-App-20@2x.png | Bin 0 -> 1699 bytes .../AppIcon.appiconset/Icon-App-20@3x.png | Bin 0 -> 1971 bytes .../AppIcon.appiconset/Icon-App-29.png | Bin 0 -> 1479 bytes .../AppIcon.appiconset/Icon-App-29@2x.png | Bin 0 -> 1917 bytes .../AppIcon.appiconset/Icon-App-29@3x.png | Bin 0 -> 2391 bytes .../AppIcon.appiconset/Icon-App-40.png | Bin 0 -> 1699 bytes .../AppIcon.appiconset/Icon-App-40@2x.png | Bin 0 -> 2261 bytes .../AppIcon.appiconset/Icon-App-40@3x.png | Bin 0 -> 3054 bytes .../AppIcon.appiconset/Icon-App-60@2x.png | Bin 0 -> 3054 bytes .../AppIcon.appiconset/Icon-App-60@3x.png | Bin 0 -> 6444 bytes .../AppIcon.appiconset/Icon-App-76.png | Bin 0 -> 2229 bytes .../AppIcon.appiconset/Icon-App-76@2x.png | Bin 0 -> 3632 bytes .../AppIcon.appiconset/Icon-App-83.5@2x.png | Bin 0 -> 3876 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + app/ios/Runner/Base.lproj/Main.storyboard | 26 + app/ios/Runner/Info.plist | 172 + app/ios/Runner/Runner-Bridging-Header.h | 1 + app/ios/Runner/Runner.entitlements | 14 + .../Base.lproj/MainInterface.storyboard | 24 + app/ios/ShareExtension/Info.plist | 40 + .../ShareExtension.entitlements | 10 + .../ShareExtension/ShareViewController.swift | 3 + app/lib/config/init.dart | 342 ++ app/lib/config/init_error.dart | 83 + app/lib/config/refena.dart | 34 + app/lib/config/theme.dart | 204 + app/lib/gen/assets.gen.dart | 149 + app/lib/gen/strings.g.dart | 956 ++++ app/lib/gen/strings_ar.g.dart | 1518 +++++ app/lib/gen/strings_az.g.dart | 1413 +++++ app/lib/gen/strings_bg.g.dart | 1437 +++++ app/lib/gen/strings_bn.g.dart | 1520 +++++ app/lib/gen/strings_ca.g.dart | 1500 +++++ app/lib/gen/strings_cs.g.dart | 1411 +++++ app/lib/gen/strings_da.g.dart | 1411 +++++ app/lib/gen/strings_de.g.dart | 1438 +++++ app/lib/gen/strings_el.g.dart | 1501 +++++ app/lib/gen/strings_en.g.dart | 1775 ++++++ app/lib/gen/strings_en_IN.g.dart | 1524 +++++ app/lib/gen/strings_es_ES.g.dart | 1443 +++++ app/lib/gen/strings_et.g.dart | 1437 +++++ app/lib/gen/strings_eu.g.dart | 1272 +++++ app/lib/gen/strings_fa.g.dart | 1498 +++++ app/lib/gen/strings_fi.g.dart | 1527 +++++ app/lib/gen/strings_fil_PH.g.dart | 1510 +++++ app/lib/gen/strings_fr.g.dart | 1438 +++++ app/lib/gen/strings_gl.g.dart | 1438 +++++ app/lib/gen/strings_gu.g.dart | 1518 +++++ app/lib/gen/strings_he.g.dart | 1409 +++++ app/lib/gen/strings_hi.g.dart | 1497 +++++ app/lib/gen/strings_hu.g.dart | 1437 +++++ app/lib/gen/strings_id.g.dart | 1408 +++++ app/lib/gen/strings_it.g.dart | 1438 +++++ app/lib/gen/strings_ja.g.dart | 1405 +++++ app/lib/gen/strings_km.g.dart | 1477 +++++ app/lib/gen/strings_ko.g.dart | 1405 +++++ app/lib/gen/strings_ml.g.dart | 1379 +++++ app/lib/gen/strings_mn.g.dart | 810 +++ app/lib/gen/strings_ms.g.dart | 1497 +++++ app/lib/gen/strings_ne.g.dart | 1496 +++++ app/lib/gen/strings_nl.g.dart | 1438 +++++ app/lib/gen/strings_pl.g.dart | 1435 +++++ app/lib/gen/strings_pt_BR.g.dart | 1521 +++++ app/lib/gen/strings_pt_PT.g.dart | 1533 ++++++ app/lib/gen/strings_ro.g.dart | 1495 +++++ app/lib/gen/strings_ru.g.dart | 1437 +++++ app/lib/gen/strings_si.g.dart | 1415 +++++ app/lib/gen/strings_sk.g.dart | 1519 +++++ app/lib/gen/strings_sl.g.dart | 1418 +++++ app/lib/gen/strings_sr.g.dart | 1502 +++++ app/lib/gen/strings_sr_Cyrl.g.dart | 1504 +++++ app/lib/gen/strings_sv.g.dart | 1520 +++++ app/lib/gen/strings_ta.g.dart | 1500 +++++ app/lib/gen/strings_th.g.dart | 1500 +++++ app/lib/gen/strings_tr.g.dart | 1436 +++++ app/lib/gen/strings_uk.g.dart | 1437 +++++ app/lib/gen/strings_ur.g.dart | 1313 +++++ app/lib/gen/strings_vi.g.dart | 1413 +++++ app/lib/gen/strings_zh_CN.g.dart | 1517 +++++ app/lib/gen/strings_zh_HK.g.dart | 1411 +++++ app/lib/gen/strings_zh_TW.g.dart | 1425 +++++ app/lib/main.dart | 90 + app/lib/model/cross_file.dart | 40 + app/lib/model/cross_file.mapper.dart | 217 + app/lib/model/log_entry.dart | 19 + app/lib/model/log_entry.mapper.dart | 130 + app/lib/model/persistence/color_mode.dart | 6 + .../model/persistence/favorite_device.dart | 47 + .../persistence/favorite_device.mapper.dart | 183 + .../persistence/receive_history_entry.dart | 57 + .../receive_history_entry.mapper.dart | 233 + app/lib/model/send_mode.dart | 5 + app/lib/model/state/nearby_devices_state.dart | 60 + .../state/nearby_devices_state.mapper.dart | 211 + app/lib/model/state/network_state.dart | 14 + app/lib/model/state/network_state.mapper.dart | 149 + app/lib/model/state/purchase_state.dart | 46 + .../model/state/purchase_state.mapper.dart | 165 + .../model/state/send/send_session_state.dart | 60 + .../state/send/send_session_state.mapper.dart | 270 + app/lib/model/state/send/sending_file.dart | 37 + .../model/state/send/sending_file.mapper.dart | 209 + .../model/state/send/web/web_send_file.dart | 20 + .../state/send/web/web_send_file.mapper.dart | 163 + .../state/send/web/web_send_session.dart | 20 + .../send/web/web_send_session.mapper.dart | 167 + .../model/state/send/web/web_send_state.dart | 27 + .../state/send/web/web_send_state.mapper.dart | 223 + .../state/server/receive_session_state.dart | 75 + .../server/receive_session_state.mapper.dart | 298 + .../model/state/server/receiving_file.dart | 26 + .../state/server/receiving_file.mapper.dart | 193 + app/lib/model/state/server/server_state.dart | 32 + .../state/server/server_state.mapper.dart | 210 + app/lib/model/state/settings_state.dart | 67 + .../model/state/settings_state.mapper.dart | 441 ++ app/lib/pages/about/about_page.dart | 220 + app/lib/pages/about/contributors.dart | 20 + app/lib/pages/about/packagers.dart | 37 + app/lib/pages/about/translators.dart | 110 + app/lib/pages/apk_picker_page.dart | 286 + app/lib/pages/changelog_page.dart | 35 + app/lib/pages/debug/debug_page.dart | 94 + app/lib/pages/debug/discovery_debug_page.dart | 55 + app/lib/pages/debug/http_logs_page.dart | 48 + app/lib/pages/debug/security_debug_page.dart | 48 + app/lib/pages/donation/donation_page.dart | 123 + app/lib/pages/donation/donation_page_vm.dart | 51 + app/lib/pages/home_page.dart | 199 + app/lib/pages/home_page_controller.dart | 46 + app/lib/pages/language_page.dart | 71 + app/lib/pages/progress_page.dart | 595 ++ app/lib/pages/receive_history_page.dart | 242 + app/lib/pages/receive_options_page.dart | 194 + app/lib/pages/receive_page.dart | 351 ++ app/lib/pages/selected_files_page.dart | 149 + app/lib/pages/send_page.dart | 208 + .../settings/network_interfaces_page.dart | 223 + app/lib/pages/tabs/receive_tab.dart | 257 + app/lib/pages/tabs/receive_tab_vm.dart | 82 + app/lib/pages/tabs/send_tab.dart | 592 ++ app/lib/pages/tabs/send_tab_vm.dart | 209 + app/lib/pages/tabs/settings_tab.dart | 770 +++ .../pages/tabs/settings_tab_controller.dart | 241 + app/lib/pages/tabs/settings_tab_vm.dart | 63 + .../pages/tabs/settings_tab_vm.mapper.dart | 473 ++ app/lib/pages/troubleshoot_page.dart | 227 + app/lib/pages/web_send_page.dart | 361 ++ app/lib/provider/animation_provider.dart | 36 + app/lib/provider/apk_provider.dart | 55 + app/lib/provider/app_arguments_provider.dart | 7 + app/lib/provider/device_info_provider.dart | 50 + app/lib/provider/favorites_provider.dart | 84 + app/lib/provider/http_provider.dart | 19 + app/lib/provider/last_devices.provider.dart | 29 + app/lib/provider/local_ip_provider.dart | 137 + .../logging/discovery_logs_provider.dart | 31 + .../provider/logging/http_logs_provider.dart | 32 + .../network/nearby_devices_provider.dart | 246 + app/lib/provider/network/scan_facade.dart | 82 + app/lib/provider/network/send_provider.dart | 661 +++ .../network/server/controller/common.dart | 38 + .../server/controller/receive_controller.dart | 882 +++ .../server/controller/send_controller.dart | 329 ++ .../network/server/server_provider.dart | 265 + .../provider/network/server/server_utils.dart | 27 + .../network/webrtc/signaling_provider.dart | 249 + .../webrtc/signaling_provider.mapper.dart | 196 + .../network/webrtc/webrtc_receiver.dart | 210 + .../webrtc/webrtc_receiver.mapper.dart | 195 + .../provider/param/apk_provider_param.dart | 18 + .../param/apk_provider_param.mapper.dart | 182 + .../param/cached_apk_provider_param.dart | 16 + .../cached_apk_provider_param.mapper.dart | 179 + app/lib/provider/persistence_provider.dart | 552 ++ .../persistence_provider_migrations.dart | 35 + app/lib/provider/progress_provider.dart | 38 + app/lib/provider/purchase_provider.dart | 193 + .../provider/receive_history_provider.dart | 97 + app/lib/provider/security_provider.dart | 37 + .../selected_receiving_files_provider.dart | 71 + .../selected_sending_files_provider.dart | 365 ++ app/lib/provider/settings_provider.dart | 250 + app/lib/provider/tv_provider.dart | 18 + app/lib/provider/version_provider.dart | 7 + .../provider/window_dimensions_provider.dart | 96 + app/lib/rust/api/crypto.dart | 32 + app/lib/rust/api/http.dart | 124 + app/lib/rust/api/http.freezed.dart | 524 ++ app/lib/rust/api/logging.dart | 9 + app/lib/rust/api/model.dart | 188 + app/lib/rust/api/stream.dart | 17 + app/lib/rust/api/webrtc.dart | 319 ++ app/lib/rust/api/webrtc.freezed.dart | 1160 ++++ app/lib/rust/frb_generated.dart | 4905 +++++++++++++++++ app/lib/rust/frb_generated.io.dart | 1587 ++++++ app/lib/rust/frb_generated.web.dart | 1494 +++++ app/lib/util/alias_generator.dart | 15 + app/lib/util/determine_image_type.dart | 21 + app/lib/util/device_type_ext.dart | 14 + app/lib/util/favorites.dart | 15 + app/lib/util/file_path_helper.dart | 81 + app/lib/util/file_size_helper.dart | 14 + app/lib/util/file_speed_helper.dart | 51 + app/lib/util/file_type_ext.dart | 15 + app/lib/util/i18n.dart | 26 + app/lib/util/image_converter.dart | 18 + app/lib/util/ip_helper.dart | 19 + app/lib/util/native/autostart_helper.dart | 122 + app/lib/util/native/cache_helper.dart | 77 + .../util/native/channel/android_channel.dart | 119 + .../channel/android_channel.mapper.dart | 296 + app/lib/util/native/cmd_helper.dart | 21 + app/lib/util/native/content_uri_helper.dart | 105 + app/lib/util/native/context_menu_helper.dart | 65 + .../util/native/cross_file_converters.dart | 108 + app/lib/util/native/device_info_helper.dart | 88 + app/lib/util/native/directories.dart | 37 + app/lib/util/native/file_picker.dart | 377 ++ app/lib/util/native/file_saver.dart | 280 + app/lib/util/native/ios_channel.dart | 9 + app/lib/util/native/macos_channel.dart | 93 + app/lib/util/native/open_file.dart | 29 + app/lib/util/native/open_folder.dart | 39 + app/lib/util/native/pick_directory_path.dart | 26 + app/lib/util/native/platform_check.dart | 61 + app/lib/util/native/taskbar_helper.dart | 88 + app/lib/util/native/tray_helper.dart | 104 + app/lib/util/platform_strings.dart | 20 + app/lib/util/rhttp.dart | 86 + app/lib/util/rust.dart | 97 + app/lib/util/security_helper.dart | 72 + app/lib/util/send_ignore.dart | 38 + .../shared_preferences_file.dart | 74 + .../shared_preferences_portable.dart | 18 + app/lib/util/simple_server.dart | 142 + app/lib/util/ui/animations_status.dart | 18 + ...asset_picker_translated_text_delegate.dart | 93 + app/lib/util/ui/dynamic_colors.dart | 54 + app/lib/util/ui/nav_bar_padding.dart | 6 + app/lib/util/ui/snackbar.dart | 13 + app/lib/util/user_agent_analyzer.dart | 37 + .../widget/animated_opacity_cross_fade.dart | 59 + .../animations/initial_fade_transition.dart | 45 + .../animations/initial_slide_transition.dart | 53 + app/lib/widget/big_button.dart | 53 + app/lib/widget/column_list_view.dart | 34 + app/lib/widget/copyable_text.dart | 37 + app/lib/widget/custom_basic_appbar.dart | 75 + app/lib/widget/custom_dropdown_button.dart | 40 + app/lib/widget/custom_icon_button.dart | 28 + app/lib/widget/custom_progress_bar.dart | 21 + app/lib/widget/debug_entry.dart | 29 + app/lib/widget/device_bage.dart | 25 + app/lib/widget/dialogs/add_file_dialog.dart | 74 + .../widget/dialogs/address_input_dialog.dart | 265 + .../widget/dialogs/cancel_session_dialog.dart | 30 + .../dialogs/cannot_open_file_dialog.dart | 53 + .../widget/dialogs/custom_bottom_sheet.dart | 24 + .../dialogs/encryption_disabled_notice.dart | 43 + app/lib/widget/dialogs/error_dialog.dart | 23 + .../dialogs/favorite_delete_dialog.dart | 28 + app/lib/widget/dialogs/favorite_dialog.dart | 142 + .../widget/dialogs/favorite_edit_dialog.dart | 233 + app/lib/widget/dialogs/file_info_dialog.dart | 87 + .../dialogs/file_name_input_dialog.dart | 117 + .../widget/dialogs/history_clear_dialog.dart | 25 + .../ios_network_permission_dialog.dart | 31 + app/lib/widget/dialogs/loading_dialog.dart | 15 + .../widget/dialogs/message_input_dialog.dart | 55 + app/lib/widget/dialogs/no_files_dialog.dart | 22 + .../widget/dialogs/no_permission_dialog.dart | 21 + .../not_available_on_platform_dialog.dart | 34 + app/lib/widget/dialogs/open_file_dialog.dart | 108 + app/lib/widget/dialogs/pin_dialog.dart | 69 + app/lib/widget/dialogs/qr_dialog.dart | 96 + .../widget/dialogs/quick_actions_dialog.dart | 176 + .../quick_save_from_favorites_notice.dart | 43 + app/lib/widget/dialogs/quick_save_notice.dart | 43 + .../widget/dialogs/send_mode_help_dialog.dart | 60 + app/lib/widget/dialogs/text_field_tv.dart | 89 + .../dialogs/text_field_with_actions.dart | 82 + app/lib/widget/dialogs/zoom_dialog.dart | 87 + app/lib/widget/file_thumbnail.dart | 222 + app/lib/widget/labeled_checkbox.dart | 38 + .../widget/list_tile/custom_list_tile.dart | 60 + .../widget/list_tile/device_list_tile.dart | 79 + .../device_placeholder_list_tile.dart | 50 + app/lib/widget/local_send_logo.dart | 37 + app/lib/widget/opacity_slideshow.dart | 79 + app/lib/widget/responsive_builder.dart | 21 + app/lib/widget/responsive_list_view.dart | 76 + app/lib/widget/responsive_wrap_view.dart | 76 + app/lib/widget/rotating_widget.dart | 68 + .../widget/sliver/sliver_pinned_header.dart | 45 + .../widget/watcher/life_cycle_watcher.dart | 35 + app/lib/widget/watcher/shortcut_watcher.dart | 108 + app/lib/widget/watcher/tray_watcher.dart | 62 + app/lib/widget/watcher/window_watcher.dart | 127 + app/linux/.gitignore | 1 + app/linux/CMakeLists.txt | 139 + app/linux/flutter/CMakeLists.txt | 88 + .../flutter/generated_plugin_registrant.cc | 63 + .../flutter/generated_plugin_registrant.h | 15 + app/linux/flutter/generated_plugins.cmake | 39 + app/linux/main.cc | 6 + app/linux/my_application.cc | 120 + app/linux/my_application.h | 18 + app/linux/packaging/deb/make_config.yaml | 41 + app/linux/packaging/rpm/make_config.yaml | 28 + app/macos/.gitignore | 7 + app/macos/Flutter/Flutter-Debug.xcconfig | 2 + app/macos/Flutter/Flutter-Release.xcconfig | 2 + .../Flutter/GeneratedPluginRegistrant.swift | 54 + app/macos/Podfile | 45 + app/macos/Podfile.lock | 174 + app/macos/Runner.xcodeproj/project.pbxproj | 1002 ++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/swiftpm/Package.resolved | 24 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 + .../xcschemes/ShareExtension.xcscheme | 95 + .../contents.xcworkspacedata | 13 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/swiftpm/Package.resolved | 24 + app/macos/Runner/AppDelegate.swift | 268 + .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/logo-1024-mac-1024.png | Bin 0 -> 78803 bytes .../AppIcon.appiconset/logo-1024-mac-128.png | Bin 0 -> 5485 bytes .../AppIcon.appiconset/logo-1024-mac-16.png | Bin 0 -> 1461 bytes .../AppIcon.appiconset/logo-1024-mac-256.png | Bin 0 -> 12532 bytes .../AppIcon.appiconset/logo-1024-mac-32.png | Bin 0 -> 1682 bytes .../AppIcon.appiconset/logo-1024-mac-512.png | Bin 0 -> 33535 bytes .../AppIcon.appiconset/logo-1024-mac-64.png | Bin 0 -> 2655 bytes .../Contents.json | 21 + .../logo-1024-mac-256.png | Bin 0 -> 30560 bytes .../Contents.json | 21 + .../logo-1024-mac-256.png | Bin 0 -> 30324 bytes .../Runner/Assets.xcassets/Contents.json | 6 + .../StatusBarItemIcon.imageset/Contents.json | 21 + .../logo-32-black.png | Bin 0 -> 578 bytes app/macos/Runner/Base.lproj/MainMenu.xib | 343 ++ app/macos/Runner/Configs/AppInfo.xcconfig | 14 + app/macos/Runner/Configs/Debug.xcconfig | 2 + app/macos/Runner/Configs/Release.xcconfig | 2 + app/macos/Runner/Configs/Warnings.xcconfig | 13 + app/macos/Runner/ContentDropView.swift | 54 + app/macos/Runner/DebugProfile.entitlements | 22 + app/macos/Runner/Info.plist | 158 + app/macos/Runner/MainFlutterWindow.swift | 23 + app/macos/Runner/Release.entitlements | 22 + .../SecurityScopedResourceManager.swift | 34 + app/macos/Runner/Shared.swift | 41 + app/macos/Runner/Utilities.swift | 26 + app/macos/ShareExtension/Info.plist | 43 + .../ShareExtension/ShareController.swift | 56 + .../ShareExtension.entitlements | 14 + app/macos/ShareExtension/Utilities.swift | 124 + app/macos/ShareExtension/icon.icns | Bin 0 -> 495508 bytes app/pubspec.lock | 2128 +++++++ app/pubspec.yaml | 123 + app/rust-toolchain.toml | 3 + app/rust/.gitignore | 1 + app/rust/Cargo.lock | 3956 +++++++++++++ app/rust/Cargo.toml | 17 + app/rust/src/api/crypto.rs | 21 + app/rust/src/api/http.rs | 148 + app/rust/src/api/logging.rs | 11 + app/rust/src/api/mod.rs | 6 + app/rust/src/api/model.rs | 73 + app/rust/src/api/stream.rs | 28 + app/rust/src/api/webrtc.rs | 514 ++ app/rust/src/frb_generated.rs | 4776 ++++++++++++++++ app/rust/src/lib.rs | 3 + app/rust/src/util/bytes.rs | 35 + app/rust/src/util/mod.rs | 1 + app/rust_builder/.gitignore | 29 + app/rust_builder/README.md | 1 + app/rust_builder/android/.gitignore | 9 + app/rust_builder/android/build.gradle | 56 + app/rust_builder/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + app/rust_builder/cargokit/.gitignore | 4 + app/rust_builder/cargokit/LICENSE | 42 + app/rust_builder/cargokit/README | 11 + app/rust_builder/cargokit/build_pod.sh | 58 + .../cargokit/build_tool/README.md | 5 + .../cargokit/build_tool/analysis_options.yaml | 34 + .../cargokit/build_tool/bin/build_tool.dart | 8 + .../cargokit/build_tool/lib/build_tool.dart | 8 + .../lib/src/android_environment.dart | 195 + .../lib/src/artifacts_provider.dart | 266 + .../build_tool/lib/src/build_cmake.dart | 40 + .../build_tool/lib/src/build_gradle.dart | 49 + .../build_tool/lib/src/build_pod.dart | 89 + .../build_tool/lib/src/build_tool.dart | 271 + .../cargokit/build_tool/lib/src/builder.dart | 198 + .../cargokit/build_tool/lib/src/cargo.dart | 48 + .../build_tool/lib/src/crate_hash.dart | 124 + .../build_tool/lib/src/environment.dart | 68 + .../cargokit/build_tool/lib/src/logging.dart | 52 + .../cargokit/build_tool/lib/src/options.dart | 309 ++ .../lib/src/precompile_binaries.dart | 202 + .../cargokit/build_tool/lib/src/rustup.dart | 136 + .../cargokit/build_tool/lib/src/target.dart | 144 + .../cargokit/build_tool/lib/src/util.dart | 172 + .../build_tool/lib/src/verify_binaries.dart | 84 + .../cargokit/build_tool/pubspec.lock | 453 ++ .../cargokit/build_tool/pubspec.yaml | 33 + .../cargokit/cmake/cargokit.cmake | 99 + .../cargokit/cmake/resolve_symlinks.ps1 | 27 + .../cargokit/gradle/plugin.gradle | 179 + app/rust_builder/cargokit/run_build_tool.cmd | 91 + app/rust_builder/cargokit/run_build_tool.sh | 94 + app/rust_builder/ios/Classes/dummy_file.c | 1 + .../ios/rust_lib_localsend_app.podspec | 45 + app/rust_builder/linux/CMakeLists.txt | 19 + app/rust_builder/macos/Classes/dummy_file.c | 1 + .../macos/rust_lib_localsend_app.podspec | 45 + app/rust_builder/pubspec.yaml | 34 + app/rust_builder/windows/.gitignore | 17 + app/rust_builder/windows/CMakeLists.txt | 20 + app/test/mocks.dart | 9 + app/test/mocks.mocks.dart | 758 +++ app/test/unit/i18n_test.dart | 19 + .../dto/prepare_upload_request_dto_test.dart | 207 + .../provider/favorites_provider_test.dart | 114 + .../provider/last_devices_provider_test.dart | 67 + .../provider/network_info_provider_test.dart | 22 + .../receive_history_provider_test.dart | 189 + .../unit/util/api_route_builder_test.dart | 61 + app/test/unit/util/file_path_helper_test.dart | 9 + .../unit/util/file_speed_helper_test.dart | 57 + .../util/native/content_uri_helper_test.dart | 136 + app/test/unit/util/security_helper_test.dart | 105 + app/web/favicon.png | Bin 0 -> 470 bytes app/web/icons/Icon-192.png | Bin 0 -> 1353 bytes app/web/icons/Icon-512.png | Bin 0 -> 3359 bytes app/web/icons/Icon-maskable-192.png | Bin 0 -> 3457 bytes app/web/icons/Icon-maskable-512.png | Bin 0 -> 10307 bytes app/web/index.html | 61 + app/web/manifest.json | 35 + app/windows/.gitignore | 19 + app/windows/CMakeLists.txt | 108 + app/windows/flutter/CMakeLists.txt | 109 + .../flutter/generated_plugin_registrant.cc | 56 + .../flutter/generated_plugin_registrant.h | 15 + app/windows/flutter/generated_plugins.cmake | 41 + app/windows/install_msix_helper.ps1 | 1 + app/windows/localsend_app.exe.manifest | 9 + app/windows/runner/CMakeLists.txt | 41 + app/windows/runner/Runner.rc | 121 + app/windows/runner/flutter_window.cpp | 61 + app/windows/runner/flutter_window.h | 33 + app/windows/runner/main.cpp | 53 + app/windows/runner/resource.h | 16 + app/windows/runner/resources/app_icon.ico | Bin 0 -> 109492 bytes app/windows/runner/runner.exe.manifest | 20 + app/windows/runner/utils.cpp | 64 + app/windows/runner/utils.h | 19 + app/windows/runner/win32_window.cpp | 288 + app/windows/runner/win32_window.h | 102 + app/windows/runner/winrt_ext.cpp | 69 + app/windows/runner/winrt_ext.h | 9 + cli/.gitignore | 3 + cli/README.md | 3 + cli/analysis_options.yaml | 10 + cli/bin/cli.dart | 5 + cli/lib/main.dart | 39 + cli/pubspec.lock | 433 ++ cli/pubspec.yaml | 17 + common/.gitignore | 7 + common/README.md | 3 + common/analysis_options.yaml | 14 + common/build.yaml | 10 + common/lib/api_route_builder.dart | 44 + common/lib/constants.dart | 32 + common/lib/isolate.dart | 6 + common/lib/model/device.dart | 118 + common/lib/model/device.mapper.dart | 560 ++ common/lib/model/device_info_result.dart | 16 + common/lib/model/dto/file_dto.dart | 118 + common/lib/model/dto/file_dto.mapper.dart | 102 + common/lib/model/dto/info_dto.dart | 46 + common/lib/model/dto/info_dto.mapper.dart | 136 + common/lib/model/dto/info_register_dto.dart | 52 + .../model/dto/info_register_dto.mapper.dart | 161 + common/lib/model/dto/multicast_dto.dart | 55 + .../lib/model/dto/multicast_dto.mapper.dart | 222 + .../model/dto/prepare_upload_request_dto.dart | 18 + .../prepare_upload_request_dto.mapper.dart | 111 + .../dto/prepare_upload_response_dto.dart | 16 + .../prepare_upload_response_dto.mapper.dart | 107 + .../dto/receive_request_response_dto.dart | 18 + .../receive_request_response_dto.mapper.dart | 114 + common/lib/model/dto/register_dto.dart | 49 + common/lib/model/dto/register_dto.mapper.dart | 159 + common/lib/model/file_status.dart | 14 + common/lib/model/file_type.dart | 15 + common/lib/model/file_type.mapper.dart | 69 + common/lib/model/session_status.dart | 13 + common/lib/model/stored_security_context.dart | 25 + .../model/stored_security_context.mapper.dart | 120 + .../lib/src/isolate/child/http_provider.dart | 56 + .../child/http_scan_discovery_isolate.dart | 67 + common/lib/src/isolate/child/main.dart | 80 + .../child/multicast_discovery_isolate.dart | 55 + .../lib/src/isolate/child/sync_provider.dart | 79 + .../isolate/child/sync_provider.mapper.dart | 223 + .../lib/src/isolate/child/upload_isolate.dart | 147 + common/lib/src/isolate/dto/isolate_task.dart | 21 + .../src/isolate/dto/isolate_task_result.dart | 83 + .../src/isolate/dto/send_to_isolate_data.dart | 11 + common/lib/src/isolate/parent/actions.dart | 256 + .../lib/src/isolate/parent/actions_sync.dart | 127 + .../parent/parent_isolate_provider.dart | 137 + .../parent_isolate_provider.mapper.dart | 152 + common/lib/src/task/README.md | 3 + .../task/discovery/http_scan_discovery.dart | 67 + .../task/discovery/http_target_discovery.dart | 48 + .../task/discovery/multicast_discovery.dart | 225 + common/lib/src/task/upload/http_upload.dart | 43 + common/lib/src/util/id_provider.dart | 11 + common/lib/src/util/isolate_helper.dart | 117 + common/lib/util/logger.dart | 19 + common/lib/util/network_interfaces.dart | 68 + common/lib/util/sleep.dart | 3 + common/lib/util/stream.dart | 21 + common/lib/util/task_runner.dart | 69 + common/pubspec.yaml | 21 + common/test/unit/model/device_test.dart | 60 + .../unit/util/network_interfaces_test.dart | 49 + common/test/unit/util/task_runner_test.dart | 37 + core/.gitignore | 1 + core/Cargo.lock | 3528 ++++++++++++ core/Cargo.toml | 46 + core/assets/web/error-403.html | 11 + core/assets/web/index.html | 98 + core/assets/web/main.js | 178 + core/src/crypto/cert.rs | 188 + core/src/crypto/hash.rs | 7 + core/src/crypto/mod.rs | 4 + core/src/crypto/nonce.rs | 11 + core/src/crypto/token.rs | 254 + core/src/http/client/mod.rs | 224 + core/src/http/client/url.rs | 95 + core/src/http/client/v2.rs | 452 ++ core/src/http/client/v3.rs | 268 + core/src/http/dto.rs | 172 + core/src/http/dto_v2.rs | 380 ++ core/src/http/mod.rs | 14 + core/src/http/server/client_cert_verifier.rs | 83 + core/src/http/server/collect_to_json.rs | 18 + core/src/http/server/controller/mod.rs | 52 + core/src/http/server/controller/v2.rs | 547 ++ core/src/http/server/controller/v3.rs | 73 + core/src/http/server/controller/web.rs | 479 ++ core/src/http/server/error.rs | 47 + core/src/http/server/mod.rs | 397 ++ core/src/http/server/query.rs | 45 + core/src/http/server/response.rs | 43 + core/src/http/server/session.rs | 48 + core/src/http/state.rs | 25 + core/src/lib.rs | 11 + core/src/main.rs | 574 ++ core/src/model/discovery.rs | 11 + core/src/model/mod.rs | 2 + core/src/model/transfer.rs | 24 + core/src/util/base64.rs | 13 + core/src/util/mod.rs | 2 + core/src/util/time.rs | 7 + core/src/webrtc/mod.rs | 3 + core/src/webrtc/signaling.rs | 528 ++ core/src/webrtc/webrtc.rs | 1406 +++++ core/tests/v2_server.rs | 555 ++ core/tests/v2_web_send.rs | 534 ++ .../android/en-US/full_description.txt | 7 + .../metadata/android/en-US/images/icon.png | Bin 0 -> 4688 bytes .../en-US/images/phoneScreenshots/1.jpg | Bin 0 -> 403320 bytes .../en-US/images/phoneScreenshots/2.jpg | Bin 0 -> 501654 bytes .../en-US/images/phoneScreenshots/3.jpg | Bin 0 -> 475972 bytes .../en-US/images/phoneScreenshots/4.jpg | Bin 0 -> 466237 bytes .../en-US/images/phoneScreenshots/5.jpg | Bin 0 -> 365374 bytes .../en-US/images/phoneScreenshots/6.jpg | Bin 0 -> 667802 bytes .../en-US/images/phoneScreenshots/7.jpg | Bin 0 -> 389356 bytes .../en-US/images/phoneScreenshots/8.jpg | Bin 0 -> 609741 bytes .../android/en-US/short_description.txt | 1 + .../android/pt-BR/full_description.txt | 7 + .../pt-BR/images/phoneScreenshots/1.png | Bin 0 -> 84499 bytes .../pt-BR/images/phoneScreenshots/2.png | Bin 0 -> 97684 bytes .../pt-BR/images/phoneScreenshots/3.png | Bin 0 -> 66675 bytes .../pt-BR/images/phoneScreenshots/4.png | Bin 0 -> 83861 bytes .../android/pt-BR/short_description.txt | 1 + msix/AppxManifest.xml | 75 + msix/Images/BadgeLogo.scale-100.png | Bin 0 -> 973 bytes msix/Images/BadgeLogo.scale-125.png | Bin 0 -> 1123 bytes msix/Images/BadgeLogo.scale-150.png | Bin 0 -> 1560 bytes msix/Images/BadgeLogo.scale-200.png | Bin 0 -> 2250 bytes msix/Images/BadgeLogo.scale-400.png | Bin 0 -> 4685 bytes msix/Images/LargeTile.scale-100.png | Bin 0 -> 20493 bytes msix/Images/LargeTile.scale-125.png | Bin 0 -> 26831 bytes msix/Images/LargeTile.scale-150.png | Bin 0 -> 37602 bytes msix/Images/LargeTile.scale-200.png | Bin 0 -> 56952 bytes msix/Images/LargeTile.scale-400.png | Bin 0 -> 155098 bytes msix/Images/SmallTile.scale-100.png | Bin 0 -> 3444 bytes msix/Images/SmallTile.scale-125.png | Bin 0 -> 4436 bytes msix/Images/SmallTile.scale-150.png | Bin 0 -> 5373 bytes msix/Images/SmallTile.scale-200.png | Bin 0 -> 7135 bytes msix/Images/SmallTile.scale-400.png | Bin 0 -> 18080 bytes msix/Images/SplashScreen.scale-100.png | Bin 0 -> 20843 bytes msix/Images/SplashScreen.scale-125.png | Bin 0 -> 28483 bytes msix/Images/SplashScreen.scale-150.png | Bin 0 -> 38794 bytes msix/Images/SplashScreen.scale-200.png | Bin 0 -> 58965 bytes msix/Images/SplashScreen.scale-400.png | Bin 0 -> 160133 bytes msix/Images/Square150x150Logo.scale-100.png | Bin 0 -> 7578 bytes msix/Images/Square150x150Logo.scale-125.png | Bin 0 -> 8692 bytes msix/Images/Square150x150Logo.scale-150.png | Bin 0 -> 12722 bytes msix/Images/Square150x150Logo.scale-200.png | Bin 0 -> 19265 bytes msix/Images/Square150x150Logo.scale-400.png | Bin 0 -> 54337 bytes ...go.altform-lightunplated_targetsize-16.png | Bin 0 -> 622 bytes ...go.altform-lightunplated_targetsize-20.png | Bin 0 -> 779 bytes ...go.altform-lightunplated_targetsize-24.png | Bin 0 -> 973 bytes ...o.altform-lightunplated_targetsize-256.png | Bin 0 -> 15332 bytes ...go.altform-lightunplated_targetsize-30.png | Bin 0 -> 1123 bytes ...go.altform-lightunplated_targetsize-32.png | Bin 0 -> 1352 bytes ...go.altform-lightunplated_targetsize-36.png | Bin 0 -> 1560 bytes ...go.altform-lightunplated_targetsize-40.png | Bin 0 -> 1761 bytes ...go.altform-lightunplated_targetsize-48.png | Bin 0 -> 2250 bytes ...go.altform-lightunplated_targetsize-60.png | Bin 0 -> 2889 bytes ...go.altform-lightunplated_targetsize-64.png | Bin 0 -> 3124 bytes ...go.altform-lightunplated_targetsize-72.png | Bin 0 -> 3438 bytes ...go.altform-lightunplated_targetsize-80.png | Bin 0 -> 3855 bytes ...go.altform-lightunplated_targetsize-96.png | Bin 0 -> 4685 bytes ...x44Logo.altform-unplated_targetsize-16.png | Bin 0 -> 622 bytes ...x44Logo.altform-unplated_targetsize-20.png | Bin 0 -> 779 bytes ...x44Logo.altform-unplated_targetsize-24.png | Bin 0 -> 973 bytes ...44Logo.altform-unplated_targetsize-256.png | Bin 0 -> 15332 bytes ...x44Logo.altform-unplated_targetsize-30.png | Bin 0 -> 1123 bytes ...x44Logo.altform-unplated_targetsize-32.png | Bin 0 -> 1352 bytes ...x44Logo.altform-unplated_targetsize-36.png | Bin 0 -> 1560 bytes ...x44Logo.altform-unplated_targetsize-40.png | Bin 0 -> 1761 bytes ...x44Logo.altform-unplated_targetsize-48.png | Bin 0 -> 2250 bytes ...x44Logo.altform-unplated_targetsize-60.png | Bin 0 -> 2889 bytes ...x44Logo.altform-unplated_targetsize-64.png | Bin 0 -> 3124 bytes ...x44Logo.altform-unplated_targetsize-72.png | Bin 0 -> 3438 bytes ...x44Logo.altform-unplated_targetsize-80.png | Bin 0 -> 3855 bytes ...x44Logo.altform-unplated_targetsize-96.png | Bin 0 -> 4685 bytes msix/Images/Square44x44Logo.scale-100.png | Bin 0 -> 2015 bytes msix/Images/Square44x44Logo.scale-125.png | Bin 0 -> 2648 bytes msix/Images/Square44x44Logo.scale-150.png | Bin 0 -> 3201 bytes msix/Images/Square44x44Logo.scale-200.png | Bin 0 -> 4383 bytes msix/Images/Square44x44Logo.scale-400.png | Bin 0 -> 8582 bytes msix/Images/Square44x44Logo.targetsize-16.png | Bin 0 -> 622 bytes msix/Images/Square44x44Logo.targetsize-20.png | Bin 0 -> 779 bytes msix/Images/Square44x44Logo.targetsize-24.png | Bin 0 -> 973 bytes .../Images/Square44x44Logo.targetsize-256.png | Bin 0 -> 15332 bytes msix/Images/Square44x44Logo.targetsize-30.png | Bin 0 -> 1123 bytes msix/Images/Square44x44Logo.targetsize-32.png | Bin 0 -> 1352 bytes msix/Images/Square44x44Logo.targetsize-36.png | Bin 0 -> 1560 bytes msix/Images/Square44x44Logo.targetsize-40.png | Bin 0 -> 1761 bytes msix/Images/Square44x44Logo.targetsize-48.png | Bin 0 -> 2250 bytes msix/Images/Square44x44Logo.targetsize-60.png | Bin 0 -> 2889 bytes msix/Images/Square44x44Logo.targetsize-64.png | Bin 0 -> 3124 bytes msix/Images/Square44x44Logo.targetsize-72.png | Bin 0 -> 3438 bytes msix/Images/Square44x44Logo.targetsize-80.png | Bin 0 -> 3855 bytes msix/Images/Square44x44Logo.targetsize-96.png | Bin 0 -> 4685 bytes msix/Images/StoreLogo.scale-100.png | Bin 0 -> 2360 bytes msix/Images/StoreLogo.scale-125.png | Bin 0 -> 3136 bytes msix/Images/StoreLogo.scale-150.png | Bin 0 -> 3707 bytes msix/Images/StoreLogo.scale-200.png | Bin 0 -> 4989 bytes msix/Images/StoreLogo.scale-400.png | Bin 0 -> 10486 bytes msix/Images/Wide310x150Logo.scale-100.png | Bin 0 -> 8218 bytes msix/Images/Wide310x150Logo.scale-125.png | Bin 0 -> 9613 bytes msix/Images/Wide310x150Logo.scale-150.png | Bin 0 -> 13661 bytes msix/Images/Wide310x150Logo.scale-200.png | Bin 0 -> 20843 bytes msix/Images/Wide310x150Logo.scale-400.png | Bin 0 -> 58965 bytes msix/resources.pri | Bin 0 -> 14336 bytes msix/resources.scale-125.pri | Bin 0 -> 3776 bytes msix/resources.scale-150.pri | Bin 0 -> 3776 bytes msix/resources.scale-200.pri | Bin 0 -> 3776 bytes msix/resources.scale-400.pri | Bin 0 -> 3776 bytes readme_i18n/README_CS.md | 178 + readme_i18n/README_ES.md | 175 + readme_i18n/README_FA.md | 173 + readme_i18n/README_FR.md | 173 + readme_i18n/README_ID.md | 164 + readme_i18n/README_IT.md | 183 + readme_i18n/README_JA.md | 145 + readme_i18n/README_KM.md | 173 + readme_i18n/README_KO.md | 176 + readme_i18n/README_MS.md | 184 + readme_i18n/README_PH.md | 173 + readme_i18n/README_PL.md | 167 + readme_i18n/README_PT_BR.md | 176 + readme_i18n/README_RU.md | 173 + readme_i18n/README_TH.md | 152 + readme_i18n/README_TR.md | 170 + readme_i18n/README_UK.md | 178 + readme_i18n/README_VI.md | 171 + readme_i18n/README_ZH.md | 183 + scripts/Languages/ChineseSimplified.isl | 403 ++ scripts/appimage/AppImageBuilder_arm_64.yml | 68 + scripts/appimage/AppImageBuilder_x86_64.yml | 68 + scripts/compile_android_apk.sh | 31 + scripts/compile_android_appbundle.ps1 | 11 + scripts/compile_ios.sh | 14 + scripts/compile_linux_appimage.sh | 39 + scripts/compile_mac_appstore.sh | 9 + scripts/compile_mac_dmg.sh | 53 + scripts/compile_windows_exe-inno.iss | 89 + scripts/compile_windows_exe.ps1 | 21 + scripts/compile_windows_msix_helper.ps1 | 4 + scripts/compile_windows_msix_signed.ps1 | 19 + scripts/compile_windows_msix_store.ps1 | 12 + scripts/compile_windows_zip.ps1 | 15 + scripts/contributions_digester.dart | 32 + scripts/dmg/background.png | Bin 0 -> 113 bytes scripts/download_windows_msix.ps1 | 4 + scripts/msix/msix_downloader.ps1 | 123 + scripts/remove_proprietary_dependencies.sh | 30 + scripts/verify_exe_signature.ps1 | 2 + scripts/windows/x64/msvcp140.dll | Bin 0 -> 578384 bytes scripts/windows/x64/vcruntime140.dll | Bin 0 -> 109440 bytes scripts/windows/x64/vcruntime140_1.dll | Bin 0 -> 49560 bytes server/.gitignore | 1 + server/Cargo.lock | 1364 +++++ server/Cargo.toml | 18 + server/Dockerfile | 24 + server/README.md | 3 + server/src/config/error.rs | 59 + server/src/config/init.rs | 20 + server/src/config/mod.rs | 4 + server/src/config/scheduler.rs | 24 + server/src/config/state.rs | 33 + server/src/controller/mod.rs | 1 + server/src/controller/ws_controller.rs | 369 ++ server/src/main.rs | 33 + server/src/util/base64.rs | 9 + server/src/util/ip.rs | 40 + server/src/util/mod.rs | 2 + 954 files changed, 192541 insertions(+) create mode 100644 .fvmrc create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/release-drafter.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/clear_workflows.yml create mode 100644 .github/workflows/compile_apk.yml create mode 100644 .github/workflows/compile_arm64_appimage.yml create mode 100644 .github/workflows/linux_build.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/test_arm64_deb.yml create mode 100644 .github/workflows/test_arm64_tar.yml create mode 100644 .github/workflows/test_rpm.yml create mode 100644 .github/workflows/test_zip.yml create mode 100644 .github/workflows/winget.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 120000 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README.wehub.md create mode 100644 app/.gitignore create mode 100644 app/analysis_options.yaml create mode 100644 app/android/.gitignore create mode 100644 app/android/app/build.gradle create mode 100644 app/android/app/src/debug/AndroidManifest.xml create mode 100644 app/android/app/src/main/AndroidManifest.xml create mode 100644 app/android/app/src/main/ic_launcher-playstore.png create mode 100644 app/android/app/src/main/kotlin/org/localsend/localsend_app/FastDocumentFile.kt create mode 100644 app/android/app/src/main/kotlin/org/localsend/localsend_app/FileOpener.kt create mode 100644 app/android/app/src/main/kotlin/org/localsend/localsend_app/MainActivity.kt create mode 100644 app/android/app/src/main/kotlin/org/localsend/localsend_app/QuickTileService.kt create mode 100644 app/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 app/android/app/src/main/res/drawable/banner.png create mode 100644 app/android/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/android/app/src/main/res/drawable/launch_background.xml create mode 100644 app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 app/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png create mode 100644 app/android/app/src/main/res/mipmap-hdpi/ic_launcher_quicktile_foreground.png create mode 100644 app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 app/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png create mode 100644 app/android/app/src/main/res/mipmap-mdpi/ic_launcher_quicktile_foreground.png create mode 100644 app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png create mode 100644 app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_quicktile_foreground.png create mode 100644 app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png create mode 100644 app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_quicktile_foreground.png create mode 100644 app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png create mode 100644 app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_quicktile_foreground.png create mode 100644 app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/android/app/src/main/res/values-night/styles.xml create mode 100644 app/android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/android/app/src/main/res/values/styles.xml create mode 100644 app/android/app/src/profile/AndroidManifest.xml create mode 100644 app/android/build.gradle create mode 100644 app/android/gradle.properties create mode 100644 app/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 app/android/settings.gradle create mode 100644 app/assets/CHANGELOG.md create mode 100644 app/assets/i18n/_missing_translations_ar.json create mode 100644 app/assets/i18n/_missing_translations_az.json create mode 100644 app/assets/i18n/_missing_translations_bg.json create mode 100644 app/assets/i18n/_missing_translations_bn.json create mode 100644 app/assets/i18n/_missing_translations_ca.json create mode 100644 app/assets/i18n/_missing_translations_cs.json create mode 100644 app/assets/i18n/_missing_translations_da.json create mode 100644 app/assets/i18n/_missing_translations_de.json create mode 100644 app/assets/i18n/_missing_translations_el.json create mode 100644 app/assets/i18n/_missing_translations_en_IN.json create mode 100644 app/assets/i18n/_missing_translations_es_ES.json create mode 100644 app/assets/i18n/_missing_translations_et.json create mode 100644 app/assets/i18n/_missing_translations_eu.json create mode 100644 app/assets/i18n/_missing_translations_fa.json create mode 100644 app/assets/i18n/_missing_translations_fi.json create mode 100644 app/assets/i18n/_missing_translations_fil_PH.json create mode 100644 app/assets/i18n/_missing_translations_fr.json create mode 100644 app/assets/i18n/_missing_translations_gl.json create mode 100644 app/assets/i18n/_missing_translations_gu.json create mode 100644 app/assets/i18n/_missing_translations_he.json create mode 100644 app/assets/i18n/_missing_translations_hi.json create mode 100644 app/assets/i18n/_missing_translations_hu.json create mode 100644 app/assets/i18n/_missing_translations_id.json create mode 100644 app/assets/i18n/_missing_translations_it.json create mode 100644 app/assets/i18n/_missing_translations_ja.json create mode 100644 app/assets/i18n/_missing_translations_km.json create mode 100644 app/assets/i18n/_missing_translations_ko.json create mode 100644 app/assets/i18n/_missing_translations_ml.json create mode 100644 app/assets/i18n/_missing_translations_mn.json create mode 100644 app/assets/i18n/_missing_translations_ms.json create mode 100644 app/assets/i18n/_missing_translations_ne.json create mode 100644 app/assets/i18n/_missing_translations_nl.json create mode 100644 app/assets/i18n/_missing_translations_pl.json create mode 100644 app/assets/i18n/_missing_translations_pt_BR.json create mode 100644 app/assets/i18n/_missing_translations_pt_PT.json create mode 100644 app/assets/i18n/_missing_translations_ro.json create mode 100644 app/assets/i18n/_missing_translations_ru.json create mode 100644 app/assets/i18n/_missing_translations_si.json create mode 100644 app/assets/i18n/_missing_translations_sk.json create mode 100644 app/assets/i18n/_missing_translations_sl.json create mode 100644 app/assets/i18n/_missing_translations_sr.json create mode 100644 app/assets/i18n/_missing_translations_sr_Cyrl.json create mode 100644 app/assets/i18n/_missing_translations_sv.json create mode 100644 app/assets/i18n/_missing_translations_ta.json create mode 100644 app/assets/i18n/_missing_translations_th.json create mode 100644 app/assets/i18n/_missing_translations_tr.json create mode 100644 app/assets/i18n/_missing_translations_uk.json create mode 100644 app/assets/i18n/_missing_translations_ur.json create mode 100644 app/assets/i18n/_missing_translations_vi.json create mode 100644 app/assets/i18n/_missing_translations_zh_CN.json create mode 100644 app/assets/i18n/_missing_translations_zh_HK.json create mode 100644 app/assets/i18n/_missing_translations_zh_TW.json create mode 100644 app/assets/i18n/_unused_translations.json create mode 100644 app/assets/i18n/ar.json create mode 100644 app/assets/i18n/az.json create mode 100644 app/assets/i18n/bg.json create mode 100644 app/assets/i18n/bn.json create mode 100644 app/assets/i18n/ca.json create mode 100644 app/assets/i18n/cs.json create mode 100644 app/assets/i18n/da.json create mode 100644 app/assets/i18n/de.json create mode 100644 app/assets/i18n/el.json create mode 100644 app/assets/i18n/en-IN.json create mode 100644 app/assets/i18n/en.json create mode 100644 app/assets/i18n/es-ES.json create mode 100644 app/assets/i18n/et.json create mode 100644 app/assets/i18n/eu.json create mode 100644 app/assets/i18n/fa.json create mode 100644 app/assets/i18n/fi.json create mode 100644 app/assets/i18n/fil-PH.json create mode 100644 app/assets/i18n/fr.json create mode 100644 app/assets/i18n/gl.json create mode 100644 app/assets/i18n/gu.json create mode 100644 app/assets/i18n/he.json create mode 100644 app/assets/i18n/hi.json create mode 100644 app/assets/i18n/hu.json create mode 100644 app/assets/i18n/id.json create mode 100644 app/assets/i18n/it.json create mode 100644 app/assets/i18n/ja.json create mode 100644 app/assets/i18n/km.json create mode 100644 app/assets/i18n/ko.json create mode 100644 app/assets/i18n/ml.json create mode 100644 app/assets/i18n/mn.json create mode 100644 app/assets/i18n/ms.json create mode 100644 app/assets/i18n/ne.json create mode 100644 app/assets/i18n/nl.json create mode 100644 app/assets/i18n/pl.json create mode 100644 app/assets/i18n/pt-BR.json create mode 100644 app/assets/i18n/pt-PT.json create mode 100644 app/assets/i18n/ro.json create mode 100644 app/assets/i18n/ru.json create mode 100644 app/assets/i18n/si.json create mode 100644 app/assets/i18n/sk.json create mode 100644 app/assets/i18n/sl.json create mode 100644 app/assets/i18n/sr-Cyrl.json create mode 100644 app/assets/i18n/sr.json create mode 100644 app/assets/i18n/sv.json create mode 100644 app/assets/i18n/ta.json create mode 100644 app/assets/i18n/th.json create mode 100644 app/assets/i18n/tr.json create mode 100644 app/assets/i18n/uk.json create mode 100644 app/assets/i18n/ur.json create mode 100644 app/assets/i18n/vi.json create mode 100644 app/assets/i18n/zh-CN.json create mode 100644 app/assets/i18n/zh-HK.json create mode 100644 app/assets/i18n/zh-TW.json create mode 100644 app/assets/img/logo-128.png create mode 100644 app/assets/img/logo-256.png create mode 100644 app/assets/img/logo-32-black.png create mode 100644 app/assets/img/logo-32-white.png create mode 100644 app/assets/img/logo-32.png create mode 100644 app/assets/img/logo-512-white.png create mode 100644 app/assets/img/logo-512.png create mode 100644 app/assets/img/logo.ico create mode 100644 app/assets/packaging/logo.ico create mode 100644 app/assets/web/error-403.html create mode 100644 app/assets/web/index.html create mode 100644 app/assets/web/main.js create mode 100644 app/build.yaml create mode 100644 app/flutter_rust_bridge.yaml create mode 100644 app/ios/.gitignore create mode 100644 app/ios/Flutter/AppFrameworkInfo.plist create mode 100644 app/ios/Flutter/Debug.xcconfig create mode 100644 app/ios/Flutter/Release.xcconfig create mode 100644 app/ios/MyLocalSendStoreKit.storekit create mode 100644 app/ios/Podfile create mode 100644 app/ios/Podfile.lock create mode 100644 app/ios/Runner.xcodeproj/project.pbxproj create mode 100644 app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 app/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 app/ios/Runner/AppDelegate.swift create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20@2x.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20@3x.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29@2x.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29@3x.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40@2x.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40@3x.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60@2x.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60@3x.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76@2x.png create mode 100644 app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5@2x.png create mode 100644 app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 app/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 app/ios/Runner/Base.lproj/Main.storyboard create mode 100644 app/ios/Runner/Info.plist create mode 100644 app/ios/Runner/Runner-Bridging-Header.h create mode 100644 app/ios/Runner/Runner.entitlements create mode 100644 app/ios/ShareExtension/Base.lproj/MainInterface.storyboard create mode 100644 app/ios/ShareExtension/Info.plist create mode 100644 app/ios/ShareExtension/ShareExtension.entitlements create mode 100644 app/ios/ShareExtension/ShareViewController.swift create mode 100644 app/lib/config/init.dart create mode 100644 app/lib/config/init_error.dart create mode 100644 app/lib/config/refena.dart create mode 100644 app/lib/config/theme.dart create mode 100644 app/lib/gen/assets.gen.dart create mode 100644 app/lib/gen/strings.g.dart create mode 100644 app/lib/gen/strings_ar.g.dart create mode 100644 app/lib/gen/strings_az.g.dart create mode 100644 app/lib/gen/strings_bg.g.dart create mode 100644 app/lib/gen/strings_bn.g.dart create mode 100644 app/lib/gen/strings_ca.g.dart create mode 100644 app/lib/gen/strings_cs.g.dart create mode 100644 app/lib/gen/strings_da.g.dart create mode 100644 app/lib/gen/strings_de.g.dart create mode 100644 app/lib/gen/strings_el.g.dart create mode 100644 app/lib/gen/strings_en.g.dart create mode 100644 app/lib/gen/strings_en_IN.g.dart create mode 100644 app/lib/gen/strings_es_ES.g.dart create mode 100644 app/lib/gen/strings_et.g.dart create mode 100644 app/lib/gen/strings_eu.g.dart create mode 100644 app/lib/gen/strings_fa.g.dart create mode 100644 app/lib/gen/strings_fi.g.dart create mode 100644 app/lib/gen/strings_fil_PH.g.dart create mode 100644 app/lib/gen/strings_fr.g.dart create mode 100644 app/lib/gen/strings_gl.g.dart create mode 100644 app/lib/gen/strings_gu.g.dart create mode 100644 app/lib/gen/strings_he.g.dart create mode 100644 app/lib/gen/strings_hi.g.dart create mode 100644 app/lib/gen/strings_hu.g.dart create mode 100644 app/lib/gen/strings_id.g.dart create mode 100644 app/lib/gen/strings_it.g.dart create mode 100644 app/lib/gen/strings_ja.g.dart create mode 100644 app/lib/gen/strings_km.g.dart create mode 100644 app/lib/gen/strings_ko.g.dart create mode 100644 app/lib/gen/strings_ml.g.dart create mode 100644 app/lib/gen/strings_mn.g.dart create mode 100644 app/lib/gen/strings_ms.g.dart create mode 100644 app/lib/gen/strings_ne.g.dart create mode 100644 app/lib/gen/strings_nl.g.dart create mode 100644 app/lib/gen/strings_pl.g.dart create mode 100644 app/lib/gen/strings_pt_BR.g.dart create mode 100644 app/lib/gen/strings_pt_PT.g.dart create mode 100644 app/lib/gen/strings_ro.g.dart create mode 100644 app/lib/gen/strings_ru.g.dart create mode 100644 app/lib/gen/strings_si.g.dart create mode 100644 app/lib/gen/strings_sk.g.dart create mode 100644 app/lib/gen/strings_sl.g.dart create mode 100644 app/lib/gen/strings_sr.g.dart create mode 100644 app/lib/gen/strings_sr_Cyrl.g.dart create mode 100644 app/lib/gen/strings_sv.g.dart create mode 100644 app/lib/gen/strings_ta.g.dart create mode 100644 app/lib/gen/strings_th.g.dart create mode 100644 app/lib/gen/strings_tr.g.dart create mode 100644 app/lib/gen/strings_uk.g.dart create mode 100644 app/lib/gen/strings_ur.g.dart create mode 100644 app/lib/gen/strings_vi.g.dart create mode 100644 app/lib/gen/strings_zh_CN.g.dart create mode 100644 app/lib/gen/strings_zh_HK.g.dart create mode 100644 app/lib/gen/strings_zh_TW.g.dart create mode 100644 app/lib/main.dart create mode 100644 app/lib/model/cross_file.dart create mode 100644 app/lib/model/cross_file.mapper.dart create mode 100644 app/lib/model/log_entry.dart create mode 100644 app/lib/model/log_entry.mapper.dart create mode 100644 app/lib/model/persistence/color_mode.dart create mode 100644 app/lib/model/persistence/favorite_device.dart create mode 100644 app/lib/model/persistence/favorite_device.mapper.dart create mode 100644 app/lib/model/persistence/receive_history_entry.dart create mode 100644 app/lib/model/persistence/receive_history_entry.mapper.dart create mode 100644 app/lib/model/send_mode.dart create mode 100644 app/lib/model/state/nearby_devices_state.dart create mode 100644 app/lib/model/state/nearby_devices_state.mapper.dart create mode 100644 app/lib/model/state/network_state.dart create mode 100644 app/lib/model/state/network_state.mapper.dart create mode 100644 app/lib/model/state/purchase_state.dart create mode 100644 app/lib/model/state/purchase_state.mapper.dart create mode 100644 app/lib/model/state/send/send_session_state.dart create mode 100644 app/lib/model/state/send/send_session_state.mapper.dart create mode 100644 app/lib/model/state/send/sending_file.dart create mode 100644 app/lib/model/state/send/sending_file.mapper.dart create mode 100644 app/lib/model/state/send/web/web_send_file.dart create mode 100644 app/lib/model/state/send/web/web_send_file.mapper.dart create mode 100644 app/lib/model/state/send/web/web_send_session.dart create mode 100644 app/lib/model/state/send/web/web_send_session.mapper.dart create mode 100644 app/lib/model/state/send/web/web_send_state.dart create mode 100644 app/lib/model/state/send/web/web_send_state.mapper.dart create mode 100644 app/lib/model/state/server/receive_session_state.dart create mode 100644 app/lib/model/state/server/receive_session_state.mapper.dart create mode 100644 app/lib/model/state/server/receiving_file.dart create mode 100644 app/lib/model/state/server/receiving_file.mapper.dart create mode 100644 app/lib/model/state/server/server_state.dart create mode 100644 app/lib/model/state/server/server_state.mapper.dart create mode 100644 app/lib/model/state/settings_state.dart create mode 100644 app/lib/model/state/settings_state.mapper.dart create mode 100644 app/lib/pages/about/about_page.dart create mode 100644 app/lib/pages/about/contributors.dart create mode 100644 app/lib/pages/about/packagers.dart create mode 100644 app/lib/pages/about/translators.dart create mode 100644 app/lib/pages/apk_picker_page.dart create mode 100644 app/lib/pages/changelog_page.dart create mode 100644 app/lib/pages/debug/debug_page.dart create mode 100644 app/lib/pages/debug/discovery_debug_page.dart create mode 100644 app/lib/pages/debug/http_logs_page.dart create mode 100644 app/lib/pages/debug/security_debug_page.dart create mode 100644 app/lib/pages/donation/donation_page.dart create mode 100644 app/lib/pages/donation/donation_page_vm.dart create mode 100644 app/lib/pages/home_page.dart create mode 100644 app/lib/pages/home_page_controller.dart create mode 100644 app/lib/pages/language_page.dart create mode 100644 app/lib/pages/progress_page.dart create mode 100644 app/lib/pages/receive_history_page.dart create mode 100644 app/lib/pages/receive_options_page.dart create mode 100644 app/lib/pages/receive_page.dart create mode 100644 app/lib/pages/selected_files_page.dart create mode 100644 app/lib/pages/send_page.dart create mode 100644 app/lib/pages/settings/network_interfaces_page.dart create mode 100644 app/lib/pages/tabs/receive_tab.dart create mode 100644 app/lib/pages/tabs/receive_tab_vm.dart create mode 100644 app/lib/pages/tabs/send_tab.dart create mode 100644 app/lib/pages/tabs/send_tab_vm.dart create mode 100644 app/lib/pages/tabs/settings_tab.dart create mode 100644 app/lib/pages/tabs/settings_tab_controller.dart create mode 100644 app/lib/pages/tabs/settings_tab_vm.dart create mode 100644 app/lib/pages/tabs/settings_tab_vm.mapper.dart create mode 100644 app/lib/pages/troubleshoot_page.dart create mode 100644 app/lib/pages/web_send_page.dart create mode 100644 app/lib/provider/animation_provider.dart create mode 100644 app/lib/provider/apk_provider.dart create mode 100644 app/lib/provider/app_arguments_provider.dart create mode 100644 app/lib/provider/device_info_provider.dart create mode 100644 app/lib/provider/favorites_provider.dart create mode 100644 app/lib/provider/http_provider.dart create mode 100644 app/lib/provider/last_devices.provider.dart create mode 100644 app/lib/provider/local_ip_provider.dart create mode 100644 app/lib/provider/logging/discovery_logs_provider.dart create mode 100644 app/lib/provider/logging/http_logs_provider.dart create mode 100644 app/lib/provider/network/nearby_devices_provider.dart create mode 100644 app/lib/provider/network/scan_facade.dart create mode 100644 app/lib/provider/network/send_provider.dart create mode 100644 app/lib/provider/network/server/controller/common.dart create mode 100644 app/lib/provider/network/server/controller/receive_controller.dart create mode 100644 app/lib/provider/network/server/controller/send_controller.dart create mode 100644 app/lib/provider/network/server/server_provider.dart create mode 100644 app/lib/provider/network/server/server_utils.dart create mode 100644 app/lib/provider/network/webrtc/signaling_provider.dart create mode 100644 app/lib/provider/network/webrtc/signaling_provider.mapper.dart create mode 100644 app/lib/provider/network/webrtc/webrtc_receiver.dart create mode 100644 app/lib/provider/network/webrtc/webrtc_receiver.mapper.dart create mode 100644 app/lib/provider/param/apk_provider_param.dart create mode 100644 app/lib/provider/param/apk_provider_param.mapper.dart create mode 100644 app/lib/provider/param/cached_apk_provider_param.dart create mode 100644 app/lib/provider/param/cached_apk_provider_param.mapper.dart create mode 100644 app/lib/provider/persistence_provider.dart create mode 100644 app/lib/provider/persistence_provider_migrations.dart create mode 100644 app/lib/provider/progress_provider.dart create mode 100644 app/lib/provider/purchase_provider.dart create mode 100644 app/lib/provider/receive_history_provider.dart create mode 100644 app/lib/provider/security_provider.dart create mode 100644 app/lib/provider/selection/selected_receiving_files_provider.dart create mode 100644 app/lib/provider/selection/selected_sending_files_provider.dart create mode 100644 app/lib/provider/settings_provider.dart create mode 100644 app/lib/provider/tv_provider.dart create mode 100644 app/lib/provider/version_provider.dart create mode 100644 app/lib/provider/window_dimensions_provider.dart create mode 100644 app/lib/rust/api/crypto.dart create mode 100644 app/lib/rust/api/http.dart create mode 100644 app/lib/rust/api/http.freezed.dart create mode 100644 app/lib/rust/api/logging.dart create mode 100644 app/lib/rust/api/model.dart create mode 100644 app/lib/rust/api/stream.dart create mode 100644 app/lib/rust/api/webrtc.dart create mode 100644 app/lib/rust/api/webrtc.freezed.dart create mode 100644 app/lib/rust/frb_generated.dart create mode 100644 app/lib/rust/frb_generated.io.dart create mode 100644 app/lib/rust/frb_generated.web.dart create mode 100644 app/lib/util/alias_generator.dart create mode 100644 app/lib/util/determine_image_type.dart create mode 100644 app/lib/util/device_type_ext.dart create mode 100644 app/lib/util/favorites.dart create mode 100644 app/lib/util/file_path_helper.dart create mode 100644 app/lib/util/file_size_helper.dart create mode 100644 app/lib/util/file_speed_helper.dart create mode 100644 app/lib/util/file_type_ext.dart create mode 100644 app/lib/util/i18n.dart create mode 100644 app/lib/util/image_converter.dart create mode 100644 app/lib/util/ip_helper.dart create mode 100644 app/lib/util/native/autostart_helper.dart create mode 100644 app/lib/util/native/cache_helper.dart create mode 100644 app/lib/util/native/channel/android_channel.dart create mode 100644 app/lib/util/native/channel/android_channel.mapper.dart create mode 100644 app/lib/util/native/cmd_helper.dart create mode 100644 app/lib/util/native/content_uri_helper.dart create mode 100644 app/lib/util/native/context_menu_helper.dart create mode 100644 app/lib/util/native/cross_file_converters.dart create mode 100644 app/lib/util/native/device_info_helper.dart create mode 100644 app/lib/util/native/directories.dart create mode 100644 app/lib/util/native/file_picker.dart create mode 100644 app/lib/util/native/file_saver.dart create mode 100644 app/lib/util/native/ios_channel.dart create mode 100644 app/lib/util/native/macos_channel.dart create mode 100644 app/lib/util/native/open_file.dart create mode 100644 app/lib/util/native/open_folder.dart create mode 100644 app/lib/util/native/pick_directory_path.dart create mode 100644 app/lib/util/native/platform_check.dart create mode 100644 app/lib/util/native/taskbar_helper.dart create mode 100644 app/lib/util/native/tray_helper.dart create mode 100644 app/lib/util/platform_strings.dart create mode 100644 app/lib/util/rhttp.dart create mode 100644 app/lib/util/rust.dart create mode 100644 app/lib/util/security_helper.dart create mode 100644 app/lib/util/send_ignore.dart create mode 100644 app/lib/util/shared_preferences/shared_preferences_file.dart create mode 100644 app/lib/util/shared_preferences/shared_preferences_portable.dart create mode 100644 app/lib/util/simple_server.dart create mode 100644 app/lib/util/ui/animations_status.dart create mode 100644 app/lib/util/ui/asset_picker_translated_text_delegate.dart create mode 100644 app/lib/util/ui/dynamic_colors.dart create mode 100644 app/lib/util/ui/nav_bar_padding.dart create mode 100644 app/lib/util/ui/snackbar.dart create mode 100644 app/lib/util/user_agent_analyzer.dart create mode 100644 app/lib/widget/animated_opacity_cross_fade.dart create mode 100644 app/lib/widget/animations/initial_fade_transition.dart create mode 100644 app/lib/widget/animations/initial_slide_transition.dart create mode 100644 app/lib/widget/big_button.dart create mode 100644 app/lib/widget/column_list_view.dart create mode 100644 app/lib/widget/copyable_text.dart create mode 100644 app/lib/widget/custom_basic_appbar.dart create mode 100644 app/lib/widget/custom_dropdown_button.dart create mode 100644 app/lib/widget/custom_icon_button.dart create mode 100644 app/lib/widget/custom_progress_bar.dart create mode 100644 app/lib/widget/debug_entry.dart create mode 100644 app/lib/widget/device_bage.dart create mode 100644 app/lib/widget/dialogs/add_file_dialog.dart create mode 100644 app/lib/widget/dialogs/address_input_dialog.dart create mode 100644 app/lib/widget/dialogs/cancel_session_dialog.dart create mode 100644 app/lib/widget/dialogs/cannot_open_file_dialog.dart create mode 100644 app/lib/widget/dialogs/custom_bottom_sheet.dart create mode 100644 app/lib/widget/dialogs/encryption_disabled_notice.dart create mode 100644 app/lib/widget/dialogs/error_dialog.dart create mode 100644 app/lib/widget/dialogs/favorite_delete_dialog.dart create mode 100644 app/lib/widget/dialogs/favorite_dialog.dart create mode 100644 app/lib/widget/dialogs/favorite_edit_dialog.dart create mode 100644 app/lib/widget/dialogs/file_info_dialog.dart create mode 100644 app/lib/widget/dialogs/file_name_input_dialog.dart create mode 100644 app/lib/widget/dialogs/history_clear_dialog.dart create mode 100644 app/lib/widget/dialogs/ios_network_permission_dialog.dart create mode 100644 app/lib/widget/dialogs/loading_dialog.dart create mode 100644 app/lib/widget/dialogs/message_input_dialog.dart create mode 100644 app/lib/widget/dialogs/no_files_dialog.dart create mode 100644 app/lib/widget/dialogs/no_permission_dialog.dart create mode 100644 app/lib/widget/dialogs/not_available_on_platform_dialog.dart create mode 100644 app/lib/widget/dialogs/open_file_dialog.dart create mode 100644 app/lib/widget/dialogs/pin_dialog.dart create mode 100644 app/lib/widget/dialogs/qr_dialog.dart create mode 100644 app/lib/widget/dialogs/quick_actions_dialog.dart create mode 100644 app/lib/widget/dialogs/quick_save_from_favorites_notice.dart create mode 100644 app/lib/widget/dialogs/quick_save_notice.dart create mode 100644 app/lib/widget/dialogs/send_mode_help_dialog.dart create mode 100644 app/lib/widget/dialogs/text_field_tv.dart create mode 100644 app/lib/widget/dialogs/text_field_with_actions.dart create mode 100644 app/lib/widget/dialogs/zoom_dialog.dart create mode 100644 app/lib/widget/file_thumbnail.dart create mode 100644 app/lib/widget/labeled_checkbox.dart create mode 100644 app/lib/widget/list_tile/custom_list_tile.dart create mode 100644 app/lib/widget/list_tile/device_list_tile.dart create mode 100644 app/lib/widget/list_tile/device_placeholder_list_tile.dart create mode 100644 app/lib/widget/local_send_logo.dart create mode 100644 app/lib/widget/opacity_slideshow.dart create mode 100644 app/lib/widget/responsive_builder.dart create mode 100644 app/lib/widget/responsive_list_view.dart create mode 100644 app/lib/widget/responsive_wrap_view.dart create mode 100644 app/lib/widget/rotating_widget.dart create mode 100644 app/lib/widget/sliver/sliver_pinned_header.dart create mode 100644 app/lib/widget/watcher/life_cycle_watcher.dart create mode 100644 app/lib/widget/watcher/shortcut_watcher.dart create mode 100644 app/lib/widget/watcher/tray_watcher.dart create mode 100644 app/lib/widget/watcher/window_watcher.dart create mode 100644 app/linux/.gitignore create mode 100644 app/linux/CMakeLists.txt create mode 100644 app/linux/flutter/CMakeLists.txt create mode 100644 app/linux/flutter/generated_plugin_registrant.cc create mode 100644 app/linux/flutter/generated_plugin_registrant.h create mode 100644 app/linux/flutter/generated_plugins.cmake create mode 100644 app/linux/main.cc create mode 100644 app/linux/my_application.cc create mode 100644 app/linux/my_application.h create mode 100644 app/linux/packaging/deb/make_config.yaml create mode 100644 app/linux/packaging/rpm/make_config.yaml create mode 100644 app/macos/.gitignore create mode 100644 app/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 app/macos/Flutter/Flutter-Release.xcconfig create mode 100644 app/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 app/macos/Podfile create mode 100644 app/macos/Podfile.lock create mode 100644 app/macos/Runner.xcodeproj/project.pbxproj create mode 100644 app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 app/macos/Runner.xcodeproj/xcshareddata/xcschemes/ShareExtension.xcscheme create mode 100644 app/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 app/macos/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 app/macos/Runner/AppDelegate.swift create mode 100644 app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-1024.png create mode 100644 app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-128.png create mode 100644 app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-16.png create mode 100644 app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-256.png create mode 100644 app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-32.png create mode 100644 app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-512.png create mode 100644 app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-64.png create mode 100644 app/macos/Runner/Assets.xcassets/AppIconWithErrorMark.imageset/Contents.json create mode 100644 app/macos/Runner/Assets.xcassets/AppIconWithErrorMark.imageset/logo-1024-mac-256.png create mode 100644 app/macos/Runner/Assets.xcassets/AppIconWithSuccessMark.imageset/Contents.json create mode 100644 app/macos/Runner/Assets.xcassets/AppIconWithSuccessMark.imageset/logo-1024-mac-256.png create mode 100644 app/macos/Runner/Assets.xcassets/Contents.json create mode 100644 app/macos/Runner/Assets.xcassets/StatusBarItemIcon.imageset/Contents.json create mode 100644 app/macos/Runner/Assets.xcassets/StatusBarItemIcon.imageset/logo-32-black.png create mode 100644 app/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 app/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 app/macos/Runner/Configs/Debug.xcconfig create mode 100644 app/macos/Runner/Configs/Release.xcconfig create mode 100644 app/macos/Runner/Configs/Warnings.xcconfig create mode 100644 app/macos/Runner/ContentDropView.swift create mode 100644 app/macos/Runner/DebugProfile.entitlements create mode 100644 app/macos/Runner/Info.plist create mode 100644 app/macos/Runner/MainFlutterWindow.swift create mode 100644 app/macos/Runner/Release.entitlements create mode 100644 app/macos/Runner/SecurityScopedResourceManager.swift create mode 100644 app/macos/Runner/Shared.swift create mode 100644 app/macos/Runner/Utilities.swift create mode 100644 app/macos/ShareExtension/Info.plist create mode 100644 app/macos/ShareExtension/ShareController.swift create mode 100644 app/macos/ShareExtension/ShareExtension.entitlements create mode 100644 app/macos/ShareExtension/Utilities.swift create mode 100644 app/macos/ShareExtension/icon.icns create mode 100644 app/pubspec.lock create mode 100644 app/pubspec.yaml create mode 100644 app/rust-toolchain.toml create mode 100644 app/rust/.gitignore create mode 100644 app/rust/Cargo.lock create mode 100644 app/rust/Cargo.toml create mode 100644 app/rust/src/api/crypto.rs create mode 100644 app/rust/src/api/http.rs create mode 100644 app/rust/src/api/logging.rs create mode 100644 app/rust/src/api/mod.rs create mode 100644 app/rust/src/api/model.rs create mode 100644 app/rust/src/api/stream.rs create mode 100644 app/rust/src/api/webrtc.rs create mode 100644 app/rust/src/frb_generated.rs create mode 100644 app/rust/src/lib.rs create mode 100644 app/rust/src/util/bytes.rs create mode 100644 app/rust/src/util/mod.rs create mode 100644 app/rust_builder/.gitignore create mode 100644 app/rust_builder/README.md create mode 100644 app/rust_builder/android/.gitignore create mode 100644 app/rust_builder/android/build.gradle create mode 100644 app/rust_builder/android/settings.gradle create mode 100644 app/rust_builder/android/src/main/AndroidManifest.xml create mode 100644 app/rust_builder/cargokit/.gitignore create mode 100644 app/rust_builder/cargokit/LICENSE create mode 100644 app/rust_builder/cargokit/README create mode 100644 app/rust_builder/cargokit/build_pod.sh create mode 100644 app/rust_builder/cargokit/build_tool/README.md create mode 100644 app/rust_builder/cargokit/build_tool/analysis_options.yaml create mode 100644 app/rust_builder/cargokit/build_tool/bin/build_tool.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/build_tool.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/android_environment.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/build_pod.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/build_tool.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/builder.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/cargo.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/environment.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/logging.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/options.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/rustup.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/target.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/util.dart create mode 100644 app/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart create mode 100644 app/rust_builder/cargokit/build_tool/pubspec.lock create mode 100644 app/rust_builder/cargokit/build_tool/pubspec.yaml create mode 100644 app/rust_builder/cargokit/cmake/cargokit.cmake create mode 100644 app/rust_builder/cargokit/cmake/resolve_symlinks.ps1 create mode 100644 app/rust_builder/cargokit/gradle/plugin.gradle create mode 100644 app/rust_builder/cargokit/run_build_tool.cmd create mode 100755 app/rust_builder/cargokit/run_build_tool.sh create mode 100644 app/rust_builder/ios/Classes/dummy_file.c create mode 100644 app/rust_builder/ios/rust_lib_localsend_app.podspec create mode 100644 app/rust_builder/linux/CMakeLists.txt create mode 100644 app/rust_builder/macos/Classes/dummy_file.c create mode 100644 app/rust_builder/macos/rust_lib_localsend_app.podspec create mode 100644 app/rust_builder/pubspec.yaml create mode 100644 app/rust_builder/windows/.gitignore create mode 100644 app/rust_builder/windows/CMakeLists.txt create mode 100644 app/test/mocks.dart create mode 100644 app/test/mocks.mocks.dart create mode 100644 app/test/unit/i18n_test.dart create mode 100644 app/test/unit/model/dto/prepare_upload_request_dto_test.dart create mode 100644 app/test/unit/provider/favorites_provider_test.dart create mode 100644 app/test/unit/provider/last_devices_provider_test.dart create mode 100644 app/test/unit/provider/network_info_provider_test.dart create mode 100644 app/test/unit/provider/receive_history_provider_test.dart create mode 100644 app/test/unit/util/api_route_builder_test.dart create mode 100644 app/test/unit/util/file_path_helper_test.dart create mode 100644 app/test/unit/util/file_speed_helper_test.dart create mode 100644 app/test/unit/util/native/content_uri_helper_test.dart create mode 100644 app/test/unit/util/security_helper_test.dart create mode 100644 app/web/favicon.png create mode 100644 app/web/icons/Icon-192.png create mode 100644 app/web/icons/Icon-512.png create mode 100644 app/web/icons/Icon-maskable-192.png create mode 100644 app/web/icons/Icon-maskable-512.png create mode 100644 app/web/index.html create mode 100644 app/web/manifest.json create mode 100644 app/windows/.gitignore create mode 100644 app/windows/CMakeLists.txt create mode 100644 app/windows/flutter/CMakeLists.txt create mode 100644 app/windows/flutter/generated_plugin_registrant.cc create mode 100644 app/windows/flutter/generated_plugin_registrant.h create mode 100644 app/windows/flutter/generated_plugins.cmake create mode 100644 app/windows/install_msix_helper.ps1 create mode 100644 app/windows/localsend_app.exe.manifest create mode 100644 app/windows/runner/CMakeLists.txt create mode 100644 app/windows/runner/Runner.rc create mode 100644 app/windows/runner/flutter_window.cpp create mode 100644 app/windows/runner/flutter_window.h create mode 100644 app/windows/runner/main.cpp create mode 100644 app/windows/runner/resource.h create mode 100644 app/windows/runner/resources/app_icon.ico create mode 100644 app/windows/runner/runner.exe.manifest create mode 100644 app/windows/runner/utils.cpp create mode 100644 app/windows/runner/utils.h create mode 100644 app/windows/runner/win32_window.cpp create mode 100644 app/windows/runner/win32_window.h create mode 100644 app/windows/runner/winrt_ext.cpp create mode 100644 app/windows/runner/winrt_ext.h create mode 100644 cli/.gitignore create mode 100644 cli/README.md create mode 100644 cli/analysis_options.yaml create mode 100644 cli/bin/cli.dart create mode 100644 cli/lib/main.dart create mode 100644 cli/pubspec.lock create mode 100644 cli/pubspec.yaml create mode 100644 common/.gitignore create mode 100644 common/README.md create mode 100644 common/analysis_options.yaml create mode 100644 common/build.yaml create mode 100644 common/lib/api_route_builder.dart create mode 100644 common/lib/constants.dart create mode 100644 common/lib/isolate.dart create mode 100644 common/lib/model/device.dart create mode 100644 common/lib/model/device.mapper.dart create mode 100644 common/lib/model/device_info_result.dart create mode 100644 common/lib/model/dto/file_dto.dart create mode 100644 common/lib/model/dto/file_dto.mapper.dart create mode 100644 common/lib/model/dto/info_dto.dart create mode 100644 common/lib/model/dto/info_dto.mapper.dart create mode 100644 common/lib/model/dto/info_register_dto.dart create mode 100644 common/lib/model/dto/info_register_dto.mapper.dart create mode 100644 common/lib/model/dto/multicast_dto.dart create mode 100644 common/lib/model/dto/multicast_dto.mapper.dart create mode 100644 common/lib/model/dto/prepare_upload_request_dto.dart create mode 100644 common/lib/model/dto/prepare_upload_request_dto.mapper.dart create mode 100644 common/lib/model/dto/prepare_upload_response_dto.dart create mode 100644 common/lib/model/dto/prepare_upload_response_dto.mapper.dart create mode 100644 common/lib/model/dto/receive_request_response_dto.dart create mode 100644 common/lib/model/dto/receive_request_response_dto.mapper.dart create mode 100644 common/lib/model/dto/register_dto.dart create mode 100644 common/lib/model/dto/register_dto.mapper.dart create mode 100644 common/lib/model/file_status.dart create mode 100644 common/lib/model/file_type.dart create mode 100644 common/lib/model/file_type.mapper.dart create mode 100644 common/lib/model/session_status.dart create mode 100644 common/lib/model/stored_security_context.dart create mode 100644 common/lib/model/stored_security_context.mapper.dart create mode 100644 common/lib/src/isolate/child/http_provider.dart create mode 100644 common/lib/src/isolate/child/http_scan_discovery_isolate.dart create mode 100644 common/lib/src/isolate/child/main.dart create mode 100644 common/lib/src/isolate/child/multicast_discovery_isolate.dart create mode 100644 common/lib/src/isolate/child/sync_provider.dart create mode 100644 common/lib/src/isolate/child/sync_provider.mapper.dart create mode 100644 common/lib/src/isolate/child/upload_isolate.dart create mode 100644 common/lib/src/isolate/dto/isolate_task.dart create mode 100644 common/lib/src/isolate/dto/isolate_task_result.dart create mode 100644 common/lib/src/isolate/dto/send_to_isolate_data.dart create mode 100644 common/lib/src/isolate/parent/actions.dart create mode 100644 common/lib/src/isolate/parent/actions_sync.dart create mode 100644 common/lib/src/isolate/parent/parent_isolate_provider.dart create mode 100644 common/lib/src/isolate/parent/parent_isolate_provider.mapper.dart create mode 100644 common/lib/src/task/README.md create mode 100644 common/lib/src/task/discovery/http_scan_discovery.dart create mode 100644 common/lib/src/task/discovery/http_target_discovery.dart create mode 100644 common/lib/src/task/discovery/multicast_discovery.dart create mode 100644 common/lib/src/task/upload/http_upload.dart create mode 100644 common/lib/src/util/id_provider.dart create mode 100644 common/lib/src/util/isolate_helper.dart create mode 100644 common/lib/util/logger.dart create mode 100644 common/lib/util/network_interfaces.dart create mode 100644 common/lib/util/sleep.dart create mode 100644 common/lib/util/stream.dart create mode 100644 common/lib/util/task_runner.dart create mode 100644 common/pubspec.yaml create mode 100644 common/test/unit/model/device_test.dart create mode 100644 common/test/unit/util/network_interfaces_test.dart create mode 100644 common/test/unit/util/task_runner_test.dart create mode 100644 core/.gitignore create mode 100644 core/Cargo.lock create mode 100644 core/Cargo.toml create mode 100644 core/assets/web/error-403.html create mode 100644 core/assets/web/index.html create mode 100644 core/assets/web/main.js create mode 100644 core/src/crypto/cert.rs create mode 100644 core/src/crypto/hash.rs create mode 100644 core/src/crypto/mod.rs create mode 100644 core/src/crypto/nonce.rs create mode 100644 core/src/crypto/token.rs create mode 100644 core/src/http/client/mod.rs create mode 100644 core/src/http/client/url.rs create mode 100644 core/src/http/client/v2.rs create mode 100644 core/src/http/client/v3.rs create mode 100644 core/src/http/dto.rs create mode 100644 core/src/http/dto_v2.rs create mode 100644 core/src/http/mod.rs create mode 100644 core/src/http/server/client_cert_verifier.rs create mode 100644 core/src/http/server/collect_to_json.rs create mode 100644 core/src/http/server/controller/mod.rs create mode 100644 core/src/http/server/controller/v2.rs create mode 100644 core/src/http/server/controller/v3.rs create mode 100644 core/src/http/server/controller/web.rs create mode 100644 core/src/http/server/error.rs create mode 100644 core/src/http/server/mod.rs create mode 100644 core/src/http/server/query.rs create mode 100644 core/src/http/server/response.rs create mode 100644 core/src/http/server/session.rs create mode 100644 core/src/http/state.rs create mode 100644 core/src/lib.rs create mode 100644 core/src/main.rs create mode 100644 core/src/model/discovery.rs create mode 100644 core/src/model/mod.rs create mode 100644 core/src/model/transfer.rs create mode 100644 core/src/util/base64.rs create mode 100644 core/src/util/mod.rs create mode 100644 core/src/util/time.rs create mode 100644 core/src/webrtc/mod.rs create mode 100644 core/src/webrtc/signaling.rs create mode 100644 core/src/webrtc/webrtc.rs create mode 100644 core/tests/v2_server.rs create mode 100644 core/tests/v2_web_send.rs create mode 100644 fastlane/metadata/android/en-US/full_description.txt create mode 100644 fastlane/metadata/android/en-US/images/icon.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/7.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/8.jpg create mode 100644 fastlane/metadata/android/en-US/short_description.txt create mode 100644 fastlane/metadata/android/pt-BR/full_description.txt create mode 100644 fastlane/metadata/android/pt-BR/images/phoneScreenshots/1.png create mode 100644 fastlane/metadata/android/pt-BR/images/phoneScreenshots/2.png create mode 100644 fastlane/metadata/android/pt-BR/images/phoneScreenshots/3.png create mode 100644 fastlane/metadata/android/pt-BR/images/phoneScreenshots/4.png create mode 100644 fastlane/metadata/android/pt-BR/short_description.txt create mode 100644 msix/AppxManifest.xml create mode 100644 msix/Images/BadgeLogo.scale-100.png create mode 100644 msix/Images/BadgeLogo.scale-125.png create mode 100644 msix/Images/BadgeLogo.scale-150.png create mode 100644 msix/Images/BadgeLogo.scale-200.png create mode 100644 msix/Images/BadgeLogo.scale-400.png create mode 100644 msix/Images/LargeTile.scale-100.png create mode 100644 msix/Images/LargeTile.scale-125.png create mode 100644 msix/Images/LargeTile.scale-150.png create mode 100644 msix/Images/LargeTile.scale-200.png create mode 100644 msix/Images/LargeTile.scale-400.png create mode 100644 msix/Images/SmallTile.scale-100.png create mode 100644 msix/Images/SmallTile.scale-125.png create mode 100644 msix/Images/SmallTile.scale-150.png create mode 100644 msix/Images/SmallTile.scale-200.png create mode 100644 msix/Images/SmallTile.scale-400.png create mode 100644 msix/Images/SplashScreen.scale-100.png create mode 100644 msix/Images/SplashScreen.scale-125.png create mode 100644 msix/Images/SplashScreen.scale-150.png create mode 100644 msix/Images/SplashScreen.scale-200.png create mode 100644 msix/Images/SplashScreen.scale-400.png create mode 100644 msix/Images/Square150x150Logo.scale-100.png create mode 100644 msix/Images/Square150x150Logo.scale-125.png create mode 100644 msix/Images/Square150x150Logo.scale-150.png create mode 100644 msix/Images/Square150x150Logo.scale-200.png create mode 100644 msix/Images/Square150x150Logo.scale-400.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-16.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-20.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-24.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-256.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-30.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-32.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-36.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-40.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-48.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-60.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-64.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-72.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-80.png create mode 100644 msix/Images/Square44x44Logo.altform-lightunplated_targetsize-96.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-16.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-20.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-24.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-256.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-30.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-32.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-36.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-40.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-48.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-60.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-64.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-72.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-80.png create mode 100644 msix/Images/Square44x44Logo.altform-unplated_targetsize-96.png create mode 100644 msix/Images/Square44x44Logo.scale-100.png create mode 100644 msix/Images/Square44x44Logo.scale-125.png create mode 100644 msix/Images/Square44x44Logo.scale-150.png create mode 100644 msix/Images/Square44x44Logo.scale-200.png create mode 100644 msix/Images/Square44x44Logo.scale-400.png create mode 100644 msix/Images/Square44x44Logo.targetsize-16.png create mode 100644 msix/Images/Square44x44Logo.targetsize-20.png create mode 100644 msix/Images/Square44x44Logo.targetsize-24.png create mode 100644 msix/Images/Square44x44Logo.targetsize-256.png create mode 100644 msix/Images/Square44x44Logo.targetsize-30.png create mode 100644 msix/Images/Square44x44Logo.targetsize-32.png create mode 100644 msix/Images/Square44x44Logo.targetsize-36.png create mode 100644 msix/Images/Square44x44Logo.targetsize-40.png create mode 100644 msix/Images/Square44x44Logo.targetsize-48.png create mode 100644 msix/Images/Square44x44Logo.targetsize-60.png create mode 100644 msix/Images/Square44x44Logo.targetsize-64.png create mode 100644 msix/Images/Square44x44Logo.targetsize-72.png create mode 100644 msix/Images/Square44x44Logo.targetsize-80.png create mode 100644 msix/Images/Square44x44Logo.targetsize-96.png create mode 100644 msix/Images/StoreLogo.scale-100.png create mode 100644 msix/Images/StoreLogo.scale-125.png create mode 100644 msix/Images/StoreLogo.scale-150.png create mode 100644 msix/Images/StoreLogo.scale-200.png create mode 100644 msix/Images/StoreLogo.scale-400.png create mode 100644 msix/Images/Wide310x150Logo.scale-100.png create mode 100644 msix/Images/Wide310x150Logo.scale-125.png create mode 100644 msix/Images/Wide310x150Logo.scale-150.png create mode 100644 msix/Images/Wide310x150Logo.scale-200.png create mode 100644 msix/Images/Wide310x150Logo.scale-400.png create mode 100644 msix/resources.pri create mode 100644 msix/resources.scale-125.pri create mode 100644 msix/resources.scale-150.pri create mode 100644 msix/resources.scale-200.pri create mode 100644 msix/resources.scale-400.pri create mode 100644 readme_i18n/README_CS.md create mode 100644 readme_i18n/README_ES.md create mode 100644 readme_i18n/README_FA.md create mode 100644 readme_i18n/README_FR.md create mode 100644 readme_i18n/README_ID.md create mode 100644 readme_i18n/README_IT.md create mode 100644 readme_i18n/README_JA.md create mode 100644 readme_i18n/README_KM.md create mode 100644 readme_i18n/README_KO.md create mode 100644 readme_i18n/README_MS.md create mode 100644 readme_i18n/README_PH.md create mode 100644 readme_i18n/README_PL.md create mode 100644 readme_i18n/README_PT_BR.md create mode 100644 readme_i18n/README_RU.md create mode 100644 readme_i18n/README_TH.md create mode 100644 readme_i18n/README_TR.md create mode 100644 readme_i18n/README_UK.md create mode 100644 readme_i18n/README_VI.md create mode 100644 readme_i18n/README_ZH.md create mode 100644 scripts/Languages/ChineseSimplified.isl create mode 100644 scripts/appimage/AppImageBuilder_arm_64.yml create mode 100644 scripts/appimage/AppImageBuilder_x86_64.yml create mode 100644 scripts/compile_android_apk.sh create mode 100644 scripts/compile_android_appbundle.ps1 create mode 100644 scripts/compile_ios.sh create mode 100644 scripts/compile_linux_appimage.sh create mode 100644 scripts/compile_mac_appstore.sh create mode 100644 scripts/compile_mac_dmg.sh create mode 100644 scripts/compile_windows_exe-inno.iss create mode 100644 scripts/compile_windows_exe.ps1 create mode 100644 scripts/compile_windows_msix_helper.ps1 create mode 100644 scripts/compile_windows_msix_signed.ps1 create mode 100644 scripts/compile_windows_msix_store.ps1 create mode 100644 scripts/compile_windows_zip.ps1 create mode 100644 scripts/contributions_digester.dart create mode 100644 scripts/dmg/background.png create mode 100644 scripts/download_windows_msix.ps1 create mode 100644 scripts/msix/msix_downloader.ps1 create mode 100755 scripts/remove_proprietary_dependencies.sh create mode 100644 scripts/verify_exe_signature.ps1 create mode 100644 scripts/windows/x64/msvcp140.dll create mode 100644 scripts/windows/x64/vcruntime140.dll create mode 100644 scripts/windows/x64/vcruntime140_1.dll create mode 100644 server/.gitignore create mode 100644 server/Cargo.lock create mode 100644 server/Cargo.toml create mode 100644 server/Dockerfile create mode 100644 server/README.md create mode 100644 server/src/config/error.rs create mode 100644 server/src/config/init.rs create mode 100644 server/src/config/mod.rs create mode 100644 server/src/config/scheduler.rs create mode 100644 server/src/config/state.rs create mode 100644 server/src/controller/mod.rs create mode 100644 server/src/controller/ws_controller.rs create mode 100644 server/src/main.rs create mode 100644 server/src/util/base64.rs create mode 100644 server/src/util/ip.rs create mode 100644 server/src/util/mod.rs diff --git a/.fvmrc b/.fvmrc new file mode 100644 index 0000000..d80cf57 --- /dev/null +++ b/.fvmrc @@ -0,0 +1,3 @@ +{ + "flutter": "3.41.9" +} \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..0977351 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [Tienisto] diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..c0043f9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,95 @@ +name: Bug report +description: Create a report to help us address issues you are facing +title: "bug: " +labels: [bug] +body: + - type: checkboxes + id: confirm + attributes: + label: Read [this](https://github.com/localsend/localsend/issues/528) before anything + options: + - label: I have read it. + - label: Issues not fitting are closed. + + - type: checkboxes + id: duplication + attributes: + label: "Make sure about:" + options: + - label: This issue is not duplicated with any other open or closed issues. + required: true + - label: I am using the latest version from the release. + required: true + + - type: textarea + id: description + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is + placeholder: | + App crashes on startup every time after changing settings. + / + App crashes when sending/receiving massive files. + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen + placeholder: | + App started normally, everything worked fine. + validations: + required: true + + - type: textarea + id: reproduce + attributes: + label: Reproduction + description: Steps to reproduce the bug + placeholder: | + 1. Turn on "..." in "... settings" + 2. Restart the app + 3. Crash + / + 1. Transfer a "..." file is ... size takes ... long + 2. Observe ... + 3. Crash + validations: + required: true + + - type: textarea + id: environment + attributes: + label: Device information + description: Provide details about your system environment + placeholder: | + Device: (Pixel 9 Pro/Lenovo Yoga 9i) + System: (Android 16 BP31.2505/Windows 11 24H2) + Special things: (Rooted/Hardware damaged) + If applicable, both info of sender and receiver. + validations: + required: true + + - type: textarea + id: screenshots + attributes: + label: Screenshots + description: If applicable, add screenshots to help explain your problem + placeholder: | + modified_setting_items.jpg + files_to_send.jpg + crashed_screen.jpg + validations: + required: false + + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any other context about the problem here + placeholder: | + Crash report or any helpful information. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..faa34db --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,18 @@ +blank_issues_enabled: false +contact_links: + - name: Security issues + url: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#security-issues + about: Help us address security issues as quickly and effectively as possible + + - name: Get latest LocalSend + url: https://localsend.org/download + about: Your issue may be version related, so try updating first + + - name: GitHub Discussions + url: https://github.com/localsend/localsend/discussions + about: If you think your issue isn't that serious, you can discuss it here + + - name: Contributing guide + url: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md + about: Check our contributing guide if you’re interested or have time + diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..d12eaa9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,59 @@ +name: Feature request +description: Suggest an idea for this project +title: "fr: " +labels: ["enhancement"] +body: + - type: checkboxes + id: confirm + attributes: + label: Read [this](https://github.com/localsend/localsend/issues/528) before anything + options: + - label: I have read it. + - label: Issues not fitting are closed. + + - type: checkboxes + id: duplication + attributes: + label: "Make sure about:" + options: + - label: This issue is not duplicated with any other open or closed issues. + required: true + - label: This issue is a feature request, not a bug report. + required: true + + - type: textarea + id: reason + attributes: + label: Reason of the change + description: Why the things need to be changed? Inconvenient or logical wrong? + placeholder: | + Because if I want to ..., I'll need to ... + It's not very ... to do so ... + validations: + required: true + + - type: textarea + id: solution + attributes: + label: Description of the change + description: What should we change or add, to make it better? + placeholder: | + If there's a choice like ..., it will be more ... + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: The alternatives you've considered + description: If we are unable to do that above, any other solution? + placeholder: | + Add a ... also helps ... + + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any other context or screenshots about the request here + placeholder: | + Related app, website, system, or a design. Anything helpful can be here. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..d094c3a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 0000000..786d146 --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,10 @@ +template: | + ### Summary + + - insert summary here + + ### Contributions + + $CHANGES + + [Full Changelog](https://github.com/localsend/localsend/blob/main/app/assets/CHANGELOG.md) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e8c6401 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,105 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +env: + FLUTTER_VERSION: "3.41.9" + +jobs: + format: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + - name: Setup Flutter SDK + uses: flutter-actions/setup-flutter@v4 + with: + version: ${{ env.FLUTTER_VERSION }} + channel: "stable" + + - name: Dependencies (app) + working-directory: app + run: flutter pub get + - name: Dependencies (cargokit - rust_builder) + working-directory: app/rust_builder/cargokit/build_tool + run: flutter pub get + - name: Remove gen directory (app) + working-directory: app + run: rm -rf lib/gen + - name: Check format (app) + working-directory: app + run: dart format --set-exit-if-changed lib test + + - name: Dependencies (common) + working-directory: common + run: dart pub get + - name: Check format (common) + working-directory: common + run: dart format --set-exit-if-changed lib test + + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + - name: Setup Flutter SDK + uses: flutter-actions/setup-flutter@v4 + with: + version: ${{ env.FLUTTER_VERSION }} + channel: "stable" + + - name: Dependencies (app) + working-directory: app + run: flutter pub get + - name: Dependencies (cargokit - rust_builder) + working-directory: app/rust_builder/cargokit/build_tool + run: flutter pub get + - name: Analyze (app) + working-directory: app + run: flutter analyze + - name: Test (app) + working-directory: app + run: flutter test + + - name: Dependencies (common) + working-directory: common + run: dart pub get + - name: Analyze (common) + working-directory: common + run: dart analyze + - name: Test (common) + working-directory: common + run: dart test + + packaging: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + - name: Extract version from pubspec.yaml + id: pubspec_version + run: | + VERSION=$(grep '^version: ' app/pubspec.yaml | sed 's/version: //' | sed 's/\+.*//') + echo "Pubspec version is $VERSION" + echo "pubspec_version=$VERSION" >> $GITHUB_ENV + + - name: Extract version from Inno Setup configuration + id: inno_version + run: | + VERSION=$(grep '#define MyAppVersion ' scripts/compile_windows_exe-inno.iss | sed 's/#define MyAppVersion "//' | sed 's/"//') + echo "Inno Setup version is $VERSION" + echo "inno_version=$VERSION" >> $GITHUB_ENV + + - name: Compare pubspec and Inno Setup versions + run: | + if [ "$pubspec_version" != "$inno_version" ]; then + echo "Version mismatch detected!" + exit 1 + else + echo "Versions match." + fi + diff --git a/.github/workflows/clear_workflows.yml b/.github/workflows/clear_workflows.yml new file mode 100644 index 0000000..21e0eb3 --- /dev/null +++ b/.github/workflows/clear_workflows.yml @@ -0,0 +1,57 @@ +name: Delete old workflow runs +on: + workflow_dispatch: + inputs: + days: + description: 'Number of days.' + required: true + default: 30 + minimum_runs: + description: 'The minimum runs to keep for each workflow.' + required: true + default: 6 + delete_workflow_pattern: + description: 'The name or filename of the workflow. if not set then it will target all workflows.' + required: false + delete_workflow_by_state_pattern: + description: 'Remove workflow by state: active, deleted, disabled_fork, disabled_inactivity, disabled_manually' + required: true + default: "All" + type: choice + options: + - "All" + - active + - deleted + - disabled_inactivity + - disabled_manually + delete_run_by_conclusion_pattern: + description: 'Remove workflow by conclusion: action_required, cancelled, failure, skipped, success' + required: true + default: "All" + type: choice + options: + - "All" + - action_required + - cancelled + - failure + - skipped + - success + dry_run: + description: 'Only log actions, do not perform any delete operations.' + required: false + +jobs: + del_runs: + runs-on: ubuntu-latest + steps: + - name: Delete workflow runs + uses: Mattraks/delete-workflow-runs@998b89248266543a3c7827da0a73cf49d0131222 # 2.0.5 + with: + token: ${{ github.token }} + repository: ${{ github.repository }} + retain_days: ${{ github.event.inputs.days }} + keep_minimum_runs: ${{ github.event.inputs.minimum_runs }} + delete_workflow_pattern: ${{ github.event.inputs.delete_workflow_pattern }} + delete_workflow_by_state_pattern: ${{ github.event.inputs.delete_workflow_by_state_pattern }} + delete_run_by_conclusion_pattern: ${{ github.event.inputs.delete_run_by_conclusion_pattern }} + dry_run: ${{ github.event.inputs.dry_run }} diff --git a/.github/workflows/compile_apk.yml b/.github/workflows/compile_apk.yml new file mode 100644 index 0000000..ce1f213 --- /dev/null +++ b/.github/workflows/compile_apk.yml @@ -0,0 +1,86 @@ +name: Compile APK + +on: + workflow_dispatch: + +env: + FLUTTER_VERSION: "3.41.9" + RUST_VERSION: "1.84.1" + APK_BUILD_DIR: "/tmp/build" + +jobs: + build: + runs-on: ubuntu-24.04 + outputs: + version: ${{ steps.get_version.outputs.version }} + + steps: + - uses: actions/checkout@v6 + + - name: Get version from pubspec.yaml + id: get_version + run: | + VERSION=$(sed -n 's/^version: \([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' app/pubspec.yaml) + echo "version=$VERSION" >> $GITHUB_OUTPUT + + build_apk: + needs: build + runs-on: ubuntu-22.04 + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Remove proprietary dependencies + run: sh scripts/remove_proprietary_dependencies.sh + + - name: Copy files to env.APK_BUILD_DIR + run: | + mkdir -p $APK_BUILD_DIR + cp -r . $APK_BUILD_DIR + + - name: Decode key.properties file + working-directory: ${{ env.APK_BUILD_DIR }} + env: + ENCODED_STRING: ${{ secrets.ANDROID_KEY_PROPERTIES }} + run: echo $ENCODED_STRING | base64 -di > app/android/key.properties + + - name: Decode android-keystore.jks file + working-directory: ${{ env.APK_BUILD_DIR }} + env: + ENCODED_STRING: ${{ secrets.ANDROID_KEY_STORE }} + run: mkdir secrets && echo $ENCODED_STRING | base64 -di > secrets/android-keystore.jks + + - name: Set up JDK 17 + uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: '17' + + - name: Install Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: ${{ env.RUST_VERSION }} + + - name: Dependencies + working-directory: ${{ env.APK_BUILD_DIR }}/app + run: flutter pub get + + - name: Build APK + working-directory: ${{ env.APK_BUILD_DIR }}/app + run: flutter build apk --split-per-abi + + - name: Upload APK + uses: actions/upload-artifact@v6 + with: + name: apk-result + path: | + ${{ env.APK_BUILD_DIR }}/app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk + ${{ env.APK_BUILD_DIR }}/app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk + ${{ env.APK_BUILD_DIR }}/app/build/app/outputs/flutter-apk/app-x86_64-release.apk diff --git a/.github/workflows/compile_arm64_appimage.yml b/.github/workflows/compile_arm64_appimage.yml new file mode 100644 index 0000000..2a5b3b9 --- /dev/null +++ b/.github/workflows/compile_arm64_appimage.yml @@ -0,0 +1,72 @@ +name: Build arm64 AppImage + +on: + workflow_dispatch: + +env: + FLUTTER_VERSION: "3.41.9" + +jobs: + build: + runs-on: ubuntu-22.04 + outputs: + version: ${{ steps.get_version.outputs.version }} + + steps: + - uses: actions/checkout@v6 + + - name: Get version from pubspec.yaml + id: get_version + run: | + VERSION=$(sed -n 's/^version: \([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' app/pubspec.yaml) + echo "version=$VERSION" >> $GITHUB_OUTPUT + + # Manage the Flutter version on the self-hosted runner manually! + # Flutter currently doesn't provide Linux ARM64 binaries. + build_appimage_arm_64: + needs: build + runs-on: [self-hosted, linux, arm64] + + steps: + - uses: actions/checkout@v6 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev libfuse2 + + - name: Dependencies + working-directory: app + run: flutter pub get + + - name: Compile linux + working-directory: app + run: flutter build linux + + - name: Copy compiled linux files + run: | + mkdir AppDir + cp -r app/build/linux/arm64/release/bundle/* AppDir/ + + - name: Copy logo to AppDir + run: | + mkdir -p AppDir/usr/share/icons/hicolor/32x32/apps + cp app/assets/img/logo-32.png AppDir/usr/share/icons/hicolor/32x32/apps/localsend.png + mkdir -p AppDir/usr/share/icons/hicolor/128x128/apps + cp app/assets/img/logo-128.png AppDir/usr/share/icons/hicolor/128x128/apps/localsend.png + mkdir -p AppDir/usr/share/icons/hicolor/256x256/apps + cp app/assets/img/logo-256.png AppDir/usr/share/icons/hicolor/256x256/apps/localsend.png + + - name: Copy Recipe to correct location + run: cp scripts/appimage/AppImageBuilder_arm_64.yml AppImageBuilder.yml + + - name: Build AppImage + uses: AppImageCrafters/build-appimage@57c3bc6963f870ce3be103117de5b5e33ffbaeb6 + with: + recipe: ./AppImageBuilder.yml + + - name: Upload AppImage file + uses: actions/upload-artifact@v6 + with: + name: appimage-arm-64-result + path: ./*.AppImage diff --git a/.github/workflows/linux_build.yml b/.github/workflows/linux_build.yml new file mode 100644 index 0000000..2c64bad --- /dev/null +++ b/.github/workflows/linux_build.yml @@ -0,0 +1,101 @@ +name: Linux build + +on: + workflow_dispatch: + +env: + FLUTTER_VERSION: "3.41.9" + APK_BUILD_DIR: "/tmp/build" + +jobs: + build: + runs-on: ubuntu-24.04 + outputs: + version: ${{ steps.get_version.outputs.version }} + + steps: + - uses: actions/checkout@v6 + + - name: Get version from pubspec.yaml + id: get_version + working-directory: app + run: | + VERSION=$(sed -n 's/^version: \([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' pubspec.yaml) + echo "version=$VERSION" >> $GITHUB_OUTPUT + + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: "stable" + + - name: Dependencies + working-directory: app + run: flutter pub get + + - name: Build generated files + working-directory: app + run: dart run build_runner build -d + + - name: Upload updated lib files with generated code + uses: actions/upload-artifact@v6 + with: + name: lib-files + path: ./app/lib/* + + build_appimage: + needs: build + runs-on: ubuntu-24.04 + + steps: + - uses: actions/checkout@v6 + + - name: Download generated files + uses: actions/download-artifact@v7 + with: + name: lib-files + path: app/lib + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev libfuse2 + + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: "stable" + + - name: Dependencies + working-directory: app + run: flutter pub get + + - name: Compile linux + working-directory: app + run: flutter build linux + + - name: Copy compiled linux files + working-directory: app + run: | + mkdir AppDir + cp -r build/linux/x64/release/bundle/* AppDir/ + + - name: Copy logo to AppDir + working-directory: app + run: | + mkdir -p AppDir/usr/share/icons/hicolor/32x32/apps + cp assets/img/logo-32.png AppDir/usr/share/icons/hicolor/32x32/apps/localsend.png + mkdir -p AppDir/usr/share/icons/hicolor/128x128/apps + cp assets/img/logo-128.png AppDir/usr/share/icons/hicolor/128x128/apps/localsend.png + mkdir -p AppDir/usr/share/icons/hicolor/256x256/apps + cp assets/img/logo-256.png AppDir/usr/share/icons/hicolor/256x256/apps/localsend.png + + - name: Build AppImage + uses: AppImageCrafters/build-appimage@57c3bc6963f870ce3be103117de5b5e33ffbaeb6 + with: + recipe: ./app/AppImageBuilder.yml + + - name: Upload AppImage file + uses: actions/upload-artifact@v6 + with: + name: appimage-result + path: ./app/*.AppImage diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..0f973d4 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,575 @@ +name: Release Draft + +on: + workflow_dispatch: + +env: + FLUTTER_VERSION: "3.41.9" + RUST_VERSION: "1.84.1" + APK_BUILD_DIR: "/tmp/build" + +jobs: + build: + runs-on: ubuntu-24.04 + outputs: + version: ${{ steps.get_version.outputs.version }} + + steps: + - uses: actions/checkout@v6 + + - name: Get version from pubspec.yaml + id: get_version + run: | + VERSION=$(sed -n 's/^version: \([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' app/pubspec.yaml) + echo "version=$VERSION" >> $GITHUB_OUTPUT + + build_apk: + needs: build + runs-on: ubuntu-22.04 + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Remove proprietary dependencies + run: sh scripts/remove_proprietary_dependencies.sh + + - name: Copy files to env.APK_BUILD_DIR + run: | + mkdir -p $APK_BUILD_DIR + cp -r . $APK_BUILD_DIR + + - name: Decode key.properties file + working-directory: ${{ env.APK_BUILD_DIR }} + env: + ENCODED_STRING: ${{ secrets.ANDROID_KEY_PROPERTIES }} + run: echo $ENCODED_STRING | base64 -di > app/android/key.properties + + - name: Decode android-keystore.jks file + working-directory: ${{ env.APK_BUILD_DIR }} + env: + ENCODED_STRING: ${{ secrets.ANDROID_KEY_STORE }} + run: mkdir secrets && echo $ENCODED_STRING | base64 -di > secrets/android-keystore.jks + + - name: Set up JDK 17 + uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: '17' + + - name: Install Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: ${{ env.RUST_VERSION }} + + - name: Check rust-toolchain.toml + working-directory: ${{ env.APK_BUILD_DIR }}/app + run: rustup show + + - name: Dependencies + working-directory: ${{ env.APK_BUILD_DIR }}/app + run: flutter pub get + + - name: Build APK + working-directory: ${{ env.APK_BUILD_DIR }}/app + run: flutter build apk --split-per-abi + + - name: Upload APK + uses: actions/upload-artifact@v6 + with: + name: apk-result + path: | + ${{ env.APK_BUILD_DIR }}/app/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk + ${{ env.APK_BUILD_DIR }}/app/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk + ${{ env.APK_BUILD_DIR }}/app/build/app/outputs/flutter-apk/app-x86_64-release.apk + + build_tar_x86_64: + needs: build + runs-on: ubuntu-24.04 + + steps: + - uses: actions/checkout@v6 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev + + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: "stable" + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: ${{ env.RUST_VERSION }} + + - name: Check rust-toolchain.toml + working-directory: app + run: rustup show + + - name: Dependencies + working-directory: app + run: flutter pub get + + - name: Compile linux + working-directory: app + run: flutter build linux + + - name: Create tar.gz archive + run: | + cd app/build/linux/x64/release/bundle + tar -czvf ../../../../../result.tar.gz * + + - name: Upload tar.gz archive + uses: actions/upload-artifact@v6 + with: + name: tar-gz-x86-64-result + path: ./app/*.tar.gz + + # Manage the Flutter version on the self-hosted runner manually! + # Flutter currently doesn't provide Linux ARM64 binaries. + build_tar_arm_64: + needs: build + runs-on: [ self-hosted, linux, arm64 ] + + steps: + - uses: actions/checkout@v6 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev + + - name: Dependencies + working-directory: app + run: flutter pub get + + - name: Compile linux + working-directory: app + run: flutter build linux + + - name: Create tar.gz archive + run: | + cd app/build/linux/arm64/release/bundle + tar -czvf ../../../../../result.tar.gz * + + - name: Upload tar.gz archive + uses: actions/upload-artifact@v6 + with: + name: tar-gz-arm-64-result + path: ./app/*.tar.gz + + build_deb_x86_64: + needs: build + runs-on: ubuntu-24.04 + + steps: + - uses: actions/checkout@v6 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev + + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: "stable" + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: ${{ env.RUST_VERSION }} + + - name: Check rust-toolchain.toml + working-directory: app + run: rustup show + + - name: Enable dart_distributor + run: dart pub global activate flutter_distributor + + - name: Update PATH + run: echo 'export PATH="$PATH:$HOME/.pub-cache/bin"' >> ~/.bashrc + + - name: Build deb package + working-directory: app + run: flutter_distributor package --platform linux --targets deb + + - name: Find deb file + id: find_deb + run: | + VERSION=${{ needs.build.outputs.version }} + DEB_PATH=$(find app/dist -name "localsend_app-$VERSION*-linux.deb") + echo "deb_path=$DEB_PATH" >> $GITHUB_OUTPUT + + - name: Check if deb file exists + id: check_file + run: | + if [[ ! -f "${{ steps.find_deb.outputs.deb_path }}" ]]; then + echo "File not found: ${{ steps.find_deb.outputs.deb_path }}" + exit 1 + fi + + - name: Upload deb file + uses: actions/upload-artifact@v6 + with: + name: deb-x86-64-result + path: ${{ steps.find_deb.outputs.deb_path }} + + # Manage the Flutter version on the self-hosted runner manually! + # Flutter currently doesn't provide Linux ARM64 binaries. + build_deb_arm_64: + needs: build + runs-on: [ self-hosted, linux, arm64 ] + + steps: + - uses: actions/checkout@v6 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev + + - name: Enable dart_distributor + run: dart pub global activate flutter_distributor + + - name: Build deb package + working-directory: app + run: PATH="$PATH:$HOME/.pub-cache/bin" flutter_distributor package --platform linux --targets deb + + - name: Find deb file + id: find_deb + run: | + VERSION=${{ needs.build.outputs.version }} + DEB_PATH=$(find app/dist -name "localsend_app-$VERSION*-linux.deb") + echo "deb_path=$DEB_PATH" >> $GITHUB_OUTPUT + + - name: Check if deb file exists + id: check_file + run: | + if [[ ! -f "${{ steps.find_deb.outputs.deb_path }}" ]]; then + echo "File not found: ${{ steps.find_deb.outputs.deb_path }}" + exit 1 + fi + + - name: Upload deb file + uses: actions/upload-artifact@v6 + with: + name: deb-arm-64-result + path: ${{ steps.find_deb.outputs.deb_path }} + + build_appimage_x86_64: + needs: build + runs-on: ubuntu-24.04 + + steps: + - uses: actions/checkout@v6 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev libfuse2 + + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: "stable" + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: ${{ env.RUST_VERSION }} + + - name: Check rust-toolchain.toml + working-directory: app + run: rustup show + + - name: Dependencies + working-directory: app + run: flutter pub get + + - name: Compile linux + working-directory: app + run: flutter build linux + + - name: Copy compiled linux files + run: | + mkdir AppDir + cp -r app/build/linux/x64/release/bundle/* AppDir/ + + - name: Copy logo to AppDir + run: | + mkdir -p AppDir/usr/share/icons/hicolor/32x32/apps + cp app/assets/img/logo-32.png AppDir/usr/share/icons/hicolor/32x32/apps/localsend.png + mkdir -p AppDir/usr/share/icons/hicolor/128x128/apps + cp app/assets/img/logo-128.png AppDir/usr/share/icons/hicolor/128x128/apps/localsend.png + mkdir -p AppDir/usr/share/icons/hicolor/256x256/apps + cp app/assets/img/logo-256.png AppDir/usr/share/icons/hicolor/256x256/apps/localsend.png + + - name: Copy Recipe to correct location + run: cp scripts/appimage/AppImageBuilder_x86_64.yml AppImageBuilder.yml + + - name: Build AppImage + uses: AppImageCrafters/build-appimage@57c3bc6963f870ce3be103117de5b5e33ffbaeb6 + with: + recipe: ./AppImageBuilder.yml + + - name: Upload AppImage file + uses: actions/upload-artifact@v6 + with: + name: appimage-x86-64-result + path: ./*.AppImage + + build_windows_zip_x86_64: + needs: build + runs-on: windows-latest + + steps: + - name: Fix long file paths + run: git config --system core.longpaths true + + - name: Checkout repository + uses: actions/checkout@v6 + + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: "stable" + + - name: Dependencies + working-directory: app + run: flutter pub get + + - name: Compile for Windows + working-directory: app + run: flutter build windows + + - name: Create empty settings.json + working-directory: app + run: echo {} > build/windows/x64/runner/Release/settings.json + + - name: Add DLL files + working-directory: app + run: | + Copy-Item ../scripts/windows/x64/msvcp140.dll build/windows/x64/runner/Release/ + Copy-Item ../scripts/windows/x64/vcruntime140.dll build/windows/x64/runner/Release/ + Copy-Item ../scripts/windows/x64/vcruntime140_1.dll build/windows/x64/runner/Release/ + + - name: Zip compiled files + working-directory: app + run: Compress-Archive -Path build/windows/x64/runner/Release/* -DestinationPath LocalSend.zip + + - name: Upload zip + uses: actions/upload-artifact@v6 + with: + name: windows-zip-x86-64-result + path: app/LocalSend.zip + + release: + needs: + - build + - build_apk + - build_tar_x86_64 + - build_tar_arm_64 + - build_deb_x86_64 + - build_deb_arm_64 + - build_appimage_x86_64 + - build_windows_zip_x86_64 + runs-on: ubuntu-24.04 + + steps: + - uses: actions/checkout@v6 + + - name: Draft release + id: draft_release + uses: release-drafter/release-drafter@v6 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag: v${{ needs.build.outputs.version }} + name: v${{ needs.build.outputs.version }} + + # APK + - name: Download apk file + uses: actions/download-artifact@v7 + with: + name: apk-result + path: apk-result + + - name: Copy apk file to root + run: cp apk-result/*.apk . + + - name: Upload Release Asset (arm32v7) + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.draft_release.outputs.upload_url }} + asset_path: app-armeabi-v7a-release.apk + asset_name: LocalSend-${{ needs.build.outputs.version }}-android-arm32v7.apk + asset_content_type: application/vnd.android.package-archive + + - name: Upload Release Asset (arm64v8) + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.draft_release.outputs.upload_url }} + asset_path: app-arm64-v8a-release.apk + asset_name: LocalSend-${{ needs.build.outputs.version }}-android-arm64v8.apk + asset_content_type: application/vnd.android.package-archive + + - name: Upload Release Asset (x64) + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.draft_release.outputs.upload_url }} + asset_path: app-x86_64-release.apk + asset_name: LocalSend-${{ needs.build.outputs.version }}-android-x64.apk + asset_content_type: application/vnd.android.package-archive + + # TAR.GZ (x86_64) + - name: Download tar.gz file + uses: actions/download-artifact@v7 + with: + name: tar-gz-x86-64-result + path: tar-gz-x86-64-result + + - name: List files in tar.gz-directory + run: ls -l tar-gz-x86-64-result + + - name: Copy tar.gz file to root + run: cp tar-gz-x86-64-result/* result.tar.gz + + - name: Upload Release Asset (tar.gz) + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.draft_release.outputs.upload_url }} + asset_path: result.tar.gz + asset_name: LocalSend-${{ needs.build.outputs.version }}-linux-x86-64.tar.gz + asset_content_type: application/gzip + + # TAR.GZ (arm_64) + - name: Download tar.gz file + uses: actions/download-artifact@v7 + with: + name: tar-gz-arm-64-result + path: tar-gz-arm-64-result + + - name: List files in tar.gz-directory + run: ls -l tar-gz-arm-64-result + + - name: Copy tar.gz file to root + run: cp tar-gz-arm-64-result/* result.tar.gz + + - name: Upload Release Asset (tar.gz) + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.draft_release.outputs.upload_url }} + asset_path: result.tar.gz + asset_name: LocalSend-${{ needs.build.outputs.version }}-linux-arm-64.tar.gz + asset_content_type: application/gzip + + # DEB (x86_64) + - name: Download deb file + uses: actions/download-artifact@v7 + with: + name: deb-x86-64-result + path: deb-x86-64-result + + - name: Copy deb file to root + run: cp deb-x86-64-result/*.deb result.deb + + - name: Upload Release Asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.draft_release.outputs.upload_url }} + asset_path: result.deb + asset_name: LocalSend-${{ needs.build.outputs.version }}-linux-x86-64.deb + asset_content_type: application/vnd.debian.binary-package + + # DEB (arm_64) + - name: Download deb file + uses: actions/download-artifact@v7 + with: + name: deb-arm-64-result + path: deb-arm-64-result + + - name: Copy deb file to root + run: cp deb-arm-64-result/*.deb result.deb + + - name: Upload Release Asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.draft_release.outputs.upload_url }} + asset_path: result.deb + asset_name: LocalSend-${{ needs.build.outputs.version }}-linux-arm-64.deb + asset_content_type: application/vnd.debian.binary-package + + # APPIMAGE (x86_64) + - name: Download AppImage file + uses: actions/download-artifact@v7 + with: + name: appimage-x86-64-result + path: appimage-x86-64-result + + - name: List files in appimage-directory + run: ls -l appimage-x86-64-result + + - name: Copy AppImage file to root + run: | + for file in appimage-x86-64-result/*; do + if [[ $file == *.AppImage && $file != *.AppImage.zsync ]]; then + cp "$file" result.AppImage + fi + done + + - name: Upload Release Asset (AppImage) + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.draft_release.outputs.upload_url }} + asset_path: result.AppImage + asset_name: LocalSend-${{ needs.build.outputs.version }}-linux-x86-64.AppImage + asset_content_type: application/x-appimage + + # WINDOWS ZIP (x86_64) + - name: Download windows zip file + uses: actions/download-artifact@v7 + with: + name: windows-zip-x86-64-result + path: windows-zip-x86-64-result + + - name: Copy zip file to root + run: cp windows-zip-x86-64-result/*.zip result.zip + + - name: Upload Release Asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.draft_release.outputs.upload_url }} + asset_path: result.zip + asset_name: LocalSend-${{ needs.build.outputs.version }}-windows-x86-64.zip + asset_content_type: application/zip diff --git a/.github/workflows/test_arm64_deb.yml b/.github/workflows/test_arm64_deb.yml new file mode 100644 index 0000000..69cb7cd --- /dev/null +++ b/.github/workflows/test_arm64_deb.yml @@ -0,0 +1,75 @@ +name: Build arm64 deb + +on: + workflow_dispatch: + +env: + FLUTTER_VERSION: "3.41.9" + +jobs: + build: + runs-on: ubuntu-22.04 + outputs: + version: ${{ steps.get_version.outputs.version }} + + steps: + - uses: actions/checkout@v6 + + - name: Get version from pubspec.yaml + id: get_version + run: | + VERSION=$(sed -n 's/^version: \([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' app/pubspec.yaml) + echo "version=$VERSION" >> $GITHUB_OUTPUT + + # Manage the Flutter version on the self-hosted runner manually! + # Flutter currently doesn't provide Linux ARM64 binaries. + build_deb_arm_64: + needs: build + runs-on: [self-hosted, linux, arm64] + + steps: + - uses: actions/checkout@v6 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev + + - name: Enable dart_distributor + run: dart pub global activate flutter_distributor + + - name: Build deb package + working-directory: app + run: PATH="$PATH:$HOME/.pub-cache/bin" flutter_distributor package --platform linux --targets deb + + - name: Find deb file + id: find_deb + run: | + VERSION=${{ needs.build.outputs.version }} + DEB_PATH=$(find app/dist -name "localsend_app-$VERSION*-linux.deb") + echo "deb_path=$DEB_PATH" >> $GITHUB_OUTPUT + + - name: Check if deb file exists + id: check_file + run: | + if [[ ! -f "${{ steps.find_deb.outputs.deb_path }}" ]]; then + echo "File not found: ${{ steps.find_deb.outputs.deb_path }}" + exit 1 + fi + + # Remove this when: https://github.com/leanflutter/flutter_distributor/pull/150 is merged + - name: Update Architecture + run: | + mkdir temp + cd temp + ar x ../${{ steps.find_deb.outputs.deb_path }} + tar xJf control.tar.xz --overwrite + sed -i '/Architecture:/c\Architecture: arm64' ./control + tar cJf control.tar.xz control postinst postrm + ar rcs ../${{ steps.find_deb.outputs.deb_path }} debian-binary control.tar.xz data.tar.xz + + - name: Upload deb file + uses: actions/upload-artifact@v6 + with: + name: deb-arm-64-result + path: ${{ steps.find_deb.outputs.deb_path }} diff --git a/.github/workflows/test_arm64_tar.yml b/.github/workflows/test_arm64_tar.yml new file mode 100644 index 0000000..f1fa8ad --- /dev/null +++ b/.github/workflows/test_arm64_tar.yml @@ -0,0 +1,55 @@ +name: Build arm64 tar + +on: + workflow_dispatch: + +env: + FLUTTER_VERSION: "3.41.9" + +jobs: + build: + runs-on: ubuntu-22.04 + outputs: + version: ${{ steps.get_version.outputs.version }} + + steps: + - uses: actions/checkout@v6 + + - name: Get version from pubspec.yaml + id: get_version + run: | + VERSION=$(sed -n 's/^version: \([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' app/pubspec.yaml) + echo "version=$VERSION" >> $GITHUB_OUTPUT + + # Manage the Flutter version on the self-hosted runner manually! + # Flutter currently doesn't provide Linux ARM64 binaries. + build_tar_arm_64: + needs: build + runs-on: [self-hosted, linux, arm64] + + steps: + - uses: actions/checkout@v6 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y clang cmake libgtk-3-dev ninja-build libayatana-appindicator3-dev + + - name: Dependencies + working-directory: app + run: flutter pub get + + - name: Compile linux + working-directory: app + run: flutter build linux + + - name: Create tar.gz archive + run: | + cd app/build/linux/arm64/release/bundle + tar -czvf ../../../../../result.tar.gz * + + - name: Upload tar.gz archive + uses: actions/upload-artifact@v6 + with: + name: tar-gz-arm-64-result + path: ./app/*.tar.gz diff --git a/.github/workflows/test_rpm.yml b/.github/workflows/test_rpm.yml new file mode 100644 index 0000000..afface2 --- /dev/null +++ b/.github/workflows/test_rpm.yml @@ -0,0 +1,81 @@ +name: Build rpm package + +on: + workflow_dispatch: + +env: + FLUTTER_VERSION: "3.41.9" + +jobs: + build: + runs-on: ubuntu-24.04 + outputs: + version: ${{ steps.get_version.outputs.version }} + + steps: + - uses: actions/checkout@v6 + + - name: Get version from pubspec.yaml + id: get_version + run: | + VERSION=$(sed -n 's/^version: \([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' app/pubspec.yaml) + echo "version=$VERSION" >> $GITHUB_OUTPUT + + build_rpm: + runs-on: ubuntu-latest + container: fedora:38 + steps: + - uses: actions/checkout@v6 + + - name: Install dependencies + run: sudo dnf install -y clang cmake gtk3-devel ninja-build libappindicator-gtk3-devel jq findutils which git patchelf rpm-build + + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: "stable" + + - name: Configure safe directory for Git + run: git config --global --add safe.directory "/opt/hostedtoolcache/flutter/stable-${{ env.FLUTTER_VERSION }}-x64" + +# - name: Configure safe directory for Git (pub-cache) +# run: git config --global --add safe.directory "/opt/hostedtoolcache/flutter/stable-${{ env.FLUTTER_VERSION }}-x64/.pub-cache" + + - name: Get flutter path + run: which flutter + + - name: Get dart path + run: which dart + + - name: Enable dart_distributor + run: PUB_CACHE=/opt/hostedtoolcache/flutter/stable-${{ env.FLUTTER_VERSION }}-x64/.pub-cache dart pub global activate flutter_distributor + + - name: Debugging PATH and flutter_distributor + run: | + echo "PATH: $PATH" + command -v flutter_distributor || echo "flutter_distributor not found" + + - name: Build rpm package + working-directory: app + run: FLUTTER_ROOT=/opt/hostedtoolcache/flutter/stable-${{ env.FLUTTER_VERSION }}-x64 flutter_distributor package --platform linux --targets rpm + + - name: Find rpm file + id: find_rpm + run: | + VERSION=${{ needs.build.outputs.version }} + RPM_PATH=$(find app/dist -name "localsend_app-$VERSION*-linux.rpm") + echo "rpm_path=$RPM_PATH" >> $GITHUB_OUTPUT + + - name: Check if rpm file exists + id: check_file + run: | + if [[ ! -f "${{ steps.find_rpm.outputs.rpm_path }}" ]]; then + echo "File not found: ${{ steps.find_rpm.outputs.rpm_path }}" + exit 1 + fi + + - name: Upload rpm file + uses: actions/upload-artifact@v6 + with: + name: rpm-result + path: ${{ steps.find_rpm.outputs.rpm_path }} diff --git a/.github/workflows/test_zip.yml b/.github/workflows/test_zip.yml new file mode 100644 index 0000000..0a38fc3 --- /dev/null +++ b/.github/workflows/test_zip.yml @@ -0,0 +1,67 @@ +name: Build windows zip + +on: + workflow_dispatch: + +env: + FLUTTER_VERSION: "3.41.9" + +jobs: + build: + runs-on: ubuntu-24.04 + outputs: + version: ${{ steps.get_version.outputs.version }} + + steps: + - uses: actions/checkout@v6 + + - name: Get version from pubspec.yaml + id: get_version + run: | + VERSION=$(sed -n 's/^version: \([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' app/pubspec.yaml) + echo "version=$VERSION" >> $GITHUB_OUTPUT + + build_windows_zip: + needs: build + runs-on: windows-latest + + steps: + - name: Fix long file paths + run: git config --system core.longpaths true + + - name: Checkout repository + uses: actions/checkout@v6 + + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: "stable" + + - name: Dependencies + working-directory: app + run: flutter pub get + + - name: Compile for Windows + working-directory: app + run: flutter build windows + + - name: Create empty settings.json + working-directory: app + run: echo {} > build/windows/x64/runner/Release/settings.json + + - name: Add DLL files + working-directory: app + run: | + Copy-Item ../scripts/windows/x64/msvcp140.dll build/windows/x64/runner/Release/ + Copy-Item ../scripts/windows/x64/vcruntime140.dll build/windows/x64/runner/Release/ + Copy-Item ../scripts/windows/x64/vcruntime140_1.dll build/windows/x64/runner/Release/ + + - name: Zip compiled files + working-directory: app + run: Compress-Archive -Path build/windows/x64/runner/Release/* -DestinationPath LocalSend.zip + + - name: Upload zip + uses: actions/upload-artifact@v6 + with: + name: windows-zip-x86-64-result + path: app/LocalSend.zip diff --git a/.github/workflows/winget.yml b/.github/workflows/winget.yml new file mode 100644 index 0000000..bcc2319 --- /dev/null +++ b/.github/workflows/winget.yml @@ -0,0 +1,13 @@ +name: Publish to WinGet +on: + release: + types: [released] + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - uses: vedantmgoyal9/winget-releaser@main + with: + identifier: LocalSend.LocalSend + token: ${{ secrets.WINGET_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f3b2f03 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +.idea + +# Linux AppImage +/app/AppDir +/app/appimage-build + +.refena_inspector/ + +/secrets + +# FVM Version Cache +.fvm/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..5a367a4 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "submodules/flutter"] + path = submodules/flutter + url = https://github.com/flutter/flutter.git diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 120000 index 0000000..614e057 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1 @@ +app/assets/CHANGELOG.md \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..367de8a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,200 @@ +# Contributing to LocalSend + +LocalSend is an open-source project, and we welcome contributions from anyone who is interested in helping improve the app. Whether you're a developer, a translator, or a documentation writer, there are many ways to get involved. + +## Getting Started + +If you're interested in contributing code to LocalSend, you'll need to follow these steps: + +## Run + +After you have installed [Flutter](https://flutter.dev), then you can start this app by typing the following commands: + +```shell +cd app +flutter pub get +dart run build_runner build -d +flutter run +``` + +## Translation + +You can help in translating this app to other languages! + +1. Fork this repository +2. Choose one + - Add missing translations in existing languages: Only update `_missing_translations_.json` in [assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n) + - Fix existing translations: Update `strings_.i18n.json` in [assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n) + - Add new languages: Create a new file, see also: [locale codes](https://saimana.com/list-of-country-locale-code/). +3. Optional: Re-run this app + 1. Run `cd app` to enter the app directory. + 2. Make sure you have [run](#run) this app once. + 3. Update translations via `flutter pub run slang` + 4. Run the app via `flutter run` +4. Open a pull request + +**_Take note:_ Fields decorated with `@` are not meant to be translated, they are not used in the app in any way, being merely informative text about the file or to give context to the translator.** + +Thanks to all [translators](https://github.com/localsend/localsend/tree/main/app/lib/pages/about/translators.dart)! + +## Contributing Guidelines + +Before you submit a pull request to LocalSend, please ensure that you have followed these guidelines: + +- Code should be well-documented and formatted according to the [Dart Style Guide](https://dart.dev/guides/language/effective-dart/style). +- All changes should be covered by tests. +- Commits should be well-written and descriptive, with a clear summary of the changes made and any relevant context. +- Pull requests should target the `main` branch and include a clear summary of the changes made. + +## Bug Reports and Feature Requests + +If you encounter a bug in LocalSend or have a feature request, please submit an issue to the [issue tracker](https://github.com/localsend/localsend/issues). Please be sure to provide a clear description of the problem or feature request, along with any relevant context or steps to reproduce the issue. + +## Security Issues + +If you discover a security issue in LocalSend, please do not submit an issue to the public issue tracker. Instead, please email us directly at [support@localsend.org](mailto:support@localsend.org) so that we can address the issue as quickly and effectively as possible. + +## Distribution + +Git based distribution: + +| Channel | Repository | Maintainer | +|----------------|---------------------|----------------------------------------------------| +| [Winget][] | [Winget Repo][] | [@sitiom][], [@Tienisto], Github Actions | +| [Scoop][] | [Scoop Repo][] | [@sitiom][], [@Tienisto], Github Actions | +| [Chocolatey][] | [Chocolatey Repo][] | [@brogers5][] | +| [Homebrew][] | [Homebrew Repo][] | [@Tienisto][], Github Actions | +| [Flathub][] | [Flathub Repo][] | [@proletarius101][], [@Tienisto][], Github Actions | +| [AUR][] | [AUR Repo][] | [@Nixuge][] | +| [Nixpkgs][] | [Nixpkgs Repo][] | [@sikmir][], [@linsui][] | +| [F-Droid][] | [F-Droid Repo][] | [@linsui][], [@Tienisto][], [F-Droid CI][] | +| [Snap][] | [Snap Repo][] | [@thatLeaflet][] | + +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[winget repo]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[scoop repo]: https://github.com/ScoopInstaller/Extras/blob/master/bucket/localsend.json +[chocolatey]: https://community.chocolatey.org/packages/localsend +[chocolatey repo]: https://github.com/brogers5/chocolatey-package-localsend/tree/main +[homebrew]: https://formulae.brew.sh/cask/localsend +[homebrew repo]: https://github.com/Homebrew/homebrew-cask/blob/master/Casks/l/localsend.rb +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[flathub repo]: https://github.com/flathub/org.localsend.localsend_app +[aur]: https://aur.archlinux.org/packages/localsend-bin +[aur repo]: https://aur.archlinux.org/localsend-bin.git +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[nixpkgs repo]: https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/networking/localsend/default.nix +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[f-droid repo]: https://gitlab.com/fdroid/fdroiddata/-/blob/master/metadata/org.localsend.localsend_app.yml +[snap]: https://snapcraft.io/localsend +[snap repo]: https://github.com/localsend/snap + +Manual distribution: + +| Channel | Maintainer | +|----------------|------------------------------------------| +| [App Store][] | [@Tienisto](https://github.com/Tienisto) | +| [Play Store][] | [@Tienisto](https://github.com/Tienisto) | +| [Amazon][] | [@Tienisto](https://github.com/Tienisto) | + +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 + +Binary distribution: + +| Type | Maintainer | Credits | +|-------------|---------------|------------------------------| +| Windows ZIP | [@Tienisto][] | | +| MSIX | [@Tienisto][] | | +| EXE | [@Tienisto][] | | +| APK | [@Tienisto][] | | +| TAR | [@Tienisto][] | | +| DEB | [@Tienisto][] | | +| AppImage | [@Tienisto][] | [@TheGB0077][] | +| DMG | [@Tienisto][] | | + +[@Tienisto]: https://github.com/Tienisto +[@TheGB0077]: https://github.com/TheGB0077 +[@sitiom]: https://github.com/sitiom +[@Nixuge]: https://github.com/Nixuge +[@proletarius101]: https://github.com/proletarius101 +[@brogers5]: https://github.com/brogers5 +[@sikmir]: https://github.com/sikmir +[@linsui]: https://github.com/linsui +[@thatLeaflet]: https://github.com/thatLeaflet +[F-Droid CI]: https://gitlab.com/fdroidci + +TODO: + +You can help in publishing LocalSend on more platforms. Please create an issue to notify us! + +- Traditional Linux distributions (Debian, Fedora, etc.) +- (Your idea here) + +## Notes + +Useful notes. + +### Compile production APK + +You will need the signing keys to generate an APK. + +Either generate one or use the debug signing options: + +```groovy +// File: android/app/build.gradle +buildTypes { + release { + signingConfig signingConfigs.debug // using debug signing + } +} +``` + +### Bump Flutter + +Suppose we want to update flutter to `3.7.8` (see https://github.com/localsend/localsend/commit/7b95a7a5600db2742a9e05b956d0415d871239d5): + +1. Update flutter from fvm: `fvm use 3.7.8` +2. Update flutter from submodule: + 1. `git submodule update --init` + 2. `cd submodules/flutter` + 3. `git fetch` + 4. `git checkout 3.7.8` + 5. `cd ../..` + 6. `git add submodules/flutter` +3. Update flutter constraints: + 1. In CI: `.github/workflows/ci.yml` + 2. In pubspec: `pubspec.yaml` + +### Release + +Make sure to set up the self-hosted runner to compile arm64 linux binaries. + +To set up the runner, follow the following instructions: + +Install Flutter + +```bash +sudo apt install git +git clone https://github.com/flutter/flutter.git $HOME/flutter +nano $HOME/.bashrc +``` + +Add the following to the end of the file: + +```bash +export PATH="$PATH:$HOME/flutter/bin" +``` + +Restart the terminal. + +```bash +flutter doctor +``` + +Next, follow the instructions to set up the GitHub runner. + +Start the "Release Draft" workflow from the "Actions" tab: https://github.com/localsend/localsend/actions/workflows/release.yml + +Finally, compile binaries not yet supported by the pipeline. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..832acf9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022-2024 Tien Do Nam + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..9b8a631 --- /dev/null +++ b/README.md @@ -0,0 +1,263 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] +[![Translations][translate-badge]][translate-link] +[![Packaging status][packaging-badge]][packaging-link] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml +[translate-badge]: https://hosted.weblate.org/widget/localsend/app/svg-badge.svg +[translate-link]: https://hosted.weblate.org/engage/localsend/ +[packaging-badge]: https://repology.org/badge/tiny-repos/localsend.svg +[packaging-link]: https://repology.org/project/localsend/versions + +[Homepage][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](README.md) • [Español](readme_i18n/README_ES.md) • [فارسی](readme_i18n/README_FA.md) • [Filipino](readme_i18n/README_PH.md) • [Français](readme_i18n/README_FR.md) • [Indonesia](readme_i18n/README_ID.md) • [Italiano](readme_i18n/README_IT.md) • [日本語](readme_i18n/README_JA.md) • [ភាសាខ្មែរ](readme_i18n/README_KM.md) • [한국어](readme_i18n/README_KO.md) • [Polski](readme_i18n/README_PL.md) • [Português Brasil](readme_i18n/README_PT_BR.md) • [Русский](readme_i18n/README_RU.md) • [ภาษาไทย](readme_i18n/README_TH.md) • [Türkçe](readme_i18n/README_TR.md) • [Українська](readme_i18n/README_UK.md) • [Tiếng Việt](readme_i18n/README_VI.md) • [中文](readme_i18n/README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend is a free, open-source app that allows you to securely share files and messages with nearby devices over your local network without needing an internet connection. + +- [About](#about) +- [Sponsors](#sponsors) +- [Screenshots](#screenshots) +- [Download](#download) +- [How It Works](#how-it-works) +- [Getting Started](#getting-started) +- [Contributing](#contributing) + - [Translation](#translation) + - [Bug Fixes and Improvements](#bug-fixes-and-improvements) +- [Troubleshooting](#troubleshooting) +- [Building](#building) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## About + +LocalSend is a cross-platform app that enables secure communication between devices using a REST API and HTTPS encryption. Unlike other messaging apps that rely on external servers, LocalSend doesn't require an internet connection or third-party servers, making it a fast and reliable solution for local communication. + +## Sponsors + +Browser testing via + + + + + +## Screenshots + +iPhone screenshot PC screenshot + +## Download + +[![Packaging status](https://repology.org/badge/tiny-repos/localsend.svg)](https://repology.org/project/localsend/versions) + +It is recommended to download the app either from an app store or from a package manager because the app does not have an auto-update. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +Read more about [distribution channels][]. + +> [!CAUTION] +> **Unofficial MSIX preview:** you can try builds from the latest commits at [localsend.ob-buff.dev](https://localsend.ob-buff.dev/). Stability is not guaranteed and all custom code tweaks are listed on that site. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Compatibility** + +| Platform | Minimum Version | Note | +|----------|-----------------|-----------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Use OpenCore Legacy Patcher 2.0.2 (See [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | The last version to support Windows 7 is v1.15.4. There might be backports of newer versions for Windows 7 in the future. | +| Linux | N.A. | Deps: Gnome: `xdg-desktop-portal` and `xdg-desktop-portal-gtk`, KDE: `xdg-desktop-portal` and `xdg-desktop-portal-kde` | + +## Setup + +In most cases, LocalSend should work out of the box. However, if you are having trouble sending or receiving files, you may need to configure your firewall to allow LocalSend to communicate over your local network. + +| Traffic Type | Protocol | Port | Action | +|--------------|----------|-------|--------| +| Incoming | TCP, UDP | 53317 | Allow | +| Outgoing | TCP, UDP | Any | Allow | + +Also make sure to disable AP isolation on your router. It should be usually disabled by default but some routers may have it enabled (especially guest networks). +See [troubleshooting](#troubleshooting) for more information. + +**Portable Mode** + +(Introduced in v1.13.0) + +Create a file named `settings.json` located in the same directory as the executable. +This file can be empty. +The app will use this file to store settings instead of the default location. + +**Start hidden** + +(Updated in v1.15.0) + +To start the app hidden (only in tray), use the `--hidden` flag (example: `localsend_app.exe --hidden`). + +On v1.14.0 and earlier, the app starts hidden if `autostart` flag is set, and the hidden setting is enabled. + +## How It Works + +LocalSend uses a secure communication protocol that allows devices to communicate with each other using a REST API. All data is sent securely over HTTPS, and the TLS/SSL certificate is generated on the fly on each device, ensuring maximum security. + +For more information on the LocalSend Protocol, see the [documentation](https://github.com/localsend/protocol). + +## Getting Started + +To compile LocalSend from the source code, follow these steps: + +1. Install Flutter [directly](https://flutter.dev) or using [fvm](https://fvm.app) (see [version required](.fvmrc)) +2. Install [Rust](https://www.rust-lang.org/tools/install) +3. Clone the `LocalSend` repository +4. Run `cd app` to enter the app directory +5. Run `flutter pub get` to download dependencies +6. Run `flutter run` to start the app + +> [!NOTE] +> LocalSend currently requires an older Flutter version (specified in [.fvmrc](.fvmrc)) +> and thus build issues may be caused by a mismatch between the required and the (system-wide) installed Flutter version. +> To make development more consistent, LocalSend uses [fvm](https://fvm.app) to manage the project Flutter version. +> After installing `fvm`, run `fvm flutter` instead of `flutter`. + +## Contributing + +We welcome contributions from anyone interested in helping improve LocalSend. If you'd like to contribute, there are a few ways to get involved: + +### Translation + +You can help translate LocalSend into other languages. We use the [Weblate](https://hosted.weblate.org/projects/localsend/app) platform to manage translations. + +Alternatively, you can also contribute by forking this repository and adding translations manually. + +The translations are located in the [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n) directory. Edit the `_missing_translations_.json` or `strings_.i18n.json` file to add or update translations. + + +Translation status + + +**_Take note:_ Fields decorated with `@` are not meant to be translated; they are not used in the app in any way, being merely informative text about the file or to give context to the translator.** + +### Bug Fixes and Improvements + +- **Bug Fixes:** If you find a bug, please create a pull request with a clear description of the issue and how to fix it. +- **Improvements:** Have an idea for how to improve LocalSend? Please create an issue first to discuss why the improvement is needed. + +For more information, see the [contributing guide](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## Troubleshooting + +| Issue | Platform (Sending) | Platform (Receiving) | Solution | +|--------------------|--------------------|----------------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| Device not visible | Any | Any | Make sure to disable AP-Isolation on your router. If it is enabled, connections between devices are forbidden. | +| Device not visible | Any | Windows | Make sure to configure your network as a "private" network. Windows might be more restrictive when the network is configured as public. | +| Device not visible | macOS, iOS | Any | You can try to toggle the "Local Network" permission under "Privacy" in the OS settings. | +| Speed too slow | Any | Any | Use 5 Ghz; Disable encryption on both devices | +| Speed too slow | Any | Android | Known issue. https://github.com/flutter-cavalry/saf_stream/issues/4 | + +## Building + +These commands are intended for maintainers only. Make sure to run them from the `app` directory. + +### Android + +Traditional APK + +```bash +flutter build apk +``` + +AppBundle for Google Play + +```bash +flutter build appbundle +``` + +### iOS + +```bash +flutter build ipa +``` + +### macOS + +```bash +flutter build macos +``` + +### Windows + +**Traditional** + +```bash +flutter build windows +``` + +**Local MSIX App** + +```bash +flutter pub run msix:create +``` + +**Store ready** + +```bash +flutter pub run msix:create --store +``` + +### Linux + +**Traditional** + +```bash +flutter build linux +``` + +**AppImage** + +```bash +appimage-builder --recipe AppImageBuilder.yml +``` + +**Snap** + +Instructions in [localsend/snap/README.md](https://github.com/localsend/snap/blob/main/README.md) + +## Contributors + + + Localsend Contributors + diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..124ccc5 --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`localsend/localsend` +- 原始仓库:https://github.com/localsend/localsend +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..b04574f --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,47 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ +/dist/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/app/analysis_options.yaml b/app/analysis_options.yaml new file mode 100644 index 0000000..8ee1c18 --- /dev/null +++ b/app/analysis_options.yaml @@ -0,0 +1,33 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +analyzer: + plugins: + - custom_lint + exclude: + - lib/**.g.dart + - lib/**.freezed.dart + - submodules/** + +formatter: + trailing_commas: preserve + page_width: 150 + +linter: + rules: + use_key_in_widget_constructors: false + + prefer_single_quotes: true + sort_pub_dependencies: true + always_use_package_imports: true + directives_ordering: true + unawaited_futures: true + discarded_futures: true diff --git a/app/android/.gitignore b/app/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/app/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/app/android/app/build.gradle b/app/android/app/build.gradle new file mode 100644 index 0000000..895c78a --- /dev/null +++ b/app/android/app/build.gradle @@ -0,0 +1,102 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +android { + namespace "org.localsend.localsend_app" + compileSdkVersion 36 + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = '17' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "org.localsend.localsend_app" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion 36 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + signingConfigs { + release { + def keystoreProperties = new Properties() + def keystorePropertiesFile = rootProject.file('key.properties') + if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + } + + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + + buildTypes { + release { + signingConfig signingConfigs.release + } + debug { + applicationIdSuffix ".debug" + } + } + + // Required by F-Droid + dependenciesInfo { + // Disables dependency metadata when building APKs. + includeInApk = false + // Disables dependency metadata when building Android App Bundles. + includeInBundle = false + } +} + +flutter { + source '../..' +} + +// To comply with F-Droid version code schema +// https://github.com/localsend/localsend/issues/1534 +ext.abiCodes = ["x86_64": 1, "armeabi-v7a": 2, "arm64-v8a": 3] +import com.android.build.OutputFile +android.applicationVariants.all { variant -> + variant.outputs.each { output -> + def abiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI)) + if (abiVersionCode != null) { + output.versionCodeOverride = variant.versionCode * 10 + abiVersionCode + } + } +} diff --git a/app/android/app/src/debug/AndroidManifest.xml b/app/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..e1933de --- /dev/null +++ b/app/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..baa30b3 --- /dev/null +++ b/app/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/android/app/src/main/ic_launcher-playstore.png b/app/android/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..f4349829a12034daa6df73a1baf63d0a6cc043e5 GIT binary patch literal 22574 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 literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/kotlin/org/localsend/localsend_app/FastDocumentFile.kt b/app/android/app/src/main/kotlin/org/localsend/localsend_app/FastDocumentFile.kt new file mode 100644 index 0000000..b8d1454 --- /dev/null +++ b/app/android/app/src/main/kotlin/org/localsend/localsend_app/FastDocumentFile.kt @@ -0,0 +1,141 @@ +package org.localsend.localsend_app + +import android.content.ContentResolver +import android.content.Context +import android.database.Cursor +import android.net.Uri +import android.provider.DocumentsContract +import android.util.Log + +const val MIME_TYPE_DIR = "vnd.android.document/directory" + +/** + * Similar to AndroidX/DocumentFile, but faster by querying all fields at once. + */ +class FastDocumentFile( + private val context: Context, + private val mime: String, + val uri: Uri, + val name: String, + val size: Long, + val lastModified: Long, +) { + val isDirectory: Boolean = mime == MIME_TYPE_DIR + val isFile: Boolean = !isDirectory && mime.isNotBlank() + + fun listFiles(): List { + val resolver: ContentResolver = context.contentResolver + val childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree( + uri, + DocumentsContract.getDocumentId(uri) + ) + + val results = mutableListOf() + + var cursor: Cursor? = null + try { + cursor = resolver.query( + childrenUri, + arrayOf( + DocumentsContract.Document.COLUMN_MIME_TYPE, + DocumentsContract.Document.COLUMN_DOCUMENT_ID, + DocumentsContract.Document.COLUMN_DISPLAY_NAME, + DocumentsContract.Document.COLUMN_SIZE, + DocumentsContract.Document.COLUMN_LAST_MODIFIED, + ), + null, + null, + null + ) + while (cursor!!.moveToNext()) { + results.add( + FastDocumentFile( + context = context, + mime = cursor.getString(0), + uri = DocumentsContract.buildDocumentUriUsingTree( + uri, + cursor.getString(1) + ), + name = cursor.getString(2), + size = cursor.getLong(3), + lastModified = cursor.getLong(4) + ) + ) + } + } catch (e: Exception) { + Log.w(TAG, "Error: $e") + } finally { + try { + cursor?.close() + } catch (_: Exception) {} + } + return results + } + + companion object { + const val TAG = "FastDocumentFile" + + /** + * Create a FastDocumentFile from a tree Uri. + */ + fun fromTreeUri(context: Context, treeUri: Uri): FastDocumentFile { + val documentId = when { + DocumentsContract.isDocumentUri( + context, + treeUri + ) -> DocumentsContract.getDocumentId(treeUri) + else -> DocumentsContract.getTreeDocumentId(treeUri) + } + + return FastDocumentFile( + context = context, + mime = "", + uri = DocumentsContract.buildDocumentUriUsingTree( + treeUri, + documentId, + ), + name = "", + size = 0, + lastModified = 0, + ) + } + + fun fromDocumentUri(context: Context, documentUri: Uri): FastDocumentFile? { + var cursor: Cursor? = null + try { + cursor = context.contentResolver.query( + documentUri, + arrayOf( + DocumentsContract.Document.COLUMN_MIME_TYPE, + DocumentsContract.Document.COLUMN_DISPLAY_NAME, + DocumentsContract.Document.COLUMN_SIZE, + DocumentsContract.Document.COLUMN_LAST_MODIFIED, + ), + null, + null, + null + ) + + return if (cursor != null && cursor.moveToFirst()) { + FastDocumentFile( + context = context, + mime = cursor.getString(0), + uri = documentUri, + name = cursor.getString(1), + size = cursor.getLong(2), + lastModified = cursor.getLong(3), + ) + } else { + null + } + } catch (e: Exception) { + Log.w(TAG, "Error: $e") + return null + } finally { + try { + cursor?.close() + } catch (_: Exception) {} + } + } + } +} diff --git a/app/android/app/src/main/kotlin/org/localsend/localsend_app/FileOpener.kt b/app/android/app/src/main/kotlin/org/localsend/localsend_app/FileOpener.kt new file mode 100644 index 0000000..d40b974 --- /dev/null +++ b/app/android/app/src/main/kotlin/org/localsend/localsend_app/FileOpener.kt @@ -0,0 +1,93 @@ +package org.localsend.localsend_app + +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.provider.DocumentsContract +import java.util.Locale + +fun openUri(context: Context, uriStr: String) { + val uri = Uri.parse(uriStr) + val intent = Intent(Intent.ACTION_VIEW, uri) + val type = getFileType(uriStr) + + println("Inferred type: $type") + + intent.setDataAndType(uri, type) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + context.startActivity(intent) +} + +private fun getFileType(filePath: String): String { + val fileExt = filePath.substring(filePath.lastIndexOf(".") + 1).lowercase(Locale.ROOT) + println("File extension: $fileExt") + return when (fileExt) { + "3gp" -> "video/3gpp" + "torrent" -> "application/x-bittorrent" + "kml" -> "application/vnd.google-earth.kml+xml" + "gpx" -> "application/gpx+xml" + "apk" -> "application/vnd.android.package-archive" + "asf" -> "video/x-ms-asf" + "avi" -> "video/x-msvideo" + "bin", "class", "exe" -> "application/octet-stream" + "bmp" -> "image/bmp" + "c" -> "text/plain" + "conf" -> "text/plain" + "cpp" -> "text/plain" + "doc" -> "application/msword" + "docx" -> "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + "xls", "csv" -> "application/vnd.ms-excel" + "xlsx" -> "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + "gif" -> "image/gif" + "gtar" -> "application/x-gtar" + "gz" -> "application/x-gzip" + "h" -> "text/plain" + "htm" -> "text/html" + "html" -> "text/html" + "jar" -> "application/java-archive" + "java" -> "text/plain" + "jpeg" -> "image/jpeg" + "jpg" -> "image/jpeg" + "js" -> "application/x-javascript" + "log" -> "text/plain" + "m3u" -> "audio/x-mpegurl" + "m4a" -> "audio/mp4a-latm" + "m4b" -> "audio/mp4a-latm" + "m4p" -> "audio/mp4a-latm" + "m4u" -> "video/vnd.mpegurl" + "m4v" -> "video/x-m4v" + "mov" -> "video/quicktime" + "mp2" -> "audio/x-mpeg" + "mp3" -> "audio/x-mpeg" + "mp4" -> "video/mp4" + "mpc" -> "application/vnd.mpohun.certificate" + "mpe" -> "video/mpeg" + "mpeg" -> "video/mpeg" + "mpg" -> "video/mpeg" + "mpg4" -> "video/mp4" + "mpga" -> "audio/mpeg" + "msg" -> "application/vnd.ms-outlook" + "ogg" -> "audio/ogg" + "pdf" -> "application/pdf" + "png" -> "image/png" + "pps" -> "application/vnd.ms-powerpoint" + "ppt" -> "application/vnd.ms-powerpoint" + "pptx" -> "application/vnd.openxmlformats-officedocument.presentationml.presentation" + "prop" -> "text/plain" + "rc" -> "text/plain" + "rmvb" -> "audio/x-pn-realaudio" + "rtf" -> "application/rtf" + "sh" -> "text/plain" + "tar" -> "application/x-tar" + "tgz" -> "application/x-compressed" + "txt" -> "text/plain" + "wav" -> "audio/x-wav" + "wma" -> "audio/x-ms-wma" + "wmv" -> "audio/x-ms-wmv" + "wps" -> "application/vnd.ms-works" + "xml" -> "text/plain" + "z" -> "application/x-compress" + "zip" -> "application/x-zip-compressed" + else -> DocumentsContract.Document.MIME_TYPE_DIR + } +} diff --git a/app/android/app/src/main/kotlin/org/localsend/localsend_app/MainActivity.kt b/app/android/app/src/main/kotlin/org/localsend/localsend_app/MainActivity.kt new file mode 100644 index 0000000..042bd51 --- /dev/null +++ b/app/android/app/src/main/kotlin/org/localsend/localsend_app/MainActivity.kt @@ -0,0 +1,302 @@ +package org.localsend.localsend_app + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.database.Cursor +import android.net.Uri +import android.provider.DocumentsContract +import android.provider.Settings +import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + + +private const val CHANNEL = "org.localsend.localsend_app/localsend" +private const val REQUEST_CODE_PICK_DIRECTORY = 1 +private const val REQUEST_CODE_PICK_DIRECTORY_PATH = 2 +private const val REQUEST_CODE_PICK_FILE = 3 + +class MainActivity : FlutterActivity() { + private var pendingResult: MethodChannel.Result? = null + + // Overriding the static methods we need from the Java class, as described + // in the documentation of `FlutterActivity.NewEngineIntentBuilder` + companion object { + fun withNewEngine(): NewEngineIntentBuilder { + return NewEngineIntentBuilder(MainActivity::class.java) + } + + fun createDefaultIntent(launchContext: Context): Intent { + return withNewEngine().build(launchContext) + } + } + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + super.configureFlutterEngine(flutterEngine) + MethodChannel( + flutterEngine.dartExecutor.binaryMessenger, + CHANNEL + ).setMethodCallHandler { call, result -> + when (call.method) { + "pickDirectory" -> { + pendingResult = result + openDirectoryPicker(onlyPath = false) + } + + "pickFiles" -> { + pendingResult = result + openFilePicker() + } + + "pickDirectoryPath" -> { + pendingResult = result + openDirectoryPicker(onlyPath = true) + } + + "createDirectory" -> handleCreateDirectory(call, result) + + "openContentUri" -> { + openUri(context, call.argument("uri")!!) + result.success(null) + } + + "openGallery" -> { + openGallery() + result.success(null) + } + + "isAnimationsEnabled" -> { + result.success(isAnimationsEnabled()) + } + + else -> result.notImplemented() + } + } + } + + private fun isAnimationsEnabled() : Boolean { + return Settings.Global.getFloat(this.getContentResolver(), + Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f) != 0.0f; + } + + private fun openDirectoryPicker(onlyPath: Boolean) { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) + startActivityForResult( + intent, + if (onlyPath) REQUEST_CODE_PICK_DIRECTORY_PATH else REQUEST_CODE_PICK_DIRECTORY + ) + } + + private fun openFilePicker() { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) + putExtra("multi-pick", true) + type = "*/*" + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) + } + startActivityForResult(intent, REQUEST_CODE_PICK_FILE) + } + + @SuppressLint("WrongConstant") + @Override + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_CANCELED) { + pendingResult?.error("CANCELED", "Canceled", null) + pendingResult = null + return + } + + if (resultCode != Activity.RESULT_OK || data == null) { + pendingResult?.error("Error $resultCode", "Failed to access directory or file", null) + pendingResult = null + return + } + + when (requestCode) { + REQUEST_CODE_PICK_DIRECTORY -> { + val uri: Uri? = data.data + val takeFlags: Int = + data.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + if (uri != null) { + contentResolver.takePersistableUriPermission(uri, takeFlags) + + val files = mutableListOf() + listFiles(uri, files) + val resultData = PickDirectoryResult(uri.toString(), files) + pendingResult?.success(resultData.toMap()) + pendingResult = null + } else { + pendingResult?.error("Error", "Failed to access directory", null) + pendingResult = null + } + } + + REQUEST_CODE_PICK_DIRECTORY_PATH -> { + val uri: Uri? = data.data + val takeFlags: Int = + data.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + if (uri != null) { + contentResolver.takePersistableUriPermission(uri, takeFlags) + pendingResult?.success(uri.toString()) + pendingResult = null + } else { + pendingResult?.error("Error", "Failed to access directory", null) + pendingResult = null + } + } + + REQUEST_CODE_PICK_FILE -> { + val uriList: List = when { + data.clipData != null -> { + val clipData = data.clipData + val uris = mutableListOf() + for (i in 0 until clipData!!.itemCount) { + uris.add(clipData.getItemAt(i).uri) + } + uris + } + + data.data != null -> listOf(data.data!!) + else -> { + pendingResult?.error("Error", "Failed to access file", null) + return + } + } + + val takeFlags: Int = + data.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + + val resultList = mutableListOf() + for (uri in uriList) { + contentResolver.takePersistableUriPermission(uri, takeFlags) + val documentFile = FastDocumentFile.fromDocumentUri(this, uri) + if (documentFile == null) { + pendingResult?.error("Error", "Failed to access file", null) + return + } + resultList.add( + FileInfo( + name = documentFile.name, + size = documentFile.size, + uri = uri.toString(), + lastModified = documentFile.lastModified, + ) + ) + } + + pendingResult?.success(resultList.map { it.toMap() }) + pendingResult = null + } + } + } + + private fun listFiles(uri: Uri, files: MutableList) { + val pickedDir: FastDocumentFile = FastDocumentFile.fromTreeUri(this, uri) + + for (file in pickedDir.listFiles()) { + if (file.isDirectory) { + // Recursive call + listFiles(file.uri, files) + } else if (file.isFile) { + files.add( + FileInfo( + name = file.name, + size = file.size, + uri = file.uri.toString(), + lastModified = file.lastModified, + ), + ) + } + } + } + + @SuppressLint("WrongConstant") + private fun handleCreateDirectory(call: MethodCall, result: MethodChannel.Result) { + val documentUri = Uri.parse(call.argument("documentUri")!!) + val directoryName = call.argument("directoryName")!! + + if (folderExists(documentUri, directoryName)) { + result.success(null) + return + } + + DocumentsContract.createDocument( + context.contentResolver, documentUri, DocumentsContract.Document.MIME_TYPE_DIR, + directoryName + ) + + result.success(null) + } + + private fun folderExists(documentUri: Uri, folderName: String): Boolean { + var cursor: Cursor? = null + try { + val childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(documentUri, DocumentsContract.getDocumentId(documentUri)) + cursor = contentResolver.query( + childrenUri, + arrayOf( + DocumentsContract.Document.COLUMN_DISPLAY_NAME, + DocumentsContract.Document.COLUMN_MIME_TYPE + ), + null, + null, + null, + ) + + if (cursor != null) { + while (cursor.moveToNext()) { + val displayName = cursor.getString(0) + val mimeType = cursor.getString(1) + + if (folderName == displayName && DocumentsContract.Document.MIME_TYPE_DIR == mimeType) { + return true + } + } + } + } finally { + cursor?.close() + } + return false + } + + private fun openGallery() { + val intent = Intent() + intent.action = Intent.ACTION_VIEW + intent.type = "image/*" + startActivity(intent) + } +} + +data class PickDirectoryResult( + val directoryUri: String, + val files: List, +) { + fun toMap(): Map { + return mapOf( + "directoryUri" to directoryUri, + "files" to files.map { it.toMap() } + ) + } +} + +data class FileInfo( + val name: String, + val size: Long, + val uri: String, + val lastModified: Long +) { + fun toMap(): Map { + return mapOf( + "name" to name, + "size" to size, + "uri" to uri, + "lastModified" to lastModified + ) + } +} diff --git a/app/android/app/src/main/kotlin/org/localsend/localsend_app/QuickTileService.kt b/app/android/app/src/main/kotlin/org/localsend/localsend_app/QuickTileService.kt new file mode 100644 index 0000000..cd2009c --- /dev/null +++ b/app/android/app/src/main/kotlin/org/localsend/localsend_app/QuickTileService.kt @@ -0,0 +1,101 @@ +package org.localsend.localsend_app + +import android.annotation.SuppressLint +import android.app.ActivityManager +import android.app.PendingIntent +import android.content.Intent +import android.graphics.drawable.Icon +import android.os.Build +import android.service.quicksettings.TileService +import android.util.Log +import androidx.annotation.RequiresApi + +/** + * Service used to launch the app as a quick tile from the top/status bar + * @see https://dev.to/djsmk123/fluttercreate-custom-quick-title-android-only-3ehp + * @see https://github.com/ProtonVPN/android-app/blob/2290b3c6b8b5ded339d69ec7c12e15acbb4b4b3d/app/src/main/java/com/protonvpn/android/components/QuickTileService.kt#L171 + */ +@RequiresApi(Build.VERSION_CODES.N) +class QuickTileService : TileService() { + override fun onClick() { + super.onClick() + + launchApp() + } + + + + override fun onStartListening() { + super.onStartListening() + setupIcon() + } + + private fun setupIcon() { + // The tile is only available between `onStartListening` and + // `onStopListening`, so we ensure the tile is available + if (qsTile == null) { + return + } + + qsTile.icon = + Icon.createWithResource(this, R.mipmap.ic_launcher_quicktile_foreground) + qsTile.label = packageManager.getApplicationLabel(application.applicationInfo) + qsTile.updateTile() + } + + @SuppressLint("StartActivityAndCollapseDeprecated") + private fun launchApp() { + try{ + val launchIntent = getLaunchIntent() + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + // Starting from `Build.VERSION_CODES.UPSIDE_DOWN_CAKE` we can + // no longer start and collapse an Intent. We need to use a + // PendingIntent instead. + // + // The request code can be used to identify the pending intent + // request if needed. We don't, hence the 0. + // + // The launch intent used for the tile doesn't need any data + // thus we mark it as immutable to ensure maximal reuse. + startActivityAndCollapse( + PendingIntent.getActivity(this, 0, launchIntent, + PendingIntent.FLAG_IMMUTABLE) + ) + } else { + // For any version below `Build.VERSION_CODES.UPSIDE_DOWN_CAKE` + // we can simply start the intent directly. + startActivityAndCollapse(launchIntent) + } + } + catch (e:Exception){ + Log.w(this.javaClass.toString(),"Exception $e") + } + } + + private fun getLaunchIntent(): Intent { + // Getting the launch intent from the package manager is the optimal + // way to get the proper intent to launch the app. + val cleanIntent = packageManager.getLaunchIntentForPackage(packageName) + + return if (cleanIntent != null) { + cleanIntent + } else { + // If we can't get the launch intent from the PM, then we default + // back to creating one by instantiating the app intent ourself. + val dirtyIntent = MainActivity.createDefaultIntent(this) + dirtyIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + dirtyIntent + } + } + + private fun appIsAlreadyRunning(): Boolean { + val info = ActivityManager.RunningAppProcessInfo() + ActivityManager.getMyMemoryState(info) + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + info.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED + } else { + info.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND + } + } +} \ No newline at end of file diff --git a/app/android/app/src/main/res/drawable-v21/launch_background.xml b/app/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/app/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/app/android/app/src/main/res/drawable/banner.png b/app/android/app/src/main/res/drawable/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..0584510fb267de29142695ac6fc5750cde8ef621 GIT binary patch literal 8472 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 ACjbBd literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..ca988cf --- /dev/null +++ b/app/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,26 @@ + + + + + + + diff --git a/app/android/app/src/main/res/drawable/launch_background.xml b/app/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/app/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..4df90c3 --- /dev/null +++ b/app/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d480834f753414fd7aa05a8a94405c38974fd906 GIT binary patch literal 4080 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 iobw&Oan02z`Zfe-HvZsRp0000is0+BOk zg2?V}5ZT!YBHP;;>gz!aAObR)n;Dv#KnTc%lZ}l~S)d?<4J3hzk=Z~l+#HB$5Ch?C z2m`A!xD=XVI2U3vCJ9u4Y$=%iVfCXbpsxc;g8YIR7@3$^Sh=`)c=-gyKa;FJG-XLoIQ8RvUM9bZ`rzS_u(U_&s@B8<>u|X_nyCa z_2%QJFW-Ls{`2=={x0G53=GWno-U3d6}R5rZVys&6k)xvTH(=**y1A%mWhXC+zl1( z{Qo~|?L58g*$QS`jhTDj*BrW1QuW@BL$O7`2|@gEi|uq-#Qj#&cH^evvd>@Ql3xCO z`79?rRjIe^()QY~C$o;Oerva-cggvxKPtD5OTCVCmiBxWsXgE2wC)A)ofCuf3AiooW3 z%v#kOHo8AuAYLf7D=mTBY@5UmIj5RqwON}t7x4w>Z zdDC#Kwf$Lz_!T~ZwLDwB`OkjRTbU}b^dJ*6KXb;t1I)~=jxH~zG+qz9^6+d5|M~p) zdFS~z8_T_ts7-w!axpStfknU6N}qqt|7)HYYhIb5Z?vJ|#FG^^ehX(!uT9)KeNB5- zaDPZqhtKyf$L?Lr;a{cuYt8X^m#y<|uHD=FGVjP5`{VDQ{JO~J_U`B2--%o9%}+P` z^oM<|*`G7V=DA;p`uqLQ$y)m;t>g2b3QXRolBIj;m{OMNZ-HI8^}3x}^ZcdvwQHR; zt(RW7Tj{fA$f-+yVpD@EKXD~`i+jFX?DVR&EG}rp2LDgSy%T&Vq*U@OySXo7|^~x0Y;bn(#KjvgzRO1#9{F+myAeIc`c$O_oT@$Y*O4)=KBN$vgEf z+v}TkzVCx}I-Z!fV$IlF*0qa|hSuLAQWqbZaNJ_hLSnb)z!DGJWQlEm#+~C(`3z8o=+<#iX zJG?mT?rOjHjJqy)mM)Ng>lA*!HK&D{Q`mU9@%3evvf`Kg^iqz+c--4LA-+VB^_A1K zZFx#REoQkCxj)}E*W>tZljH{nmbl%moPJ*8S*%rM)`{Mm+NkN?;*I|5r79BFXTAIh PDxExC{an^LB{Ts5Nk}F4 literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png b/app/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..e2ab9bc9fe8b69861b3758b362cbf04f2a866f55 GIT binary patch literal 1722 zcmaJ>dpy$%AO5+NdrnLwrdOiE+gzKu&vh{~$sy)83{5z*WgK*hD2x&&c5qk;o1AHG zGc_kWayit=W$9)wQ%3HUT+Ys)=a2LL@qM1p^L#(g_w)Vhx#8>Mp`xg*2mpWz!qe4H z!oU1I^0E?){r090bm~w;p*(4Dp;hU zVnN^Q@Ew^7Wd=;7lN(wAZ23;FKJ9_Vx%l*keT8S9=&<>3yeKwgGf<1Y=cR*oIic~Y zC+YBb)$4~C`<#{i_MSSPKy1_?E~i0)LP?i5hnIF^-Wq((oHOs^?(FW0Ib@4ZJ!B=g z{C~2)`&Z!gb&VcK-5HefHBekUYih)D*VIccb|A5?4dWwaY;JO*%S3ijcWtLkFzctdLa*5yZqQEiS8djvj!TB(+kWYX-?LCRxW}_1}}B zw`gk+1DsZipDIj?K92~$g@&EtR$!|vBH#)yV4r5veWb&d38g62q_Ul6(Lq$|z>!0- zbtPbSD^0(>lNWZLyJ4gL_&oQ0^-;4&RB2Ye=ufiC%eDNwED&6dYE3J!(OA1(yL#N? za=}Qz{+ELB&hmvS0wqj4zWaix!za<}*u}%S#!E7&!;RIA9YuCJu<-OPukU&Egu5h{ z9n!tQb=(J4-8R!54l^~yHUck{U5mC3ZMkO&W6?T1WqSBdX;@9{^6_j>CX^thrAv&LIIEbg@_`nIEQzN{# zbMnP4&?8E<>SNIEXWDnt9|S~|n?_Ic2a)JFlh+6G^lU!p>9zX{@*z456Ee?lmTuybnMZ_Z@=EBuCz%bSuoL;0@TzquS}uQT+giBR|@0C z%j(sHs{!q_(_gc}Kd&11`g)rQlt+8S9AsDF3thpA_+fdsN=D+E1+iH~qE6q

9@F2iF2DyL zCZxJkBThK$uMvlPRuU`}F7>|BioAYnRN*WSbnu}1n_N~zpX9P~x|nF<<5!_bJL-s` z8;zq;o(S;r$EncNO!nB*ACyvZd~O#B=`}ZX8qmz}DqfzT=ek^#jRQZyg{{YN3={xS%*3%dJPB<2ykklixEjNIPdwY*y@kU0J5S4LyH z{JgBp&7uxVcMfwQe;b@`||R%jncwaPTR{QbQ_cqC7XVHcj$!8%r;1w!)hp zSAjF%w3sN5>-D#vG#X?0wqw19lZU6xLz>K94{SXB5*bh!8t4!vnz(4NMwbi$hKk8S${D70pRHEQ;so;WLE+2?*Z zPNOAX=0fd&JVPVqY5>Ecw!N9o4R6S(ZFXBqzyvZd*{cp7XOXd+hBO(#m+ zP~10_Yd>Prb~EA|IQ3Ti3FUF>e3kSR<~5X$Wn2SD21X)us`+2_lC*|Km)dqKhrS{Or|4&`Q^IneZc~X5H z(IU8!q~MRIxCN#}MWjT-us=jg2r!43TbM#DO(Ev~X67(6E10E)F$4;OKvqVorT-B~ bNQ{b$A^&^eN{JCy5&#fxKCVo7_|?AvGGQPu literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-hdpi/ic_launcher_quicktile_foreground.png b/app/android/app/src/main/res/mipmap-hdpi/ic_launcher_quicktile_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..511a86105dd7295115e0ecc5f4ceea86802bef7c GIT binary patch literal 3301 zcma)A`&+`5J;%ux;&+wn)=iuNtV|EvK z|9C9=yYX@#_wAeF=Q%h8D$IaJ51xC_sRpm576GK-=tqCb6^$&&yb(F|pd4IimZI?E zMGRQw<+MA0Qd!yksH878QANL9vGg*IIxno~^}F#`LqD&s%?rX#*&5FoFeH(PQXFRK z`ruJCgIc0Sn2uIk;L?h-5Zp zl14Kv9$lW_p?RpEuBvrM-Pi*w_Cdp%s(@3ocKPcaYx<5sG{mD?YGfpCZ1=lI8|qf~ zxDC$~<`uOpeGfH5MIL77=8~9_16DI&qUXpvyVC5YrfbXBGjh=%H^BRkR-&%lK|Fh$ zcQl`1x-B`d(-qd99y*dzNTs({ur-^MyL)ZIshKrM`qsxfshBS!j6%5+ zGZo|Ys22o=Sg{?0bKp)^qdfPv&<1-O-_o)zSs~LoJKGoeiv`=yBNxv=>#;MkeRkGv zDo0kV>(=8exF$NRk$Re3?B4hWUtp20n%me=yX7sA2ZEnuZNKU`L)EOR>ra;nfN5iO z%%1LfI#%vK@XTNMhI2#>?WDL;W)MKnVP)>0-OqKrZM0CYcUl1SaVXRnu|MJ1ww`G6 z-Q=6Usu;u4RmQDpM?<&FmPdEX8ORjr;;iCy|+Y<3xWVxb>s7!f>P?dYc z{eFB+!fYg4o`i??j(AMt7uV2;u}67vTVKA2{-H_}se&{pef?CYQZ%vhYzTZy$2VAR z=&7xmwOd6FxyHWw{P8;50QPX8vkn&o0#PJ3Qi(6A9{=r@7GAt&)l!7aCp0t%xI zKDROvOL(hPtVgh*X!9KqMj!13HiBoaSuD*I8KG`k2Cc0%mn(7S z2(8ubXjWCca<~^Y8JshsKW!HAy>M2S(~e{5LFUjGL5C?Fucre%Uaw$FNPpkyh)P=+J)^ zHyUIhp}1)P-|YJ07QuK(?QrhFnMC&jX1 z&qd{3cUT+Qw0IC7l)fMHQvap+cCK~>Ai3y0$$k0R!`t<>kw<=e*~p|yXJYxKr{=Si zgRUhZ%k=@egLug7bZNA?!UC$~D748%?(^<*Qk3qCMyio89m9R@0f6M$)8w7S+K`s7 zB+~<9FUeqfr`S9^y^3YLEq&~TS*45e_bBycWlKMNpMt4LTLly{|7s$*$~V5p@s3o% zq^ohKaUez9xW)#r)d5#;MB*QXX;*=o%btE>c<*>HwgRYAzWY48iwPQtJqocqVsrBEe1_L0r9hT{s*B zT&+;g%lw~YuX12B=r~DHh-x6#_b%E>HBcp4LP#wj*SJ*;mLdkLzs4wSy_xG;jVLdk|RYvJs=IgpYBc=4-LkE@JB|u8lRtJJcr)wk9BaUYt ziP1SNdhh+;>Q_GvoAY_R0R)X0p7{e^;r@c$>qE05irPO7nPHs(kozAYsaVSQu8Bng z(9FKeonxIF?7B6t8Z(($eqgV`ssi2oX$VYt41Os_LXL7`n=L>yrVEjkL7vLBAcqXT zo~Col@&Wt}KGB(SP#=#0o9lM(LqUNCwe3<^m^o;w0kj0F8&dLFccWyGn~!Jvb(VPH z?ZRA4Fmte_?{(|%{O0}R{J~GAuK?!1ql?FmPoa(Y2s3DJ zmDmkSHxyy1Vrlf>H$n!--UUPn{=UTl;9b5-1p(qT^ky!u_>68hWlHxD3Mu1f8ytH+ z-&Pez;x8{G%{9|P(i~^YDqOa3d@!gb=`mrtkuNCjqT{e7-tbg)niQn(2P2_< zBH*dwDBEk+UnWFJ+g&7e?q(IaS=PbDS|Ro-)qaV82iPPGHAo^)R;Q)H4`C}?9q zU@1KQd+eDa@hLHpo|-4AIhc59nPdDpDgbvseR!|GFw zg7G_vERy_&-p6pgJ-dDvtBtpt-g%D$wO}xhcmwH?O%i~9kD@1f!17@hrx8!N#WMmA zMwfG7mGNOiE@w=RjVyqryK%sDvlXG$bt9{P2{PZqs^^1ywFOL$9nfD-I;(INA@kAj zjl*i@GC2)K=%WGZ_Jc93Ts6Y7mday`_=I$ga0Y$jRO=e0S#?>45_m2xaR?qIyU3EG@G~C6JgZ#ZI3bS zihoey9~9uS>>x;lRJ&N)tL2tMvtC6OqK>ojTmxn22Uwvq*f^;*U!%KC7yGP?agu3i2(-upH;f3Tq^#iF>JruAh>9{X;N95 zs~;C<$jo$_0DT+TF4ie~S$!8U+CZ2z||}5~l)gGegtj?~+x#L~;*g4s%tTKUvAa>#gh6c2@-pd~i(c}0I5moFS<##X?}+Yev-7i!|F>;M1& literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7f64cc3aec6003ca51a649a34af3eac210d272b5 GIT binary patch literal 2120 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 literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png b/app/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..75e90f779356d447de881b1124eee092084cde67 GIT binary patch literal 1218 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz0wh)Q=eq$ZmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^> z;_2(k{+xwLgkO7wIO8V<2If}?9OdgVbdoWe&VsbS8n7i=-O!-7LnK+ zE8?2=qNFCf!zMYfJ#M~AexSy(t+QO3%NZ_fh-_AA=6)8HFt08087qV4+I4px++BIp zdzvJlUzEX;o7>;dOP{xP{>^RdOBPRiq;lBadQ0f^b=P`WR&V=jZxncX<)n2JO%t9Z zFL1lHG-GQb-e3onf`{Mm<&uecB?4(MZ)H&^L?Yq`o<21|Qb%t*JCap_; z(Qnt?N#r8 znP}+Mx5;d-*5u?ZeMes=tGs`n|NVNBbBf2uxpPi0;QqTOaZlq{ru8?Ae%d&;{g#=O zd^o&B{K%B#6YI*~8jF_Bh^stW7#zuU)NuVGzN_59&!>b=EK7~beIPS;!#3w{?y{dW zg;TP{y8NEmo?O+__-@O@RHK;0VvT88V%?!`wx@$MuD92#duu#9BpT+ha7N+ElaidL zcUH`DT&U5ash#@PMs({ex#3^~b<>^~B?0 zxhp3v5N{A;J1kswTkHE4$>Yw-^?B1$%hrb1KIDA8&1A`TKA!4YxL9j zwa=DqG`PFz)!w_amF*9$V@NyHw`P;`>YK)WF5A~s*?)R=qJP7y+`Fr<{xJdSySM37 zP{pBbYd3jU->EkiE4yZtc)!&8n4PWgZN^_0qJHkXo>g~yx5B-Mf}5->EADfBpJ1?U z@`IBXrs+<9acA@W&rX+fqHUOxc9}A4ynCkc#P<8^es7X{#QM18W3%wuyt({$9_KN? zW;LoQ{b_SBc;4rRNjK*lwl}=@sPE-MmV~FAA;%Ua^iND%EX-Y5bN@br zoM|dy8!L`;{50*T6*Az$nDf$jZ>v%EVaPz{1MF;N!XZOeh+1^HVa@DsgLQn5@1J PsDZ)L)z4*}Q$iB}6*MR! literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-mdpi/ic_launcher_quicktile_foreground.png b/app/android/app/src/main/res/mipmap-mdpi/ic_launcher_quicktile_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8159431a9a1e21400c794048c4b09687862d44 GIT binary patch literal 1905 zcmV-%2afoOP)a4-Z?xN(s(q_`qr7Xdd1DNG0{(x!A9QoAu2{}m2tjByvzr$}QADMPAo z5If;G0wTs1cV}C_c2}Cbk8YLdzPEeY)#}Ht^gbXgpWe*AnbGddy!p=P(j~`n9LI4S z$8j9TaU92S9LI4S$8j9TaU92SwvS&!*f~5tzS)hUZ+lVn-Mc7y7DCt`BuP;C+sHnP zlH{4ae?%J6l85H&EP<9)c03%u)`lrdVtKskbZ%;aL+_gUMu{|=c>t{~NgAgvi>Gkedg|?|!>tp^>8^z3a+Wr1*Yv6BA27|Bd|9ii^ zeEEs}dyUucr|D+>evHAg!$a(}RN# z)OOiCZMCi?qftEV3%=o_+HNI>?e=aw8vQX{L0}E`&Km4JwO=+|lWVI#`1p1(*j4+j zq8rDztS-inK*cKPXSH7yTwDD~!PgsVzZLv>bo7;dlOwH>l(-kipJ|#^(Mggo@Ijpd ze8zW8v(Z?&Z(P(^HcGpvX;zIr{_f$6ItTd9(?Qd0B=iFz=P_s;*|+;kO|vfW1)tQ( zls5gZrr9VMX=M#Cz=qvN|8%>bYMOO}Pxz+(0%h6Q(Iayi9lB4bYhz8gsL?3XM$Xfi zfNEh=YTZ~9@DX3td0@h?_Kk)R&m@8vyOR;zWj-R<78zVW`@1y5|!`-|l}e(~P! zfFC+>d>@-u2v;?I8PY!O+(3k~5mHn8#zI_93u(lR#MHJZgAjI;;qaj~%CTmghgIzH z+kXGyn|}Xe&95koU_(Zu5&u-%#zHWa_#7c0q6kb(nd_)s5&k|o`DhrzlaZm7R)UB; z?5_Jz^DhE(M9M%}2%%B7S;6W?LY%HjxT$CTpjA*uYrg_*^3>}Tg|e(8-dTIBVlVfS zECM&nm=S@Hu650SM0*DTPt%_aBcOc2#AAFVR%Qpw=_KxaC{gVhyv9C&P~T^3DzB&M4# z&Y^a-g$`GtV^+H?=;$@=x?ljL{$;^{O4Bm%QoGs`GKTdGebp`thSHjLT`gcQ9>;X!ed2cap^|EGZ3CryV|0` z-*6fjEgbwM@G9w74gqNOD-Sc@Ndw&fr*Bg5SC>~YGjIAnBS?wZANTI3A zD=glzh{s|ci+cKb5t_Jw$zm;wwk+N@Y5@~iCbzQBEfE+CMi;9=EJ}M`fhi!1*xCbI zT!hm=mMI`rkksk*ost9>k~R-2a+!kC^e*Fl6QnGK5qPRdqv4Qq?wS3t9`wzZ3j^j9v<2a7v rIF92uj^j9v<2a7vIF92u&X)5p&Pb5K3z+%(00000NkvXXu0mjf;ZvPh literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a6ca0646414c42fe2bc99a4a36079f7ad385b89d GIT binary patch literal 5757 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 tiiVE5n!K`>jB#^9 literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_quicktile_foreground.png b/app/android/app/src/main/res/mipmap-xhdpi/ic_launcher_quicktile_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..a8b331d245bf60d212b7cac53f712701d901ce16 GIT binary patch literal 4713 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 R)D{wrv4N?6&8;Vq{|9Q+N$LOq literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d53f9642ef4cb90018cb9549cb66b48fbcc93c7d GIT binary patch literal 9022 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 literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..264d95b14cf0427a6b6bf51ba6efba1beda3cd1d GIT binary patch literal 3028 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 literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_quicktile_foreground.png b/app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_quicktile_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..dcfbcc318b25bd467785252a1b9fd47b05cb15e9 GIT binary patch literal 7712 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 literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5471c8c7049f9f6ca8d1ff5bf9d15975183b7fa0 GIT binary patch literal 13034 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 literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_quicktile_foreground.png b/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_quicktile_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..be7d6d090a85bc0bfaff02704ac65e2801c381a2 GIT binary patch literal 11052 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

1Z;8DC zM`@n|`fk&T++19}ltY%U(Z0?321QR9p^UPcqI%Fpd&kEu!NLswLK5hX$>)L?ukB8QV(n{PJ{yVixwQ^jLO>euEcY%Q zCPH)z3i^Ir<{}75)JwXVS2oh}a!0bpTuN&8YN5-?*${SGdnT#@TBw;H;+Yzq#c=cD z(p{H>qyKixaLB5~Oyk|(Z2OhM3_$pyr|pWLOL`<%Pr==&jv?=qO;(aqoG{aSWw;Xj z0jRzNjq~hw{`3eJX7ZQm0q++VCr`3NW%twkHkxh6?d@wlmJf@L>I>^+bciA1ADe2L z>OvvLd;kjWqG=wl%A;PCD8}atFIEpAX(7A z&SYDz{`6F^GG5A(kx9KlEh(<}`hVMvn3!Qp3Y|;~rHa9gKAivtH58?TA zkjQ%J{_gKEPVrIKobUU=-rz9-{c`v0Lc0fW45x&DvKUiCw{0oJ$;EB2SjKO^i()QbiDpCJ;wXh(s|(S z*=7d~b9VV4Jv-r~^6v1k?~32F6V3-R;1`{%#&h{_w?(r_l>X0s#H9AWU}eK%=0|AE z#VXr)GD+_hD~kNpS2-gL20+vk3u@XaZ6(l++u!{U;?T4)XWm{HB`~zML(7VI6Y_XB zM%q$GTZ{wL-SR+XzT)dtrUJ*+s$5XI?>nwL|AEnk(MyH_7`X?{o_J%z?DnFP-Rb`Z z4BC7eLFk|rC&EwZG&Z}wet2f^S(1`MN>|MP%bza{Y|_gxu$N=HFnJbL2s;2vTcaKy z>0RQ-A+cy!*^2oOQ%1t}C)Oe`4e`TnsatZ{9O8c$UsF5>x_BiK3~RDr;zIjbeq*EK zE?D>QgauKrI}5?h=Bg#7Gr=|jG3Zovi^H?6XM%{H>so!HH z%th7u`hb_`q=Lef1=o5{D+JI#2J_Zlnnv(LQx&*xXQ}2^hkPvLEilsHE$bV5%gZH`bilWGD)Bh z&;ZZq&#h>F4_Sv&y0;6Gn)Rmp)#=|mM9Ya}2WGC%BK^wSf};T^+}x}2>} z7CYtLB71a4cN`ev8rmsLhbf%KJkJJ`JMr=FH0@&oWuJ^?BvAr}T2qWNO!ShV!SuVd zE!V;ODD9;BRY#PDUmtBQcXR(6!<8JOsom+tKy8z|=%$~|HYE||w2%QR&^QXTS|77} zM#ShBo~WJr<;NVk#cb!)?pHq5QTrQKdfSwl(Y@BJxw5ArxO_?j#+~7xk-EBikm=0y#P348Y8dGxcbCZ7nM3 zun3EvzVH*V4bu75lapuyk53bM`Cp zB(KLz{9F9JqI>q?fe4t;gOf;wU>I+#rDfM)=ePj?#5cnn{5HU3pU1t3FV$B?(!gJD zB^UL|ofeU+9I5VQkI-s&ZaFHhG!mBN2IXqsGjYY36;NtOxDc?uzuX>mTs*q!TWsTv z&L|#Tk_BZEmxzDm(Vgu}ns@c%o_sO?g`1B7r8O{0rRXTqL7GfVJm!bJ{3||7|8LA> d{`hkWsaw9D8T#I~>nv}ouB`RA;Gx<3{{x+$PTT+h literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..5471c8c7049f9f6ca8d1ff5bf9d15975183b7fa0 GIT binary patch literal 13034 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 z + + + + + + diff --git a/app/android/app/src/main/res/values/ic_launcher_background.xml b/app/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/app/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/app/android/app/src/main/res/values/styles.xml b/app/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..b69f535 --- /dev/null +++ b/app/android/app/src/main/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/app/android/app/src/profile/AndroidManifest.xml b/app/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..81c4800 --- /dev/null +++ b/app/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/android/build.gradle b/app/android/build.gradle new file mode 100644 index 0000000..836f6df --- /dev/null +++ b/app/android/build.gradle @@ -0,0 +1,34 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} + +// temporary fix to keep using device_apps +// https://stackoverflow.com/questions/69033022/message-error-resource-androidattr-lstar-not-found +subprojects { + afterEvaluate { project -> + if (project.plugins.hasPlugin("com.android.application") || + project.plugins.hasPlugin("com.android.library")) { + project.android { + compileSdkVersion 36 + buildToolsVersion "36.0.0" + } + } + } +} + + +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/app/android/gradle.properties b/app/android/gradle.properties new file mode 100644 index 0000000..659984f --- /dev/null +++ b/app/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4g -Xms1g +android.useAndroidX=true +android.enableJetifier=true diff --git a/app/android/gradle/wrapper/gradle-wrapper.properties b/app/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..02767eb --- /dev/null +++ b/app/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip diff --git a/app/android/settings.gradle b/app/android/settings.gradle new file mode 100644 index 0000000..f1c2904 --- /dev/null +++ b/app/android/settings.gradle @@ -0,0 +1,25 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.12.1" apply false + id "org.jetbrains.kotlin.android" version "2.2.0" apply false +} + +include ":app" diff --git a/app/assets/CHANGELOG.md b/app/assets/CHANGELOG.md new file mode 100644 index 0000000..0f20917 --- /dev/null +++ b/app/assets/CHANGELOG.md @@ -0,0 +1,360 @@ +## unreleased + +- feat(windows): add LocalSend to Windows Share Sheet (@chenxdust, https://github.com/localsend/localsend/pull/2555) +- feat: enable starting text share via command line using `--text` or `-t` flags (@guilhermetiscoski, https://github.com/localsend/localsend/pull/2661) +- feat(android): add quick settings tile for instant app launch (@Voltra, https://github.com/localsend/localsend/pull/2676) +- feat(android, ios, macos): respect system-wide animation preferences on first app startup (@nitheesh-daram, https://github.com/localsend/localsend/pull/2338) +- feat: improve remaining time formatting for long transfers (@ShlomoCode, https://github.com/localsend/localsend/pull/2765) +- feat: change duplicate file naming from "file-1.txt" to "file (1).txt" format (@kartoshka95, https://github.com/localsend/localsend/pull/2455) +- feat(macos): implement button to quickly open firewall settings from troubleshoot page (@ShlomoCode, https://github.com/localsend/localsend/pull/2775) +- feat(macos): add Command+Comma shortcut to open settings (@ShlomoCode, https://github.com/localsend/localsend/pull/2715) +- feat(macos): use user-friendly ComputerName instead of the technical hostname (@ShlomoCode, https://github.com/localsend/localsend/pull/2729) +- feat(linux): use native window decorations instead of large GTK3 headerbar (@nixigaj, https://github.com/localsend/localsend/pull/2360) +- fix(macos): prevent Dock icon from briefly appearing during autostart when "Start hidden" is enabled (@ShlomoCode, https://github.com/localsend/localsend/pull/2449) +- feat(macos): enable Dock icon text-drop even when the app is not running (@ShlomoCode, https://github.com/localsend/localsend/pull/2712) +- feat(macos): borderless window design (@ReallLucky, https://github.com/localsend/localsend/pull/2416) +- feat(macos): enable Hardened Runtime for the Mac App Store version as well to improve security (@ShlomoCode, https://github.com/localsend/localsend/pull/2716) +- fix(macos): Dock icon drag-and-drop and Share Extension working again (@ShlomoCode, https://github.com/localsend/localsend/pull/2711) +- fix(android): files not downloading when using "Share via link" (@ShlomoCode, https://github.com/localsend/localsend/pull/2756) +- fix(ios, android): prevent transfer error by saving unsupported media formats to folder instead of gallery (@ShlomoCode, https://github.com/localsend/localsend/pull/2766) +- fix: release wake lock after file transfer completes to allow device sleep (@kartoshka95, https://github.com/localsend/localsend/pull/2457) +- fix(android): preserve location metadata when sharing media (@ShlomoCode, https://github.com/localsend/localsend/pull/2742) +- fix: text message content displayed three times in history dialog (@ew-sirenko, https://github.com/localsend/localsend/pull/2296) +- fix: text message content size calculation (@ew-sirenko, https://github.com/localsend/localsend/pull/2297) +- fix(linux): add CJK font support for Chinese, Japanese, and Korean text (@Mr-Ebonycat, https://github.com/localsend/localsend/pull/2719) +- fix: save DNG files to image gallery (@ShlomoCode, https://github.com/localsend/localsend/pull/2728) + +## 1.17.0 (2025-02-19) + +- feat: add advanced setting to filter network interfaces (@Tienisto) +- feat(mobile): swipe gesture to select multiple media files (@Tienisto) +- feat(windows): when pasting an image, automatically convert it to PNG (@BrianMwit) +- feat(android): add option to open gallery when image/video was automatically saved (@Tienisto) +- fix: path traversal vulnerability when saving files (@Tienisto) +- fix: black screen when tapping on "Back" twice in "Share via link" (@Tienisto) +- fix(macos): window disappears on command key when minimize to tray is enabled (@Tienisto) +- fix(windows): do not poll local IP resulting in unwanted location permissions (@Tienisto) + +## 1.16.2 (2024-11-06) + +- fix(ios): share from other apps to LocalSend doesn't work in iOS 18 (@Tienisto) + +## 1.16.1 (2024-11-05) + +- feat: show exact error message when using IP address dialog or favorite dialog (@Tienisto) +- feat(desktop): highlight file when tapping "Show in folder" (@Tienisto) +- fix(android): properly close app on back gesture (@Tienisto) + +## 1.16.0 (2024-11-03) + +- feat: improve transfer speed if the sending device is the bottleneck by using Rust as HTTP client and multithreading (@Tienisto) +- feat: add option to automatically receive files only from favorites (@Davte) +- feat: only automatically finish when files are either successfully received or skipped (@Tienisto) +- feat: improve various padding and spacing issues in RTL languages (@ShlomoCode) +- feat: persist "advanced settings" toggle (@Nolle10) +- feat: add alias-regeneration button and alias update dialog (@Nolle10) +- feat(macos): drag-and-drop files and text into menu bar icon (@ShlomoCode) +- feat(macos): drag-and-drop text into the app icon (@ShlomoCode) +- feat(macos): include LocalSend as a share target in the share menu (@ShlomoCode) +- feat(macos): starts hidden in menu bar instead of being minimized when autostart is enabled (@ShlomoCode) +- feat(macos): show error and success state in the app icon (@ShlomoCode, @Tienisto) +- feat(macos): also have autostart option in sandboxed version (App Store) (@ShlomoCode) +- feat(macos): LocalSend installed via dmg installer is sandboxed (@Tienisto) +- feat(android): enable clipboard button (@Seidko) +- feat(ios): enable clipboard button (@AnessZurba) +- fix(macos): reopen app from launchpad after minimizing to menu bar should make window visible (@ShlomoCode) +- fix(macos): persist write access to download location after app restart (@ShlomoCode) +- i18n: add Malaysian (@Gloridust), Slovak (@dodog) + +## 1.15.4 (2024-08-20) + +- feat: add button to retry a failed file transfer (@Tienisto) +- feat: show tooltip on the "Scan" button (@Tienisto) +- feat: treat any URI as link, so it becomes clickable on receiver (e.g. file://, obsidian://) (@Tienisto) +- feat(mobile): adjust button width in send tab to indicate that it's scrollable (@Tienisto) +- feat(windows): title bar color should match the system theme (@FutoTan) +- fix: memory leak when sending files (regression in 1.15.0, 1.15.2 only fixed receiving files) (@Tienisto) +- fix(windows): LocalSend window is invisible at app start (@Tienisto) +- i18n: distinguish between "Exit" and "Quit" depending on the platform (@sergd88) +- i18n: add Hindi (@rishi-singh26) + +## 1.15.3 (2024-07-29) + +- feat: reduce receive history length to 30 items to increase performance (@Tienisto) +- feat: show error message when initialization fails for better debugging (@Tienisto) +- fix(android): properly close app on back gesture (@Tienisto) + +## 1.15.2 (2024-07-25) + +- feat: extract network scanning to separate threads, scanning should not cause UI lags anymore (@Tienisto) +- feat(windows): use bigger icon for the installer (@Tienisto) +- fix: memory leak when receiving files, properly receive files that exceed available RAM (@Tienisto) +- fix(android): save files outside of Download folder (@Tienisto) +- fix(windows): use correct portable settings file when started via autostart (@Tienisto) +- fix(windows): make installer work on arm64 (@Tienisto) + +## 1.15.1 (2024-07-18) + +- feat: support Internet Explorer 8 (IE8) in web share (@Tienisto) +- feat: save auto accept state when switching encryption mode in web share (@Tienisto) +- feat: switch to "Send" tab when pasting via keyboard shortcut (@Tienisto) +- fix: count PIN tries correctly in web share (@Tienisto) +- fix(android): crash when picking files or folders on Android TV (@Tienisto) +- fix(windows): crash when sum of file sizes is greater than 2 GB (@Tienisto) +- fix(windows): bundle required DLL files to avoid crash on app start (@Tienisto) +- fix(macos): hide autostart option when installed via App Store because this switch is not working (@Tienisto) + +## 1.15.0 (2024-07-15) + +- feat: add clear button in the send tab (@Caesarovich) +- feat: save text messages to history (@Tienisto) +- feat: keep timestamps of transferred files (@Tienisto) +- feat: add option to require PIN when sharing via link (@Tienisto) +- feat: add option to require PIN when receiving files (@Tienisto) +- feat: add option to open parent folder of received files in history (@Tienisto) +- feat: confirm before adding or removing favorites in the nearby devices list (@Tienisto) +- feat: add URL view when sharing via link that shows the URL in bigger font (@harriseldon) +- feat: add discovery timeout setting for advanced users (@o2e) +- feat(android): do not require MANAGE_EXTERNAL_STORAGE, implement Android SAF (@Tienisto) +- feat(android): do not copy files to cache when select via file picker (@Tienisto) +- feat(windows): add context menu integration ("Send to") (@Tienisto) +- feat(windows): toggle "start hidden" in-app instead of referring to the system settings (@Tienisto) +- feat(desktop): make auto start + start hidden more stable, now listens to `--hidden` parameter instead of `autostart` (@Tienisto) +- feat(desktop): load initial files from command line arguments (@Tienisto) +- feat(desktop): show progress in the taskbar (@NightFeather0615) +- feat(macos): handle files that were dropped into the app icon (@Tienisto) +- fix: sanitize file names with invalid characters (@Caesarovich) +- fix: UI overflow when window height is too small (@CHUNG-HAO) +- fix(ios): make documents files visible to the Finder / AppleDevices app (@twinkles-twinstar) +- fix(windows): correctly remove tray icon when closing the app (@zpp0196) +- fix(windows): don't keep file open (@NightFeather0615) +- fix(linux): compatibility with newer libayatana versions (@ix5) +- i18n: add Serbian (@nebojsatomic), Finnish (@jooapa), Romanian (@UnifeGi) + +## 1.14.0 (2024-02-26) + +- feat: add option to automatically accept requests when sharing via link (@MisterChangRay, @Tienisto) +- feat: use fix button width for all buttons in the selection row (only noticeable in Russian) (@Tienisto) +- fix: picking many files should not freeze the UI (@Tienisto) +- fix: do not create a new session for the same IP when sharing via link (@MisterChangRay) +- fix(android): save files to SD card on Android 10 or older (@Tienisto) +- i18n: add Danish (@Limfjorden) + +## 1.13.1 (2023-12-08) + +- feat: add a short delay when "Auto Finish" is enabled (@Tienisto) +- feat: automatically update the device name of favorite devices when they were unchanged by the user (@Tienisto) +- feat: expand file picker buttons if the button text is too long (@Tienisto) +- fix: various crash issues by downgrading Flutter from 3.16 to 3.13 (@Tienisto) + +## 1.13.0 (2023-12-04) + +- feat: add option to automatically finish after successful transfer (@Tienisto) +- feat: show favorite name in the device list if marked as favorite (@Tienisto) +- feat: ignore duplicate files when selected from file picker (@programmermager) +- feat: add donation options (@Tienisto) +- feat: add Yaru theme (@Tienisto) +- feat(desktop): uses `settings.json` located next to the executable if available for portable mode (@Tienisto) +- feat(windows): make windows icon sharper (@Tienisto, @sergd88) +- feat(macos): add Command+W shortcut to close the window (@Q1CHENL) +- fix: also show an OLED color mode option when dynamic colors are not supported by OS (@dhruvanbhalara) +- fix: sync button should spin right away when clicked (@Tienisto) +- fix(android): request permission when saving files outside of downloads folder (@Tienisto) +- fix(ios): fix permission error when picking directory (@Tienisto) +- fix(ios): clear cache when file is shared from another app (@Tienisto) +- i18n: add Greek (@multipetros), Khmer (@nidexingg) + +## 1.12.0 (2023-10-25) + +- feat: add favorites (@Tienisto) +- feat: add OLED color mode (@Tienisto) +- feat: show dialog before clearing history (@pantshaswat, @Tienisto) +- feat: show clear button in apk picker search bar (@Tienisto) +- feat: use better colors for the toggle switches in the settings (@gitstart) +- feat: drastically improve GPU usage by optimizing the spin animation (@Tienisto) +- feat(desktop): support pasting from clipboard (@gitstart, @Tienisto) +- feat(linux): allow disabling client side decorations on Wayland (@I-Want-ToBelieve) +- feat(android): use high framerate on devices that lock at 60 Hz like on some OnePlus phones (@Tienisto) +- fix(desktop): fallback to "$HOME/Downloads" when default downloads folder is unavailable (@Sqbika) +- i18n: add Vietnamese (@faea726), Thai (@watchakorn-18k), Basque (@xezpeleta) + +## 1.11.1 (2023-09-04) + +- feat: hide color setting when dynamic colors are not supported (@Tienisto) +- feat(linux): use white icon for the linux tray (@GaryElshaw, @Tienisto) +- fix: possible race condition leading to zero total files (@Tienisto) +- fix(android): navigation bar color on Android 9 and earlier (@Tienisto) +- fix(android): add `requestLegacyExternalStorage` again (that was removed in 1.11.0) (@Tienisto) +- fix(linux): do not use zenity dependency anymore for file picker (@Tienisto) + +## 1.11.0 (2023-08-28) + +- feat: optionally enable HTTPS (encryption) when share via link (@Tienisto) +- feat: use switches instead of dropdowns for settings (@forecaster-cyber) +- feat: tapping on scan button clears found devices (@Tienisto) +- feat: text message dialog is multiline only (@Tienisto) +- feat: add option to disable animations (@Tienisto) +- feat: add option to not save to history (@Tienisto) +- feat: add option to customize device model (@Tienisto) +- feat(desktop): bind "ESC" key to go to the previous page (@RiverTwilight, @Tienisto) +- feat(android, ios): open link in new browser tab (@Tienisto) +- feat(linux): enable autostart feature (@TheGB0077) +- fix(android, ios): Save GIFs and image metadata (@natsuk4ze) +- fix(android, ios): handle decline permission when picking files (@Tienisto) +- fix(desktop): GPU usage when hidden to tray (@Tienisto) + +## 1.10.0 (2023-06-02) + +- feat: dynamic colors (Material You) (@Tienisto) +- feat(android): sharing APKs includes version in file name (@Tienisto) +- feat(windows): restore Windows 7 support (@Tienisto) +- feat(windows): use specialized fonts for Chinese, Japanese and Korean (@graphemecluster, @Tienisto) +- fix: cancellation fixes during active file transfer (@SelaseKay) +- fix(windows): possible settings corruption (@TheGB0077, @Tienisto) +- fix(android): get downloads directory correctly (@Tienisto) +- fix(ios): could not save HEIC files (@Tienisto) + +## 1.9.1 (2023-05-05) + +- feat: add folder should include the folder itself +- fix: handle file names with special characters in link share mode +- fix(android): fix status bar icon color after picking a media file +- fix(linux): add libayatana-appindicator3-1 to AppImage dependencies (by @TheGB0077) + +## 1.9.0 (2023-04-23) + +- feat: directory share +- feat: share via browser link (for non-LocalSend users) +- feat: add "delete from history" button when file could not be opened (by @TheGB0077) +- feat: close message request when copied / opened link +- feat: slightly improve transfer speed +- feat: implement LocalSend protocol v2 with v1 fallback +- feat: scan (sync) button automatically scans all network interfaces when count < 3 +- feat(android, ios): add "Save to gallery" setting button in file receive options +- feat(desktop): move troubleshoot out of navigation into send page +- feat(desktop): save last window position (by @TheGB0077) +- feat(android): enable edge-to-edge mode +- feat(android): add monochrome app icons for Android 13 (by @h9419) +- feat(android): set custom download path +- feat(linux): enable system tray (by @TheGB0077) +- fix: in multi-recipient mode, retrying causes a "canceled by sender" on the recipient device +- fix: clear selection after finished message transfer +- fix(ios): could not scan local network on iOS 14+ (by @TheGB0077) +- fix(android, ios): fallback asset picker strings to English translation (by @TheGB0077) +- fix(linux): header bar glitches +- i18n: add fa + +## 1.8.0 (2023-03-05) + +- feat: add send modes (single recipient, multiple recipients) +- feat: selection gets cleared after finish by default (part of send modes feature) +- feat: share to multiple recipients in parallel +- feat: add troubleshoot page +- feat: add 2 buttons to receive history: open folder + delete history +- feat: cleanup scan UI by hiding multiple network interfaces inside the scan button +- feat: edit text message in selected files +- feat: improve device discovery by answering with TCP instead of UDP +- feat(ex. iOS): pressing destination directory in progress page will open the directory +- feat(android): share apk and install apk +- feat(android): Android TV support +- feat(android): show loading indicator when picking (large) files +- feat(windows): left click on tray icon opens app +- feat(linux): add Control+Q shortcut to exit app +- fix: handshake error in unencrypted mode +- fix: also scan multicast when pressing on a subnet sync button +- fix(android): missing app icon on Android 7 +- fix(android,ios): show error message when saving to gallery failed +- i18n: add bn, nl, uk + +## 1.7.0 (2023-02-11) + +- feat: improve device discovery by enabling multicast +- feat: received files history +- feat: show recent IP addresses in manual IP input +- feat: separate language settings page +- feat: message input is horizontally scrollable when multiline is unselected +- feat: open message normally in QuickSave mode (instead of saving it into a file) +- feat: improve error handling and add possibility to show exact error message for debugging +- feat: add unencrypted HTTP mode (for debugging) +- feat(android): keep file name when saving to photos +- feat(desktop): use bigger default window size if display is big enough +- feat(windows): use "Microsoft YaHei UI" font in Windows which works better with Chinese characters +- fix: cache cleanup on iOS +- i18n: add ar, es-ES, fr-FR, hu, in, it, iw, ja, ko, ne, pl, pt-BR, ru, sv, tr, zh-Hant-HK, zh-Hant-TW (Thanks to all the contributors!) + +## 1.6.2 (2023-01-28) + +- fix(desktop): close current instance when another is already open +- fix: cannot receive files when Chinese language is active +- fix(android, ios): share files with non-English names + +## 1.6.1 (2023-01-27) + +- fix(windows): app crashes when minimized to tray +- fix(android, ios): share intent sometimes not working +- fix(android, ios): scan not triggered when coming from share intent +- fix(android, ios): share intent produced duplicates after finishing a transfer + +## 1.6.0 (2023-01-27) + +- feat: show thumbnail in progress page +- feat: improve cache clearing mechanism +- feat: hashtag input now tries all combinations when multiple subnets are given +- feat(desktop): show dialog instead of bottom sheet when adding files +- feat(windows, mac): minimize to tray +- feat(windows): launch on login +- feat: add multiline toggle to message input +- fix: show correct file count in progress page +- fix: add self-discovering prevention +- i18n: add Simplified Chinese + +## 1.5.2 (2023-01-14) + +- F-Droid Release + +## 1.5.1 (2023-01-10) + +- fix(windows): app sometimes crash on start + +## 1.5.0 (2023-01-09) + +- feat: quick save mode +- feat: accept requests partially +- feat: set destination directory during accept phase +- feat: rename incoming files +- feat: keep screen on during file transfer +- feat: tap to open selected file before sending + +## 1.4.0 (2023-01-06) + +- feat: support multiple local IP addresses +- feat: detect if message is a link and add a button to open the link + +## 1.3.1 (2023-01-03) + +- fix: local IP sometimes not found + +## 1.3.0 (2023-01-03) + +- feat: enter custom target address +- feat: tap to open received file +- feat: responsive UI +- feat(ios): receive share intent +- feat(windows): set destination folder +- fix: update nearby device attributes when scan again + +## 1.2.0 (2022-12-31) + +- feat: drag and drop files +- feat: share plain messages +- feat(android): receive share intent + +## 1.1.0 (2022-12-30) + +- feat(android): add media picker +- feat(ios): merge image and video to common media picker +- fix(android): missing internet permission + +## 1.0.0 (2022-12-29) + +- Initial Release diff --git a/app/assets/i18n/_missing_translations_ar.json b/app/assets/i18n/_missing_translations_ar.json new file mode 100644 index 0000000..69291e3 --- /dev/null +++ b/app/assets/i18n/_missing_translations_ar.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=ar' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_az.json b/app/assets/i18n/_missing_translations_az.json new file mode 100644 index 0000000..33cc238 --- /dev/null +++ b/app/assets/i18n/_missing_translations_az.json @@ -0,0 +1,341 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=az' to quickly apply the newly added translations." + ], + "settingsTab": { + "receive": { + "requirePin": "@:webSharePage.requirePin", + "destination": "Save to folder", + "downloads": "(Downloads)", + "saveToGallery": "Save media to gallery", + "saveToHistory": "Save to history" + }, + "send": { + "title": "Send", + "shareViaLinkAutoAccept": "Automatically accept requests in \"Share via link\" mode" + }, + "network": { + "title": "Network", + "needRestart": "Restart the server to apply the settings!", + "server": "Server", + "alias": "Device name", + "deviceType": "Device type", + "deviceModel": "Device model", + "port": "Port", + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + }, + "discoveryTimeout": "Discovery Timeout", + "useSystemName": "Use system name", + "generateRandomAlias": "Generate random alias", + "portWarning": "You might not be detected by other devices because you are using a custom port. (default: {defaultPort})", + "encryption": "Encryption", + "multicastGroup": "Multicast address", + "multicastGroupWarning": "You might not be detected by other devices because you are using a custom multicast address. (default: {defaultMulticast})" + }, + "other": { + "title": "Other", + "support": "Support LocalSend", + "donate": "Donate", + "privacyPolicy": "Privacy Policy", + "termsOfUse": "Terms of Use" + }, + "advancedSettings": "Advanced settings" + }, + "troubleshootPage": { + "title": "Troubleshoot", + "subTitle": "Does the app not work as expected? Here you can find some common solutions to problems.", + "solution": "Solution:", + "fixButton": "Fix automatically", + "firewall": { + "symptom": "This device can send files to other devices but other devices cannot send files to this device.", + "solution": "This is most likely a firewall issue. You can solve this by allowing incoming connections (UDP and TCP) on port {port}.", + "openFirewall": "Open Firewall" + }, + "noDiscovery": { + "symptom": "This device cannot discover other devices.", + "solution": "Please make sure that all devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). You can try to type the IP address of the target device manually. If this works, consider adding this device to the favorites so it can be automatically discovered in the future." + }, + "noConnection": { + "symptom": "Both devices cannot discover each other nor can they share files.", + "solution": "Does the problem exist on both sides? If so, you need to make sure that both devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). The Wi-Fi network may not allow communication between participants due to Access Point (AP) Isolation. In this case, this option must be disabled on the router." + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "receiveHistoryPage": { + "title": "History", + "openFolder": "Open folder", + "deleteHistory": "Delete history", + "empty": "The history is empty.", + "entryActions": { + "open": "Open file", + "showInFolder": "Show in folder", + "info": "Information", + "deleteFromHistory": "Delete from history" + } + }, + "apkPickerPage": { + "title": "Apps (APK)", + "excludeSystemApps": "Exclude system apps", + "excludeAppsWithoutLaunchIntent": "Exclude non-launchable apps", + "apps": "{n} Apps" + }, + "selectedFilesPage": { + "deleteAll": "Delete all" + }, + "receivePage": { + "subTitle": { + "one": "wants to send you a file", + "other": "wants to send you {n} files" + }, + "subTitleMessage": "sent you a message:", + "subTitleLink": "sent you a link:", + "canceled": "The sender has canceled the request." + }, + "receiveOptionsPage": { + "title": "Options", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend folder)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Turned off automatically because there are folders." + }, + "sendPage": { + "waiting": "Waiting for response…", + "rejected": "The recipient has rejected the request.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "The recipient is busy with another request." + }, + "progressPage": { + "titleSending": "Sending files", + "titleReceiving": "Receiving files", + "savedToGallery": "Saved in Photos", + "total": { + "title": { + "sending": "Total progress ({time})", + "finishedError": "Finished with error", + "canceledSender": "Canceled by sender", + "canceledReceiver": "Canceled by receiver" + }, + "count": "Files: {curr} / {n}", + "size": "Size: {curr} / {n}", + "speed": "Speed: {speed}/s" + } + }, + "webSharePage": { + "title": "Share via link", + "loading": "Starting server…", + "stopping": "Stopping server…", + "error": "An error occurred while starting the server.", + "openLink": { + "one": "Open this link in your browser:", + "other": "Open one of these links in your browser:" + }, + "requests": "Requests", + "noRequests": "No requests yet.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Automatically accept requests", + "requirePin": "Require PIN", + "pinHint": "The PIN is \"{pin}\"", + "encryptionHint": "LocalSend uses a self-signed certificate. You need to accept it in your browser.", + "pendingRequests": "Pending requests: {n}" + }, + "aboutPage": { + "title": "About LocalSend", + "description": [ + "LocalSend is a free, open-source app that allows you to securely share files and messages with nearby devices over your local network without needing an internet connection.", + "This app is available on Android, iOS, macOS, Windows and Linux. You can find all download options on the official homepage." + ], + "author": "Author", + "contributors": "Contributors", + "packagers": "Packagers", + "translators": "Translators" + }, + "donationPage": { + "title": "Donate", + "info": "LocalSend is free, open-source and without any ads. If you like the app, you can support the development with a donation.", + "donate": "Donate {amount}", + "thanks": "Thank you very much!", + "restore": "Restore purchase" + }, + "changelogPage": { + "title": "Changelog" + }, + "dialogs": { + "addFile": { + "title": "Add to selection", + "content": "What do you want to add?" + }, + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "addressInput": { + "title": "Enter address", + "hashtag": "Hashtag", + "ip": "IP Address", + "recentlyUsed": "Recently used: " + }, + "cancelSession": { + "title": "Cancel files transfer", + "content": "Do you really want to cancel the files transfer?" + }, + "cannotOpenFile": { + "title": "Cannot open file", + "content": "Could not open \"{file}\". Has this file been moved, renamed or deleted?" + }, + "encryptionDisabledNotice": { + "title": "Encryption disabled", + "content": "Communication now takes place via the unencrypted HTTP protocol. To use HTTPS protocol, enable encryption again." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favorites", + "noFavorites": "No favorite devices yet.", + "addFavorite": "Add" + }, + "favoriteDeleteDialog": { + "title": "Delete from favorites", + "content": "Do you really want to delete from favorites \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Add to favorites", + "titleEdit": "Settings", + "name": "Device name", + "auto": "(auto)", + "ip": "IP Address", + "port": "Port" + }, + "fileInfo": { + "title": "File information", + "fileName": "File name:", + "path": "Path:", + "size": "Size:", + "sender": "Sender:", + "time": "Time:" + }, + "fileNameInput": { + "title": "Enter file name", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Clear history", + "content": "Do you really want to delete the entire history?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend can't find other devices without having the permission to scan the local network. Please grant this permission in the settings.", + "gotoSettings": "Settings" + }, + "messageInput": { + "title": "Type message", + "multiline": "Multiline" + }, + "noFiles": { + "title": "No files selected", + "content": "Please select at least one file." + }, + "noPermission": { + "title": "No permission", + "content": "You have not granted the necessary permissions. Please grant them in the settings." + }, + "notAvailableOnPlatform": { + "title": "Not available", + "content": "This feature is only available on:" + }, + "qr": { + "title": "QR Code" + }, + "quickActions": { + "title": "Quick Actions", + "counter": "Counter", + "prefix": "Prefix", + "padZero": "Pad with zeros", + "sortBeforeCount": "Sort alphabetically beforehand (A-Z)", + "random": "Random" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "File requests are now accepted automatically. Be aware that everyone on the local network can send you files." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + }, + "pin": { + "title": "Enter PIN" + }, + "sendModeHelp": { + "title": "Send modes", + "single": "Sends files to one recipient. Selection will be cleared after finished files transfer.", + "multiple": "Sends files to multiple recipients. Selection will not be cleared after finished files transfer.", + "link": "Recipients who do not have LocalSend installed can download the selected files by opening the link in their browser." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Filename cannot be empty", + "invalid": "Filename contains invalid characters" + }, + "tray": { + "open": "@:general.open", + "close": "Quit LocalSend", + "closeWindows": "Exit" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Enter PIN", + "invalidPin": "Invalid PIN", + "tooManyAttempts": "Too many attempts", + "rejected": "Rejected", + "files": "Files", + "fileName": "File name", + "size": "Size" + }, + "assetPicker": { + "confirm": "Confirm", + "cancel": "Cancel", + "edit": "Edit", + "gifIndicator": "GIF", + "loadFailed": "Load failed", + "original": "Origin", + "preview": "Preview", + "select": "Select", + "emptyList": "Empty list", + "unSupportedAssetType": "Unsupported file type.", + "unableToAccessAll": "Unable to access all files on the device", + "viewingLimitedAssetsTip": "Only view files and albums accessible to the app.", + "changeAccessibleLimitedAssets": "Click to update accessible files", + "accessAllTip": "App can only access some files on the device. Go to system settings and allow the app to access all media on the device.", + "goToSystemSettings": "Go to system settings", + "accessLimitedAssets": "Continue with limited access", + "accessiblePathName": "Accessible files", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Image", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Other media", + "sActionPlayHint": "play", + "sActionPreviewHint": "preview", + "sActionSelectHint": "select", + "sActionSwitchPathLabel": "change path", + "sActionUseCameraHint": "use camera", + "sNameDurationLabel": "duration", + "sUnitAssetCountLabel": "count" + } +} diff --git a/app/assets/i18n/_missing_translations_bg.json b/app/assets/i18n/_missing_translations_bg.json new file mode 100644 index 0000000..649fa9b --- /dev/null +++ b/app/assets/i18n/_missing_translations_bg.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=bg' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_bn.json b/app/assets/i18n/_missing_translations_bn.json new file mode 100644 index 0000000..3df1d54 --- /dev/null +++ b/app/assets/i18n/_missing_translations_bn.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=bn' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_ca.json b/app/assets/i18n/_missing_translations_ca.json new file mode 100644 index 0000000..914d40f --- /dev/null +++ b/app/assets/i18n/_missing_translations_ca.json @@ -0,0 +1,42 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=ca' to quickly apply the newly added translations." + ], + "receiveTab": { + "quickSave": { + "off": "@:general.off", + "favorites": "Favorites", + "on": "@:general.on" + } + }, + "settingsTab": { + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + } + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "dialogs": { + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "quickSaveFromFavoritesNotice": { + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + } + } +} diff --git a/app/assets/i18n/_missing_translations_cs.json b/app/assets/i18n/_missing_translations_cs.json new file mode 100644 index 0000000..4baf9cd --- /dev/null +++ b/app/assets/i18n/_missing_translations_cs.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=cs' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_da.json b/app/assets/i18n/_missing_translations_da.json new file mode 100644 index 0000000..4285982 --- /dev/null +++ b/app/assets/i18n/_missing_translations_da.json @@ -0,0 +1,44 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=da' to quickly apply the newly added translations." + ], + "receiveTab": { + "quickSave": { + "off": "@:general.off", + "favorites": "Favorites", + "on": "@:general.on" + } + }, + "settingsTab": { + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + }, + "useSystemName": "Use system name", + "generateRandomAlias": "Generate random alias" + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "dialogs": { + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "quickSaveFromFavoritesNotice": { + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + } + } +} diff --git a/app/assets/i18n/_missing_translations_de.json b/app/assets/i18n/_missing_translations_de.json new file mode 100644 index 0000000..0c43123 --- /dev/null +++ b/app/assets/i18n/_missing_translations_de.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=de' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_el.json b/app/assets/i18n/_missing_translations_el.json new file mode 100644 index 0000000..dcd8665 --- /dev/null +++ b/app/assets/i18n/_missing_translations_el.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=el' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_en_IN.json b/app/assets/i18n/_missing_translations_en_IN.json new file mode 100644 index 0000000..c6d1cf8 --- /dev/null +++ b/app/assets/i18n/_missing_translations_en_IN.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=en-IN' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_es_ES.json b/app/assets/i18n/_missing_translations_es_ES.json new file mode 100644 index 0000000..b72625b --- /dev/null +++ b/app/assets/i18n/_missing_translations_es_ES.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=es-ES' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_et.json b/app/assets/i18n/_missing_translations_et.json new file mode 100644 index 0000000..1318534 --- /dev/null +++ b/app/assets/i18n/_missing_translations_et.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=et' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_eu.json b/app/assets/i18n/_missing_translations_eu.json new file mode 100644 index 0000000..b570ac9 --- /dev/null +++ b/app/assets/i18n/_missing_translations_eu.json @@ -0,0 +1,130 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=eu' to quickly apply the newly added translations." + ], + "general": { + "quickSaveFromFavorites": "Quick Save for \"Favorites\"" + }, + "receiveTab": { + "quickSave": { + "off": "@:general.off", + "favorites": "Favorites", + "on": "@:general.on" + } + }, + "sendTab": { + "manualSending": "Manual sending" + }, + "settingsTab": { + "general": { + "saveWindowPlacementWindows": "Save window position after exit", + "showInContextMenu": "Show LocalSend in context menu" + }, + "receive": { + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Auto Finish" + }, + "send": { + "title": "Send", + "shareViaLinkAutoAccept": "Automatically accept requests in \"Share via link\" mode" + }, + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + }, + "discoveryTimeout": "Discovery Timeout", + "useSystemName": "Use system name", + "generateRandomAlias": "Generate random alias" + }, + "other": { + "title": "Other", + "support": "Support LocalSend", + "donate": "Donate", + "privacyPolicy": "Privacy Policy", + "termsOfUse": "Terms of Use" + } + }, + "troubleshootPage": { + "noDiscovery": { + "symptom": "This device cannot discover other devices.", + "solution": "Please make sure that all devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). You can try to type the IP address of the target device manually. If this works, consider adding this device to the favorites so it can be automatically discovered in the future." + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "receiveHistoryPage": { + "entryActions": { + "showInFolder": "Show in folder" + } + }, + "sendPage": { + "tooManyAttempts": "@:web.tooManyAttempts" + }, + "webSharePage": { + "autoAccept": "Automatically accept requests", + "requirePin": "Require PIN", + "pinHint": "The PIN is \"{pin}\"" + }, + "aboutPage": { + "description": [ + "LocalSend is a free, open-source app that allows you to securely share files and messages with nearby devices over your local network without needing an internet connection.", + "This app is available on Android, iOS, macOS, Windows and Linux. You can find all download options on the official homepage." + ], + "author": "Author", + "contributors": "Contributors", + "packagers": "Packagers", + "translators": "Translators" + }, + "donationPage": { + "title": "Donate", + "info": "LocalSend is free, open-source and without any ads. If you like the app, you can support the development with a donation.", + "donate": "Donate {amount}", + "thanks": "Thank you very much!", + "restore": "Restore purchase" + }, + "dialogs": { + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "historyClearDialog": { + "title": "Clear history", + "content": "Do you really want to delete the entire history?" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + }, + "pin": { + "title": "Enter PIN" + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Filename cannot be empty", + "invalid": "Filename contains invalid characters" + }, + "tray": { + "closeWindows": "Exit" + }, + "web": { + "enterPin": "Enter PIN", + "invalidPin": "Invalid PIN", + "tooManyAttempts": "Too many attempts" + } +} diff --git a/app/assets/i18n/_missing_translations_fa.json b/app/assets/i18n/_missing_translations_fa.json new file mode 100644 index 0000000..68c2259 --- /dev/null +++ b/app/assets/i18n/_missing_translations_fa.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=fa' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_fi.json b/app/assets/i18n/_missing_translations_fi.json new file mode 100644 index 0000000..bb87734 --- /dev/null +++ b/app/assets/i18n/_missing_translations_fi.json @@ -0,0 +1,40 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=fi' to quickly apply the newly added translations." + ], + "receiveTab": { + "quickSave": { + "off": "@:general.off", + "on": "@:general.on" + } + }, + "settingsTab": { + "receive": { + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin" + }, + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + } + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "sendPage": { + "tooManyAttempts": "@:web.tooManyAttempts" + }, + "dialogs": { + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites" + } + } +} diff --git a/app/assets/i18n/_missing_translations_fil_PH.json b/app/assets/i18n/_missing_translations_fil_PH.json new file mode 100644 index 0000000..b1fc33e --- /dev/null +++ b/app/assets/i18n/_missing_translations_fil_PH.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=fil-PH' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_fr.json b/app/assets/i18n/_missing_translations_fr.json new file mode 100644 index 0000000..3edf8a1 --- /dev/null +++ b/app/assets/i18n/_missing_translations_fr.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=fr' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_gl.json b/app/assets/i18n/_missing_translations_gl.json new file mode 100644 index 0000000..fec3224 --- /dev/null +++ b/app/assets/i18n/_missing_translations_gl.json @@ -0,0 +1,351 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=gl' to quickly apply the newly added translations." + ], + "settingsTab": { + "general": { + "launchAtStartup": "Autostart after login", + "launchMinimized": "Autostart: Start hidden", + "showInContextMenu": "Show LocalSend in context menu", + "animations": "Animations" + }, + "receive": { + "title": "Receive", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Auto Finish", + "destination": "Save to folder", + "downloads": "(Downloads)", + "saveToGallery": "Save media to gallery", + "saveToHistory": "Save to history" + }, + "send": { + "title": "Send", + "shareViaLinkAutoAccept": "Automatically accept requests in \"Share via link\" mode" + }, + "network": { + "title": "Network", + "needRestart": "Restart the server to apply the settings!", + "server": "Server", + "alias": "Device name", + "deviceType": "Device type", + "deviceModel": "Device model", + "port": "Port", + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + }, + "discoveryTimeout": "Discovery Timeout", + "useSystemName": "Use system name", + "generateRandomAlias": "Generate random alias", + "portWarning": "You might not be detected by other devices because you are using a custom port. (default: {defaultPort})", + "encryption": "Encryption", + "multicastGroup": "Multicast address", + "multicastGroupWarning": "You might not be detected by other devices because you are using a custom multicast address. (default: {defaultMulticast})" + }, + "other": { + "title": "Other", + "support": "Support LocalSend", + "donate": "Donate", + "privacyPolicy": "Privacy Policy", + "termsOfUse": "Terms of Use" + }, + "advancedSettings": "Advanced settings" + }, + "troubleshootPage": { + "title": "Troubleshoot", + "subTitle": "Does the app not work as expected? Here you can find some common solutions to problems.", + "solution": "Solution:", + "fixButton": "Fix automatically", + "firewall": { + "symptom": "This device can send files to other devices but other devices cannot send files to this device.", + "solution": "This is most likely a firewall issue. You can solve this by allowing incoming connections (UDP and TCP) on port {port}.", + "openFirewall": "Open Firewall" + }, + "noDiscovery": { + "symptom": "This device cannot discover other devices.", + "solution": "Please make sure that all devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). You can try to type the IP address of the target device manually. If this works, consider adding this device to the favorites so it can be automatically discovered in the future." + }, + "noConnection": { + "symptom": "Both devices cannot discover each other nor can they share files.", + "solution": "Does the problem exist on both sides? If so, you need to make sure that both devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). The Wi-Fi network may not allow communication between participants due to Access Point (AP) Isolation. In this case, this option must be disabled on the router." + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "receiveHistoryPage": { + "title": "History", + "openFolder": "Open folder", + "deleteHistory": "Delete history", + "empty": "The history is empty.", + "entryActions": { + "open": "Open file", + "showInFolder": "Show in folder", + "info": "Information", + "deleteFromHistory": "Delete from history" + } + }, + "apkPickerPage": { + "title": "Apps (APK)", + "excludeSystemApps": "Exclude system apps", + "excludeAppsWithoutLaunchIntent": "Exclude non-launchable apps", + "apps": "{n} Apps" + }, + "selectedFilesPage": { + "deleteAll": "Delete all" + }, + "receivePage": { + "subTitle": { + "one": "wants to send you a file", + "other": "wants to send you {n} files" + }, + "subTitleMessage": "sent you a message:", + "subTitleLink": "sent you a link:", + "canceled": "The sender has canceled the request." + }, + "receiveOptionsPage": { + "title": "Options", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend folder)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Turned off automatically because there are folders." + }, + "sendPage": { + "waiting": "Waiting for response…", + "rejected": "The recipient has rejected the request.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "The recipient is busy with another request." + }, + "progressPage": { + "titleSending": "Sending files", + "titleReceiving": "Receiving files", + "savedToGallery": "Saved in Photos", + "total": { + "title": { + "sending": "Total progress ({time})", + "finishedError": "Finished with error", + "canceledSender": "Canceled by sender", + "canceledReceiver": "Canceled by receiver" + }, + "count": "Files: {curr} / {n}", + "size": "Size: {curr} / {n}", + "speed": "Speed: {speed}/s" + } + }, + "webSharePage": { + "title": "Share via link", + "loading": "Starting server…", + "stopping": "Stopping server…", + "error": "An error occurred while starting the server.", + "openLink": { + "one": "Open this link in your browser:", + "other": "Open one of these links in your browser:" + }, + "requests": "Requests", + "noRequests": "No requests yet.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Automatically accept requests", + "requirePin": "Require PIN", + "pinHint": "The PIN is \"{pin}\"", + "encryptionHint": "LocalSend uses a self-signed certificate. You need to accept it in your browser.", + "pendingRequests": "Pending requests: {n}" + }, + "aboutPage": { + "title": "About LocalSend", + "description": [ + "LocalSend is a free, open-source app that allows you to securely share files and messages with nearby devices over your local network without needing an internet connection.", + "This app is available on Android, iOS, macOS, Windows and Linux. You can find all download options on the official homepage." + ], + "author": "Author", + "contributors": "Contributors", + "packagers": "Packagers", + "translators": "Translators" + }, + "donationPage": { + "title": "Donate", + "info": "LocalSend is free, open-source and without any ads. If you like the app, you can support the development with a donation.", + "donate": "Donate {amount}", + "thanks": "Thank you very much!", + "restore": "Restore purchase" + }, + "changelogPage": { + "title": "Changelog" + }, + "dialogs": { + "addFile": { + "title": "Add to selection", + "content": "What do you want to add?" + }, + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "addressInput": { + "title": "Enter address", + "hashtag": "Hashtag", + "ip": "IP Address", + "recentlyUsed": "Recently used: " + }, + "cancelSession": { + "title": "Cancel files transfer", + "content": "Do you really want to cancel the files transfer?" + }, + "cannotOpenFile": { + "title": "Cannot open file", + "content": "Could not open \"{file}\". Has this file been moved, renamed or deleted?" + }, + "encryptionDisabledNotice": { + "title": "Encryption disabled", + "content": "Communication now takes place via the unencrypted HTTP protocol. To use HTTPS protocol, enable encryption again." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favorites", + "noFavorites": "No favorite devices yet.", + "addFavorite": "Add" + }, + "favoriteDeleteDialog": { + "title": "Delete from favorites", + "content": "Do you really want to delete from favorites \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Add to favorites", + "titleEdit": "Settings", + "name": "Device name", + "auto": "(auto)", + "ip": "IP Address", + "port": "Port" + }, + "fileInfo": { + "title": "File information", + "fileName": "File name:", + "path": "Path:", + "size": "Size:", + "sender": "Sender:", + "time": "Time:" + }, + "fileNameInput": { + "title": "Enter file name", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Clear history", + "content": "Do you really want to delete the entire history?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend can't find other devices without having the permission to scan the local network. Please grant this permission in the settings.", + "gotoSettings": "Settings" + }, + "messageInput": { + "title": "Type message", + "multiline": "Multiline" + }, + "noFiles": { + "title": "No files selected", + "content": "Please select at least one file." + }, + "noPermission": { + "title": "No permission", + "content": "You have not granted the necessary permissions. Please grant them in the settings." + }, + "notAvailableOnPlatform": { + "title": "Not available", + "content": "This feature is only available on:" + }, + "qr": { + "title": "QR Code" + }, + "quickActions": { + "title": "Quick Actions", + "counter": "Counter", + "prefix": "Prefix", + "padZero": "Pad with zeros", + "sortBeforeCount": "Sort alphabetically beforehand (A-Z)", + "random": "Random" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "File requests are now accepted automatically. Be aware that everyone on the local network can send you files." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + }, + "pin": { + "title": "Enter PIN" + }, + "sendModeHelp": { + "title": "Send modes", + "single": "Sends files to one recipient. Selection will be cleared after finished files transfer.", + "multiple": "Sends files to multiple recipients. Selection will not be cleared after finished files transfer.", + "link": "Recipients who do not have LocalSend installed can download the selected files by opening the link in their browser." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Filename cannot be empty", + "invalid": "Filename contains invalid characters" + }, + "tray": { + "open": "@:general.open", + "close": "Quit LocalSend", + "closeWindows": "Exit" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Enter PIN", + "invalidPin": "Invalid PIN", + "tooManyAttempts": "Too many attempts", + "rejected": "Rejected", + "files": "Files", + "fileName": "File name", + "size": "Size" + }, + "assetPicker": { + "confirm": "Confirm", + "cancel": "Cancel", + "edit": "Edit", + "gifIndicator": "GIF", + "loadFailed": "Load failed", + "original": "Origin", + "preview": "Preview", + "select": "Select", + "emptyList": "Empty list", + "unSupportedAssetType": "Unsupported file type.", + "unableToAccessAll": "Unable to access all files on the device", + "viewingLimitedAssetsTip": "Only view files and albums accessible to the app.", + "changeAccessibleLimitedAssets": "Click to update accessible files", + "accessAllTip": "App can only access some files on the device. Go to system settings and allow the app to access all media on the device.", + "goToSystemSettings": "Go to system settings", + "accessLimitedAssets": "Continue with limited access", + "accessiblePathName": "Accessible files", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Image", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Other media", + "sActionPlayHint": "play", + "sActionPreviewHint": "preview", + "sActionSelectHint": "select", + "sActionSwitchPathLabel": "change path", + "sActionUseCameraHint": "use camera", + "sNameDurationLabel": "duration", + "sUnitAssetCountLabel": "count" + } +} diff --git a/app/assets/i18n/_missing_translations_gu.json b/app/assets/i18n/_missing_translations_gu.json new file mode 100644 index 0000000..5daa057 --- /dev/null +++ b/app/assets/i18n/_missing_translations_gu.json @@ -0,0 +1,91 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=gu' to quickly apply the newly added translations." + ], + "general": { + "quickSaveFromFavorites": "Quick Save for \"Favorites\"" + }, + "receiveTab": { + "quickSave": { + "off": "@:general.off", + "favorites": "Favorites", + "on": "@:general.on" + } + }, + "sendTab": { + "manualSending": "Manual sending" + }, + "settingsTab": { + "general": { + "saveWindowPlacementWindows": "Save window position after exit", + "showInContextMenu": "Show LocalSend in context menu" + }, + "receive": { + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin" + }, + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + }, + "useSystemName": "Use system name", + "generateRandomAlias": "Generate random alias" + } + }, + "troubleshootPage": { + "noDiscovery": { + "symptom": "This device cannot discover other devices.", + "solution": "Please make sure that all devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). You can try to type the IP address of the target device manually. If this works, consider adding this device to the favorites so it can be automatically discovered in the future." + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "receiveHistoryPage": { + "entryActions": { + "showInFolder": "Show in folder" + } + }, + "sendPage": { + "tooManyAttempts": "@:web.tooManyAttempts" + }, + "webSharePage": { + "requirePin": "Require PIN", + "pinHint": "The PIN is \"{pin}\"" + }, + "aboutPage": { + "packagers": "Packagers" + }, + "dialogs": { + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + }, + "pin": { + "title": "Enter PIN" + } + }, + "tray": { + "closeWindows": "Exit" + }, + "web": { + "enterPin": "Enter PIN", + "invalidPin": "Invalid PIN", + "tooManyAttempts": "Too many attempts" + } +} diff --git a/app/assets/i18n/_missing_translations_he.json b/app/assets/i18n/_missing_translations_he.json new file mode 100644 index 0000000..acb0d4e --- /dev/null +++ b/app/assets/i18n/_missing_translations_he.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=he' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_hi.json b/app/assets/i18n/_missing_translations_hi.json new file mode 100644 index 0000000..0dfefe6 --- /dev/null +++ b/app/assets/i18n/_missing_translations_hi.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=hi' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_hu.json b/app/assets/i18n/_missing_translations_hu.json new file mode 100644 index 0000000..1cb8814 --- /dev/null +++ b/app/assets/i18n/_missing_translations_hu.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=hu' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_id.json b/app/assets/i18n/_missing_translations_id.json new file mode 100644 index 0000000..c1ae71f --- /dev/null +++ b/app/assets/i18n/_missing_translations_id.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=id' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_it.json b/app/assets/i18n/_missing_translations_it.json new file mode 100644 index 0000000..ba21f19 --- /dev/null +++ b/app/assets/i18n/_missing_translations_it.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=it' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_ja.json b/app/assets/i18n/_missing_translations_ja.json new file mode 100644 index 0000000..3b58be7 --- /dev/null +++ b/app/assets/i18n/_missing_translations_ja.json @@ -0,0 +1,22 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=ja' to quickly apply the newly added translations." + ], + "settingsTab": { + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + } + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + } +} diff --git a/app/assets/i18n/_missing_translations_km.json b/app/assets/i18n/_missing_translations_km.json new file mode 100644 index 0000000..9522a94 --- /dev/null +++ b/app/assets/i18n/_missing_translations_km.json @@ -0,0 +1,22 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=km' to quickly apply the newly added translations." + ], + "settingsTab": { + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + } + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + } +} diff --git a/app/assets/i18n/_missing_translations_ko.json b/app/assets/i18n/_missing_translations_ko.json new file mode 100644 index 0000000..5d6de78 --- /dev/null +++ b/app/assets/i18n/_missing_translations_ko.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=ko' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_ml.json b/app/assets/i18n/_missing_translations_ml.json new file mode 100644 index 0000000..8d1969e --- /dev/null +++ b/app/assets/i18n/_missing_translations_ml.json @@ -0,0 +1,269 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=ml' to quickly apply the newly added translations." + ], + "receiveTab": { + "quickSave": { + "on": "@:general.on" + } + }, + "sendTab": { + "selection": { + "files": "Files: {files}", + "size": "Size: {size}" + } + }, + "settingsTab": { + "receive": { + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin" + }, + "network": { + "portWarning": "You might not be detected by other devices because you are using a custom port. (default: {defaultPort})", + "encryption": "Encryption", + "multicastGroup": "Multicast address", + "multicastGroupWarning": "You might not be detected by other devices because you are using a custom multicast address. (default: {defaultMulticast})" + }, + "other": { + "title": "Other", + "support": "Support LocalSend", + "donate": "Donate", + "termsOfUse": "Terms of Use" + }, + "advancedSettings": "Advanced settings" + }, + "troubleshootPage": { + "title": "Troubleshoot", + "subTitle": "Does the app not work as expected? Here you can find some common solutions to problems.", + "solution": "Solution:", + "fixButton": "Fix automatically", + "firewall": { + "symptom": "This device can send files to other devices but other devices cannot send files to this device.", + "solution": "This is most likely a firewall issue. You can solve this by allowing incoming connections (UDP and TCP) on port {port}.", + "openFirewall": "Open Firewall" + }, + "noDiscovery": { + "symptom": "This device cannot discover other devices.", + "solution": "Please make sure that all devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). You can try to type the IP address of the target device manually. If this works, consider adding this device to the favorites so it can be automatically discovered in the future." + }, + "noConnection": { + "symptom": "Both devices cannot discover each other nor can they share files.", + "solution": "Does the problem exist on both sides? If so, you need to make sure that both devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). The Wi-Fi network may not allow communication between participants due to Access Point (AP) Isolation. In this case, this option must be disabled on the router." + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "receiveHistoryPage": { + "title": "History", + "openFolder": "Open folder", + "deleteHistory": "Delete history", + "empty": "The history is empty.", + "entryActions": { + "open": "Open file", + "showInFolder": "Show in folder", + "info": "Information", + "deleteFromHistory": "Delete from history" + } + }, + "apkPickerPage": { + "title": "Apps (APK)", + "excludeSystemApps": "Exclude system apps", + "excludeAppsWithoutLaunchIntent": "Exclude non-launchable apps", + "apps": "{n} Apps" + }, + "selectedFilesPage": { + "deleteAll": "Delete all" + }, + "receivePage": { + "subTitle": { + "one": "wants to send you a file", + "other": "wants to send you {n} files" + }, + "subTitleMessage": "sent you a message:", + "subTitleLink": "sent you a link:", + "canceled": "The sender has canceled the request." + }, + "receiveOptionsPage": { + "title": "Options", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend folder)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Turned off automatically because there are folders." + }, + "sendPage": { + "waiting": "Waiting for response…", + "rejected": "The recipient has rejected the request.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "The recipient is busy with another request." + }, + "progressPage": { + "titleSending": "Sending files", + "titleReceiving": "Receiving files", + "savedToGallery": "Saved in Photos", + "total": { + "title": { + "sending": "Total progress ({time})", + "finishedError": "Finished with error", + "canceledSender": "Canceled by sender", + "canceledReceiver": "Canceled by receiver" + }, + "count": "Files: {curr} / {n}", + "size": "Size: {curr} / {n}", + "speed": "Speed: {speed}/s" + } + }, + "webSharePage": { + "title": "Share via link", + "loading": "Starting server…", + "stopping": "Stopping server…", + "error": "An error occurred while starting the server.", + "openLink": { + "one": "Open this link in your browser:", + "other": "Open one of these links in your browser:" + }, + "requests": "Requests", + "noRequests": "No requests yet.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Automatically accept requests", + "requirePin": "Require PIN", + "pinHint": "The PIN is \"{pin}\"", + "encryptionHint": "LocalSend uses a self-signed certificate. You need to accept it in your browser.", + "pendingRequests": "Pending requests: {n}" + }, + "aboutPage": { + "title": "About LocalSend", + "description": [ + "LocalSend is a free, open-source app that allows you to securely share files and messages with nearby devices over your local network without needing an internet connection.", + "This app is available on Android, iOS, macOS, Windows and Linux. You can find all download options on the official homepage." + ], + "author": "Author", + "contributors": "Contributors", + "packagers": "Packagers", + "translators": "Translators" + }, + "donationPage": { + "title": "Donate", + "info": "LocalSend is free, open-source and without any ads. If you like the app, you can support the development with a donation.", + "donate": "Donate {amount}", + "thanks": "Thank you very much!", + "restore": "Restore purchase" + }, + "changelogPage": { + "title": "Changelog" + }, + "dialogs": { + "addFile": { + "title": "Add to selection", + "content": "What do you want to add?" + }, + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "addressInput": { + "title": "Enter address", + "hashtag": "Hashtag", + "ip": "IP Address", + "recentlyUsed": "Recently used: " + }, + "cancelSession": { + "title": "Cancel files transfer", + "content": "Do you really want to cancel the files transfer?" + }, + "cannotOpenFile": { + "title": "Cannot open file", + "content": "Could not open \"{file}\". Has this file been moved, renamed or deleted?" + }, + "encryptionDisabledNotice": { + "title": "Encryption disabled", + "content": "Communication now takes place via the unencrypted HTTP protocol. To use HTTPS protocol, enable encryption again." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favorites", + "noFavorites": "No favorite devices yet.", + "addFavorite": "Add" + }, + "favoriteDeleteDialog": { + "title": "Delete from favorites", + "content": "Do you really want to delete from favorites \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Add to favorites", + "titleEdit": "Settings", + "name": "Device name", + "auto": "(auto)", + "ip": "IP Address", + "port": "Port" + }, + "fileInfo": { + "title": "File information", + "fileName": "File name:", + "path": "Path:", + "size": "Size:", + "sender": "Sender:", + "time": "Time:" + }, + "fileNameInput": { + "title": "Enter file name", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Clear history", + "content": "Do you really want to delete the entire history?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend can't find other devices without having the permission to scan the local network. Please grant this permission in the settings.", + "gotoSettings": "Settings" + }, + "messageInput": { + "title": "Type message", + "multiline": "Multiline" + }, + "noFiles": { + "title": "No files selected", + "content": "Please select at least one file." + }, + "noPermission": { + "title": "No permission", + "content": "You have not granted the necessary permissions. Please grant them in the settings." + }, + "notAvailableOnPlatform": { + "title": "Not available", + "content": "This feature is only available on:" + }, + "qr": { + "title": "QR Code" + }, + "quickActions": { + "title": "Quick Actions", + "counter": "Counter", + "prefix": "Prefix", + "padZero": "Pad with zeros", + "sortBeforeCount": "Sort alphabetically beforehand (A-Z)", + "random": "Random" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "File requests are now accepted automatically. Be aware that everyone on the local network can send you files." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites" + } + }, + "tray": { + "open": "@:general.open" + }, + "web": { + "waiting": "@:sendPage.waiting" + } +} diff --git a/app/assets/i18n/_missing_translations_mn.json b/app/assets/i18n/_missing_translations_mn.json new file mode 100644 index 0000000..c3c8d57 --- /dev/null +++ b/app/assets/i18n/_missing_translations_mn.json @@ -0,0 +1,209 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=mn' to quickly apply the newly added translations." + ], + "general": { + "quickSaveFromFavorites": "Quick Save for \"Favorites\"" + }, + "settingsTab": { + "receive": { + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites" + }, + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + }, + "generateRandomAlias": "Generate random alias" + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "sendPage": { + "tooManyAttempts": "@:web.tooManyAttempts" + }, + "webSharePage": { + "loading": "Starting server…", + "stopping": "Stopping server…", + "encryption": "@:settingsTab.network.encryption" + }, + "aboutPage": { + "packagers": "Packagers" + }, + "dialogs": { + "addFile": { + "title": "Add to selection", + "content": "What do you want to add?" + }, + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "addressInput": { + "title": "Enter address", + "hashtag": "Hashtag", + "ip": "IP Address", + "recentlyUsed": "Recently used: " + }, + "cancelSession": { + "title": "Cancel files transfer", + "content": "Do you really want to cancel the files transfer?" + }, + "cannotOpenFile": { + "title": "Cannot open file", + "content": "Could not open \"{file}\". Has this file been moved, renamed or deleted?" + }, + "encryptionDisabledNotice": { + "title": "Encryption disabled", + "content": "Communication now takes place via the unencrypted HTTP protocol. To use HTTPS protocol, enable encryption again." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favorites", + "noFavorites": "No favorite devices yet.", + "addFavorite": "Add" + }, + "favoriteDeleteDialog": { + "title": "Delete from favorites", + "content": "Do you really want to delete from favorites \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Add to favorites", + "titleEdit": "Settings", + "name": "Device name", + "auto": "(auto)", + "ip": "IP Address", + "port": "Port" + }, + "fileInfo": { + "title": "File information", + "fileName": "File name:", + "path": "Path:", + "size": "Size:", + "sender": "Sender:", + "time": "Time:" + }, + "fileNameInput": { + "title": "Enter file name", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Clear history", + "content": "Do you really want to delete the entire history?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend can't find other devices without having the permission to scan the local network. Please grant this permission in the settings.", + "gotoSettings": "Settings" + }, + "messageInput": { + "title": "Type message", + "multiline": "Multiline" + }, + "noFiles": { + "title": "No files selected", + "content": "Please select at least one file." + }, + "noPermission": { + "title": "No permission", + "content": "You have not granted the necessary permissions. Please grant them in the settings." + }, + "notAvailableOnPlatform": { + "title": "Not available", + "content": "This feature is only available on:" + }, + "qr": { + "title": "QR Code" + }, + "quickActions": { + "title": "Quick Actions", + "counter": "Counter", + "prefix": "Prefix", + "padZero": "Pad with zeros", + "sortBeforeCount": "Sort alphabetically beforehand (A-Z)", + "random": "Random" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "File requests are now accepted automatically. Be aware that everyone on the local network can send you files." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + }, + "pin": { + "title": "Enter PIN" + }, + "sendModeHelp": { + "title": "Send modes", + "single": "Sends files to one recipient. Selection will be cleared after finished files transfer.", + "multiple": "Sends files to multiple recipients. Selection will not be cleared after finished files transfer.", + "link": "Recipients who do not have LocalSend installed can download the selected files by opening the link in their browser." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Filename cannot be empty", + "invalid": "Filename contains invalid characters" + }, + "tray": { + "open": "@:general.open", + "close": "Quit LocalSend", + "closeWindows": "Exit" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Enter PIN", + "invalidPin": "Invalid PIN", + "tooManyAttempts": "Too many attempts", + "rejected": "Rejected", + "files": "Files", + "fileName": "File name", + "size": "Size" + }, + "assetPicker": { + "confirm": "Confirm", + "cancel": "Cancel", + "edit": "Edit", + "gifIndicator": "GIF", + "loadFailed": "Load failed", + "original": "Origin", + "preview": "Preview", + "select": "Select", + "emptyList": "Empty list", + "unSupportedAssetType": "Unsupported file type.", + "unableToAccessAll": "Unable to access all files on the device", + "viewingLimitedAssetsTip": "Only view files and albums accessible to the app.", + "changeAccessibleLimitedAssets": "Click to update accessible files", + "accessAllTip": "App can only access some files on the device. Go to system settings and allow the app to access all media on the device.", + "goToSystemSettings": "Go to system settings", + "accessLimitedAssets": "Continue with limited access", + "accessiblePathName": "Accessible files", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Image", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Other media", + "sActionPlayHint": "play", + "sActionPreviewHint": "preview", + "sActionSelectHint": "select", + "sActionSwitchPathLabel": "change path", + "sActionUseCameraHint": "use camera", + "sNameDurationLabel": "duration", + "sUnitAssetCountLabel": "count" + } +} diff --git a/app/assets/i18n/_missing_translations_ms.json b/app/assets/i18n/_missing_translations_ms.json new file mode 100644 index 0000000..88ce219 --- /dev/null +++ b/app/assets/i18n/_missing_translations_ms.json @@ -0,0 +1,59 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=ms' to quickly apply the newly added translations." + ], + "receiveTab": { + "quickSave": { + "off": "@:general.off", + "favorites": "Favorites", + "on": "@:general.on" + } + }, + "settingsTab": { + "general": { + "saveWindowPlacementWindows": "Save window position after exit" + }, + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + } + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "sendPage": { + "tooManyAttempts": "@:web.tooManyAttempts" + }, + "webSharePage": { + "encryptionHint": "LocalSend uses a self-signed certificate. You need to accept it in your browser." + }, + "aboutPage": { + "packagers": "Packagers" + }, + "dialogs": { + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "quickSaveFromFavoritesNotice": { + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + } + }, + "web": { + "enterPin": "Enter PIN", + "invalidPin": "Invalid PIN", + "tooManyAttempts": "Too many attempts" + } +} diff --git a/app/assets/i18n/_missing_translations_ne.json b/app/assets/i18n/_missing_translations_ne.json new file mode 100644 index 0000000..8853b78 --- /dev/null +++ b/app/assets/i18n/_missing_translations_ne.json @@ -0,0 +1,19 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=ne' to quickly apply the newly added translations." + ], + "general": { + "quickSaveFromFavorites": "Quick Save for \"Favorites\"" + }, + "settingsTab": { + "receive": { + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites" + } + }, + "dialogs": { + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites" + } + } +} diff --git a/app/assets/i18n/_missing_translations_nl.json b/app/assets/i18n/_missing_translations_nl.json new file mode 100644 index 0000000..9290128 --- /dev/null +++ b/app/assets/i18n/_missing_translations_nl.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=nl' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_pl.json b/app/assets/i18n/_missing_translations_pl.json new file mode 100644 index 0000000..0da0da9 --- /dev/null +++ b/app/assets/i18n/_missing_translations_pl.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=pl' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_pt_BR.json b/app/assets/i18n/_missing_translations_pt_BR.json new file mode 100644 index 0000000..a83e63d --- /dev/null +++ b/app/assets/i18n/_missing_translations_pt_BR.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=pt-BR' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_pt_PT.json b/app/assets/i18n/_missing_translations_pt_PT.json new file mode 100644 index 0000000..90696a9 --- /dev/null +++ b/app/assets/i18n/_missing_translations_pt_PT.json @@ -0,0 +1,91 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=pt-PT' to quickly apply the newly added translations." + ], + "general": { + "quickSaveFromFavorites": "Quick Save for \"Favorites\"" + }, + "receiveTab": { + "quickSave": { + "off": "@:general.off", + "favorites": "Favorites", + "on": "@:general.on" + } + }, + "sendTab": { + "manualSending": "Manual sending" + }, + "settingsTab": { + "general": { + "saveWindowPlacementWindows": "Save window position after exit", + "showInContextMenu": "Show LocalSend in context menu" + }, + "receive": { + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin" + }, + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + }, + "useSystemName": "Use system name", + "generateRandomAlias": "Generate random alias" + } + }, + "troubleshootPage": { + "noDiscovery": { + "symptom": "This device cannot discover other devices.", + "solution": "Please make sure that all devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). You can try to type the IP address of the target device manually. If this works, consider adding this device to the favorites so it can be automatically discovered in the future." + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "receiveHistoryPage": { + "entryActions": { + "showInFolder": "Show in folder" + } + }, + "sendPage": { + "tooManyAttempts": "@:web.tooManyAttempts" + }, + "webSharePage": { + "requirePin": "Require PIN", + "pinHint": "The PIN is \"{pin}\"" + }, + "aboutPage": { + "packagers": "Packagers" + }, + "dialogs": { + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + }, + "pin": { + "title": "Enter PIN" + } + }, + "tray": { + "closeWindows": "Exit" + }, + "web": { + "enterPin": "Enter PIN", + "invalidPin": "Invalid PIN", + "tooManyAttempts": "Too many attempts" + } +} diff --git a/app/assets/i18n/_missing_translations_ro.json b/app/assets/i18n/_missing_translations_ro.json new file mode 100644 index 0000000..b6faccd --- /dev/null +++ b/app/assets/i18n/_missing_translations_ro.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=ro' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_ru.json b/app/assets/i18n/_missing_translations_ru.json new file mode 100644 index 0000000..d69f5f8 --- /dev/null +++ b/app/assets/i18n/_missing_translations_ru.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=ru' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_si.json b/app/assets/i18n/_missing_translations_si.json new file mode 100644 index 0000000..21fd4a6 --- /dev/null +++ b/app/assets/i18n/_missing_translations_si.json @@ -0,0 +1,22 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=si' to quickly apply the newly added translations." + ], + "settingsTab": { + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + } + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + } +} diff --git a/app/assets/i18n/_missing_translations_sk.json b/app/assets/i18n/_missing_translations_sk.json new file mode 100644 index 0000000..9b181ab --- /dev/null +++ b/app/assets/i18n/_missing_translations_sk.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=sk' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_sl.json b/app/assets/i18n/_missing_translations_sl.json new file mode 100644 index 0000000..23e182e --- /dev/null +++ b/app/assets/i18n/_missing_translations_sl.json @@ -0,0 +1,42 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=sl' to quickly apply the newly added translations." + ], + "receiveTab": { + "quickSave": { + "off": "@:general.off", + "favorites": "Favorites", + "on": "@:general.on" + } + }, + "settingsTab": { + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + } + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "dialogs": { + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "quickSaveFromFavoritesNotice": { + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + } + } +} diff --git a/app/assets/i18n/_missing_translations_sr.json b/app/assets/i18n/_missing_translations_sr.json new file mode 100644 index 0000000..48c096f --- /dev/null +++ b/app/assets/i18n/_missing_translations_sr.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=sr' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_sr_Cyrl.json b/app/assets/i18n/_missing_translations_sr_Cyrl.json new file mode 100644 index 0000000..c6834d0 --- /dev/null +++ b/app/assets/i18n/_missing_translations_sr_Cyrl.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=sr-Cyrl' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_sv.json b/app/assets/i18n/_missing_translations_sv.json new file mode 100644 index 0000000..4229bb9 --- /dev/null +++ b/app/assets/i18n/_missing_translations_sv.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=sv' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_ta.json b/app/assets/i18n/_missing_translations_ta.json new file mode 100644 index 0000000..790213b --- /dev/null +++ b/app/assets/i18n/_missing_translations_ta.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=ta' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_th.json b/app/assets/i18n/_missing_translations_th.json new file mode 100644 index 0000000..38f939d --- /dev/null +++ b/app/assets/i18n/_missing_translations_th.json @@ -0,0 +1,60 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=th' to quickly apply the newly added translations." + ], + "general": { + "quickSaveFromFavorites": "Quick Save for \"Favorites\"" + }, + "receiveTab": { + "quickSave": { + "off": "@:general.off", + "favorites": "Favorites", + "on": "@:general.on" + } + }, + "sendTab": { + "manualSending": "Manual sending" + }, + "settingsTab": { + "general": { + "saveWindowPlacementWindows": "Save window position after exit" + }, + "receive": { + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites" + }, + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + }, + "useSystemName": "Use system name", + "generateRandomAlias": "Generate random alias" + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "dialogs": { + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + } + }, + "tray": { + "closeWindows": "Exit" + } +} diff --git a/app/assets/i18n/_missing_translations_tr.json b/app/assets/i18n/_missing_translations_tr.json new file mode 100644 index 0000000..1b3a787 --- /dev/null +++ b/app/assets/i18n/_missing_translations_tr.json @@ -0,0 +1,29 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=tr' to quickly apply the newly added translations." + ], + "settingsTab": { + "receive": { + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites" + }, + "network": { + "networkOptions": { + "filtered": "Filtered" + } + } + }, + "networkInterfacesPage": { + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes." + }, + "dialogs": { + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + } + } +} diff --git a/app/assets/i18n/_missing_translations_uk.json b/app/assets/i18n/_missing_translations_uk.json new file mode 100644 index 0000000..4eb0fee --- /dev/null +++ b/app/assets/i18n/_missing_translations_uk.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=uk' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_ur.json b/app/assets/i18n/_missing_translations_ur.json new file mode 100644 index 0000000..3da26c0 --- /dev/null +++ b/app/assets/i18n/_missing_translations_ur.json @@ -0,0 +1,51 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=ur' to quickly apply the newly added translations." + ], + "general": { + "quickSaveFromFavorites": "Quick Save for \"Favorites\"" + }, + "receiveTab": { + "quickSave": { + "off": "@:general.off", + "favorites": "Favorites", + "on": "@:general.on" + } + }, + "settingsTab": { + "receive": { + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites" + }, + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + }, + "useSystemName": "Use system name", + "generateRandomAlias": "Generate random alias" + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "dialogs": { + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + } + } +} diff --git a/app/assets/i18n/_missing_translations_vi.json b/app/assets/i18n/_missing_translations_vi.json new file mode 100644 index 0000000..2321e90 --- /dev/null +++ b/app/assets/i18n/_missing_translations_vi.json @@ -0,0 +1,22 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=vi' to quickly apply the newly added translations." + ], + "settingsTab": { + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + } + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + } +} diff --git a/app/assets/i18n/_missing_translations_zh_CN.json b/app/assets/i18n/_missing_translations_zh_CN.json new file mode 100644 index 0000000..babbeb2 --- /dev/null +++ b/app/assets/i18n/_missing_translations_zh_CN.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=zh-CN' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_missing_translations_zh_HK.json b/app/assets/i18n/_missing_translations_zh_HK.json new file mode 100644 index 0000000..d26e4e5 --- /dev/null +++ b/app/assets/i18n/_missing_translations_zh_HK.json @@ -0,0 +1,22 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=zh-HK' to quickly apply the newly added translations." + ], + "settingsTab": { + "network": { + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + } + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + } +} diff --git a/app/assets/i18n/_missing_translations_zh_TW.json b/app/assets/i18n/_missing_translations_zh_TW.json new file mode 100644 index 0000000..2989e35 --- /dev/null +++ b/app/assets/i18n/_missing_translations_zh_TW.json @@ -0,0 +1,6 @@ +{ + "@@info": [ + "Here are translations that exist in but not in .", + "After editing this file, you can run 'dart run slang apply --locale=zh-TW' to quickly apply the newly added translations." + ] +} diff --git a/app/assets/i18n/_unused_translations.json b/app/assets/i18n/_unused_translations.json new file mode 100644 index 0000000..841f69f --- /dev/null +++ b/app/assets/i18n/_unused_translations.json @@ -0,0 +1,73 @@ +{ + "@@info": [ + "Here are translations that exist in secondary locales but not in .", + "[--full enabled] Furthermore, translations not used in 'lib/' according to the 't.' pattern are written into ." + ], + "en": { + "locale": "English", + "general": { + "online": "Online", + "save": "Save" + }, + "sendTab": { + "thisDevice": "This Device" + }, + "dialogs": { + "messageInput": { + "multiline": "Multiline" + } + } + }, + "ar": {}, + "az": {}, + "bg": {}, + "bn": {}, + "ca": {}, + "cs": {}, + "da": {}, + "de": {}, + "el": {}, + "en-IN": {}, + "es-ES": {}, + "et": {}, + "eu": {}, + "fa": {}, + "fi": {}, + "fil-PH": {}, + "fr": {}, + "gl": {}, + "gu": {}, + "he": {}, + "hi": {}, + "hu": {}, + "id": {}, + "it": {}, + "ja": {}, + "km": {}, + "ko": {}, + "ml": {}, + "mn": {}, + "ms": {}, + "ne": {}, + "nl": {}, + "pl": {}, + "pt-BR": {}, + "pt-PT": {}, + "ro": {}, + "ru": {}, + "si": {}, + "sk": {}, + "sl": {}, + "sr": {}, + "sr-Cyrl": {}, + "sv": {}, + "ta": {}, + "th": {}, + "tr": {}, + "uk": {}, + "ur": {}, + "vi": {}, + "zh-CN": {}, + "zh-HK": {}, + "zh-TW": {} +} diff --git a/app/assets/i18n/ar.json b/app/assets/i18n/ar.json new file mode 100644 index 0000000..4b15baf --- /dev/null +++ b/app/assets/i18n/ar.json @@ -0,0 +1,535 @@ +{ + "locale": "العربية", + "appName": "LocalSend", + "general": { + "accept": "اقبل", + "accepted": "قُبلت", + "add": "إضافة", + "advanced": "متقدم", + "cancel": "ألغِ", + "close": "أغلِق", + "confirm": "أكِّد", + "continueStr": "أكمل", + "copy": "انسخ", + "copiedToClipboard": "نُسخ إلى الحافظة", + "decline": "ارفض", + "done": "تم", + "delete": "احذف", + "edit": "عدِّل", + "error": "خطأ", + "example": "مثال", + "files": "ملفات", + "finished": "انتهى", + "hide": "أخفِ", + "off": "إيقاف", + "offline": "غير متصل بالانترنت", + "on": "تشغيل", + "online": "متصل بالانترنت", + "open": "افتح", + "queue": "صفّ", + "quickSave": "حفظ سريع", + "quickSaveFromFavorites": "حفظ سريع لـ \"المفضلات\"", + "renamed": "اعادة تسمية", + "reset": "إعادة ضبط", + "restart": "إعادة تشغيل", + "settings": "الإعدادات", + "skipped": "تم تخطيه", + "start": "ابدأ", + "stop": "قف", + "save": "احفظ", + "unchanged": "دون تغيير", + "unknown": "مجهول", + "noItemInClipboard": "لا توجد عناصر في الحافظة." + }, + "receiveTab": { + "title": "استلام", + "infoBox": { + "ip": "IP:", + "port": "منفذ:", + "alias": "اسم الجهاز:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "المفضلات", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "إرسال", + "selection": { + "title": "اختيار", + "files": "ملفات: {files}", + "size": "حجم: {size}" + }, + "picker": { + "file": "ملف", + "folder": "مجلد", + "media": "وسائط", + "text": "نص", + "app": "تطبيق", + "clipboard": "لصق" + }, + "shareIntentInfo": "يمكنك أيضًا استخدام ميزة \"مشاركة\" بجهازك المحمول لتحديد الملفات بسهولة.", + "nearbyDevices": "الأجهزة القريبة", + "thisDevice": "هذا الجهاز", + "scan": "ابحث عن أجهزة", + "manualSending": "الإرسال اليدوي", + "sendMode": "وضع الإرسال", + "sendModes": { + "single": "مستلم واحد", + "multiple": "متعدد المستلمين", + "link": "مشاركة عبر الرابط" + }, + "sendModeHelp": "شرح", + "help": "يُرجى التأكد من أن الهدف المطلوب موجود أيضًا في نفس شبكة الواي فاي.", + "placeItems": "ضع العناصر للمشاركة." + }, + "settingsTab": { + "title": "الإعدادات", + "general": { + "title": "عام", + "brightness": "السمة", + "brightnessOptions": { + "system": "نظام", + "dark": "داكنة", + "light": "فاتحة" + }, + "color": "اللون", + "colorOptions": { + "system": "النظام", + "oled": "OLED" + }, + "language": "اللغة", + "languageOptions": { + "system": "النظام" + }, + "saveWindowPlacement": "إنهاء: حفظ موقع النافذة", + "saveWindowPlacementWindows": "حفظ موضع النافذة بعد الخروج", + "minimizeToTray": "إنهاء : أخفاء في شريط المهام", + "launchAtStartup": "تشغيل تلقائي بعد تسجيل الدخول", + "launchMinimized": "تشغيل تلقائي: ابدأ مخفيًا", + "showInContextMenu": "إظهار LocalSend في قائمة السياق", + "animations": "الرسوم المتحركة" + }, + "receive": { + "title": "استلم", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "إنهاء تلقائي", + "destination": "احفظ في المجلد", + "downloads": "(التنزيلات)", + "saveToGallery": "حفظ الوسائط في المعرض", + "saveToHistory": "حفظ في التاريخ" + }, + "send": { + "title": "أرسِل", + "shareViaLinkAutoAccept": "المشاركة عبر الرابط: قبول تلقائي" + }, + "network": { + "title": "شبكة الاتصال", + "needRestart": "أعد تشغيل الخادم لتطبيق الإعدادات!", + "server": "الخادم", + "alias": "اسم مستعار", + "deviceType": "نوع الجهاز", + "deviceModel": "نموذج الجهاز", + "port": "منفذ", + "discoveryTimeout": "مهلة الاكتشاف", + "useSystemName": "استخدم اسم النظام", + "generateRandomAlias": "ولّد كنية عشوائية", + "portWarning": "ربما لا يتم الكشف عنك من قبل الأجهزة الأخرى لأنك تستخدم منفذ مخصص. (الافتراضي: {defaultPort})", + "encryption": "التعمية", + "multicastGroup": "فرق البث المتعدد", + "multicastGroupWarning": "ربما لا يتم الكشف عنك من قبل الأجهزة الأخرى لأنك تستخدم عنوان بث متعدد مخصص. (الافتراضي: {defaultMulticast})", + "networkOptions": { + "filtered": "مُصفاة", + "all": "الكل" + }, + "network": "الشبكة" + }, + "other": { + "title": "أخرى", + "support": "دعم LocalSend", + "donate": "تبرّع", + "privacyPolicy": "سياسة الخصوصيّة", + "termsOfUse": "شروط الاستخدام" + }, + "advancedSettings": "الإعدادات المتقدمة" + }, + "troubleshootPage": { + "title": "حل المشكلات", + "subTitle": "هل هذا التطبيق لا يعمل كما هو متوقع؟ هنا يمكنك العثور على الحلول الشائعة.", + "solution": "الحل:", + "fixButton": "إصلاح تلقائيًا", + "firewall": { + "symptom": "يمكن لهذا التطبيق إرسال الملفات إلى الأجهزة الأخرى ولكن الأجهزة الأخرى لا يمكنها إرسال الملفات إلى هذا الجهاز.", + "solution": "هذه المشكلة عادة ما تكون مشكلة في جدار الحماية. يمكنك حل هذه المشكلة عن طريق السماح بالاتصالات الواردة (UDP و TCP) على المنفذ {port}.", + "openFirewall": "افتح جدار الحماية" + }, + "noDiscovery": { + "symptom": "هذا الجهاز لا يمكنه اكتشاف الأجهزة الأخرى.", + "solution": "يُرجى التأكد من أن جميع الأجهزة متصلة بنفس شبكة الواي فاي وتشارك نفس التكوين (المنفذ، عنوان البث المتعدد، التعمية). يمكنك محاولة كتابة عنوان IP للجهاز المستهدف يدويًا. إذا نجح ذلك، فكر في إضافة هذا الجهاز إلى قائمة المفضلات حتى يتم اكتشافه تلقائيًا في المستقبل." + }, + "noConnection": { + "symptom": "لا يمكن للجهازين اكتشاف بعضهما البعض ولا يمكنهما مشاركة الملفات.", + "solution": "هل المشكلة موجودة على كِلا الجانبين؟ إذا كان الأمر كذلك، يجب التأكد من أن كِلا الجهازين متصلان بنفس شبكة الواي فاي ويشتركان في نفس الإعدادات (المنفذ، عنوان البث المتعدد، التعمية). قد تمنع شبكة الواي فاي الاتصال بين المشاركين بسبب عزل نقطة الوصول (AP Isolation). في هذه الحالة، يجب تعطيل هذا الخيار على الراوتر." + } + }, + "receiveHistoryPage": { + "title": "التاريخ", + "openFolder": "افتح المجلد", + "deleteHistory": "احذف التاريخ", + "empty": "التاريخ فارغ.", + "entryActions": { + "open": "افتح الملف", + "showInFolder": "اعرض في المجلد", + "info": "معلومات", + "deleteFromHistory": "احذف من التاريخ" + } + }, + "apkPickerPage": { + "title": "التطبيقات (APK)", + "excludeSystemApps": "استبعاد التطبيقات النظام", + "excludeAppsWithoutLaunchIntent": "استبعاد التطبيقات غير القابلة للتشغيل", + "apps": "{n} تطبيق" + }, + "selectedFilesPage": { + "deleteAll": "احذف الكل" + }, + "receivePage": { + "subTitle": { + "one": "يريد أن يرسل لك ملف", + "other": "يريد أن يرسل لك {n} ملفات" + }, + "subTitleMessage": "أرسل لك رسالة:", + "subTitleLink": "أرسل لك ارتباط:", + "canceled": "أُلغِيَ المرسل الطلب." + }, + "receiveOptionsPage": { + "title": "خيارات", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(مجلد LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "تم إيقافه تلقائيًا لوجود مجلدات." + }, + "sendPage": { + "waiting": "بإنتظار الرد…", + "rejected": "المستلم رفض الطلب.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "المستلم مشغول بطلب آخر." + }, + "progressPage": { + "titleSending": "جارِ إرسال الملفات", + "titleReceiving": "جارِ استلام الملفات", + "savedToGallery": "حُفظ في الصور", + "total": { + "title": { + "sending": "التقدم الكلي ({time})", + "finishedError": "انتهى مع وجود خطأ", + "canceledSender": "أُلغِيَ من قِبل المرسل", + "canceledReceiver": "أُلغِيَ من قِبل المتلقي" + }, + "count": "ملفات: {curr} / {n}", + "size": "حجم: {curr} / {n}", + "speed": "سرعة: {speed}/ثانية" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}س {m}د", + "days": "{d}ي {h}س {m}د", + "@hours": "استخدم 'س' لاختصار الساعات و'د' للدقائق", + "@days": "استخدم 'ي' للأيام، و'س' للساعات، و'د' للدقائق" + } + }, + "webSharePage": { + "title": "مشاركة عبر الرابط", + "loading": "جارِ بدء الخادم…", + "stopping": "جارِ إيقاف الخادم…", + "error": "حدث خطأ أثناء بدء الخادم.", + "openLink": { + "one": "افتح هذا الرابط في المتصفح:", + "other": "افتح أحد هذه الروابط في المتصفح:" + }, + "requests": "الطلبات", + "noRequests": "لا يوجد طلبات حتى الآن.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "قبول الطلبات تلقائيًا", + "requirePin": "يتطلب رمز PIN", + "pinHint": "رمز PIN هو \"{pin}\"", + "encryptionHint": "يستخدم تطبيق LocalSend شهادة موقع ذاتية التوقيع. يجب عليك قبولها في المتصفح.", + "pendingRequests": "الطلبات المعلقة: {n}" + }, + "aboutPage": { + "title": "عن LocalSend", + "description": [ + "LocalSend هو تطبيق مجاني مفتوح المصدر يسمح لك بمشاركة الملفات والرسائل بشكل آمن مع الأجهزة القريبة عبر شبكتك المحلية دون الحاجة إلى اتصال بالإنترنت.", + "هذا التطبيق متاح على أنظمة Android وiOS وmacOS وWindows وLinux. يمكنك العثور على جميع خيارات التنزيل على الصفحة الرئيسية الرسمية." + ], + "author": "المؤلف", + "contributors": "المساهمون", + "packagers": "محزمي التطبيقات", + "translators": "المترجمون" + }, + "donationPage": { + "title": "تبرّع", + "info": "LocalSend مجاني ومفتوح المصدر وبدون أي إعلانات. إذا أعجبك التطبيق، يمكنك دعم التطوير بالتبرع.", + "donate": "تبرّع {amount}", + "thanks": "شكراً جزيلاً!", + "restore": "استعادة شراء" + }, + "changelogPage": { + "title": "سجل التغييرات" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "قد تحتوي المناطق المختلفة على كلمات مختلفة، وقد لا تتطابق 1:1", + "adjectives": [ + "محبوب", + "جميل", + "كبير", + "ساطع", + "نظيف", + "ذكي", + "رائع", + "جذاب", + "ماكر", + "مصمم", + "نشيط", + "فعال", + "خيالي", + "سريع", + "جيد", + "طازج", + "حسن", + "خلاب", + "رائع", + "جميل المظهر", + "حار", + "حنون", + "محبوب", + "صوفي", + "مرتب", + "لطيف", + "صبور", + "جميل", + "قوي", + "ثري", + "سري", + "ذكي", + "صلب", + "مميز", + "استراتيجي", + "قوي", + "مرتب", + "حكيم" + ], + "fruits": [ + "تفاح", + "أفوكادو", + "موز", + "بلاك بيري", + "توت", + "بروكلي", + "جزر", + "كرز", + "جوز الهند", + "عنب", + "ليمون", + "خَسّ", + "مانجو", + "شمام", + "فطر", + "بصل", + "برتقال", + "بابايا", + "خَوخ", + "إجاص", + "أناناس", + "بطاطس", + "يقطين", + "توت العُليق", + "فراولة", + "طماطم" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "أضف إلى الاختيار", + "content": "ماذا تريد أن تضيف؟" + }, + "openFile": { + "title": "افتح الملف", + "content": "هل تريد فتح الملف المُستلم؟" + }, + "addressInput": { + "title": "أدخل العنوان", + "hashtag": "رابطة هاشتاق", + "ip": "عنوان IP", + "recentlyUsed": "المستخدمة حديثًا: " + }, + "cancelSession": { + "title": "ألغِ نقل الملف", + "content": "هل تريد حقًا إلغاء نقل الملف؟" + }, + "cannotOpenFile": { + "title": "لا يمكن فتح الملف", + "content": "تعذر فتح \"{file}\". هل نُقل هذا الملف أو إعادة تسميته أو حذفه؟" + }, + "encryptionDisabledNotice": { + "title": "التعمية مُعطّلة", + "content": "الاتصال يتم الآن عبر بروتوكول HTTP غير المُعمّى. لاستخدام HTTPS، فعِّل التعمية مرة أخرى." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "المفضلات", + "noFavorites": "لا توجد أجهزة مفضلة بعد.", + "addFavorite": "أضف" + }, + "favoriteDeleteDialog": { + "title": "احذف من المفضلات", + "content": "هل ترغب حقًا في حذف \"{name}\" من المفضلات؟" + }, + "favoriteEditDialog": { + "titleAdd": "أضف إلى المفضلات", + "titleEdit": "اﻹعدادات", + "name": "اسم الجهاز", + "auto": "(تلقائي)", + "ip": "عنوان IP", + "port": "المنفذ" + }, + "fileInfo": { + "title": "معلومات الملف", + "fileName": "اسم الملف:", + "path": "المسار:", + "size": "الحجم:", + "sender": "المرسل:", + "time": "الوقت:" + }, + "fileNameInput": { + "title": "أدخل اسم الملف", + "original": "أصلي: {original}" + }, + "historyClearDialog": { + "title": "امسح التاريخ", + "content": "هل ترغب حقًا في مسح التاريخ بالكامل؟" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "لا يمكن ل LocalSend العثور على الأجهزة الأخرى بدون الإذن بفحص الشبكة المحلية. يُرجى منح هذا الإذن في الإعدادات.", + "gotoSettings": "الإعدادات" + }, + "messageInput": { + "title": "اكتب رسالة", + "multiline": "متعدد الأسطر" + }, + "noFiles": { + "title": "لم يتم اختيار اي ملف", + "content": "الرجاء تحديد ملف واحد على الأقل." + }, + "noPermission": { + "title": "بدون إذن", + "content": "لم تمنح الأذونات اللازمة. يُرجى منحها في الإعدادات." + }, + "notAvailableOnPlatform": { + "title": "غير متاح", + "content": "هذه الميزة متاحة فقط على:" + }, + "qr": { + "title": "رمز QR" + }, + "quickActions": { + "title": "إجراءات سريعة", + "counter": "عداد", + "prefix": "بادئة", + "padZero": "احشو مع أصفار", + "sortBeforeCount": "افرز أبجديًا مسبقًا (أ-ي)", + "random": "عشوائي" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "يتم قبول طلبات الملفات تلقائيًا. اعلم أن كل فرد في الشبكة المحلية يمكنه إرسال الملفات إليك." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "يتم الآن قبول طلبات الملفات تلقائيًا من الأجهزة الموجودة في قائمة المفضلات لديك.", + "تحذير! في الوقت الحالي، هذا ليس آمنًا تمامًا، حيث يمكن للمخترق الذي لديه بصمة أي جهاز من قائمة المفضلات لديك أن يرسل لك ملفات دون قيود.", + "ومع ذلك، يظل هذا الخيار أكثر أمانًا من السماح لجميع المستخدمين على الشبكة المحلية بإرسال الملفات إليك دون قيود." + ] + }, + "pin": { + "title": "أدخل رمز PIN" + }, + "sendModeHelp": { + "title": "أوضاع الإرسال", + "single": "يقوم بإرسال الملفات إلى مستلم واحد. سيتم مسح الاختيار بعد انتهاء نقل الملف.", + "multiple": "يرسل الملفات إلى عدة مستلمين. لن يتم مسح التحديد بعد الانتهاء من نقل الملفات.", + "link": "يمكن للمستلمين الذين لا يحتوون على LocalSend تنزيل الملفات المحددة عن طريق فتح الرابط في متصفحهم." + }, + "zoom": { + "title": "عنوان URL" + } + }, + "sanitization": { + "empty": "لا يمكن أن يكون اسم الملف فارغًا", + "invalid": "يحتوي اسم الملف على أحرف غير صالحة" + }, + "tray": { + "@info": "إرشادات Apple صارمة للغاية بشأن صياغة 'الإغلاق'.", + "open": "@:general.open", + "close": "أنهِ LocalSend", + "closeWindows": "اخرج" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "أدخل رمز PIN", + "invalidPin": "رمز PIN غير صالح", + "tooManyAttempts": "محاولات كثيرة جدًا", + "rejected": "رُفض", + "files": "الملفات", + "fileName": "اسم الملف", + "size": "الحجم" + }, + "assetPicker": { + "@info": "ترجمات أداة تحديد الوسائط لنظامي التشغيل أندرويد و آيفون", + "confirm": "أكّد", + "cancel": "ألغِ", + "edit": "عدّل", + "gifIndicator": "GIF", + "loadFailed": "فشل التحميل", + "original": "أصلي", + "preview": "معاينة", + "select": "حدّد", + "emptyList": "القائمة فارغة", + "unSupportedAssetType": "نوع الملف غير مدعوم.", + "unableToAccessAll": "لا يمكن الوصول إلى جميع الملفات الموجودة على الجهاز", + "viewingLimitedAssetsTip": "إظهار الملفات والألبومات التي يمكن للتطبيق الوصول إليها فقط.", + "changeAccessibleLimitedAssets": "انقر لتحديث الملفات التي يمكن الوصول إليها", + "accessAllTip": "يمكن للتطبيق الوصول فقط إلى بعض الملفات على الجهاز. اذهب إلى إعدادات النظام واسمح للتطبيق بالوصول إلى جميع الوسائط على الجهاز.", + "goToSystemSettings": "اذهب إلى إعدادات النظام", + "accessLimitedAssets": "استمر بوصول محدود", + "accessiblePathName": "ملفات يمكن الوصول إليها", + "sTypeAudioLabel": "صوتي", + "sTypeImageLabel": "صورة", + "sTypeVideoLabel": "فيديو", + "sTypeOtherLabel": "وسائط أخرى", + "sActionPlayHint": "شغِّل", + "sActionPreviewHint": "معاينة", + "sActionSelectHint": "حدّد", + "sActionSwitchPathLabel": "غيّر المسار", + "sActionUseCameraHint": "استخدم الكاميرا", + "sNameDurationLabel": "مدة", + "sUnitAssetCountLabel": "عدد" + }, + "networkInterfacesPage": { + "whitelist": "القائمة البيضاء", + "title": "واجهات الشبكة", + "blacklist": "القائمة السوداء", + "info": "بشكل افتراضي، يستخدم LocalSend جميع واجهات الشبكة المتاحة. يمكنك استبعاد الشبكات غير المرغوب فيها هنا. تحتاج إلى إعادة تشغيل الخادم لتطبيق التغييرات.", + "preview": "معاينة" + } +} diff --git a/app/assets/i18n/az.json b/app/assets/i18n/az.json new file mode 100644 index 0000000..e2d7f8e --- /dev/null +++ b/app/assets/i18n/az.json @@ -0,0 +1,457 @@ +{ + "locale": "Azərbaycanca", + "appName": "LocalSend", + "general": { + "accept": "Qəbul et", + "accepted": "Qəbul edildi", + "add": "Əlavə et", + "advanced": "Qabaqcıl", + "cancel": "Ləğv et", + "close": "Bağla", + "confirm": "Təsdiqlə", + "continueStr": "Davam et", + "copy": "Köçür", + "copiedToClipboard": "Məlumat buferinə köçürüldü", + "decline": "İmtina et", + "done": "Oldu", + "delete": "Sil", + "edit": "Düzəliş et", + "error": "Xəta", + "example": "Nümunə", + "files": "Fayllar", + "finished": "Bitdi", + "hide": "Gizlət", + "off": "Bağlı", + "offline": "Oflayn", + "on": "Aktiv", + "online": "Onlayn", + "open": "Aç", + "queue": "Növbə", + "quickSave": "Cəld yadda saxla", + "quickSaveFromFavorites": "\"Sevimlilər\" üçün cəld yadda saxla", + "renamed": "Adı dəyişdirildi", + "reset": "Dəyişiklikləri geri qaytar", + "restart": "Yenidən başlat", + "settings": "Parametrlər", + "skipped": "Ötürüldü", + "start": "Başlat", + "stop": "Dayandır", + "save": "Yadda saxla", + "unchanged": "Dəyişdirilməmiş", + "unknown": "Naməlum", + "noItemInClipboard": "Məlumat buferində element yoxdur." + }, + "receiveTab": { + "title": "Qəbul et", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Cihazın adı:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Sevimlilər", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Göndər", + "selection": { + "title": "Seçim", + "files": "Fayllar: {files}", + "size": "Ölçü: {size}" + }, + "picker": { + "file": "Fayl", + "folder": "Qovluq", + "media": "Media", + "text": "Mətn", + "app": "Tətbiq", + "clipboard": "Yapışdır" + }, + "shareIntentInfo": "Faylları daha rahat seçmək üçün mobil cihazınızın \"Paylaş\" xüsusiyyətin də istifadə edə bilərsiniz.", + "nearbyDevices": "Yaxınlıqdakı cihazlar", + "thisDevice": "Bu Cihaz", + "scan": "Cihazları axtar", + "manualSending": "Özünüz göndərin", + "sendMode": "Göndərmə üsulu", + "sendModes": { + "single": "Tək qəbul edən", + "multiple": "Çoxsaylı alıcılar", + "link": "Keçid vasitəsilə paylaş" + }, + "sendModeHelp": "İzahat", + "help": "Xahiş olunur, əmin olun ki, istədiyiniz hədəf eyni Wi-Fi şəbəkəsindədir.", + "placeItems": "Paylaşmaq üçün elementləri yerləşdir." + }, + "settingsTab": { + "title": "Tənzimləmələr", + "general": { + "title": "Ümumi", + "brightness": "Tema", + "brightnessOptions": { + "system": "Sistem", + "dark": "Qaranlıq", + "light": "İşıqlı" + }, + "color": "Rəng", + "colorOptions": { + "system": "Sistem", + "oled": "OLED" + }, + "language": "Dil", + "languageOptions": { + "system": "Sistem" + }, + "saveWindowPlacement": "Çıxdıqdan sonra pəncərə mövqeyini saxla", + "saveWindowPlacementWindows": "Çıxış sonrası pəncərə mövqeyin saxla", + "minimizeToTray": "Bağlayanda Sistem Sahəsi/Menyu Cizgisinə kiçilt", + "launchAtStartup": "Girişdən sonra birbaşa başlat", + "launchMinimized": "Birbaşa başlat: Gizli başlat", + "showInContextMenu": "Məzmun menyusunda LocalSend-i göstər", + "animations": "Animasiyalar" + }, + "receive": { + "title": "Qəbul et", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "autoFinish": "Avtomatik Bitirmə", + "requirePin": "@:webSharePage.requirePin", + "destination": "Qovluqda yadda saxla", + "downloads": "(Yüklənənlər)", + "saveToGallery": "Medianı qalereyada yadda saxla", + "saveToHistory": "Tarixçədə yadda saxla" + }, + "advancedSettings": "Qabaqcıl parametrlər", + "send": { + "title": "Göndər", + "shareViaLinkAutoAccept": "\"Keçid vasitəsilə paylaş\" rejimində sorğuları avtomatik qəbul et" + }, + "network": { + "title": "Şəbəkə", + "needRestart": "Parametrləri tətbiq etmək üçün serveri yenidən başladın!", + "server": "Server", + "alias": "Cihazın adı", + "deviceType": "Cihazın tipi", + "deviceModel": "Cihazın modeli", + "port": "Port", + "discoveryTimeout": "Axtarışın zaman aşımı", + "useSystemName": "Sistemin adından istifadə et", + "generateRandomAlias": "Təsadüfi ad yarat", + "portWarning": "Fərdi portdan istifadə etdiyiniz üçün başqa cihazlar tərəfindən aşkarlanmaya bilərsiniz. (defolt: {defaultPort})", + "multicastGroup": "Multicast ünvanı", + "encryption": "Şifrələmə", + "multicastGroupWarning": "Fərdi multicast ünvanından istifadə etdiyiniz üçün başqa cihazlar tərəfindən aşkarlanmaya bilərsiniz. (defolt: {defaultMulticast})", + "network": "Şəbəkə", + "networkOptions": { + "all": "Hamısı", + "filtered": "Filtrlənmiş" + } + }, + "other": { + "title": "Digər", + "support": "LocalSend-i dəstəklə", + "donate": "İanə et", + "privacyPolicy": "Məxfilik siyasəti", + "termsOfUse": "İstifadə şərtləri" + } + }, + "receiveHistoryPage": { + "openFolder": "Qovluğu aç", + "deleteHistory": "Tarixçəni sil", + "title": "Tarixçə", + "entryActions": { + "deleteFromHistory": "Tarixçədən sil", + "open": "Faylı aç", + "showInFolder": "Qovluqda göstər", + "info": "Məlumat" + }, + "empty": "Tarixçə boşdur." + }, + "dialogs": { + "noFiles": { + "title": "Heç bir fayl seçilməyib", + "content": "Zəhmət olmasa, ən azı bir fayl seçin." + }, + "fileInfo": { + "size": "Ölçüsü:", + "path": "Yol:", + "sender": "Göndərən:", + "title": "Fayl məlumatı", + "fileName": "Faylın adı:", + "time": "Vaxt:" + }, + "qr": { + "title": "QR-kod" + }, + "historyClearDialog": { + "content": "Bütün tarixçəni silmək istədiyinizə əminsiniz?", + "title": "Tarixçəni təmizlə" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend lokal şəbəkəni skan etmək icazəsi olmadan digər cihazları tapa bilmir. Zəhmət olmasa, parametrlərdən bu icazəni verin.", + "gotoSettings": "Parametrlər" + }, + "quickSaveFromFavoritesNotice": { + "content": [ + "Fayl sorğuları artıq sevimlilər siyahısındakı cihazlardan avtomatik qəbul edəcək.", + "Xəbərdarlıq! Hal-hazırda bu, tamamilə təhlükəsiz deyil, çünki sevimlilər siyahısındakı istənilən cihazın barmaq izinə sahib olan haker məhdudiyyətsiz sizə fayllar göndərə bilər.", + "Bununla belə, bu seçim lokal şəbəkədəki bütün istifadəçilərin sizə məhdudiyyətsiz fayllar göndərməsinə icazə verməkdən daha təhlükəsizdir." + ], + "title": "@:general.quickSaveFromFavorites" + }, + "pin": { + "title": "PIN-i daxil et" + }, + "sendModeHelp": { + "title": "Göndərmə rejimləri", + "single": "Faylları bir cihaza göndərir. Faylların ötürülməsi başa çatdıqdan sonra seçim silinəcək.", + "multiple": "Faylları birdən çox cihaza göndərir. Faylların ötürülməsi tamamlandıqdan sonra seçim silinməyəcək.", + "link": "LocalSend-i quraşdırmamış alıcılar linki brauzerlərində açaraq seçilmiş faylları endirə bilərlər." + }, + "favoriteDialog": { + "addFavorite": "Əlavə et", + "title": "Sevimlilər", + "noFavorites": "Hələ ki, sevimli cihaz yoxdur." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteEditDialog": { + "titleAdd": "Sevimlilərə əlavə et", + "titleEdit": "Parametrlər", + "name": "Cihazın adı", + "auto": "(avtomatik)", + "ip": "IP ünvan", + "port": "Port" + }, + "addFile": { + "title": "Seçilmişlərə əlavə et", + "content": "Nə əlavə etmək istəyirsiniz?" + }, + "openFile": { + "title": "Faylı aç", + "content": "Qəbul edilmiş faylı açmaq istəyirsiniz?" + }, + "addressInput": { + "title": "Ünvanı daxil et", + "hashtag": "Heşteq", + "ip": "IP ünvan", + "recentlyUsed": "Son istifadə olunan: " + }, + "cancelSession": { + "title": "Fayl transferini ləğv et", + "content": "Siz həqiqətən faylların transferini ləğv etmək istəyirsiniz?" + }, + "cannotOpenFile": { + "title": "Faylı açmaq mümkün olmadı", + "content": "\"{file}\" faylını açmaq mümkün olmadı. Fayl köçürülmüş, adı dəyişdirilmiş və ya silinmiş ola bilər?" + }, + "encryptionDisabledNotice": { + "title": "Şifrələmə deaktiv edilib", + "content": "Əlaqə artıq şifrələnməmiş HTTP protokolu vasitəsilə həyata keçirilir. HTTPS protokolundan istifadə etmək üçün şifrələməni yenidən aktiv edin." + }, + "favoriteDeleteDialog": { + "title": "Sevimlilərdən sil", + "content": "Həqiqətən də \"{name}\" cihazını sevimlilərdən silmək istəyirsiniz?" + }, + "fileNameInput": { + "title": "Faylın adını daxil et", + "original": "Orijinal: {original}" + }, + "messageInput": { + "title": "Mesaj yaz", + "multiline": "Çoxsətirli" + }, + "noPermission": { + "title": "İcazə yoxdur", + "content": "Siz lazımi icazələri verməmisiniz. Zəhmət olmasa, parametrlərdə icazə verin." + }, + "notAvailableOnPlatform": { + "title": "Mövcud deyil", + "content": "Bu funksiya sadəcə burada mövcuddur:" + }, + "quickActions": { + "title": "Sürətli hərəkətlər", + "counter": "Sayğac", + "prefix": "Prefiks", + "padZero": "Sıfırlar ilə doldur", + "sortBeforeCount": "Qabaqcadan əlifba sırası ilə sırala", + "random": "Təsadüfi" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Fayl sorğuları artıq avtomatik qəbul ediləcək. Nəzərə alın ki, lokal şəbəkədəki hər kəs sizə fayl göndərə bilər." + }, + "zoom": { + "title": "URL" + } + }, + "troubleshootPage": { + "title": "Problemləri həll etmə", + "noDiscovery": { + "solution": "Zəhmət olmasa, bütün cihazların eyni Wi-Fi şəbəkəsində olduğundan və eyni konfiqurasiyanı (port, multicast ünvanı, şifrələmə) paylaşdığından əmin olun. Hədəf cihazın IP ünvanını əl ilə yazmağı cəhd edə bilərsiniz. Əgər bu işə yararsa, gələcəkdə avtomatik aşkarlanması üçün bu cihazı sevimlilərə əlavə etməyi nəzərdən keçirin.", + "symptom": "Bu cihaz digər cihazları aşkar edə bilməz." + }, + "subTitle": "Tətbiq gözlənildiyi kimi işləmir? Burada problemlərin ümumi həll yollarını tapa bilərsiniz.", + "firewall": { + "symptom": "Bu cihaz digər cihazlara fayl göndərə bilər, lakin qəbul edə bilməz.", + "solution": "Bu, çox güman ki, firewall problemidir. Siz {port} portunda daxil olan bağlantılara (UDP və TCP) icazə verməklə bunu həll edə bilərsiniz.", + "openFirewall": "Şəbəkə ekranını (firewall) aç" + }, + "noConnection": { + "solution": "Problem hər iki tərəfdə də var? Əgər belədirsə, hər iki cihazın eyni Wi-Fi şəbəkəsində olduğundan və eyni konfiqurasiyanı (port, multicast ünvanı, şifrələmə) paylaşdığından əmin olmalısınız. Wi-Fi şəbəkəsi Access Point (AP) izolyasiyasına görə iştirakçılar arasında ünsiyyətə icazə verməyə bilər. Bu halda, bu seçim ruterdə söndürülməlidir.", + "symptom": "Hər iki cihaz bir-birini aşkarlaya bilmir və faylları paylaşa bilmir." + }, + "solution": "Həll:", + "fixButton": "Avtomatik düzəlt" + }, + "webSharePage": { + "stopping": "Server dayandırılır…", + "pendingRequests": "Gözləyən sorğular: {n}", + "loading": "Server aktivləşdirilir…", + "error": "Serveri aktivləşdirərkən xəta baş verdi.", + "openLink": { + "one": "Bu keçidi brauzerdə aç:", + "other": "Bu keçidlərdən birini brauzerdə aç:" + }, + "title": "Keçid vasitəsilə paylaş", + "requests": "Sorğular", + "noRequests": "Hələ ki, heç bir sorğu yoxdur.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Sorğuları avtomatik qəbul et", + "requirePin": "PIN tələb et", + "pinHint": "Sizin PIN: \"{pin}\"", + "encryptionHint": "LocalSend özü imzalanmış sertifikatdan istifadə edir. Siz onu brauzerinizdə qəbul etməlisiniz." + }, + "networkInterfacesPage": { + "info": "Defolt olaraq, LocalSend bütün mövcud şəbəkə interfeyslərindən istifadə edir. Burada istənilməyən şəbəkələri istisna edə bilərsiniz. Dəyişiklikləri tətbiq etmək üçün serveri yenidən başlatmalısınız.", + "whitelist": "Ağ siyahı", + "blacklist": "Qara siyahı", + "title": "Şəbəkə interfeysləri", + "preview": "Önizlə" + }, + "assetPicker": { + "accessiblePathName": "Əlçatan fayllar", + "sTypeAudioLabel": "Audio", + "loadFailed": "Yükləmə uğursuz oldu", + "accessLimitedAssets": "Məhdud icazə ilə davam et", + "preview": "Önizləmə", + "select": "Seç", + "emptyList": "Boş siyahı", + "unSupportedAssetType": "Dəstəklənməyən fayl tipi.", + "unableToAccessAll": "Cihazdakı bütün fayllara daxil olmaq mümkün deyil", + "viewingLimitedAssetsTip": "Yalnız proqram üçün əlçatan olan fayl və albomlara bax.", + "@info": "Android və iPhone üçün Media seçim aləti üçün tərcümələr", + "confirm": "Təsdiqlə", + "cancel": "İmtina", + "edit": "Düzəliş et", + "gifIndicator": "GIF", + "original": "Orijinal", + "changeAccessibleLimitedAssets": "Əlçatan faylları yeniləmək üçün kliklə", + "accessAllTip": "Tətbiq cihazdakı yalnız bəzi fayllara daxil ola bilər. Sistem parametrlərinə gedin və tətbiqin cihazdakı bütün mediaya daxil olmasına icazə verin.", + "goToSystemSettings": "Sistem parametrlərinə get", + "sTypeImageLabel": "Şəkil", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Digər media", + "sActionPlayHint": "aç", + "sActionPreviewHint": "önizləmə", + "sActionSelectHint": "seç", + "sActionSwitchPathLabel": "yolu dəyiş", + "sActionUseCameraHint": "kamera istifadə et", + "sNameDurationLabel": "müddət", + "sUnitAssetCountLabel": "say" + }, + "sendPage": { + "rejected": "Qəbul edən bu sorğudan imtina etdi.", + "waiting": "Qarşı tərəfdən cavab gözlənilir…", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Qəbul edən başqa sorğu ilə məşğuldur." + }, + "web": { + "fileName": "Fayl adı", + "files": "Fayllar", + "waiting": "@:sendPage.waiting", + "enterPin": "PIN-i daxil et", + "invalidPin": "Səhv PIN", + "tooManyAttempts": "Çoxsaylı cəhd", + "rejected": "Rədd edildi", + "size": "Ölçü" + }, + "tray": { + "closeWindows": "Çıxış", + "@info": "Apple təlimatları \"bağla\" ifadələri ilə bağlı çox ciddidir.", + "open": "@:general.open", + "close": "LocalSend-dən çıx" + }, + "apkPickerPage": { + "apps": "{n} tətbiq", + "title": "Tətbiqlər (APK)", + "excludeSystemApps": "Sistem tətbiqlərini istisna et", + "excludeAppsWithoutLaunchIntent": "Açıla bilməyən tətbiqləri istisna et" + }, + "receivePage": { + "subTitleLink": "sənə keçid göndərdi:", + "canceled": "Göndərən bu sorğunu ləğv etdi.", + "subTitle": { + "one": "sənə fayl göndərmək istəyir", + "other": "sənə {n} fayl göndərmək istəyir" + }, + "subTitleMessage": "sənə mesaj göndərdi:" + }, + "receiveOptionsPage": { + "title": "Seçimlər", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend qovluğu)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Qovluqlar olduğu üçün avtomatik söndürülür." + }, + "progressPage": { + "total": { + "title": { + "canceledSender": "Göndərən tərəfindən dayandırıldı", + "sending": "Ümumi proses ({time})", + "finishedError": "Proses xəta verərək dayandı", + "canceledReceiver": "Qəbul edən tərəfindən dayandırıldı" + }, + "count": "Fayl: {curr} / {n}", + "size": "Ölçü: {curr} / {n}", + "speed": "Sürət: {speed}/s" + }, + "titleSending": "Fayllar göndərilir", + "titleReceiving": "Fayllar qəbul edilir", + "savedToGallery": "Qalereyada saxlanıldı" + }, + "donationPage": { + "info": "LocalSend pulsuz, açıq mənbəlidir və heç bir reklam yoxdur. Proqramı bəyənirsinizsə, ianə ilə inkişafını dəstəkləyə bilərsiniz.", + "title": "İanə et", + "donate": "{amount} ianə et", + "thanks": "Çox təşəkkür edirəm!", + "restore": "Satın almaları bərpa et" + }, + "selectedFilesPage": { + "deleteAll": "Hamısını sil" + }, + "aboutPage": { + "description": [ + "LocalSend internet bağlantısına ehtiyac olmadan lokal şəbəkə üzərindən yaxınlıqdakı cihazlarla faylları və mesajları təhlükəsiz paylaşmağa imkan verən pulsuz, açıq mənbəli proqramdır.", + "Bu proqram Android, iOS, macOS, Windows və Linux sistemlərində mövcuddur. Bütün yükləmə variantlarını rəsmi saytda tapa bilərsiniz." + ], + "author": "Müəllif", + "contributors": "Töhfə verənlər", + "title": "LocalSend haqqında", + "packagers": "Paketləyənlər", + "translators": "Tərcüməçilər" + }, + "changelogPage": { + "title": "Versiya jurnalı" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Fərqli dillərdə fərqli sözlər ola bilər, 1:1 uyğun olmaya bilər" + }, + "sanitization": { + "empty": "Fayl adı boş ola bilməz", + "invalid": "Fayl adında etibarsız simvollar ola bilməz" + } +} diff --git a/app/assets/i18n/bg.json b/app/assets/i18n/bg.json new file mode 100644 index 0000000..2eaaf2b --- /dev/null +++ b/app/assets/i18n/bg.json @@ -0,0 +1,465 @@ +{ + "locale": "Български", + "appName": "LocalSend", + "general": { + "accept": "Приеми", + "accepted": "Прието", + "add": "Добави", + "advanced": "Разширено", + "cancel": "Отказ", + "close": "Затвори", + "confirm": "Потвърди", + "continueStr": "Продължи", + "copy": "Копирай", + "copiedToClipboard": "Копирано в клипборда", + "decline": "Откажи", + "done": "Готово", + "delete": "Изтриване", + "edit": "Редактирай", + "error": "Грешка", + "example": "Пример", + "files": "Файлове", + "finished": "Завършено", + "hide": "Скрий", + "off": "Изключено", + "offline": "Офлайн", + "on": "Включено", + "online": "Онлайн", + "open": "Отвори", + "queue": "Опашка", + "quickSave": "Бързо запазване", + "quickSaveFromFavorites": "Бързо запазване за „Любими“", + "renamed": "Преименуван", + "reset": "Отмяна на промените", + "restart": "Рестартирай", + "settings": "Настройки", + "skipped": "Пропуснато", + "start": "Започни", + "stop": "Спри", + "save": "Запази", + "unchanged": "Непроменено", + "unknown": "Неизвестно", + "noItemInClipboard": "Няма елементи в клипборда." + }, + "receiveTab": { + "title": "Получаване", + "infoBox": { + "ip": "IP:", + "port": "Порт:", + "alias": "Име на устройството:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Любими", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Изпращане", + "selection": { + "title": "Избор", + "files": "Файлове: {files}", + "size": "Размер: {size}" + }, + "picker": { + "file": "Файл", + "folder": "Папка", + "media": "Медия", + "text": "Текст", + "app": "Приложение", + "clipboard": "Постави" + }, + "shareIntentInfo": "Можете също да използвате функцията „Споделяне“ на вашето мобилно устройство, за да избирате файлове по-лесно.", + "nearbyDevices": "Устройства в близост", + "thisDevice": "Това устройство", + "scan": "Търсене на устройства", + "manualSending": "Ръчно изпращане", + "sendMode": "Режим на изпращане", + "sendModes": { + "single": "Единичен получател", + "multiple": "Множество получатели", + "link": "Споделете чрез връзка" + }, + "sendModeHelp": "Обяснение", + "help": "Моля, уверете се, че желаната цел също е в същата Wi-Fi мрежа.", + "placeItems": "Поставете елементи за споделяне." + }, + "settingsTab": { + "title": "Настройки", + "general": { + "title": "Общи", + "brightness": "Тема", + "brightnessOptions": { + "system": "Система", + "dark": "Тъмна", + "light": "Светла" + }, + "color": "Цвят", + "colorOptions": { + "system": "Система", + "oled": "OLED" + }, + "language": "Език", + "languageOptions": { + "system": "Система" + }, + "saveWindowPlacement": "Запази позицията на прозореца след напускане", + "saveWindowPlacementWindows": "Запази позицията на прозореца след излизане", + "minimizeToTray": "Минимизирай в Системна област/Лента с менюта при затваряне", + "launchAtStartup": "Автоматично стартиране след влизане", + "launchMinimized": "Автоматично стартиране: Стартирай скрито", + "showInContextMenu": "Покажи LocalSend в контекстното меню", + "animations": "Анимации" + }, + "receive": { + "title": "Получаване", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Автоматично завършване", + "destination": "Запази в папка", + "downloads": "(Изтегляния)", + "saveToGallery": "Запази медия в галерия", + "saveToHistory": "Запази в история" + }, + "send": { + "title": "Изпращане", + "shareViaLinkAutoAccept": "Автоматично приемане на заявки в режим \"Споделяне чрез връзка\"" + }, + "network": { + "title": "Мрежа", + "needRestart": "Рестартирай сървъра, за да приложите настройките!", + "server": "Сървър", + "alias": "Име на устройството", + "deviceType": "Тип на устройството", + "deviceModel": "Модел на устройството", + "port": "Порт", + "discoveryTimeout": "Изчакване за откриване", + "useSystemName": "Използвай системно име", + "generateRandomAlias": "Създаване на случаен псевдоним", + "portWarning": "Възможно е да не бъдете открити от други устройства, защото използвате персонализиран порт. (default: {defaultPort})", + "encryption": "Шифроване", + "multicastGroup": "Адрес за множествено предаване", + "multicastGroupWarning": "Възможно е да не бъдете открити от други устройства, защото използвате персонализиран адрес за множествено предаване. (default: {defaultMulticast})", + "network": "Мрежа", + "networkOptions": { + "all": "Всички", + "filtered": "Филтриране" + } + }, + "other": { + "title": "Други", + "support": "Поддръжка на LocalSend", + "donate": "Дарение", + "privacyPolicy": "Политика за поверителност", + "termsOfUse": "Условия за ползване" + }, + "advancedSettings": "Разширени настройки" + }, + "troubleshootPage": { + "title": "Отстраняване на неизправност", + "subTitle": "Приложението не работи ли според очакванията? Тук можете да намерите някои общи решения на проблеми.", + "solution": "Решение:", + "fixButton": "Автоматично поправяне", + "firewall": { + "symptom": "Това устройство може да изпраща файлове на други устройства, но други устройства не могат да изпращат файлове на това устройство.", + "solution": "Това най-вероятно е проблем със защитната стена. Можете да разрешите това, като разрешите входящи връзки (UDP и TCP) на порт {port}.", + "openFirewall": "Отворете защитната стена" + }, + "noDiscovery": { + "symptom": "Това устройство не може да открие други устройства.", + "solution": "Моля, уверете се, че всички устройства са в една и съща Wi-Fi мрежа и споделят една и съща конфигурация (порт, адрес за множествено предаване, криптиране). Можете да опитате да въведете ръчно IP адреса на целевото устройство. Ако това работи, обмислете добавянето на това устройство към любими, за да може да бъде автоматично открито в бъдеще." + }, + "noConnection": { + "symptom": "И двете устройства не могат да се откриват, нито могат да споделят файлове.", + "solution": "Проблемът и от двете страни ли съществува? Ако е така, трябва да се уверите, че и двете устройства са в една и съща Wi-Fi мрежа и споделят една и съща конфигурация (порт, адрес за множествено предаване, криптиране). Wi-Fi мрежата може да не позволява комуникация между участниците поради изолация на точката за достъп (AP). В този случай тази опция трябва да бъде деактивирана на рутера." + } + }, + "receiveHistoryPage": { + "title": "История", + "openFolder": "Отвори папка", + "deleteHistory": "Изтриване на историята", + "empty": "Историята е празна.", + "entryActions": { + "open": "Отвори файл", + "showInFolder": "Покажи в папка", + "info": "Информация", + "deleteFromHistory": "Изтриване от историята" + } + }, + "apkPickerPage": { + "title": "Приложения (APK)", + "excludeSystemApps": "Изключване на системни приложения", + "excludeAppsWithoutLaunchIntent": "Изключване на приложения, които не могат да се стартират", + "apps": "{n} Приложения" + }, + "selectedFilesPage": { + "deleteAll": "Изтриване на всички" + }, + "receivePage": { + "subTitle": { + "one": "иска да ви изпрати файл", + "other": "иска да ви изпрати {n} файлове" + }, + "subTitleMessage": "Ви изпрати съобщение:", + "subTitleLink": "Ви изпрати връзка:", + "canceled": "Подателят е отменил заявката." + }, + "receiveOptionsPage": { + "title": "Опции", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(папка на LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Изключва се автоматично, защото има папки." + }, + "sendPage": { + "waiting": "В очакване на отговор…", + "rejected": "Получателят е отхвърлил заявката.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Получателят е зает с друга заявка." + }, + "progressPage": { + "titleSending": "Изпращане на файлове", + "titleReceiving": "Получаване на файлове", + "savedToGallery": "Запазено в Снимки", + "total": { + "title": { + "sending": "Общ напредък ({time})", + "finishedError": "Завършено с грешка", + "canceledSender": "Отменено от подателя", + "canceledReceiver": "Отменено от получателя" + }, + "count": "Файлове: {curr} / {n}", + "size": "Размер: {curr} / {n}", + "speed": "Скорост: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}ч {m}мин", + "days": "{d}д {h}ч {m}мин", + "@hours": "Използвайте „h“ като съкращение за часове и „m“ за минути", + "@days": "Използвайте „d“ за дни, „h“ за часове и „m“ за минути" + } + }, + "webSharePage": { + "title": "Споделете чрез връзка", + "loading": "Стартиране на сървъра…", + "stopping": "Спиране на сървъра…", + "error": "Възникна грешка при стартиране на сървъра.", + "openLink": { + "one": "Отворете тази връзка във вашия браузър:", + "other": "Отворете една от тези връзки във вашия браузър:" + }, + "requests": "Заявки", + "noRequests": "Все още няма заявки.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Автоматично приемане на заявки", + "requirePin": "Изискване на ПИН код", + "pinHint": "ПИН кодът е „{pin}“", + "encryptionHint": "LocalSend използва самоподписан сертификат. Трябва да го приемете във вашия браузър.", + "pendingRequests": "Чакащи заявки: {n}" + }, + "aboutPage": { + "title": "Относно LocalSend", + "description": [ + "LocalSend е безплатно приложение с отворен код, което ви позволява сигурно да споделяте файлове и съобщения с устройства наблизо през вашата локална мрежа, без да се нуждаете от интернет връзка.", + "Това приложение е достъпно за Android, iOS, macOS, Windows и Linux. Можете да намерите всички опции за изтегляне на официалната домашна страница." + ], + "author": "Автор", + "contributors": "Сътрудници", + "packagers": "Опаковчици", + "translators": "Преводачи" + }, + "donationPage": { + "title": "Дарение", + "info": "LocalSend е безплатен, с отворен код и без никакви реклами. Ако харесвате приложението, можете да подкрепите разработката с дарение.", + "donate": "Дарение {amount}", + "thanks": "Благодаря много!", + "restore": "Възстановяване на покупка" + }, + "changelogPage": { + "title": "Дневник на промените" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Различните локали може да имат различни думи, може да не съвпадат 1:1" + }, + "dialogs": { + "addFile": { + "title": "Добави към избора", + "content": "Какво искате да добавите?" + }, + "openFile": { + "title": "Отвори файл", + "content": "Искате ли да отворите получения файл?" + }, + "addressInput": { + "title": "Въведете адрес", + "hashtag": "Хаштаг", + "ip": "IP адрес", + "recentlyUsed": "Наскоро използван: " + }, + "cancelSession": { + "title": "Отмени прехвърлянето на файлове", + "content": "Наистина ли искате да отмените прехвърлянето на файлове?" + }, + "cannotOpenFile": { + "title": "Не може да се отвори файл", + "content": "Не може да се отвори \"{file}\". Този файл бил ли е преместен, преименуван или изтрит?" + }, + "encryptionDisabledNotice": { + "title": "Шифроването е деактивирано", + "content": "Комуникацията вече се осъществява чрез некриптиран HTTP протокол. За да използвате HTTPS протокол, активирайте криптирането отново." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Любими", + "noFavorites": "Все още няма любими устройства.", + "addFavorite": "Добави" + }, + "favoriteDeleteDialog": { + "title": "Изтриване от любими", + "content": "Наистина ли искате да изтриете от любими \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Добави към любими", + "titleEdit": "Настройки", + "name": "Име на устройство", + "auto": "(автоматично)", + "ip": "IP адрес", + "port": "Порт" + }, + "fileInfo": { + "title": "Информация за файла", + "fileName": "Име на файл:", + "path": "Път:", + "size": "Размер:", + "sender": "Подател:", + "time": "Време:" + }, + "fileNameInput": { + "title": "Въведете име на файл", + "original": "Оригинално: {original}" + }, + "historyClearDialog": { + "title": "Изчистване на история", + "content": "Наистина ли искате да изтриете цялата история?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend не може да намери други устройства без разрешение за сканиране на локалната мрежа. Моля, предоставете това разрешение в настройките.", + "gotoSettings": "Настройки" + }, + "messageInput": { + "title": "Вид съобщение", + "multiline": "Многоредов" + }, + "noFiles": { + "title": "Няма избрани файлове", + "content": "Моля, изберете поне един файл." + }, + "noPermission": { + "title": "Няма разрешение", + "content": "Не сте предоставили необходимите разрешения. Моля, предоставете ги в настройките." + }, + "notAvailableOnPlatform": { + "title": "Не е налична", + "content": "Тази функция е достъпна само на:" + }, + "qr": { + "title": "QR код" + }, + "quickActions": { + "title": "Бързи действия", + "counter": "Брояч", + "prefix": "Префикс", + "padZero": "Подложка с нули", + "sortBeforeCount": "Сортирай по азбучен ред предварително (A-Z)", + "random": "Случаен" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Заявките за файлове вече се приемат автоматично. Имайте предвид, че всеки в локалната мрежа може да ви изпраща файлове." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Заявките за файлове вече се приемат автоматично от устройства в списъка ви с любими.", + "Внимание! В момента това не е напълно сигурно, тъй като хакер, който има пръстов отпечатък на всяко устройство от списъка ви с любими, може да ви изпраща файлове без ограничения.", + "Въпреки това, тази опция все още е по-безопасна от разрешаването на всички потребители в локалната мрежа да ви изпращат файлове без ограничения." + ] + }, + "pin": { + "title": "Въведете ПИН код" + }, + "sendModeHelp": { + "title": "Режими на изпращане", + "single": "Изпраща файлове до един получател. Изборът ще бъде изчистен след приключване на прехвърлянето на файлове.", + "multiple": "Изпраща файлове до множество получатели. Изборът няма да бъде изчистен след приключване на прехвърлянето на файлове.", + "link": "Получателите, които нямат инсталиран LocalSend, могат да изтеглят избраните файлове, като отворят връзката в своя браузър." + }, + "zoom": { + "title": "URL адрес" + } + }, + "sanitization": { + "empty": "Името на файла не може да бъде празно", + "invalid": "Името на файла съдържа невалидни знаци" + }, + "tray": { + "@info": "Указанията на Apple са много строги по отношение на формулировката \"близо\".", + "open": "@:general.open", + "close": "Излезте от LocalSend", + "closeWindows": "Изход" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Въведете ПИН код", + "invalidPin": "Невалиден ПИН код", + "tooManyAttempts": "Твърде много опити", + "rejected": "Отхвърлено", + "files": "Файлове", + "fileName": "Име на файл", + "size": "Размер" + }, + "assetPicker": { + "@info": "Преводи за инструмента за избор на Медия за Android и iPhone", + "confirm": "Потвърди", + "cancel": "Отказ", + "edit": "Редактирай", + "gifIndicator": "GIF", + "loadFailed": "Неуспешно зареждане", + "original": "Произход", + "preview": "Преглед", + "select": "Избери", + "emptyList": "Празен списък", + "unSupportedAssetType": "Неподдържан тип файл.", + "unableToAccessAll": "Няма достъп до всички файлове на устройството", + "viewingLimitedAssetsTip": "Преглеждайте само файлове и албуми, достъпни за приложението.", + "changeAccessibleLimitedAssets": "Щракнете, за да актуализирате достъпните файлове", + "accessAllTip": "Приложението има достъп само до някои файлове на устройството. Отидете в системните настройки и разрешете на приложението достъп до всички медии на устройството.", + "goToSystemSettings": "Отидете в системните настройки", + "accessLimitedAssets": "Продължете с ограничен достъп", + "accessiblePathName": "Достъпни файлове", + "sTypeAudioLabel": "Аудио", + "sTypeImageLabel": "Изображение", + "sTypeVideoLabel": "Видео", + "sTypeOtherLabel": "Друга медия", + "sActionPlayHint": "изпълни", + "sActionPreviewHint": "преглед", + "sActionSelectHint": "избери", + "sActionSwitchPathLabel": "промяна на пътя", + "sActionUseCameraHint": "използвай камера", + "sNameDurationLabel": "продължителност", + "sUnitAssetCountLabel": "брой" + }, + "networkInterfacesPage": { + "preview": "Преглед", + "whitelist": "Бял списък", + "blacklist": "Черен списък", + "title": "Мрежови интерфейси", + "info": "По подразбиране, LocalSend използва всички налични мрежови интерфейси. Тук можете да изключите нежелани мрежи. Трябва да рестартирате сървъра, за да приложите промените." + } +} diff --git a/app/assets/i18n/bn.json b/app/assets/i18n/bn.json new file mode 100644 index 0000000..9aa0390 --- /dev/null +++ b/app/assets/i18n/bn.json @@ -0,0 +1,535 @@ +{ + "locale": "বাংলা", + "appName": "লোকালসেন্ড", + "general": { + "accept": "অ্যাকসেপ্ট করুন", + "accepted": "অ্যাকসেপ্টেড", + "add": "অ্যাড করুন", + "advanced": "আডভান্স", + "cancel": "ক্যানসেল করুন", + "close": "বন্ধ করুন", + "confirm": "কনফার্ম করুন", + "continueStr": "চালিয়ে যান", + "copy": "কপি করুন", + "copiedToClipboard": "ক্লিপবোর্ডে কপি করা হয়েছে", + "decline": "প্রত্যাখ্যান করুন", + "done": "সম্পন্ন", + "delete": "ডিলিট", + "edit": "এডিট", + "error": "ভুল হয়েছে", + "example": "উদাহরণ", + "files": "ফাইল গুলো", + "finished": "শেষ হয়েছে", + "hide": "হাইড করুন", + "off": "বন্ধ", + "offline": "অফলাইন", + "on": "চালু", + "online": "অনলাইন", + "open": "খুলুন", + "queue": "কিউ", + "quickSave": "কুইক সেভ করুন", + "quickSaveFromFavorites": "\"ফেভারিট\"দের জন্য কুইক সেভ করুন", + "renamed": "নাম পরিবর্তন করা হয়েছে", + "reset": "রিসেট করুন", + "restart": "পুনরায় চালু করুন", + "settings": "সেটিংস", + "skipped": "স্কিপ করা হয়েছে", + "start": "শুরু করুন", + "stop": "বন্ধ করুন", + "save": "সেভ করুন", + "unchanged": "অপরিবর্তিত", + "unknown": "আননোন", + "noItemInClipboard": "ক্লিপবোর্ডে কোনো আইটেম নেই।" + }, + "receiveTab": { + "title": "রিসিভ", + "infoBox": { + "ip": "আইপি:", + "port": "পোর্ট:", + "alias": "ডিভাইসের নাম:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "ফেভারিট", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "সেন্ড", + "selection": { + "title": "সিলেকশন", + "files": "ফাইলসমূহ: {files}", + "size": "সাইজ: {size}" + }, + "picker": { + "file": "ফাইল", + "folder": "ফোল্ডার", + "media": "মিডিয়া", + "text": "টেক্সট", + "app": "আবেদন", + "clipboard": "ক্লিপবোর্ড পেস্ট" + }, + "shareIntentInfo": "আরো সহজে ফাইল সিলেক্ট করার জন্য আপনার মোবাইলের \"Share\" ফিচারটি ব্যবহার করতে পারেন।", + "nearbyDevices": "কাছাকাছি থাকা ডিভাইস", + "thisDevice": "এই ডিভাইস", + "scan": "ডিভাইস স্ক্যান করুন", + "manualSending": "ম্যানুয়াল সেন্ডিং", + "sendMode": "সেন্ড মোড", + "sendModes": { + "single": "একজন রিসিভার", + "multiple": "একাধিক রিসিভার", + "link": "লিঙ্কের মাধ্যমে শেয়ার করুন" + }, + "sendModeHelp": "ব্যাখ্যা", + "help": "অনুগ্রহ করে নিশ্চিত করুন যে পছন্দসই লক্ষ্যটিও একই ওয়াইফাই নেটওয়ার্কে রয়েছে।", + "placeItems": "শেয়ার করার জন্য আইটেম রাখুন।" + }, + "settingsTab": { + "title": "সেটিংস", + "general": { + "title": "জেনারেল", + "brightness": "থিম", + "brightnessOptions": { + "system": "সিস্টেম", + "dark": "ডার্ক", + "light": "লাইট" + }, + "color": "অ্যাপ কালার", + "colorOptions": { + "system": "সিস্টেম", + "oled": "ওলেড" + }, + "language": "ভাষা", + "languageOptions": { + "system": "সিস্টেম" + }, + "saveWindowPlacement": "বের হোন: উইন্ডো প্লেসমেন্ট সেভ করুন", + "saveWindowPlacementWindows": "বের হবার পরে উইন্ডোর অবস্থান সেভ করুন", + "minimizeToTray": "বের হোন: ট্রেতে মিনিমাইজ করুন", + "launchAtStartup": "লগইন করার পরে অটোস্টার্ট করুন", + "launchMinimized": "অটোস্টার্ট: হিডেন রেখে শুরু করুন", + "showInContextMenu": "কনটেক্সট মেনুতে LocalSend দেখান", + "animations": "অ্যানিমেশন" + }, + "receive": { + "title": "রিসিভ", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "অটো ফিনিশ", + "destination": "ডেস্টিনেশন", + "downloads": "(Downloads)", + "saveToGallery": "মিডিয়া গ্যালারিতে সেভ করুন", + "saveToHistory": "হিস্ট্রি সেভ করুন" + }, + "send": { + "title": "সেন্ড", + "shareViaLinkAutoAccept": "\"Share via link\" মোডের রিকুয়েস্ট অটো এক্সেপ্ট করুন" + }, + "network": { + "title": "নেটওয়ার্ক", + "needRestart": "সেটিংস অ্যাপ্লাই করতে সার্ভার রিস্টার্ট করুন!", + "server": "সার্ভার", + "alias": "ডিভাইসের নাম", + "deviceType": "ডিভাইসের ধরন", + "deviceModel": "ডিভাইস মডেল", + "port": "পোর্ট", + "network": "নেটওয়ার্ক", + "networkOptions": { + "all": "সব", + "filtered": "ফিল্টারড" + }, + "discoveryTimeout": "ডিসকভারি টাইমআউট", + "useSystemName": "সিস্টেমের নাম ব্যবহার করুন", + "generateRandomAlias": "এলিয়াস তৈরি করুন", + "portWarning": "আপনি একটি কাস্টম পোর্ট ব্যবহার করছেন, তাই অন্য ডিভাইস থেকে এই ডিভাইসকে খুঁজে নাও পাওয়া যেতে পারে। (default: {defaultPort})", + "encryption": "এনক্রিপশন", + "multicastGroup": "মাল্টিকাস্ট", + "multicastGroupWarning": "আপনি একটি কাস্টম মাল্টিকাস্ট অ্যাড্রেস ব্যবহার করছেন যেই কারণে আপনি অন্য ডিভাইস দ্বারা স্ক্যান নাও হতে পারেন। (default: {defaultMulticast})" + }, + "other": { + "title": "অন্যান্য", + "support": "লোকাল সেন্ডকে সাপোর্ট করুন", + "donate": "ডোনেট", + "privacyPolicy": "গোপনীয়তা নীতি", + "termsOfUse": "ব্যবহারের শর্তাবলী" + }, + "advancedSettings": "আডভান্স সেটিংস" + }, + "troubleshootPage": { + "title": "ট্রাবলশুট", + "subTitle": "অ্যাপটি আশানুরূপ কাজ না করলে, এখানে আপনি কিছু সাধারণ সমাধান পেতে পারেন।", + "solution": "সমাধান:", + "fixButton": "অটোমেটিকালি ঠিক করুন", + "firewall": { + "symptom": "এই অ্যাপটি অন্য ডিভাইসে ফাইল পাঠাতে পারে কিন্তু অন্য ডিভাইস এই ডিভাইসে ফাইল পাঠাতে পারে না।", + "solution": "এটি সম্ভবত একটি ফায়ারওয়াল সমস্যা। আপনি পোর্টে ইনকামিং কানেকশন (UDP এবং TCP) পারমিশন দিয়ে এটি ঠিক করতে পারেন {port}.", + "openFirewall": "ফায়ারওয়াল খুলুন" + }, + "noDiscovery": { + "symptom": "এই ডিভাইসটি অন্য ডিভাইস খুঁজতে পারতেছে না।", + "solution": "সব ডিভাইস একই ওয়াই-ফাই নেটওয়ার্কে আছে তা নিশ্চিত করুন এবং একই কনফিগারেশন ব্যাবহার করছে (পোর্ট, মাল্টিকাস্ট অ্যাড্রেস, এনক্রিপশন)। টার্গেট ডিভাইসের আইপি ম্যানুয়ালি টাইপ করতে পারেন। যদি এটা কাজ করে, তাহলে ভবিষ্যতে এই ডিভাইসটি অটোমেটিকালি ডিসকভার করা হবে, তা নিশ্চিত করতে এই ডিভাইসটি ফেভারিটে অ্যাড করুন।" + }, + "noConnection": { + "symptom": "উভয় ডিভাইস একে অপরকে আবিষ্কার করতে পারে না বা তারা ফাইল ভাগ করতে পারে না।", + "solution": "সমস্যা কি দুই দিকেই আছে? তারপরে আপনাকে নিশ্চিত করতে হবে যে উভয় ডিভাইস একই ওয়াইফাই নেটওয়ার্কে রয়েছে এবং একই কনফিগারেশন (পোর্ট, মাল্টিকাস্ট ঠিকানা, এনক্রিপশন) ভাগ করে নিয়েছে। ওয়াইফাই অংশগ্রহণকারীদের মধ্যে যোগাযোগের অনুমতি নাও দিতে পারে। এই ক্ষেত্রে, এই বিকল্পটি রাউটারে সক্রিয় করা আবশ্যক।" + } + }, + "networkInterfacesPage": { + "title": "নেটওয়ার্ক ইন্টারফেস", + "info": "LocalSend সব অ্যাভেলেবেল নেটওয়ার্ক ইন্টারফেস ব্যবহার করে। আপনি এখানে অপ্রয়োজনীয় নেটওয়ার্ক বাদ দিতে পারেন। কোন পরিবর্তন আনলে সার্ভারটি পুনরায় চালু করতে হবে।", + "preview": "প্রিভিউ", + "whitelist": "হোয়াইটলিস্ট", + "blacklist": "ব্ল্যাকলিস্ট" + }, + "receiveHistoryPage": { + "title": "হিস্ট্রি", + "openFolder": "ফোল্ডার খুলুন", + "deleteHistory": "হিস্ট্রি ক্লিয়ার করুন", + "empty": "হিস্ট্রি খালি।", + "entryActions": { + "open": "ফাইল খুলুন", + "showInFolder": "ফোল্ডারে দেখুন", + "info": "ইনফো", + "deleteFromHistory": "হিস্ট্রি থেকে মুছে ফেলুন" + } + }, + "apkPickerPage": { + "title": "অ্যাপস (এপিকে)", + "excludeSystemApps": "সিস্টেম অ্যাপ বাদ দিন", + "excludeAppsWithoutLaunchIntent": "অ-লঞ্চযোগ্য অ্যাপগুলি বাদ দিন", + "apps": "{n} অ্যাপ্স" + }, + "selectedFilesPage": { + "deleteAll": "সব ডিলিট করুন" + }, + "receivePage": { + "subTitle": { + "one": "আপনাকে একটি ফাইল পাঠাতে চায়", + "other": "আপনাকে {n}টি ফাইল পাঠাতে চায়" + }, + "subTitleMessage": "আপনাকে একটি মেসেজ পাঠিয়েছে:", + "subTitleLink": "আপনাকে একটি লিঙ্ক পাঠিয়েছে:", + "canceled": "সেন্ডার রিকুয়েস্টটি ক্যানসেল করেছে।" + }, + "receiveOptionsPage": { + "title": "অপশনসমূহ", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(@:appName folder)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "অটোমেটিকালি বন্ধ কারণ ডিরেক্টরি আছে." + }, + "sendPage": { + "waiting": "রেস্পন্সের অপেক্ষায়…", + "rejected": "রিসিভার রিকুয়েস্টটি ক্যানসেল করেছে।", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "রিসিভার রিকুয়েস্টটি আরেকটি রিকুয়েস্টে ব্যস্ত।" + }, + "progressPage": { + "titleSending": "ফাইল সেন্ড হচ্ছে", + "titleReceiving": "ফাইল রিসিভ করা হচ্ছে", + "savedToGallery": "Photos এ সেভ করা হয়েছে", + "total": { + "title": { + "sending": "মোট অগ্রগতি ({time})", + "finishedError": "ত্রুটি সহ সমাপ্ত হয়েছে", + "canceledSender": "সেন্ডারের দ্বারা ক্যানসেল করা হয়েছে", + "canceledReceiver": "রিসিভার দ্বারা ক্যানসেল করা হয়েছে" + }, + "count": "ফাইলগুলি: {curr} / {n}", + "size": "সাইজ: {curr} / {n}", + "speed": "স্পীড: {speed}/s" + }, + "remainingTime": { + "hours": "{h}ঘণ্টা {m}মিনিট", + "days": "{d}দিন {h}ঘণ্টা {m}মিনিট", + "@hours": "ঘন্টার জন্য 'h' এবং মিনিটের জন্য 'm' ব্যবহার করুন", + "@days": "দিনের জন্য 'd', ঘন্টার জন্য 'h' এবং মিনিটের জন্য 'm' ব্যবহার করুন", + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}" + } + }, + "webSharePage": { + "title": "লিঙ্কের মাধ্যমে শেয়ার করুন", + "loading": "সার্ভার চালু করা হচ্ছে…", + "stopping": "সার্ভার বন্ধ করা হচ্ছে…", + "error": "সার্ভার চালু করার সময় একটি সমস্যা হয়েছে৷", + "openLink": { + "one": "ব্রাউজারে এই লিঙ্কটি খুলুন:", + "other": "ব্রাউজারে এই লিঙ্কগুলির একটি খুলুন:" + }, + "requests": "রিকুয়েস্ট", + "noRequests": "এখনো কোনো রিকুয়েস্ট নেই.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "রিকুয়েস্ট অটো এক্সেপ্ট করুন", + "requirePin": "পিন প্রয়োজন", + "pinHint": "পিনটি \"{pin}\"", + "encryptionHint": "LocalSend একটি সেল্ফ-সাইন্ড সার্টিফিকেট ব্যবহার করে। আপনাকে ব্রাউজারে এটি একসেপ্ট করতে হবে।", + "pendingRequests": "রিকুয়েস্ট অপেক্ষারত: {n}" + }, + "aboutPage": { + "title": "LocalSend সম্পর্কে", + "description": [ + "LocalSend হল একটি ফ্রী, ওপেন সোর্স অ্যাপ যা ইন্টারনেট ছাড়াই আপনার লোকাল নেটওয়ার্কের ডিভাইসগুলির সাথে ফাইল এবং মেসেজ নিরাপদে শেয়ার করতে দেয়৷", + "এই অ্যাপটি Android, iOS, macOS, Windows এবং Linux-এ অ্যাভেলেবেল। আপনি অফিসিয়াল হোমপেজে সব ডাউনলোড অপশন খুঁজে পাবেন।" + ], + "author": "লেখক", + "contributors": "অবদানকারী", + "packagers": "প্যাকেজেস", + "translators": "অনুবাদক" + }, + "donationPage": { + "title": "ডোনেট", + "info": "LocalSend ফ্রী, ওপেন সোর্স এবং কোনো অ্যাড ছাড়াই। আপনি যদি অ্যাপটি পছন্দ করেন তবে আপনি একটি ডোনেশন দিয়ে ডেভেলপমেন্টকে সাপোর্ট করতে পারেন।", + "donate": "ডোনেট {amount}", + "thanks": "আপনাকে অনেক ধন্যবাদ!", + "restore": "পারচেজ রিস্টোর" + }, + "changelogPage": { + "title": "চেঞ্জলগ" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "ভিন্ন জায়গার ভিন্ন শব্দ থাকতে পারে, একেবারে 1:1 মিলতে নাও পারে", + "adjectives": [ + "আরাধ্য", + "সুন্দর", + "বড়", + "উজ্জ্বল", + "পরিষ্কার", + "চতুর", + "ঠান্ডা", + "চতুর", + "ধূর্ত", + "নির্ধারিত", + "অনলস", + "দক্ষ", + "অসাধারণ", + "দ্রুত", + "ভালো", + "তাজা", + "ভাল", + "চমৎকার", + "দারুণ", + "সুদর্শন", + "গরম", + "দয়াময়", + "সুন্দর", + "রহস্যময়", + "পরিচ্ছন্ন", + "সুন্দর", + "রোগী", + "সুন্দর", + "ক্ষমতাশালী", + "ধনী", + "গোপন", + "স্মার্ট", + "কঠিন", + "বিশেষ", + "কৌশলগত", + "শক্তিশালী", + "পরিপাটি", + "জ্ঞানী" + ], + "fruits": [ + "আপেল", + "অ্যাভোকাডো", + "কলা", + "ব্ল্যাকবেরি", + "ব্লুবেরি", + "ব্রকলি", + "গাজর", + "চেরি", + "নারকেল", + "আঙ্গুর", + "লেবু", + "লেটুস", + "আম", + "তরমুজ", + "মাশরুম", + "পেঁয়াজ", + "কমলা", + "পেঁপে", + "পীচ", + "নাশপাতি", + "আনারস", + "আলু", + "কুমড়া", + "রাস্পবেরি", + "স্ট্রবেরি", + "টমেটো" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "সিলেকশনে অ্যাড করুন", + "content": "আপনি কি অ্যাড করতে চান?" + }, + "openFile": { + "title": "ফাইল খুলুন", + "content": "আপনি কি ফাইলটি খুলতে চান?" + }, + "addressInput": { + "title": "এড্রেস লিখুন", + "hashtag": "হ্যাশট্যাগ", + "ip": "আইপি অ্যাড্রেস", + "recentlyUsed": "সম্প্রতি ব্যবহৃত: " + }, + "cancelSession": { + "title": "ফাইল ট্রান্সফার ক্যানসেল করুন", + "content": "আপনি কি ফাইল ট্রান্সফার ক্যানসেল করতে চান?" + }, + "cannotOpenFile": { + "title": "ফাইলটি খোলা যাচ্ছে না", + "content": "\"{file}\" খোলা যায়নি। এই ফাইলটি কি সরানো হয়েছে, নাম পরিবর্তন বা মুছে ফেলা হয়েছে?" + }, + "encryptionDisabledNotice": { + "title": "এনক্রিপশন বন্ধ করা হয়েছে", + "content": "এখন কমিউনিকেশন আনএনক্রিপ্টেড HTTP প্রটোকলের মাধ্যমে করা হচ্ছে। HTTPS ব্যবহার করার জন্য আবার এনক্রিপশন চালু করুন।" + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "ফেভারিট", + "noFavorites": "এখনও কোন ফেভারিট ডিভাইস নেই.", + "addFavorite": "যোগ করুন" + }, + "favoriteDeleteDialog": { + "title": "যোগ করুনযোগ করুন", + "content": "আপনি কি সত্যিই ফেভারিট থেকে মুছে ফেলতে চান \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "ফেভারিটে অ্যাড করুন", + "titleEdit": "এডিট করুন", + "name": "এলিয়াস", + "auto": "(auto)", + "ip": "আইপি অ্যাড্রেস", + "port": "পোর্ট" + }, + "fileInfo": { + "title": "ফাইল ইনফো", + "fileName": "ফাইলের নাম:", + "path": "পাথ:", + "size": "সাইজ:", + "sender": "সেন্ডার:", + "time": "সময়:" + }, + "fileNameInput": { + "title": "ফাইলের নাম লিখুন", + "original": "অরিজিনাল: {original}" + }, + "historyClearDialog": { + "title": "হিস্ট্রি ক্লিয়ার করুন", + "content": "আপনি কি সব হিস্ট্রি ক্লিয়ার চান?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "লোকাল নেটওয়ার্ক স্ক্যান করার পারমিশন ছাড়া LocalSend অন্য ডিভাইস খুঁজে পায় না। অনুগ্রহ করে সেটিংসে এই পারমিশনটি দিন।", + "gotoSettings": "সেটিংস" + }, + "messageInput": { + "title": "মেসেজ লিখুন", + "multiline": "মাল্টিলাইন" + }, + "noFiles": { + "title": "কোনো ফাইল সিলেক্ট করা হয়নি", + "content": "অন্তত একটি ফাইল সিলেক্ট করুন।" + }, + "noPermission": { + "title": "পারমিশন নেই", + "content": "আপনি প্রয়োজনীয় পারমিশন প্রদান করেননি। অনুগ্রহ করে সেটিংসে তাদের পারমিশন দিন।" + }, + "notAvailableOnPlatform": { + "title": "পাওয়া যায় নি", + "content": "এই ফিচার শুধুমাত্র উপলব্ধ:" + }, + "qr": { + "title": "QR কোড" + }, + "quickActions": { + "title": "কুইক অ্যাকশনস", + "counter": "কাউন্টার", + "prefix": "উপসর্গ", + "padZero": "শূন্য সহ প্যাড", + "sortBeforeCount": "আগে থেকে বর্ণানুক্রমিকভাবে সাজান", + "random": "র‍্যান্ডম" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "ফাইল অনুরোধ অটোমেটিকালি এক্সেপ্ট করা হয়। সচেতন থাকুন যেনা লোকাল নেটওয়ার্কের সবাই আপনাকে ফাইল পাঠাতে পারে।" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "আপনার ফেভারিট তালিকায় থাকা ডিভাইস থেকে ফাইল অটোমেটিক রিসিভ করা হয়।", + "সতর্কতা! বর্তমানে, এটা সম্পূর্ণভাবে নিরাপদ নয়, কোন হ্যাকারের কাছে আপনার ফেভারিট তালিকার কোনও ডিভাইসের ফিঙ্গারপ্রিন্ট থাকে তাহলে সে সীমাবদ্ধতা ছাড়াই আপনাকে ফাইল পাঠাতে পারে।", + "তবে, এই অপশনটি এখনও লোকাল নেটওয়ার্কের ব্যবহারকারীদের কোনও সীমাবদ্ধতা ছাড়াই আপনাকে ফাইল পাঠাতে দেয়।" + ] + }, + "pin": { + "title": "পিন দিন" + }, + "sendModeHelp": { + "title": "সেন্ড মোড", + "single": "একজন প্রাপকের কাছে ফাইল পাঠায়। ফাইল স্থানান্তর সমাপ্ত হওয়ার পরে নির্বাচন পরিষ্কার করা হবে.", + "multiple": "একাধিক প্রাপককে ফাইল পাঠায়। নির্বাচন সাফ করা হবে না।", + "link": "যাদের LocalSend ইনস্টল করা নেই তারা ব্রাউজারে লিঙ্কটি খুলে ফাইলগুলি ডাউনলোড করতে পারবেন।" + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "ফাইলের নাম খালি রাখা যাবে না", + "invalid": "ফাইলের নামে ইনভেলিড অক্ষর রয়েছে" + }, + "tray": { + "@info": "অ্যাপলের নির্দেশিকাগুলি 'ক্লোজ' শব্দের বিষয়ে খুবই কঠোর।", + "open": "@:general.open", + "close": "LocalSend থেকে বের হোন", + "closeWindows": "সব উইন্ডো বন্ধ করুন" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "পিন দিন", + "invalidPin": "পিনটি সঠিক নয়", + "tooManyAttempts": "অনেক বার ভুল পিন দেওয়া হয়েছে", + "rejected": "রিজেক্টেড", + "files": "ফাইলস", + "fileName": "ফাইলের নাম", + "size": "সাইজ" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "কনফার্ম করুন", + "cancel": "ক্যানসেল করুন", + "edit": "এডিট করুন", + "gifIndicator": "জিফ", + "loadFailed": "লোড করা যায়নি", + "original": "অরিজিনাল", + "preview": "প্রিভিউ", + "select": "সিলেক্ট করুন", + "emptyList": "খালি লিস্ট", + "unSupportedAssetType": "আনসাপোর্টেড ফাইল টাইপ.", + "unableToAccessAll": "ডিভাইসে সমস্ত ফাইল অ্যাক্সেস পাওয়া যায়নি", + "viewingLimitedAssetsTip": "শুধুমাত্র অ্যাপে অ্যাক্সেসযোগ্য ফাইল এবং অ্যালবাম দেখুন.", + "changeAccessibleLimitedAssets": "অ্যাক্সেসযোগ্য ফাইল আপডেট করতে ট্যাপ করুন", + "accessAllTip": "অ্যাপ শুধুমাত্র ডিভাইসে কিছু ফাইল অ্যাক্সেস করতে পারে। সিস্টেম সেটিংসে যান এবং অ্যাপটিকে ডিভাইসের সমস্ত মিডিয়া অ্যাক্সেস করার পারমিশন দিন।", + "goToSystemSettings": "সিস্টেম সেটিংসে যান", + "accessLimitedAssets": "সীমিত অ্যাক্সেস দিয়ে চালিয়ে যান", + "accessiblePathName": "অ্যাক্সেসযোগ্য ফাইল", + "sTypeAudioLabel": "অডিও", + "sTypeImageLabel": "ছবি", + "sTypeVideoLabel": "ভিডিও", + "sTypeOtherLabel": "অন্যান্য মিডিয়া", + "sActionPlayHint": "প্লে", + "sActionPreviewHint": "প্রিভিউ", + "sActionSelectHint": "নির্বাচন করুন", + "sActionSwitchPathLabel": "পাথ পরিবর্তন", + "sActionUseCameraHint": "ক্যামেরা ব্যবহার করুন", + "sNameDurationLabel": "ডিউরেশন", + "sUnitAssetCountLabel": "কাউন্ট" + } +} diff --git a/app/assets/i18n/ca.json b/app/assets/i18n/ca.json new file mode 100644 index 0000000..a022b08 --- /dev/null +++ b/app/assets/i18n/ca.json @@ -0,0 +1,527 @@ +{ + "locale": "Català", + "appName": "LocalSend", + "general": { + "accept": "Accepta", + "accepted": "Acceptat", + "add": "Afegeix", + "advanced": "Avançades", + "cancel": "Cancel·la", + "close": "Tanca", + "confirm": "Confirma", + "continueStr": "Continua", + "copy": "Copia", + "copiedToClipboard": "S'ha copiat al porta-retalls", + "decline": "Rebutja", + "done": "Fet", + "delete": "Elimina", + "edit": "Edita", + "error": "Error", + "example": "Exemple", + "files": "Fitxers", + "finished": "Finalitzat", + "hide": "Amaga", + "off": "Desactivat", + "offline": "Desconnectat", + "on": "Activat", + "online": "En línia", + "open": "Obre", + "queue": "Cua", + "quickSave": "Desat ràpid", + "quickSaveFromFavorites": "Desat ràpid per als «Preferits»", + "renamed": "Canvia el nom", + "reset": "Desfés els canvis", + "restart": "Reinicia", + "settings": "Configuració", + "skipped": "Omès", + "start": "Inicia", + "stop": "Atura", + "save": "Desa", + "unchanged": "Sense canvis", + "unknown": "Desconegut", + "noItemInClipboard": "No hi ha elements al porta-retalls." + }, + "receiveTab": { + "title": "Recepció", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Nom del dispositiu:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Preferits", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Envia", + "selection": { + "title": "Selecció", + "files": "Fitxers: {files}", + "size": "Mida: {size}" + }, + "picker": { + "file": "Fitxer", + "folder": "Carpeta", + "media": "Multimèdia", + "text": "Text", + "app": "Aplicació", + "clipboard": "Enganxa" + }, + "shareIntentInfo": "També podeu utilitzar l'opció «Comparteix» del vostre dispositiu mòbil per a seleccionar fitxers d'una manera més fàcil.", + "nearbyDevices": "Dispositius propers", + "thisDevice": "Aquest dispositiu", + "scan": "Cerca dispositius", + "manualSending": "Enviament manual", + "sendMode": "Mode d'enviament", + "sendModes": { + "single": "Destinatari únic", + "multiple": "Múltiples destinataris", + "link": "Comparteix via enllaç" + }, + "sendModeHelp": "Explicació", + "help": "Comproveu que el destinatari està en la mateixa xarxa Wi-Fi.", + "placeItems": "Col·loqueu els elements per compartir." + }, + "settingsTab": { + "title": "Configuració", + "general": { + "title": "General", + "brightness": "Tema", + "brightnessOptions": { + "system": "Sistema", + "dark": "Fosc", + "light": "Clar" + }, + "color": "Color", + "colorOptions": { + "system": "Sistema", + "oled": "OLED" + }, + "language": "Llengua", + "languageOptions": { + "system": "Sistema" + }, + "saveWindowPlacement": "Desa la posició de la finestra en sortir", + "saveWindowPlacementWindows": "Desa la posició de la finestra després de sortir", + "minimizeToTray": "Minimitza a la safata del sistema/barra de menú en tancar", + "launchAtStartup": "Inici automàtic en iniciar la sessió", + "launchMinimized": "Inici automàtic: Inici minimitzat", + "showInContextMenu": "Mostra el LocalSend al menú contextual", + "animations": "Animacions" + }, + "receive": { + "title": "Recepció", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Finalització automàtica", + "destination": "Desa en la carpeta", + "downloads": "(Baixades)", + "saveToGallery": "Desa els fitxers multimèdia a la galeria", + "saveToHistory": "Desa a l'historial" + }, + "send": { + "title": "Enviament", + "shareViaLinkAutoAccept": "Accepta peticions de manera automàtica en el mode «Comparteix via enllaç»" + }, + "network": { + "title": "Xarxa", + "needRestart": "Reinicieu el servidor per a aplicar la configuració.", + "server": "Servidor", + "alias": "Nom del dispositiu", + "deviceType": "Tipus de dispositiu", + "deviceModel": "Model del dispositiu", + "port": "Port", + "discoveryTimeout": "Temps d'espera de descobriment", + "useSystemName": "Utilitza el nom del sistema", + "generateRandomAlias": "Genera un àlies aleatori", + "portWarning": "Altres dispositius podrien no detectar-vos perquè utilitzeu un port personalitzat. (predefinit: {defaultPort})", + "encryption": "Xifratge", + "multicastGroup": "Adreça del Multicast", + "multicastGroupWarning": "Altres dispositius podrien no detectar-vos perquè utilitzeu una adreça multicast personalitzada. (predefinida: {defaultMulticast})", + "network": "Xarxa", + "networkOptions": { + "all": "Totes", + "filtered": "Filtrades" + } + }, + "other": { + "title": "Altres", + "support": "Doneu suport al LocalSend", + "donate": "Donació", + "privacyPolicy": "Política de privadesa", + "termsOfUse": "Condicions d'ús" + }, + "advancedSettings": "Configuració avançada" + }, + "troubleshootPage": { + "title": "Solució de problemes", + "subTitle": "L'aplicació no funciona com s'espera? Aquí podeu trobar solucions als problemes més comuns.", + "solution": "Solució:", + "fixButton": "Corregeix de manera automàtica", + "firewall": { + "symptom": "Aquest dispositiu pot enviar fitxers a d'altres, però altres dispositius no poden enviar fitxers a aquest.", + "solution": "El més probable és que sigui un problema del tallafocs. Podeu solucionar-ho permetent les connexiions entrants (UDP i TCP) al port {port}.", + "openFirewall": "Obre el tallafocs" + }, + "noDiscovery": { + "symptom": "Aquest dispositiu no pot descobrir altres dispositius.", + "solution": "Comproveu que tots els dispositius estan a la mateixa xarxa Wi-Fi i tenen la mateixa configuració (port, adreça multicast i xifratge). Podeu provar d'escriure l'adreça IP del dispositiu de destí de manera manual. Si això funciona, considereu afegir aquest dispositiu als preferits perquè pugui ser descobert automàticament en un futur." + }, + "noConnection": { + "symptom": "Cap dels dos dispositius no poden trobar-se ni compartir fitxers.", + "solution": "Existeix el problema als dos costats? Si és així, cal que comproveu que els dispositius estan a la mateixa xarxa Wi-Fi i comparteixen la mateixa configuració (port, adreça multicast i xifratge). La Wi-Fi podria no permetre la comunicació entre els participants a causa de l'aïllament del punt d'accés (Access Point, AP). En aquest cas, cal que desactiveu aquesta opció a l'encaminador." + } + }, + "receiveHistoryPage": { + "title": "Historial", + "openFolder": "Obre la carpeta", + "deleteHistory": "Elimina l'historial", + "empty": "L'historial està buit.", + "entryActions": { + "open": "Obre el fitxer", + "showInFolder": "Mostra a la carpeta", + "info": "Informació", + "deleteFromHistory": "Elimina de l'historial" + } + }, + "apkPickerPage": { + "title": "Aplicacions (APK)", + "excludeSystemApps": "Exclou les aplicacions del sistema", + "excludeAppsWithoutLaunchIntent": "Exclou les aplicacions no executables", + "apps": "{n} Aplicacions" + }, + "selectedFilesPage": { + "deleteAll": "Elimina-ho tot" + }, + "receivePage": { + "subTitle": { + "one": "vol enviar-vos un fitxer", + "other": "vol enviar-vos {n} fitxers" + }, + "subTitleMessage": "us ha enviat un missatge:", + "subTitleLink": "us ha enviat un enllaç:", + "canceled": "El remitent ha cancel·lat la petició." + }, + "receiveOptionsPage": { + "title": "Opcions", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(Carpeta LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "S'ha desactivat automàticament perquè hi ha carpetes." + }, + "sendPage": { + "waiting": "S'està esperant una resposta…", + "rejected": "El destinatari ha rebutjat la petició.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "El destinatari està ocupat amb una altra petició." + }, + "progressPage": { + "titleSending": "S'estan enviant els fitxers", + "titleReceiving": "S'estan rebent els fitxers", + "savedToGallery": "Desat a Fotos", + "total": { + "title": { + "sending": "Progrés total ({time})", + "finishedError": "Finalitzat amb error", + "canceledSender": "Cancel·lat pel remitent", + "canceledReceiver": "Cancel·lat pel destinatari" + }, + "count": "Fitxers: {curr} / {n}", + "size": "Mida: {curr} / {n}", + "speed": "Velocitat: {speed}/s" + } + }, + "webSharePage": { + "title": "Comparteix via enllaç", + "loading": "S'està iniciant el servidor…", + "stopping": "S'està aturant el servidor…", + "error": "Hi ha hagut un error en iniciar el servidor.", + "openLink": { + "one": "Obre l'enllaç al navegador:", + "other": "Obre un d'aquests enllaços al navegador:" + }, + "requests": "Peticions", + "noRequests": "Encara no hi ha peticions.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Accepta les peticions automàticament", + "requirePin": "Demana un PIN", + "pinHint": "El PIN és «{pin}»", + "encryptionHint": "El LocalSend utilitza un certificat auto-signat. Cal que l'accepteu al navegador.", + "pendingRequests": "Peticions pendents: {n}" + }, + "aboutPage": { + "title": "Quant al LocalSend", + "description": [ + "El LocalSend és una aplicació gratuïta i de codi obert que us permet compartir fitxers i missatges de manera segura amb dispositius propers a la vostra xarxa local sense necessitat de connexió a Internet.", + "Aquesta aplicació està disponible per a Android, iOS, macOS, Windows i Linux. Podeu trobar totes les opcions de baixada a la pàgina d'inici oficial." + ], + "author": "Autor", + "contributors": "Col·laboradors", + "packagers": "Empaquetadors", + "translators": "Traductors" + }, + "donationPage": { + "title": "Donació", + "info": "El LocalSend és gratuït, de codi obert i sense anuncis. Si us agrada l'aplicació, podeu donar suport al desenvolupament amb una donació.", + "donate": "Donació: {amount}", + "thanks": "Moltes gràcies!", + "restore": "Restaura la compra" + }, + "changelogPage": { + "title": "Registre de canvis" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Llengües diferents poden tenir paraules diferents, podrien no coincidir al 100%", + "adjectives": [ + "Adorable", + "Bonic", + "Gran", + "Brillant", + "Neteja", + "Intel·ligent", + "Guai", + "Bonic", + "Astúcia", + "Determinat", + "Energètic", + "Eficient", + "Fantàstic", + "Ràpid", + "Bé", + "Fresca", + "Bo", + "Preciós", + "Genial", + "Guapo", + "Calent", + "Amable", + "Encantador", + "Místic", + "Producte", + "Bonic", + "Pacient", + "Bonic", + "Potent", + "Ric", + "Secret", + "Intel·ligent", + "Sòlid", + "Especial", + "Estratègic", + "Fort", + "Endreçat", + "Savi" + ], + "fruits": [ + "Poma", + "Alvocat", + "Plàtan", + "Blackberry", + "Nabiu", + "Bròquil", + "Pastanaga", + "Cirera", + "Coco", + "Raïm", + "Llimona", + "Enciam", + "Mango", + "Meló", + "Bolet", + "Ceba", + "Taronja", + "Papaia", + "Préssec", + "Pera", + "Pinya", + "Patata", + "Carbassa", + "Gerd", + "Maduixa", + "Tomàquet" + ], + "combination": "{fruit} {adjective}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "Afegeix-ho a la selecció", + "content": "Què voleu afegir?" + }, + "addressInput": { + "title": "Introduïu l'adreça", + "hashtag": "Etiqueta", + "ip": "Adreça IP", + "recentlyUsed": "Utilitzades recentment: " + }, + "cancelSession": { + "title": "Cancel·la la transferència de fitxers", + "content": "Segur que voleu cancel·lar la transferència dels fitxers?" + }, + "cannotOpenFile": { + "title": "No es pot obrir el fitxer", + "content": "No s'ha pogut obrir «{file}». S'ha mogut, reanomenat o eliminat?" + }, + "encryptionDisabledNotice": { + "title": "Xifratge desactivat", + "content": "La comunicació ara es fa mitjançant el protocol HTTP no xifrat. Per a utilitzar HTTPS, torneu a activar el xifratge." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Preferits", + "noFavorites": "Encara no hi ha cap dispositiu preferit.", + "addFavorite": "Afegeix" + }, + "favoriteDeleteDialog": { + "title": "Elimina dels preferits", + "content": "Voleu eliminar «{name}» dels preferits?" + }, + "favoriteEditDialog": { + "titleAdd": "Afegeix als preferits", + "titleEdit": "Configuració", + "name": "Nom del dispositiu", + "auto": "(auto)", + "ip": "Adreça IP", + "port": "Port" + }, + "fileInfo": { + "title": "Informació del fitxer", + "fileName": "Nom del fitxer:", + "path": "Ruta:", + "size": "Mida:", + "sender": "Remitent:", + "time": "Temps:" + }, + "fileNameInput": { + "title": "Introduïu el nom del fitxer", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Esborra l'historial", + "content": "Segur que voleu eliminar tot l'historial?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "El LocalSend no pot trobar altres dispositius sense tenir permís per a escanejar la xarxa local. Concediu aquest permís a la configuració.", + "gotoSettings": "Configuració" + }, + "messageInput": { + "title": "Tipus de missatge", + "multiline": "Multilínia" + }, + "noFiles": { + "title": "No s'ha seleccionat cap fitxer", + "content": "Seleccioneu com a mínim un fitxer." + }, + "noPermission": { + "title": "Sense permisos", + "content": "No heu concedit els permisos necessaris. Concediu-los a la configuració." + }, + "notAvailableOnPlatform": { + "title": "No disponible", + "content": "Aquesta característica només està disponible a:" + }, + "qr": { + "title": "Codi QR" + }, + "quickActions": { + "title": "Accions ràpides", + "counter": "Comptador", + "prefix": "Prefix", + "padZero": "Reomple amb zeros", + "sortBeforeCount": "Ordena abans alfabèticament", + "random": "Aleatori" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Les sol·licituds de fitxers s'accepten automàticament. Tingueu en compte que tothom a la xarxa local us pot enviar fitxers." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Les sol·licituds de fitxers s'accepten automàticament dels dispositius de la llista de preferits.", + "Atenció! Actualment, això no és del tot segur, un hacker que tingués les emprentes de qualsevol del dispositiu de la llista de preferits podria enviar-vos fitxers sense restriccions.", + "No obstant això, aquesta opció encara és més segura que permetre que tothom a la xarxa local us enviï fitxers sense restriccions." + ] + }, + "pin": { + "title": "Introduïu el PIN" + }, + "sendModeHelp": { + "title": "Modes d'enviament", + "single": "Envia fitxers a un destinatari. La selecció s'esborrarà un cop finalitzada la transferència de fitxers.", + "multiple": "Envia fitxers a diversos destinataris. La selecció no s'esborrarà en finalitzar la trasferència.", + "link": "Els destinataris que no tinguin el LocalSend instal·lat poden baixar els fitxers seleccionats obrint l'enllaç al seu navegador." + }, + "zoom": { + "title": "URL" + }, + "openFile": { + "title": "Obre el fitxer", + "content": "Voleu obrir el fitxer rebut?" + } + }, + "sanitization": { + "empty": "El nom del fitxer no pot estar buit", + "invalid": "El nom del fitxer conté caràcters no vàlids" + }, + "tray": { + "@info": "Les directrius d'Apple són molt estrictes quant a l'expressió «tanca».", + "open": "@:general.open", + "close": "Surt del LocalSend", + "closeWindows": "Surt" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Introduïu el PIN", + "invalidPin": "PIN no vàlid", + "tooManyAttempts": "Massa intents", + "rejected": "Rebutjat", + "files": "Fitxers", + "fileName": "Nom del fitxer", + "size": "Mida" + }, + "assetPicker": { + "@info": "Traduccions per a l'eina de selecció de mitjans per a Android i iPhone", + "confirm": "Confirma", + "cancel": "Cancel·la", + "edit": "Edita", + "gifIndicator": "GIF", + "loadFailed": "Càrrega fallida", + "original": "Origen", + "preview": "Previsualitza", + "select": "Seleccioneu", + "emptyList": "Llista buida", + "unSupportedAssetType": "Tipus de fitxer no compatible.", + "unableToAccessAll": "No es pot accedir a tots els fitxers del dispositiu", + "viewingLimitedAssetsTip": "Visualitza només fitxers i àlbums accessibles per l'aplicació.", + "changeAccessibleLimitedAssets": "Feu clic per a actualitzar els fitxers accessibles", + "accessAllTip": "L'aplicació només pot accedir a alguns fitxers del dispositiu. Aneu a la configuració del sistema i permeteu que l'aplicació accedeixi a tots els mitjans del dispositiu.", + "goToSystemSettings": "Vés a la configuració del sistema", + "accessLimitedAssets": "Continua amb accés limitat", + "accessiblePathName": "Fitxers accessibles", + "sTypeAudioLabel": "Àudio", + "sTypeImageLabel": "Imatge", + "sTypeVideoLabel": "Vídeo", + "sTypeOtherLabel": "Altres fitxers", + "sActionPlayHint": "reprodueix", + "sActionPreviewHint": "previsualitza", + "sActionSelectHint": "selecccioneu", + "sActionSwitchPathLabel": "canvia la ruta", + "sActionUseCameraHint": "utilitza la càmera", + "sNameDurationLabel": "duració", + "sUnitAssetCountLabel": "compte" + }, + "networkInterfacesPage": { + "title": "Interfícies de xarxa", + "info": "De manera predefinida, el LocalSend utilitza totes les interfícies de xarxa disponibles. Podeu excloure les xarxes no desitjades aquí. Cal que reinicieu el servidor per a aplicar els canvis.", + "preview": "Previsualitza", + "blacklist": "Llista de denegades", + "whitelist": "Llista de permeses" + } +} diff --git a/app/assets/i18n/cs.json b/app/assets/i18n/cs.json new file mode 100644 index 0000000..8de5515 --- /dev/null +++ b/app/assets/i18n/cs.json @@ -0,0 +1,457 @@ +{ + "locale": "Česky", + "appName": "LocalSend", + "general": { + "accept": "Přijmout", + "accepted": "Přijato", + "add": "Přidat", + "advanced": "Pokročilé", + "cancel": "Zrušit", + "close": "Zavřít", + "confirm": "Potvrdit", + "continueStr": "Pokračovat", + "copy": "Kopírovat", + "copiedToClipboard": "Zkopírováno do schránky", + "decline": "Odmítnout", + "done": "Hotovo", + "delete": "Vymazat", + "edit": "Upravit", + "error": "Chyba", + "example": "Příklad", + "files": "Soubory", + "finished": "Hotovo", + "hide": "Skrýt", + "off": "Vypnuto", + "offline": "Offline", + "on": "Zapnuto", + "online": "Online", + "open": "Otevřít", + "queue": "Fronta", + "quickSave": "Rychlé uložení", + "quickSaveFromFavorites": "Rychlé uložení pro \"Oblíbené\"", + "renamed": "Přejmenováno", + "reset": "Resetovat", + "restart": "Restartovat", + "settings": "Nastavení", + "skipped": "Přeskočeno", + "start": "Spustit", + "stop": "Zastavit", + "save": "Uložit", + "unchanged": "Nezměněno", + "unknown": "Neznámý", + "noItemInClipboard": "Žádná položka ve schránce" + }, + "receiveTab": { + "title": "Příjmout", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Alias:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Oblíbené", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Odeslat", + "selection": { + "title": "Vybrat", + "files": "Soubory: {files}", + "size": "Velikost: {size}" + }, + "picker": { + "file": "Soubor", + "folder": "Složka", + "media": "Média", + "text": "Text", + "app": "Aplikace", + "clipboard": "Vložit" + }, + "shareIntentInfo": "Pro snazší výběr souborů můžete také použít funkci \"Sdílet\" svého mobilního zařízení.", + "nearbyDevices": "Zařízení v okolí", + "thisDevice": "Toto zařízení", + "scan": "Hledat zařízení", + "manualSending": "Manuální odeslání", + "sendMode": "Režim odesílání", + "sendModes": { + "single": "Jediný příjemce", + "multiple": "Více příjemců", + "link": "Sdílet pomocí odkazu" + }, + "sendModeHelp": "Vysvětlení", + "help": "Ujistěte se, že se požadovaný cíl nachází ve stejné síti Wi-Fi.", + "placeItems": "Vložte položky, které chcete sdílet." + }, + "settingsTab": { + "title": "Nastavení", + "general": { + "title": "Všeobecné", + "brightness": "Motiv", + "brightnessOptions": { + "system": "Systém", + "dark": "Tmavý", + "light": "Světlý" + }, + "color": "Barva", + "colorOptions": { + "system": "Systém", + "oled": "OLED" + }, + "language": "Jazyk", + "languageOptions": { + "system": "Systém" + }, + "saveWindowPlacement": "Při ukončení uložit umístění okna", + "saveWindowPlacementWindows": "Uložit polohu okna po ukončení", + "minimizeToTray": "Při ukončení minimalizovat do lišty", + "launchAtStartup": "Automatické spuštění po přihlášení", + "launchMinimized": "Automatické spuštění: skrytý start", + "showInContextMenu": "Zobrazit LocalSend v kontextové nabídce", + "animations": "Animace" + }, + "receive": { + "title": "Soubory", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Automatické dokončování", + "destination": "Uložit do", + "downloads": "(Downloads)", + "saveToGallery": "Uložit média do galerie", + "saveToHistory": "Uložit do historie" + }, + "send": { + "title": "Poslat", + "shareViaLinkAutoAccept": "Automaticky přijímat požadavky v režimu \"Sdílet přes odkaz\"." + }, + "network": { + "title": "Síť", + "needRestart": "Chcete-li použít nastavení, restartujte server!", + "server": "Server", + "alias": "Alias", + "deviceType": "Typ zařízení", + "deviceModel": "Model zařízení", + "port": "Port", + "network": "Síť", + "networkOptions": { + "all": "Vše", + "filtered": "Filtrované" + }, + "discoveryTimeout": "Časový limit zjišťování", + "useSystemName": "Použít název systému", + "generateRandomAlias": "Generovat náhodný alias", + "portWarning": "Je možné, že vás ostatní zařízení nezjistí, protože používáte vlastní port. (výchozí: {defaultPort})", + "encryption": "Šifrování", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Je možné, že vás ostatní zařízení nezjistí, protože používáte vlastní adresu vícesměrového vysílání. (výchozí: {defaultMulticast})" + }, + "other": { + "title": "Ostatní", + "support": "Podpora LocalSend", + "donate": "Darovat", + "privacyPolicy": "Zásady ochrany osobních údajů", + "termsOfUse": "Podmínky použití" + }, + "advancedSettings": "Pokročilá nastavení" + }, + "troubleshootPage": { + "title": "Odstraňování problémů", + "subTitle": "Tato aplikace nefunguje podle očekávání? Zde najdete častá řešení.", + "solution": "Řešení:", + "fixButton": "Opravit automaticky", + "firewall": { + "symptom": "Tato aplikace může odesílat soubory do jiných zařízení, ale jiná zařízení nemohou odesílat soubory do tohoto zařízení.", + "solution": "S největší pravděpodobností se jedná o problém s firewallem. Můžete to vyřešit povolením příchozích připojení (UDP a TCP) na portu {port}.", + "openFirewall": "Otevřít bránu firewall" + }, + "noDiscovery": { + "symptom": "Toto zařízení nemůže zjistit jiná zařízení.", + "solution": "Ujistěte se, že jsou všechna zařízení ve stejné síti Wi-Fi a sdílejí stejnou konfiguraci (port, adresa vícesměrového vysílání, šifrování). Můžete zkusit zadat IP adresu cílového zařízení ručně. Pokud to funguje, zvažte přidání tohoto zařízení do oblíbených, aby mohlo být v budoucnu automaticky objeveno." + }, + "noConnection": { + "symptom": "Obě zařízení se nemohou navzájem objevit ani nemohou sdílet soubory.", + "solution": "Problém je na obou stranách? Pak se musíte ujistit, že jsou obě zařízení ve stejné wifi síti a sdílejí stejnou konfiguraci (port, multicastová adresa, šifrování). Wifi nemusí umožňovat komunikaci mezi účastníky. V takovém případě musí být tato možnost povolena na routeru." + } + }, + "networkInterfacesPage": { + "title": "Síťová rozhraní", + "info": "Ve výchozím nastavení používá LocalSend všechna dostupná síťová rozhraní. Zde můžete vyloučit nežádoucí sítě. Chcete-li použít změny, musíte restartovat server.", + "preview": "Náhled", + "whitelist": "Seznam povolených", + "blacklist": "Seznam zakázaných" + }, + "receiveHistoryPage": { + "title": "Historie", + "openFolder": "Otevřít složku", + "deleteHistory": "Smazat historii", + "empty": "Historie je prázdná.", + "entryActions": { + "open": "Otevřít soubor", + "showInFolder": "Zobrazit ve složce", + "info": "Informace", + "deleteFromHistory": "Smazat z historie" + } + }, + "apkPickerPage": { + "title": "Aplikace (APK)", + "excludeSystemApps": "Vyloučit systémové aplikace", + "excludeAppsWithoutLaunchIntent": "Vyloučit aplikace, které nelze spustit", + "apps": "{n} Aplikace" + }, + "selectedFilesPage": { + "deleteAll": "Smazat vše" + }, + "receivePage": { + "subTitle": { + "one": "vám chce poslat soubor", + "other": "vám chce poslat několik souborů: {n}" + }, + "subTitleMessage": "vám poslal zprávu:", + "subTitleLink": "vám poslal odkaz:", + "canceled": "Odesílatel zrušil požadavek." + }, + "receiveOptionsPage": { + "title": "Možnosti", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend folder)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Automaticky vypnuto, protože existují adresáře." + }, + "sendPage": { + "waiting": "Čekání na odpověď...", + "rejected": "Příjemce žádost odmítl.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Příjemce je zaneprázdněn dalším požadavkem." + }, + "progressPage": { + "titleSending": "Odesílání souborů", + "titleReceiving": "Přijímání souborů", + "savedToGallery": "Uloženo ve Fotkách", + "total": { + "title": { + "sending": "Celkový průběh ({time})", + "finishedError": "Dokončeno s chybou", + "canceledSender": "Zrušeno odesílatelem", + "canceledReceiver": "Zrušeno příjemcem" + }, + "count": "Soubory: {curr} / {n}", + "size": "Velikost: {curr} / {n}", + "speed": "Rychlost: {speed}/s" + } + }, + "webSharePage": { + "title": "Sdílet pomocí odkazu", + "loading": "Spouštění serveru...", + "stopping": "Zastavování serveru...", + "error": "Při spouštění serveru došlo k chybě.", + "openLink": { + "one": "Otevřete tento odkaz v prohlížeči:", + "other": "Otevřete v prohlížeči jeden z těchto odkazů:" + }, + "requests": "Žádosti", + "noRequests": "Zatím žádné žádosti.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Automaticky přijímat žádosti", + "requirePin": "Vyžadovat PIN", + "pinHint": "PIN je \"{pin}\"", + "encryptionHint": "LocalSend používá self-signed certifikát. Musíte ho přijmout ve vašem prohlížeči.", + "pendingRequests": "Čekající žádosti: {n}" + }, + "aboutPage": { + "title": "O aplikaci LocalSend", + "description": [ + "LocalSend je bezplatná aplikace s otevřeným zdrojovým kódem, která vám umožňuje bezpečně sdílet soubory a zprávy s okolními zařízeními přes vaši místní síť, aniž byste potřebovali připojení k internetu.", + "Tato aplikace je dostupná pro Android, iOS, macOS, Windows a Linux. Všechny možnosti stahování najdete na oficiální domovské stránce." + ], + "author": "Autor", + "contributors": "Přispěvatelé", + "packagers": "Baliči", + "translators": "Překladatelé" + }, + "donationPage": { + "title": "Darovat", + "info": "LocalSend je zdarma, open source a bez reklam. Pokud se vám aplikace líbí, můžete její vývoj podpořit darem.", + "donate": "Darovat {amount}", + "thanks": "Děkuji mnohokrát!", + "restore": "Obnovit" + }, + "changelogPage": { + "title": "Seznam změn" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "Přidat do výběru", + "content": "Co chcete přidat?" + }, + "openFile": { + "title": "Otevřít soubor", + "content": "Chcete otevřít přijatý soubor?" + }, + "addressInput": { + "title": "Zadat adresu", + "hashtag": "Hashtag", + "ip": "IP Adresa", + "recentlyUsed": "Nedávno použité: " + }, + "cancelSession": { + "title": "Zrušit přenos souborů", + "content": "Opravdu chcete zrušit přenos souborů?" + }, + "cannotOpenFile": { + "title": "Nelze otevřít soubor", + "content": "Nelze otevřít \"{file}\". Byl tento soubor přesunut, přejmenován nebo smazán?" + }, + "encryptionDisabledNotice": { + "title": "Šifrování zakázáno", + "content": "Komunikace nyní probíhá prostřednictvím nešifrovaného protokolu HTTP. Chcete-li použít HTTPS, znovu povolte šifrování." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Oblíbené", + "noFavorites": "Zatím nemáte žádná oblíbená zařízení.", + "addFavorite": "Přidat" + }, + "favoriteDeleteDialog": { + "title": "Smazat z oblíbených", + "content": "Opravdu chcete smazat \"{name}\" z oblíbených?" + }, + "favoriteEditDialog": { + "titleAdd": "Přidat k oblíbeným", + "titleEdit": "Upravit", + "name": "Název zařízení", + "auto": "(auto)", + "ip": "IP adresa", + "port": "Port" + }, + "fileInfo": { + "title": "Informace o souboru", + "fileName": "Název souboru:", + "path": "Cesta:", + "size": "Velikost:", + "sender": "Odesílatel:", + "time": "Čas:" + }, + "fileNameInput": { + "title": "Zadejte název souboru", + "original": "Původní: {original}" + }, + "historyClearDialog": { + "title": "Smazat historii", + "content": "Opravdu chcete smazat celou historii?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend nemůže najít jiná zařízení, aniž by měl oprávnění skenovat místní síť. Udělte prosím toto oprávnění v nastavení.", + "gotoSettings": "Nastavení" + }, + "messageInput": { + "title": "Napište zprávu", + "multiline": "Více řádků" + }, + "noFiles": { + "title": "Žádný soubor nevybrán", + "content": "Vyberte prosím alespoň jeden soubor." + }, + "noPermission": { + "title": "Žádné oprávnění", + "content": "Neposkytli jste potřebná oprávnění. Prosím, udělte je v nastavení." + }, + "notAvailableOnPlatform": { + "title": "Není k dispozici", + "content": "Tato funkce je dostupná pouze na:" + }, + "qr": { + "title": "QR kód" + }, + "quickActions": { + "title": "Rychlé akce", + "counter": "Číslo", + "prefix": "Předpona", + "padZero": "Přidat nuly", + "sortBeforeCount": "Nejprve seřadit abecedně", + "random": "Náhodné jméno" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Požadavky na soubor jsou automaticky přijímány. Uvědomte si, že každý v místní síti vám může posílat soubory." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Žádosti o soubory jsou nyní přijímány automaticky ze zařízení ve vašem seznamu oblíbených.", + "Upozornění: V současné době to není zcela bezpečné, protože hacker, který zná vaše oblíbené zařízení, vám stále může posílat soubory.", + "Tato možnost je však stále bezpečnější než povolení libovolného zařízení." + ] + }, + "pin": { + "title": "Vložit PIN" + }, + "sendModeHelp": { + "title": "Režimy odesílání", + "single": "Odešle soubory jednomu příjemci. Po dokončení přenosu souboru bude výběr vymazán.", + "multiple": "Odešle soubory více příjemcům. Výběr nebude vymazán.", + "link": "Příjemci, kteří nemají nainstalovaný LocalSend, si mohou vybrané soubory stáhnout otevřením odkazu ve svém prohlížeči." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Název souboru nemůže být prázdný", + "invalid": "Název souboru obsahuje neplatné znaky" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "Ukončit LocalSend", + "closeWindows": "Konec" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Vložit PIN", + "invalidPin": "Neplatný PIN", + "tooManyAttempts": "Příliš mnoho pokusů", + "rejected": "Odmítnuto", + "files": "Soubory", + "fileName": "Název souboru", + "size": "Velikost" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "Potvrdit", + "cancel": "Zrušit", + "edit": "Editovat", + "gifIndicator": "GIF", + "loadFailed": "Načtení se nezdařilo", + "original": "Původ", + "preview": "Náhled", + "select": "Vybrat", + "emptyList": "Prázdný seznam", + "unSupportedAssetType": "Nepodporovaný typ souboru.", + "unableToAccessAll": "Nelze získat přístup ke všem souborům v zařízení", + "viewingLimitedAssetsTip": "Zobrazit pouze soubory a alba, ke kterým má aplikace přístup.", + "changeAccessibleLimitedAssets": "Kliknutím aktualizujete přístupné soubory", + "accessAllTip": "Aplikace má přístup pouze k některým souborům v zařízení. Přejděte do nastavení systému a povolte aplikaci přístup ke všem médiím v zařízení.", + "goToSystemSettings": "Přejít do nastavení systému", + "accessLimitedAssets": "Pokračovat s omezeným přístupem", + "accessiblePathName": "Přístupné soubory", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Obrázek", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Ostatní média", + "sActionPlayHint": "přehrát", + "sActionPreviewHint": "náhled", + "sActionSelectHint": "vybrat", + "sActionSwitchPathLabel": "změnit cestu", + "sActionUseCameraHint": "použít kameru", + "sNameDurationLabel": "doba trvání", + "sUnitAssetCountLabel": "počet" + } +} diff --git a/app/assets/i18n/da.json b/app/assets/i18n/da.json new file mode 100644 index 0000000..87e8bda --- /dev/null +++ b/app/assets/i18n/da.json @@ -0,0 +1,457 @@ +{ + "locale": "Dansk", + "appName": "LocalSend", + "general": { + "accept": "Acceptér", + "accepted": "Accepteret", + "add": "Tilføj", + "advanced": "Avanceret", + "cancel": "Afbryd", + "close": "Luk", + "confirm": "Bekræft", + "continueStr": "Fortsæt", + "copy": "Kopiér", + "copiedToClipboard": "Kopieret til udklipsholder", + "decline": "Afvis", + "done": "Færdig", + "delete": "Slet", + "edit": "Rediger", + "error": "Fejl", + "example": "Eksempel", + "files": "Filer", + "finished": "Fuldført", + "hide": "Skjul", + "off": "Fra", + "offline": "Offline", + "on": "Til", + "online": "Online", + "open": "Åbn", + "queue": "Kø", + "quickSave": "Gem hurtigt", + "quickSaveFromFavorites": "Gem hurtigt til \"Favoritter\"", + "renamed": "Omdøbt", + "reset": "Fortryd ændringer", + "restart": "Genstart", + "settings": "Indstillinger", + "skipped": "Sprunget over", + "start": "Start", + "stop": "Stop", + "save": "Gem", + "unchanged": "Uændret", + "unknown": "Ukendt", + "noItemInClipboard": "Ingen elementer i udklipsholder." + }, + "receiveTab": { + "title": "Modtag", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Enhedsnavn:" + }, + "quickSave": { + "favorites": "Favoritter", + "off": "@:general.off", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Send", + "selection": { + "title": "Valg", + "files": "Filer: {files}", + "size": "Størrelse: {size}" + }, + "picker": { + "file": "Fil", + "folder": "Mappe", + "media": "Medie", + "text": "Tekst", + "app": "App", + "clipboard": "Indsæt" + }, + "shareIntentInfo": "Du kan også bruge din mobilenheds \"Del\"-funktion til nemmere at vælge filer.", + "nearbyDevices": "Enheder i nærheden", + "thisDevice": "Denne enhed", + "scan": "Søg efter enheder", + "manualSending": "Manuel afsendelse", + "sendMode": "Send-tilstand", + "sendModes": { + "single": "Enkel modtager", + "multiple": "Flere modtagere", + "link": "Del med link" + }, + "sendModeHelp": "Forklaring", + "help": "Sørg for, at den ønskede enhed er på det samme Wi-Fi-netværk.", + "placeItems": "Placer filer til deling." + }, + "settingsTab": { + "title": "Indstillinger", + "general": { + "title": "Generelt", + "brightness": "Tema", + "brightnessOptions": { + "system": "System", + "dark": "Mørk", + "light": "Lys" + }, + "color": "Farve", + "colorOptions": { + "system": "System", + "oled": "OLED" + }, + "language": "Sprog", + "languageOptions": { + "system": "System" + }, + "saveWindowPlacement": "Gem vinduesposition ved afslutning", + "saveWindowPlacementWindows": "Gem vinduesposition ved lukning", + "minimizeToTray": "Minimer til systembakken/menulinjen ved lukning", + "launchAtStartup": "Autostart efter login", + "launchMinimized": "Autostart: Start skjult", + "showInContextMenu": "Vis LocalSend i kontekstmenu", + "animations": "Animationer" + }, + "receive": { + "title": "Modtag", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Auto-fuldfør", + "destination": "Gem til mappe", + "downloads": "(Overførsler)", + "saveToGallery": "Gem medier til galleri", + "saveToHistory": "Gem til historik" + }, + "send": { + "title": "Send", + "shareViaLinkAutoAccept": "Acceptér automatisk anmodninger i \"Del med link\"-tilstand" + }, + "network": { + "title": "Netværk", + "needRestart": "Genstart serveren for at anvende ændringerne!", + "server": "Server", + "alias": "Enhedsnavn", + "deviceType": "Enhedstype", + "deviceModel": "Enhedsmodel", + "port": "Port", + "discoveryTimeout": "Timeout for søgning", + "portWarning": "Andre enheder registrerer dig muligvis ikke, da du bruger en brugerdefineret port (standard: {defaultPort}).", + "encryption": "Kryptering", + "multicastGroup": "Multicast-adresse", + "multicastGroupWarning": "Andre enheder registrerer dig muligvis ikke, da du bruger en brugerdefineret multicast-adresse (standard: {defaultMulticast}).", + "network": "Netværk", + "networkOptions": { + "all": "Alle", + "filtered": "Filtreret" + }, + "useSystemName": "Brug systemnavn", + "generateRandomAlias": "Generér tilfældigt alias" + }, + "other": { + "title": "Andet", + "support": "Støt LocalSend", + "donate": "Donér", + "privacyPolicy": "Privatlivspolitik", + "termsOfUse": "Brugsbetingelser" + }, + "advancedSettings": "Avancerede indstillinger" + }, + "troubleshootPage": { + "title": "Fejlsøgning", + "subTitle": "Fungerer appen ikke som forventet? Her finder du løsninger på almindelige problemer.", + "solution": "Løsning:", + "fixButton": "Løs automatisk", + "firewall": { + "symptom": "Denne enhed kan sende filer til andre enheder, men andre kan ikke sende til denne enhed.", + "solution": "Dette er sandsynligvis et firewall-problem. Løs det ved at tillade indgående forbindelser (UDP og TCP) på port {port}.", + "openFirewall": "Åbn firewall" + }, + "noDiscovery": { + "symptom": "Denne enhed kan ikke finde andre enheder.", + "solution": "Sørg for, at alle enheder er på samme Wi-Fi-netværk og har den samme konfiguration (port, multicast-adresse, kryptering). Du kan prøve at indtaste den ønskede enheds IP-adresse manuelt. Hvis det virker, kan du føje enheden til favoritter, så den kan findes automatisk fremover." + }, + "noConnection": { + "symptom": "Begge enheder kan hverken se hinanden eller dele data.", + "solution": "Er problemet der på begge enheder? Hvis ja, skal du sikre, at begge er på samme Wi-Fi-netværk og har den samme konfiguration (port, multicast-adresse, kryptering). Det kan være, at Wi-Fi-netværket forhindrer kommunikation mellem enheder grundet Access Point (AP) Isolation. I så fald skal denne indstilling deaktiveres på routeren." + } + }, + "receiveHistoryPage": { + "title": "Historik", + "openFolder": "Åbn mappe", + "deleteHistory": "Slet historik", + "empty": "Historikken er tom.", + "entryActions": { + "open": "Åbn fil", + "showInFolder": "Vis i mappe", + "info": "Information", + "deleteFromHistory": "Slet fra historik" + } + }, + "apkPickerPage": { + "title": "Apps (APK)", + "excludeSystemApps": "Ekskluder systemapps", + "excludeAppsWithoutLaunchIntent": "Ekskluder ikke-startbare apps", + "apps": "{n} Apps" + }, + "selectedFilesPage": { + "deleteAll": "Slet alle" + }, + "receivePage": { + "subTitle": { + "one": "vil sende dig en fil", + "other": "vil sende dig {n} filer" + }, + "subTitleMessage": "sendte dig en besked:", + "subTitleLink": "sendte dig et link:", + "canceled": "Afsenderen har afbrudt delingen." + }, + "receiveOptionsPage": { + "title": "Muligheder", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend mappe)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Slået fra automatisk, fordi der er mapper." + }, + "sendPage": { + "waiting": "Venter på svar…", + "rejected": "Modtageren har afvist delingen.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Modtageren er optaget med en anden deling." + }, + "progressPage": { + "titleSending": "Sender filer", + "titleReceiving": "Modtager filer", + "savedToGallery": "Gemt i fotos", + "total": { + "title": { + "sending": "Samlet tid ({time})", + "finishedError": "Fuldført med fejl", + "canceledSender": "Afbrudt af afsender", + "canceledReceiver": "Afbrudt af modtager" + }, + "count": "Filer: {curr} / {n}", + "size": "Størrelse: {curr} / {n}", + "speed": "Hastighed: {speed}/s" + } + }, + "webSharePage": { + "title": "Del med link", + "loading": "Starter server…", + "stopping": "Stopper server…", + "error": "En fejl opstod, mens serveren blev startet.", + "openLink": { + "one": "Åbn dette link i din browser:", + "other": "Åbn et af disse links i din browser:" + }, + "requests": "Forespørgsler", + "noRequests": "Ingen forespørgsler endnu.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Accepter automatisk anmodninger", + "requirePin": "Kræv PIN-kode", + "pinHint": "PIN-koden er \"{pin}\"", + "encryptionHint": "LocalSend bruger et selvsigneret certifikat. Du skal acceptere det i din browser.", + "pendingRequests": "Afventende forespørgsler: {n}" + }, + "aboutPage": { + "title": "Om LocalSend", + "description": [ + "LocalSend er en gratis, open source-app, der lader dig dele filer og beskeder sikkert med enheder i nærheden over dit lokale netværk uden behov for en internetforbindelse.", + "Appen er tilgængelig på Android, iOS, macOS, Windows og Linux. Du finder alle downloadmuligheder på den officielle hjemmeside." + ], + "author": "Skaber", + "contributors": "Bidragydere", + "packagers": "Pakkere", + "translators": "Oversættere" + }, + "donationPage": { + "title": "Donér", + "info": "LocalSend er gratis, open source og uden annoncer. Hvis du kan lide appen, kan du støtte udviklingen med en donation.", + "donate": "Donér {amount}", + "thanks": "Tusind tak for din støtte!", + "restore": "Gendan køb" + }, + "changelogPage": { + "title": "Ændringslog" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Lokaliteter kan have forskellige ord og matcher ikke altid 1:1" + }, + "dialogs": { + "addFile": { + "title": "Føj til valg", + "content": "Hvad vil du tilføje?" + }, + "addressInput": { + "title": "Indtast adresse", + "hashtag": "Hashtag", + "ip": "IP-adresse", + "recentlyUsed": "Senest brugt: " + }, + "cancelSession": { + "title": "Afbryd filoverførsel", + "content": "Vil du virkelig afbryde filoverførslen?" + }, + "cannotOpenFile": { + "title": "Kan ikke åbne filen", + "content": "Filen \"{file}\" kunne ikke åbnes. Er denne fil blevet flyttet, omdøbt eller slettet?" + }, + "encryptionDisabledNotice": { + "title": "Kryptering deaktiveret", + "content": "Kommunikationen sker nu via den ukrypterede HTTP-protokol. Aktivér kryptering igen for at bruge HTTPS." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favoritter", + "noFavorites": "Ingen favoritter endnu.", + "addFavorite": "Tilføj" + }, + "favoriteDeleteDialog": { + "title": "Slet favorit", + "content": "Vil du virkelig slette \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Føj til favoritter", + "titleEdit": "Rediger favorit", + "name": "Enhedsnavn", + "auto": "(auto)", + "ip": "IP-adresse", + "port": "Port" + }, + "fileInfo": { + "title": "Filoplysninger", + "fileName": "Filnavn:", + "path": "Sti:", + "size": "Størrelse:", + "sender": "Afsender:", + "time": "Tidspunkt:" + }, + "fileNameInput": { + "title": "Angiv filnavn", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Ryd historik", + "content": "Vil du virkelig slette hele historikken?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend kan ikke finde andre enheder uden tilladelse til at scanne det lokale netværk. Giv venligst tilladelse i systemindstillingerne.", + "gotoSettings": "Indstillinger" + }, + "messageInput": { + "title": "Skriv besked", + "multiline": "Flerlinjet" + }, + "noFiles": { + "title": "Ingen fil valgt", + "content": "Vælg mindst én fil." + }, + "noPermission": { + "title": "Ingen tilladelse", + "content": "Du har ikke givet de nødvendige tilladelser. Giv venligst tilladelse i systemindstillingerne." + }, + "notAvailableOnPlatform": { + "title": "Ikke tilgængelig", + "content": "Denne funktion er ikke tilgængelig:" + }, + "qr": { + "title": "QR-kode" + }, + "quickActions": { + "title": "Hurtighandlinger", + "counter": "Tæller", + "prefix": "Præfiks", + "padZero": "Fyld med nuller", + "sortBeforeCount": "Sortér alfabetisk på forhånd (A-Å)", + "random": "Tilfældig" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Filoverførsler accepteres nu automatisk. Bemærk, at alle på det lokale netværk kan sende dig filer." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Filoverførsler accepteres nu automatisk fra enheder på din favoritliste.", + "Advarsel! Dette er ikke helt sikkert, da hvis en hacker har fingeraftrykket på enhver enhed fra din favoritliste, kan de sende filer til dig uden restriktioner.", + "Denne mulighed er dog stadig sikrere end at tillade alle brugere på det lokale netværk at sende filer til dig uden restriktioner." + ] + }, + "pin": { + "title": "Indtast PIN-kode" + }, + "sendModeHelp": { + "title": "Send-tilstande", + "single": "Sender filer til én modtager. Valget ryddes efter filoverførsel er færdig.", + "multiple": "Sender filer til flere modtager. Valget ryddes ikke efter filoverførsel er færdig.", + "link": "Modtagere, der ikke har LocalSend installeret, kan hente de valgte filer ved at åbne linket i deres browser." + }, + "zoom": { + "title": "URL" + }, + "openFile": { + "title": "Åbn fil", + "content": "Vil du åbne den modtagne fil?" + } + }, + "sanitization": { + "empty": "Filnavn må ikke være tomt", + "invalid": "Filnavn indeholder ugyldige tegn" + }, + "tray": { + "@info": "Apples retningslinjer er meget strenge angående ordet \"luk\".", + "open": "@:general.open", + "close": "Afslut LocalSend", + "closeWindows": "Luk" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Indtast PIN-kode", + "invalidPin": "Ugyldig PIN-kode", + "tooManyAttempts": "For mange forsøg", + "rejected": "Afvist", + "files": "Filer", + "fileName": "Filnavn", + "size": "Størrelse" + }, + "assetPicker": { + "@info": "Oversættelser til medievalgværktøjet på Android og iPhone", + "confirm": "Bekræft", + "cancel": "Afbryd", + "edit": "Rediger", + "gifIndicator": "GIF", + "loadFailed": "Indlæsning mislykkedes", + "original": "Original", + "preview": "Forhåndsvisning", + "select": "Vælg", + "emptyList": "Tom liste", + "unSupportedAssetType": "Ikke-understøttet filtype.", + "unableToAccessAll": "Kan ikke tilgå alle filer på enheden", + "viewingLimitedAssetsTip": "Vis kun filer og mapper tilgængelige for appen.", + "changeAccessibleLimitedAssets": "Klik for at opdatere tilgængelige filer", + "accessAllTip": "Appen kan kun tilgå nogle filer på enheden. Gå til systemindstillingerne, og giv den adgang til alle medier på enheden.", + "goToSystemSettings": "Gå til systemindstillinger", + "accessLimitedAssets": "Fortsæt med begrænset adgang", + "accessiblePathName": "Tilgængelige filer", + "sTypeAudioLabel": "Lyd", + "sTypeImageLabel": "Billede", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Andre medier", + "sActionPlayHint": "Afspil", + "sActionPreviewHint": "Forhåndsvisning", + "sActionSelectHint": "Vælg", + "sActionSwitchPathLabel": "Ændr filsti", + "sActionUseCameraHint": "Brug kamera", + "sNameDurationLabel": "Varighed", + "sUnitAssetCountLabel": "Antal" + }, + "networkInterfacesPage": { + "title": "Netværksgrænseflader", + "info": "Som standard bruger LocalSend alle tilgængelige netværksgrænseflader. Du kan ekskludere uønskede netværk her. Du skal genstarte serveren for at anvende ændringerne.", + "preview": "Forhåndsvisning", + "whitelist": "Hvidliste", + "blacklist": "Sortliste" + } +} diff --git a/app/assets/i18n/de.json b/app/assets/i18n/de.json new file mode 100644 index 0000000..c47cf9f --- /dev/null +++ b/app/assets/i18n/de.json @@ -0,0 +1,465 @@ +{ + "locale": "Deutsch", + "appName": "LocalSend", + "general": { + "accept": "Akzeptieren", + "accepted": "Akzeptiert", + "add": "Hinzufügen", + "advanced": "Erweitert", + "cancel": "Abbrechen", + "close": "Schließen", + "confirm": "Bestätigen", + "continueStr": "Weiter", + "copy": "Kopieren", + "copiedToClipboard": "In die Zwischenablage kopiert", + "decline": "Ablehnen", + "done": "Fertig", + "delete": "Löschen", + "edit": "Bearbeiten", + "error": "Fehler", + "example": "Beispiel", + "files": "Dateien", + "finished": "Abgeschlossen", + "hide": "Verstecken", + "off": "Aus", + "offline": "Offline", + "on": "An", + "online": "Online", + "open": "Öffnen", + "queue": "Warteschlange", + "quickSave": "Quick Save", + "quickSaveFromFavorites": "Quick Save für \"Favoriten\"", + "renamed": "Umbenannt", + "reset": "Zurücksetzen", + "restart": "Neustarten", + "settings": "Einstellungen", + "skipped": "Übersprungen", + "start": "Start", + "stop": "Stop", + "save": "Speichern", + "unchanged": "Unverändert", + "unknown": "Unbekannt", + "noItemInClipboard": "Kein Element in der Zwischenablage gefunden." + }, + "receiveTab": { + "title": "Empfangen", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Alias:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favoriten", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Senden", + "selection": { + "title": "Auswahl", + "files": "Dateien: {files}", + "size": "Größe: {size}" + }, + "picker": { + "file": "Datei", + "folder": "Ordner", + "media": "Medien", + "text": "Text", + "app": "App", + "clipboard": "Ablage" + }, + "shareIntentInfo": "Du kannst auch die \"Teilen\"-Funktion deines mobilen Geräts nutzen, um Dateien einfacher auszuwählen.", + "nearbyDevices": "Geräte in der Nähe", + "thisDevice": "Dieses Gerät", + "scan": "Geräte suchen", + "manualSending": "Manuelles Senden", + "sendMode": "Sendemodus", + "sendModes": { + "single": "Einzelner Empfänger", + "multiple": "Mehrere Empfänger", + "link": "Per Link teilen" + }, + "sendModeHelp": "Erklärung", + "help": "Bitte stelle sicher, dass sich das gewünschte Ziel auch im selben WLAN-Netzwerk befindet.", + "placeItems": "Dateien ablegen, um zu teilen." + }, + "settingsTab": { + "title": "Einstellungen", + "general": { + "title": "Allgemein", + "brightness": "Helligkeit", + "brightnessOptions": { + "system": "System", + "dark": "Dunkel", + "light": "Hell" + }, + "color": "Farbe", + "colorOptions": { + "system": "System", + "oled": "OLED" + }, + "language": "Sprache", + "languageOptions": { + "system": "System" + }, + "saveWindowPlacement": "Beenden: Fensterposition speichern", + "saveWindowPlacementWindows": "Beenden: Fensterposition speichern", + "minimizeToTray": "Beenden: in Symbolleiste minimieren", + "launchAtStartup": "Autostart nach Login", + "launchMinimized": "Autostart: versteckt starten", + "showInContextMenu": "LocalSend im Kontextmenü anzeigen", + "animations": "Animationen" + }, + "receive": { + "title": "Empfangen", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Autom. beenden", + "destination": "Ziel-Ordner", + "downloads": "(Downloads)", + "saveToGallery": "Medien in die Galerie speichern", + "saveToHistory": "In Verlauf speichern" + }, + "send": { + "title": "Senden", + "shareViaLinkAutoAccept": "Link teilen: Autom. akzeptieren" + }, + "network": { + "title": "Netzwerk", + "needRestart": "Starte den Server neu, um die Änderungen zu übernehmen!", + "server": "Server", + "alias": "Alias", + "deviceType": "Gerätetyp", + "deviceModel": "Gerätemodell", + "port": "Port", + "network": "Netzwerk", + "networkOptions": { + "all": "Alle", + "filtered": "Gefiltert" + }, + "discoveryTimeout": "Erkennungs-Timeout", + "useSystemName": "Systemnamen verwenden", + "generateRandomAlias": "Zufälligen Alias generieren", + "portWarning": "Möglicherweise wirst du von anderen Geräten nicht erkannt, weil du einen benutzerdefinierten Port verwendest. (Standard: {defaultPort})", + "encryption": "Verschlüsselung", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Möglicherweise wirst du von anderen Geräten nicht erkannt, weil du eine benutzerdefinierte Multicast-Adresse verwendest. (Standard: {defaultMulticast})" + }, + "other": { + "title": "Weitere", + "support": "LocalSend unterstützen", + "donate": "Spenden", + "privacyPolicy": "Datenschutzerklärung", + "termsOfUse": "Nutzungsbedingungen" + }, + "advancedSettings": "Erweiterte Einstellungen" + }, + "troubleshootPage": { + "title": "Fehlerbehebung", + "subTitle": "Diese App funktioniert nicht wie erwartet? Hier findest du häufige Lösungsansätze.", + "solution": "Lösung:", + "fixButton": "Automatisch beheben", + "firewall": { + "symptom": "Diese App kann Dateien an andere Geräte senden, aber nicht umgekehrt.", + "solution": "Dies ist höchstwahrscheinlich ein Firewall-Problem. Du kannst es lösen, indem du eingehende Verbindungen (UDP und TCP) auf Port {port} zulässt.", + "openFirewall": "Firewall öffnen" + }, + "noDiscovery": { + "symptom": "Dieses Gerät kann keine anderen Geräte entdecken.", + "solution": "Stelle sicher, dass alle Geräte im selben Wi-Fi-Netzwerk sind und die gleiche Konfiguration teilen (Port, Multicast-Adresse, Verschlüsselung). Du kannst versuchen, die IP-Adresse des Zielgeräts manuell einzugeben. Wenn dies funktioniert, füge dieses Gerät zu den Favoriten hinzu, damit es in Zukunft automatisch entdeckt werden kann." + }, + "noConnection": { + "symptom": "Beide Geräte können sich weder sehen noch können sie Dateien miteinander teilen.", + "solution": "Das Problem tritt auf beiden Seiten auf? Dann stelle sicher, dass beide Geräte im selben WLAN sind sowie dieselbe Konfiguration (Port, Multicast-Adresse, Verschlüsselung) haben. Es kann sein, dass das WLAN keine Kommunikation zwischen Teilnehmern erlaubt (AP-Isolation). In diesem Fall muss am Router diese Option aktiviert werden." + } + }, + "networkInterfacesPage": { + "title": "Netzwerkschnittstellen", + "info": "Standardmäßig verwendet LocalSend alle verfügbaren Netzwerkschnittstellen. Hier können Sie unerwünschte Netzwerke ausschließen. Sie müssen den Server neu starten, um die Änderungen zu übernehmen.", + "preview": "Vorschau", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "receiveHistoryPage": { + "title": "Verlauf", + "openFolder": "Ordner öffnen", + "deleteHistory": "Verlauf löschen", + "empty": "Der Verlauf ist leer.", + "entryActions": { + "open": "Datei öffnen", + "showInFolder": "Im Ordner anzeigen", + "info": "Information", + "deleteFromHistory": "Vom Verlauf entfernen" + } + }, + "apkPickerPage": { + "title": "Apps (APK)", + "excludeSystemApps": "System-Apps ausschließen", + "excludeAppsWithoutLaunchIntent": "Nicht-startbare Apps ausschließen", + "apps": "{n} Apps" + }, + "selectedFilesPage": { + "deleteAll": "Alle löschen" + }, + "receivePage": { + "subTitle": { + "one": "möchte dir eine Datei senden", + "other": "möchte dir {n} Dateien senden" + }, + "subTitleMessage": "sendet dir eine Nachricht:", + "subTitleLink": "sendet dir einen Link:", + "canceled": "Der Absender hat die Anfrage abgebrochen." + }, + "receiveOptionsPage": { + "title": "Optionen", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend-Ordner)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Aufgrund von Ordnern automatisch ausgeschaltet." + }, + "sendPage": { + "waiting": "Warte auf Antwort…", + "rejected": "Der Empfänger hat die Anfrage abgelehnt.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Der Empfänger ist mit einer anderen Anfrage beschäftigt." + }, + "progressPage": { + "titleSending": "Sende Dateien", + "titleReceiving": "Empfange Dateien", + "savedToGallery": "in Fotos gespeichert", + "total": { + "title": { + "sending": "Gesamtfortschritt ({time})", + "finishedError": "Abgeschlossen mit Fehler", + "canceledSender": "Abgebrochen durch Absender", + "canceledReceiver": "Abgebrochen durch Empfänger" + }, + "count": "Dateien: {curr} / {n}", + "size": "Größe: {curr} / {n}", + "speed": "Geschwindigkeit: {speed}/s" + }, + "remainingTime": { + "@hours": "Benutze 'h' als Abkürzung für Stunden und 'm' für Minuten", + "@days": "Benutze 'd' für Tage, 'h' für Stunden und 'm' für Minuten", + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m" + } + }, + "webSharePage": { + "title": "Per Link teilen", + "loading": "Starte Server…", + "stopping": "Stoppe server…", + "error": "Ein Fehler ist beim Starten des Servers aufgetreten.", + "openLink": { + "one": "Öffne diesen Link im Browser:", + "other": "Öffne einer dieser Links im Browser:" + }, + "requests": "Anfragen", + "noRequests": "Bisher keine Anfragen erhalten.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Anfragen automatisch akzeptieren", + "requirePin": "PIN erforderlich", + "pinHint": "Die PIN lautet \"{pin}\"", + "encryptionHint": "LocalSend verwendet ein selbstsigniertes Zertifikat. Du musst es im Browser akzeptieren.", + "pendingRequests": "Offene Anfragen: {n}" + }, + "aboutPage": { + "title": "Über LocalSend", + "description": [ + "LocalSend ist eine kostenlose Open-Source-App, mit der du Dateien und Nachrichten sicher über dein lokales Netzwerk mit Geräten in der Nähe teilen kannst, ohne dass eine Internetverbindung erforderlich ist.", + "Diese App ist für Android, iOS, macOS, Windows und Linux verfügbar. Alle Downloadmöglichkeiten findest du auf der offiziellen Homepage." + ], + "author": "Autor", + "contributors": "Mitwirkende", + "packagers": "Paketierende", + "translators": "Übersetzende" + }, + "donationPage": { + "title": "Spenden", + "info": "LocalSend ist kostenlos, quelloffen und frei von Werbung. Wenn dir diese App gefällt, kannst du die Entwicklung mit einer Spende unterstützen.", + "donate": "Spende {amount}", + "thanks": "Vielen Dank für deine Unterstützung!", + "restore": "Käufe wiederherstellen" + }, + "changelogPage": { + "title": "Änderungsprotokoll" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "Zur Auswahl hinzufügen", + "content": "Was möchtest du zum Senden hinzufügen?" + }, + "openFile": { + "title": "Datei öffnen", + "content": "Möchtest du die empfangene Datei öffnen?" + }, + "addressInput": { + "title": "Adresse eingeben", + "hashtag": "Hashtag", + "ip": "IP-Adresse", + "recentlyUsed": "Zuletzt verwendet: " + }, + "cancelSession": { + "title": "Dateiübertragung abbrechen", + "content": "Möchtest du wirklich die Dateiübertragung abbrechen?" + }, + "cannotOpenFile": { + "title": "Öffnen fehlgeschlagen", + "content": "Die Datei \"{file}\" konnte nicht geöffnet werden. Wurde diese Datei verschoben, umbenannt oder gelöscht?" + }, + "encryptionDisabledNotice": { + "title": "Verschlüsselung deaktiviert", + "content": "Die Kommunikation erfolgt nun über das unverschlüsselte HTTP-Protokoll. Um HTTPS zu verwenden, aktiviere wieder die Verschlüsselung." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favoriten", + "noFavorites": "Keine Favoriten konfiguriert.", + "addFavorite": "Neu" + }, + "favoriteDeleteDialog": { + "title": "Favorit löschen", + "content": "Möchtest du wirklich \"{name}\" löschen?" + }, + "favoriteEditDialog": { + "titleAdd": "Favorit hinzufügen", + "titleEdit": "Favorit bearbeiten", + "name": "Name", + "auto": "(auto)", + "ip": "IP-Adresse", + "port": "Port" + }, + "fileInfo": { + "title": "Datei-Information", + "fileName": "Dateiname:", + "path": "Pfad:", + "size": "Größe:", + "sender": "Absender:", + "time": "Zeit:" + }, + "fileNameInput": { + "title": "Dateiname eingeben", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Verlauf löschen", + "content": "Möchtest du wirklich den gesamten Verlauf löschen?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend kann nicht auf das lokale Netzwerk zugreifen. Bitte erlaube LocalSend den Zugriff auf das lokale Netzwerk in den Einstellungen.", + "gotoSettings": "Einstellungen" + }, + "messageInput": { + "title": "Nachricht eingeben", + "multiline": "Mehrzeilig" + }, + "noFiles": { + "title": "Keine Datei ausgewählt", + "content": "Bitte wähle mindestens eine Datei aus." + }, + "noPermission": { + "title": "Keine Berechtigung", + "content": "Du hast die erforderlichen Berechtigungen nicht gewährt. Bitte gewähre sie in den Einstellungen." + }, + "notAvailableOnPlatform": { + "title": "Nicht verfügbar", + "content": "Diese Funktion ist nur verfügbar auf:" + }, + "qr": { + "title": "QR-Code" + }, + "quickActions": { + "title": "Quick Actions", + "counter": "Zähler", + "prefix": "Prefix", + "padZero": "Mit Nullen auffüllen", + "sortBeforeCount": "Vorher alphabetisch sortieren", + "random": "Zufall" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Dateianfragen werden automatisch akzeptiert. Beachte, dass jeder im lokalen Netzwerk dir Dateien senden kann." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Dateianfragen werden jetzt automatisch von Geräten in deiner Favoritenliste akzeptiert.", + "Warnung: Dies ist derzeit nicht vollständig sicher, da ein Hacker, der den Fingerabdruck der Geräte in deiner Favoritenliste kennt, dir immer noch Dateien senden kann.", + "Diese Option ist jedoch immer noch sicherer als die Erlaubnis für jedes Gerät." + ] + }, + "pin": { + "title": "PIN eingeben" + }, + "sendModeHelp": { + "title": "Sendemodus", + "single": "Sende Dateien an einen Empfänger. Die Auswahl wird nach Abschluss der Dateiübertragung gelöscht.", + "multiple": "Sende Dateien an mehrere Empfänger. Die Auswahl bleibt erhalten.", + "link": "Empfänger, die LocalSend nicht installiert haben, können die ausgewählten Dateien herunterladen, in dem sie den Link im Browser öffnen." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Dateiname darf nicht leer sein", + "invalid": "Dateiname enthält ungültige Zeichen" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the \"close\" wording.", + "open": "@:general.open", + "close": "LocalSend beenden", + "closeWindows": "Beenden" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "PIN eingeben", + "invalidPin": "Ungültige PIN", + "tooManyAttempts": "Zu viele Versuche", + "rejected": "Abgelehnt", + "files": "Dateien", + "fileName": "Dateiname", + "size": "Größe" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "Bestätigen", + "cancel": "Abbrechen", + "edit": "Bearbeiten", + "gifIndicator": "GIF", + "loadFailed": "Ladevorgang ist fehlgeschlagen", + "original": "Ursprung", + "preview": "Vorschau", + "select": "Auswählen", + "emptyList": "Leere Liste", + "unSupportedAssetType": "Format ist nicht unterstützt.", + "unableToAccessAll": "Zugriff nicht möglich", + "viewingLimitedAssetsTip": "Zeige nur Dateien und Alben an, auf die die App zugreifen kann.", + "changeAccessibleLimitedAssets": "Tippen, um erlaubte Dateien zu aktualisieren", + "accessAllTip": "Die App kann nur auf einige der Dateien auf dem Gerät zugreifen. Öffne die Systemeinstellungen und erlaube der App, auf alle Dateien auf dem Gerät zuzugreifen.", + "goToSystemSettings": "Gehe zu den Systemeinstellungen", + "accessLimitedAssets": "Fahre mit eingeschränktem Zugriff fort", + "accessiblePathName": "Verfügbare Assets", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Bild", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Andere Medien", + "sActionPlayHint": "Abspielen", + "sActionPreviewHint": "Vorschau", + "sActionSelectHint": "Auswählen", + "sActionSwitchPathLabel": "Dateipfad ändern", + "sActionUseCameraHint": "Kamera benutzen", + "sNameDurationLabel": "Dauer", + "sUnitAssetCountLabel": "Anzahl" + } +} diff --git a/app/assets/i18n/el.json b/app/assets/i18n/el.json new file mode 100644 index 0000000..a17325b --- /dev/null +++ b/app/assets/i18n/el.json @@ -0,0 +1,527 @@ +{ + "locale": "Ελληνικά", + "appName": "LocalSend", + "general": { + "accept": "Αποδοχή", + "accepted": "Αποδεκτό", + "add": "Προσθήκη", + "advanced": "Προχωρημένες", + "cancel": "Άκυρο", + "close": "Κλείσιμο", + "confirm": "Επιβεβαίωση", + "continueStr": "Συνέχεια", + "copy": "Αντιγραφή", + "copiedToClipboard": "Αντιγράφηκε στο Πρόχειρο", + "decline": "Απόρριψη", + "done": "Έγινε", + "delete": "Διαγραφή", + "edit": "Επεξεργασία", + "error": "Σφάλμα", + "example": "Παράδειγμα", + "files": "Αρχεία", + "finished": "Ολοκληρώθηκε", + "hide": "Απόκρυψη", + "off": "Ανενεργή", + "offline": "Εκτός σύνδεσης", + "on": "Ενεργή", + "online": "Σε σύνδεση", + "open": "Άνοιγμα", + "queue": "Ουρά", + "quickSave": "Γρήγορη Αποθήκευση", + "quickSaveFromFavorites": "Γρήγορη Αποθήκευση των \"Αγαπημένων\"", + "renamed": "Μετονομάστηκε", + "reset": "Επαναφορά", + "restart": "Επανεκκίνηση", + "settings": "Ρυθμίσεις", + "skipped": "Παράλειψη", + "start": "Έναρξη", + "stop": "Διακοπή", + "save": "Αποθήκευση", + "unchanged": "Χωρίς αλλαγές", + "unknown": "Αγνωστο", + "noItemInClipboard": "Κανένα στοιχείο στο Πρόχειρο." + }, + "receiveTab": { + "title": "Λήψη", + "infoBox": { + "ip": "IP:", + "port": "Θύρα:", + "alias": "Όνομα συσκευής:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Αγαπημένα", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Αποστολή", + "selection": { + "title": "Επιλογή", + "files": "Αρχεία: {files}", + "size": "Μέγεθος: {size}" + }, + "picker": { + "file": "Αρχείο", + "folder": "Φάκελος", + "media": "Μέσα", + "text": "Κείμενο", + "app": "Εφαρμογή", + "clipboard": "Επικόλληση" + }, + "shareIntentInfo": "Μπορείτε επίσης να χρησιμοποιήσετε τη δυνατότητα \"Κοινή χρήση\" της κινητής συσκευής σας για να επιλέξετε αρχεία πιο εύκολα.", + "nearbyDevices": "Κοντινές συσκευές", + "thisDevice": "Αυτή η συσκευή", + "scan": "Αναζήτηση για συσκευές", + "manualSending": "Χειροκίνητη αποστολή", + "sendMode": "Λειτουργία αποστολής", + "sendModes": { + "single": "Ένας παραλήπτης", + "multiple": "Πολλαπλοί παραλήπτες", + "link": "Διαμοιρασμός μέσω συνδέσμου" + }, + "sendModeHelp": "Επεξήγηση", + "help": "Βεβαιωθείτε ότι ο επιθυμητός παραλήπτης βρίσκεται επίσης στο ίδιο δίκτυο Wi-Fi.", + "placeItems": "Τοποθετήστε στοιχεία για διαμοιρασμό." + }, + "settingsTab": { + "title": "Ρυθμίσεις", + "general": { + "title": "Γενικά", + "brightness": "Θέμα", + "brightnessOptions": { + "system": "Σύστημα", + "dark": "Σκοτεινό", + "light": "Φωτεινό" + }, + "color": "Χρώμα", + "colorOptions": { + "system": "Σύστημα", + "oled": "OLED" + }, + "language": "Γλώσσα", + "languageOptions": { + "system": "Σύστημα" + }, + "saveWindowPlacement": "Έξοδος: Αποθήκευση θέσης παραθύρου", + "saveWindowPlacementWindows": "Αποθήκευση της θέσης του παραθύρου κατά την έξοδο", + "minimizeToTray": "Έξοδος: Ελαχιστοποίηση στη γραμμή εργασιών/μενού", + "launchAtStartup": "Αυτόματη εκκίνηση μετά τη σύνδεση", + "launchMinimized": "Αυτόματη εκκίνηση: Έναρξη ελαχιστοποιημένο", + "showInContextMenu": "Προβολή του LocalSend στο μενού του περιβάλλοντος εργασίας", + "animations": "Οπτικά εφέ" + }, + "receive": { + "title": "Λήψη", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Αυτόματη ολοκλήρωση", + "destination": "Προορισμός", + "downloads": "(Λήψεις)", + "saveToGallery": "Αποθήκευση μέσου στη συλλογή", + "saveToHistory": "Αποθήκευση στο ιστορικό" + }, + "send": { + "title": "Αποστολή", + "shareViaLinkAutoAccept": "Κοινοποίηση μέσω συνδέσμου: Αυτόματη αποδοχή" + }, + "network": { + "title": "Δίκτυο", + "needRestart": "Κάντε επανεκκίνηση του διακομιστή για να εφαρμοστούν οι ρυθμίσεις!", + "server": "Διακομιστής", + "alias": "Όνομα συσκευής", + "deviceType": "Τύπος συσκευής", + "deviceModel": "Μοντέλο συσκευής", + "port": "Θύρα", + "discoveryTimeout": "Λήξη χρόνου ανακάλυψης", + "useSystemName": "Χρήση του ονόματος του συστήματος", + "generateRandomAlias": "Δημιουργία τυχαίου ψευδώνυμου", + "portWarning": "Ενδέχεται να μην εντοπιστείτε από άλλες συσκευές επειδή χρησιμοποιείτε μια προσαρμοσμένη θύρα. (προεπιλογή: {defaultPort})", + "encryption": "Κρυπτογράφηση", + "multicastGroup": "Αναμετάδοση", + "multicastGroupWarning": "Ενδέχεται να μην εντοπιστείτε από άλλες συσκευές επειδή χρησιμοποιείτε μια προσαρμοσμένη διεύθυνση αναμετάδοσης. (προεπιλογή: {defaultMulticast})", + "network": "Δίκτυο", + "networkOptions": { + "all": "Όλα", + "filtered": "Περιορισμένο" + } + }, + "other": { + "title": "Άλλα", + "support": "Υποστηρίξτε το LocalSend", + "donate": "Δωρεά", + "privacyPolicy": "Πολιτική Απορρήτου", + "termsOfUse": "Όροι Χρήσης" + }, + "advancedSettings": "Προχωρημένες ρυθμίσεις" + }, + "troubleshootPage": { + "title": "Αντιμετώπιση προβλημάτων", + "subTitle": "Αυτή η εφαρμογή δεν λειτουργεί όπως αναμένεται; Εδώ μπορείτε να βρείτε κοινές λύσεις.", + "solution": "Λύση:", + "fixButton": "Αυτόματη διόρθωση", + "firewall": { + "symptom": "Αυτή η εφαρμογή μπορεί να στείλει αρχεία σε άλλες συσκευές, αλλά άλλες συσκευές δεν μπορούν να στείλουν αρχεία σε αυτήν τη συσκευή.", + "solution": "Αυτό είναι πιθανότατα ένα ζήτημα του τείχους προστασίας. Μπορείτε να το λύσετε επιτρέποντας τις εισερχόμενες συνδέσεις (UDP και TCP) στη θύρα {port}.", + "openFirewall": "Άνοιγμα Τείχους Προστασίας" + }, + "noDiscovery": { + "symptom": "Αυτή η συσκευή δεν μπορεί ανακαλυφθεί από άλλες συσεκυές.", + "solution": "Βεβαιωθείτε ότι όλες οι συσκευές βρίσκονται στο ίδιο δίκτυο Wi-Fi και μοιράζονται την ίδια διαμόρφωση (θύρα, διεύθυνση multicast, κρυπτογράφηση). Μπορείτε να προσπαθήσετε να πληκτρολογήσετε τη διεύθυνση IP της συσκευής προορισμού με μη αυτόματο τρόπο. Εάν αυτό λειτουργεί, εξετάστε το ενδεχόμενο να προσθέσετε αυτήν τη συσκευή στα αγαπημένα, ώστε να μπορεί να ανακαλυφθεί αυτόματα στο μέλλον." + }, + "noConnection": { + "symptom": "Και οι δύο συσκευές δεν μπορούν να ανακαλύψουν η μία την άλλη ούτε μπορούν να μοιραστούν αρχεία.", + "solution": "Υπάρχει το πρόβλημα και από τις δύο πλευρές; Πρέπει να βεβαιωθείτε ότι και οι δύο συσκευές βρίσκονται στο ίδιο δίκτυο Wi-Fi και μοιράζονται την ίδια διαμόρφωση (θύρα, διεύθυνση αναμετάδοσης, κρυπτογράφηση). Το wifi ενδέχεται να μην επιτρέπει την επικοινωνία μεταξύ των συμμετεχόντων. Σε αυτήν την περίπτωση, αυτή η επιλογή πρέπει να είναι ενεργοποιημένη στο δρομολογητή." + } + }, + "receiveHistoryPage": { + "title": "Ιστορικό", + "openFolder": "Άνοιγμα φακέλου", + "deleteHistory": "Διαγραφή ιστορικού", + "empty": "Το ιστορικό είναι κενό.", + "entryActions": { + "open": "Άνοιγμα αρχείου", + "showInFolder": "Προβολή στον φάκελο", + "info": "Πληροφορίες", + "deleteFromHistory": "Διαγραφή από το ιστορικό" + } + }, + "apkPickerPage": { + "title": "Εφαρμογές (APK)", + "excludeSystemApps": "Εξαίρεση εφαρμογών συστήματος", + "excludeAppsWithoutLaunchIntent": "Εξαίρεση μη εκκινήσιμων εφαρμογών", + "apps": "{n} Εφαρμογές" + }, + "selectedFilesPage": { + "deleteAll": "Διαγραφή όλων" + }, + "receivePage": { + "subTitle": { + "one": "θέλει να σου στείλει ένα αρχείο", + "other": "θέλει να σου στείλει {n} αρχεία" + }, + "subTitleMessage": "σου έστειλε ένα μήνυμα:", + "subTitleLink": "σου έστειλε ένα σύνδεσμο:", + "canceled": "Ο αποστολέας ακύρωσε το αίτημα." + }, + "receiveOptionsPage": { + "title": "Επιλογές", + "appDirectory": "(Φάκελος LocalSend)", + "saveToGalleryOff": "Απενεργοποιήθηκε αυτόματα επειδή υπάρχουν κατάλογοι.", + "destination": "@:settingsTab.receive.destination", + "saveToGallery": "@:settingsTab.receive.saveToGallery" + }, + "sendPage": { + "waiting": "Αναμονή για απάντηση…", + "rejected": "Ο παραλήπτης απέρριψε το αίτημα.", + "busy": "Ο παραλήπτης είναι απασχολημένος με άλλο αίτημα.", + "tooManyAttempts": "@:web.tooManyAttempts" + }, + "progressPage": { + "titleSending": "Γίνεται αποστολή αρχείων", + "titleReceiving": "Γίνεται λήψη αρχείων", + "savedToGallery": "Αποθηκεύτηκε στις Φωτογραφίες", + "total": { + "title": { + "sending": "Συνολική πρόοδος ({time})", + "finishedError": "Ολοκληρώθηκε με σφάλμα", + "canceledSender": "Ακυρώθηκε από τον αποστολέα", + "canceledReceiver": "Ακυρώθηκε από τον παραλήπτη" + }, + "count": "Αρχεία: {curr} / {n}", + "size": "Μέγεθος: {curr} / {n}", + "speed": "Ταχύτητα: {speed}/s" + } + }, + "webSharePage": { + "title": "Διαμοιρασμός μέσω συνδέσμου", + "loading": "Εκκίνηση διακομιστή…", + "stopping": "Σταμάτημα διακομιστή…", + "error": "Ένα σφάλμα προέκυψε κατά την εκκίνηση του διακομιστή.", + "openLink": { + "one": "Άνοιγμα αυτού του συνδέσμου στον φυλλομετρητή:", + "other": "Άνοιγμα ενός από αυτούς τους συνδέσμους στον φυλλομετρητή:" + }, + "requests": "Αιτήματα", + "noRequests": "Κανένα αίτμηα ακόμα.", + "autoAccept": "Αυτόματη αποδοχή αιτημάτων", + "requirePin": "Απαίτηση PIN", + "pinHint": "Το PIN είναι \"{pin}\"", + "encryptionHint": "Το LocalSend χρησιμοποιεί αυτο-υπογεγραμμένο πιστοποιητικό. Χρειάζεται να το αποθεχτείτε στον φυλλομετρητή.", + "pendingRequests": "Αναμονή αιτημάτων: {n}", + "encryption": "@:settingsTab.network.encryption" + }, + "aboutPage": { + "title": "Σχετικά με το LocalSend", + "description": [ + "Το LocalSend είναι μια δωρεάν εφαρμογή ανοιχτού κώδικα που σας επιτρέπει να μοιράζεστε με ασφάλεια αρχεία και μηνύματα με κοντινές συσκευές μέσω του τοπικού σας δικτύου χωρίς να χρειάζεστε σύνδεση στο διαδίκτυο.", + "Αυτή η εφαρμογή είναι διαθέσιμη σε Android, iOS, macOS, Windows και Linux. Μπορείτε να βρείτε όλες τις επιλογές λήψης στην επίσημη αρχική σελίδα." + ], + "author": "Δημιουργός", + "contributors": "Συντελεστές", + "packagers": "Συσκευαστές", + "translators": "Μεταφραστές" + }, + "donationPage": { + "title": "Δωρεά", + "info": "Το LocalSend είναι δωρεάν, ανοιχτού κώδικα και χωρίς διαφημίσεις. Εάν σας αρέσει η εφαρμογή, μπορείτε να υποστηρίξετε την ανάπτυξή της με μια δωρεά.", + "donate": "Δωρεά {amount}", + "thanks": "Ευχαριστούμε πολύ!", + "restore": "Επαναφορά αγοράς" + }, + "changelogPage": { + "title": "Καταγραφή αλλαγών" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Διαφορετικές τοποθεσίες μπορεί να έχουν διαφορετικές λέξεις, μπορεί να μην ταιριάζουν 1:1", + "adjectives": [ + "Λατρευτό", + "Πανεμορφο", + "Μεγάλο", + "Λαμπερό", + "Ζουμερό", + "Καλοπροαίρετο", + "Δροσερό", + "Χαριτωμένο", + "Πονηρό", + "Καταχθώνιο", + "Ενεργητικό", + "Αποτελεσματικό", + "Φανταστικό", + "Γρήγορο", + "Ντροπαλό", + "Φρέσκο", + "Καλό", + "Υπέροχο", + "Εξαιρετικό", + "Τεμπέλικο", + "Θερμό", + "Ψυχρό", + "Νευρικό", + "Ήρεμο", + "Καθαρό", + "Ομορφο", + "Υπομονετικο", + "Αρκετά", + "Χαρούμενο", + "Πλούσιο", + "Μυστικό", + "Έξυπνο", + "Ανυπόμονο", + "Οκνηρό", + "Νυσταγμένο", + "Ισχυρό", + "Τακτοποιημένο", + "Σοφό" + ], + "fruits": [ + "Μήλο", + "Αβοκάντο", + "Μανταρίνι", + "Βατόμουρο", + "Σκόρδο", + "Μπρόκολο", + "Καρότο", + "Κεράσι", + "Μαρούλι", + "Σταφύλι", + "Λεμόνι", + "Λάχανο", + "Μάνγκο", + "Πεπόνι", + "Μανιτάρι", + "Κρεμμύδι", + "Πορτοκάλι", + "Κολοκύθι", + "Ροδάκινο", + "Αχλάδι", + "Καρπούζι", + "Κάστανο", + "Πράσο", + "Ακτινίδιο", + "Σύκο", + "Αγγούρι" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "Προσθήκη στις επιλογές", + "content": "Τι θέλετε να προστεθεί;" + }, + "openFile": { + "title": "Άνοιγμα αρχείου", + "content": "Θέλετε να ανοιχτεί το ληφθέν αρχείο;" + }, + "addressInput": { + "title": "Εισαγωγή διεύθυνσης", + "ip": "Διεύθυνση IP", + "recentlyUsed": "Χρησιμοποιήθηκε πρόσφατα: ", + "hashtag": "Χάσταγκ" + }, + "cancelSession": { + "title": "Ακύρωση της μεταφοράς του αρχείου", + "content": "Θέλετε σίγουρα να ακυρωθεί η μεταφορά του αρχείου?" + }, + "cannotOpenFile": { + "title": "Δεν μπορεί να ανοιχτεί το αρχείο", + "content": "Δεν μπορεί να ανοιχτεί το \"{file}\". Έχετε μήπως μετακινήσει, μενονομάσει ή διαγράψει το αρχείο;" + }, + "encryptionDisabledNotice": { + "title": "Η κρυπτογράφηση απενεργοποιήθηκε", + "content": "Η επικοινωνία πραγματοποιείται πλέον μέσω του μη κρυπτογραφημένου πρωτοκόλλου HTTP. Για να χρησιμοποιήσετε το HTTPS, ενεργοποιήστε ξανά την κρυπτογράφηση." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Αγαπημένα", + "noFavorites": "Καμία αγαπημένη συσκευή προς το παρόν.", + "addFavorite": "Προσθήκη" + }, + "favoriteDeleteDialog": { + "title": "Διαγραφή από τα αγαπημένα", + "content": "Θέλετε σίγουρα να διαγραφεί από τα αγαπημένα το \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Προσθήκη στα αγαπημένα", + "titleEdit": "Ρυθμίσεις", + "name": "Όνομα συσκευής", + "auto": "(αυτόματα)", + "ip": "Διεύθυνση IP", + "port": "Θύρα" + }, + "fileInfo": { + "title": "Πληροφορίες αρχείου", + "fileName": "Όνομα αρχείου:", + "path": "Μονοπάτι:", + "size": "Μέγεθος:", + "sender": "Αποστολέας:", + "time": "Ώρα:" + }, + "fileNameInput": { + "title": "Εισάγετε το όνομα του αρχείου", + "original": "Πρωτότυπο: {original}" + }, + "historyClearDialog": { + "title": "Καθαρισμός ιστορικού", + "content": "Θέλετε σίγουρα να διαγράψετε όλο το ιστορικό;" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "Το LocalSend δεν μπορεί να βρει άλλες συσκευές χωρίς την άδεια σάρωσης του τοπικού δικτύου. Παρακαλείστε να παραχωρήσετε αυτό το δικαίωμα στις ρυθμίσεις.", + "gotoSettings": "Ρυθμίσεις" + }, + "messageInput": { + "title": "Πληκτρολογήστε το μήνυμα", + "multiline": "Πολλαπλών γραμμών" + }, + "noFiles": { + "title": "Κανένα αρχείο δεν επιλέχθηκε", + "content": "Παρακαλώ επιλέξτε τουλάχιστον ένα αρχείο." + }, + "noPermission": { + "title": "Χωρίς άδεια", + "content": "Δεν έχετε παραχωρήσει τις απαραίτητες άδειες. Παρακαλώ παραχωρήστε τα στις ρυθμίσεις." + }, + "notAvailableOnPlatform": { + "title": "Μη διαθέσιμο", + "content": "Αυτό το χαρακτηριστικό είναι διαθέσιμο μόνο σε:" + }, + "qr": { + "title": "Κώδικας QR" + }, + "quickActions": { + "title": "Γρήγορες Ενέργειες", + "counter": "Μετρητής", + "prefix": "Πρόθεμα", + "padZero": "Συμπλήρωση με μηδενικά", + "sortBeforeCount": "Ταξινόμηση αλφαβητικά εκ των προτέρων", + "random": "Τυχαία" + }, + "quickSaveNotice": { + "content": "Τα αιτήματα αρχείων γίνονται αυτόματα δεκτά. Έχετε υπόψη σας ότι όλοι στο τοπικό δίκτυο μπορούν να σας στείλουν αρχεία.", + "title": "@:general.quickSave" + }, + "quickSaveFromFavoritesNotice": { + "content": [ + "Τα αιτήματα αρχείων γίνονται τώρα αυτόματα αποδεκτά από τις συσκευές της λίστας των αγαπημένων σας.", + "Προειδοποίηση! Επί του παρόντος, αυτό δεν είναι απολύτως ασφαλές, ένας χάκερ που έχει το δακτυλικό αποτύπωμα οποιασδήποτε συσκευής από τη λίστα των αγαπημένων σας μπορεί να σας στείλει αρχεία χωρίς περιορισμό.", + "Ωστόσο, αυτή η επιλογή είναι ακόμα πιο ασφαλής από το να επιτρέπεται σε όλους τους χρήστες στο τοπικό δίκτυο να σας στείλουν αρχεία χωρίς περιορισμό." + ], + "title": "@:general.quickSaveFromFavorites" + }, + "pin": { + "title": "Εισαγωγή PIN" + }, + "sendModeHelp": { + "title": "Λειτουργίες αποστολής", + "single": "Στέλνει αρχεία σε έναν παραλήπτη. Η επιλογή θα διαγραφεί μετά την ολοκλήρωση της μεταφοράς του αρχείου.", + "multiple": "Στέλνει αρχεία σε πολλούς παραλήπτες. Η επιλογή δεν θα διαγραφεί.", + "link": "Οι παραλήπτες που δεν έχουν εγκαταστήσει το LocalSend μπορούν να πραγματοποιήσουν λήψη των επιλεγμένων αρχείων ανοίγοντας τον σύνδεσμο στον φυλλομετρητή τους." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Το όνομα του αρχείου δεν μπορεί να είναι κενό", + "invalid": "Το όνομα του αρχείου περιέχει μη έγκυρους χαρακτήρες" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "Έξοδος από το LocalSend", + "closeWindows": "Έξοδος" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Εισαγωγή PIN", + "invalidPin": "Μη έγκυρο PIN", + "tooManyAttempts": "Πάρα πολλές προσπάθειες", + "rejected": "Απορρίφθηκε", + "files": "Αρχεία", + "fileName": "Όνομα αρχείου", + "size": "Μέγεθος" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "Επιβεβαιώση", + "cancel": "Ακύρωση", + "edit": "Επεξεργασία", + "gifIndicator": "GIF", + "loadFailed": "Η φόρτωση απέτυχε", + "original": "Προέλευση", + "preview": "Προεπισκόπηση", + "select": "Επιλογή", + "emptyList": "Κενή λίστα", + "unSupportedAssetType": "Μη υποστηριζόμενος τύπος αρχείου.", + "unableToAccessAll": "Δεν είναι δυνατή η πρόσβαση σε όλα τα αρχεία της συσκευής", + "viewingLimitedAssetsTip": "Προβολή μόνο των αρχείων και άλμπουμ που είναι προσβάσιμα από την εφαρμογή.", + "changeAccessibleLimitedAssets": "Κάντε κλικ για ενημέρωση των προσβάσιμων αρχείων", + "accessAllTip": "Η εφαρμογή μπορεί να έχει πρόσβαση μόνο σε ορισμένα αρχεία στη συσκευή. Μεταβείτε στις ρυθμίσεις συστήματος και επιτρέψτε στην εφαρμογή να έχει πρόσβαση σε όλα τα μέσα της συσκευής.", + "goToSystemSettings": "Μεταβείτε στις ρυθμίσεις συστήματος", + "accessLimitedAssets": "Συνεχίστε με περιορισμένη πρόσβαση", + "accessiblePathName": "Προσβάσιμα αρχεία", + "sTypeAudioLabel": "Ήχος", + "sTypeImageLabel": "Εικόνα", + "sTypeVideoLabel": "Βίντεο", + "sTypeOtherLabel": "Άλλα μέσα", + "sActionPlayHint": "αναπαραγωγή", + "sActionPreviewHint": "προεπισκόπηση", + "sActionSelectHint": "επιλογή", + "sActionSwitchPathLabel": "αλλαγή μονοπατιού", + "sActionUseCameraHint": "χρήση κάμερας", + "sNameDurationLabel": "διάρκεια", + "sUnitAssetCountLabel": "μετρητής" + }, + "networkInterfacesPage": { + "info": "Από προεπιλογή, το LocalSend χρησιμοποιεί όλες τις διαθέσιμες διεπαφές δικτύου. Μπορείτε να εξαιρέσετε τα ανεπιθύμητα δίκτυα εδώ. Πρέπει να κάνετε επανεκκίνηση του διακομιστή για να εφαρμόσετε τις αλλαγές.", + "title": "Διεπαφές δικτύου", + "preview": "Προεπισκόπηση", + "whitelist": "Λευκή λίστα", + "blacklist": "Μαύρη λίστα" + } +} diff --git a/app/assets/i18n/en-IN.json b/app/assets/i18n/en-IN.json new file mode 100644 index 0000000..3ce39d9 --- /dev/null +++ b/app/assets/i18n/en-IN.json @@ -0,0 +1,535 @@ +{ + "locale": "English(India)", + "appName": "LocalSend", + "general": { + "accept": "Accept", + "accepted": "Accepted", + "add": "Add", + "advanced": "Advanced", + "cancel": "Cancel", + "close": "Close", + "confirm": "Confirm", + "continueStr": "Continue", + "copy": "Copy", + "copiedToClipboard": "Copied to Clipboard", + "decline": "Decline", + "done": "Done", + "delete": "Delete", + "edit": "Edit", + "error": "Error", + "example": "Example", + "files": "Files", + "finished": "Finished", + "hide": "Hide", + "off": "Off", + "offline": "Offline", + "on": "On", + "online": "Online", + "open": "Open", + "queue": "Queue", + "quickSave": "Quick Save", + "quickSaveFromFavorites": "Quick Save for \"Favourites\"", + "renamed": "Renamed", + "reset": "Reset", + "restart": "Restart", + "settings": "Settings", + "skipped": "Skipped", + "start": "Start", + "stop": "Stop", + "save": "Save", + "unchanged": "Unchanged", + "unknown": "Unknown", + "noItemInClipboard": "No items in Clipboard." + }, + "receiveTab": { + "title": "Receive", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Device name:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favourites", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Send", + "selection": { + "title": "Selection", + "files": "Files: {files}", + "size": "Size: {size}" + }, + "picker": { + "file": "File", + "folder": "Folder", + "media": "Media", + "text": "Text", + "app": "App", + "clipboard": "Paste" + }, + "shareIntentInfo": "You can also use the \"Share\" feature of your mobile device to select files more easily.", + "nearbyDevices": "Nearby devices", + "thisDevice": "This Device", + "scan": "Look for devices", + "manualSending": "Manual Sending", + "sendMode": "Send mode", + "sendModes": { + "single": "Single recipient", + "multiple": "Multiple recipients", + "link": "Share via link" + }, + "sendModeHelp": "Explanation", + "help": "Please ensure that the desired target is also on the same Wi-Fi network.", + "placeItems": "Place items to share." + }, + "settingsTab": { + "title": "Settings", + "general": { + "title": "General", + "brightness": "Theme", + "brightnessOptions": { + "system": "System", + "dark": "Dark", + "light": "Light" + }, + "color": "Color", + "colorOptions": { + "system": "System", + "oled": "OLED" + }, + "language": "Language", + "languageOptions": { + "system": "System" + }, + "saveWindowPlacement": "Quit: Save window placement", + "saveWindowPlacementWindows": "Save window position after exit", + "minimizeToTray": "Quit: Minimize to Tray/Menu Bar", + "launchAtStartup": "Autostart after login", + "launchMinimized": "Autostart: Start hidden", + "showInContextMenu": "Show LocalSend in context menu", + "animations": "Animations" + }, + "receive": { + "title": "Receive", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Auto Finish", + "destination": "Destination", + "downloads": "(Downloads)", + "saveToGallery": "Save media to gallery", + "saveToHistory": "Save to history" + }, + "send": { + "title": "Send", + "shareViaLinkAutoAccept": "Share via link: Auto accept" + }, + "network": { + "title": "Network", + "needRestart": "Restart the server to apply the settings!", + "server": "Server", + "alias": "Device name", + "deviceType": "Device type", + "deviceModel": "Device model", + "port": "Port", + "discoveryTimeout": "Discovery Timeout", + "useSystemName": "Use system name", + "generateRandomAlias": "Generate random alias", + "portWarning": "You might not be detected by other devices because you are using a custom port. (default: {defaultPort})", + "encryption": "Encryption", + "multicastGroup": "Multicast", + "multicastGroupWarning": "You might not be detected by other devices because you are using a custom multicast address. (default: {defaultMulticast})", + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + } + }, + "other": { + "title": "Other", + "support": "Support LocalSend", + "donate": "Donate", + "privacyPolicy": "Privacy Policy", + "termsOfUse": "Terms of Use" + }, + "advancedSettings": "Advanced settings" + }, + "troubleshootPage": { + "title": "Troubleshoot", + "subTitle": "Does the app not work as expected? Here you can find some common solutions.", + "solution": "Solution:", + "fixButton": "Fix automatically", + "firewall": { + "symptom": "This app can send files to other devices; but other devices cannot send files to this device.", + "solution": "This is most likely a firewall issue. You can solve this by allowing incoming connections (UDP and TCP) on port {port}.", + "openFirewall": "Open Firewall" + }, + "noDiscovery": { + "symptom": "This device cannot discover other devices.", + "solution": "Please make sure that all devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). You can try to type the IP address of the target device manually. If this works, consider adding this device to the favourites so it can be automatically discovered in the future." + }, + "noConnection": { + "symptom": "Both devices cannot discover each other nor can they share files.", + "solution": "Does the problem exist on both sides? If so, you need to make sure that both devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). The network may not allow communication between participants. In this case, this option must be enabled on the router." + } + }, + "receiveHistoryPage": { + "title": "History", + "openFolder": "Open folder", + "deleteHistory": "Delete history", + "empty": "The history is empty.", + "entryActions": { + "open": "Open file", + "showInFolder": "Show in folder", + "info": "Information", + "deleteFromHistory": "Delete from history" + } + }, + "apkPickerPage": { + "title": "Apps (APK)", + "excludeSystemApps": "Exclude system apps", + "excludeAppsWithoutLaunchIntent": "Exclude non-launchable apps", + "apps": "{n} Apps" + }, + "selectedFilesPage": { + "deleteAll": "Delete all" + }, + "receivePage": { + "subTitle": { + "one": "wants to send you a file", + "other": "wants to send you {n} files" + }, + "subTitleMessage": "sent you a message:", + "subTitleLink": "sent you a link:", + "canceled": "The sender has cancelled the request." + }, + "receiveOptionsPage": { + "title": "Options", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend folder)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Turned off automatically because there are directories." + }, + "sendPage": { + "waiting": "Waiting for response…", + "rejected": "The recipient has rejected the request.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "The recipient is busy with another request." + }, + "progressPage": { + "titleSending": "Sending files", + "titleReceiving": "Receiving files", + "savedToGallery": "Saved in Photos", + "total": { + "title": { + "sending": "Total progress ({time})", + "finishedError": "Finished with error", + "canceledSender": "Cancelled by sender", + "canceledReceiver": "Cancelled by receiver" + }, + "count": "Files: {curr} / {n}", + "size": "Size: {curr} / {n}", + "speed": "Speed: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Use 'h' for hours abbreviation and 'm' for minutes", + "@days": "Use 'd' for days, 'h' for hours, and 'm' for minutes" + } + }, + "webSharePage": { + "title": "Share via link", + "loading": "Starting server…", + "stopping": "Stopping server…", + "error": "An error occurred while starting the server.", + "openLink": { + "one": "Open this link in your browser:", + "other": "Open one of these links in your browser:" + }, + "requests": "Requests", + "noRequests": "No requests yet.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Automatically accept requests", + "requirePin": "Require PIN", + "pinHint": "The PIN is \"{pin}\"", + "encryptionHint": "LocalSend uses a self-signed certificate. You need to accept it in your browser.", + "pendingRequests": "Pending requests: {n}" + }, + "aboutPage": { + "title": "About LocalSend", + "description": [ + "LocalSend is a free, open-source app that allows you to securely share files and messages with nearby devices over your local network without needing an internet connection.", + "This app is available on Android, iOS, macOS, Windows and Linux. You can find all download options on the official homepage." + ], + "author": "Author", + "contributors": "Contributors", + "packagers": "Packagers", + "translators": "Translators" + }, + "donationPage": { + "title": "Donate", + "info": "LocalSend is free, open-source and without any ads. If you like the app, you can support the development with a donation.", + "donate": "Donate {amount}", + "thanks": "Thank you very much!", + "restore": "Restore purchase" + }, + "changelogPage": { + "title": "Changelog" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Different locales may have different words, it may not match 1:1", + "adjectives": [ + "Adorable", + "Beautiful", + "Big", + "Bright", + "Clean", + "Clever", + "Cool", + "Cute", + "Cunning", + "Determined", + "Energetic", + "Efficient", + "Fantastic", + "Fast", + "Fine", + "Fresh", + "Good", + "Gorgeous", + "Great", + "Handsome", + "Hot", + "Kind", + "Lovely", + "Mystic", + "Neat", + "Nice", + "Patient", + "Pretty", + "Powerful", + "Rich", + "Secret", + "Smart", + "Solid", + "Special", + "Strategic", + "Strong", + "Tidy", + "Wise" + ], + "fruits": [ + "Apple", + "Avocado", + "Banana", + "Blackberry", + "Blueberry", + "Broccoli", + "Carrot", + "Cherry", + "Coconut", + "Grape", + "Lemon", + "Lettuce", + "Mango", + "Melon", + "Mushroom", + "Onion", + "Orange", + "Papaya", + "Peach", + "Pear", + "Pineapple", + "Potato", + "Pumpkin", + "Raspberry", + "Strawberry", + "Tomato" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "Add to selection", + "content": "What do you want to add?" + }, + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "addressInput": { + "title": "Enter address", + "hashtag": "Hashtag", + "ip": "IP Address", + "recentlyUsed": "Recently used: " + }, + "cancelSession": { + "title": "Cancel file transfer", + "content": "Do you really want to cancel the file transfer?" + }, + "cannotOpenFile": { + "title": "Cannot open file", + "content": "Could not open \"{file}\". Has this file been moved, renamed or deleted?" + }, + "encryptionDisabledNotice": { + "title": "Encryption disabled", + "content": "Communication now takes place via the unencrypted HTTP protocol. To use HTTPS, enable encryption again." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favorites", + "noFavorites": "No favourite devices yet.", + "addFavorite": "Add" + }, + "favoriteDeleteDialog": { + "title": "Delete from favourites", + "content": "Do you really want to delete from favourites \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Add to favourites", + "titleEdit": "Settings", + "name": "Device name", + "auto": "(auto)", + "ip": "IP Address", + "port": "Port" + }, + "fileInfo": { + "title": "File information", + "fileName": "File name:", + "path": "Path:", + "size": "Size:", + "sender": "Sender:", + "time": "Time:" + }, + "fileNameInput": { + "title": "Enter file name", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Clear history", + "content": "Do you really want to delete the entire history?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend can't find other devices without having the permission to scan the local network. Please grant this permission in the settings.", + "gotoSettings": "Settings" + }, + "messageInput": { + "title": "Type message", + "multiline": "Multiline" + }, + "noFiles": { + "title": "No file selected", + "content": "Please select at least one file." + }, + "noPermission": { + "title": "No permission", + "content": "You have not granted the necessary permissions. Please grant them in the settings." + }, + "notAvailableOnPlatform": { + "title": "Not available", + "content": "This feature is only available on:" + }, + "qr": { + "title": "QR Code" + }, + "quickActions": { + "title": "Quick Actions", + "counter": "Counter", + "prefix": "Prefix", + "padZero": "Pad with zeros", + "sortBeforeCount": "Sort alphabetically beforehand", + "random": "Random" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "File requests are automatically accepted. Be aware that everyone on the local network can send you files." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "File requests are now accepted automatically from devices in your favourites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favourites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + }, + "pin": { + "title": "Enter PIN" + }, + "sendModeHelp": { + "title": "Send modes", + "single": "Sends files to one recipient. Selection will be cleared after finished file transfer.", + "multiple": "Sends files to multiple recipients. Selection will not be cleared.", + "link": "Recipients who do not have LocalSend installed can download the selected files by opening the link in their browser." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Filename cannot be empty", + "invalid": "Filename contains invalid characters" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "Quit LocalSend", + "closeWindows": "Exit" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Enter PIN", + "invalidPin": "Invalid PIN", + "tooManyAttempts": "Too many attempts", + "rejected": "Rejected", + "files": "Files", + "fileName": "File name", + "size": "Size" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and iPhone", + "confirm": "Confirm", + "cancel": "Cancel", + "edit": "Edit", + "gifIndicator": "GIF", + "loadFailed": "Load failed", + "original": "Origin", + "preview": "Preview", + "select": "Select", + "emptyList": "Empty list", + "unSupportedAssetType": "Unsupported file type.", + "unableToAccessAll": "Unable to access all files on the device", + "viewingLimitedAssetsTip": "Only view files and albums accessible to the app.", + "changeAccessibleLimitedAssets": "Click to update accessible files", + "accessAllTip": "App can only access some files on the device. Go to system settings and allow the app to access all media on the device.", + "goToSystemSettings": "Go to system settings", + "accessLimitedAssets": "Continue with limited access", + "accessiblePathName": "Accessible files", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Image", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Other media", + "sActionPlayHint": "play", + "sActionPreviewHint": "preview", + "sActionSelectHint": "select", + "sActionSwitchPathLabel": "change path", + "sActionUseCameraHint": "use camera", + "sNameDurationLabel": "duration", + "sUnitAssetCountLabel": "count" + }, + "networkInterfacesPage": { + "preview": "Preview", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "whitelist": "Whitelist", + "blacklist": "Blacklist", + "title": "Network Interfaces" + } +} diff --git a/app/assets/i18n/en.json b/app/assets/i18n/en.json new file mode 100644 index 0000000..d1f929f --- /dev/null +++ b/app/assets/i18n/en.json @@ -0,0 +1,535 @@ +{ + "locale": "English", + "appName": "LocalSend", + "general": { + "accept": "Accept", + "accepted": "Accepted", + "add": "Add", + "advanced": "Advanced", + "cancel": "Cancel", + "close": "Close", + "confirm": "Confirm", + "continueStr": "Continue", + "copy": "Copy", + "copiedToClipboard": "Copied to Clipboard", + "decline": "Decline", + "done": "Done", + "delete": "Delete", + "edit": "Edit", + "error": "Error", + "example": "Example", + "files": "Files", + "finished": "Finished", + "hide": "Hide", + "off": "Off", + "offline": "Offline", + "on": "On", + "online": "Online", + "open": "Open", + "queue": "Queue", + "quickSave": "Quick Save", + "quickSaveFromFavorites": "Quick Save for \"Favorites\"", + "renamed": "Renamed", + "reset": "Undo changes", + "restart": "Restart", + "settings": "Settings", + "skipped": "Skipped", + "start": "Start", + "stop": "Stop", + "save": "Save", + "unchanged": "Unchanged", + "unknown": "Unknown", + "noItemInClipboard": "No items in Clipboard." + }, + "receiveTab": { + "title": "Receive", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Device name:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favorites", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Send", + "selection": { + "title": "Selection", + "files": "Files: {files}", + "size": "Size: {size}" + }, + "picker": { + "file": "File", + "folder": "Folder", + "media": "Media", + "text": "Text", + "app": "App", + "clipboard": "Paste" + }, + "shareIntentInfo": "You can also use the \"Share\" feature of your mobile device to select files more easily.", + "nearbyDevices": "Nearby devices", + "thisDevice": "This Device", + "scan": "Search devices", + "manualSending": "Manual sending", + "sendMode": "Send mode", + "sendModes": { + "single": "Single recipient", + "multiple": "Multiple recipients", + "link": "Share via link" + }, + "sendModeHelp": "Explanation", + "help": "Please ensure that the desired target is also on the same Wi-Fi network.", + "placeItems": "Place items to share." + }, + "settingsTab": { + "title": "Settings", + "general": { + "title": "General", + "brightness": "Theme", + "brightnessOptions": { + "system": "System", + "dark": "Dark", + "light": "Light" + }, + "color": "Color", + "colorOptions": { + "system": "System", + "oled": "OLED" + }, + "language": "Language", + "languageOptions": { + "system": "System" + }, + "saveWindowPlacement": "Save window position after quit", + "saveWindowPlacementWindows": "Save window position after exit", + "minimizeToTray": "Minimize to the System Tray/Menu Bar when closing", + "launchAtStartup": "Autostart after login", + "launchMinimized": "Autostart: Start hidden", + "showInContextMenu": "Show LocalSend in context menu", + "animations": "Animations" + }, + "receive": { + "title": "Receive", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Auto Finish", + "destination": "Save to folder", + "downloads": "(Downloads)", + "saveToGallery": "Save media to gallery", + "saveToHistory": "Save to history" + }, + "send": { + "title": "Send", + "shareViaLinkAutoAccept": "Automatically accept requests in \"Share via link\" mode" + }, + "network": { + "title": "Network", + "needRestart": "Restart the server to apply the settings!", + "server": "Server", + "alias": "Device name", + "deviceType": "Device type", + "deviceModel": "Device model", + "port": "Port", + "network": "Network", + "networkOptions": { + "all": "All", + "filtered": "Filtered" + }, + "discoveryTimeout": "Discovery Timeout", + "useSystemName": "Use system name", + "generateRandomAlias": "Generate random alias", + "portWarning": "You might not be detected by other devices because you are using a custom port. (default: {defaultPort})", + "encryption": "Encryption", + "multicastGroup": "Multicast address", + "multicastGroupWarning": "You might not be detected by other devices because you are using a custom multicast address. (default: {defaultMulticast})" + }, + "other": { + "title": "Other", + "support": "Support LocalSend", + "donate": "Donate", + "privacyPolicy": "Privacy Policy", + "termsOfUse": "Terms of Use" + }, + "advancedSettings": "Advanced settings" + }, + "troubleshootPage": { + "title": "Troubleshoot", + "subTitle": "Does the app not work as expected? Here you can find some common solutions to problems.", + "solution": "Solution:", + "fixButton": "Fix automatically", + "firewall": { + "symptom": "This device can send files to other devices but other devices cannot send files to this device.", + "solution": "This is most likely a firewall issue. You can solve this by allowing incoming connections (UDP and TCP) on port {port}.", + "openFirewall": "Open Firewall" + }, + "noDiscovery": { + "symptom": "This device cannot discover other devices.", + "solution": "Please make sure that all devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). You can try to type the IP address of the target device manually. If this works, consider adding this device to the favorites so it can be automatically discovered in the future." + }, + "noConnection": { + "symptom": "Both devices cannot discover each other nor can they share files.", + "solution": "Does the problem exist on both sides? If so, you need to make sure that both devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). The Wi-Fi network may not allow communication between participants due to Access Point (AP) Isolation. In this case, this option must be disabled on the router." + } + }, + "networkInterfacesPage": { + "title": "Network Interfaces", + "info": "By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.", + "preview": "Preview", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "receiveHistoryPage": { + "title": "History", + "openFolder": "Open folder", + "deleteHistory": "Delete history", + "empty": "The history is empty.", + "entryActions": { + "open": "Open file", + "showInFolder": "Show in folder", + "info": "Information", + "deleteFromHistory": "Delete from history" + } + }, + "apkPickerPage": { + "title": "Apps (APK)", + "excludeSystemApps": "Exclude system apps", + "excludeAppsWithoutLaunchIntent": "Exclude non-launchable apps", + "apps": "{n} Apps" + }, + "selectedFilesPage": { + "deleteAll": "Delete all" + }, + "receivePage": { + "subTitle": { + "one": "wants to send you a file", + "other": "wants to send you {n} files" + }, + "subTitleMessage": "sent you a message:", + "subTitleLink": "sent you a link:", + "canceled": "The sender has canceled the request." + }, + "receiveOptionsPage": { + "title": "Options", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend folder)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Turned off automatically because there are folders." + }, + "sendPage": { + "waiting": "Waiting for response…", + "rejected": "The recipient has rejected the request.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "The recipient is busy with another request." + }, + "progressPage": { + "titleSending": "Sending files", + "titleReceiving": "Receiving files", + "savedToGallery": "Saved in Photos", + "total": { + "title": { + "sending": "Total progress ({time})", + "finishedError": "Finished with error", + "canceledSender": "Canceled by sender", + "canceledReceiver": "Canceled by receiver" + }, + "count": "Files: {curr} / {n}", + "size": "Size: {curr} / {n}", + "speed": "Speed: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Use 'h' for hours abbreviation and 'm' for minutes", + "@days": "Use 'd' for days, 'h' for hours, and 'm' for minutes" + } + }, + "webSharePage": { + "title": "Share via link", + "loading": "Starting server…", + "stopping": "Stopping server…", + "error": "An error occurred while starting the server.", + "openLink": { + "one": "Open this link in your browser:", + "other": "Open one of these links in your browser:" + }, + "requests": "Requests", + "noRequests": "No requests yet.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Automatically accept requests", + "requirePin": "Require PIN", + "pinHint": "The PIN is \"{pin}\"", + "encryptionHint": "LocalSend uses a self-signed certificate. You need to accept it in your browser.", + "pendingRequests": "Pending requests: {n}" + }, + "aboutPage": { + "title": "About LocalSend", + "description": [ + "LocalSend is a free, open-source app that allows you to securely share files and messages with nearby devices over your local network without needing an internet connection.", + "This app is available on Android, iOS, macOS, Windows and Linux. You can find all download options on the official homepage." + ], + "author": "Author", + "contributors": "Contributors", + "packagers": "Packagers", + "translators": "Translators" + }, + "donationPage": { + "title": "Donate", + "info": "LocalSend is free, open-source and without any ads. If you like the app, you can support the development with a donation.", + "donate": "Donate {amount}", + "thanks": "Thank you very much!", + "restore": "Restore purchase" + }, + "changelogPage": { + "title": "Changelog" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Different locales may have different words, it may not match 1:1", + "adjectives": [ + "Adorable", + "Beautiful", + "Big", + "Bright", + "Clean", + "Clever", + "Cool", + "Cute", + "Cunning", + "Determined", + "Energetic", + "Efficient", + "Fantastic", + "Fast", + "Fine", + "Fresh", + "Good", + "Gorgeous", + "Great", + "Handsome", + "Hot", + "Kind", + "Lovely", + "Mystic", + "Neat", + "Nice", + "Patient", + "Pretty", + "Powerful", + "Rich", + "Secret", + "Smart", + "Solid", + "Special", + "Strategic", + "Strong", + "Tidy", + "Wise" + ], + "fruits": [ + "Apple", + "Avocado", + "Banana", + "Blackberry", + "Blueberry", + "Broccoli", + "Carrot", + "Cherry", + "Coconut", + "Grape", + "Lemon", + "Lettuce", + "Mango", + "Melon", + "Mushroom", + "Onion", + "Orange", + "Papaya", + "Peach", + "Pear", + "Pineapple", + "Potato", + "Pumpkin", + "Raspberry", + "Strawberry", + "Tomato" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "Add to selection", + "content": "What do you want to add?" + }, + "openFile": { + "title": "Open file", + "content": "Do you want to open the received file?" + }, + "addressInput": { + "title": "Enter address", + "hashtag": "Hashtag", + "ip": "IP Address", + "recentlyUsed": "Recently used: " + }, + "cancelSession": { + "title": "Cancel files transfer", + "content": "Do you really want to cancel the files transfer?" + }, + "cannotOpenFile": { + "title": "Cannot open file", + "content": "Could not open \"{file}\". Has this file been moved, renamed or deleted?" + }, + "encryptionDisabledNotice": { + "title": "Encryption disabled", + "content": "Communication now takes place via the unencrypted HTTP protocol. To use HTTPS protocol, enable encryption again." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favorites", + "noFavorites": "No favorite devices yet.", + "addFavorite": "Add" + }, + "favoriteDeleteDialog": { + "title": "Delete from favorites", + "content": "Do you really want to delete from favorites \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Add to favorites", + "titleEdit": "Settings", + "name": "Device name", + "auto": "(auto)", + "ip": "IP Address", + "port": "Port" + }, + "fileInfo": { + "title": "File information", + "fileName": "File name:", + "path": "Path:", + "size": "Size:", + "sender": "Sender:", + "time": "Time:" + }, + "fileNameInput": { + "title": "Enter file name", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Clear history", + "content": "Do you really want to delete the entire history?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend can't find other devices without having the permission to scan the local network. Please grant this permission in the settings.", + "gotoSettings": "Settings" + }, + "messageInput": { + "title": "Type message", + "multiline": "Multiline" + }, + "noFiles": { + "title": "No files selected", + "content": "Please select at least one file." + }, + "noPermission": { + "title": "No permission", + "content": "You have not granted the necessary permissions. Please grant them in the settings." + }, + "notAvailableOnPlatform": { + "title": "Not available", + "content": "This feature is only available on:" + }, + "qr": { + "title": "QR Code" + }, + "quickActions": { + "title": "Quick Actions", + "counter": "Counter", + "prefix": "Prefix", + "padZero": "Pad with zeros", + "sortBeforeCount": "Sort alphabetically beforehand (A-Z)", + "random": "Random" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "File requests are now accepted automatically. Be aware that everyone on the local network can send you files." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "File requests are now accepted automatically from devices in your favorites list.", + "Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.", + "However, this option is still safer than allowing all users on the local network to send you files without restriction." + ] + }, + "pin": { + "title": "Enter PIN" + }, + "sendModeHelp": { + "title": "Send modes", + "single": "Sends files to one recipient. Selection will be cleared after finished files transfer.", + "multiple": "Sends files to multiple recipients. Selection will not be cleared after finished files transfer.", + "link": "Recipients who do not have LocalSend installed can download the selected files by opening the link in their browser." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Filename cannot be empty", + "invalid": "Filename contains invalid characters" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the \"close\" wording.", + "open": "@:general.open", + "close": "Quit LocalSend", + "closeWindows": "Exit" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Enter PIN", + "invalidPin": "Invalid PIN", + "tooManyAttempts": "Too many attempts", + "rejected": "Rejected", + "files": "Files", + "fileName": "File name", + "size": "Size" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and iPhone", + "confirm": "Confirm", + "cancel": "Cancel", + "edit": "Edit", + "gifIndicator": "GIF", + "loadFailed": "Load failed", + "original": "Origin", + "preview": "Preview", + "select": "Select", + "emptyList": "Empty list", + "unSupportedAssetType": "Unsupported file type.", + "unableToAccessAll": "Unable to access all files on the device", + "viewingLimitedAssetsTip": "Only view files and albums accessible to the app.", + "changeAccessibleLimitedAssets": "Click to update accessible files", + "accessAllTip": "App can only access some files on the device. Go to system settings and allow the app to access all media on the device.", + "goToSystemSettings": "Go to system settings", + "accessLimitedAssets": "Continue with limited access", + "accessiblePathName": "Accessible files", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Image", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Other media", + "sActionPlayHint": "play", + "sActionPreviewHint": "preview", + "sActionSelectHint": "select", + "sActionSwitchPathLabel": "change path", + "sActionUseCameraHint": "use camera", + "sNameDurationLabel": "duration", + "sUnitAssetCountLabel": "count" + } +} diff --git a/app/assets/i18n/es-ES.json b/app/assets/i18n/es-ES.json new file mode 100644 index 0000000..1c71f61 --- /dev/null +++ b/app/assets/i18n/es-ES.json @@ -0,0 +1,465 @@ +{ + "locale": "Español", + "appName": "LocalSend", + "general": { + "accept": "Aceptar", + "accepted": "Aceptado", + "add": "Añadir", + "advanced": "Avanzado", + "cancel": "Cancelar", + "close": "Cerrar", + "confirm": "Confirmar", + "continueStr": "Continuar", + "copy": "Copiar", + "copiedToClipboard": "Copiado al Portapapeles", + "decline": "Rechazar", + "done": "Hecho", + "delete": "Eliminar", + "edit": "Editar", + "error": "Error", + "example": "Ejemplo", + "files": "Archivos", + "finished": "Finalizado", + "hide": "Ocultar", + "off": "Apagado", + "offline": "Desconectado", + "on": "Encendido", + "online": "En línea", + "open": "Abrir", + "queue": "Cola", + "quickSave": "Guardado rápido", + "quickSaveFromFavorites": "Guardado rápido en \"Favoritos\"", + "renamed": "Renombrado", + "reset": "Deshacer cambios", + "restart": "Reiniciar", + "settings": "Ajustes", + "skipped": "Omitido", + "start": "Iniciar", + "stop": "Detener", + "save": "Guardar", + "unchanged": "Sin Cambios", + "unknown": "Desconocido", + "noItemInClipboard": "No hay ningún elemento en el portapapeles." + }, + "receiveTab": { + "title": "Recibir", + "infoBox": { + "ip": "IP:", + "port": "Puerto:", + "alias": "Alias:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favoritos", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Enviar", + "selection": { + "title": "Selección", + "files": "Archivos: {files}", + "size": "Tamaño: {size}" + }, + "picker": { + "file": "Archivo", + "folder": "Carpeta", + "media": "Medios", + "text": "Texto", + "app": "App", + "clipboard": "Pegar" + }, + "shareIntentInfo": "También puedes usar la opción \"Compartir\" de tu dispositivo para seleccionar archivos más fácilmente.", + "nearbyDevices": "Dispositivos Cercanos", + "thisDevice": "Este dispositivo", + "scan": "Buscar dispositivos", + "manualSending": "Enviar manualmente", + "sendMode": "Modo de envío", + "sendModes": { + "single": "Solo un destino", + "multiple": "Múltiples destinos", + "link": "Compartir enlace" + }, + "sendModeHelp": "Explicación", + "help": "Por favor asegúrese que el dispositivo de destino esté en la misma red Wi-Fi.", + "placeItems": "Selecciona elementos para compartir." + }, + "settingsTab": { + "title": "Ajustes", + "general": { + "title": "General", + "brightness": "Luminosidad", + "brightnessOptions": { + "system": "Sistema", + "dark": "Oscuro", + "light": "Claro" + }, + "color": "Color", + "colorOptions": { + "system": "Sistema", + "oled": "OLED" + }, + "language": "Idioma", + "languageOptions": { + "system": "Sistema" + }, + "saveWindowPlacement": "Al salir guardar la ubicación de la ventana", + "saveWindowPlacementWindows": "Guardar la posición de la ventana después de salir", + "minimizeToTray": "Cerrar: Minimizar ventana", + "launchAtStartup": "Inicio automático", + "launchMinimized": "Inicio automático: Iniciar minimizado", + "showInContextMenu": "Mostrar LocalSend en el menú contextual", + "animations": "Animaciones" + }, + "receive": { + "title": "Recibir", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Auto finalizar", + "destination": "Guardar en carpeta", + "downloads": "(Descargas)", + "saveToGallery": "Guardar media en la galería", + "saveToHistory": "Guardar en el historial" + }, + "send": { + "title": "Enviar", + "shareViaLinkAutoAccept": "Aceptar automáticamente solicitudes en el modo \"Compartir mediante enlace\"" + }, + "network": { + "title": "Red", + "needRestart": "¡Reinicia el servidor para aplicar los ajustes!", + "server": "Servidor", + "alias": "Alias", + "deviceType": "Tipo de dispositivo", + "deviceModel": "Modelo de dispositivo", + "port": "Puerto", + "discoveryTimeout": "Tiempo de espera para Detección", + "useSystemName": "Usar el nombre del sistema", + "generateRandomAlias": "Generar alias aleatorio", + "portWarning": "Es posible que no seas visible para otros dispositivos porque estás utilizando un puerto personalizado. (Puerto por defecto: {defaultPort})", + "encryption": "Encriptación", + "multicastGroup": "Direccion Multicast", + "multicastGroupWarning": "Es posible que no seas visible para otros dispositivos porque estás utilizando una dirección multicast personalizada. (Dirección multicast por defecto: {defaultMulticast})", + "network": "Red", + "networkOptions": { + "all": "Todo", + "filtered": "Filtrado" + } + }, + "other": { + "title": "Otros", + "support": "Apoya a LocalSend", + "donate": "Donar", + "privacyPolicy": "Política de privacidad", + "termsOfUse": "Condiciones de uso" + }, + "advancedSettings": "Configuración avanzada" + }, + "troubleshootPage": { + "title": "Solucionar problemas", + "subTitle": "¿La aplicación no funciona como debería? Aquí puedes encontrar soluciones a problemas comunes.", + "solution": "Solución:", + "fixButton": "Corregir automáticamente", + "firewall": { + "symptom": "Este dispositivo puede enviar archivos a otros, pero otros dispositivos no pueden enviar archivos a este.", + "solution": "Lo más probable es que se trate de un problema con el firewall, puedes solucionarlo permitiendo las conexiones entrantes (UDP y TCP) en el puerto {port}.", + "openFirewall": "Abrir Firewall" + }, + "noDiscovery": { + "symptom": "Este dispositivo no puede descubrir otros dispositivos.", + "solution": "Asegúrese que todos los dispositivos estén en la misma red Wi-Fi y compartan la misma configuración (puerto, dirección de multidifusión, cifrado). Puede intentar escribir la dirección IP del dispositivo de destino manualmente. Si esto funciona, considere agregar este dispositivo a los favoritos para que pueda detectarse automáticamente en el futuro." + }, + "noConnection": { + "symptom": "Ambos dispositivos no pueden descubrirse ni compartir archivos.", + "solution": "¿El problema existe en ambos lados? Tienes que asegurarte que los dispositivos están en la misma red Wi-Fi y comparten la misma configuración (puerto, dirección multicast, encriptación). Es posible que el Wi-Fi no permita la comunicación entre los dispositivos. En este caso, hay que activar esta opción en el router." + } + }, + "receiveHistoryPage": { + "title": "Historial", + "openFolder": "Abrir carpeta", + "deleteHistory": "Borrar historial", + "empty": "El historial está vacío.", + "entryActions": { + "open": "Abrir archivo", + "showInFolder": "Mostrar en carpeta", + "info": "Información", + "deleteFromHistory": "Borrar del historial" + } + }, + "apkPickerPage": { + "title": "Aplicaciones (APK)", + "excludeSystemApps": "Excluir apps de sistema", + "excludeAppsWithoutLaunchIntent": "Excluir apps no ejecutables", + "apps": "{n} Aplicaciones" + }, + "selectedFilesPage": { + "deleteAll": "Eliminar todo" + }, + "receivePage": { + "subTitle": { + "one": "quiere enviarte un archivo", + "other": "quiere enviarte {n} archivos" + }, + "subTitleMessage": "te ha enviado un mensaje:", + "subTitleLink": "te ha enviado un enlace:", + "canceled": "El remitente ha cancelado la petición." + }, + "receiveOptionsPage": { + "title": "Opciones", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(Carpeta LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Desactivado automáticamente porque hay carpetas." + }, + "sendPage": { + "waiting": "Esperando respuesta…", + "rejected": "El destino ha rechazado la petición.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "El destino está ocupado con otra petición." + }, + "progressPage": { + "titleSending": "Enviando archivos", + "titleReceiving": "Recibiendo archivos", + "savedToGallery": "Guardado en fotos", + "total": { + "title": { + "sending": "Progreso total ({time})", + "finishedError": "Finalizado con error", + "canceledSender": "Cancelado por remitente", + "canceledReceiver": "Cancelado por destino" + }, + "count": "Archivos: {curr} / {n}", + "size": "Tamaño: {curr} / {n}", + "speed": "Velocidad: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Usa «h» como abreviatura de horas y «m» para minutos", + "@days": "Usa «d» para días, «h» para horas y «m» para minutos" + } + }, + "webSharePage": { + "title": "Compartir mediante enlace", + "loading": "Iniciando servidor…", + "stopping": "Deteniendo servidor…", + "error": "Se ha producido un error al iniciar el servidor.", + "openLink": { + "one": "Abre este enlace en el navegador:", + "other": "Abre uno de estos enlaces en el navegador:" + }, + "requests": "Solicitudes", + "noRequests": "Aún no hay solicitudes.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Aceptar solicitudes automáticamente", + "requirePin": "Requerir PIN", + "pinHint": "El PIN es \"{pin}\"", + "encryptionHint": "LocalSend utiliza un certificado autofirmado. Necesitas aceptarlo en el navegador.", + "pendingRequests": "Solicitudes pendientes: {n}" + }, + "aboutPage": { + "title": "Sobre LocalSend", + "description": [ + "LocalSend es una aplicación libre, de código abierto, que te permite compartir archivos y mensajes de forma segura con dispositivos cercanos a través de tu red local sin necesidad de conexión a Internet.", + "Está disponible para Android, iOS, macOS, Windows y Linux. Puedes encontrar todas las opciones de descarga en la página web oficial." + ], + "author": "Autor", + "contributors": "Colaboradores", + "packagers": "Empaquetadores", + "translators": "Traductores" + }, + "donationPage": { + "title": "Donar", + "info": "LocalSend es libre, open source y no contiene anuncios. Si te gusta la aplicación puedes ayudar al desarrollo con una donación.", + "donate": "Donar {amount}", + "thanks": "¡Muchas gracias!", + "restore": "Restablecer compra" + }, + "changelogPage": { + "title": "Registro de cambios" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Uses English version" + }, + "dialogs": { + "addFile": { + "title": "Añadir a selección", + "content": "¿Qué quieres añadir?" + }, + "openFile": { + "title": "Abrir archivo", + "content": "¿Quieres abrir el archivo recibido?" + }, + "addressInput": { + "title": "Introducir dirección", + "hashtag": "Etiqueta", + "ip": "Dirección IP", + "recentlyUsed": "Usados recientemente: " + }, + "cancelSession": { + "title": "Cancelar transferencia de archivos", + "content": "¿Realmente quieres cancelar la transferencia de archivos?" + }, + "cannotOpenFile": { + "title": "No se puede abrir el archivo", + "content": "No se ha podido abrir \"{file}\". ¿Es posible que el archivo se haya movido, renombrado o eliminado?" + }, + "encryptionDisabledNotice": { + "title": "Encriptación deshabilitada", + "content": "La comunicación ahora tiene lugar mediante un protocolo HTTP sin encriptar. Para usar HTTPS, vuelve a habilitar la encriptación." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favoritos", + "noFavorites": "Aún no hay dispositivos favoritos.", + "addFavorite": "Agregar" + }, + "favoriteDeleteDialog": { + "title": "Eliminar de favoritos", + "content": "¿Realmente quieres borrar de favoritos \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Agregar a favoritos", + "titleEdit": "Ajustes", + "name": "Alias", + "auto": "(auto)", + "ip": "Dirección IP", + "port": "Puerto" + }, + "fileInfo": { + "title": "Información del archivo", + "fileName": "Nombre del archivo:", + "path": "Ruta:", + "size": "Tamaño:", + "sender": "Emisor:", + "time": "Hora:" + }, + "fileNameInput": { + "title": "Introduce el nombre", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Borrar historial", + "content": "¿Realmente quieres borrar todo el historial?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend no puede encontrar otros dispositivos sin tener permiso para escanear la red local. Por favor, concede este permiso en los ajustes.", + "gotoSettings": "Ajustes" + }, + "messageInput": { + "title": "Escribe un mensaje", + "multiline": "Varias líneas" + }, + "noFiles": { + "title": "Ningún archivo seleccionado", + "content": "Por favor selecciona al menos un archivo." + }, + "noPermission": { + "title": "Sin autorización", + "content": "No has otorgado los permisos necesarios. Por favor, otórgalos en la configuración." + }, + "notAvailableOnPlatform": { + "title": "No disponible", + "content": "Esta característica solo está disponible en:" + }, + "qr": { + "title": "Código QR" + }, + "quickActions": { + "title": "Acciones rápidas", + "counter": "Contador", + "prefix": "Prefijo", + "padZero": "Llenar con ceros", + "sortBeforeCount": "Ordenar alfabéticamente antes", + "random": "Aleatorio" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Las solicitudes de archivos se aceptan automáticamente. Ten en cuenta que cualquiera en la red local podrá enviarte archivos." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Se aceptarán automáticamente los archivos recibidos de los dispositivos incluidos en su lista de favoritos.", + "Advertencia: esta opción no es completamente segura, cualquiera que conozca la huella digital de sus dispositivos favoritos aún puede enviarle archivos.", + "Sin embargo, esta opción sigue siendo más segura que permitir que todos los usuarios en la red local te envíen archivos sin restricción." + ] + }, + "pin": { + "title": "Ingresar PIN" + }, + "sendModeHelp": { + "title": "Modos de envío", + "single": "Enviar archivos a un solo destino. La selección se borrará una vez finalizada la transferencia.", + "multiple": "Enviar archivos a múltiples destinos. La selección no se borrará.", + "link": "Los destinatarios que no tengan LocalSend instalado pueden descargar los archivos seleccionados abriendo el enlace en su navegador." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "El nombre del archivo no puede estar vacío", + "invalid": "El nombre del archivo contiene caracteres no válidos" + }, + "tray": { + "@info": "Las directrices de Apple son muy estrictas en cuanto a la expresión 'cerrar'.", + "open": "@:general.open", + "close": "Cerrar LocalSend", + "closeWindows": "Cerrar" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Ingresar PIN", + "invalidPin": "PIN Inválido", + "tooManyAttempts": "Demasiados intentos", + "rejected": "Rechazado", + "files": "Archivos", + "fileName": "Nombre del archivo", + "size": "Tamaño" + }, + "assetPicker": { + "@info": "Traducciones de la herramienta de selección de medios para Android e iPhone", + "confirm": "Confirmar", + "cancel": "Cancelar", + "edit": "Editar", + "gifIndicator": "GIF", + "loadFailed": "Error de carga", + "original": "Original", + "preview": "Vista previa", + "select": "Seleccionar", + "emptyList": "Lista vacía", + "unSupportedAssetType": "Tipo de archivo no soportado.", + "unableToAccessAll": "No se puede acceder a todos los archivos del dispositivo", + "viewingLimitedAssetsTip": "Ver solo los archivos y álbumes accesibles para la aplicación.", + "changeAccessibleLimitedAssets": "Haga clic para actualizar los archivos accesibles", + "accessAllTip": "La aplicación solo puede acceder a algunos archivos del dispositivo. Ve a la configuración del sistema y permite que la aplicación acceda a todos los archivos multimedia del dispositivo.", + "goToSystemSettings": "Ir a los ajustes del sistema", + "accessLimitedAssets": "Continuar con acceso limitado", + "accessiblePathName": "Archivos accesibles", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Imagen", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Otros medios", + "sActionPlayHint": "reproducir", + "sActionPreviewHint": "vista previa", + "sActionSelectHint": "selecccionar", + "sActionSwitchPathLabel": "cambiar ruta", + "sActionUseCameraHint": "usar cámara", + "sNameDurationLabel": "duración", + "sUnitAssetCountLabel": "conteo" + }, + "networkInterfacesPage": { + "title": "Interfaces de la red", + "info": "De forma predeterminada, LocalSend utiliza todas las interfaces de red disponibles. Aquí puede desactivar las redes no deseadas. Debe reiniciar el servidor para aplicar los cambios.", + "preview": "Vista previa", + "whitelist": "Lista blanca", + "blacklist": "Lista negra" + } +} diff --git a/app/assets/i18n/et.json b/app/assets/i18n/et.json new file mode 100644 index 0000000..100f8c5 --- /dev/null +++ b/app/assets/i18n/et.json @@ -0,0 +1,465 @@ +{ + "locale": "Eesti keel", + "appName": "LocalSend", + "general": { + "accept": "Nõustu", + "accepted": "Nõustusid", + "add": "Lisa", + "advanced": "Lisavalikud", + "cancel": "Katkesta", + "close": "Sulge", + "confirm": "Kinnita", + "continueStr": "Jätka", + "copy": "Kopeeri", + "copiedToClipboard": "Kopeeritud lõikelauale", + "decline": "Keeldu", + "done": "Valmis", + "delete": "Kustuta", + "edit": "Muuda", + "error": "Viga", + "example": "Näide", + "files": "Failid", + "finished": "Valmis", + "hide": "Peida", + "off": "Väljas", + "offline": "Pole võrgus", + "on": "Sees", + "online": "Võrgus", + "open": "Ava", + "queue": "Järjekorras", + "quickSave": "Kiirsalvestus", + "quickSaveFromFavorites": "Kiirsalvestamine „Lemmikutelt“", + "renamed": "Nimi on muudetud", + "reset": "Tühista muudatused", + "restart": "Käivita uuesti", + "settings": "Seadistused", + "skipped": "Vahelejäetud", + "start": "Alusta", + "stop": "Peata", + "save": "Salvesta", + "unchanged": "Muutmata", + "unknown": "Teadmata", + "noItemInClipboard": "Lõikelaual pole midagi." + }, + "receiveTab": { + "title": "Võta vastu", + "infoBox": { + "ip": "IP-aadress:", + "port": "Port:", + "alias": "Seadme nimi:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Lemmikud", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Saada", + "selection": { + "title": "Valik", + "files": "Failid: {files}", + "size": "Andmemaht: {size}" + }, + "picker": { + "file": "Fail", + "folder": "Kaust", + "media": "Meedia", + "text": "Tekst", + "app": "Rakendus", + "clipboard": "Aseta" + }, + "shareIntentInfo": "Klikates nutiseadmes olevates rakendustes nuppu „Jaga“ võid kasutada ka mugavat jagamise võimalust.", + "nearbyDevices": "Läheduses asuvad seadmed", + "thisDevice": "See seade", + "scan": "Otsi seadmeid", + "manualSending": "Saada käsitsi", + "sendMode": "Saatmisviis", + "sendModes": { + "single": "Üks vastuvõtja", + "multiple": "Mitu vastuvõtjat", + "link": "Jagamine lingi vahendusel" + }, + "sendModeHelp": "Selgitus", + "help": "Palun kontrolli, et sihtseade asub sama WiFi ühenduse piires.", + "placeItems": "Lisa jagatavad failid siia." + }, + "settingsTab": { + "title": "Seadistused", + "general": { + "title": "Üldised seadistused", + "brightness": "Kujundus", + "brightnessOptions": { + "system": "Süsteemi kujundus", + "dark": "Tume kujundus", + "light": "Hele kujundus" + }, + "color": "Värv", + "colorOptions": { + "system": "Süsteemi värvid", + "oled": "OLED" + }, + "language": "Keel", + "languageOptions": { + "system": "Süsteemi keel" + }, + "saveWindowPlacement": "Peale väljumist salvesta akna asukoht", + "saveWindowPlacementWindows": "Peale lõpetamist salvesta akna asukoht", + "minimizeToTray": "Sulgemisel aseta rakendus süsteemisalve", + "launchAtStartup": "Sisselogimisel käivita automaatselt", + "launchMinimized": "Automaatsel käivitamisel: käivita peidetuna", + "showInContextMenu": "Näita LocalSendi kontekstimenüüs", + "animations": "Animatsioonid" + }, + "receive": { + "title": "Vastuvõtmine", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Lõpeta automaatselt", + "destination": "Salvesta kausta", + "downloads": "(Allalaadimised)", + "saveToGallery": "Lisa meedia galeriisse", + "saveToHistory": "Salvesta ajalukku" + }, + "send": { + "title": "Saatmine", + "shareViaLinkAutoAccept": "Kui kasutusel on „Jaga lingi abil“, siis nõustu vastuvõtmisega automaatselt" + }, + "network": { + "title": "Võrk", + "needRestart": "Muudatuste jõustamiseks palun käivita server uuesti!", + "server": "Server", + "alias": "Seadme nimi", + "deviceType": "Seadme tüüp", + "deviceModel": "Seadme mudel", + "port": "Kasutatav port", + "discoveryTimeout": "Leitavuse aegumine", + "useSystemName": "Kasuta süsteemset nime", + "generateRandomAlias": "Loo juhuslik nimi", + "portWarning": "Kuna kasutad endamääratud porti, siis muud seadmed ei pruugi seda seadet leida. (vaikimisi: {defaultPort})", + "encryption": "Krüptimine", + "multicastGroup": "Multiedastuse aadress", + "multicastGroupWarning": "Kuna kasutad endamääratud multiedastuse aadressi, siis muud seadmed ei pruugi seda seadet leida. (vaikimisi: {defaultMulticast})", + "networkOptions": { + "filtered": "Filtreeritud", + "all": "Kõik" + }, + "network": "Võrk" + }, + "other": { + "title": "Muu teave", + "support": "Toeta LocalSendi", + "donate": "Toeta rahaliselt", + "privacyPolicy": "Andmekaitsepõhimõtted", + "termsOfUse": "Kasutustingimused" + }, + "advancedSettings": "Täiendavad seadistused" + }, + "troubleshootPage": { + "title": "Veaotsing", + "subTitle": "Kas rakendus toimib nii, nagu vaja? Siin võid leida lahendusi levinumatele probleemidele.", + "solution": "Lahendus:", + "fixButton": "Paranda automaatselt", + "firewall": { + "symptom": "Siit seadmest on võimalik teisele faile saata, kuid teised ei saa siia saata.", + "solution": "Tõenäoliselt on see seotud tulemüüriga. Olukorra võid lahendada lubades sisenevad (UDP ja TCP) ühendused pordis {port}.", + "openFirewall": "Ava tulemüüri seadistused" + }, + "noDiscovery": { + "symptom": "See seade ei suuda tuvastada teisi seadeid.", + "solution": "Palun kontrolli, et kõik seadmed asuvad samas WiFi võrgus ning kasutavad samu seadistusi (port, multiedastuse aadress ja krüptimine). Sa võid ka proovida sihtseadme IP-aadressi lisamist käsitsi. Kui siis ühendus toimib, võid ta lisada lemmikuks ja hilisem tuvastamine saab olema automaatne." + }, + "noConnection": { + "symptom": "Mõlemad seadmed ei suuda üksteist leida ega jagada faile.", + "solution": "Kas identne probleem on mõlemas seadmes? Kui nii, siis palun kontrolli, et mõlemad seadmed asuvad samas WiFi võrgus ning kasutavad samu seadistusi (port, multiedastuse aadress ja krüptimine). Aga samas on võimalik, et WiFi võrk on seadistatud nii, et kõik seadmed on üksteisest isoleeritud. Sel juhul küsi abi võrgu haldajalt, kes saab ruuteris teha vajalikud muudatused." + } + }, + "receiveHistoryPage": { + "title": "Ajalugu", + "openFolder": "Ava kaust", + "deleteHistory": "Kustuta ajalugu", + "empty": "Ajalugu on tühi.", + "entryActions": { + "open": "Ava fail", + "showInFolder": "Näita kaustas", + "info": "Teave", + "deleteFromHistory": "Kustuta ajaloost" + } + }, + "apkPickerPage": { + "title": "Rakendused (apk-failid)", + "excludeSystemApps": "Välista süsteemi rakendused", + "excludeAppsWithoutLaunchIntent": "Välista mittekäivitatavad rakendused", + "apps": "{n} rakendust" + }, + "selectedFilesPage": { + "deleteAll": "Kustuta kõik" + }, + "receivePage": { + "subTitle": { + "one": "soovib sulle saata faili", + "other": "soovib sulle saata {n} faili" + }, + "subTitleMessage": "saatis sulle sõnumi:", + "subTitleLink": "saatis sulle lingi:", + "canceled": "Saatja on päringu tühistanud." + }, + "receiveOptionsPage": { + "title": "Eelistused", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSendi kaust)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Pole kasutusel, kuna saadetavate hulgas leidub kaustu." + }, + "sendPage": { + "waiting": "Ootame vastust…", + "rejected": "Vastuvõtja on vastuvõtmisest keeldunud.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Vastuvõtja on hõivatud teise päringuga tegelemisega." + }, + "progressPage": { + "titleSending": "Saadame faile", + "titleReceiving": "Võtame faile vastu", + "savedToGallery": "Salvestatud kausta Fotod", + "total": { + "title": { + "sending": "Edenemine kokku ({time})", + "finishedError": "Lõppes veaga", + "canceledSender": "Saatja poolt katkestatud", + "canceledReceiver": "Vastuvõtja poolt katkestatud" + }, + "count": "Faile: {curr} / {n}", + "size": "Andmemaht: {curr} / {n}", + "speed": "Kiirus: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h} t {m} min", + "days": "{d} pv {h} t {m} min", + "@hours": "Kasuta „h“ tunni lühendina ja „m“ minutite jaoks", + "@days": "Kasuta „d“ päeva, lühendina „h“ tunni lühendina ja „m“ minutite jaoks" + } + }, + "webSharePage": { + "title": "Jaga lingi vahendusel", + "loading": "Käivitame serverit…", + "stopping": "Peatame serverit…", + "error": "Serveri käivitamisel tekkis viga.", + "openLink": { + "one": "Ava see link oma veebibrauseris:", + "other": "Ava üks neist linkidest oma veebibrauseris:" + }, + "requests": "Päringuid", + "noRequests": "Päringuid veel pole.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Nõustu päringutega automaatselt", + "requirePin": "Küsi PIN-koodi", + "pinHint": "PIN-kood on „{pin}“", + "encryptionHint": "LocalSend kasutab enda poolt allkirjastatud sertifikaate. Ühenduse toimimiseks palun nõustu nendega veebibrauseris.", + "pendingRequests": "Ootel päringuid: {n}" + }, + "aboutPage": { + "title": "Rakenduse teave: LocalSend", + "description": [ + "LocalSend põhineb avatud lähtekoodil, on kõikide jaoks vaba ning tasuta kasutatav. Rakenduse eesmärgiks on võimaldada failide ja tekstide jagamist kohtvõrgus asuvate arvutite vahel nii, et välist internetiühendust pole vaja kasutada.", + "See rakendus on saadaval Androidi, iOSi, macOSi, Windowsi ja Linuxi jaoks. Kõik allalaaditavad paigaldusfailid leiad meie ametlikust veebisaidist." + ], + "author": "Autor", + "contributors": "Kaasautorid", + "packagers": "Pakendajad", + "translators": "Tõlkijad" + }, + "donationPage": { + "title": "Toeta meid rahaliselt", + "info": "LocalSend põhineb avatud lähtekoodil, on kõikide jaoks vaba ning tasuta kasutatav, ega sisalda reklaame. Kui sulle see rakendus meeldib, siis palun toeta meie arendust.", + "donate": "Anneta {amount}", + "thanks": "Suur tänu!", + "restore": "Taasta ost" + }, + "changelogPage": { + "title": "Muudatuste logi" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Erinevates lokaatides võivad olla kasutusel erinevad sõnad ning nad ei pruugi 1:1 kattuda" + }, + "dialogs": { + "addFile": { + "title": "Lisa valiku hulka", + "content": "Mida sa sooviksid lisada?" + }, + "openFile": { + "title": "Ava fail", + "content": "Kas sa soovid avada saadud faili?" + }, + "addressInput": { + "title": "Sisesta aadress", + "hashtag": "Teemaviide", + "ip": "IP-aadress", + "recentlyUsed": "Hiljuti kasutatud: " + }, + "cancelSession": { + "title": "Katkesta failide edastamine", + "content": "Kas sa kindlasti soovid katkestada failide edastamise?" + }, + "cannotOpenFile": { + "title": "Faili avamine ei õnnestu", + "content": "„{file}“ faili avamine ei õnnestunud. Kas ta võib olla teisaldatud, ümbernimetatud või kustutatud?" + }, + "encryptionDisabledNotice": { + "title": "Krüptimine pole kasutusel", + "content": "Andmevahetus toimub nüüd krüptimata HTTP-protokolli vahendusel. Turvalise HTTPS-protokolli kasutamiseks lülita krüptimine sisse." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Lemmikud", + "noFavorites": "Ühtegi lemmikseadet veel pole.", + "addFavorite": "Lisa" + }, + "favoriteDeleteDialog": { + "title": "Kustuta lemmikute hulgast", + "content": "Kas sa kindlasti soovid „{name}“ kustutada lemmikute hulgast?" + }, + "favoriteEditDialog": { + "titleAdd": "Lisa lemmikuks", + "titleEdit": "Seadistused", + "name": "Seadme nimi", + "auto": "(automaatne)", + "ip": "IP-aadress", + "port": "Kasutatav port" + }, + "fileInfo": { + "title": "Faili teave", + "fileName": "Failinimi:", + "path": "Asukoht:", + "size": "Suurus:", + "sender": "Saatja:", + "time": "Kellaaeg:" + }, + "fileNameInput": { + "title": "Sisesta failinimi", + "original": "Algne: {original}" + }, + "historyClearDialog": { + "title": "Tühjenda ajalugu", + "content": "Kas sa kindlasti soovid kogu ajaloo kustutada?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "Ilma kohtvõrgu skaneerimise õiguseta ei suuda LocalSend leida teisi seadmeid. Palun luba süsteemi seadistustest vajalikud õigused.", + "gotoSettings": "Seadistused" + }, + "messageInput": { + "title": "Kirjuta sõnum", + "multiline": "Mitmerealine" + }, + "noFiles": { + "title": "Ühtegi faili pole valitud", + "content": "Palun vali vähemalt üks fail." + }, + "noPermission": { + "title": "Õigused puuduvad", + "content": "Sa pole rakendusele jaganud vajalikke õigusi. Palun tee seda süsteemi seadistustes." + }, + "notAvailableOnPlatform": { + "title": "Pole saadaval", + "content": "See funktsionaalsus on saadaval vaid:" + }, + "qr": { + "title": "QR-kood" + }, + "quickActions": { + "title": "Kiirtoimingud", + "counter": "Loendur", + "prefix": "Eesliide", + "padZero": "Täida nullidega", + "sortBeforeCount": "Enne loendamist järjesta tähestiku järjekorras (A-Z)", + "random": "Juhuslikult" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Failipäringutega nõustume nüüd automaatselt. Palun arvesta, et seeläbi võivad kõik sinu kohtvõrgus saata sulle faile." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Failipäringutega nõustume nüüd automaatselt vaid nende seadmete puhul, mis on lemmikuks märgitud.", + "Hoiatus! Kui kohtvõrgus tegutsev võimalik pahatahtlik osapool saaks kätte sinul lemmikuks märgitud seadmete võtmed ja sõrmejäljed, siis saaks sulle piiranguteta faile saata ja seega pole lahendus hetkel täiesti turvaline.", + "Aga siiski on see valik turvalisem, kui lubada kõigil sinu kohtvõrgu kasutajatel saata sulle faile ilma igasuguste piiranguteta." + ] + }, + "pin": { + "title": "Sisesta PIN-kood" + }, + "sendModeHelp": { + "title": "Saatmisviisid", + "single": "Sellega saadame faile ühele vastuvõtjale. Peale failide saatmise lõppu eemaldame failid saatmisloendist.", + "multiple": "Sellega saadame faile mitmele vastuvõtjale. Peale failide saatmise lõppu failid jäävad saatmisloendisse alles.", + "link": "Kui failide vastuvõtjatel pole arvutis või nutiseadmes rakendust LocalSend, siis avades etteantud lingi oma veebibrauseris, saavad nad failid alla laadida." + }, + "zoom": { + "title": "Võrguaadress" + } + }, + "sanitization": { + "empty": "Failil peab olema nimi", + "invalid": "Failinimes on valesid tähemärke" + }, + "tray": { + "@info": "Apple'i kasutajaliidese juhendid on väga ranged sõna „Sulge“ kasutamise osas.", + "open": "@:general.open", + "close": "Sulge LocalSend", + "closeWindows": "Välju" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Sisesta PIN-kood", + "invalidPin": "Vigane PIN-kood", + "tooManyAttempts": "Liiga palju sisestuskatseid", + "rejected": "Keelatud", + "files": "Failid", + "fileName": "Failinimi", + "size": "Suurus" + }, + "assetPicker": { + "@info": "Androidis ja iPhone'is kasutatava meediavalija tõlked", + "confirm": "Kinnita", + "cancel": "Katkesta", + "edit": "Muuda", + "gifIndicator": "GIF", + "loadFailed": "Laadimine ei õnnestunud", + "original": "Algne", + "preview": "Eelvaade", + "select": "Vali", + "emptyList": "Tühi loend", + "unSupportedAssetType": "Failitüüp pole toetatud.", + "unableToAccessAll": "Selles seadmes puudub ligipääs failidele", + "viewingLimitedAssetsTip": "Näed vaid faile ja albumeid, millele oled sellele rakendusele ligipääsu andnud.", + "changeAccessibleLimitedAssets": "Ligipääsetavate failide loendi uuendmiseks klõpsi", + "accessAllTip": "Rakendusel on selles nutiseadmes ligipääs vaid mõnedele failidele. Kui vajad ligipääsu kõikidele meediafailidele, siis ava seadistused ning luba vastavad õigused.", + "goToSystemSettings": "Ava süsteemi seadistused", + "accessLimitedAssets": "Jätka piiratud ligipääsuga", + "accessiblePathName": "Kasutatavad failid", + "sTypeAudioLabel": "Heli", + "sTypeImageLabel": "Pilt", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Muu meedia", + "sActionPlayHint": "esita", + "sActionPreviewHint": "eelvaade", + "sActionSelectHint": "vali", + "sActionSwitchPathLabel": "muuda asukohta", + "sActionUseCameraHint": "kasuta kaamerat", + "sNameDurationLabel": "kestus", + "sUnitAssetCountLabel": "kogus" + }, + "networkInterfacesPage": { + "title": "Võrguliidesed", + "preview": "Eelvaade", + "whitelist": "Lubatud loend", + "blacklist": "Keelatud loend", + "info": "Vaikimisi kasutab LocalSend kõiki võrguliideseid. Kui sul on vaja, siis saad mittesoovitud võrgud siinkohal välistada ning muudatuste jõustumine eeldab serverikomponendi uuesti käivitamist." + } +} diff --git a/app/assets/i18n/eu.json b/app/assets/i18n/eu.json new file mode 100644 index 0000000..0dfa191 --- /dev/null +++ b/app/assets/i18n/eu.json @@ -0,0 +1,405 @@ +{ + "locale": "Euskara", + "appName": "LocalSend", + "general": { + "accept": "Onartu", + "accepted": "Onartuta", + "add": "Gehitu", + "advanced": "Aurreratua", + "cancel": "Utzi", + "close": "Itxi", + "confirm": "Baieztatu", + "continueStr": "Jarraitu", + "copy": "Kopiatu", + "copiedToClipboard": "Arbelean kopiatua", + "decline": "Ez onartu", + "done": "Egina", + "delete": "Ezabatu", + "edit": "Editatu", + "error": "Errorea", + "example": "Adibidea", + "files": "Fitxategiak", + "finished": "Amaituta", + "hide": "Ezkutatu", + "off": "Itzalita", + "offline": "Deskonektatua", + "on": "Piztuta", + "online": "Online", + "open": "Ireki", + "queue": "Ilara", + "quickSave": "Gordetze Azkarra", + "renamed": "Berizendatua", + "reset": "Berrezarri", + "restart": "Berrasieratu", + "settings": "Aukerak", + "skipped": "Utzita", + "start": "Hasieratu", + "stop": "Gelditu", + "save": "Gorde", + "unchanged": "Aldaketarik gabe", + "unknown": "Ezezaguna", + "noItemInClipboard": "Arbela hutsik dago.", + "quickSaveFromFavorites": "“Gogokoetan” gorde" + }, + "receiveTab": { + "title": "Eskuratu", + "infoBox": { + "ip": "IP:", + "port": "Portua:", + "alias": "Aliasa:" + }, + "quickSave": { + "off": "@:general.off", + "on": "@:general.on", + "favorites": "Gogokoak" + } + }, + "sendTab": { + "title": "Bidali", + "selection": { + "title": "Aukeraketa", + "files": "Fitxategiak: {files}", + "size": "Tamaina: {size}" + }, + "picker": { + "file": "Fitxategia", + "folder": "Direktorioa", + "media": "Media", + "text": "Testua", + "app": "App", + "clipboard": "Itsatsi" + }, + "shareIntentInfo": "Zure gailuko \"Elkarbanatu\" aukera ere erabil dezakezu fitxategi gehiago errezago aukeratzeko.", + "nearbyDevices": "Inguruko Gailuak", + "thisDevice": "Gailu hau", + "scan": "Bilatu gailuak", + "sendMode": "Bidalketa modua", + "sendModes": { + "single": "Hartzaile bakarra", + "multiple": "Hartzaile anitz", + "link": "URL bidez partekatu" + }, + "sendModeHelp": "Azalpena", + "help": "Ziurtatu zaitez aukeratutako hartzailea zure Wi-Fi sare berean dagoela.", + "placeItems": "Aukeratu elkarbanatzeko elementuak.", + "manualSending": "Eskuzko bidalketa" + }, + "settingsTab": { + "title": "Ezarpenak", + "general": { + "title": "Orokorra", + "brightness": "Argitasuna", + "brightnessOptions": { + "system": "Sistema", + "dark": "Iluna", + "light": "Argia" + }, + "color": "Kolorea", + "colorOptions": { + "system": "Sistema", + "oled": "OLED" + }, + "language": "Hizkuntza", + "languageOptions": { + "system": "Sistema" + }, + "saveWindowPlacement": "Ateratzean gorde lehioaren kokapena", + "minimizeToTray": "Itxi: txikitu lehioa", + "launchAtStartup": "Hasieratze automatikoa", + "launchMinimized": "Hasieratze automatikoa: hasi txikituta", + "animations": "Animazioak", + "saveWindowPlacementWindows": "Irteeran leihoaren kokapena gorde", + "showInContextMenu": "Erakutsi LocalSend testuinguru menuan" + }, + "receive": { + "title": "Eskuratu", + "quickSave": "@:general.quickSave", + "destination": "Hartzailea", + "downloads": "(Deskargak)", + "saveToGallery": "Gorde galerian", + "saveToHistory": "Gorde historialean", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "autoFinish": "Automatikoki amaitu" + }, + "network": { + "title": "Gorria", + "needRestart": "Berrabiarazi zerbitzaria aldaketak aplikatzeko!", + "server": "Zerbitzaria", + "alias": "Aliasa", + "deviceType": "Gailu mota", + "deviceModel": "Gailu modeloa", + "port": "Portua", + "portWarning": "Portu berezi bat erabiltzen ari zarenez, agian ez zara beste gailuentzat ikusgarri izango (Lehenetsitako portua: {defaultPort})", + "encryption": "Zifratzea", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Multicast helbide berezi bat erabiltzen ari zarenez, agian ez zara beste gailuentzat ikusgarri izango. (Lehenetsitako multicast helbidea: {defaultMulticast})", + "discoveryTimeout": "Aurkikuntza denbora muga", + "useSystemName": "Erabili sistemaren izena", + "generateRandomAlias": "Ausazko \"alias\" sortu", + "networkOptions": { + "all": "Guztiak", + "filtered": "Iragazita" + }, + "network": "Sarea" + }, + "advancedSettings": "Ezarpen aurreratuak", + "send": { + "title": "Bidali", + "shareViaLinkAutoAccept": "Eskaerak automatikoki onartu “URL bidez partekatu” moduan" + }, + "other": { + "title": "Besteak", + "support": "LocalSend Lagundu", + "donate": "Dohaintza egin", + "privacyPolicy": "Pribatutasun politika", + "termsOfUse": "Erabilera baldintzak" + } + }, + "troubleshootPage": { + "title": "Konpondu arazoak", + "subTitle": "Aplikazioa ez dabil espero bezala? Hemen arazo arrunten konponbidea aurki dezakezu.", + "solution": "Konponbidea:", + "fixButton": "Konpondu automatikoki", + "firewall": { + "symptom": "Aplikazio honek fitxategiak bidal ditzake beste gailuei, baina beste gailuek ezin ditzakete fitxategiak bidali gailu honetara.", + "solution": "Suhesiarekin erlazionatutako arazo bat izen liteke. {port} portura sarrerako konexioak (UDP eta TCP) onartuz konpon dezakezu.", + "openFirewall": "Ireki Suhesia" + }, + "noConnection": { + "symptom": "Hartzaile eta bidaltzaileak ez dute elkar ikusten eta ezin diote fitxategiak elkarri bidali.", + "solution": "Bi aldeetan dago arazoa? Ziurtatu Wi-Fi sare berdinean kokatuta daudela eta konfigurazio bera elkarbanatzen dutela (portua, multicast helbidea, zifratua). Arazoa Wi-Fi sareak partaideen arteko konexioak mugatzea ere izan liteke. Horrela bada, routerrean aukera hau aktibatu." + }, + "noDiscovery": { + "symptom": "Gailu honek ezin ditu beste gailurik aurkitu.", + "solution": "Ziurtatu gailu guztiak Wi-Fi sare berean daudela eta konfigurazio bera partekatzen dutela (atea, helbide multikasta, kodeketa). Helburuko gailuaren IP helbidea eskuz idatz dezakezu. Horrek balio badu, gehitu gailu hori gogokoetan, etorkizunean automatikoki aurkitu dadin." + } + }, + "receiveHistoryPage": { + "title": "Historia", + "openFolder": "Ireki direktorioa", + "deleteHistory": "Ezabatu historia", + "empty": "Historia hutsik dago.", + "entryActions": { + "open": "Ireki fitxategia", + "info": "Informazioa", + "deleteFromHistory": "Ezabatu historia" + } + }, + "apkPickerPage": { + "title": "App-ak (APK)", + "excludeSystemApps": "Baztertu sistemako app-ak", + "excludeAppsWithoutLaunchIntent": "Baztertu exekutatu ezin diren app-ak", + "apps": "{n} App-ak" + }, + "selectedFilesPage": { + "deleteAll": "Ezabatu dena" + }, + "receivePage": { + "subTitle": { + "one": "-(e)k fitxategi bat bidali nahi dizu", + "other": "-(e)k {n} fitxategi bidali nahi dizkizu" + }, + "subTitleMessage": "-(e)k mezu bat bidali dizu:", + "subTitleLink": "-(e)k lotura bat bidali dizu:", + "canceled": "Bidaltzaileak bidalketa bertan behera utzi du." + }, + "receiveOptionsPage": { + "title": "Ezarpenak", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(directorio @:appName)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Direktorioak daudelako desaktibatua." + }, + "sendPage": { + "waiting": "Erantzunaren zai...", + "rejected": "Hartzaileak ez du bidalketa onartu.", + "busy": "Hartzailea beste bidalketa batekin okupatuta dago." + }, + "progressPage": { + "titleSending": "Fitxategiak bidaltzen", + "titleReceiving": "Fitxategiak eskuratzen", + "savedToGallery": "Galerian gordeta", + "total": { + "title": { + "sending": "Aurrerapena ({time})", + "finishedError": "Akatsarekin amaitu da", + "canceledSender": "Bidaltzaileak bertan behera utzita", + "canceledReceiver": "Hartzaileak bertan behera utzita" + }, + "count": "Fitxategiak: {curr} / {n}", + "size": "Tamaina: {curr} / {n}", + "speed": "Abiadura: {speed}/s" + } + }, + "webSharePage": { + "title": "Loturaren bidez elkarbanatu", + "loading": "Hasieratu zerbitzaria...", + "stopping": "Gelditu zerbitzaria...", + "error": "Zerbitzaria hasieratzean arazo bat gertatu da.", + "openLink": { + "one": "Ireki lotura nabigatzailean:", + "other": "Ireki hauetako lotura bat nabigatzailean:" + }, + "requests": "Eskerak", + "noRequests": "Oraindik ez dago eskaerarik.", + "encryption": "@:settingsTab.network.encryption", + "encryptionHint": "LocalSend-ek autosinatutako zertifikatuak erabiltzen ditu. Nabigatzailean onartu behar duzu", + "pendingRequests": "Eskerak: {n}" + }, + "aboutPage": { + "title": "LocalSend buruz" + }, + "changelogPage": { + "title": "Aldaketak" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Uses English version" + }, + "dialogs": { + "addFile": { + "title": "Gehitu aukeraketari", + "content": "Zer gehitu nahi duzu?" + }, + "addressInput": { + "title": "Sartu helbidea", + "hashtag": "Hashtag", + "ip": "IP Helbidea", + "recentlyUsed": "Duela gutxi erabilitakoak: " + }, + "cancelSession": { + "title": "Bertan behera utzi fitxategi bidalketa", + "content": "¿Benetan nahi duzu bertan behera utzi fitxategi bidalketa?" + }, + "cannotOpenFile": { + "title": "Ezin da fitxategia ireki", + "content": "Ezin izan da \"{file}\" fitxategia ireki. Agian mugitu, berizendatu edo ezabatu egin da?" + }, + "encryptionDisabledNotice": { + "title": "Zifratua ezgaituta", + "content": "Orain komunikazioa zifratu gabeko HTTP konexioaren bidez egiten ari da. HTTPS erailtzeko, gaitu berriro zifratua" + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Gogokoak", + "noFavorites": "Ez dago gogoko gailurik.", + "addFavorite": "Gehitu" + }, + "favoriteDeleteDialog": { + "title": "Ezabatu gogokoetatik", + "content": "Benetan nahi duzu \"{name}\" gogokoetatik ezabatu?" + }, + "favoriteEditDialog": { + "titleAdd": "Gehitu gogokoetara", + "titleEdit": "Doitu", + "name": "Aliasa", + "auto": "(auto)", + "ip": "IP Helbidea", + "port": "Portua" + }, + "fileInfo": { + "title": "Fitxategiari buruzko informazioa", + "fileName": "Fitxategiaren izena:", + "path": "Bidea:", + "size": "Tamaina:", + "sender": "Bidaltzailea:", + "time": "Ordua:" + }, + "fileNameInput": { + "title": "Sartu izena", + "original": "Jatorrizkoa: {original}" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "Sare lokala eskaneatzeko baimenik gabe, LocalSend-ek ezin ditu inguruko gailuak aurkitu. Mesedez, onartu baimen hau ezarpenetan.", + "gotoSettings": "Ezarpenak" + }, + "messageInput": { + "title": "Idatzi mezu bat", + "multiline": "Lerro anitz" + }, + "noFiles": { + "title": "Ez da fitxategirik aukeratu", + "content": "Mesedez aukeratu gutxienez fitxategi bat." + }, + "noPermission": { + "title": "Baimenik gabe", + "content": "Ez dituzu beharrezko baimenak onartu. Mesedez, onartu itzazu ezarpenetan." + }, + "notAvailableOnPlatform": { + "title": "Ez dago eskuragarri", + "content": "Ezaugarri hau hurrengo plataforman bakarrik dago eskuragarri:" + }, + "qr": { + "title": "QR Kodea" + }, + "quickActions": { + "title": "Ekintza azkarrak", + "counter": "Kontagailua", + "prefix": "Aurrizkia", + "padZero": "Hutsekin osatu", + "sortBeforeCount": "Aldez aurretik alfabetikoki ordenatu", + "random": "Ausazkoa" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Fitxategi eskaerak automatikoki onartzen dira. Kontutan izan sare lokaleko edonork bidali ahal izango dizkizula fitxategiak." + }, + "sendModeHelp": { + "title": "Bidalketa moduak", + "single": "Bidali fitxategiak hartzaile bakar bati. Bidalketa bukatutakoan aukeraketa garbituko da.", + "multiple": "Bidali fitxategiak hartzaile anitzeri. Aukeraketa ez da garbituko.", + "link": "LocalSend instalatuta ez duten hartzaileak fitxategiak eskuratu ahali zango dituzte lotura nabigatzailean zabalduz." + } + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "Itxi LocalSend" + }, + "web": { + "waiting": "@:sendPage.waiting", + "rejected": "Bertan behera utzita", + "files": "Fitxategiak", + "fileName": "Fitxateig izena", + "size": "Tamaina" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "Baieztatu", + "cancel": "Utzi", + "edit": "Editatu", + "gifIndicator": "GIF", + "loadFailed": "Akatsa kargatzen", + "original": "Jatorrizkoa", + "preview": "Aurrebista", + "select": "Aukeratu", + "emptyList": "Zerrenda hutsik", + "unSupportedAssetType": "Fitxategi mota ez onartua.", + "unableToAccessAll": "Ezin da gailuko fitxategietara atzitu.", + "viewingLimitedAssetsTip": "Ikusi bakarrik aplikazioarentzat eskuragarri dauden fitxategi eta albumak.", + "changeAccessibleLimitedAssets": "Egin klik eskuragarri dauden fitxategiak eguneratzeko", + "accessAllTip": "Aplikazioak gailu fitxategi batzuk bakarrik atzitu ditzake. Joan sistemako ezarpenetara eta eman aplikazioari media fitxategi guztiak atzitzeko baimena", + "goToSystemSettings": "Joan sistemako ezarpenetara", + "accessLimitedAssets": "Jarraitu atzipen mugatuarekin", + "accessiblePathName": "Eskuragarri dauden fitxategiak", + "sTypeAudioLabel": "Audioa", + "sTypeImageLabel": "Irudia", + "sTypeVideoLabel": "Bideoa", + "sTypeOtherLabel": "Bestelako medioak", + "sActionPlayHint": "erreproduzitu", + "sActionPreviewHint": "aurrebista", + "sActionSelectHint": "aukeratu", + "sActionSwitchPathLabel": "aldatu bidea", + "sActionUseCameraHint": "erabaili kamera", + "sNameDurationLabel": "iraupena", + "sUnitAssetCountLabel": "kontaketa" + }, + "sanitization": { + "invalid": "Fitxategiaren izena karaktere baliogabeak ditu" + }, + "networkInterfacesPage": { + "title": "Sare interfazeak" + } +} diff --git a/app/assets/i18n/fa.json b/app/assets/i18n/fa.json new file mode 100644 index 0000000..5c99559 --- /dev/null +++ b/app/assets/i18n/fa.json @@ -0,0 +1,527 @@ +{ + "locale": "فارسی", + "appName": "لوکال‌سِند", + "general": { + "accept": "پذیرفتن", + "accepted": "پذیرفته‌شده", + "add": "افزودن", + "advanced": "پیشرفته", + "cancel": "ردکردن", + "close": "بستن", + "confirm": "پذیرفتن", + "continueStr": "ادامه", + "copy": "کپی", + "copiedToClipboard": "کپی شد", + "decline": "نپذیرفتن", + "done": "انجام شد", + "delete": "حذف", + "edit": "ویرایش", + "error": "خطا", + "example": "نمونه", + "files": "فایل‌ها", + "finished": "پایان‌یافت", + "hide": "مخفی", + "off": "خاموش", + "offline": "آفلاین", + "on": "روشن", + "online": "آنلاین", + "open": "باز کردن", + "queue": "صف", + "quickSave": "ذخیره سریع", + "quickSaveFromFavorites": "ذخیره سریع برای \"موردعلاقه‌ها\"", + "renamed": "نام ویرایش‌شد", + "reset": "بازنشانی", + "restart": "راه‌اندازی دوباره", + "settings": "تنظیمات", + "skipped": "رد شد", + "start": "شروع", + "stop": "توقف", + "save": "ذخیره", + "unchanged": "بدون تغییر", + "unknown": "ناشناخته", + "noItemInClipboard": "چیزی در کلیپ‌بورد وجود ندارد." + }, + "receiveTab": { + "title": "دریافت", + "infoBox": { + "ip": "آی‌پی:", + "port": "پورت:", + "alias": "نام کوتاه:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "‌موردعلاقه‌ها", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "ارسال", + "selection": { + "title": "انتخاب شده‌ها", + "files": "فایل‌ها: {files}", + "size": "اندازه: {size}" + }, + "picker": { + "file": "فایل", + "folder": "پوشه", + "media": "رسانه", + "text": "متن", + "app": "برنامه", + "clipboard": "کلیپ‌بورد" + }, + "shareIntentInfo": "همچنین می‌توانید از ویژگی «هم‌رسانی» دستگاه تلفن‌همراه خود برای انتخاب آسان‌تر پرونده‌ها استفاده کنید.", + "nearbyDevices": "دستگاه‌های اطراف", + "thisDevice": "این دستگاه", + "scan": "جستجوی دستگاه‌ها", + "manualSending": "ارسال دستی", + "sendMode": "حالت ارسال", + "sendModes": { + "single": "یک دریافت کننده", + "multiple": "چندین دریافت کننده", + "link": "اشتراک گذاری از طریق لینک" + }, + "sendModeHelp": "توضیح", + "help": "لطفاً مطمئن شوید که دستگاه مورد نظر به شبکه وای‌فای یکسانی وصل باشد.", + "placeItems": "موارد را برای هم‌رسانی قرار دهید." + }, + "settingsTab": { + "title": "تنظیمات", + "general": { + "title": "عمومی", + "brightness": "ظاهر", + "brightnessOptions": { + "system": "سیستم", + "dark": "تیره", + "light": "روشن" + }, + "color": "رنگ", + "colorOptions": { + "system": "سیستم", + "oled": "OLED" + }, + "language": "زبان", + "languageOptions": { + "system": "سیستم" + }, + "saveWindowPlacement": "ذخیره موقعیت پنجره پس از خروج", + "saveWindowPlacementWindows": "ذخیره موقعیت پنجره پس از خروج", + "minimizeToTray": "خروج: ارسال برنامه به سیستم تری", + "launchAtStartup": "شروع خودکار پس از ورود به سیستم", + "launchMinimized": "شروع خودکار: شروع به صورت پنجره پنهان", + "showInContextMenu": "نمایش لوکال‌سند در منوی زمینه", + "animations": "انیمیشن‌ها" + }, + "receive": { + "title": "دریافت", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "پایان خودکار", + "destination": "مقصد", + "downloads": "(دانلودها)", + "saveToGallery": "ذخیره رسانه در گالری", + "saveToHistory": "ذخیره در تاریخچه" + }, + "send": { + "title": "ارسال", + "shareViaLinkAutoAccept": "اشتراک‌گذاری از طریق لینک: تایید خودکار" + }, + "network": { + "title": "شبکه", + "needRestart": "برای اعمال تنظیمات، سرور را مجدد راه‌اندازی کنید!", + "server": "سرور", + "alias": "نام کوتاه", + "deviceType": "نوع دستگاه", + "deviceModel": "مدل دستگاه", + "port": "پورت", + "discoveryTimeout": "مدت کاوش", + "useSystemName": "استفاده از نام سیستم", + "generateRandomAlias": "ایجاد نام مستعار تصادفی", + "portWarning": "ممکن است به دلیل استفاده از یک پورت سفارشی، دستگاه‌های دیگر شما را شناسایی نکنند (پیشفرض : {defaultPort})", + "encryption": "رمزنگاری", + "multicastGroup": "چندپخشی", + "multicastGroupWarning": "ممکن است به دلیل استفاده از چندپخشی سفارشی، دستگاه‌های دیگر شما را شناسایی نکنند (پیشفرض: {defaultMulticast})", + "network": "شبکه", + "networkOptions": { + "all": "همه", + "filtered": "فیلتر شده" + } + }, + "other": { + "title": "سایر", + "support": "حمایت از لوکال‌سند", + "donate": "کمک مالی", + "privacyPolicy": "سیاست حفظ حریم خصوصی", + "termsOfUse": "شرایط استفاده" + }, + "advancedSettings": "تنظیمات پیشرفته" + }, + "troubleshootPage": { + "title": "عیب یابی", + "subTitle": "این برنامه مطابق انتظار کار نمی‌کند؟ در اینجا می‌توانید راه حل‌های رایج را بیابید.", + "solution": "راه حل:", + "fixButton": "تعمیر خودکار", + "firewall": { + "symptom": "این برنامه می‌تواند پرونده‌ها را به دستگاه‌های دیگر ارسال کند اما دستگاه‌های دیگر نمی‌توانند پرونده‌ها را به این دستگاه ارسال کنند.", + "solution": "این مشکل به احتمال زیاد مربوط به تنظیمات فایروال است. شما می‌توانید با دادن مجوز به اتصالات ورودی این مشکل را حل کنید (UDP و TCP) در پورت {port}.", + "openFirewall": "بازکردن فایروال" + }, + "noDiscovery": { + "symptom": "این دستگاه نمی‌تواند دستگاه‌های دیگر را پیدا کند.", + "solution": "مطمئن شوید که هر دو دستگاه به یک شبکه وای‌فای متصل هستند و پیکربندی یکسانی دارند (پورت، آدرس چندپخشی، رمزنگاری). سعی کنید آدرس آی‌پی دستگاه مورد نظر را به صورت دستی تایپ کنید. اگر جواب داد، این دستگاه را به موارد موردعلاقه اضافه کنید تا در آینده به طور خودکار کشف شود." + }, + "noConnection": { + "symptom": "هر دو دستگاه نمی‌توانند یکدیگر را پیدا کرده و پرونده‌ها را هم‌رسانی کنند.", + "solution": "آیا مشکل در هر دو طرف وجود دارد؟ اگر چنین است، باید مطمئن شوید که هر دو دستگاه در یک شبکه Wi-Fi متصل هستند و تنظیمات یکسانی دارند (پورت، آدرس چندپخشی، رمزگذاری). ممکن است شبکه Wi-Fi اجازه‌ی ارتباط بین شرکت‌کنندگان را ندهد، به دلیل فعال بودن قابلیت ایزوله‌سازی نقطه دسترسی (AP Isolation). در این صورت باید این گزینه را در روتر غیرفعال کنید." + } + }, + "receiveHistoryPage": { + "title": "تاریخچه", + "openFolder": "باز کردن پوشه", + "deleteHistory": "حذف تاریخچه", + "empty": "تاریخچه خالی است.", + "entryActions": { + "open": "باز کردن فایل", + "showInFolder": "نمایش پوشه", + "info": "اطلاعات", + "deleteFromHistory": "حذف از تاریخچه" + } + }, + "apkPickerPage": { + "title": "برنامه (APK)", + "excludeSystemApps": "شامل نشدن برنامه‌های سیستمی", + "excludeAppsWithoutLaunchIntent": "شامل نشدن برنامه‌های غیر اجرایی", + "apps": "{n} برنامه" + }, + "selectedFilesPage": { + "deleteAll": "حذف همه" + }, + "receivePage": { + "subTitle": { + "one": "می‌خواهد برای شما یک فایل ارسال کند", + "other": "می‌خواهد برای شما {n} فایل ارسال کند" + }, + "subTitleMessage": "به شما پیام داد:", + "subTitleLink": "برای شما یک لینک ارسال کرد:", + "canceled": "فرستنده درخواست را لغو کرد." + }, + "receiveOptionsPage": { + "title": "گزینه‌ها", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(پوشه لوکال‌سند)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "به دلیل وجود پوشه‌ها به طور خودکار خاموش می‌شود." + }, + "sendPage": { + "waiting": "در انتظار پاسخ…", + "rejected": "گیرنده درخواست را رد کرد.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "گیرنده با درخواست دیگری مشغول است." + }, + "progressPage": { + "titleSending": "ارسال فایل‌ها", + "titleReceiving": "دریافت فایل‌ها", + "savedToGallery": "در تصاویر ذخیره شد", + "total": { + "title": { + "sending": "مجموع پیشرفت ({time})", + "finishedError": "با خطا مواجه شد", + "canceledSender": "توسط فرستنده لغو شد", + "canceledReceiver": "توسط گیرنده لغو شد" + }, + "count": "فایل‌ها: {curr} / {n}", + "size": "حجم: {curr} / {n}", + "speed": "سرعت: {speed}/s" + } + }, + "webSharePage": { + "title": "اشتراک گذاری از طریق لینک", + "loading": "در حال راه‌اندازی سرور…", + "stopping": "در حال توقف سرور…", + "error": "هنگام راه‌اندازی سرور خطایی رخ داد.", + "openLink": { + "one": "باز کردن لینک در مرورگر:", + "other": "باز کردن لینک‌ها در مرورگر:" + }, + "requests": "درخواست‌ها", + "noRequests": "هنوز درخواستی وجود ندارد.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "درخواست‌ها به طور خودکار پذیرفته می‌شوند", + "requirePin": "نیاز به پین", + "pinHint": "پین \"{pin}\" می‌باشد", + "encryptionHint": "لوکال‌سند از یک گواهی خودامضا استفاده می‌کند. شما باید آن را در مرورگر قبول کنید.", + "pendingRequests": "درخواست‌های در حال انتظار: {n}" + }, + "aboutPage": { + "title": "درباره لوکال‌سند", + "description": [ + "لوکال‌سند یک برنامه آزاد و متن‌باز است که به شما امکان می‌دهد پرونده‌ها و پیام‌ها را به‌طور ایمن با دستگاه‌های اطراف از طریق شبکه محلی خود و بدون نیاز به اینترنت هم‌رسانی کنید.", + "این برنامه برای سیستم عامل‌های اندروید، آی او اس، مک او اس، ویندوز و لینوکس در دسترس است. شما می‌توانید با مراجعه به وبگاه رسمی برنامه کلیه روش‌های دانلود را مشاهده نمایید." + ], + "author": "نویسنده", + "contributors": "مشارکت کنندگان", + "packagers": "بسته‌بندی‌ها", + "translators": "مترجمان" + }, + "donationPage": { + "title": "کمک مالی", + "info": "لوکال‌سند آزاد، متن‌باز و فاقد هرگونه تبلیغات است. اگر به این برنامه علاقه‌مندید، می‌توانید با کمک مالی از توسعه آن حمایت کنید.", + "donate": "کمک مالی {amount}", + "thanks": "بسیار از شما سپاسگزاریم!", + "restore": "بازیابی خرید" + }, + "changelogPage": { + "title": "تاریخچه تغییرات برنامه" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "مناطق زبانی مختلف ممکن است واژه‌های متفاوتی داشته باشند، ممکن است تطابق 1:1 وجود نداشته باشد", + "adjectives": [ + "ستودنی", + "زیبا", + "بزرگ", + "درخشان", + "تمیز", + "باهوش", + "باحال", + "بامزه", + "کلک", + "مصمم", + "باانرژی", + "چابک", + "شگفت‌انگیز", + "سریع", + "شایسته", + "سرحال", + "خوب", + "دلنشین", + "باشکوه", + "خوشتیپ", + "جذاب", + "مهربون", + "دوست‌داشتنی", + "مبهم", + "بی‌نظیر", + "باادب", + "صبور", + "زیبا", + "نیرومند", + "مایه‌دار", + "اسرارآمیز", + "باهوش", + "سرسخت", + "خاص", + "خوش‌فکر", + "قدرتمند", + "منظم", + "خردمند" + ], + "fruits": [ + "سیب", + "آووکادو", + "موز", + "توت", + "بلوبری", + "کلم", + "هویج", + "گیلاس", + "نارگیل", + "انگور", + "لیمو", + "کاهو", + "انبه", + "خربزه", + "قارچ", + "پیاز", + "پرتقال", + "پاپایا", + "هلو", + "گلابی", + "آناناس", + "سیب‌زمینی", + "کدوتنبل", + "تمشک", + "توت‌فرنگی", + "گوجه" + ], + "combination": "{fruit} {adjective}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "افزودن به انتخاب شده‌ها", + "content": "چه چیزی می‌خواهید اضافه کنید؟" + }, + "openFile": { + "title": "باز کردن فایل", + "content": "آیا می‌خواهید فایل دریافتی را باز کنید؟" + }, + "addressInput": { + "title": "آدرس را وارد کنید", + "hashtag": "هشتگ", + "ip": "آدرس آی‌پی", + "recentlyUsed": "اخیرا استفاده شده: " + }, + "cancelSession": { + "title": "‌‌لغو انتقال فایل", + "content": "واقعاً می‌خواهید انتقال فایل را لغو کنید؟" + }, + "cannotOpenFile": { + "title": "نمی‌تواند فایل را باز کند", + "content": "نمی‌توان فایل \"{file}\" را باز کرد. آیا این فایل منتقل، تغییر نام یا حذف شده است؟" + }, + "encryptionDisabledNotice": { + "title": "رمزنگاری غیرفعال شد", + "content": "اکنون ارتباط از طریق پروتکل HTTP رمزنگاری نشده صورت می‌گیرد. برای استفاده از HTTPS، رمزنگاری را دوباره فعال کنید." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "علاقه‌مندی‌ها", + "noFavorites": "هنوز دستگاه مورد علاقه‌ای انتخاب نشده است.", + "addFavorite": "افزودن" + }, + "favoriteDeleteDialog": { + "title": "حذف از علاقه‌مندی‌ها", + "content": "واقعاً می‌خواهید از علاقه‌مندی‌ها حذف کنید \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "افزودن به علاقه‌مندی‌ها", + "titleEdit": "تنظیمات", + "name": "نام مستعار", + "auto": "(خودکار)", + "ip": "آدرس آی پی", + "port": "پورت" + }, + "fileInfo": { + "title": "مشخصات فایل", + "fileName": "نام فایل:", + "path": "مسیر:", + "size": "حجم:", + "sender": "فرستنده:", + "time": "زمان:" + }, + "fileNameInput": { + "title": "نام فایل را وارد کنید", + "original": "اصلی: {original}" + }, + "historyClearDialog": { + "title": "پاکسازی تاریخچه", + "content": "واقعاً می‌خواهید کل تاریخچه را حذف کنید؟" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "لوکال‌سند نمی‌تواند دستگاه‌های دیگر را بدون داشتن مجوز اسکن شبکه محلی پیدا کند. لطفاً این مجوز را در تنظیمات به برنامه بدهید.", + "gotoSettings": "تنظیمات" + }, + "messageInput": { + "title": "پیام را بنویسید", + "multiline": "چند خطی" + }, + "noFiles": { + "title": "فایلی انتخاب نشده", + "content": "لطفا حداقل یک پرونده را انتخاب کنید." + }, + "noPermission": { + "title": "بدون مجوز", + "content": "شما مجوزهای مورد نیاز را اعطا نکرده‌اید. لطفاً آنها را در تنظیمات مجوزدهی کنید." + }, + "notAvailableOnPlatform": { + "title": "در دسترس نیست", + "content": "این ویژگی فقط در دسترس است در:" + }, + "qr": { + "title": "QR کد" + }, + "quickActions": { + "title": "اقدامات سریع", + "counter": "شمارنده", + "prefix": "پیشوند", + "padZero": "همگام سازی نام‌ها با افزودن صفر", + "sortBeforeCount": "از قبل بر اساس حروف الفبا مرتب کنید", + "random": "تصادفی" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "درخواست‌ها به صورت خودکار پذیرفته می‌شوند. توجه داشته باشید که همه افراد در شبکه محلی می‌توانند برای شما پرونده ارسال کنند." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "درخواست‌ها به طور خودکار از دستگاه‌های موجود در فهرست موردعلاقه‌ها پذیرفته می‌شود.", + "هشدار: این روش در حال حاضر کاملاً ایمن نیست، زیرا در صورت دسترسی هکر به دستگاه‌های موجود در فهرست موردعلاقه‌ها، می‌تواند بدون محدودیت برای شما پرونده ارسال کند.", + "با این حال، این گزینه هنوز هم ایمن‌تر از اجازه دادن به همه کاربران در شبکه محلی برای ارسال پرونده بدون محدودیت است." + ] + }, + "pin": { + "title": "پین را وارد کنید" + }, + "sendModeHelp": { + "title": "حالت‌های ارسال", + "single": "پرونده‌ها را به یک گیرنده ارسال می‌کند. فهرست انتخاب شده‌ها پس از اتمام انتقال پرونده پاک می‌شود.", + "multiple": "پرونده‌ها را برای چندین گیرنده ارسال می‌کند. فهرست انتخاب شده‌ها پاک نخواهد شد.", + "link": "گیرندگانی که لوکال‌سند را نصب نکرده اند، می‌توانند پرونده‌ها را با باز کردن پیوند در مرورگر خود دانلود کنند." + }, + "zoom": { + "title": "آدرس اینترنتی" + } + }, + "sanitization": { + "empty": "نام فایل نمی‌تواند خالی باشد", + "invalid": "نام فایل حاوی کاراکترهای نامعتبر است" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "خروج از لوکال‌سند", + "closeWindows": "خروج" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "پین را وارد کنید", + "invalidPin": "پین اشتباه است", + "tooManyAttempts": "تلاش‌های بیش از اندازه", + "rejected": "پذیرفته نشد", + "files": "فایل‌ها", + "fileName": "نام فایل", + "size": "حجم" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "تایید", + "cancel": "لغو", + "edit": "ویرایش", + "gifIndicator": "GIF", + "loadFailed": "بارگذاری ناموفق", + "original": "اصلی", + "preview": "پیش نمایش", + "select": "انتخاب", + "emptyList": "لیست خالی", + "unSupportedAssetType": "نوع پرونده پشتیبانی نشده.", + "unableToAccessAll": "قادر به دسترسی به تمام فایل‌های موجود در دستگاه نیست", + "viewingLimitedAssetsTip": "فقط پرونده‌ها و آلبوم‌های قابل دسترسی برنامه را مشاهده کنید.", + "changeAccessibleLimitedAssets": "برای به‌روزرسانی فایل‌های در دسترس کلیک کنید", + "accessAllTip": "برنامه فقط می‌تواند به برخی از پرونده‌های دستگاه دسترسی داشته باشد. به تنظیمات سیستم بروید و به برنامه اجازه دهید به تمام رسانه‌های موجود در دستگاه دسترسی داشته باشد.", + "goToSystemSettings": "رفتن به تنظیمات سیستم", + "accessLimitedAssets": "با دسترسی محدود ادامه دهید", + "accessiblePathName": "فایل‌های قابل دسترسی", + "sTypeAudioLabel": "صوت", + "sTypeImageLabel": "تصویر", + "sTypeVideoLabel": "ویدیو", + "sTypeOtherLabel": "دیگر رسانه‌ها", + "sActionPlayHint": "پخش", + "sActionPreviewHint": "پیش نمایش", + "sActionSelectHint": "انتخاب", + "sActionSwitchPathLabel": "تغییر مسیر", + "sActionUseCameraHint": "از دوربین استفاده کنید", + "sNameDurationLabel": "مدت زمان", + "sUnitAssetCountLabel": "شمردن" + }, + "networkInterfacesPage": { + "title": "رابط‌های شبکه", + "info": "به طور پیش فرض، LocalSend از تمام رابط های شبکه موجود استفاده می کند. در اینجا می توانید شبکه های ناخواسته را حذف کنید. برای اعمال تغییرات باید سرور را ریستارت کنید.", + "preview": "پیشنمایش", + "whitelist": "لیست سفید", + "blacklist": "لیست سیاه" + } +} diff --git a/app/assets/i18n/fi.json b/app/assets/i18n/fi.json new file mode 100644 index 0000000..0d71b1e --- /dev/null +++ b/app/assets/i18n/fi.json @@ -0,0 +1,542 @@ +{ + "locale": "Finnish", + "appName": "LocalSend", + "general": { + "accept": "Hyväksy", + "accepted": "Hyväksytty", + "add": "Lisää", + "advanced": "Edistynyt", + "cancel": "Peruuta", + "close": "Sulje", + "confirm": "Vahvista", + "continueStr": "Jatka", + "copy": "Kopioi", + "copiedToClipboard": "Kopioitu leikepöydälle", + "decline": "Hylkää", + "done": "Valmis", + "delete": "Poista", + "edit": "Muokkaa", + "error": "Virhe", + "example": "Esimerkki", + "files": "Tiedostot", + "finished": "Valmis", + "hide": "Piilota", + "off": "Pois", + "offline": "Offline", + "on": "Päällä", + "online": "Online", + "open": "Avaa", + "queue": "Jono", + "quickSave": "Pikatallennus", + "quickSaveFromFavorites": "Pikatallennus suosikeiksi", + "renamed": "Nimetty uudelleen", + "reset": "Nollaa", + "restart": "Käynnistä uudelleen", + "settings": "Asetukset", + "skipped": "Ohitettu", + "start": "Aloita", + "stop": "Pysäytä", + "save": "Tallenna", + "unchanged": "Muuttumaton", + "unknown": "Tuntematon", + "noItemInClipboard": "Leikepöydällä ei ole mitään." + }, + "receiveTab": { + "title": "Ota vastaan", + "infoBox": { + "ip": "IP-osoite:", + "port": "Portti:", + "alias": "Laitteen nimi:" + }, + "quickSave": { + "favorites": "Suosikit", + "off": "@:general.off", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Lähetä", + "selection": { + "title": "Valinta", + "files": "Tiedostot: {files}", + "size": "Koko: {size}" + }, + "picker": { + "file": "Tiedosto", + "folder": "Kansio", + "media": "Media", + "text": "Teksti", + "app": "Sovellus", + "clipboard": "Liitä" + }, + "shareIntentInfo": "Sinä voit myös käyttää laitteesi \"Jaa\"-toimintoa valitaksesi tiedostoja helpommin.", + "nearbyDevices": "Lähellä olevat laitteet", + "thisDevice": "Tämä laite", + "scan": "Etsi laitteita", + "manualSending": "Manuaalinen lähetys", + "sendMode": "Lähetystapa", + "sendModes": { + "single": "Yksi vastaanottaja", + "multiple": "Monta vastaanottajaa", + "link": "Jaa linkillä" + }, + "sendModeHelp": "Selitys", + "help": "Varmista, että haluttu kohde on myös samassa Wi-Fi-verkossa.", + "placeItems": "Lisää tiedostot tähän, jotta voit lähettää ne." + }, + "settingsTab": { + "title": "Asetukset", + "general": { + "title": "Yleinen", + "brightness": "Teema", + "brightnessOptions": { + "system": "Järjestelmä", + "dark": "Tumma", + "light": "Vaalea" + }, + "color": "Väri", + "colorOptions": { + "system": "Järjestelmä", + "oled": "OLED" + }, + "language": "Kieli", + "languageOptions": { + "system": "Järjestelmä" + }, + "saveWindowPlacement": "Poistu: Tallenna ikkunan sijainti", + "saveWindowPlacementWindows": "Tallenna ikkunan sijainti poistumisen jälkeen", + "minimizeToTray": "Poistu: Minimoi ilmoitusalueelle", + "launchAtStartup": "Automaattinen käynnistys", + "launchMinimized": "Automaattinen käynnistys: Käynnistä piiilotettuna", + "showInContextMenu": "Näytä LocalSend kontekstivalikossa", + "animations": "Animaatiot" + }, + "receive": { + "title": "Vastaanotto", + "quickSave": "Automaattinen tallennus", + "autoFinish": "Automaattinen lopetus", + "destination": "Kohde", + "downloads": "(Lataukset)", + "saveToGallery": "Tallenna media galleriaan", + "saveToHistory": "Tallenna historiaan", + "quickSaveFromFavorites": "Automaattinen tallennus suosikeista", + "requirePin": "Kiinnitä" + }, + "send": { + "title": "Lähetys", + "shareViaLinkAutoAccept": "Jaa linkki: Hyväksy automaattisesti" + }, + "network": { + "title": "Verkko", + "needRestart": "Käynnistä LocalSend uudelleen saadaksesi muutokset käyttöön!", + "server": "Palvelin", + "alias": "Laitteen nimi", + "deviceType": "Laitteen tyyppi", + "deviceModel": "Laitteen malli", + "port": "Portti", + "discoveryTimeout": "Laitteiden etsintäaika", + "useSystemName": "Käytä järjestelmän nimeä", + "generateRandomAlias": "Luo satunnainen alias", + "portWarning": "Sinua ei ehkä havaita muiden laitteiden toimesta, koska käytät mukautettua porttia. (oletus: {defaultPort})", + "encryption": "Salaus", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Sinua ei ehkä havaita muiden laitteiden toimesta, koska käytät mukautettua multicast-osoitetta. (oletus: {defaultMulticast})", + "networkOptions": { + "all": "Kaikki", + "filtered": "Suodatettu" + }, + "network": "Verkko" + }, + "other": { + "title": "Muut", + "support": "Tue LocalSendia", + "donate": "Lahjoita", + "privacyPolicy": "Tietosuojakäytäntö", + "termsOfUse": "Käyttöehdot" + }, + "advancedSettings": "Edistyneet asetukset" + }, + "troubleshootPage": { + "title": "Ongelmanratkaisu", + "subTitle": "Eikö sovellus toimi odotetusti? Täältä löydät joitain yleisiä ratkaisuja.", + "solution": "Ratkaisu:", + "fixButton": "Automaattinen korjaus", + "firewall": { + "symptom": "Tämä sovellus voi lähettää tiedostoja muihin laitteisiin, mutta muut laitteet eivät voi lähettää tiedostoja tähän laitteeseen.", + "solution": "Tämä on todennäköisesti palomuuriongelma. Voit ratkaista tämän sallimalla saapuvat yhteydet (UDP ja TCP) porttiin {port}.", + "openFirewall": "Avaa palomuuri" + }, + "noDiscovery": { + "symptom": "Tämä laite ei pysty löytämään muita laitteita.", + "solution": "Varmista, että kaikki laitteet ovat samassa Wi-Fi-verkossa ja jakavat saman kokoonpanon (portti, monilähetysosoite, salaus). Voit yrittää kirjoittaa kohdelaitteen IP-osoitteen manuaalisesti. Jos tämä toimii, harkitse tämän laitteen lisäämistä suosikkeihin, jotta se voidaan löytää automaattisesti tulevaisuudessa." + }, + "noConnection": { + "symptom": "Molemmat laitteet eivät voi löytää toisiaan eivätkä jakaa tiedostoja.", + "solution": "Onko ongelma olemassa molemmin puolin? Jos on, sinun on varmistettava, että molemmat laitteet ovat samassa Wi-Fi-verkossa ja jakavat saman kokoonpanon (portti, multicast-osoite, salaus). Verkko ei ehkä salli viestintää osallistujien välillä. Tässä tapauksessa tämä vaihtoehto on otettava käyttöön reitittimessä." + } + }, + "receiveHistoryPage": { + "title": "Historia", + "openFolder": "Avaa kansio", + "deleteHistory": "Tyhjennä historia", + "empty": "Historia on tyhjä.", + "entryActions": { + "open": "Avaa tiedosto", + "showInFolder": "Näytä kansiossa", + "info": "Tiedot", + "deleteFromHistory": "Poista historiasta" + } + }, + "apkPickerPage": { + "title": "Sovellukset (APK)", + "excludeSystemApps": "lukuun ottamatta järjestelmäsovelluksia", + "excludeAppsWithoutLaunchIntent": "lukuun ottamatta sovelluksia, joilla ei ole käynnistysintentiota", + "apps": "{n} sovellusta" + }, + "selectedFilesPage": { + "deleteAll": "Poista kaikki" + }, + "receivePage": { + "subTitle": { + "one": "on lähettämässä sinulle tiedostoa", + "other": "on lähettämässä sinulle {n} tiedostoa" + }, + "subTitleMessage": "lähetti sinulle viestin:", + "subTitleLink": "lähetti sinulle linkin:", + "canceled": "Lähettäjä on peruuttanut pyynnön." + }, + "receiveOptionsPage": { + "title": "Asetukset", + "destination": "Vastaanottoasetukset", + "appDirectory": "(LocalSend-kansio)", + "saveToGallery": "Tallenna galleriaan", + "saveToGalleryOff": "Poistettu käytöstä automaattisesti, koska lähetetyissä tiedostoissa on kansioita." + }, + "sendPage": { + "waiting": "Odotetaan vastausta...", + "rejected": "Vastaanottaja on peruuttanut pyynnön.", + "busy": "Vastaanottaja vastaanottaa toista pyyntöä.", + "tooManyAttempts": "Liian monta yritystä" + }, + "progressPage": { + "titleSending": "Tiedostojen lähetys", + "titleReceiving": "Tiedostojen vastaanotto", + "savedToGallery": "Tallennettu Kuvat-kansioon", + "total": { + "title": { + "sending": "Lähetysprosessi ({time})", + "finishedError": "Päättynyt virheellä", + "canceledSender": "Lähettäjä peruutti", + "canceledReceiver": "Vastaanottaja peruutti" + }, + "count": "Tiedostot: {curr} / {n}", + "size": "Koko: {curr} / {n}", + "speed": "Nopeus: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}t {m}m", + "days": "{d}pv {h}t {m}m", + "@hours": "Käytä 'h' tuntien lyhenteenä ja 'm' minuuttien", + "@days": "Käytä 'pv' päiville, 'h' tunneille ja 'm' minuuteille" + } + }, + "webSharePage": { + "title": "Jaa linkin kautta", + "loading": "Käynnistetään palvelinta…", + "stopping": "Pysäytetään palvelinta…", + "error": "Palvelimen käynnistyksessä tapahtui virhe.", + "openLink": { + "one": "Avaa tämä linkki selaimessasi:", + "other": "Avaa jokin näistä linkeistä selaimessasi:" + }, + "requests": "Pyynnöt", + "noRequests": "Ei pyyntöjä vielä.", + "encryption": "Verkon salaus", + "autoAccept": "Hyväksy pyynnöt automaattisesti", + "requirePin": "Vaadi PIN-koodi", + "pinHint": "PIN-koodi on \"{pin}\"", + "encryptionHint": "LocalSend käyttää itse allekirjoitettua sertifikaattia. Sinun on hyväksyttävä se selaimessasi.", + "pendingRequests": "Odottavat pyynnöt: {n}" + }, + "aboutPage": { + "title": "Tietoja LocalSendista", + "description": [ + "LocalSend on ilmainen, avoimen lähdekoodin sovellus, jonka avulla voit turvallisesti jakaa tiedostoja ja lähettää viestejä läheisten laitteiden kanssa paikallisessa verkossasi ilman internet-yhteyttä.", + "LocalSend on saatavilla Androidille, iOS:lle, Linuxille, macOS:lle ja Windowsille. Kaikki latausvaihtoehdot löytyvät virallisilta kotisivuilta." + ], + "author": "Tekijä", + "contributors": "Avustajat", + "packagers": "Pakkaajat", + "translators": "Kääntäjät" + }, + "donationPage": { + "title": "Lahjoita", + "info": "LocalSend on ilmainen, avoimen lähdekoodin sovellus ilman mainoksia. Voit tukea projektia lahjoituksella, jos pidät sovelluksesta.", + "donate": "Lahjoita {amount}", + "thanks": "Suuret kiitokset!", + "restore": "Palauta ostos" + }, + "changelogPage": { + "title": "Muutosloki" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Eri sijainneissa voi olla käytössä eri sanoja. Ne eivät täsmää toisiaan tasantarkkaan.", + "adjectives": [ + "Stydi", + "Jämä", + "Raju", + "Makee", + "Siisti", + "Kummallinen", + "Hurja", + "Hörisevä", + "Naurava", + "Suriseva", + "Pöhelö", + "Hölmö", + "Spede", + "Kummallinen", + "Rampainen", + "Jonne", + "Lössi", + "Kuuli", + "Aukiva", + "Lutsi", + "Wallahi", + "Pummi", + "Köyhä", + "Saunassa käyvä", + "Bulkki", + "Chilli", + "Dokkaava", + "Känni", + "Broidi", + "Kundi", + "Göntsä", + "Pelleilevä", + "Haiseva", + "Hakkeri" + ], + "fruits": [ + "Omena", + "Banaani", + "Appelsiini", + "Mango", + "Päärynä", + "Kiivi", + "Kirsikka", + "Vadelma", + "Mustikka", + "Mansikka", + "Luumu", + "Persikka", + "Punaherukka", + "Mustaherukka", + "Karhunvatukka", + "Vesimeloni", + "Hedelmä", + "Päärynä", + "Pihlajanmarja", + "Karpalo", + "Puolukka", + "Lakka", + "Kuusenkerkkä", + "Kataja", + "Kuusama", + "Ananas", + "Granaattiomena", + "Sitruuna", + "Lime", + "Papaija", + "Passionhedelmä", + "Pomelo", + "Kiinalainen karviainen", + "Lychee", + "Taateli", + "Viikuna", + "Rypäle" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "Lisää valintaan", + "content": "Mitä haluat lisätä?" + }, + "openFile": { + "title": "Avaa tiedosto", + "content": "Haluatko avata vastaanotetun tiedoston?" + }, + "addressInput": { + "title": "Anna osoite", + "hashtag": "Hashtag", + "ip": "IP-osoite", + "recentlyUsed": "Äskettäin käytetty: " + }, + "cancelSession": { + "title": "Peruuta tiedostonsiirto", + "content": "Haluatko varmasti peruuttaa tiedostonsiirron?" + }, + "cannotOpenFile": { + "title": "Tiedostoa ei voi avata", + "content": "Tiedostoa \"{file}\" ei voitu avata. Onko tämä tiedosto siirretty, nimetty uudelleen tai poistettu?" + }, + "encryptionDisabledNotice": { + "title": "Salaus poistettu käytöstä", + "content": "Viestintä tapahtuu nyt salaamattoman HTTP-protokollan kautta. Jos haluat käyttää HTTPS:ää, ota salaus uudelleen käyttöön." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Suosikit", + "noFavorites": "Ei suosikkilaitteita vielä.", + "addFavorite": "Lisää" + }, + "favoriteDeleteDialog": { + "title": "Poista suosikeista", + "content": "Haluatko varmasti poistaa suosikeista \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Lisää suosikkeihin", + "titleEdit": "Asetukset", + "name": "Laitteen nimi", + "auto": "(automaattinen)", + "ip": "IP-osoite", + "port": "Portti" + }, + "fileInfo": { + "title": "Tiedoston tiedot", + "fileName": "Tiedoston nimi:", + "path": "Polku:", + "size": "Koko:", + "sender": "Lähettäjä:", + "time": "Aika:" + }, + "fileNameInput": { + "title": "Anna tiedoston nimi", + "original": "Alkuperäinen: {original}" + }, + "historyClearDialog": { + "title": "Tyhjennä historia", + "content": "Haluatko varmasti poistaa koko historian?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend ei löydä muita laitteita ilman lupaa skannata paikallisverkkoa. Anna tämä lupa asetuksissa.", + "gotoSettings": "Asetukset" + }, + "messageInput": { + "title": "Kirjoita viesti", + "multiline": "Monirivinen" + }, + "noFiles": { + "title": "Ei tiedostoa valittuna", + "content": "Valitse vähintään yksi tiedosto." + }, + "noPermission": { + "title": "Ei oikeuksia", + "content": "Et ole myöntänyt tarvittavia oikeuksia. Myönnä ne asetuksissa." + }, + "notAvailableOnPlatform": { + "title": "Ei saatavilla", + "content": "Tämä ominaisuus on saatavilla vain:" + }, + "qr": { + "title": "QR-koodi" + }, + "quickActions": { + "title": "Pikatoiminnot", + "counter": "Laskuri", + "prefix": "Etuliite", + "padZero": "Täytä nollilla", + "sortBeforeCount": "Lajittele aakkosjärjestykseen ennen laskentaa", + "random": "Satunnainen" + }, + "quickSaveNotice": { + "title": "Pikatallennus", + "content": "Tiedostopyynnöt hyväksytään automaattisesti. Huomaa, että kuka tahansa paikallisverkossa voi lähettää sinulle tiedostoja." + }, + "quickSaveFromFavoritesNotice": { + "content": [ + "Tiedostopyynnöt hyväksytään nyt automaattisesti suosikkiluettelossasi olevilta laitteilta.", + "Varoitus! Tällä hetkellä tämä ei ole täysin turvallista, koska hakkeri, jolla on minkä tahansa suosikkiluettelosi laitteen sormenjälki, voi lähettää sinulle tiedostoja ilman rajoituksia.", + "Tämä vaihtoehto on kuitenkin turvallisempi kuin sallia kaikkien paikallisverkon käyttäjien lähettää sinulle tiedostoja ilman rajoituksia." + ], + "title": "@:general.quickSaveFromFavorites" + }, + "pin": { + "title": "Syötä PIN-koodi" + }, + "sendModeHelp": { + "title": "Lähetystilat", + "single": "Lähettää tiedostoja yhdelle vastaanottajalle. Valinta tyhjennetään tiedostonsiirron päätyttyä.", + "multiple": "Lähettää tiedostoja useille vastaanottajille. Valinta ei tyhjene.", + "link": "Vastaanottajat, joilla ei ole LocalSendia asennettuna, voivat ladata valitut tiedostot avaamalla linkin selaimessaan." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Tiedostonimi ei voi olla tyhjä", + "invalid": "Tiedostonimi sisältää kiellettyjä merkkejä" + }, + "tray": { + "@info": "Applen ohjeistukset ovat hyvin tiukat 'sulje'-sanan käytöstä.", + "open": "Avaa", + "close": "Lopeta LocalSend", + "closeWindows": "Poistu" + }, + "web": { + "waiting": "Odotetaan vastausta...", + "enterPin": "Syötä PIN-koodi", + "invalidPin": "Virheellinen PIN-koodi", + "tooManyAttempts": "Liian monta yritystä", + "rejected": "Hylätty", + "files": "Tiedostot", + "fileName": "Tiedoston nimi", + "size": "Koko" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "Vahvista", + "cancel": "Peruuta", + "edit": "Muokkaa", + "gifIndicator": "GIF", + "loadFailed": "Lataus epäonnistui", + "original": "Alkuperäinen", + "preview": "Esikatselu", + "select": "Valitse", + "emptyList": "Tyhjä lista", + "unSupportedAssetType": "Tiedostotyyppiä ei tueta.", + "unableToAccessAll": "Kaikkien tiedostojen käyttö laitteella ei onnistu", + "viewingLimitedAssetsTip": "Näytä vain sovelluksen käyttöön saatavilla olevat tiedostot ja albumit.", + "changeAccessibleLimitedAssets": "Päivitä käytettävissä olevat tiedostot napsauttamalla", + "accessAllTip": "Sovellus pääsee käsiksi vain osaan laitteen tiedostoista. Siirry järjestelmäasetuksiin ja salli sovelluksen pääsy kaikkiin laitteen mediaan.", + "goToSystemSettings": "Siirry järjestelmäasetuksiin", + "accessLimitedAssets": "Jatka rajoitetulla pääsyllä", + "accessiblePathName": "Käytettävissä olevat tiedostot", + "sTypeAudioLabel": "Ääni", + "sTypeImageLabel": "Kuva", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Muut mediat", + "sActionPlayHint": "toista", + "sActionPreviewHint": "esikatsele", + "sActionSelectHint": "valitse", + "sActionSwitchPathLabel": "vaihda polkua", + "sActionUseCameraHint": "käytä kameraa", + "sNameDurationLabel": "kesto", + "sUnitAssetCountLabel": "määrä" + }, + "networkInterfacesPage": { + "title": "Verkkokäyttöliittymät", + "info": "Oletuksena LocalSend käyttää kaikkia saatavilla olevia verkkoliitäntöjä. Voit sulkea pois verkkoliitännät, joita et halua. Sinun tulee uudelleenkäynnistää LocalSend ottaaksesi muutokset käyttöön.", + "preview": "Esikatselu", + "whitelist": "Sallittujen lista", + "blacklist": "Estettyjen lista" + } +} diff --git a/app/assets/i18n/fil-PH.json b/app/assets/i18n/fil-PH.json new file mode 100644 index 0000000..4dc506e --- /dev/null +++ b/app/assets/i18n/fil-PH.json @@ -0,0 +1,527 @@ +{ + "locale": "Filipino", + "appName": "LocalSend", + "general": { + "accept": "Tanggapin", + "accepted": "Tinanggap", + "add": "Magdagdag", + "advanced": "Advanced", + "cancel": "Kanselahin", + "close": "Isara", + "confirm": "Kumpirmahin", + "continueStr": "Magpatuloy", + "copy": "Kopyahin", + "copiedToClipboard": "Kopyahin sa Clipboard", + "decline": "Tanggihan", + "done": "Tapos Na", + "delete": "Tanggalin", + "edit": "Baguhin", + "error": "Error", + "example": "Halimbawa", + "files": "Files", + "finished": "Tapos Na", + "hide": "Itago", + "off": "Sarado", + "offline": "Offline", + "on": "Bukas", + "online": "Online", + "open": "Buksan", + "queue": "Pila", + "quickSave": "Quick Save", + "quickSaveFromFavorites": "I-save agad kapag galing sa \"Favorites\"", + "renamed": "Pinangalanan", + "reset": "Reset", + "restart": "Restart", + "settings": "Settings", + "skipped": "Nilaktawan", + "start": "Simulan", + "stop": "Ihinto", + "save": "Save", + "unchanged": "Walang Pagbabago", + "unknown": "Hindi Kilala", + "noItemInClipboard": "Walang Item sa Clipboard" + }, + "receiveTab": { + "title": "Tumanggap", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Alias:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Mga Paborito", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Magpadala", + "selection": { + "title": "Pagpipilian", + "files": "Mga File: {files}", + "size": "Size: {size}" + }, + "picker": { + "file": "File", + "folder": "Folder", + "media": "Media", + "text": "Text", + "app": "App", + "clipboard": "Paste" + }, + "shareIntentInfo": "Maaaring gamitin ang \"Share\" feature sa iyong mobile device para sa mas madaling pagpili ng mga file.", + "nearbyDevices": "Malalapit na mga device", + "thisDevice": "Ang Device na Ito", + "scan": "Maghanap ng mga device", + "manualSending": "Mano-manong pagpapadala", + "sendMode": "Send mode", + "sendModes": { + "single": "Isang tatanggap", + "multiple": "Maramihang tatanggap", + "link": "I-share gamit ang link" + }, + "sendModeHelp": "Paliwanag", + "help": "Mangyaring siguraduhin na ang target ay nasa parehas na wifi network.", + "placeItems": "Maglagay ng mga bagay na i-share." + }, + "settingsTab": { + "title": "Settings", + "general": { + "title": "General", + "brightness": "Tema", + "brightnessOptions": { + "system": "System", + "dark": "Madilim", + "light": "Maliwanag" + }, + "color": "Kulay", + "colorOptions": { + "system": "System", + "oled": "OLED" + }, + "language": "Wika", + "languageOptions": { + "system": "System" + }, + "saveWindowPlacement": "Quit: I-save ang window placement", + "saveWindowPlacementWindows": "I-save ang posisyon ng window pagkasara", + "minimizeToTray": "Quit: Paliitin sa Tray/Menu Bar", + "launchAtStartup": "I-autostart pagkatapos mag-login", + "launchMinimized": "Autostart: I-start nang nakatago", + "showInContextMenu": "Ipakita ang LocalSend sa context menu", + "animations": "Animations" + }, + "receive": { + "title": "Tumanggap", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Auto Finish", + "destination": "Patutunguhan", + "downloads": "(Downloads)", + "saveToGallery": "I-save ang media sa gallery", + "saveToHistory": "I-save sa history" + }, + "send": { + "title": "Ipasa", + "shareViaLinkAutoAccept": "Kusang tanggapin ang request sa \"Share via link\" mode" + }, + "network": { + "title": "Network", + "needRestart": "I-restart ang server para ma-apply ang settings!", + "server": "Server", + "alias": "Alias", + "deviceType": "Device type", + "deviceModel": "Device model", + "port": "Port", + "network": "Network", + "networkOptions": { + "all": "Lahat", + "filtered": "Na-filter" + }, + "discoveryTimeout": "Nag Timeout ang Discovery", + "useSystemName": "Gamitin ang pangalan ng system", + "generateRandomAlias": "Mag-generate ng random na alias", + "portWarning": "Maaaring hindi ka ma-detect ng ibang devices dahil ikaw ay gumagamit ng ibang port. (default: {defaultPort})", + "encryption": "Encryption", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Maaaring hindi ka ma-detect ng ibang devices dahil ikaw ay gumagamit ng ibang multicast address. (default: {defaultMulticast})" + }, + "other": { + "title": "Iba Pa", + "support": "Suportahan ang LocalSend", + "donate": "Mag-donate", + "privacyPolicy": "Patakaran sa Privacy", + "termsOfUse": "Mga Tuntunin sa Paggamit" + }, + "advancedSettings": "Advanced settings" + }, + "troubleshootPage": { + "title": "Troubleshoot", + "subTitle": "Hindi gumagana ang app na ito gaya nang inaasahan? Narito ang mga madalas na solusyon.", + "solution": "Solusyon:", + "fixButton": "Awtomatikong ayusin", + "firewall": { + "symptom": "Ang app na ito ay nakakapagpadala ng mga file sa ibang mga device ngunit ang ibang mga device ay hindi makapagpadala sa device na ito.", + "solution": "Ito ay kadalasang isyu sa firewall. Maaari mong maayos ito sa pamamagitan nang pag-allow ng mga incoming connections (UDP at TCP) sa port {port}.", + "openFirewall": "Buksan ang Firewall" + }, + "noDiscovery": { + "symptom": "Ang device na'to ay hindi maka-discover ng ibang devices.", + "solution": "Siguraduhing lahat ng device ay nasa same WI-FI network at i-share ang parehong configuration (port, multicast address, encryption). Pwedeng i-type manually ang IP address ng target device. Kung gumana, i-consider na i-dagdag ang device sa favorites upang automatic na ma discover sa susunod na paggamit." + }, + "noConnection": { + "symptom": "Ang dalawa o higit pang device ay hindi ma-discover ang isa't isa o hindi makapag-share ng mga file.", + "solution": "Ang problema ay nangyayari sa dalawang device? Mangyaring siguraduhin na ang dalawang device ay nasa parehas na wifi network at mayroong parehas na configuration (port, multicast address, encryption). Maaaring ang wifi ay hindi pinahihintulutan and komunikasyon sa pagitan nang mga participants. Sa ganitong pangyayari, ang option na ito ay dapat i-enable sa router." + } + }, + "networkInterfacesPage": { + "title": "Mga Interface ng Network", + "info": "Bilang default, ang LocalSend ay gumagamit ng lahat ng mga available na network interface. Maaari mong ibukod ang mga hindi mo gustong network dito. Kinakailangang i-restart ang server upang mai-apply ang mga pagbabago", + "preview": "Silipin", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + }, + "receiveHistoryPage": { + "title": "History", + "openFolder": "Buksan ang folder", + "deleteHistory": "Burahin ang history", + "empty": "Walang laman ang history.", + "entryActions": { + "open": "Buksan ang file", + "showInFolder": "Buksan sa folder", + "info": "Impormasyon", + "deleteFromHistory": "Burahin sa history" + } + }, + "apkPickerPage": { + "title": "Apps (APK)", + "excludeSystemApps": "Ibukod ang mga system app", + "excludeAppsWithoutLaunchIntent": "Ibukod and mga non-launchable app", + "apps": "{n} Apps" + }, + "selectedFilesPage": { + "deleteAll": "Burahin lahat" + }, + "receivePage": { + "subTitle": { + "one": "ay gustong magpadala sa iyo ng file", + "other": "ay gustong magpadala sa iyo ng {n} na mga file" + }, + "subTitleMessage": "ay nagpadala sa iyo ng mensahe:", + "subTitleLink": "ay nagpadala sa iyo ng link:", + "canceled": "Ang sender ay nagkansela ng request." + }, + "receiveOptionsPage": { + "title": "Options", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend folder)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Awtomatikong pinatay dahil mayroong mga directories." + }, + "sendPage": { + "waiting": "Naghihintay ng response...", + "rejected": "Tinanggihan ng recipient ang request.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Ang recipient ay abala pa sa ibang request." + }, + "progressPage": { + "titleSending": "Nagpapadala ng mga file", + "titleReceiving": "Tumatanggap ng mga file", + "savedToGallery": "Naka-save sa Photos", + "total": { + "title": { + "sending": "Kabuuang progreso ({time})", + "finishedError": "Natapos nang may error", + "canceledSender": "Kinansela ng sender", + "canceledReceiver": "Kinansela ng receiver" + }, + "count": "Files: {curr} / {n}", + "size": "Size: {curr} / {n}", + "speed": "Speed: {speed}/s" + } + }, + "webSharePage": { + "title": "I-share gamit ang link", + "loading": "Binubuksan ang server...", + "stopping": "Ihinihinto ang server...", + "error": "May nangyaring error habang binubuksan ang server.", + "openLink": { + "one": "Buksan ang link na ito sa browser:", + "other": "Buksan ang isa sa mga link na ito sa browser:" + }, + "requests": "Requests", + "noRequests": "Wala pang mga request.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Kusang I-accept ang request", + "requirePin": "I-require ang Pin", + "pinHint": "Ang Pin ay \"{pin}\"", + "encryptionHint": "Ang LocalSend ay gumagamit ng self-signed certificate. Kailangan mo itong i-accept sa browser.", + "pendingRequests": "Mga naka-pending na request: {n}" + }, + "aboutPage": { + "title": "Tungkol sa LocalSend", + "description": [ + "Ang LocalSend ay isang libre at open-source na app na nagbibigay-daan sa secure na pagbabahagi ng mga file at mga message sa mga kalapit na device sa iyong local network nang hindi nangangailangan ng koneksyon sa internet.", + "Available ang app na ito sa Android, iOS, macOS, Windows, at Linux. Maaari mong mahanap ang lahat ng mga pagpipilian sa pag-download sa opisyal na homepage." + ], + "author": "Author", + "contributors": "Mga Contributor", + "packagers": "Mga Packagers", + "translators": "Mga Translator" + }, + "donationPage": { + "title": "Mag-donate", + "info": "Ang LocalSend ay libre, open-source, at walang anumang mga ad. Kung iyong nagustuhan ang app, maaari mong suportahan ang development sa pamamagitan ng donasyon.", + "donate": "Mag-donate ng {amount}", + "thanks": "Maraming salamat!", + "restore": "Restore purchase" + }, + "changelogPage": { + "title": "Changelog" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Different locales may have different words, it may not match 1:1", + "adjectives": [ + "Adorable", + "Beautiful", + "Big", + "Bright", + "Clean", + "Clever", + "Cool", + "Cute", + "Cunning", + "Determined", + "Energetic", + "Efficient", + "Fantastic", + "Fast", + "Fine", + "Fresh", + "Good", + "Gorgeous", + "Great", + "Handsome", + "Hot", + "Kind", + "Lovely", + "Mystic", + "Neat", + "Nice", + "Patient", + "Pretty", + "Powerful", + "Rich", + "Secret", + "Smart", + "Solid", + "Special", + "Strategic", + "Strong", + "Tidy", + "Wise" + ], + "fruits": [ + "Apple", + "Avocado", + "Banana", + "Blackberry", + "Blueberry", + "Broccoli", + "Carrot", + "Cherry", + "Coconut", + "Grape", + "Lemon", + "Lettuce", + "Mango", + "Melon", + "Mushroom", + "Onion", + "Orange", + "Papaya", + "Peach", + "Pear", + "Pineapple", + "Potato", + "Pumpkin", + "Raspberry", + "Strawberry", + "Tomato" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "Idagdag sa selection", + "content": "Ano ang gusto mong idagdag?" + }, + "openFile": { + "title": "Buksan ang file", + "content": "Gusto mo bang buksan ang natanggap na file?" + }, + "addressInput": { + "title": "Ilagay ang address", + "hashtag": "Hashtag", + "ip": "IP Address", + "recentlyUsed": "Recently used: " + }, + "cancelSession": { + "title": "Kanselahin ang pagpapadala ng file", + "content": "Gusto mo ba talagang kanselahin ang pagpapadala ng file?" + }, + "cannotOpenFile": { + "title": "Hindi mabuksan ang file", + "content": "Hindi mabuksan ang \"{file}\". Ito ba ay nalipat, pinangalanan, o nabura?" + }, + "encryptionDisabledNotice": { + "title": "Ang encryption ay naka-disable", + "content": "Ang communication ngayon ay nangyayari gamit ang unencrypted HTTP protocol. Para gamitin ang HTTPS, muling i-enable ang encryption." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favorites", + "noFavorites": "Wala pang favorites sa mga device.", + "addFavorite": "Magdagdag" + }, + "favoriteDeleteDialog": { + "title": "Burahin sa favorites", + "content": "Gusto mo ba talagang burahin ang favorites \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Idagdag sa favorites", + "titleEdit": "Adjust", + "name": "Alias", + "auto": "(auto)", + "ip": "IP Address", + "port": "Port" + }, + "fileInfo": { + "title": "Impormasyon sa file", + "fileName": "Pangalan ng file:", + "path": "Lokasyon:", + "size": "Size:", + "sender": "Sender:", + "time": "Time:" + }, + "fileNameInput": { + "title": "Ilagay ang pangalan ng file", + "original": "Orihinal: {original}" + }, + "historyClearDialog": { + "title": "Burahin ang history", + "content": "Gusto mo ba talagang burahin ang buong history?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "Hindi makikita ng LocalSend ang ibang devices hangga't hindi nabibigyan ng permission para mag-scan sa lokal na network. Mangyaring bigyan ito ng permission sa settings.", + "gotoSettings": "Settings" + }, + "messageInput": { + "title": "I-type ang message", + "multiline": "Multiline" + }, + "noFiles": { + "title": "Walang file na pinli", + "content": "Mangyaring pumili nang kahit isang file." + }, + "noPermission": { + "title": "Walang permission", + "content": "Hindi nabigyan ng mga kinakailangang permissions. Mangyaring bigyan ito ng permission sa settings." + }, + "notAvailableOnPlatform": { + "title": "Hindi available", + "content": "Ang feature na ito ay available lamang sa:" + }, + "qr": { + "title": "QR Code" + }, + "quickActions": { + "title": "Quick Actions", + "counter": "Counter", + "prefix": "Prefix", + "padZero": "Pad with zeros", + "sortBeforeCount": "Pagsunud-sunurin ayon sa alpabeto", + "random": "Random" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Ang mga file request ay awtomatikong tinatanggap. Mabatid lamang na ang lahat ng nasa lokal na network ay maaaring magpadala sa iyo ng mga file." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Ang mga file request ngayon ay awtomatikong tinatanggap sa mga device sa iyong listahan ng mga paborito.", + "Babala: Ito ay kasalukuyang hindi ganap na secure dahil ang isang hacker na alam ang fingerprint ng iyong mga paboritong device ay maaari pa ring magpadala sa iyo ng mga file.", + "Gayunpaman, ang opsyon na ito ay mas secure kaysa sa pag-allow sa anumang device." + ] + }, + "pin": { + "title": "Ilagay ang PIN" + }, + "sendModeHelp": { + "title": "Send modes", + "single": "Magpadala ng mga file sa iisang recipient o tatanggap. Ang mga pagpipilian ay maaalis pagkatapos ipadala ang file.", + "multiple": "Magpadala ng mga file sa maraming recipient o tatanggap. Ang mga pagpipilian ay hindi maaalis.", + "link": "Ang mga recipient o tatanggap na walang nakainstall na LocalSend ay maaaring mag download nang mga napiling file sa pamamagitan ng pagbukas ng link sa kanilang browser." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Ang Filename ay hindi maaaring walang laman", + "invalid": "Ang Filename ay naglalaman ng hindi suportado na characters" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "Isara ang LocalSend", + "closeWindows": "Isara" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Ilagay ang PIN", + "invalidPin": "Ang PIN ay invalid", + "tooManyAttempts": "Marami nang pagsubok", + "rejected": "Hindi Tinanggap", + "files": "Files", + "fileName": "Pangalan ng file", + "size": "Size" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "Kumpirmahin", + "cancel": "Kanselahin", + "edit": "Baguhin", + "gifIndicator": "GIF", + "loadFailed": "Load failed", + "original": "Pinagmulan", + "preview": "Silipin", + "select": "Piliin", + "emptyList": "Walang lamang listahan", + "unSupportedAssetType": "Hindi suportadong file type.", + "unableToAccessAll": "Hindi ma-access ang lahat ng mga file sa device", + "viewingLimitedAssetsTip": "Makikita lamang ang mga file at mga album na accessible sa app", + "changeAccessibleLimitedAssets": "I-click para i-update ang accessible na mga file", + "accessAllTip": "Ang app na ito ay kaya lamang mag-access ng iilang mga file sa device. Magtungo sa system settings at i-allow ang app para ma-access ang lahat ng media sa device.", + "goToSystemSettings": "Magpunta sa system settings", + "accessLimitedAssets": "Ituloy nang limitadong access", + "accessiblePathName": "Accessible na mga file", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Image", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Iba pang media", + "sActionPlayHint": "play", + "sActionPreviewHint": "silipin", + "sActionSelectHint": "piliin", + "sActionSwitchPathLabel": "baguhin ang lokasyon", + "sActionUseCameraHint": "gamiting ang camera", + "sNameDurationLabel": "duration", + "sUnitAssetCountLabel": "count" + } +} diff --git a/app/assets/i18n/fr.json b/app/assets/i18n/fr.json new file mode 100644 index 0000000..1e5ab55 --- /dev/null +++ b/app/assets/i18n/fr.json @@ -0,0 +1,465 @@ +{ + "locale": "Français", + "appName": "LocalSend", + "general": { + "accept": "Accepter", + "accepted": "Accepté", + "add": "Ajouter", + "advanced": "Avancé", + "cancel": "Annuler", + "close": "Fermer", + "confirm": "Confirmer", + "continueStr": "Continuer", + "copy": "Copier", + "copiedToClipboard": "Copié dans le presse-papiers", + "decline": "Refuser", + "done": "Terminé", + "delete": "Supprimer", + "edit": "Modifier", + "error": "Erreur", + "example": "Exemple", + "files": "Fichiers", + "finished": "Terminé", + "hide": "Masquer", + "off": "Désactivé", + "offline": "Hors ligne", + "on": "Activé", + "online": "En ligne", + "open": "Ouvrir", + "queue": "File d'attente", + "quickSave": "Sauvegarde rapide", + "quickSaveFromFavorites": "Sauvegarde rapide des favoris", + "renamed": "Renommé", + "reset": "Annuler les changements", + "restart": "Redémarrer", + "settings": "Paramètres", + "skipped": "Ignoré", + "start": "Démarrer", + "stop": "Arrêter", + "save": "Sauvegarder", + "unchanged": "Inchangé", + "unknown": "Inconnu", + "noItemInClipboard": "Aucun élément dans le presse-papiers." + }, + "receiveTab": { + "title": "Recevoir", + "infoBox": { + "ip": "IP :", + "port": "Port :", + "alias": "Nom du périphérique :" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favoris", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Envoyer", + "selection": { + "title": "Sélection", + "files": "Fichiers : {files}", + "size": "Taille : {size}" + }, + "picker": { + "file": "Fichier", + "folder": "Dossier", + "media": "Média", + "text": "Texte", + "app": "Application", + "clipboard": "Presse-papiers" + }, + "shareIntentInfo": "Vous pouvez également utiliser la fonction \"Partager\" de votre appareil pour sélectionner des fichiers plus facilement.", + "nearbyDevices": "Appareils à proximité", + "thisDevice": "Cet Appareil", + "scan": "Recherche automatique", + "manualSending": "Recherche manuelle", + "sendMode": "Mode d'envoi", + "sendModes": { + "single": "Destinataire unique", + "multiple": "Destinataires multiples", + "link": "Partager via un lien" + }, + "sendModeHelp": "Explication", + "help": "Veuillez vous assurer que l'appareil cible se trouve sur le même réseau Wi-Fi.", + "placeItems": "Placez des éléments à partager." + }, + "settingsTab": { + "title": "Paramètres", + "general": { + "title": "Général", + "brightness": "Thème", + "brightnessOptions": { + "system": "Système", + "dark": "Sombre", + "light": "Clair" + }, + "color": "Couleur", + "colorOptions": { + "system": "Système", + "oled": "OLED" + }, + "language": "Langue", + "languageOptions": { + "system": "Système" + }, + "saveWindowPlacement": "Sauvegarder l'emplacement de la fenêtre à la fermeture", + "saveWindowPlacementWindows": "Sauvegarder la position de la fenêtre en quittant", + "minimizeToTray": "Réduire dans la barre des tâches à la fermeture", + "launchAtStartup": "Lancer LocalSend à la connexion de l'utilisateur", + "launchMinimized": "Minimiser LocalSend lors du lancement", + "showInContextMenu": "Afficher LocalSend dans le menu contextuel", + "animations": "Animations" + }, + "receive": { + "title": "Réception", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Fermer la page du transfert lorqu'il est terminé", + "destination": "Destination", + "downloads": "(Téléchargements)", + "saveToGallery": "Sauvegarder les médias dans la galerie", + "saveToHistory": "Activer l'historique" + }, + "send": { + "title": "Envoyer", + "shareViaLinkAutoAccept": "Accepter automatiquement les demandes de téléchargement d'un partage par lien" + }, + "network": { + "title": "Réseau", + "needRestart": "Redémarrez le serveur pour appliquer les paramètres !", + "server": "Serveur", + "alias": "Alias", + "deviceType": "Type d'appareil", + "deviceModel": "Modèle d'appareil", + "port": "Port", + "discoveryTimeout": "Délai d'expiration de la recherche", + "useSystemName": "Utiliser le nom du système", + "generateRandomAlias": "Générer un alias aléatoire", + "portWarning": "Il se peut que vous ne soyez pas détecté par d'autres appareils car vous utilisez un port personnalisé. (par défaut : {defaultPort})", + "encryption": "Chiffrement", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Il est possible que vous ne soyez pas détecté par d'autres appareils car vous utilisez une adresse multicast différente de celle par défaut. (par défaut : {defaultMulticast})", + "network": "Réseau", + "networkOptions": { + "filtered": "Filtré", + "all": "Tout" + } + }, + "other": { + "title": "Autre", + "support": "Soutenir LocalSend", + "donate": "Faire une donation", + "privacyPolicy": "Politique de confidentialité", + "termsOfUse": "Conditions d'utilisation" + }, + "advancedSettings": "Paramètres avancés" + }, + "troubleshootPage": { + "title": "Dépannage", + "subTitle": "Cette application ne fonctionne pas comme vous l'espérez ? Vous trouverez ici des solutions aux problèmes communs.", + "solution": "Solution :", + "fixButton": "Corriger automatiquement", + "firewall": { + "symptom": "Cet appareil peut envoyer des fichiers mais pas en recevoir.", + "solution": "Il se peut que votre pare-feu bloque la réception de fichiers. Pour corriger ce problème, il est nécessaire d'autoriser les connections entrantes (UDP et TCP) sur le port {port}.", + "openFirewall": "Ouvrir le pare-feu" + }, + "noDiscovery": { + "symptom": "Cet appareil ne peut pas trouver d'autres appareils.", + "solution": "Assurez-vous que tous les appareils soient sur le même réseau Wi-Fi et qu'ils partagent la même configuration (port, adresse multicast, chiffrement). Vous pouvez également rechercher manuellement d'autres appareils en utilisant leur addresse IP. Pensez à ajouter l'appareil à vos favoris pour faciliter les prochains transferts de fichiers." + }, + "noConnection": { + "symptom": "Les deux appareils ne peuvent ni se trouver, ni partager des fichiers.", + "solution": "Le problème existe-il des deux côtés ? Si oui, vérifiez que les deux appareils soient connectés au même réseau Wi-Fi et qu'ils partagent la même configuration (port, adresse multicast, chiffrement). Il se peut que les appareils soient isolés les uns des autres, empêchant toutes communications entre eux. Cet isolement peut être désactivé dans votre routeur/box internet via l'option \"Isolement du point d'accès\" ou \"AP Isolation\"." + } + }, + "receiveHistoryPage": { + "title": "Historique", + "openFolder": "Ouvrir le dossier", + "deleteHistory": "Supprimer l'historique", + "empty": "L'historique est vide.", + "entryActions": { + "open": "Ouvrir le fichier", + "showInFolder": "Ouvrir le dossier", + "info": "Information", + "deleteFromHistory": "Supprimer de l'historique" + } + }, + "apkPickerPage": { + "title": "Application (APK)", + "excludeSystemApps": "Exclure les applications système", + "excludeAppsWithoutLaunchIntent": "Exclure les applications non-lançables", + "apps": "{n} Applications" + }, + "selectedFilesPage": { + "deleteAll": "Tout supprimer" + }, + "receivePage": { + "subTitle": { + "one": "veut vous envoyer un fichier", + "other": "veut vous envoyer {n} fichiers" + }, + "subTitleMessage": "vous a envoyé un message :", + "subTitleLink": "vous a envoyé un lien :", + "canceled": "L'expéditeur a annulé la demande." + }, + "receiveOptionsPage": { + "title": "Options", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(dossier LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Désactivé automatiquement car des dossiers sont présents." + }, + "sendPage": { + "waiting": "En attente d'une réponse …", + "rejected": "Le destinataire a rejeté la demande.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Le destinataire ne peut pas traiter la requête actuelle. Veuillez réessayer ultérieument." + }, + "progressPage": { + "titleSending": "Envoi de fichiers", + "titleReceiving": "Réception des fichiers", + "savedToGallery": "Sauvegardé dans la Galerie", + "total": { + "title": { + "sending": "Progression totale ({time})", + "finishedError": "Terminé avec une erreur", + "canceledSender": "Annulé par l'expéditeur", + "canceledReceiver": "Annulé par le destinataire" + }, + "count": "Fichiers : {curr} / {n}", + "size": "Taille : {curr} / {n}", + "speed": "Vitesse : {speed}/s" + }, + "remainingTime": { + "@hours": "Utilisez « h » pour l'abréviation des heures et « m » pour les minutes", + "@days": "Utilisez « j » pour les jours, « h » pour les heures et « m » pour les minutes", + "seconds": "{n}:{ss}", + "minutes": "{n} :{ss}", + "hours": "{h}h {m}min", + "days": "{d}j {h}h {m}min" + } + }, + "webSharePage": { + "title": "Partager via un lien", + "loading": "Démarrage du serveur …", + "stopping": "Arrêt du serveur …", + "error": "Une erreur est survenue lors du démarrage du serveur.", + "openLink": { + "one": "Ouvrir ce lien dans le navigateur :", + "other": "Ouvrir un des liens suivants dans le navigateur :" + }, + "requests": "Requêtes", + "noRequests": "Aucune requête en attente.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Accepter automatiquement les requêtes", + "requirePin": "Code PIN requis", + "pinHint": "Le code PIN est \"{pin}\"", + "encryptionHint": "LocalSend utilise un certificat auto-signé. Vous devez l'accepter dans le navigateur.", + "pendingRequests": "Requêtes en attente : {n}" + }, + "aboutPage": { + "title": "À propos de LocalSend", + "description": [ + "Localsend est un logiciel gratuit et open-source qui vous permet de partager de manière sécurisée des fichiers et des messages avec d'autres appareils connectés à votre réseau local. Une connexion à internet n'est pas requise.", + "Localsend est disponible sur Android, iOS, macOS, Windows et Linux. Vous pouvez accéder à ces téléchargements depuis la page officielle." + ], + "author": "Auteur", + "contributors": "Contributeurs", + "packagers": "Distributeurs", + "translators": "Traducteurs" + }, + "donationPage": { + "title": "Faire une donation", + "info": "LocalSend est gratuit, open-source et sans aucune pub. Si vous aimez ce logiciel, vous pouvez faire un don pour soutenir son développement.", + "donate": "Donner {amount}", + "thanks": "Merci beaucoup !", + "restore": "Restaurer les achats" + }, + "changelogPage": { + "title": "Historique des mises à jour" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "Ajouter à la sélection", + "content": "Que voulez-vous ajouter ?" + }, + "openFile": { + "title": "Ouvrir le fichier", + "content": "Voulez-vous ouvrir le fichier reçu ?" + }, + "addressInput": { + "title": "Entrez l'adresse IP", + "hashtag": "Hashtag", + "ip": "Adresse IP", + "recentlyUsed": "Récemment utilisé : " + }, + "cancelSession": { + "title": "Annuler le transfert de fichiers", + "content": "Voulez-vous vraiment annuler le transfert de fichiers ?" + }, + "cannotOpenFile": { + "title": "Ne peut pas ouvrir le fichier", + "content": "Ne peut pas ouvrir \"{file}\". Ce fichier a-t-il été déplacé, renommé ou supprimé ?" + }, + "encryptionDisabledNotice": { + "title": "Chiffrement désactivé", + "content": "La communication s'effectue désormais via le protocole non chiffré HTTP. Pour utiliser HTTPS, réactivez le chiffrement." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favoris", + "noFavorites": "Aucun appareil favori pour le moment.", + "addFavorite": "Ajouter" + }, + "favoriteDeleteDialog": { + "title": "Supprimer des favoris", + "content": "Voulez-vous vraiment supprimer \"{name}\" des favoris ?" + }, + "favoriteEditDialog": { + "titleAdd": "Ajouter aux favoris", + "titleEdit": "Modifier le favori", + "name": "Alias", + "auto": "(automatique)", + "ip": "Adresse IP", + "port": "Port" + }, + "fileInfo": { + "title": "Informations sur le fichier", + "fileName": "Nom du fichier :", + "path": "Chemin :", + "size": "Taille :", + "sender": "Expéditeur :", + "time": "Date :" + }, + "fileNameInput": { + "title": "Entrez le nom du fichier", + "original": "Original : {original}" + }, + "historyClearDialog": { + "title": "Effacer l'historique", + "content": "Voulez-vous vraiment effacer l'historique ?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend ne peut pas trouver d'autres appareils sans la permission de scanner votre réseau local. Veuillez donner cette permission à LocalSend dans les paramètres système.", + "gotoSettings": "Paramètres" + }, + "messageInput": { + "title": "Tapez un message", + "multiline": "Multiligne" + }, + "noFiles": { + "title": "Aucun fichier sélectionné", + "content": "Veuillez sélectionner au moins un fichier." + }, + "noPermission": { + "title": "LocalSend n'a pas la permission", + "content": "Vous n'avez pas accordé les autorisations nécessaires. Veuillez les accorder dans les paramètres systèmes." + }, + "notAvailableOnPlatform": { + "title": "Non disponible", + "content": "Cette fonctionnalité est disponible uniquement sur :" + }, + "qr": { + "title": "QR Code" + }, + "quickActions": { + "title": "Actions Rapides", + "counter": "Compteur", + "prefix": "Préfixe", + "padZero": "Remplir de zéros", + "sortBeforeCount": "Trier préalablement par ordre alphabétique", + "random": "Aléatoire" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Les demandes d'envoi de fichiers sont désormais automatiquement acceptées. Veuillez noter que tous les appareils connectés au réseau local pourront vous envoyer des fichiers." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Les demandes de fichiers provenant de vos appareils favoris sont désormais automatiquement acceptées.", + "Attention : Cette option n'est pas sûre car un hackeur qui connaîtrait l'empreinte numérique de vos appareils favoris pourrait quand même vous envoyer des fichiers.", + "Cette option reste néanmoins plus sûre que d'autoriser tous les appareils." + ] + }, + "pin": { + "title": "Entrez le code PIN" + }, + "sendModeHelp": { + "title": "Modes d'envoi", + "single": "Envoyer des fichiers à un destinataire. La sélection sera effacée une fois l'envoi du fichier terminé.", + "multiple": "Envoyer des fichiers à plusieurs destinataires. La sélection ne sera pas effacée.", + "link": "Les destinataires n'ayant pas LocalSend installé peuvent télécharger les fichiers sélectionnés en ouvrant le lien dans leur navigateur." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Le nom du fichier ne peut pas être vide", + "invalid": "Le nom du fichier contient des caractères non valides" + }, + "tray": { + "@info": "Les directives d'Apple sont très strictes en ce qui concerne le terme \"fermer\".", + "open": "@:general.open", + "close": "Quitter LocalSend", + "closeWindows": "Fermer" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Entrez le code PIN", + "invalidPin": "Code PIN invalide", + "tooManyAttempts": "Trop d'essais infructueux", + "rejected": "Rejeté", + "files": "Fichiers", + "fileName": "Nom du fichier", + "size": "Taille" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "OK", + "cancel": "Annuler", + "edit": "Modifier", + "gifIndicator": "GIF", + "loadFailed": "Echec du chargement", + "original": "Original", + "preview": "Aperçu", + "select": "Choisir", + "emptyList": "Liste vide", + "unSupportedAssetType": "Type de fichier non supporté.", + "unableToAccessAll": "Impossible d'accéder aux médias de votre appareil", + "viewingLimitedAssetsTip": "Affichage limité des médias et des albums.", + "changeAccessibleLimitedAssets": "Modifier l'accès limité aux médias", + "accessAllTip": "L'application ne peut accéder qu'à certains medias. Allez dans les paramètres système et autorisez l'application à accéder à tous les medias sur l'appareil.", + "goToSystemSettings": "Allez dans les paramètres système", + "accessLimitedAssets": "Continuer avec un accès limité", + "accessiblePathName": "Medias accessible", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Image", + "sTypeVideoLabel": "Vidéo", + "sTypeOtherLabel": "Autre", + "sActionPlayHint": "lire", + "sActionPreviewHint": "aperçu", + "sActionSelectHint": "choisir", + "sActionSwitchPathLabel": "changer le dossier", + "sActionUseCameraHint": "Utiliser la Caméra", + "sNameDurationLabel": "durée", + "sUnitAssetCountLabel": "quantité" + }, + "networkInterfacesPage": { + "title": "Interfaces réseau", + "info": "Par défaut, LocalSend utilise toutes les interfaces réseau disponibles. Vous pouvez exclure les réseaux indésirables ici. Vous aurez besoin de redémarrer le serveur pour appliquer les changements.", + "preview": "Aperçu", + "whitelist": "Liste blanche", + "blacklist": "Liste noire" + } +} diff --git a/app/assets/i18n/gl.json b/app/assets/i18n/gl.json new file mode 100644 index 0000000..50ac114 --- /dev/null +++ b/app/assets/i18n/gl.json @@ -0,0 +1,465 @@ +{ + "locale": "Galego", + "appName": "LocalSend", + "general": { + "accept": "Aceptar", + "accepted": "Aceptado", + "add": "Engadir", + "advanced": "Avanzado", + "cancel": "Cancelar", + "close": "Pechar", + "confirm": "Confirmar", + "continueStr": "Continuar", + "copy": "Copiar", + "copiedToClipboard": "Copiouse no Portapapeis", + "decline": "Declinar", + "done": "Feito", + "delete": "Eliminar", + "edit": "Editar", + "error": "Erro", + "example": "Exemplo", + "files": "Arquivos", + "finished": "Rematou", + "hide": "Ocultar", + "off": "Apagado", + "offline": "Sen Conexión", + "on": "Activado", + "online": "En Liña", + "open": "Aberto", + "queue": "Fila", + "quickSave": "Gardar Rápido", + "quickSaveFromFavorites": "Gardar rápido para \"Favoritos\"", + "renamed": "Renomeado", + "reset": "Desfacer os cambios", + "restart": "Reiniciar", + "settings": "Configuración", + "skipped": "Omitido", + "start": "Comeza", + "stop": "Parar", + "save": "Gardar", + "unchanged": "Sen Cambios", + "unknown": "Descoñecido", + "noItemInClipboard": "Non hai elementos no Portapapeis." + }, + "receiveTab": { + "title": "Recibir", + "infoBox": { + "ip": "IP:", + "port": "Porto:", + "alias": "Nome do Dispositivo:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favoritos", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Enviar", + "selection": { + "title": "Selección", + "files": "Ficheiros: {files}", + "size": "Tamaño: {size}" + }, + "picker": { + "file": "Arquivo", + "folder": "Cartafol", + "media": "Medios", + "text": "Texto", + "app": "App", + "clipboard": "Pegar" + }, + "shareIntentInfo": "Tamén podes usar a función \"Compartir\" do teu dispositivo móbil para seleccionar ficheiros máis facilmente.", + "nearbyDevices": "Dispositivos Próximos", + "thisDevice": "Este Dispositivo", + "scan": "Busca Dispositivos", + "manualSending": "Envío Manual", + "sendMode": "Modo de Envío", + "sendModes": { + "single": "Destinatario Único", + "multiple": "Múltiples Destinatarios", + "link": "Comparte via ligazón" + }, + "sendModeHelp": "Explicación", + "help": "Asegúrate de que o obxectivo desexado tamén estea na mesma rede wifi.", + "placeItems": "Coloca elementos para compartir." + }, + "settingsTab": { + "title": "Configuración", + "general": { + "title": "Xeral", + "brightness": "Tema", + "brightnessOptions": { + "system": "Sistema", + "dark": "Escuro", + "light": "Luz" + }, + "color": "Cor", + "colorOptions": { + "system": "Sistema", + "oled": "OLED" + }, + "language": "Linguaxe", + "languageOptions": { + "system": "Sistema" + }, + "saveWindowPlacement": "Garda a posición da xanela despois de saír", + "saveWindowPlacementWindows": "Garda a posición da xanela despois da saída", + "minimizeToTray": "Minimizar á Bandexa do Sistema/Barra de Menú ao Pechar", + "launchAtStartup": "Arrancar automáticamente despois do inicio de sesión", + "launchMinimized": "Arranque automático: Iniciar minimizada", + "showInContextMenu": "Amosar LocalSend no menú contextual", + "animations": "Animacións" + }, + "receive": { + "title": "Recibir", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Finalizar automáticamente", + "destination": "Gardar no cartafol", + "downloads": "(Descargas)", + "saveToGallery": "Gardar multimedia na galería", + "saveToHistory": "Gardar no historial" + }, + "network": { + "deviceType": "Tipo de dispositivo", + "title": "Rede", + "needRestart": "Reinicia o servidor para aplicar os axustes!", + "server": "Servidor", + "alias": "Nome do dispositivo", + "deviceModel": "Modelo de dispositivo", + "port": "Porto", + "discoveryTimeout": "Tempo límite de Descubrimento", + "multicastGroup": "Enderezo multicast", + "network": "Rede", + "networkOptions": { + "all": "Todo", + "filtered": "Filtrado" + }, + "encryption": "Cifrado", + "useSystemName": "Usar o nome do sistema", + "generateRandomAlias": "Xerar alias aleatorio", + "portWarning": "Pode que non sexas detectado por outros dispositivos porque estás a empregar un porto personalizado. (Porto por defecto: {defaultPort})", + "multicastGroupWarning": "Pode que non sexas detectado por outros dispositivos porque estás a empregar un enderezo multicast personalizada. (Por defecto: {defaultMulticast})" + }, + "send": { + "title": "Enviar", + "shareViaLinkAutoAccept": "Aceptar automáticamente peticións no modo \"Compartir mediante ligazón\"" + }, + "other": { + "title": "Outros", + "support": "Apoia a LocalSend", + "donate": "Doar", + "privacyPolicy": "Política de privacidade", + "termsOfUse": "Condicións de uso" + }, + "advancedSettings": "Configuración avanzada" + }, + "troubleshootPage": { + "noDiscovery": { + "solution": "Por favor asegúrese de que todos os dispositivos están na mesma rede Wi-Fi e que co partan a mesma configuración (porto, enderezo multicast, cifrado). Podes tentar escribir o enderezo IP do dispositivo de destino manualmente. Se funciona, considera agregar o dispositivo a favoritos para poder descubrilo automaticamente no futuro.", + "symptom": "Este dispositivo non pode descubrir outros dispositivos." + }, + "firewall": { + "solution": "O máis probábel é que se trate dun problema do firewall. Podes resolver este problema permitindo conexións entrantes (UDP e TCP) no porto {port}.", + "openFirewall": "Abrir Firewall", + "symptom": "Este dispositivo pode enviar ficheiros a outros dispositivos, pero outros dispositivos non lle poden enviar ficheiros." + }, + "noConnection": { + "symptom": "Ambos dispositivos non poden descubrirse nin enviarse ficheiros.", + "solution": "O problema existe nos dous lados? Se é así, cómpre asegurarse de que ambos os dispositivos están na mesma rede Wi-Fi e comparten a mesma configuración (porto, enderezo de multidifusión, cifrado). É posíbel que a rede wifi non permita a comunicación entre os participantes debido ao illamento do punto de acceso (AP). Neste caso, esta opción debe estar desactivada no router." + }, + "title": "Solucionar problemas", + "subTitle": "A aplicación non funciona segundo o esperado? Aquó podes atopar algunhas solucións comúns aos problemas.", + "solution": "Solución:", + "fixButton": "Corrixir automáticamente" + }, + "apkPickerPage": { + "title": "Aplicacións (APK)", + "excludeSystemApps": "Excluír aplicacións do sistema", + "excludeAppsWithoutLaunchIntent": "Excluír aplicacións non executábels", + "apps": "{n} Aplicacións" + }, + "networkInterfacesPage": { + "preview": "Vista previa", + "title": "Interfaces de rede", + "whitelist": "Lista de permitidos", + "blacklist": "Lista negra", + "info": "Por defecto, LocalSend emprega todas as interfaces de rede dispoñíbeis. Eiquí podes desactivar as redes non desexadas. Tes que reiniciar o servidor para aplicar os cambios." + }, + "receiveHistoryPage": { + "title": "Historial", + "empty": "O historial está vacío.", + "openFolder": "Abrir cartafol", + "deleteHistory": "Borrar historial", + "entryActions": { + "info": "Información", + "open": "Abrir ficheiro", + "showInFolder": "Amosar no cartafol", + "deleteFromHistory": "Borrar do historial" + } + }, + "selectedFilesPage": { + "deleteAll": "Eliminar todo" + }, + "receivePage": { + "subTitle": { + "one": "quere enviarte un ficheiro", + "other": "quere enviarte {n} ficheiros" + }, + "subTitleMessage": "envioute unha mensaxe:", + "subTitleLink": "envioute unha ligazón:", + "canceled": "O remitente cancelou a petición." + }, + "receiveOptionsPage": { + "title": "Opcións", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(Cartafol Localsend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Desactivado automáticamente porque hai cartafois." + }, + "dialogs": { + "encryptionDisabledNotice": { + "title": "Cifrado deshabilitado", + "content": "A comunicación ten lugar agora mediante o protocolo sen cifrado HTTP. Para usar o protocolo HTTPS, habilite novamente o cifrado." + }, + "openFile": { + "title": "Abrir ficheiro", + "content": "Queres abrir o ficheiro recibido?" + }, + "addressInput": { + "title": "Introduce enderezo", + "ip": "Enderezo IP", + "recentlyUsed": "Empregados recentemente: ", + "hashtag": "Etiqueta" + }, + "addFile": { + "content": "Que queres engadir?", + "title": "Engadir á selección" + }, + "cancelSession": { + "title": "Cancelar a transferencia de ficheiros", + "content": "Realmente queres cancelar a transferencia de ficheiros?" + }, + "cannotOpenFile": { + "content": "Non se puido abrir \"{file}\". Moveuse, renomeouse ou eliminouse este ficheiro?", + "title": "Non se pode abrir o ficheiro" + }, + "favoriteDialog": { + "title": "Favoritos", + "noFavorites": "Aínda non hai ningún dispositivo favorito.", + "addFavorite": "Engadir" + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDeleteDialog": { + "title": "Eliminar de favoritos", + "content": "Realmente queres eliminar dos favoritos \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Engadir a favoritos", + "titleEdit": "Axustes", + "name": "Nome do dispositivo", + "auto": "(auto)", + "ip": "Enderezo IP", + "port": "Porto" + }, + "fileInfo": { + "time": "Hora:", + "title": "Información do ficheiro", + "fileName": "Nome do ficheiro:", + "path": "Ruta:", + "size": "Tamaño:", + "sender": "Remitente:" + }, + "fileNameInput": { + "title": "Introduce o nome do ficheiro", + "original": "Orixinal: {original}" + }, + "historyClearDialog": { + "title": "Limpar historial", + "content": "Realmente queres eliminar todo o historial?" + }, + "noPermission": { + "content": "Non concedeches os permisos necesarios. Por favor, concédeos na configuración.", + "title": "Sen permiso" + }, + "noFiles": { + "content": "Por favor selecciona polo menos un ficheiro.", + "title": "Non se seleccionaron ficheiros" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend non pode atopar outros dispositivos sen ter permiso para escanear a rede local. Por favor, concede este permiso na configuración.", + "gotoSettings": "Axustes" + }, + "messageInput": { + "title": "Escribir mensaxe", + "multiline": "Multiliña" + }, + "notAvailableOnPlatform": { + "title": "Non dispoñíbel", + "content": "Esta característica só está dispoñíbel en:" + }, + "qr": { + "title": "Código QR" + }, + "quickActions": { + "title": "Accións rápidas", + "counter": "Contador", + "prefix": "Prefixo", + "padZero": "Encher con ceros", + "sortBeforeCount": "Ordenar alfabéticamente de antemán (A-Z)", + "random": "Aleatorio" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Agora as solicitudes de ficheiros acéptanse automaticamente. Teña en conta que todos os usuarios da rede local poden enviarche ficheiros." + }, + "zoom": { + "title": "URL" + }, + "pin": { + "title": "Insira o PIN" + }, + "sendModeHelp": { + "title": "Modos de envío", + "single": "Envia ficheiros a un receptor. A selección borrarase unha vez rematada a transferencia de ficheiros.", + "multiple": "Envia ficheiros a múltiples receptores. A selección non se borrará unha vez rematada a transferencia de ficheiros.", + "link": "Os destinatarios que non teñan instalado LocalSend poden descargar os ficheiros seleccionados abrindo a ligazón no seu navegador." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Agora as solicitudes de ficheiros da túa lista de dispositivos favoritos acéptanse automaticamente.", + "Aviso! Actualmente isto non é completamente seguro, xa que un hacker que teña a pegada dixital de calquera dos dispositivos da túa lista de favoritos pode enviarte ficheiros sen restriccións.", + "Porén, esta opción aínda é máis segura que permitir que todos os usuarios da rede local te envíen ficheiros sen restricións." + ] + } + }, + "webSharePage": { + "encryption": "@:settingsTab.network.encryption", + "encryptionHint": "LocalSend precisa un certificado autoasinado. Tes que aceptalo no teu navegador.", + "title": "Compartir mediante ligazón", + "stopping": "Parando o servidor…", + "loading": "Iniciando servidor…", + "error": "Produciuse un erro ao iniciar o servidor.", + "openLink": { + "one": "Abre esta ligazón no teu navegador:", + "other": "Abre unha destas ligazóns no teu navegador:" + }, + "requests": "Solicitudes", + "noRequests": "Aínda non hai solicitudes.", + "autoAccept": "Aceptar solicitudes automaticamente", + "requirePin": "Requerir PIN", + "pinHint": "O PIN é \"{pin}\"", + "pendingRequests": "Solicitudes pendentes: {n}" + }, + "progressPage": { + "total": { + "title": { + "canceledReceiver": "Cancelado polo receptor", + "sending": "Progreso total ({time})", + "finishedError": "Rematado con erro", + "canceledSender": "Cancelado polo remitente" + }, + "count": "Ficheiros: {curr} / {n}", + "size": "Tamaño: {curr} / {n}", + "speed": "Velocidade: {speed}/s" + }, + "titleReceiving": "Recibindo ficheiros", + "savedToGallery": "Gardado en Fotos", + "titleSending": "Enviando ficheiros", + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Usa «h» para abreviatura de horas e «m» para minutos", + "@days": "Usa «d» para días, «h» para horas e «m» para minutos" + } + }, + "aboutPage": { + "description": [ + "LocalSend é unha aplicación gratuita, de código aberto, que che permite compartir ficheiros e mensaxes de xeito seguro con dispositivos cercanos a través da túa rede local sen necesidade dunha conexión a internet.", + "Esta aplicación está dispoñíbel en Android, iOS, macOS, Windows e Linux. Podes atopar todas as opcións de descarga na páxina web oficial." + ], + "contributors": "Colaboradores", + "author": "Autor", + "translators": "Tradutores", + "packagers": "Empaquetadores", + "title": "Acerca de LocalSend" + }, + "sendPage": { + "waiting": "Agardando pola resposta…", + "rejected": "O destinatario rexeitou a solicitude.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "O destinatario está ocupado con outra petición." + }, + "donationPage": { + "title": "Doar", + "info": "LocalSen é gratuita, de código aberto e non ten anuncios. Se che gusta a aplicación, podes apoiar o desenvolvemento cunha doazón.", + "donate": "Doar {amount}", + "thanks": "Moitas grazas!", + "restore": "Restaurar a compra" + }, + "changelogPage": { + "title": "Rexistro de cambios" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Diferentes idiomas poden ter palabras diferentes, podendo non coincidir 1:1" + }, + "tray": { + "@info": "As directrices de Apple son moi estrictas sobre a expresión \"pechar\".", + "open": "@:general.open", + "close": "Saír de LocalSend", + "closeWindows": "Saír" + }, + "sanitization": { + "empty": "O nome do ficheiro non pode estar valeiro", + "invalid": "O nome do ficheiro contén caracteres inválidos" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Insira o PIN", + "invalidPin": "PIN non válido", + "tooManyAttempts": "Demasiados intentos", + "rejected": "Rexeitado", + "files": "Ficheiros", + "fileName": "Nome do ficheiro", + "size": "Tamaño" + }, + "assetPicker": { + "@info": "Traduccións para ferramenta de Selección de ficheiros para Android e iPhone", + "confirm": "Confirmar", + "cancel": "Cancelar", + "edit": "Editar", + "loadFailed": "Carga fallida", + "gifIndicator": "GIF", + "original": "Orixe", + "preview": "Previsualizar", + "select": "Seleccionar", + "emptyList": "Lista baleira", + "unSupportedAssetType": "Tipo de ficheiro non soportado.", + "unableToAccessAll": "Non se puido acceder a todos os ficheiros do dispositivo", + "sTypeOtherLabel": "Outros contidos multimedia", + "sActionPlayHint": "reproducir", + "sActionPreviewHint": "vista previa", + "sTypeImageLabel": "Imaxe", + "sActionSelectHint": "seleccionar", + "sTypeVideoLabel": "Vídeo", + "sActionSwitchPathLabel": "cambiar ruta", + "changeAccessibleLimitedAssets": "Preme para actualizar os ficheiros accesíbeis", + "goToSystemSettings": "Vaia á configuración do sistema", + "accessLimitedAssets": "Continuar con acceso limitado", + "sActionUseCameraHint": "usar cámara", + "sUnitAssetCountLabel": "cantidade", + "viewingLimitedAssetsTip": "Ver só ficheiros e álbums accesíbeis para a aplicación.", + "sTypeAudioLabel": "Audio", + "sNameDurationLabel": "duración", + "accessAllTip": "A aplicación só pode acceder a algúns ficheiros do dispositivo. Vaia á configuración do sistema e permite que a aplicación acceda a todos os elementos do dispositivo.", + "accessiblePathName": "Ficheiros accesíbeis" + } +} diff --git a/app/assets/i18n/gu.json b/app/assets/i18n/gu.json new file mode 100644 index 0000000..9827f02 --- /dev/null +++ b/app/assets/i18n/gu.json @@ -0,0 +1,535 @@ +{ + "locale": "અંગ્રેજી", + "appName": "LocalSend", + "general": { + "accept": "સ્વીકારો", + "accepted": "સ્વીકાર્યો", + "add": "ઉમેરો", + "advanced": "અદ્યતન", + "cancel": "રદ કરો", + "close": "બંધ કરો", + "confirm": "પુષ્ટિ કરો", + "continueStr": "આગળ વધો", + "copy": "કૉપિ કરો", + "copiedToClipboard": "ક્લિપબોર્ડ પર કૉપિ થયું", + "decline": "અસ્વીકારો", + "done": "પૂર્ણ", + "delete": "કાઢી નાખો", + "edit": "ફેરફાર કરો", + "error": "ભૂલ", + "example": "ઉદાહરણ", + "files": "ફાઇલો", + "finished": "સમાપ્ત", + "hide": "છૂપાવો", + "off": "બંધ", + "offline": "ઓફલાઇન", + "on": "ચાલુ", + "online": "ઓનલાઇન", + "open": "ખોલો", + "queue": "કતાર", + "quickSave": "ઝડપથી સેવ કરો", + "renamed": "નામ બદલ્યું", + "reset": "રીસેટ કરો", + "restart": "ફરીથી શરૂ કરો", + "settings": "સેટિંગ્સ", + "skipped": "છોડી દીધું", + "start": "શરૂ કરો", + "stop": "બંધ કરો", + "save": "સેવ કરો", + "unchanged": "બદલાયું નથી", + "unknown": "અજ્ઞાત", + "noItemInClipboard": "ક્લિપબોર્ડમાં કોઈ વસ્તુ નથી", + "quickSaveFromFavorites": "\"મનપસંદ\" માટે ક્વિક સેવ કરો" + }, + "receiveTab": { + "title": "પ્રાપ્ત કરો", + "infoBox": { + "ip": "IP:", + "port": "પોર્ટ:", + "alias": "ડિવાઇસનું નામ:" + }, + "quickSave": { + "favorites": "મનપસંદ", + "off": "@:general.off", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "મોકલો", + "selection": { + "title": "પસંદગી", + "files": "ફાઇલો: {files}", + "size": "કદ: {size}" + }, + "picker": { + "file": "ફાઇલ", + "folder": "ફોલ્ડર", + "media": "મીડિયા", + "text": "ટેક્સ્ટ", + "app": "એપ", + "clipboard": "પેસ્ટ કરો" + }, + "shareIntentInfo": "તમારા મોબાઇલ ડિવાઇસના \"શેર\" ફીચરને પણ વાપરીને ફાઇલોને વધુ સરળતાથી પસંદ કરી શકો છો.", + "nearbyDevices": "નજીકના ઉપકરણો", + "thisDevice": "આ ઉપકરણ", + "scan": "ઉપકરણો શોધો", + "sendMode": "મોડ મોકલો", + "sendModes": { + "single": "એકમાત્ર પ્રાપ્તકર્તા", + "multiple": "એકથી વધારે પ્રાપ્તકર્તાઓ", + "link": "લિંક દ્વારા શેર કરો" + }, + "sendModeHelp": "સમજાણ", + "help": "મહેરબાની કરીને ખાતરી કરો કે ઇચ્છિત લક્ષ્ય પણ તે જ Wi-Fi નેટવર્ક પર છે.", + "placeItems": "શેર કરવા માટે વસ્તુઓ મૂકો.", + "manualSending": "મૈન્યુલ મોકલવું" + }, + "settingsTab": { + "title": "સેટિંગ્સ", + "general": { + "title": "સામાન્ય", + "brightness": "વિષય", + "brightnessOptions": { + "system": "સિસ્ટમ", + "dark": "ડાર્ક", + "light": "લાઇટ" + }, + "color": "રંગ", + "colorOptions": { + "system": "સિસ્ટમ", + "oled": "OLED" + }, + "language": "ભાષા", + "languageOptions": { + "system": "સિસ્ટમ" + }, + "saveWindowPlacement": "બંધ કરો: વિન્ડો પ્લેસમેન્ટ સેવ કરો", + "minimizeToTray": "બંધ કરો: ટ્રે/મેનુ બારમાં મિનિમાઇઝ", + "launchAtStartup": "લૉગિન પછી સ્વયંચાલિત શરૂઆત", + "launchMinimized": "સ્વયંચાલિત શરૂઆત: છુપાવેલી સ્થિતિમાં શરૂ કરો", + "animations": "એનિમેશન", + "saveWindowPlacementWindows": "બહાર નીકળ્યા પછી વિન્ડો ની જગ્યા સાચવો", + "showInContextMenu": "કૉટેક્સ્ટ મેન્યુ માં LocalSend દેખાડો" + }, + "receive": { + "title": "સ્વીકારો", + "quickSave": "@:general.quickSave", + "autoFinish": "સ્વયંચાલિત પૂરણ", + "destination": "સ્થળ", + "downloads": "(ડાઉનલોડ્સ)", + "saveToGallery": "મીડિયા ગેલેરીમાં સેવ કરો", + "saveToHistory": "ઇતિહાસમાં સેવ કરો", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin" + }, + "send": { + "title": "મોકલો", + "shareViaLinkAutoAccept": "લિંક દ્વારા શેર કરો: સ્વયંચાલિત સ્વીકારો" + }, + "network": { + "title": "નેટવર્ક", + "needRestart": "સેટિંગ્સ લાગુ કરવા સર્વરને પુનઃપ્રારંભ કરો!", + "server": "સર્વર", + "alias": "ડિવાઇસ નામ", + "deviceType": "ડિવાઇસ પ્રકાર", + "deviceModel": "ડિવાઇસ મોડલ", + "port": "પોર્ટ", + "discoveryTimeout": "ડિસ્કવરી ટાઈમઆઉટ", + "portWarning": "તમે કસ્ટમ પોર્ટનો ઉપયોગ કરી રહ્યા છો તેથી તમે અન્ય ડિવાઇસ દ્વારા શોધી શકાય નહીં. (મૂળભૂત: {defaultPort})", + "encryption": "એન્ક્રિપ્શન", + "multicastGroup": "મલ્ટીકાસ્ટ", + "multicastGroupWarning": "તમે કસ્ટમ મલ્ટીકાસ્ટ સરનામાનો ઉપયોગ કરી રહ્યા છો તેથી તમે અન્ય ડિવાઇસ દ્વારા શોધી શકાય નહીં. (મૂળભૂત: {defaultMulticast})", + "network": "નૅટવર્ક", + "networkOptions": { + "all": "બધા", + "filtered": "છાણેલા" + }, + "useSystemName": "સિસ્ટમ નામ વાપરો", + "generateRandomAlias": "રેનડમ ઉપનામ બનાવો" + }, + "other": { + "title": "અન્ય", + "support": "લોકલસેન્ડને સપોર્ટ કરો", + "donate": "દાન આપો", + "privacyPolicy": "ગોપનીયતા નીતિ", + "termsOfUse": "વાપરવા માટેની શરતો" + }, + "advancedSettings": "અદ્યતન સેટિંગ્સ" + }, + "troubleshootPage": { + "title": "ટ્રબલશૂટ", + "subTitle": "એપ્લિકેશન અપેક્ષિત રીતે કાર્ય કરતી નથી? અહીં તમે કેટલાક સામાન્ય ઉકેલો મેળવી શકો છો.", + "solution": "ઉકેલ:", + "fixButton": "સ્વયંચાલિત રીતે ઉકેલો", + "firewall": { + "symptom": "આ એપ્લિકેશન અન્ય ડિવાઇસને ફાઈલો મોકલી શકે છે; પરંતુ અન્ય ડિવાઇસ આ ડિવાઇસને ફાઈલો મોકલી શકતા નથી.", + "solution": "આ મોટાભાગે ફાયરવોલનો પ્રશ્ન છે. તમે {port} પોર્ટ પર આવનારી કનેક્શન્સ (UDP અને TCP) ને મંજૂરી આપીને આ ઉકેલી શકો છો.", + "openFirewall": "ફાયરવોલ ખોલો" + }, + "noConnection": { + "symptom": "બંને ડિવાઇસ એકબીજાને શોધી શકતા નથી કે ફાઈલો શેર કરી શકતા નથી.", + "solution": "શું સમસ્યા બંને બાજુ છે? જો આવું હોય, તો તમને ખાતરી કરવી જોઈએ કે બંને ડિવાઇસ એ જ Wi-Fi નેટવર્ક પર છે અને એ જ રૂપરેખા (પોર્ટ, મલ્ટીકાસ્ટ સરનામું, એન્ક્રિપ્શન) શેર કરે છે. નેટવર્ક ભાગ લેનારા વચ્ચે સંવાદિતા મંજૂરી ન આપી શકે. આ કિસ્સામાં, આ વિકલ્પને રાઉટરમાં સક્રિય કરવો પડશે." + }, + "noDiscovery": { + "symptom": "આ ડિવાઇસ બીજા ડિવાઇસ ને શોધી નથી શકતો.", + "solution": "પક્કું કરો કે તમારા બધા ડિવાઇસ એજ વાઈફાઈ પર છે એંડ એજ કૉંફઈગુરેશન (પોર્ટ, મલ્ટીકાષ્ટ એડ્રેસ, એનક્રિપશન) છે. તમે જોયતા ડિવાઇસ નું આઇપી એડ્રેસ લખવનો પ્રયાસ કરી શકો છો. અગર આ કામ કયરૂ તોહ તમે આ ડિવાઇસ ને તમારા મનપસંદ માં જોડી શકો છો જેનાથી, ભવિષ્ય માં એ એની મેતે શોધી લેસે." + } + }, + "receiveHistoryPage": { + "title": "ઇતિહાસ", + "openFolder": "ફોલ્ડર ખોલો", + "deleteHistory": "ઇતિહાસ ડિલીટ કરો", + "empty": "ઇતિહાસ ખાલી છે.", + "entryActions": { + "open": "ફાઇલ ખોલો", + "info": "માહિતી", + "deleteFromHistory": "ઇતિહાસમાંથી ડિલીટ કરો", + "showInFolder": "ફોલ્ડર માં બતાવો" + } + }, + "apkPickerPage": { + "title": "એપ્સ (APK)", + "excludeSystemApps": "સિસ્ટમ એપ્સનો સમાવેશ ન કરો", + "excludeAppsWithoutLaunchIntent": "લૉન્ચ નહીં કરી શકાય તેવા એપ્સનો સમાવેશ ન કરો", + "apps": "{n} એપ્સ" + }, + "selectedFilesPage": { + "deleteAll": "બધા ડિલીટ કરો" + }, + "receivePage": { + "subTitle": { + "one": "તમે ફાઇલ મોકલવા માંગે છે", + "other": "તમે {n} ફાઇલો મોકલવા માંગે છે" + }, + "subTitleMessage": "તમે સંદેશો મોકલ્યો:", + "subTitleLink": "તમે લિંક મોકલી:", + "canceled": "પ્રેષક એ વિનંતી રદ કરી છે." + }, + "receiveOptionsPage": { + "title": "વિકલ્પો", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(લોકલસેન્ડ ફોલ્ડર)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "સ્વયંચાલિત રીતે બંધ કરી દેવામાં આવ્યું છે કારણ કે ડિરેક્ટરીઓ છે." + }, + "sendPage": { + "waiting": "પ્રતિસાદની રાહ જોવામાં આવી રહી છે...", + "rejected": "પ્રાપ્તકર્તાએ વિનંતી અસ્વીકાર કરી છે.", + "busy": "પ્રાપ્તકર્તા બીજી વિનંતી સાથે વ્યસ્ત છે.", + "tooManyAttempts": "@:વેબ.બહુ_બધા_પ્રયાસ" + }, + "progressPage": { + "titleSending": "ફાઈલો મોકલી રહ્યા છે", + "titleReceiving": "ફાઈલો મેળવી રહ્યા છે", + "savedToGallery": "ફોટોઝ માં સાચવ્યું", + "total": { + "title": { + "sending": "કુલ પ્રગતિ ({time})", + "finishedError": "ભૂલ સાથે પૂર્ણ થયું", + "canceledSender": "મોકલનાર દ્વારા રદ કરવામાં આવ્યું", + "canceledReceiver": "પ્રાપ્તકર્તા દ્વારા રદ કરવામાં આવ્યું" + }, + "count": "ફાઈલો: {curr} / {n}", + "size": "કદ: {curr} / {n}", + "speed": "ગતિ: {speed}/s" + }, + "remainingTime": { + "days": "{d}દિ {h}ક {m}મિ", + "@hours": "નાનું કરી ને 'ક' કલાક માટે અને 'મિ' મિનિટ માટે વાપરો", + "@days": "નાનું કરી ને 'દિ' દિવસ માટે, 'ક' કલાક માટે અને 'મિ' મિનિટ માટે વાપરો", + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}ક {m}મિ" + } + }, + "webSharePage": { + "title": "લિંક દ્વારા શેર કરો", + "loading": "સર્વર શરૂ કરી રહ્યો છે...", + "stopping": "સર્વર બંધ કરી રહ્યો છે...", + "error": "સર્વર શરૂ કરતી વખતે એક ભૂલ થઈ.", + "openLink": { + "one": "તમારા બ્રાઉઝરમાં આ લિંક ખોલો:", + "other": "તમારા બ્રાઉઝરમાં આમાંથી કોઈ એક લિંક ખોલો:" + }, + "requests": "વિનંતિઓ", + "noRequests": "હજી સુધી કોઈ વિનંતિ નથી.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "સ્વયંસંચાલિત રીતે વિનંતિઓ સ્વીકારો", + "encryptionHint": "લોકલસેન્ડ એ સ્વ-સાઇન્ડ સર્ટિફિકેટનો ઉપયોગ કરે છે. તમારે તેને તમારા બ્રાઉઝરમાં સ્વીકારવું પડશે.", + "pendingRequests": "બાકી વિનંતિઓ: {n}", + "requirePin": "પિન જોયશે", + "pinHint": "પિન \"{pin}\" છે" + }, + "aboutPage": { + "title": "લોકલસેન્ડ વિશે", + "description": [ + "લોકલસેન્ડ એક મફત, ઓપન-સોર્સ એપ છે જે તમને તમારા સ્થાનિક નેટવર્ક પર નજીકના ઉપકરણો સાથે સુરક્ષિત રીતે ફાઈલો અને સંદેશાઓ શેર કરવાની મંજૂરી આપે છે અને તે માટે ઈન્ટરનેટ કનેક્શનની જરૂર નથી.", + "આ એપ એન્ડ્રોઇડ, ios, મેકઓએસ, વિન્ડોઝ અને લિનક્સ પર ઉપલબ્ધ છે. તમે તમામ ડાઉનલોડ વિકલ્પો આધિકારીક હોમપેજ પર શોધી શકો છો." + ], + "author": "લેખક", + "contributors": "યોગદાનકર્તાઓ", + "translators": "અનુવાદકો", + "packagers": "પૅકેજકરતાં" + }, + "donationPage": { + "title": "દાન આપો", + "info": "લોકલસેન્ડ મફત, ઓપન-સોર્સ છે અને તેમાં કોઈ જ જાહેરાતો નથી. જો તમને એપ ગમે, તો તમે દાન દ્વારા વિકાસને સપોર્ટ કરી શકો છો.", + "donate": "દાન આપો {amount}", + "thanks": "તમારો ખુબ ખુબ આભાર!", + "restore": "ખરીદી પુનઃસ્થાપિત કરો" + }, + "changelogPage": { + "title": "ચેન્જલોગ" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Different locales may have different words, it may not match 1:1", + "adjectives": [ + "Adorable", + "Beautiful", + "Big", + "Bright", + "Clean", + "Clever", + "Cool", + "Cute", + "Cunning", + "Determined", + "Energetic", + "Efficient", + "Fantastic", + "Fast", + "Fine", + "Fresh", + "Good", + "Gorgeous", + "Great", + "Handsome", + "Hot", + "Kind", + "Lovely", + "Mystic", + "Neat", + "Nice", + "Patient", + "Pretty", + "Powerful", + "Rich", + "Secret", + "Smart", + "Solid", + "Special", + "Strategic", + "Strong", + "Tidy", + "Wise" + ], + "fruits": [ + "Apple", + "Avocado", + "Banana", + "Blackberry", + "Blueberry", + "Broccoli", + "Carrot", + "Cherry", + "Coconut", + "Grape", + "Lemon", + "Lettuce", + "Mango", + "Melon", + "Mushroom", + "Onion", + "Orange", + "Papaya", + "Peach", + "Pear", + "Pineapple", + "Potato", + "Pumpkin", + "Raspberry", + "Strawberry", + "Tomato" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "પસંદગીમાં ઉમેરો", + "content": "તમે શું ઉમેરવા માંગો છો?" + }, + "addressInput": { + "title": "સરનામું દાખલ કરો", + "hashtag": "હૅશટૅગ", + "ip": "IP સરનામું", + "recentlyUsed": "હાલમાં ઉપયોગમાં લીધેલું: " + }, + "cancelSession": { + "title": "ફાઇલ ટ્રાન્સફર રદ કરો", + "content": "શું તમે ખરેખર ફાઇલ ટ્રાન્સફર રદ કરવા માંગો છો?" + }, + "cannotOpenFile": { + "title": "ફાઇલ ખોલી શકતા નથી", + "content": "\"{file}\" ખોલી શક્યા નહીં. શું આ ફાઇલ ખસેડવામાં આવી છે, નામ બદલવામાં આવ્યું છે કે દૂર કરવામાં આવી છે?" + }, + "encryptionDisabledNotice": { + "title": "એન્ક્રિપ્શન નિષ્ક્રિય", + "content": "આંકડાશાસ્ત્ર હવે કોડ ન કરાયેલા HTTP પ્રોટોકોલ દ્વારા થાય છે. HTTPS નો ઉપયોગ કરવા માટે, ફરીથી એન્ક્રિપ્શન સક્રિય કરો." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "મનપસંદ", + "noFavorites": "હજી સુધી કોઈ મનપસંદ ઉપકરણ નથી.", + "addFavorite": "ઉમેરો" + }, + "favoriteDeleteDialog": { + "title": "મનપસંદમાંથી કાઢો", + "content": "શું તમે ખરેખર \"{name}\" ને મનપસંદમાંથી કાઢવા માંગો છો?" + }, + "favoriteEditDialog": { + "titleAdd": "મનપસંદમાં ઉમેરો", + "titleEdit": "સેટિંગ્સ", + "name": "ઉપકરણનું નામ", + "auto": "(આપમેળે)", + "ip": "IP સરનામું", + "port": "પોર્ટ" + }, + "fileInfo": { + "title": "ફાઇલ માહિતી", + "fileName": "ફાઇલનું નામ:", + "path": "માર્ગ:", + "size": "કદ:", + "sender": "મોકલનાર:", + "time": "સમય:" + }, + "fileNameInput": { + "title": "ફાઇલનું નામ દાખલ કરો", + "original": "મૂળ: {original}" + }, + "historyClearDialog": { + "title": "ઈતિહાસ સાફ કરો", + "content": "શું તમે ખરેખર સંપૂર્ણ ઈતિહાસ કાઢવા માંગો છો?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "લોકલસેન્ડને સ્થાનિક નેટવર્ક સ્કેન કરવાની પરવાનગી વિના અન્ય ઉપકરણો શોધી શકતા નથી. કૃપા કરીને સેટિંગ્સમાં આ પરવાનગી આપો.", + "gotoSettings": "સેટિંગ્સ" + }, + "messageInput": { + "title": "સંદેશ લખો", + "multiline": "મલ્ટિલાઇન" + }, + "noFiles": { + "title": "કોઈ ફાઇલ પસંદ કરેલી નથી", + "content": "કૃપા કરીને ઓછામાં ઓછી એક ફાઇલ પસંદ કરો." + }, + "noPermission": { + "title": "પરવાનગી નથી", + "content": "તમે જરૂરી પરવાનગીઓ આપી નથી. કૃપા કરીને સેટિંગ્સમાં તે આપો." + }, + "notAvailableOnPlatform": { + "title": "ઉપલબ્ધ નથી", + "content": "આ સુવિધા ફક્ત આ પર ઉપલબ્ધ છે:" + }, + "qr": { + "title": "QR કોડ" + }, + "quickActions": { + "title": "ઝડપી કાર્યવાહી", + "counter": "કાઉન્ટર", + "prefix": "પ્રેફિક્સ", + "padZero": "શૂન્ય સાથે ભરવો", + "sortBeforeCount": "ગણતરી પહેલાં આલ્ફાબેટિક ક્રમમાં ગોઠવો", + "random": "રેન્ડમ" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "ફાઈલ વિનંતીઓ આપમેળે સ્વીકારવામાં આવે છે. ધ્યાન રાખો કે સ્થાનિક નેટવર્ક પરના દરેક વ્યક્તિ તમને ફાઈલો મોકલી શકે છે." + }, + "sendModeHelp": { + "title": "મોડ મોકલો", + "single": "ફાઈલોને એક પ્રાપ્તકર્તાને મોકલવામાં આવે છે. ફાઈલ ટ્રાન્સફર પૂરી થયા પછી પસંદગી સાફ કરવામાં આવશે.", + "multiple": "ફાઈલોને ઘણા પ્રાપ્તકર્તાઓને મોકલવામાં આવે છે. પસંદગી સાફ કરવામાં આવશે નહીં.", + "link": "જે પ્રાપ્તકર્તાઓ પાસે LocalSend સ્થાપિત નથી તેઓ તેમના બ્રાઉઝરમાં લિંક ખોલીને પસંદ કરેલી ફાઈલો ડાઉનલોડ કરી શકે છે." + }, + "zoom": { + "title": "URL" + }, + "openFile": { + "title": "ફાઇલ ખોલો", + "content": "પ્રાપ્ત થઈલી ફાઇલ ખોલવી છે?" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "તમારા મનપસંદ સૂચી માં હોય એ ડિવાઇસ ના ફાઇલ અનુરોધ એની મેતે સ્વીકાર કરી લેશે.", + "ચેતવણી! હમણાં, આ પૂર્ણ રૂપ થઈ સુરક્ષિત નથી, કારણ કે તમારા મનપસંદ સૂચી માંથી કોઈ ભી ડિવાઇસ નું ફિંગરપ્રિન્ટ કોઈ હેકર પાસે હસે તો એ તમને ફાઇલ બીના તમારા મંજૂરી મોકલી સકશે.", + "જોકે, બીના મંજૂરી બધા જે લોકલ નેટવર્ક પર હોય એના પાસ થી ફાઇલ લેવા કરતા આ વિકલ્પ વધારે સુરક્ષિત છે." + ] + }, + "pin": { + "title": "પિન નાખો" + } + }, + "sanitization": { + "empty": "ફાઈલનામ ખાલી ન હોઈ શકે", + "invalid": "ફાઈલનામમાં અમાન્ય અક્ષરો છે" + }, + "tray": { + "@info": "Apple માર્ગદર્શિકાઓ 'બંધ' શબ્દના વપરાશ વિશે ખૂબ કડક છે.", + "open": "@:general.open", + "close": "LocalSend બંધ કરો", + "closeWindows": "બહાર નિકડો" + }, + "web": { + "waiting": "@:sendPage.waiting", + "rejected": "નકારી કાઢ્યું", + "files": "ફાઈલો", + "fileName": "ફાઈલનું નામ", + "size": "માપ", + "enterPin": "પિન નાખો", + "invalidPin": "પિન ગલત છે", + "tooManyAttempts": "બહુ બધા પ્રયાસ કરી દીધા" + }, + "assetPicker": { + "@info": "Android અને iPhone માટે મીડિયા પસંદગી સાધન માટેના અનુવાદો", + "confirm": "ખાતરી કરો", + "cancel": "રદ કરો", + "edit": "સંપાદિત કરો", + "gifIndicator": "GIF", + "loadFailed": "લોડ નિષ્ફળ", + "original": "મૂળ", + "preview": "પૂર્વદર્શન", + "select": "પસંદ કરો", + "emptyList": "ખાલી યાદી", + "unSupportedAssetType": "અમાન્ય ફાઈલ પ્રકાર.", + "unableToAccessAll": "ડિવાઇસ પરની તમામ ફાઇલોનેઍક્સેસ કરી શકાતી નથી", + "viewingLimitedAssetsTip": "એપને ઉપલબ્ધ ફાઈલો અને આલ્બમ્સ જુઓ.", + "changeAccessibleLimitedAssets": "પ્રાપ્ય ફાઈલો અપડેટ કરવા માટે ક્લિક કરો", + "accessAllTip": "અમુક ફાઇલો જોવા એપને પરવાનગી નથી. સેટિંગ્સમાં જઈને બધી મીડિયા ફાઇલોની પરવાનગી આપો.", + "goToSystemSettings": "સિસ્ટમ સેટિંગ્સ પર જાઓ", + "accessLimitedAssets": "મર્યાદિત ઍક્સેસ સાથે ચાલુ રાખો", + "accessiblePathName": "પ્રાપ્ય ફાઈલો", + "sTypeAudioLabel": "ઑડિઓ", + "sTypeImageLabel": "છબી", + "sTypeVideoLabel": "વિડિયો", + "sTypeOtherLabel": "અન્ય મીડિયા", + "sActionPlayHint": "વગાડો", + "sActionPreviewHint": "પૂર્વદર્શન", + "sActionSelectHint": "પસંદ કરો", + "sActionSwitchPathLabel": "માર્ગ બદલો", + "sActionUseCameraHint": "કૅમેરા વાપરો", + "sNameDurationLabel": "અવધિ", + "sUnitAssetCountLabel": "ગણતરી" + }, + "networkInterfacesPage": { + "preview": "પ્રીવ્યૂ", + "whitelist": "જોયતીસૂચી", + "blacklist": "નજોયતીસૂચી", + "title": "નેટવર્ક ઇન્ટરફેસ", + "info": "ડિફૌલ્ટ રૂપે, LocalSend બધા ઉપલબ્ધ નેટવર્ક ઇન્ટરફેસ વાપરશે. તમે અહી નજોયતા નેટવર્ક ને કાઢી શકો છો. બદલાવ જોયા માટે તમને સર્વર ને ફરી ચાલુ કરવું પડસે." + } +} diff --git a/app/assets/i18n/he.json b/app/assets/i18n/he.json new file mode 100644 index 0000000..051cda0 --- /dev/null +++ b/app/assets/i18n/he.json @@ -0,0 +1,457 @@ +{ + "locale": "עברית", + "appName": "LocalSend", + "general": { + "accept": "אישור", + "accepted": "התקבל", + "add": "הוספה", + "advanced": "מידע נוסף", + "cancel": "ביטול", + "close": "סגור", + "confirm": "אישור", + "continueStr": "המשך", + "copy": "העתקה", + "copiedToClipboard": "הועתק ללוח", + "decline": "דחיה", + "done": "אישור", + "delete": "מחיקה", + "edit": "עריכה", + "error": "שגיאה", + "example": "דוגמא", + "files": "קבצים", + "finished": "הסתיים", + "hide": "הסתרה", + "off": "כבויה", + "offline": "כבוי", + "on": "פעילה", + "online": "מקוון", + "open": "פתח", + "queue": "תור", + "quickSave": "שמירה מהירה", + "quickSaveFromFavorites": "שמירה מהירה מהמועדפים", + "renamed": "שונה שם", + "reset": "איפוס", + "restart": "הפעל מחדש", + "settings": "הגדרות", + "skipped": "דילג", + "start": "התחל", + "stop": "עצור", + "save": "שמור", + "unchanged": "ללא שינוי", + "unknown": "לא ידוע", + "noItemInClipboard": "לוח ההעתקה ריק." + }, + "receiveTab": { + "title": "קבלה", + "infoBox": { + "ip": "IP:", + "port": "יציאה:", + "alias": "כינוי:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "מועדפים", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "שליחה", + "selection": { + "title": "בחירה", + "files": "קבצים: {files}", + "size": "גודל: {size}" + }, + "picker": { + "file": "קובץ", + "folder": "תיקייה", + "media": "מדיה", + "text": "טקסט", + "app": "אפליקציה", + "clipboard": "לוח ההעתקה" + }, + "shareIntentInfo": "תוכל גם להשתמש בתכונת \"שתף\" של המכשיר הנייד שלך כדי לבחור קבצים בקלות.", + "nearbyDevices": "מכשירים בקרבת מקום", + "thisDevice": "המכשיר הזה", + "scan": "חפש מכשירים", + "manualSending": "שליחה ידנית", + "sendMode": "מצב שליחה", + "sendModes": { + "single": "שליחה למקבל בודד", + "multiple": "שליחה למקבלים מרובים", + "link": "שיתוף באמצעות קישור" + }, + "sendModeHelp": "עזרה", + "help": "אנא ודא שאתה ומכשיר היעד נמצאים באותה רשת WiFi.", + "placeItems": "הצב פריטים לשיתוף." + }, + "settingsTab": { + "title": "הגדרות", + "general": { + "title": "כללי", + "brightness": "ערכת נושא", + "brightnessOptions": { + "system": "מערכת", + "dark": "כהה", + "light": "בהירה" + }, + "color": "צבע", + "colorOptions": { + "system": "מערכת", + "oled": "OLED" + }, + "language": "שפה", + "languageOptions": { + "system": "מערכת" + }, + "saveWindowPlacement": "יציאה: שמירת מיקום החלון", + "saveWindowPlacementWindows": "שמור את מיקום החלון בעת יציאה", + "minimizeToTray": "יציאה: מזעור למגש", + "launchAtStartup": "הפעלה אוטומטית לאחר הכניסה", + "launchMinimized": "הפעלה אוטומטית: התחל מוסתר", + "showInContextMenu": "הצג את LocalSend בתפריט ההקשר", + "animations": "אנימציות" + }, + "receive": { + "title": "קבלה", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "סיום אוטומטי", + "destination": "יעד", + "downloads": "(הורדות)", + "saveToGallery": "שמור מדיה לגלריה", + "saveToHistory": "שמור בהיסטוריה" + }, + "send": { + "title": "שליחה", + "shareViaLinkAutoAccept": "שיתוף באמצעות קישור: אישור אוטומטי" + }, + "network": { + "title": "רשת", + "needRestart": "הפעל מחדש את השרת כדי להחיל את ההגדרות!", + "server": "שרת", + "alias": "כינוי", + "deviceType": "סוג המכשיר", + "deviceModel": "דגם המכשיר", + "port": "יציאה", + "discoveryTimeout": "זמן קצוב לגילוי", + "useSystemName": "השתמש בשם מערכת", + "generateRandomAlias": "צור כינוי אקראי", + "portWarning": "יתכן שלא יזוהו מכשירים אחרים בגלל שאתה משתמש ביציאה מותאמת אישית. (ברירת־מחדל: {defaultPort})", + "encryption": "הצפנה", + "multicastGroup": "מולטיקאסט", + "multicastGroupWarning": "יתכן שלא יזוהו מכשירים אחרים בגלל שאתה משתמש בכתובת מולטיקאסט מותאמת אישית. (ברירת־מחדל: {defaultMulticast})", + "networkOptions": { + "filtered": "מסונן", + "all": "הכל" + }, + "network": "רשת" + }, + "other": { + "title": "אחר", + "support": "תמיכה ב-LocalSend", + "donate": "תרומה", + "privacyPolicy": "מדיניות פרטיות", + "termsOfUse": "תנאי השימוש" + }, + "advancedSettings": "הגדרות מתקדמות" + }, + "troubleshootPage": { + "title": "פתרון תקלות", + "subTitle": "האפליקציה לא פועלת כראוי? כאן תוכל למצוא פתרונות לבעיות נפוצות.", + "solution": "פתרון:", + "fixButton": "תקן אוטומטית", + "firewall": { + "symptom": "האפליקציה יכולה לשלוח קבצים למכשירים אחרים, אך מכשירים אחרים אינם יכולים לשלוח קבצים למכשיר זה.", + "solution": "כנראה זו בעיה של חומת אש. באפשרותך לפתור את הבעיה על ידי אפשור חיבורים נכנסים (UDP ו-TCP) ביציאה {port}.", + "openFirewall": "פתח את חומת האש" + }, + "noDiscovery": { + "symptom": "המכשיר הזה לא מצליח לגלות מכשירים אחרים.", + "solution": "אנא ודא שכל המכשירים נמצאים באותה רשת Wi-Fi וחולקים את אותה תצורה (יציאה, כתובת ריבוי שידור, הצפנה). אתה יכול לנסות להקליד את כתובת ה-IP של מכשיר היעד באופן ידני. אם זה יעבוד, שקול להוסיף את המכשיר למועדפים כדי שניתן יהיה לגלות אותו אוטומטית בעתיד." + }, + "noConnection": { + "symptom": "שני המכשירים לא מצליחים לגלות אחד את השני כדי לשתף קבצים.", + "solution": "הבעיה קיימת בשני הצדדים? עליך לוודא ששני המכשירים נמצאים באותה רשת WiFi וחולקים את אותה תצורה (יציאה, כתובת מולטיקאסט, הצפנה). רשת ה-WiFi עשויה שלא לאפשר תקשורת בין משתתפים. במקרה כזה, יש לאפשר אפשרות זו בראוטר." + } + }, + "receiveHistoryPage": { + "title": "היסטוריה", + "openFolder": "פתח תיקייה", + "deleteHistory": "מחק היסטוריה", + "empty": "ההיסטוריה ריקה.", + "entryActions": { + "open": "פתח קובץ", + "showInFolder": "הצג בתיקייה", + "info": "מידע", + "deleteFromHistory": "מחק מההיסטוריה" + } + }, + "apkPickerPage": { + "title": "אפליקציות (APK)", + "excludeSystemApps": "אל תכלול אפליקציות מערכת", + "excludeAppsWithoutLaunchIntent": "אל תכלול אפליקציות שאינן ניתנות להפעלה", + "apps": "{n} אפליקציות" + }, + "selectedFilesPage": { + "deleteAll": "מחק הכל" + }, + "receivePage": { + "subTitle": { + "one": "רוצה לשלוח לך קובץ", + "other": "רוצה לשלוח לך {n} קבצים" + }, + "subTitleMessage": "שלח לך הודעה:", + "subTitleLink": "שלח לך קישור:", + "canceled": "השולח ביטל את הבקשה." + }, + "receiveOptionsPage": { + "title": "אפשרויות", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(תיקיית LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "כבוי באופן אוטומטי בשל קיום ספריות." + }, + "sendPage": { + "waiting": "ממתין לתגובה…", + "rejected": "הנמען דחה את הבקשה.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "הנמען תפוס בבקשה אחרת." + }, + "progressPage": { + "titleSending": "שולח קבצים", + "titleReceiving": "מקבל קבצים", + "savedToGallery": "נשמר בתמונות", + "total": { + "title": { + "sending": "סה\"כ התקדמות ({time})", + "finishedError": "הסתיים עם שגיאה", + "canceledSender": "בוטל על ידי השולח", + "canceledReceiver": "בוטל על ידי הצד המקבל" + }, + "count": "קבצים: {curr}/{n}", + "size": "גודל: {curr}/{n}", + "speed": "מהירות: {speed}/שניה" + } + }, + "webSharePage": { + "title": "שיתוף באמצעות קישור", + "loading": "מפעיל את השרת…", + "stopping": "עוצר את השרת…", + "error": "אירעה שגיאה בזמן הפעלת השרת.", + "openLink": { + "one": "פתח את הקישור בדפדפן:", + "other": "פתח את אחד מהקישורים האלו בדפדפן:" + }, + "requests": "בקשות", + "noRequests": "אין כרגע בקשות.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "אישור בקשות באופן אוטומטי", + "requirePin": "דרוש סיסמה", + "pinHint": "הסיסמה היא \"{pin}\"", + "encryptionHint": "LocalSend משתמש בתעודה עצמית. עליך לאשר אותה בדפדפן.", + "pendingRequests": "בקשות בהמתנה: {n}" + }, + "aboutPage": { + "title": "אודות LocalSend", + "description": [ + "LocalSend היא אפליקציית קוד פתוח חינמית המאפשרת לשתף קבצים והודעות בצורה מאובטחת עם מכשירים קרובים דרך הרשת המקומית מבלי להזדקק לחיבור לאינטרנט.", + "אפליקציה זו זמינה באנדרואיד, iOS, macOS, Windows ו-Linux. אתה יכול למצוא את כל אפשרויות ההורדה בדף הבית הרשמי." + ], + "author": "יוצר", + "contributors": "תורמים", + "packagers": "אורזים", + "translators": "מתרגמים" + }, + "donationPage": { + "title": "תרומה", + "info": "אפליקציית LocalSend היא חינמית, קוד פתוח וללא פרסומות. אם אתה אוהב את האפליקציה, אתה יכול לתמוך בפיתוח באמצעות תרומה.", + "donate": "תרומת {amount}", + "thanks": "תודה רבה!", + "restore": "שחזור רכישה" + }, + "changelogPage": { + "title": "יומן שינויים" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "הוסף לבחירה", + "content": "מה אתה רוצה להוסיף?" + }, + "openFile": { + "title": "פתח קובץ", + "content": "האם ברצונך לפתוח את הקובץ שהתקבל?" + }, + "addressInput": { + "title": "הכנס כתובת", + "hashtag": "סולמית", + "ip": "כתובת ה-IP", + "recentlyUsed": "בשימוש לאחרונה: " + }, + "cancelSession": { + "title": "בטל את העברת הקבצים", + "content": "האם אתה באמת רוצה לבטל את העברת הקבצים?" + }, + "cannotOpenFile": { + "title": "לא ניתן לפתוח את הקובץ", + "content": "לא ניתן לפתוח את \"{file}\". האם הקובץ הועבר, הועתק או נמחק?" + }, + "encryptionDisabledNotice": { + "title": "ההצפנה מנוטרלת", + "content": "התקשורת כעת מתבצעת בפרוטוקול HTTP שאינו מוצפן. כדי להשתמש ב-HTTPS, יש להפעיל שוב את ההצפנה." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "מועדפים", + "noFavorites": "עדיין אין מכשירים מועדפים.", + "addFavorite": "הוספה" + }, + "favoriteDeleteDialog": { + "title": "הסרה מהמועדפים", + "content": "האם אתה באמת רוצה להסיר מהמועדפים \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "הוסף למועדפים", + "titleEdit": "עריכה", + "name": "כינוי", + "auto": "(אוטומטי)", + "ip": "כתובת IP", + "port": "יציאה" + }, + "fileInfo": { + "title": "מידע על הקובץ", + "fileName": "שם הקובץ:", + "path": "נתיב:", + "size": "גודל:", + "sender": "שולח:", + "time": "זמן:" + }, + "fileNameInput": { + "title": "הזן את שם הקובץ", + "original": "מקורי: {original}" + }, + "historyClearDialog": { + "title": "ניקוי היסטוריה", + "content": "האם אתה באמת רוצה למחוק את כל ההיסטוריה?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "ל־LocalSend אין אפשרות למצוא מכשירים אחרים ללא הרשאה לסריקת הרשת המקומית. אנא הענק את ההרשאה הזו בהגדרות.", + "gotoSettings": "הגדרות" + }, + "messageInput": { + "title": "הקלד הודעה", + "multiline": "מרובה שורות" + }, + "noFiles": { + "title": "לא נבחר אף קובץ", + "content": "אנא בחר קובץ אחד לפחות." + }, + "noPermission": { + "title": "אין הרשאה", + "content": "לא הענקת את ההרשאות הנדרשות. אנא הענק את ההרשאות בהגדרות." + }, + "notAvailableOnPlatform": { + "title": "לא זמין", + "content": "תכונה זו זמינה רק במערכות הבאות:" + }, + "qr": { + "title": "קוד QR" + }, + "quickActions": { + "title": "פעולות מהירות", + "counter": "מונה", + "prefix": "קידומת", + "padZero": "ריפוד באפסים", + "sortBeforeCount": "מיין תחילה בסדר אלפביתי", + "random": "אקראי" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "בקשות שליחה מתקבלות אוטומטית. שים לב שכל אחד ברשת המקומית יוכל לשלוח לך קבצים." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "כעת בקשות לקבצים ייתקבלו אוטומטית ממכשירים ברשימת המועדפים שלך.", + "אזהרה: כרגע זה לא לגמרי מאובטח מכיוון שהאקר שנמצא ברשת שלך ויודע את טביעת האצבע של המכשירים האהובים עליך עדיין יכול לשלוח לך קבצים ללא אישור.", + "עם זאת, אפשרות זו עדיין מאובטחת יותר מאשר לאפשר קבלה אוטומטית מכל מכשיר." + ] + }, + "pin": { + "title": "הזן סיסמה" + }, + "sendModeHelp": { + "title": "מצבי שליחה", + "single": "שליחת קבצים למקבל בודד. בחירת הקבצים תתאפס לאחר השליחה.", + "multiple": "שליחת קבצים למקבלים מרובים. בחירת הקבצים לא תתאפס.", + "link": "מקבלים ש-LocalSend לא מותקן אצלם יוכלו להוריד את הקבצים שנבחרו על ידי פתיחת הקישור בדפדפן שלהם." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "שם הקובץ לא יכול להיות ריק", + "invalid": "שם הקובץ מכיל תווים לא חוקיים" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "צא מ-LocalSend", + "closeWindows": "יציאה" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "הזן סיסמה", + "invalidPin": "סיסמה לא חוקית", + "tooManyAttempts": "בוצעו יותר מידי ניסיונות כושלים", + "rejected": "נדחה", + "files": "קבצים", + "fileName": "שם קובץ", + "size": "גודל" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "אישור", + "cancel": "ביטול", + "edit": "עריכה", + "gifIndicator": "GIF", + "loadFailed": "טעינת הקובץ נכשלה", + "original": "מקור", + "preview": "תצוגה מקדימה", + "select": "בחירה", + "emptyList": "רשימה ריקה", + "unSupportedAssetType": "סוג קובץ לא נתמך.", + "unableToAccessAll": "לא ניתן לגשת לכל הקבצים במכשיר", + "viewingLimitedAssetsTip": "ניתן להציג רק קבצים ואלבומים שנגישים לאפליקציה.", + "changeAccessibleLimitedAssets": "לחץ כדי לעדכן את הקבצים הנגישים", + "accessAllTip": "האפליקציה יכולה לגשת רק לקבצים מסוימים במכשיר. עבור להגדרות המערכת ואפשר לאפליקציה לגשת לכל הקבצים שבמכשיר.", + "goToSystemSettings": "מעבר להגדרות המערכת", + "accessLimitedAssets": "המשך עם גישה מוגבלת", + "accessiblePathName": "קבצים שנגישים", + "sTypeAudioLabel": "שמע", + "sTypeImageLabel": "תמונה", + "sTypeVideoLabel": "סרטון", + "sTypeOtherLabel": "סוגים אחרים", + "sActionPlayHint": "הפעלה", + "sActionPreviewHint": "תצוגה מקדימה", + "sActionSelectHint": "בחירה", + "sActionSwitchPathLabel": "שינוי נתיב", + "sActionUseCameraHint": "שימוש במצלמה", + "sNameDurationLabel": "אורך", + "sUnitAssetCountLabel": "מספר" + }, + "networkInterfacesPage": { + "title": "ממשקי רשת", + "info": "כברירת מחדל, LocalSend משתמש בכל ממשקי הרשת הזמינים. באפשרותך להסיר רשתות שאינן רצויות כאן. עליך להפעיל מחדש את השרת כדי להחיל את השינויים.", + "preview": "תצוגה מקדימה", + "whitelist": "רשימה לבנה", + "blacklist": "רשימה שחורה" + } +} diff --git a/app/assets/i18n/hi.json b/app/assets/i18n/hi.json new file mode 100644 index 0000000..f6dcf84 --- /dev/null +++ b/app/assets/i18n/hi.json @@ -0,0 +1,527 @@ +{ + "locale": "अंग्रेज़ी", + "appName": "स्थानीय भेजें (फाइल भेजो)", + "general": { + "accept": "स्वीकार करें", + "accepted": "स्वीकृत", + "add": "जोड़ें", + "advanced": "उन्नत", + "cancel": "रद्द करें", + "close": "बंद करें", + "confirm": "पुष्टि करें", + "continueStr": "जारी रखें", + "copy": "नकल करें", + "copiedToClipboard": "क्लिपबोर्ड पर कॉपी किया गया", + "decline": "अस्वीकार करें", + "done": "हो गया", + "delete": "हटाएं", + "edit": "संपादित करें", + "error": "त्रुटि", + "example": "उदाहरण", + "files": "फाइलें", + "finished": "समाप्त", + "hide": "छुपाएं", + "off": "बंद", + "offline": "ऑफ़लाइन", + "on": "चालू", + "online": "ऑनलाइन", + "open": "खोलें", + "queue": "कतार", + "quickSave": "त्वरित सहेजें", + "quickSaveFromFavorites": "\"पसंदीदा\" के लिए त्वरित सहेजें", + "renamed": "नाम बदला गया", + "reset": "रीसेट करें", + "restart": "पुनः प्रारंभ करें", + "settings": "सेटिंग्स", + "skipped": "छोड़ा गया", + "start": "प्रारंभ करें", + "stop": "रोकें", + "save": "सहेजें", + "unchanged": "अपरिवर्तित", + "unknown": "अज्ञात", + "noItemInClipboard": "क्लिपबोर्ड में कोई आइटम नहीं है।" + }, + "receiveTab": { + "title": "प्राप्त करें", + "infoBox": { + "ip": "IP:", + "port": "पोर्ट:", + "alias": "डिवाइस का नाम:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "पसंदीदा", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "भेजें", + "selection": { + "title": "चयन", + "files": "फाइलें: {files}", + "size": "साइज़: {size}" + }, + "picker": { + "file": "फाइल", + "folder": "फ़ोल्डर", + "media": "मीडिया", + "text": "पाठ", + "app": "एप", + "clipboard": "पेस्ट" + }, + "shareIntentInfo": "आप अपने मोबाइल डिवाइस की \"शेयर\" सुविधा का उपयोग करके फाइलें अधिक आसानी से चुन सकते हैं।", + "nearbyDevices": "निकटवर्ती उपकरण", + "thisDevice": "यह डिवाइस", + "scan": "उपकरणों को खोजें", + "manualSending": "मैन्युअल भेजना", + "sendMode": "भेजने का मोड", + "sendModes": { + "single": "एकल प्राप्तकर्ता", + "multiple": "एकाधिक प्राप्तकर्ता", + "link": "लिंक के माध्यम से साझा करें" + }, + "sendModeHelp": "व्याख्या", + "help": "कृपया सुनिश्चित करें कि वांछित लक्ष्य भी उसी वाई-फाई नेटवर्क पर हो।", + "placeItems": "साझा करने के लिए आइटम रखें।" + }, + "settingsTab": { + "title": "सेटिंग्स", + "general": { + "title": "सामान्य", + "brightness": "थीम", + "brightnessOptions": { + "system": "सिस्टम", + "dark": "डार्क", + "light": "लाइट" + }, + "color": "रंग", + "colorOptions": { + "system": "सिस्टम", + "oled": "OLED" + }, + "language": "भाषा", + "languageOptions": { + "system": "सिस्टम" + }, + "saveWindowPlacement": "बंद करें: विंडो प्लेसमेंट सहेजें", + "saveWindowPlacementWindows": "बाहर निकलने के बाद विंडो की स्थिति सहेजें", + "minimizeToTray": "बंद करें: ट्रे/मेनू बार में मिनिमाइज करें", + "launchAtStartup": "लॉगिन के बाद ऑटोस्टार्ट", + "launchMinimized": "ऑटोस्टार्ट: छुपा हुआ प्रारंभ करें", + "showInContextMenu": "कॉन्टेक्स्ट मेनू में LocalSend दिखाएं", + "animations": "एनिमेशन" + }, + "receive": { + "title": "प्राप्त करें", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "स्वतः समाप्त", + "destination": "गंतव्य", + "downloads": "(डाउनलोड्स)", + "saveToGallery": "मीडिया को गैलरी में सहेजें", + "saveToHistory": "इतिहास में सहेजें" + }, + "send": { + "title": "भेजें", + "shareViaLinkAutoAccept": "लिंक के माध्यम से साझा करें: स्वतः स्वीकार" + }, + "network": { + "title": "नेटवर्क", + "needRestart": "सेटिंग्स लागू करने के लिए सर्वर को पुनः प्रारंभ करें!", + "server": "सर्वर", + "alias": "डिवाइस का नाम", + "deviceType": "डिवाइस का प्रकार", + "deviceModel": "डिवाइस का मॉडल", + "port": "पोर्ट", + "discoveryTimeout": "खोज का समय समाप्त", + "useSystemName": "सिस्टम नाम का उपयोग करें", + "generateRandomAlias": "रैंडम उपनाम जनरेट करें", + "portWarning": "आप कस्टम पोर्ट का उपयोग कर रहे हैं इसलिए अन्य डिवाइस आपको पहचान नहीं सकते हैं। (डिफ़ॉल्ट: {defaultPort})", + "encryption": "एन्क्रिप्शन", + "multicastGroup": "मल्टीकास्ट", + "multicastGroupWarning": "आप कस्टम मल्टीकास्ट पते का उपयोग कर रहे हैं इसलिए अन्य डिवाइस आपको पहचान नहीं सकते हैं। (डिफ़ॉल्ट: {defaultMulticast})", + "network": "नेटवर्क", + "networkOptions": { + "all": "सब", + "filtered": "परिष्कृत" + } + }, + "other": { + "title": "अन्य", + "support": "LocalSend का समर्थन करें", + "donate": "दान करें", + "privacyPolicy": "गोपनीयता नीति", + "termsOfUse": "उपयोग की शर्तें" + }, + "advancedSettings": "उन्नत सेटिंग्स" + }, + "troubleshootPage": { + "title": "समस्या निवारण", + "subTitle": "क्या ऐप उम्मीद के मुताबिक काम नहीं कर रहा है? यहाँ आप कुछ सामान्य समाधान पा सकते हैं।", + "solution": "समाधान:", + "fixButton": "स्वतः ठीक करें", + "firewall": { + "symptom": "यह ऐप अन्य उपकरणों को फाइल भेज सकता है; लेकिन अन्य उपकरण इस डिवाइस को फाइल नहीं भेज सकते।", + "solution": "यह संभवतः फ़ायरवॉल समस्या है। आप इसे पोर्ट {port} पर आने वाले कनेक्शनों (UDP और TCP) को अनुमति देकर हल कर सकते हैं।", + "openFirewall": "फायरवॉल खोलें" + }, + "noDiscovery": { + "symptom": "यह डिवाइस अन्य डिवाइसों को ढूंढ नहीं सकता।", + "solution": "सुनिश्चित करें कि सभी डिवाइस एक ही वाई-फाई नेटवर्क से जुड़े हों। पोर्ट, मल्टीकास्ट पता और एन्क्रिप्शन की सेटिंग्स समान होनी चाहिए। यदि डिवाइस नहीं मिलता है, तो लक्ष्य डिवाइस का आईपी पता स्वयं दर्ज करें। अगर यह काम करता है, तो डिवाइस को पसंदीदा में सहेजें ताकि भविष्य में स्वचालित रूप से मिल सके।" + }, + "noConnection": { + "symptom": "दोनों उपकरण एक दूसरे को खोज नहीं सकते और न ही वे फाइल साझा कर सकते हैं।", + "solution": "क्या समस्या दोनों तरफ मौजूद है? अगर हाँ, तो आपको यह सुनिश्चित करना होगा कि दोनों डिवाइस एक ही वाई-फ़ाई नेटवर्क पर हैं और एक ही कॉन्फ़िगरेशन (पोर्ट, मल्टीकास्ट पता, एन्क्रिप्शन) साझा करते हैं। नेटवर्क प्रतिभागियों के बीच संचार की अनुमति नहीं दे सकता है। इस मामले में, यह विकल्प राउटर पर सक्षम होना चाहिए।" + } + }, + "receiveHistoryPage": { + "title": "इतिहास", + "openFolder": "फ़ोल्डर खोलें", + "deleteHistory": "इतिहास हटाएं", + "empty": "इतिहास खाली है।", + "entryActions": { + "open": "फाइल खोलें", + "showInFolder": "फ़ोल्डर में दिखाएं", + "info": "जानकारी", + "deleteFromHistory": "इतिहास से हटाएं" + } + }, + "apkPickerPage": { + "title": "ऐप्स (APK)", + "excludeSystemApps": "सिस्टम ऐप्स को बाहर रखें", + "excludeAppsWithoutLaunchIntent": "लॉन्च न किए जा सकने वाले ऐप्स को बाहर रखें", + "apps": "{n} ऐप्स" + }, + "selectedFilesPage": { + "deleteAll": "सभी हटाएं" + }, + "receivePage": { + "subTitle": { + "one": "आपको एक फाइल भेजना चाहता है", + "other": "आपको {n} फाइलें भेजना चाहता है" + }, + "subTitleMessage": "ने आपको एक संदेश भेजा:", + "subTitleLink": "ने आपको एक लिंक भेजा:", + "canceled": "प्रेषक ने अनुरोध रद्द कर दिया है।" + }, + "receiveOptionsPage": { + "title": "विकल्प", + "destination": "@ : सेटिंग्सटैब.रिसीव.डेस्टिनेशन", + "appDirectory": "(LocalSend फ़ोल्डर)", + "saveToGallery": "@ : सेटिंग्सटैब.रिसीव.सेव टू गैलरी", + "saveToGalleryOff": "स्वचालित रूप से बंद कर दिया गया क्योंकि वहाँ निर्देशिकाएँ हैं।" + }, + "sendPage": { + "waiting": "प्रतिक्रिया का इंतजार कर रहे हैं ||", + "rejected": "प्राप्तकर्ता ने अनुरोध अस्वीकार कर दिया।", + "tooManyAttempts": "@ : वेब. बहुत अधिक प्रयास", + "busy": "प्राप्तकर्ता किसी अन्य अनुरोध में व्यस्त है।" + }, + "progressPage": { + "titleSending": "फ़ाइलें भेजी जा रही", + "titleReceiving": "फ़ाइलें प्राप्त की जा रही", + "savedToGallery": "गैलरी में सहेजा गया", + "total": { + "title": { + "sending": "कुल प्रगति ({time})", + "finishedError": "त्रुटि के साथ समाप्त हुआ", + "canceledSender": "प्रेषक द्वारा रद्द किया गया", + "canceledReceiver": "प्राप्तकर्ता द्वारा रद्द किया गया" + }, + "count": "फाइलें: {curr}/{n}", + "size": "आकार: {curr}/{n}", + "speed": "गति: {speed}/सेकंड" + } + }, + "webSharePage": { + "title": "लिंक के माध्यम से साझा करें", + "loading": "सर्वर प्रारंभ हो रहा है ||", + "stopping": "सर्वर बंद हो रहा है ||", + "error": "सर्वर शुरू करते समय एक त्रुटि हुई।", + "openLink": { + "one": "अपने ब्राउज़र में इस लिंक को खोलें:", + "other": "अपने ब्राउज़र में इन लिंक में से एक को खोलें:" + }, + "requests": "अनुरोध", + "noRequests": "अभी तक कोई अनुरोध नहीं।", + "encryption": "@ : सेटिंग्स टैब . नेटवर्क . एन्क्रिप्शन", + "autoAccept": "अनुरोधों को स्वचालित रूप से स्वीकार करें", + "requirePin": "पिन आवश्यक है", + "pinHint": "पिन \"{pin}\" है", + "encryptionHint": "LocalSend एक स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग करता है। आपको इसे अपने ब्राउज़र में स्वीकार करना होगा।", + "pendingRequests": "लंबित अनुरोध: {n}" + }, + "aboutPage": { + "title": "LocalSend के बारे में", + "description": [ + "LocalSend एक मुफ्त, ओपन-सोर्स ऐप है जो आपको अपने स्थानीय नेटवर्क पर पास के डिवाइसों के साथ इंटरनेट कनेक्शन की आवश्यकता के बिना सुरक्षित रूप से फाइलें और संदेश साझा करने की अनुमति देता है।", + "यह ऐप Android, iOS, macOS, Windows और Linux पर उपलब्ध है। आप सभी डाउनलोड विकल्पों को आधिकारिक होमपेज पर पा सकते हैं।" + ], + "author": "लेखक", + "contributors": "योगदानकर्ताओं", + "packagers": "पैकेजर्स", + "translators": "अनुवादकों" + }, + "donationPage": { + "title": "दान करें", + "info": "LocalSend मुफ्त, ओपन-सोर्स और बिना किसी विज्ञापन के है। यदि आपको ऐप पसंद है, तो आप विकास का समर्थन दान करके कर सकते हैं।", + "donate": "दान करें {amount}", + "thanks": "आपका हार्दिक धन्यवाद!", + "restore": "खरीदारी पुनर्स्थापित करें" + }, + "changelogPage": { + "title": "परिवर्तन सूची" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "अलग-अलग स्थानों में अलग-अलग शब्द हो सकते हैं, यह 1:1 से मेल नहीं खा सकता", + "adjectives": [ + "प्यारा", + "सुंदर", + "बड़ा", + "उज्ज्वल", + "स्वच्छ", + "चतुर", + "शांत", + "प्यारा", + "चालाक", + "दृढ़निश्चयी", + "ऊर्जावान", + "कुशल", + "शानदार", + "तेज", + "अच्छा", + "ताजा", + "अच्छा", + "गजब का", + "महान", + "सुडौल", + "गर्म", + "दयालु", + "सुंदर", + "रहस्यमय", + "साफ-सुथरा", + "अच्छा", + "धैर्यवान", + "सुंदर", + "शक्तिशाली", + "धनी", + "गुप्त", + "स्मार्ट", + "ठोस", + "विशेष", + "रणनीतिक", + "मजबूत", + "साफ-सुथरा", + "बुद्धिमान" + ], + "fruits": [ + "सेब", + "एवोकाडो", + "केला", + "ब्लैकबेरी", + "ब्लूबेरी", + "ब्रोकली", + "गाजर", + "चेरी", + "नारियल", + "अंगूर", + "नींबू", + "सलाद पत्ता", + "आम", + "खरबूजा", + "मशरूम", + "प्याज", + "संतरा", + "पपीता", + "आड़ू", + "नाशपाती", + "अनानास", + "आलू", + "कद्दू", + "रसभरी", + "स्ट्रॉबेरी", + "टमाटर" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "फाइल जोड़ें", + "content": "आप क्या जोड़ना चाहते हैं?" + }, + "openFile": { + "title": "फ़ाइल खोलें", + "content": "क्या आप प्राप्त फ़ाइल खोलना चाहते हैं?" + }, + "addressInput": { + "title": "पता दर्ज करें", + "hashtag": "हैशटैग", + "ip": "IP पता", + "recentlyUsed": "हाल ही में उपयोग किया गया: " + }, + "cancelSession": { + "title": "फ़ाइल स्थानांतरण रद्द करें", + "content": "क्या आप वास्तव में फ़ाइल स्थानांतरण रद्द करना चाहते हैं?" + }, + "cannotOpenFile": { + "title": "फ़ाइल नहीं खोल सकते", + "content": "\"{file}\" खोल नहीं सके। क्या यह फ़ाइल स्थानांतरित कर दी गई या नाम बदला या हटा दिया गया है?" + }, + "encryptionDisabledNotice": { + "title": "एन्क्रिप्शन अक्षम", + "content": "अब संचार बिना एन्क्रिप्ट किए हुए HTTP प्रोटोकॉल के माध्यम से होता है। HTTPS का उपयोग करने के लिए, एन्क्रिप्शन को फिर से सक्षम करें।" + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "पसंदीदा", + "noFavorites": "अभी तक कोई पसंदीदा डिवाइस नहीं है।", + "addFavorite": "जोड़ें" + }, + "favoriteDeleteDialog": { + "title": "पसंदीदा से हटाएँ", + "content": "क्या आप वास्तव में \"{name}\" को पसंदीदा से हटाना चाहते हैं?" + }, + "favoriteEditDialog": { + "titleAdd": "पसंदीदा में जोड़ें", + "titleEdit": "सेटिंग्स", + "name": "डिवाइस नाम", + "auto": "(auto)", + "ip": "IP पता", + "port": "पोर्ट" + }, + "fileInfo": { + "title": "फ़ाइल की जानकारी", + "fileName": "फ़ाइल का नाम:", + "path": "पथ:", + "size": "आकार:", + "sender": "प्रेषक:", + "time": "समय:" + }, + "fileNameInput": { + "title": "फ़ाइल का नाम दर्ज करें", + "original": "मूल: {original}" + }, + "historyClearDialog": { + "title": "इतिहास साफ करें", + "content": "क्या आप वास्तव में पूरे इतिहास को हटाना चाहते हैं?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend स्थानीय नेटवर्क को स्कैन करने की अनुमति के बिना अन्य डिवाइसों को नहीं ढूंढ सकता। कृपया सेटिंग्स में यह अनुमति दें।", + "gotoSettings": "सेटिंग्स" + }, + "messageInput": { + "title": "संदेश टाइप करें", + "multiline": "मल्टीलाइन" + }, + "noFiles": { + "title": "कोई फ़ाइल चयनित नहीं", + "content": "कृपया कम से कम एक फ़ाइल का चयन करें।" + }, + "noPermission": { + "title": "अनुमति नहीं", + "content": "आपने आवश्यक अनुमतियाँ नहीं दी हैं। कृपया सेटिंग्स में उन्हें अनुमति दें।" + }, + "notAvailableOnPlatform": { + "title": "उपलब्ध नहीं", + "content": "यह सुविधा केवल यहां उपलब्ध है:" + }, + "qr": { + "title": "QR कोड" + }, + "quickActions": { + "title": "त्वरित क्रियाएँ", + "counter": "काउंटर", + "prefix": "प्रिफिक्स", + "padZero": "शून्य के साथ पैड करें", + "sortBeforeCount": "पहले वर्णानुक्रम में क्रमबद्ध करें", + "random": "यादृच्छिक" + }, + "quickSaveNotice": { + "title": "@:सामान्य.जल्दी सहेजें", + "content": "फ़ाइल अनुरोध स्वचालित रूप से स्वीकार कर लिए जाते हैं। ध्यान दें कि स्थानीय नेटवर्क पर सभी लोग आपको फ़ाइलें भेज सकते हैं।" + }, + "quickSaveFromFavoritesNotice": { + "title": "@ : सामान्य .जल्दी पसंदीदा से सहेजें", + "content": [ + "अब आपके पसंदीदा सूची में शामिल डिवाइसों से फ़ाइल अनुरोध स्वतः स्वीकार किए जाएंगे।", + "चेतावनी! वर्तमान में, यह पूरी तरह से सुरक्षित नहीं है, क्योंकि कोई हैकर जो आपकी पसंदीदा सूची में शामिल किसी भी डिवाइस का फ़िंगरप्रिंट प्राप्त कर लेता है, वह बिना किसी प्रतिबंध के आपको फ़ाइलें भेज सकता है।", + "हालांकि, यह विकल्प अभी भी उन सभी उपयोगकर्ताओं को बिना प्रतिबंध फ़ाइलें भेजने की अनुमति देने की तुलना में सुरक्षित है, जो स्थानीय नेटवर्क पर हैं।" + ] + }, + "pin": { + "title": "PIN दर्ज करें" + }, + "sendModeHelp": { + "title": "भेजने के मोड", + "single": "एक प्राप्तकर्ता को फ़ाइलें भेजता है। फ़ाइल ट्रांसफर समाप्त होने के बाद चयन हटा दिया जाएगा।", + "multiple": "कई प्राप्तकर्ताओं को फ़ाइलें भेजता है। चयन हटाया नहीं जाएगा।", + "link": "जिन प्राप्तकर्ताओं के पास LocalSend इंस्टॉल नहीं है, वे अपने ब्राउज़र में लिंक खोलकर चयनित फ़ाइलें डाउनलोड कर सकते हैं।" + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "फ़ाइल नाम खाली नहीं हो सकता", + "invalid": "फ़ाइल नाम में अमान्य वर्ण हैं" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "LocalSend बंद करें", + "closeWindows": "बाहर जाएं।" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "PIN दर्ज करें", + "invalidPin": "अमान्य PIN", + "tooManyAttempts": "बहुत अधिक प्रयास", + "rejected": "अस्वीकृत", + "files": "फ़ाइलें", + "fileName": "फ़ाइल नाम", + "size": "आकार" + }, + "assetPicker": { + "@info": "एंड्रॉयड और आईफोन के लिए मीडिया चयन उपकरण हेतु अनुवाद।", + "confirm": "पुष्ट करें", + "cancel": "रद्द करें", + "edit": "संपादित करें", + "gifIndicator": "GIF", + "loadFailed": "लोड विफल", + "original": "मूल", + "preview": "पूर्वावलोकन", + "select": "चुनें", + "emptyList": "खाली सूची", + "unSupportedAssetType": "असमर्थित फ़ाइल प्रकार।", + "unableToAccessAll": "डिवाइस पर सभी फ़ाइलों तक पहुंच असमर्थ", + "viewingLimitedAssetsTip": "केवल उन फ़ाइलों और एलबमों को देखें जो ऐप तक पहुंच योग्य हैं।", + "changeAccessibleLimitedAssets": "पहुंच योग्य फ़ाइलों को अपडेट करने के लिए क्लिक करें", + "accessAllTip": "ऐप डिवाइस पर केवल कुछ फ़ाइलों तक पहुंच सकता है। सिस्टम सेटिंग्स पर जाएं और ऐप को डिवाइस पर सभी मीडिया तक पहुंच की अनुमति दें।", + "goToSystemSettings": "सिस्टम सेटिंग्स पर जाएं", + "accessLimitedAssets": "सीमित पहुंच के साथ जारी रखें", + "accessiblePathName": "पहुंच योग्य फ़ाइलें", + "sTypeAudioLabel": "ऑडियो", + "sTypeImageLabel": "फोटो", + "sTypeVideoLabel": "वीडियो", + "sTypeOtherLabel": "अन्य मीडिया", + "sActionPlayHint": "चलाएँ", + "sActionPreviewHint": "पूर्वावलोकन", + "sActionSelectHint": "चुनें", + "sActionSwitchPathLabel": "मार्ग बदलें", + "sActionUseCameraHint": "कैमरा का उपयोग करें", + "sNameDurationLabel": "अवधि", + "sUnitAssetCountLabel": "गणना" + }, + "networkInterfacesPage": { + "title": "नेटवर्क इंटरफेस", + "info": "डिफ़ॉल्ट रूप से, LocalSend सभी उपलब्ध नेटवर्क इंटरफेस का उपयोग करता है। आप यहां अवांछित नेटवर्क को बाहर कर सकते हैं। परिवर्तनों को लागू करने के लिए आपको सर्वर को पुनः आरंभ करना होगा।", + "preview": "पूर्वावलोकन", + "whitelist": "श्वेतसूची", + "blacklist": "काले सूची" + } +} diff --git a/app/assets/i18n/hu.json b/app/assets/i18n/hu.json new file mode 100644 index 0000000..0e160bb --- /dev/null +++ b/app/assets/i18n/hu.json @@ -0,0 +1,465 @@ +{ + "locale": "Magyar", + "appName": "LocalSend", + "general": { + "accept": "Elfogad", + "accepted": "Elfogadva", + "add": "Hozzáad", + "advanced": "Haladó", + "cancel": "Mégse", + "close": "Bezár", + "confirm": "Megerősít", + "continueStr": "Folytat", + "copy": "Másol", + "copiedToClipboard": "Másolva a vágólapra", + "decline": "Elutasít", + "done": "Kész", + "delete": "Töröl", + "edit": "Szerkeszt", + "error": "Hiba", + "example": "Példa", + "files": "Fájlok", + "finished": "Befejezve", + "hide": "Elrejt", + "off": "Ki", + "offline": "Offline", + "on": "Be", + "online": "Online", + "open": "Megnyit", + "queue": "Várósor", + "quickSave": "Autom. mentés", + "quickSaveFromFavorites": "Gyors mentés a \"Kedvencek\"-hez", + "renamed": "Átnevezve", + "reset": "Reset", + "restart": "Újraindít", + "settings": "Beállítások", + "skipped": "Kihagyva", + "start": "Start", + "stop": "Stop", + "save": "Ment", + "unchanged": "Változatlan", + "unknown": "Ismeretlen", + "noItemInClipboard": "Nincs semmi a vágólapon." + }, + "receiveTab": { + "title": "Fogadás", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Álnév:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Kedvencek", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Küldés", + "selection": { + "title": "Kiválasztás", + "files": "Fájl(ok): {files}", + "size": "Méret: {size}" + }, + "picker": { + "file": "Fájl", + "folder": "Mappa", + "media": "Média", + "text": "Szöveg", + "app": "App", + "clipboard": "Beillesztés" + }, + "shareIntentInfo": "A fájlok könnyebb kiválasztásához használhatja mobileszköze \"Megosztás\" funkcióját is.", + "nearbyDevices": "Közeli eszközök", + "thisDevice": "Ez az eszköz", + "scan": "Keressen eszközöket", + "manualSending": "Manuális küldés", + "sendMode": "Küldési mód", + "sendModes": { + "single": "Egyetlen címzett", + "multiple": "Több címzett", + "link": "Megosztás linkben" + }, + "sendModeHelp": "Magyarázat", + "help": "Győződjön meg arról, hogy a kívánt eszköz is ugyanazon a wifi hálózaton van.", + "placeItems": "Helyezze el a megosztandó elemeket." + }, + "settingsTab": { + "title": "Beállítások", + "general": { + "title": "Általános", + "brightness": "Fényerő", + "brightnessOptions": { + "system": "Rendszer", + "dark": "Sötét", + "light": "Világos" + }, + "color": "Színek", + "colorOptions": { + "system": "Rendszer", + "oled": "OLED" + }, + "language": "Nyelv", + "languageOptions": { + "system": "Rendszer" + }, + "saveWindowPlacement": "Kilépés: Ablak pozíció mentése", + "saveWindowPlacementWindows": "Az ablak pozíciójának mentése kilépés után", + "minimizeToTray": "Kilépés: Minimalizálja a tálcára", + "launchAtStartup": "Auto. indítás bejelentkezés után", + "launchMinimized": "Auto. indítás: Kis méretben", + "showInContextMenu": "A LocalSend megjelenítése a helyi menüben", + "animations": "Animációk" + }, + "receive": { + "title": "Fogadás", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Autom. befejezés", + "destination": "Mentés helye", + "downloads": "(Letöltések)", + "saveToGallery": "Média mentése a galériába", + "saveToHistory": "Mentés az előzmények közé" + }, + "send": { + "title": "Küld", + "shareViaLinkAutoAccept": "Megosztás linken keresztül: Auto. elfogadás" + }, + "network": { + "title": "Hálózat", + "needRestart": "A beállítások alkalmazásához indítsa újra a szervert!", + "server": "Szerver", + "alias": "Álnév", + "deviceType": "Eszköz típusa", + "deviceModel": "Eszköz modell", + "port": "Port", + "discoveryTimeout": "Felfedezési időtúllépés", + "useSystemName": "Rendszernév használata", + "generateRandomAlias": "Véletlenszerű álnév generálás", + "portWarning": "Előfordulhat, hogy más eszközök nem észlelik eszközét, mert egyéni portot használ. (alapértelmezett: {defaultPort})", + "encryption": "Titkosítás", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Előfordulhat, hogy más eszközök nem észlelik eszközét, mert egyéni multicast címet használ. (alapérték: {defaultMulticast})", + "network": "Hálózat", + "networkOptions": { + "all": "Mindegyik", + "filtered": "Szűrt" + } + }, + "other": { + "title": "Egyéb", + "support": "LocalSend támogatás", + "donate": "Adomány", + "privacyPolicy": "Adatvédelmi irányelvek", + "termsOfUse": "Használati feltételek" + }, + "advancedSettings": "Haladó beállítások" + }, + "troubleshootPage": { + "title": "Hibaelhárítás", + "subTitle": "Az alkalmazás nem a várt módon működik? Itt találhat általános megoldásokat.", + "solution": "Megoldás:", + "fixButton": "Autom. javítás", + "firewall": { + "symptom": "Ez az alkalmazás képes fájlokat küldeni más eszközökre, de más eszközök nem küldhetnek fájlokat erre az eszközre.", + "solution": "Ez valószínűleg tűzfal probléma. Ezt úgy oldhatja meg, hogy engedélyezi a bejövő kapcsolatokat (UDP és TCP) a {port} porton.", + "openFirewall": "Tűzfal megnyitás" + }, + "noDiscovery": { + "symptom": "Ez az eszköz nem tud más eszközöket felismerni.", + "solution": "Győződjön meg róla, hogy minden eszköz ugyanabban a Wi-Fi hálózatban van, és ugyanaz a konfiguráció (port, multicast cím, titkosítás). Megpróbálhatja manuálisan beírni a céleszköz IP-címét. Ha ez működik, fontolja meg az eszköz hozzáadását a kedvencekhez, hogy a jövőben automatikusan fel lehessen fedezni." + }, + "noConnection": { + "symptom": "A két eszköz nem tudja felismerni egymást, és nem tud fájlokat megosztani.", + "solution": "A probléma mindkét oldalon létezik? Akkor meg kell győződnie arról, hogy mindkét eszköz ugyanabban a wifi hálózatban van, és ugyanazt a konfigurációt használja (port, multicast cím, titkosítás). Előfordulhat, hogy a Wifi nem teszi lehetővé a résztvevők közötti kommunikációt. Ebben az esetben ezt az opciót engedélyezni kell a routeren.." + } + }, + "receiveHistoryPage": { + "title": "Előzmény", + "openFolder": "Mappa megnyitása", + "deleteHistory": "Előzmény törlése", + "empty": "Még nincs előzmény.", + "entryActions": { + "open": "Fájl megnyitás", + "showInFolder": "Megjelenítés a mappában", + "info": "Információ", + "deleteFromHistory": "Törlés az előzményből" + } + }, + "apkPickerPage": { + "title": "Appok (APK)", + "excludeSystemApps": "Rendszeralkalmazások kizárása", + "excludeAppsWithoutLaunchIntent": "A nem indítható alkalmazások kizárása", + "apps": "{n} app" + }, + "selectedFilesPage": { + "deleteAll": "Összes törlése" + }, + "receivePage": { + "subTitle": { + "one": "fájlt szeretne küldeni", + "other": "{n} fájlt szeretne küldeni" + }, + "subTitleMessage": "üzenetet küldött:", + "subTitleLink": "Linket küldött:", + "canceled": "A küldő visszavonta a kérést." + }, + "receiveOptionsPage": { + "title": "Opciók", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend mappa)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Automatikusan kikapcsol, mert vannak könyvtárak." + }, + "sendPage": { + "waiting": "Válaszra várva…", + "rejected": "A fogadó elutasította a kérelmet.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "A fogadó más kéréssel van elfoglalva." + }, + "progressPage": { + "titleSending": "Fájlok küldése", + "titleReceiving": "Fájlok fogadása", + "savedToGallery": "Mentve a Galériába", + "total": { + "title": { + "sending": "Teljes folyamat ({time})", + "finishedError": "Hibával befejezve", + "canceledSender": "A küldő törölte", + "canceledReceiver": "A fogadó törölte" + }, + "count": "Fájl: {curr} / {n}", + "size": "Méret: {curr} / {n}", + "speed": "Sebesség: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Az órák rövidítéséhez használja a 'h' betűt, a percekhez pedig az 'm' betűt", + "@days": "A naphoz a 'd', az órához a 'h', a percekhez az 'm' betűt használja" + } + }, + "webSharePage": { + "title": "Megosztás linkben", + "loading": "Szerver indítása…", + "stopping": "Szerver leállítása…", + "error": "Hiba történt a szerver indításakor.", + "openLink": { + "one": "Nyissa meg ezt a hivatkozást böngészőben:", + "other": "Nyissa meg a linkek egyikét a böngészőben:" + }, + "requests": "Kérések", + "noRequests": "Még nincsenek kérések.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Kérések automatikus elfogadása", + "requirePin": "PIN kód megkövetelése", + "pinHint": "A PIN kód \"{pin}\"", + "encryptionHint": "A LocalSend a saját aláírt tanúsítványt használja. A böngészőben kell elfogadnod.", + "pendingRequests": "Függőben lévő kérések: {n}" + }, + "aboutPage": { + "title": "A LocalSend", + "description": [ + "A LocalSend egy ingyenes, nyílt forráskódú alkalmazás, amely lehetővé teszi a fájlok és üzenetek biztonságos megosztását a közeli eszközökkel a helyi hálózaton keresztül, internet kapcsolat nélkül.", + "Ez az alkalmazás Android, iOS, macOS, Windows és Linux rendszereken érhető el. Az összes letöltési lehetőséget megtalálja a hivatalos honlapon." + ], + "author": "Szerző", + "contributors": "Közreműködők", + "packagers": "Csomagolók", + "translators": "Fordítók" + }, + "donationPage": { + "title": "Adomány", + "info": "A LocalSend ingyenes, nyílt forráskódú és hirdetések nélküli. Ha megtetszett az alkalmazás, adományával támogathatja a fejlesztést.", + "donate": "Adomány {amount}", + "thanks": "Köszönöm szépen!", + "restore": "Vásárlás visszaállítása" + }, + "changelogPage": { + "title": "Változásnapló" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Az angol változatból örökölve" + }, + "dialogs": { + "addFile": { + "title": "Hozzáadás a kijelöléshez", + "content": "Mit szeretne hozzáfűzni?" + }, + "openFile": { + "title": "Fájl megnyitás", + "content": "Meg akarja nyitni a fogadott fájlt?" + }, + "addressInput": { + "title": "Adja meg a címet", + "hashtag": "Hashtag", + "ip": "IP cím", + "recentlyUsed": "Nemrég használt: " + }, + "cancelSession": { + "title": "Fájlátvitel megszakítása", + "content": "Valóban meg akarja szakítani a fájlátvitelt?" + }, + "cannotOpenFile": { + "title": "A fájl nem nyitható meg", + "content": "Nem sikerült megnyitni a(z) \"{file}\" fájlt. A fájlt áthelyezték, átnevezték vagy törölték?" + }, + "encryptionDisabledNotice": { + "title": "A titkosítás letiltva", + "content": "A kommunikáció most a titkosítatlan HTTP protokollon keresztül történik. A HTTPS használatához engedélyezze újra a titkosítást." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Kedvencek", + "noFavorites": "Nincsenek még kedvenc eszközök.", + "addFavorite": "Hozzáadás" + }, + "favoriteDeleteDialog": { + "title": "Törlés a kedvencek közül", + "content": "Tényleg törölni szeretnéd a \"{name}\" a kedvencek közül?" + }, + "favoriteEditDialog": { + "titleAdd": "Hozzáadás a kedvencekhez", + "titleEdit": "Beállítás", + "name": "Álnév", + "auto": "(auto)", + "ip": "IP cím", + "port": "Port" + }, + "fileInfo": { + "title": "Fájl információ", + "fileName": "Fájl neve:", + "path": "Útvonal:", + "size": "Méret:", + "sender": "Küldő:", + "time": "Idő:" + }, + "fileNameInput": { + "title": "Írja be a fájl nevét", + "original": "Eredeti: {original}" + }, + "historyClearDialog": { + "title": "Törölje az előzményt", + "content": "Biztosan törölni szeretné a teljes előzményt?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "A LocalSend nem találhat más eszközöket a helyi hálózat vizsgálatára vonatkozó engedély nélkül. Adja meg ezt az engedélyt a beállításokban.", + "gotoSettings": "Beállítások" + }, + "messageInput": { + "title": "Írja be az üzenetét", + "multiline": "Több soros" + }, + "noFiles": { + "title": "Nincs fájl kiválasztva", + "content": "Kérjük válasszon legalább egy fájlt." + }, + "noPermission": { + "title": "Nem engedélyezett", + "content": "Nem adtál megfelelő engedélyeket. Kérlek engedélyezd őket a beállításokban." + }, + "notAvailableOnPlatform": { + "title": "Nem érhető el", + "content": "Ez a funkció csak itt érhető el:" + }, + "qr": { + "title": "QR-kód" + }, + "quickActions": { + "title": "Gyors műveletek", + "counter": "Számláló", + "prefix": "Előtag", + "padZero": "Kitöltés nullákkal", + "sortBeforeCount": "Előzetesen rendezze ábécé sorrendbe", + "random": "Véletlen" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "A fájlkérések autom. elfogadásra kerülnek. Ügyeljen arra, hogy a helyi hálózaton mindenki küldhet Önnek fájlokat." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "A fájlkérések auto. elfogadása mostantól a kedvencek listáján szereplő eszközökről.", + "Figyelmeztetés: Ez jelenleg nem teljesen biztonságos, mert egy hacker, aki ismeri a kedvenc eszközeinek ujjlenyomatát, még mindig küldhet fájlokat.", + "Ez a lehetőség azonban még mindig biztonságosabb, mint bármely eszköz engedélyezése." + ] + }, + "pin": { + "title": "PIN kód megadása" + }, + "sendModeHelp": { + "title": "Küldési módok", + "single": "Fájlokat küld egy címzettnek. Az átvitel befejezése után a kijelölés törlődik.", + "multiple": "Fájlokat küld több címzettnek. A kijelölés nem törlődik.", + "link": "Azok a címzettek, akiknél nincs telepítve a LocalSend, letölthetik a kiválasztott fájlokat a hivatkozás megnyitásával a böngészőjükben." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "A fájlnév nem lehet üres", + "invalid": "A fájlnév érvénytelen karaktereket tartalmaz" + }, + "tray": { + "@info": "Az Apple irányelvei nagyon szigorúak a 'közeli' megfogalmazással kapcsolatban.", + "open": "@:general.open", + "close": "Kilépés", + "closeWindows": "Kilépés" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "PIN kód megadása", + "invalidPin": "Érvénytelen a PIN", + "tooManyAttempts": "Túl sok kísérlet", + "rejected": "Elutasítva", + "files": "Fájl", + "fileName": "Fájlnév", + "size": "Méret" + }, + "assetPicker": { + "@info": "Fordítások a médiaválasztó eszközhöz Androidra és iPhone-ra", + "confirm": "Megerősít", + "cancel": "Mégse", + "edit": "Szerkeszt", + "gifIndicator": "GIF", + "loadFailed": "A betöltés sikertelen", + "original": "Eredeti", + "preview": "Előnézet", + "select": "Válasszon", + "emptyList": "Üres lista", + "unSupportedAssetType": "Nem támogatott fájl típus.", + "unableToAccessAll": "Nem lehet hozzáférni az eszközön lévő összes fájlhoz", + "viewingLimitedAssetsTip": "Csak az app által elérhető fájlok és albumok megtekintése.", + "changeAccessibleLimitedAssets": "Koppintson az elérhető fájlok frissítéséhez", + "accessAllTip": "Az alkalmazás csak néhány fájlhoz férhet hozzá az eszközön. Nyissa meg a rendszerbeállításokat és engedélyezze az alkalmazás számára, hogy hozzáférjen az eszközön lévő összes médiafájlhoz.", + "goToSystemSettings": "Lépjen a rendszer beállításaihoz", + "accessLimitedAssets": "Folytassa korlátozott hozzáféréssel", + "accessiblePathName": "Elérhető fájlok", + "sTypeAudioLabel": "Audió", + "sTypeImageLabel": "Kép", + "sTypeVideoLabel": "Videó", + "sTypeOtherLabel": "Egyéb média", + "sActionPlayHint": "lejátszás", + "sActionPreviewHint": "előnézet", + "sActionSelectHint": "választás", + "sActionSwitchPathLabel": "útvonal módosítás", + "sActionUseCameraHint": "használjon kamerát", + "sNameDurationLabel": "időtartam", + "sUnitAssetCountLabel": "számol" + }, + "networkInterfacesPage": { + "title": "Hálózati interfészek", + "info": "Alapértelmezésként a LocalSend az összes rendelkezésre álló hálózati interfészt használja. Itt kizárhatja a nem kívánt hálózatokat. A módosítások alkalmazásához újra kell indítania a kiszolgálót.", + "preview": "Előnézet", + "whitelist": "Fehérlista", + "blacklist": "Tiltólista" + } +} diff --git a/app/assets/i18n/id.json b/app/assets/i18n/id.json new file mode 100644 index 0000000..364bb81 --- /dev/null +++ b/app/assets/i18n/id.json @@ -0,0 +1,455 @@ +{ + "locale": "Indonesian", + "appName": "LocalSend", + "general": { + "accept": "Terima", + "accepted": "Diterima", + "add": "Tambah", + "advanced": "Lanjutan", + "cancel": "Batal", + "close": "Tutup", + "confirm": "Konfirmasi", + "continueStr": "Lanjut", + "copy": "Salin", + "copiedToClipboard": "Disalin ke Papan Klip", + "decline": "Tolak", + "done": "Selesai", + "delete": "Hapus", + "edit": "Sunting", + "error": "Galat", + "example": "Contoh", + "files": "Berkas", + "finished": "Selesai", + "hide": "Sembunyikan", + "off": "Mati", + "offline": "Luring", + "on": "Hidup", + "online": "Daring", + "open": "Buka", + "queue": "Antrean", + "quickSave": "Penyimpanan Cepat", + "quickSaveFromFavorites": "Simpan Cepat di “Favorit”", + "renamed": "Ganti nama", + "reset": "Batalkan perubahan", + "restart": "Mengulang Kembali", + "settings": "Pengaturan", + "skipped": "Dilewati", + "start": "Mulai", + "stop": "Berhenti", + "save": "Simpan", + "unchanged": "Takberubah", + "unknown": "Takdikenal", + "noItemInClipboard": "Tidak ada item di Papan Klip." + }, + "receiveTab": { + "title": "Terima", + "infoBox": { + "ip": "IP:", + "port": "Porta:", + "alias": "Nama perangkat:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favorit", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Kirim", + "selection": { + "title": "Pilihan", + "files": "Berkas: {files}", + "size": "Ukuran: {size}" + }, + "picker": { + "file": "Berkas", + "folder": "Direktori", + "media": "Media", + "text": "Teks", + "app": "Aplikasi", + "clipboard": "Tempel" + }, + "shareIntentInfo": "Anda juga dapat menggunakan fitur \"Berbagi\" agar dapat memilih berkas dengan lebih mudah.", + "nearbyDevices": "Perangkat Terdekat", + "thisDevice": "Perangkat Ini", + "scan": "Cari perangkat", + "manualSending": "Kirim secara manual", + "sendMode": "Mode Pengiriman", + "sendModes": { + "single": "Penerima tunggal", + "multiple": "Banyak penerima", + "link": "Bagikan melalui tautan" + }, + "sendModeHelp": "Penjelasan", + "help": "Pastikan perangkat tujuan juga terkoneksi pada jaringan Wi-Fi yang sama.", + "placeItems": "Letakkan item untuk dibagikan." + }, + "settingsTab": { + "title": "Pengaturan", + "general": { + "title": "Umum", + "brightness": "Tema", + "brightnessOptions": { + "system": "Sistem", + "dark": "Gelap", + "light": "Terang" + }, + "color": "Warna", + "colorOptions": { + "system": "Sistem", + "oled": "OLED" + }, + "language": "Bahasa", + "languageOptions": { + "system": "Sistem" + }, + "saveWindowPlacement": "Keluar: Simpan posisi jendela", + "saveWindowPlacementWindows": "Simpan posisi jendela setelah keluar", + "minimizeToTray": "Keluar: Perkecil ke pojok bawah", + "launchAtStartup": "Mulai otomatis setelah masuk", + "launchMinimized": "Mulai otomatis: Berjalan di latar", + "showInContextMenu": "Tampilkan LocalSend di menu konteks", + "animations": "Animasi" + }, + "receive": { + "title": "Menerima", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Selesai Otomatis", + "destination": "Tujuan", + "downloads": "(Unduhan)", + "saveToGallery": "Simpan media ke galeri", + "saveToHistory": "Simpan ke riwayat" + }, + "send": { + "title": "Kirim", + "shareViaLinkAutoAccept": "Bagikan melalui tautan: Terima otomatis" + }, + "network": { + "title": "Jaringan", + "needRestart": "Mulai ulang agar dapat menerapkan pengaturan!", + "server": "Peladen", + "alias": "Alias", + "deviceType": "Tipe Perangkat", + "deviceModel": "Model Perangkat", + "port": "Porta", + "discoveryTimeout": "Waktu penemuan habis", + "useSystemName": "Gunakan nama sistem", + "generateRandomAlias": "Hasilkan alias acak", + "portWarning": "Anda mungkin tidak terdeteksi oleh perangkat lain karena menggunakan porta kustom. (bawaan: {defaultPort})", + "encryption": "Enkripsi", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Anda mungkin tidak terdeteksi oleh perangkat lain karena menggunakan alamat multicast khusus. (bawaan: {defaultMulticast})", + "network": "Jaringan", + "networkOptions": { + "all": "Semua", + "filtered": "Tersaring" + } + }, + "other": { + "title": "Lainnya", + "support": "Dukung LocalSend", + "donate": "Donasi", + "privacyPolicy": "Kebijakan Privasi", + "termsOfUse": "Syarat dan Ketentuan Penggunaan" + }, + "advancedSettings": "Pengaturan Lanjutan" + }, + "troubleshootPage": { + "title": "Perbaikan Masalah", + "subTitle": "Aplikasi ini tidak berfungsi seperti yang diharapkan? Temukan penyelesaian masalah umum di sini.", + "solution": "Penyelesaian:", + "fixButton": "Perbaiki secara otomatis", + "firewall": { + "symptom": "Aplikasi ini dapat mengirim berkas ke perangkat lain, tetapi tidak sebaliknya.", + "solution": "Hal ini kemungkinan merupakan masalah tembok api (firewall). Anda dapat memperbaiki masalah ini dengan memperbolehkan koneksi masuk (UDP dan TCP) pada porta {port}.", + "openFirewall": "Buka Tembok Api" + }, + "noDiscovery": { + "symptom": "Perangkat ini tidak dapat menemukan perangkat lain.", + "solution": "Pastikan semua perangkat berada pada jaringan Wi-Fi yang sama dan menggunakan konfigurasi yang sama (porta, alamat multicast, dan enkripsi). Anda dapat mencoba mengetik alamat IP perangkat target secara manual. Jika cara ini berhasil, pertimbangkan menambahkan perangkat ini ke daftar favorit sehingga perangkat dapat ditemukan secara otomatis pada lain waktu." + }, + "noConnection": { + "symptom": "Kedua perangkat tidak dapat saling menemukan dan berbagi berkas.", + "solution": "Pastikan kedua perangkat berada pada jaringan Wi-Fi yang sama dan berbagi konfigurasi yang sama (porta, alamat multicast, enkripsi). Jika Wi-Fi tidak mengizinkan komunikasi, aktifkan pilihan ini pada ruter." + } + }, + "receiveHistoryPage": { + "title": "Riwayat", + "openFolder": "Buka folder", + "deleteHistory": "Hapus riwayat", + "empty": "Riwayat kosong.", + "entryActions": { + "open": "Buka berkas", + "showInFolder": "Tampilkan di folder", + "info": "Informasi", + "deleteFromHistory": "Hapus dari riwayat" + } + }, + "apkPickerPage": { + "title": "Aplikasi (APK)", + "excludeSystemApps": "Kecualikan aplikasi sistem", + "excludeAppsWithoutLaunchIntent": "Kecualikan aplikasi yang tidak dapat diluncurkan", + "apps": "{n} Aplikasi" + }, + "selectedFilesPage": { + "deleteAll": "Hapus semua" + }, + "receivePage": { + "subTitle": { + "one": "ingin mengirimi Anda sebuah berkas", + "other": "ingin mengirimi Anda {n} berkas" + }, + "subTitleMessage": "mengirimi Anda pesan sbb.:", + "subTitleLink": "mengirimi Anda tautan sbb.:", + "canceled": "Pengirim membatalkan permintaan." + }, + "receiveOptionsPage": { + "title": "Pilihan", + "appDirectory": "(folder LocalSend)", + "saveToGalleryOff": "Dimatikan secara otomatis karena ada direktori." + }, + "sendPage": { + "waiting": "Menunggu tanggapan…", + "rejected": "Penerima menolak permintaan.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Penerima sedang sibuk dengan permintaan lain." + }, + "progressPage": { + "titleSending": "Mengirim Berkas", + "titleReceiving": "Menerima Berkas", + "savedToGallery": "Simpan di galeri", + "total": { + "title": { + "sending": "Total proses ({time})", + "finishedError": "Selesai, tetapi ada galat", + "canceledSender": "Dibatalkan pengirim", + "canceledReceiver": "Dibatalkan penerima" + }, + "count": "Berkas: {curr} / {n}", + "size": "Ukuran: {curr} / {n}", + "speed": "Kecepatan: {speed}/s" + } + }, + "webSharePage": { + "title": "Bagikan melalui Tautan", + "loading": "Memulai peladen…", + "stopping": "Menghentikan peladen…", + "error": "Ada galat saat menjalankan peladen.", + "openLink": { + "one": "Buka tautan ini di peramban:", + "other": "Buka salah satu tautan ini di peramban:" + }, + "requests": "Permintaan", + "noRequests": "Belum ada permintaan.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Terima permintaan secara otomatis", + "requirePin": "Memerlukan PIN", + "pinHint": "PIN-nya adalah \"{pin}\"", + "encryptionHint": "LocalSend menggunakan sertifikat self-signed. Anda perlu menerimanya di peramban.", + "pendingRequests": "Banyaknya permintaan yang tertunda: {n}" + }, + "aboutPage": { + "title": "Tentang LocalSend", + "description": [ + "LocalSend adalah aplikasi gratis dan bersumber terbuka yang memungkinkan Anda untuk membagikan berkas dan pesan secara aman dengan perangkat lain yang terhubung pada jaringan lokal tanpa memerlukan koneksi internet atau paket data.", + "Aplikasi ini tersedia untuk platform Android, iOS, macOS, Windows, dan Linux. Semua pilihan pengunduhan dapat ditemukan di laman situs resmi kami." + ], + "author": "Pembuat", + "contributors": "Daftar Kontributor", + "packagers": "Pengemas", + "translators": "Daftar Penerjemah" + }, + "donationPage": { + "title": "Donasi", + "info": "LocalSend adalah aplikasi gratis, bersumber terbuka, dan bebas iklan. Jika Anda menyukai aplikasi ini, mohon berikan kami dukungan dengan cara memberikan donasi.", + "donate": "Donasi {amount}", + "thanks": "Terima kasih banyak!", + "restore": "Kembalikan dana" + }, + "changelogPage": { + "title": "Catatan Perubahan" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Bahasa lokal yang berbeda mungkin memiliki kata-kata yang berbeda, mungkin tidak sama persis 1:1" + }, + "dialogs": { + "addFile": { + "title": "Tambahkan dalam pilihan", + "content": "Apa yang ingin Anda tambahkan?" + }, + "openFile": { + "title": "Buka berkas", + "content": "Anda ingin membuka berkas yang diterima?" + }, + "addressInput": { + "title": "Masukkan Alamat", + "hashtag": "Tagar", + "ip": "Alamat IP", + "recentlyUsed": "Baru saja digunakan: " + }, + "cancelSession": { + "title": "Batalkan pentransferan berkas", + "content": "Anda yakin ingin membatalkan pengiriman berkas?" + }, + "cannotOpenFile": { + "title": "Tidak dapat membuka berkas", + "content": "Tidak dapat membuka \"{file}\". Apakah berkas ini telah dipindahkan, berganti nama, atau dihapus?" + }, + "encryptionDisabledNotice": { + "title": "Enkripsi dinonaktifkan", + "content": "Komunikasi sekarang terjadi melalui protokol HTTP yang takterenkripsi. Untuk menggunakan HTTPS, aktifkan kembali enkripsi." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favorit", + "noFavorites": "Tidak ada perangkat favorit.", + "addFavorite": "Tambah" + }, + "favoriteDeleteDialog": { + "title": "Hapus dari daftar favorit", + "content": "Anda yakin ingin menghapus ini dari daftar favorit? \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Tambah ke daftar favorit", + "titleEdit": "Pengaturan", + "name": "Nama perangkat", + "auto": "(otomatis)", + "ip": "Alamat IP", + "port": "Porta" + }, + "fileInfo": { + "title": "Informasi Berkas", + "fileName": "Nama Berkas:", + "path": "Lokasi:", + "size": "Ukuran:", + "sender": "Pengirim:", + "time": "Waktu:" + }, + "fileNameInput": { + "title": "Masukkan nama berkas", + "original": "Asli: {original}" + }, + "historyClearDialog": { + "title": "Hapus Riwayat", + "content": "Anda yakin ingin menghapus seluruh riwayat?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend tidak dapat menemukan perangkat lain tanpa izin untuk memindai jaringan lokal. Mohon berikan izin ini di pengaturan.", + "gotoSettings": "Pengaturan" + }, + "messageInput": { + "title": "Ketik pesan", + "multiline": "Baris Ganda" + }, + "noFiles": { + "title": "Tidak ada berkas yang dipilih", + "content": "Pilih setidaknya satu berkas." + }, + "noPermission": { + "title": "Tidak ada izin", + "content": "Anda belum memberikan izin yang diperlukan. Harap berikan izin tersebut di pengaturan." + }, + "notAvailableOnPlatform": { + "title": "Tidak tersedia", + "content": "Fitur ini hanya tersedia di:" + }, + "qr": { + "title": "Kode QR" + }, + "quickActions": { + "title": "Aksi Cepat", + "counter": "Penghitung", + "prefix": "Awalan", + "padZero": "Isi dengan nol", + "sortBeforeCount": "Urutkan berdasarkan abjad sebelumnya", + "random": "Acak" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Semua permintaan akan langsung diterima. Harap berhati-hati bahwa semua orang di jaringan lokal dapat mengirim berkas." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Permintaan berkas sekarang diterima secara otomatis dari perangkat di daftar favorit Anda.", + "Peringatan! Saat ini, pilihan ini tidak sepenuhnya aman karena peretas yang memiliki sidik jari perangkat apa pun dari daftar favorit Anda dapat mengirimi Anda berkas tanpa pembatasan.", + "Akan tetapi, pilihan ini masih lebih aman daripada mengizinkan semua pengguna di jaringan lokal mengirimkan berkas kepada Anda tanpa pembatasan." + ] + }, + "pin": { + "title": "Masukkan PIN" + }, + "sendModeHelp": { + "title": "Mode Pengiriman", + "single": "Mengirim berkas ke satu penerima. Pilihan penerima akan dihapus setelah selesai membagikan berkas.", + "multiple": "Mengirim berkas ke beberapa penerima. Pilihan penerima tidak akan dihapus.", + "link": "Penerima yang tidak memiliki LocalSend dapat mengunduh berkas yang dipilih dengan membuka tautan di peramban." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Nama berkas tidak boleh kosong", + "invalid": "Nama berkas mengandung karakter yang takvalid" + }, + "tray": { + "@info": "Pedoman Apple sangat ketat mengenai kata-kata 'tutup'.", + "open": "@:general.open", + "close": "Tutup LocalSend", + "closeWindows": "Keluar" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Masukkan PIN", + "invalidPin": "PIN Salah", + "tooManyAttempts": "Terlalu banyak percobaan", + "rejected": "Ditolak", + "files": "Berkas", + "fileName": "Nama Berkas", + "size": "Ukuran" + }, + "assetPicker": { + "@info": "Penerjemahan untuk Alat pemilihan media Android dan iPhone", + "confirm": "Konfirmasikan", + "cancel": "Batalkan", + "edit": "Sunting", + "gifIndicator": "GIF", + "loadFailed": "Gagal memuat", + "original": "Asli", + "preview": "Pratinjau", + "select": "Pilih", + "emptyList": "Daftar kosong", + "unSupportedAssetType": "Jenis berkas tidak didukung.", + "unableToAccessAll": "Tidak dapat mengakses semua berkas di perangkat", + "viewingLimitedAssetsTip": "Hanya melihat berkas dan album yang dapat diakses oleh aplikasi.", + "changeAccessibleLimitedAssets": "Klik untuk memutakhirkan berkas yang dapat diakses", + "accessAllTip": "Aplikasi hanya dapat mengakses beberapa berkas di perangkat. Pergi ke pengaturan sistem dan izinkan aplikasi untuk mengakses semua media di perangkat.", + "goToSystemSettings": "Ke pengaturan sistem", + "accessLimitedAssets": "Lanjutkan dengan akses terbatas", + "accessiblePathName": "Berkas yang dapat diakses", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Gambar", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Media lainnya", + "sActionPlayHint": "Putar", + "sActionPreviewHint": "Pratinjau", + "sActionSelectHint": "Pilih", + "sActionSwitchPathLabel": "Ubah jalur", + "sActionUseCameraHint": "Gunakan kamera", + "sNameDurationLabel": "Durasi", + "sUnitAssetCountLabel": "Jumlah" + }, + "networkInterfacesPage": { + "title": "Antarmuka Jaringan", + "preview": "Pratinjau", + "whitelist": "Daftar putih", + "blacklist": "Daftar hitam", + "info": "Secara default, LocalSend menggunakan semua antarmuka jaringan yang tersedia. Anda dapat mengecualikan jaringan yang tidak diinginkan di sini. Anda perlu memulai ulang server untuk menerapkan perubahan." + } +} diff --git a/app/assets/i18n/it.json b/app/assets/i18n/it.json new file mode 100644 index 0000000..cc294d8 --- /dev/null +++ b/app/assets/i18n/it.json @@ -0,0 +1,465 @@ +{ + "locale": "Italiano", + "appName": "LocalSend", + "general": { + "accept": "Accetta", + "accepted": "Accettato", + "add": "Aggiungi", + "advanced": "Avanzate", + "cancel": "Annulla", + "close": "Chiudi", + "confirm": "Conferma", + "continueStr": "Continua", + "copy": "Copia", + "copiedToClipboard": "Copiato negli Appunti", + "decline": "Rifiuta", + "done": "Fatto", + "delete": "Cancella", + "edit": "Modifica", + "error": "Errore", + "example": "Esempio", + "files": "File", + "finished": "Completato", + "hide": "Nascondi", + "off": "Disattivato", + "offline": "Offline", + "on": "Attivato", + "online": "Online", + "open": "Apri", + "queue": "Coda", + "quickSave": "Salvataggio rapido", + "quickSaveFromFavorites": "Salvataggio rapido per \"Preferiti\"", + "renamed": "Rinominato", + "reset": "Reset", + "restart": "Riavvia", + "settings": "Impostazioni", + "skipped": "Saltato", + "start": "Inizia", + "stop": "Arresta", + "save": "Salva", + "unchanged": "Invariato", + "unknown": "Sconosciuto", + "noItemInClipboard": "Nessun elemento negli Appunti." + }, + "receiveTab": { + "title": "Ricevi", + "infoBox": { + "ip": "IP:", + "port": "Porta:", + "alias": "Alias:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Preferiti", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Invia", + "selection": { + "title": "Selezione", + "files": "File: {files}", + "size": "Dimensione: {size}" + }, + "picker": { + "file": "File", + "folder": "Cartella", + "media": "Media", + "text": "Testo", + "app": "App", + "clipboard": "Incolla" + }, + "shareIntentInfo": "Puoi anche usare la funzione \"Condividi\" del dispositivo mobile per selezionare più facilmente i file.", + "nearbyDevices": "Dispositivi vicini", + "thisDevice": "Questo dispositivo", + "scan": "Cerca dispositivi", + "manualSending": "Invio manuale", + "sendMode": "Modalità di invio", + "sendModes": { + "single": "Destinatario singolo", + "multiple": "Destinatari multipli", + "link": "Condividi tramite link" + }, + "sendModeHelp": "Spiegazione", + "help": "Assicurati che il destinatario desiderato si trovi sulla stessa rete Wi-Fi.", + "placeItems": "Rilascia qui gli elementi da condividere." + }, + "settingsTab": { + "title": "Impostazioni", + "general": { + "title": "Generale", + "brightness": "Tema", + "brightnessOptions": { + "system": "Sistema", + "dark": "Scuro", + "light": "Chiaro" + }, + "color": "Colore", + "colorOptions": { + "system": "Sistema", + "oled": "OLED" + }, + "language": "Lingua", + "languageOptions": { + "system": "Sistema" + }, + "saveWindowPlacement": "Salva la posizione della finestra all'uscita", + "saveWindowPlacementWindows": "Salva la posizione della finestra alla chiusura", + "minimizeToTray": "Riduci a icona anziché chiudere", + "launchAtStartup": "Avvio automatico all'accesso", + "launchMinimized": "Avvio automatico: ridotto a icona", + "showInContextMenu": "Mostra LocalSend nel menù contestuale", + "animations": "Animazioni" + }, + "receive": { + "title": "Ricevi", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Termina automaticamente", + "destination": "Destinazione", + "downloads": "(Download)", + "saveToGallery": "Salva i media nella galleria", + "saveToHistory": "Salva nella cronologia" + }, + "send": { + "title": "Invia", + "shareViaLinkAutoAccept": "Accetta automaticamente le richieste in modalità \"Condividi tramite link\"" + }, + "network": { + "title": "Rete", + "needRestart": "Riavvia il server per applicare le modifiche!", + "server": "Server", + "alias": "Nome del dispositivo", + "deviceType": "Tipo di dispositivo", + "deviceModel": "Modello del dispositivo", + "port": "Porta", + "discoveryTimeout": "Timeout di rilevamento", + "useSystemName": "Usa il nome di sistema", + "generateRandomAlias": "Genera un alias casuale", + "portWarning": "Potresti non essere rilevato da altri dispositivi perché stai utilizzando una porta personalizzata. (predefinita: {defaultPort})", + "encryption": "Crittografia", + "multicastGroup": "Indirizzo Multicast", + "multicastGroupWarning": "Potresti non essere rilevato dagli altri dispositivi perché stai utilizzando un indirizzo multicast personalizzato. (predefinito: {defaultMulticast})", + "network": "Rete", + "networkOptions": { + "all": "Tutto", + "filtered": "Filtrato" + } + }, + "other": { + "title": "Altro", + "support": "Supporta LocalSend", + "donate": "Dona", + "privacyPolicy": "Informativa sulla privacy", + "termsOfUse": "Termini di utilizzo" + }, + "advancedSettings": "Impostazioni avanzate" + }, + "troubleshootPage": { + "title": "Risoluzione dei problemi", + "subTitle": "L'app non funziona come previsto? Qui puoi trovare le soluzioni più comuni.", + "solution": "Soluzione:", + "fixButton": "Risolvi automaticamente", + "firewall": { + "symptom": "Questa app può inviare file ad altri dispositivi, ma altri dispositivi non possono inviare file a questo dispositivo.", + "solution": "È molto probabile che si tratti di un problema di firewall. Puoi risolverlo consentendo connessioni in entrata (UDP e TCP) sulla porta {port}.", + "openFirewall": "Apri Firewall" + }, + "noDiscovery": { + "symptom": "Questo dispositivo non riesce a rilevare altri dispositivi.", + "solution": "Assicurati che tutti i dispositivi siano sulla stessa rete Wi-Fi e condividano la stessa configurazione (porta, indirizzo multicast, crittografia). Puoi provare a digitare manualmente l'indirizzo IP del dispositivo di destinazione. Se funziona, considera di aggiungere questo dispositivo ai preferiti in modo che possa essere scoperto automaticamente in futuro." + }, + "noConnection": { + "symptom": "Entrambi i dispositivi non sono in grado di riconoscersi a vicenda né di condividere file.", + "solution": "Il problema si presenta da entrambi le parti? In tal caso, assicurati che i dispositivi siano sulla stessa rete Wi-Fi e condividano la stessa configurazione (porta, indirizzo multicast, crittografia). La rete Wi-Fi potrebbe non consentire la comunicazione tra i partecipanti (isolamento dell'Access Point). In questo caso, l'opzione deve essere abilitata sul router." + } + }, + "receiveHistoryPage": { + "title": "Cronologia", + "openFolder": "Apri cartella", + "deleteHistory": "Elimina cronologia", + "empty": "La cronologia è vuota.", + "entryActions": { + "open": "Apri file", + "showInFolder": "Mostra nella cartella", + "info": "Informazioni", + "deleteFromHistory": "Elimina dalla cronologia" + } + }, + "apkPickerPage": { + "title": "App (APK)", + "excludeSystemApps": "Escludi app di sistema", + "excludeAppsWithoutLaunchIntent": "Escludi app non avviabili", + "apps": "{n} App" + }, + "selectedFilesPage": { + "deleteAll": "Rimuovi tutti" + }, + "receivePage": { + "subTitle": { + "one": "vuole inviarti un file", + "other": "vuole inviarti {n} file" + }, + "subTitleMessage": "ti ha inviato un messaggio:", + "subTitleLink": "ti ha inviato un link:", + "canceled": "Il mittente ha annullato la richiesta." + }, + "receiveOptionsPage": { + "title": "Opzioni", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(cartella LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Disattivato automaticamente in presenza di cartelle." + }, + "sendPage": { + "waiting": "In attesa di risposta…", + "rejected": "Il destinatario ha rifiutato la richiesta.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Il destinatario è occupato con un'altra richiesta." + }, + "progressPage": { + "titleSending": "Invio di file in corso", + "titleReceiving": "Ricezione di file in corso", + "savedToGallery": "Salvato in Galleria", + "total": { + "title": { + "sending": "Progresso complessivo ({time})", + "finishedError": "Terminato con errore", + "canceledSender": "Annullato dal mittente", + "canceledReceiver": "Annullato dal destinatario" + }, + "count": "File: {curr} / {n}", + "size": "Dimensione: {curr} / {n}", + "speed": "Velocità: {speed}/s" + }, + "remainingTime": { + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Usa 'h' come abbreviazione per ore e 'm' per minuti", + "@days": "Usa 'd' per giorni, 'h' per ore, e 'm' per minuti", + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}" + } + }, + "webSharePage": { + "title": "Condividi tramite link", + "loading": "Avvio del server…", + "stopping": "Arresto del server…", + "error": "Si è verificato un errore durante l'avvio del server.", + "openLink": { + "one": "Apri questo link nel browser:", + "other": "Apri uno di questi link nel browser:" + }, + "requests": "Richieste", + "noRequests": "Ancora nessuna richiesta.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Accetta automaticamente le richieste", + "requirePin": "Richiedi PIN", + "pinHint": "Il PIN è \"{pin}\"", + "encryptionHint": "LocalSend utilizza un certificato autofirmato. Devi accettarlo nel browser.", + "pendingRequests": "Richieste in sospeso: {n}" + }, + "aboutPage": { + "title": "Informazioni su LocalSend", + "description": [ + "LocalSend è un'app gratuita e open-source che consente di condividere file e messaggi in modo sicuro con dispositivi vicini sulla tua rete locale, senza bisogno di una connessione internet.", + "Quest'app è disponibile su Android, iOS, macOS, Windows e Linux. Puoi trovare tutte le opzioni di download sulla homepage ufficiale." + ], + "author": "Autore", + "contributors": "Contributori", + "packagers": "Packager", + "translators": "Traduttori" + }, + "donationPage": { + "title": "Dona", + "info": "LocalSend è gratuito, open-source e privo di pubblicità. Se ti piace l'applicazione, puoi supportarne lo sviluppo con una donazione.", + "donate": "Dona {amount}", + "thanks": "Grazie per il tuo supporto!", + "restore": "Ripristina acquisti" + }, + "changelogPage": { + "title": "Changelog" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Eredita dalla versione inglese" + }, + "dialogs": { + "addFile": { + "title": "Aggiungi alla selezione", + "content": "Cosa vuoi aggiungere?" + }, + "openFile": { + "title": "Apri file", + "content": "Vuoi aprire il file ricevuto?" + }, + "addressInput": { + "title": "Inserisci l'indirizzo", + "hashtag": "Hashtag", + "ip": "Indirizzo IP", + "recentlyUsed": "Usato di recente: " + }, + "cancelSession": { + "title": "Interrompi trasferimento", + "content": "Sei sicuro di voler interrompere il trasferimento?" + }, + "cannotOpenFile": { + "title": "Impossibile aprire il file", + "content": "Impossibile aprire \"{file}\". Hai spostato, rinominato o eliminato il file?" + }, + "encryptionDisabledNotice": { + "title": "Crittografia disabilitata", + "content": "La comunicazione ora avviene tramite il protocollo HTTP non crittografato. Per usare il protocollo crittografato HTTPS, abilita la crittografia." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Preferiti", + "noFavorites": "Non ci sono ancora dispositivi preferiti.", + "addFavorite": "Aggiungi" + }, + "favoriteDeleteDialog": { + "title": "Rimuovi dai preferiti", + "content": "Sei davvero sicuro di voler rimuovere \"{name}\" dai preferiti?" + }, + "favoriteEditDialog": { + "titleAdd": "Aggiungi ai preferiti", + "titleEdit": "Modifica", + "name": "Nome del dispositivo", + "auto": "(automatico)", + "ip": "Indirizzo IP", + "port": "Porta" + }, + "fileInfo": { + "title": "Informazioni sul file", + "fileName": "Nome del file:", + "path": "Percorso:", + "size": "Dimensione:", + "sender": "Mittente:", + "time": "Ora:" + }, + "fileNameInput": { + "title": "Inserisci nome file", + "original": "Originale: {original}" + }, + "historyClearDialog": { + "title": "Cancella cronologia", + "content": "Vuoi davvero eliminare l'intera cronologia?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend non può trovare altri dispositivi senza il permesso per la scansione della rete locale. Puoi concedere questo permesso nelle impostazioni.", + "gotoSettings": "Impostazioni" + }, + "messageInput": { + "title": "Scrivi un messaggio", + "multiline": "Multilinea" + }, + "noFiles": { + "title": "Nessun file selezionato", + "content": "Seleziona almeno un file." + }, + "noPermission": { + "title": "Nessun permesso", + "content": "Non hai concesso le autorizzazioni necessarie. Si prega di concederle nelle impostazioni." + }, + "notAvailableOnPlatform": { + "title": "Non disponibile", + "content": "Questa funzione è disponibile solo su:" + }, + "qr": { + "title": "Codice QR" + }, + "quickActions": { + "title": "Azioni rapide", + "counter": "Contatore", + "prefix": "Prefisso", + "padZero": "Riempi con zero", + "sortBeforeCount": "Preordina alfabeticamente (A-Z)", + "random": "Casuale" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Le richieste di file ora vengono accettate automaticamente. Tieni presente che chiunque abbia accesso alla tua rete locale può inviarti file." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Ora le richieste di file vengono accettate automaticamente dai dispositivi presenti nell'elenco dei preferiti.", + "Attenzione! Al momento, questa soluzione non è del tutto sicura, poiché un hacker che possiede l'impronta digitale di un qualsiasi dispositivo presente nella tua lista dei preferiti può inviarti file senza restrizioni.", + "Tuttavia, questa opzione è comunque più sicura rispetto al consentire a tutti gli utenti della rete locale di inviarti file senza restrizioni." + ] + }, + "pin": { + "title": "Inserisci il PIN" + }, + "sendModeHelp": { + "title": "Modalità di invio", + "single": "Invia file a un destinatario. Gli elementi saranno deselezionati dopo il trasferimento dei file.", + "multiple": "Invia file a più destinatari. Gli elementi non saranno deselezionati dopo il trasferimento dei file.", + "link": "I destinatari che non hanno installato LocalSend possono scaricare i file selezionati aprendo il link nel loro browser." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Il nome del file non può essere vuoto", + "invalid": "Il nome del file contiene dei caratteri non validi" + }, + "tray": { + "@info": "Le linee guida Apple sono molto rigide riguardo alla dicitura \"chiudi\".", + "open": "@:general.open", + "close": "Esci da LocalSend", + "closeWindows": "Uscita" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Inserisci il PIN", + "invalidPin": "PIN non valido", + "tooManyAttempts": "Troppi tentativi", + "rejected": "Rifiutato", + "files": "File", + "fileName": "Nome del file", + "size": "Dimensione" + }, + "assetPicker": { + "@info": "Traduzioni per lo strumento di selezione multimediale per Android e iPhone", + "confirm": "Conferma", + "cancel": "Annulla", + "edit": "Modifica", + "gifIndicator": "GIF", + "loadFailed": "Caricamento fallito", + "original": "Origine", + "preview": "Anteprima", + "select": "Seleziona", + "emptyList": "Lista vuota", + "unSupportedAssetType": "Tipo di file non supportato.", + "unableToAccessAll": "Impossibile accedere a tutti i file sul dispositivo", + "viewingLimitedAssetsTip": "Visualizza solo file e album accessibili dall'app.", + "changeAccessibleLimitedAssets": "Clicca per aggiornare i file accessibili", + "accessAllTip": "L'app può accedere solo ad alcuni file sul dispositivo. Vai alle impostazioni di sistema e consenti all'app di accedere a tutti i file multimediali sul dispositivo.", + "goToSystemSettings": "Vai alle impostazioni di sistema", + "accessLimitedAssets": "Continua con accesso limitato", + "accessiblePathName": "File accessibili", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Immagine", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Altri media", + "sActionPlayHint": "riproduci", + "sActionPreviewHint": "anteprima", + "sActionSelectHint": "seleziona", + "sActionSwitchPathLabel": "cambia percorso", + "sActionUseCameraHint": "usa fotocamera", + "sNameDurationLabel": "durata", + "sUnitAssetCountLabel": "conteggio" + }, + "networkInterfacesPage": { + "title": "Interfacce di rete", + "info": "Per impostazione predefinita, LocalSend utilizza tutte le interfacce di rete disponibili. È possibile escludere le reti indesiderate. È necessario riavviare il server per applicare le modifiche.", + "preview": "Anteprima", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + } +} diff --git a/app/assets/i18n/ja.json b/app/assets/i18n/ja.json new file mode 100644 index 0000000..a56f46d --- /dev/null +++ b/app/assets/i18n/ja.json @@ -0,0 +1,461 @@ +{ + "locale": "日本語", + "appName": "LocalSend", + "general": { + "accept": "承諾", + "accepted": "承諾済み", + "add": "追加", + "advanced": "詳細", + "cancel": "キャンセル", + "close": "閉じる", + "confirm": "確認", + "continueStr": "続行", + "copy": "コピー", + "copiedToClipboard": "クリップボードにコピーしました", + "decline": "拒否", + "done": "完了", + "delete": "削除", + "edit": "編集", + "error": "エラー", + "example": "例", + "files": "ファイル", + "finished": "完了しました", + "hide": "隠す", + "off": "オフ", + "offline": "オフライン", + "on": "オン", + "online": "オンライン", + "open": "開く", + "queue": "順番待ち", + "quickSave": "クイックセーブ", + "quickSaveFromFavorites": "「お気に入り」からクイックセーブ", + "renamed": "改名済み", + "reset": "リセット", + "restart": "再起動", + "settings": "設定", + "skipped": "スキップ済み", + "start": "開始", + "stop": "停止", + "save": "保存", + "unchanged": "変更なし", + "unknown": "不明", + "noItemInClipboard": "クリップボードにアイテムがありません" + }, + "receiveTab": { + "title": "受信", + "infoBox": { + "ip": "IP:", + "port": "ポート:", + "alias": "別名:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "お気に入り", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "送信", + "selection": { + "title": "選択", + "files": "ファイル数: {files}", + "size": "サイズ: {size}" + }, + "picker": { + "file": "ファイル", + "folder": "フォルダー", + "media": "メディア", + "text": "テキスト", + "app": "アプリ", + "clipboard": "ペースト" + }, + "shareIntentInfo": "モバイルデバイスの「共有」機能を使うと、より簡単にファイルを選択できます。", + "nearbyDevices": "近くのデバイス", + "thisDevice": "このデバイス", + "scan": "デバイスを検索", + "manualSending": "手動送信", + "sendMode": "送信モード", + "sendModes": { + "single": "一対一送信", + "multiple": "一対多送信", + "link": "リンク経由で共有" + }, + "sendModeHelp": "説明", + "help": "目標のデバイスが同じWi-Fiネットワーク内にあることを確認してください。", + "placeItems": "共有するアイテムを配置してください。" + }, + "settingsTab": { + "title": "設定", + "general": { + "title": "一般", + "brightness": "明るさ", + "brightnessOptions": { + "system": "システム", + "dark": "ダーク", + "light": "ライト" + }, + "color": "カラー", + "colorOptions": { + "system": "システム", + "oled": "OLED" + }, + "language": "言語", + "languageOptions": { + "system": "システム" + }, + "saveWindowPlacement": "終了時: ウィンドウ配置を記憶", + "saveWindowPlacementWindows": "終了時にウィンドウ配置を記憶", + "minimizeToTray": "終了時: トレイに最小化", + "launchAtStartup": "ログイン時に自動で起動", + "launchMinimized": "自動起動時: 隠れた状態で開始", + "showInContextMenu": "コンテキストメニューにLocalSendを表示", + "animations": "アニメーション" + }, + "receive": { + "title": "受信", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "自動で完了", + "destination": "保存先", + "downloads": "(ダウンロード)", + "saveToGallery": "メディアをギャラリーに保存", + "saveToHistory": "履歴に保存" + }, + "send": { + "title": "送信", + "shareViaLinkAutoAccept": "リンク経由で共有時: 自動で承諾" + }, + "network": { + "title": "ネットワーク", + "needRestart": "設定を反映するにはサーバーを再起動してください!", + "server": "サーバー", + "alias": "別名", + "deviceType": "デバイスタイプ", + "deviceModel": "デバイスモデル", + "port": "ポート", + "discoveryTimeout": "探索がタイムアウトしました", + "useSystemName": "システム名を使用", + "generateRandomAlias": "ランダムな別名を生成", + "portWarning": "ポートが変更されているため、このデバイスが他のデバイスから検出されなくなる場合があります。(デフォルト: {defaultPort})", + "encryption": "暗号化", + "multicastGroup": "マルチキャスト", + "multicastGroupWarning": "マルチキャストアドレスが変更されているため、他のデバイスから検出されなくなる場合があります。(デフォルト: {defaultMulticast})", + "network": "ネットワーク", + "networkOptions": { + "all": "すべて", + "filtered": "フィルター" + } + }, + "other": { + "title": "その他", + "support": "LocalSendを支援", + "donate": "寄付", + "privacyPolicy": "プライバシーポリシー", + "termsOfUse": "利用規約" + }, + "advancedSettings": "詳細設定" + }, + "troubleshootPage": { + "title": "トラブルシューティング", + "subTitle": "アプリが期待通りに動作しませんか?ここでは一般的な解決策を紹介します。", + "solution": "解決策:", + "fixButton": "自動で修正する", + "firewall": { + "symptom": "このアプリから他のデバイスへはファイルを送信できるのに、他のデバイスからこのデバイスへはファイルが送信できない。", + "solution": "ファイアウォールに問題があると思われます。ポート {port} の受け入れ (UDPとTCP) を許可することでこの問題を解決できます。", + "openFirewall": "ファイアウォールを開く" + }, + "noDiscovery": { + "symptom": "このデバイスで他のデバイスを見つけられない。", + "solution": "すべてのデバイスが同じWi-Fiネットワーク上にあり、各種設定(ポート、マルチキャストアドレス、暗号化)が一致していることを確認してください。もしくは、送信先デバイスのIPアドレスを手動で入力することもできます。これでうまくいく場合は、そのデバイスをお気に入りに追加して、今後自動的に検出できるようにすることもご検討ください。" + }, + "noConnection": { + "symptom": "どちらのデバイスも互いに表示されず、ファイルも共有できない。", + "solution": "双方で問題が発生している場合は、両方のデバイスが同じWi-Fiネットワーク上にあり、ポート・マルチキャストアドレス・暗号化の設定が一致していることを確認してください。Wi-Fiネットワークが接続者同士の通信を許可していない可能性もあります。その場合は、ルーターの設定でそれを許可する必要があります。" + } + }, + "receiveHistoryPage": { + "title": "履歴", + "openFolder": "フォルダを開く", + "deleteHistory": "履歴を消去", + "empty": "履歴には何もありません。", + "entryActions": { + "open": "ファイルを開く", + "showInFolder": "フォルダーに表示", + "info": "情報", + "deleteFromHistory": "履歴から削除" + } + }, + "apkPickerPage": { + "title": "アプリ (APK)", + "excludeSystemApps": "システムアプリを除外", + "excludeAppsWithoutLaunchIntent": "起動できないアプリを除外", + "apps": "{n} 個" + }, + "selectedFilesPage": { + "deleteAll": "すべて削除" + }, + "receivePage": { + "subTitle": { + "one": "がファイルを送信しようとしています。", + "other": "が {n} 件のファイルを送信しようとしています。" + }, + "subTitleMessage": "がメッセージを送信しました:", + "subTitleLink": "がリンクを送信しました:", + "canceled": "送信者がリクエストをキャンセルしました。" + }, + "receiveOptionsPage": { + "title": "オプション", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend フォルダー)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "ディレクトリーがあるため自動で無効になっています。" + }, + "sendPage": { + "waiting": "返答を待っています...", + "rejected": "受信者がリクエストを拒否しました。", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "受信者は他のリクエストの処理中です。" + }, + "progressPage": { + "titleSending": "ファイルを送信中", + "titleReceiving": "ファイルを受信中", + "savedToGallery": "写真に保存しました", + "total": { + "title": { + "sending": "総進捗 ({time})", + "finishedError": "エラーで終了しました", + "canceledSender": "送信者によりキャンセルされました", + "canceledReceiver": "受信者よりキャンセルされました" + }, + "count": "ファイル: {curr} / {n}", + "size": "サイズ: {curr} / {n}", + "speed": "速度: {speed}/s" + }, + "remainingTime": { + "@hours": "時間の略語には「h」、分の略語には「m」を使用します", + "@days": "日には「d」、時間には「h」、分には「m」を使用します" + } + }, + "webSharePage": { + "title": "リンク経由で共有", + "loading": "サーバーを起動中...", + "stopping": "サーバーを停止中...", + "error": "サーバーの起動中にエラーが発生しました。", + "openLink": { + "one": "このリンクをブラウザーで開いてください:", + "other": "これらのリンクのいずれかをブラウザーで開いてください:" + }, + "requests": "リクエスト", + "noRequests": "リクエストはまだありません。", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "自動でリクエストを承諾する", + "requirePin": "PINコードを要求", + "pinHint": "PINコードは \"{pin}\" です", + "encryptionHint": "LocalSendは自己署名証明書を使用しているため、ブラウザーで証明書を許可する必要があります。", + "pendingRequests": "保留中のリクエスト数: {n}" + }, + "aboutPage": { + "title": "LocalSendについて", + "description": [ + "LocalSendは無料のオープンソースアプリで、インターネットに接続することなく、ローカルネットワーク経由で近くにあるデバイスとファイルやメッセージを安全に共有することができます。", + "本アプリはAndroid、iOS、macOS、Windows、Linuxで利用でき、公式ホームページからダウンロードすることができます。" + ], + "author": "制作者", + "contributors": "貢献者", + "packagers": "パッケージ協力者", + "translators": "翻訳者" + }, + "donationPage": { + "title": "寄付", + "info": "LocalSendは無料かつオープンソースで、広告を一切含みません。もしアプリを気に入っていただけたら、寄付で開発を支援することができます。", + "donate": "{amount} 寄付する", + "thanks": "ありがとうございます!", + "restore": "購入を復元する" + }, + "changelogPage": { + "title": "更新履歴" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "選択に追加", + "content": "何を追加しますか?" + }, + "openFile": { + "title": "ファイルを開く", + "content": "受信したファイルを開きますか?" + }, + "addressInput": { + "title": "アドレスを入力", + "hashtag": "ハッシュタグ", + "ip": "IPアドレス", + "recentlyUsed": "最近使用したアドレス: " + }, + "cancelSession": { + "title": "ファイル転送をキャンセル", + "content": "本当にファイル転送をキャンセルしますか?" + }, + "cannotOpenFile": { + "title": "ファイルを開けません", + "content": "\"{file}\"を開けませんでした。ファイルが移動、改名、削除された可能性があります。" + }, + "encryptionDisabledNotice": { + "title": "暗号化は無効です", + "content": "これより、通信は暗号化されていないHTTPプロトコルで行われます。HTTPSを使用するには、暗号化を再度有効にしてください。" + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "お気に入り", + "noFavorites": "お気に入りしたデバイスがありません。", + "addFavorite": "追加" + }, + "favoriteDeleteDialog": { + "title": "お気に入りから削除", + "content": "本当に\"{name}\"をお気に入りから削除しますか?" + }, + "favoriteEditDialog": { + "titleAdd": "お気に入りに追加", + "titleEdit": "編集", + "name": "別名", + "auto": "(自動)", + "ip": "IPアドレス", + "port": "ポート" + }, + "fileInfo": { + "title": "ファイルの情報", + "fileName": "ファイル名:", + "path": "ファイルパス:", + "size": "サイズ:", + "sender": "送信者:", + "time": "時間:" + }, + "fileNameInput": { + "title": "ファイル名を入力", + "original": "元の名前: {original}" + }, + "historyClearDialog": { + "title": "履歴をクリア", + "content": "本当にすべての履歴を削除しますか?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "ローカルネットワークをスキャンする権限がないと、LocalSendは他のデバイスを見つけることができません。設定よりこの権限を付与してください。", + "gotoSettings": "設定" + }, + "messageInput": { + "title": "メッセージを入力", + "multiline": "複数行" + }, + "noFiles": { + "title": "ファイルが選択されていません", + "content": "少なくとも1つのファイルを選択してください。" + }, + "noPermission": { + "title": "権限がありません", + "content": "必要な権限を許可していません。設定で許可してください。" + }, + "notAvailableOnPlatform": { + "title": "利用不可", + "content": "この機能は次のプラットフォームでのみ利用できます:" + }, + "qr": { + "title": "QRコード" + }, + "quickActions": { + "title": "クイックアクション", + "counter": "カウンター", + "prefix": "接頭辞", + "padZero": "先頭をゼロで埋める", + "sortBeforeCount": "事前にアルファベット順で並べる", + "random": "ランダム" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "ファイルリクエストが自動で承諾されます。ローカルネットワーク内の全員がファイルを送信できるので注意してください。" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "お気に入りリストにあるデバイスからのファイルリクエストを自動的に受け入れます。", + "警告 現時点では、お気に入りリストのデバイスと一致するフィンガープリントがあればハッカーが無制限にファイルを送信できてしまうため、この設定は完全に安全とは言えません。", + "ですが、この設定はローカルネットワーク上のすべてのユーザーに無制限のファイル送信を許可するよりはまだ安全です。" + ] + }, + "pin": { + "title": "PINコードを入力" + }, + "sendModeHelp": { + "title": "送信モード", + "single": "単一の受信者にファイルを送信します。ファイルの転送完了後、選択は解除されます。", + "multiple": "複数の受信者にファイルを送信します。ファイルの選択は解除されません。", + "link": "LocalSendをインストールしていない受信者でも、ブラウザでリンクを開くことで選択したファイルをダウンロードできます。" + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "ファイル名は空にできません", + "invalid": "ファイル名に無効な文字が含まれています" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "LocalSendを終了", + "closeWindows": "終了" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "PINコードを入力", + "invalidPin": "PINコードが無効です", + "tooManyAttempts": "試行回数が多すぎます", + "rejected": "拒否済み", + "files": "ファイル", + "fileName": "ファイル名", + "size": "サイズ" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "確認", + "cancel": "キャンセル", + "edit": "編集", + "gifIndicator": "GIF", + "loadFailed": "読み込みに失敗しました", + "original": "元の画像", + "preview": "プレビュー", + "select": "選択", + "emptyList": "リストが空です", + "unSupportedAssetType": "未対応のファイル形式です。", + "unableToAccessAll": "デバイス上のすべてのファイルにアクセスできません", + "viewingLimitedAssetsTip": "アプリからアクセス可能なファイルやアルバムのみを表示します。", + "changeAccessibleLimitedAssets": "クリックしてアクセス可能なファイルを設定する", + "accessAllTip": "アプリが端末の一部のファイルにしかアクセスできません。システム設定を開き、アプリがデバイス上のすべてのメディアにアクセスすることを許可してください。", + "goToSystemSettings": "システム設定に移動", + "accessLimitedAssets": "限定されたアクセスで続ける", + "accessiblePathName": "アクセス可能なファイル", + "sTypeAudioLabel": "音声", + "sTypeImageLabel": "画像", + "sTypeVideoLabel": "動画", + "sTypeOtherLabel": "その他のメディア", + "sActionPlayHint": "再生", + "sActionPreviewHint": "プレビュー", + "sActionSelectHint": "選択", + "sActionSwitchPathLabel": "パスを切り替え", + "sActionUseCameraHint": "カメラを使う", + "sNameDurationLabel": "長さ", + "sUnitAssetCountLabel": "個数" + }, + "networkInterfacesPage": { + "preview": "プレビュー", + "blacklist": "ブラックリスト", + "whitelist": "ホワイトリスト", + "title": "ネットワークインターフェース", + "info": "デフォルトでは、LocalSend は利用可能なすべてのネットワークインターフェースを使用します。不要なネットワークを除外するには、ここで設定できます。変更を適用するには、サーバーを再起動する必要があります。" + } +} diff --git a/app/assets/i18n/km.json b/app/assets/i18n/km.json new file mode 100644 index 0000000..af23a74 --- /dev/null +++ b/app/assets/i18n/km.json @@ -0,0 +1,520 @@ +{ + "locale": "ភាសាខ្មែរ", + "appName": "LocalSend", + "general": { + "accept": "ទទួល", + "accepted": "បានទទួល", + "add": "បន្ថែម", + "advanced": "កម្រិតខ្ពស់", + "cancel": "បោះបង់", + "close": "បិទ", + "confirm": "បញ្ជាក់", + "continueStr": "បន្ត", + "copy": "ចម្លង", + "copiedToClipboard": "បានចម្លងទៅឃ្លីបប៊ត", + "decline": "បដិសេធ", + "done": "រួចរាល់", + "delete": "លុប", + "edit": "កែប្រែ", + "error": "មានបញ្ហា", + "example": "ឧទាហរណ៍", + "files": "ឯកសារ", + "finished": "រួចរាល់ហើយ", + "hide": "លាក់", + "off": "បិទ", + "offline": "អហ្វឡាញ", + "on": "បើក", + "online": "អនឡាញ", + "open": "បើក", + "queue": "តម្រៀបជួរ", + "quickSave": "រក្សាទុករហ័ស", + "quickSaveFromFavorites": "រក្សាទុករហ័សសម្រាប់ \"ឧបករណ៍សំណព្វ\"", + "renamed": "បានកែឈ្មោះ", + "reset": "អាន់ឌូផ្លាស់ប្ដូរ", + "restart": "ចាប់ផ្តើមឡើងវិញ", + "settings": "ការកំណត់", + "skipped": "រំលង", + "start": "ចាប់ផ្តើម", + "stop": "បញ្ឈប់", + "save": "រក្សាទុក", + "unchanged": "មិនបានផ្លាស់ប្តូរ", + "unknown": "មិនស្គាល់", + "noItemInClipboard": "មិនមានធាតុនៅក្នុងឃ្លីបប៊ត។" + }, + "receiveTab": { + "title": "ការទទួល", + "infoBox": { + "ip": "អាយភី៖", + "port": "ច្រក៖", + "alias": "ឈ្មោះឧបករណ៍៖" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "ឧបករណ៍សំណព្វ", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "ការផ្ញើ", + "selection": { + "title": "ការជ្រើសរើស", + "files": "ឯកសារ៖ {files}", + "size": "ទំហំ៖ {size}" + }, + "picker": { + "file": "ឯកសារ", + "folder": "ថតឯកសារ", + "media": "មាតិកា", + "text": "សំណេរ", + "app": "កម្មវិធី", + "clipboard": "បិទភ្ជាប់" + }, + "shareIntentInfo": "អ្នកក៏អាចប្រើប្រាស់មុខងារ \"ចែករំលេក\" ក្នុងទូរសព្ទចល័តរបស់អ្នក ដើម្បីរើសឯកសារឱ្យកាន់តែងាយស្រួល។", + "nearbyDevices": "ឧបករណ៍ដែលនៅជិតនេះ", + "thisDevice": "ឧបករណ៍នេះ", + "scan": "កំពុងរកមើលឧបករណ៍", + "manualSending": "ផ្ញើដោយខ្លួនឯង", + "sendMode": "ប្រភេទនៃការផ្ញើ", + "sendModes": { + "single": "អ្នកទទួលតែម្នាក់", + "multiple": "អ្នកទទួលច្រើននាក់", + "link": "ចែករំលែកតាមតំណភ្ជាប់" + }, + "sendModeHelp": "ការពន្យល់", + "help": "សូមប្រាកដថាទីតាំងដែលអ្នកចង់ផ្ញើគឺត្រូវតែភ្ជាប់បណ្តាញ Wi-Fi តែមួយដូចគ្នា។", + "placeItems": "ដាក់ធាតុដែលត្រូវចែករំលែក។" + }, + "settingsTab": { + "title": "ការកំណត់", + "general": { + "title": "ទិដ្ឋភាពទូទៅ", + "brightness": "ស្បែកកម្មវិធី", + "brightnessOptions": { + "system": "តាមប្រព័ន្ធ", + "dark": "ងងឹត", + "light": "ភ្លឺ" + }, + "color": "ពណ៌", + "colorOptions": { + "system": "តាមប្រព័ន្ធ", + "oled": "OLED" + }, + "language": "ភាសា", + "languageOptions": { + "system": "តាមប្រព័ន្ធ" + }, + "saveWindowPlacement": "រក្សាទុកផ្ទាំងវីនដូ ក្រោយពេលចាកចេញ", + "saveWindowPlacementWindows": "រក្សាទុកទីតាំងផ្ទាំងអេក្រង់នៅដដែលបន្ទាប់ពីចាកចេញ", + "minimizeToTray": "ចាកចេញ: បង្រួមអប្បបរមាទៅរបារម៉ឺនុយ", + "launchAtStartup": "ចាប់ផ្តើមដោយស្វ័យប្រវត្តិបន្ទាប់ពីចូលគណនី", + "launchMinimized": "ចាប់ផ្តើមដោយស្វ័យប្រវត្តិ: ការចាប់ផ្តើមត្រូវបានលាក់", + "showInContextMenu": "បង្ហាញ LocalSend in នៅលើរបារម៉ឺនុយ", + "animations": "ចលនារស់រវើក" + }, + "receive": { + "title": "ការទទួល", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "បញ្ចប់ដោយស្វ័យប្រវត្តិ", + "destination": "រក្សាទុកនៅឯថត", + "downloads": "(ទាញយក)", + "saveToGallery": "រក្សាទុកទៅកាន់កម្មវិធីវិចិត្រសាល", + "saveToHistory": "រក្សាទុកទៅកាន់ប្រវត្តិ" + }, + "send": { + "title": "ផ្ញើ", + "shareViaLinkAutoAccept": "ទទួលការស្នើដោយស្វ័យប្រវត្តិនៅក្នុងម៉ូដ\"ចែករំលែកតាមរយៈតំណភ្ជាប់\"" + }, + "network": { + "title": "បណ្តាញ", + "needRestart": "ចាប់ផ្តើម server ឡើងវិញដើម្បីអនុវត្តការកំណត់នេះ!", + "server": "Server", + "alias": "ឈ្មោះផ្សេងទៀត", + "deviceType": "ប្រភេទឧបករណ៍", + "deviceModel": "ម៉ូឌែលរបស់ឧបករណ៍", + "port": "ច្រក", + "discoveryTimeout": "ថេរវេលាក្នុងការស្វែងរក", + "useSystemName": "ប្រើប្រាស់ឈ្មោះរបស់ប្រព័ន្ធ", + "generateRandomAlias": "បង្កើតឈ្មោះដទៃដោយដៃចៃដន្យ", + "portWarning": "អ្នកប្រហែលជាមិនត្រូវបានរកឃើញដោយឧបករណ៍ផ្សេងទៀតទេ ដោយសារតែអ្នកកំពុងប្រើច្រកដែលបង្កើតផ្ទាល់ខ្លួន។ (ច្រកដើម: {defaultPort})", + "encryption": "ការការពារទិន្នន័យ", + "multicastGroup": "អាសយដ្ឋានពហុផ្សាយ", + "multicastGroupWarning": "អ្នកប្រហែលជាមិនត្រូវបានរកឃើញដោយឧបករណ៍ផ្សេងទៀតទេ ដោយសារតែអ្នកកំពុងប្រើអាសយដ្ឋានពហុផ្សាយដែលបង្កើតផ្ទាល់ខ្លួន។ (ច្រកដើម: {defaultMulticast})", + "network": "បណ្តាញ", + "networkOptions": { + "all": "ទាំងអស់", + "filtered": "បានតម្រង" + } + }, + "other": { + "title": "ផ្សេងៗ", + "support": "ជួយគាំទ្រ LocalSend", + "donate": "ការឧបត្ថម្ភ", + "privacyPolicy": "ច្បាប់ស្តីអំពីឯកជនភាព", + "termsOfUse": "លក្ខខណ្ឌនៃការប្រើប្រាស់" + }, + "advancedSettings": "ការកំណត់កម្រិតខ្ពស់" + }, + "troubleshootPage": { + "title": "ដោះស្រាយបញ្ហា", + "subTitle": "កម្មវិធីនេះមិនដំណើរការដូចការរំពឹងទុកមែនទេ? សូមមើលដំណោះស្រាយមួយចំនួននេះ។", + "solution": "ដំណោះស្រាយ:", + "fixButton": "ជួសជុលដោយស្វ័យប្រវត្តិ", + "firewall": { + "symptom": "​កម្មវិធីនេះអាចផ្ញើឯកសារទៅឧបករណ៍ផ្សេងទៀត ប៉ុន្តែឧបករណ៍ផ្សេងទៀតមិនអាចផ្ញើឯកសារមកឧបករណ៍នេះបានទេ។", + "solution": "នេះទំនងជាបញ្ហារបស់ Firewall ។ អ្នកអាចដោះស្រាយវាបានដោយអនុញ្ញាតឱ្យមានការតភ្ជាប់ចូល (UDP និង TCP) តាមរយៈច្រក {port}។", + "openFirewall": "បើក Firewall" + }, + "noDiscovery": { + "symptom": "ឧបករណ៍នេះហាក់ដូចមិនអាចស្វែងរកឧបករណ៍ផ្សេងបានទេ។", + "solution": "សូមប្រាកដថាគ្រប់ឧបករណ៍ទាំងអស់ត្រូវតែស្ថិតក្នុងបណ្តាញ Wi-Fi តែមួយរួមគ្នា និងត្រូវមានការកំណត់រួមមួយដូចគ្នា (ផត, អាសយដ្ឋាន multicast, កូដនីយកម្ម ជាដើម)។ អ្នកអាចធ្វើការសាកល្បងវាយបញ្ចូលអាសយដ្ឋាន IP របស់ឧបករណ៍គោលដៅមួយទៀតដោយខ្លួនឯង។ បើធ្វើបែបនេះទៅដំណើរការ, អ្នកគួរតែបន្ថែម ឬបញ្ចូលឧបករណ៍នោះទៅក្នុងបញ្ជីឧបករណ៍សំណព្វដើម្បីងាយស្រួលក្នុងការស្វែងរក និងធ្វើប្រតិបត្តិការនាពេលក្រោយទៀតដោយស្វ័យប្រវត្តិ និងងាយស្រួល។" + }, + "noConnection": { + "symptom": "ឧបករណ៍ទាំងពីរមិនអាចរកឃើញគ្នាទៅវិញទៅមក ហើយក៏មិនអាចចែករំលែកឯកសារបានដែរ។", + "solution": "បញ្ហា​កើត​មាន​ទាំង​សង​ខាង? បន្ទាប់មកអ្នកត្រូវប្រាកដថាឧបករណ៍ទាំងពីរស្ថិតនៅក្នុងបណ្តាញ wifi ដូចគ្នា និងចែករំលែកការកំណត់ដូចគ្នា (ច្រក អាសយដ្ឋានពហុផ្សាយ ការអ៊ិនគ្រីបទិន្នន័យ)។ Wi-Fi ប្រហែលជាមិនអនុញ្ញាតឱ្យទំនាក់ទំនងរវាងអ្នកចូលរួមទេ។ ក្នុងករណីនេះជម្រើសត្រូវតែបើកនៅលើរ៉ោតទ័រ។" + } + }, + "receiveHistoryPage": { + "title": "ប្រវត្តិ", + "openFolder": "បើកថតឯកសារ", + "deleteHistory": "លុបប្រវត្តិ", + "empty": "មិនមានប្រវត្តិទេ", + "entryActions": { + "open": "បើកឯកសារ", + "showInFolder": "បង្ហាញនៅក្នុងកម្មវិធីឯកសារ", + "info": "ព័ត៌មាននៃឯកសារ", + "deleteFromHistory": "លុបចោលពីប្រវត្តិ" + } + }, + "apkPickerPage": { + "title": "កម្មវិធី (APK)", + "excludeSystemApps": "ដកចេញកម្មវិធីរបស់ប្រព័ន្ធ", + "excludeAppsWithoutLaunchIntent": "ដកចេញកម្មវិធីដែលមិនអាចបើកបាន", + "apps": "{n} កម្មវិធី" + }, + "selectedFilesPage": { + "deleteAll": "លុបទាំងអស់" + }, + "receivePage": { + "subTitle": { + "one": "ចង់ផ្ញើឯកសារមួយឲ្យមកអ្នក។", + "other": "ចង់ផ្ញើឯកសារ {n} ឲ្យមកអ្នក។" + }, + "subTitleMessage": "បានផ្ញើសារមួយមកអ្នក:", + "subTitleLink": "បានផ្ញើតំណភ្ជាប់មួយមកអ្នក:", + "canceled": "អ្នកផ្ញើបានបោះបង់សំណើរហើយ។" + }, + "receiveOptionsPage": { + "title": "ជម្រើស", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(ថតឯកសារ LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "បានបិទដោយស្វ័យប្រវត្តិ ដោយសារមានថតស្រាប់ហើយ។" + }, + "sendPage": { + "waiting": "កំពុងរង់ចាំការឆ្លើយតប...", + "rejected": "អ្នកទទួលបានបដិសេធសំណើនេះ។", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "អ្នកទទួលកំពុងជាប់រវល់ជាមួយសំណើផ្សេងទៀត។" + }, + "progressPage": { + "titleSending": "កំពុងផ្ញើឯកសារ", + "titleReceiving": "កំពុងទទួលឯកសារ", + "savedToGallery": "បានរក្សាទុកក្នុងកម្មវិធីរូបថត", + "total": { + "title": { + "sending": "រយៈពេលប្រតិបត្តិការសរុប ({time})", + "finishedError": "បានបញ្ចប់ជាមួយនឹងបញ្ហា", + "canceledSender": "ត្រូវបានបោះបង់ដោយអ្នកផ្ញើ", + "canceledReceiver": "ត្រូវបានបោះបង់ដោយអ្នកទទួល" + }, + "count": "ឯកសារ: {curr} / {n}", + "size": "ទំហំ: {curr} / {n}", + "speed": "ល្បឿន: {speed}/s" + } + }, + "webSharePage": { + "title": "ចែករំលែកតាមតំណភ្ជាប់", + "loading": "កំពុងចាប់ផ្តើម server...", + "stopping": "កំពុងបញ្ឈប់ server...", + "error": "មានកំហុសមួយបានកើតឡើងអំឡុងពេលចាប់ផ្តើម server ។", + "openLink": { + "one": "បើកតំណនេះនៅក្នុងកម្មវិធី browser:", + "other": "បើកតំណមួយក្នុងចំណោមតំណភ្ជាប់ទាំងនេះក្នុងកម្មវិធី browser:" + }, + "requests": "ការស្នើសុំ", + "noRequests": "មិនទាន់មានសំណើនៅឡើយ។", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "ទទួលយកការស្នើរដោយស្វ័យប្រវត្តិ", + "requirePin": "ត្រូវការលេខកូដ", + "pinHint": "លេខកូដគឺ \"{pin}\"", + "encryptionHint": "LocalSend ប្រើវិញ្ញាបនបត្រដែលចុះហត្ថលេខាដោយខ្លួនឯង។ អ្នកត្រូវទទួលយកវានៅក្នុងកម្មវិធី​ browser ។", + "pendingRequests": "សំណើដែលកំពុងរង់ចាំ: {n}" + }, + "aboutPage": { + "title": "អំពី LocalSend", + "description": [ + "LocalSend គឺជាកម្មវិធីដែលប្រើដោយឥតគិតថ្លៃ និងបើកចំហនូវប្រភពកូដ ដែលអនុញ្ញាតឱ្យអ្នកអាចចែករំលែកឯកសារ និងសារដោយសុវត្ថិភាពជាមួយនឹងឧបករណ៍ដែលនៅជិតៗដែលនៅលើបណ្តាញមូលដ្ឋានរួមគ្នាដោយមិនចាំបាច់ភ្ជាប់អ៊ីនធឺណិត។", + "កម្មវិធីនេះគឺអាចដំណើរការនៅលើគ្រប់ប្រព័ន្ធប្រតិបត្តិការទាំងអស់រួមមានដូចជា Android, iOS, macOS, Windows និង Linux ។ អ្នកអាចស្វែងរក និងទាញយកបានច្រើនវិធីសាស្ត្រតាមរយៈគេហទំព័រផ្លូវការរបស់ LocalSend ។" + ], + "author": "ម្ចាស់កម្មសិទ្ធ", + "contributors": "អ្នកចូលរួមចំណែក", + "packagers": "អ្នកបង្កើតកញ្ចប់កម្មវិធី Package", + "translators": "អ្នកបកប្រែ" + }, + "donationPage": { + "title": "ការឧបត្ថម្ភ", + "info": "LocalSend ជាកម្មវិធីដែលឥតគិតថ្លៃ, បើកបង្ហាញប្រភពកូដជាសាធារណៈ និងមិនមានការបង្ហាញនូវផ្ទាំងពាណិជ្ជកម្មរំខានឡើយ។ ប្រសិនបើអ្នកពេញចិត្តកម្មវិធីនេះ​ និងចង់ជួយពួកយើង, អ្នកអាចចូលរួមលើកស្ទួយការអភិវឌ្ឍន៍កម្មវិធីនេះជាមួយពួកយើងតាមរយៈការឧបត្ថម្ភជាថវិកា។", + "donate": "ឧបត្ថម្ភចំនួន {amount}", + "thanks": "អរគុណអ្នកខ្លាំងណាស់សម្រាប់ការឧបត្ថម្ភមកកាន់ពួកយើង!", + "restore": "ស្តារការទូទាត់ត្រឡប់មកវិញ" + }, + "changelogPage": { + "title": "កំណត់ត្រាការផ្លាស់ប្តូរ" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "មូលដ្ឋានផ្សេងគ្នាអាចមានពាក្យផ្សេងគ្នា វាប្រហែលជាមិនត្រូវគ្នានឹង 1:1 ទេ។", + "adjectives": [ + "គួរអោយស្រលាញ់", + "ស្រស់ស្អាត", + "ធំ", + "ភ្លឺចែកចាំង", + "ស្អាត", + "ពូកែ", + "ឡូយ", + "គួរអោយស្រលាញ់", + "គួរអោយទាក់ទាញ", + "ហ្មត់ចត់", + "មានថាមពល", + "សន្សំសំចៃ", + "អស្ចារ្យ", + "លឿន", + "ល្អ", + "ស្រស់ស្រាយ", + "ល្អ", + "ស្រស់ស្អាត", + "ល្អណាស់", + "សង្ហា", + "ទាក់ទាញ", + "រួសរាយ", + "គួរអោយស្រលាញ់", + "អាថ៌កំបាំង", + "គួរអោយសរសើរ", + "ល្អ", + "អត់ធ្មត់", + "ស្រស់ស្អាត", + "មានអំណាច", + "អ្នកមាន", + "សម្ងាត់", + "ឆ្លាតវៃ", + "រឹងមាំ", + "ពិសេស", + "យុទ្ធសាស្ត្រ", + "រឹងប៉ឹង", + "ផ្ជិតផ្ចង់", + "ប្រាជ្ញា" + ], + "fruits": [ + "ផ្លែប៉ោម", + "ផ្លែបឺរ", + "ផ្លែចេក", + "ផ្លែ Blackberry", + "ផ្លែ Blueberry", + "ផ្កាខាត់ណាខៀវ", + "ផ្លែការ៉ុត", + "ផ្លែឆឺរី", + "ផ្លែដូង", + "ផ្លែទំពាំងបាយជូ", + "ផ្លែក្រូចឆ្មា", + "បន្លែ", + "ផ្លែស្វាយ", + "ផ្លែឪឡឹក", + "ផ្សិត", + "ខ្ទឹមបារាំង", + "ផ្លែក្រូច", + "ផ្លែល្ហុង", + "ផ្លែប៉េស", + "ផ្លែសឺរី", + "ផ្លែម្នាស់", + "ដំឡូង", + "ផ្លែល្ពៅ", + "ផ្លែ Raspberry", + "ផ្លែស្ត្របឺរី", + "ផ្លែប៉េងប៉ោះ" + ], + "combination": "{adjective} {fruit}", + "@combination": "នៅក្នុងភាសាខ្លះ គុណនាមអាចនឹងនៅខាងក្រោយនាមវិញ។" + }, + "dialogs": { + "addFile": { + "title": "បន្ថែមទៅការជ្រើសរើស", + "content": "តើអ្នកចង់បន្ថែមអ្វី?" + }, + "openFile": { + "title": "បើកឯកសារ", + "content": "តើអ្នកចង់បើកឯកសារដែលទទួលបាននេះមែនទេ??" + }, + "addressInput": { + "title": "បញ្ចូលអាសយដ្ឋាន", + "hashtag": "Hashtag", + "ip": "អាស័យដ្ឋាន IP", + "recentlyUsed": "បានប្រើថ្មីៗនេះ: " + }, + "cancelSession": { + "title": "បោះបង់ការផ្ទេរឯកសារ", + "content": "តើអ្នកពិតជាចង់បោះបង់ការផ្ទេរឯកសារមែនទេ?" + }, + "cannotOpenFile": { + "title": "មិនអាចបើកឯកសារបានទេ", + "content": "មិនអាចបើកបានទេ \"{file}\"។ តើឯកសារនេះត្រូវបានផ្លាស់ទី ប្តូរឈ្មោះ ឬលុបមែនទេ?" + }, + "encryptionDisabledNotice": { + "title": "បានបិទការអ៊ិនគ្រីបទិន្នន័យ", + "content": "ឥឡូវនេះការទំនាក់ទំនងកើតឡើងតាមរយៈពិធីការ HTTP ដែលមិនបានអ៊ិនគ្រីបការពារទិន្នន័យ។ ដើម្បីប្រើ HTTPS សូមបើកការអ៊ិនគ្រីបទិន្នន័យម្តងទៀត។" + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "ឧបករណ៍សំណព្វ", + "noFavorites": "មិនទាន់មានឧបករណ៍សំណព្វនៅឡើយទេ", + "addFavorite": "បន្ថែម" + }, + "favoriteDeleteDialog": { + "title": "លុបចេញពីឧបករណ៍សំណព្វ", + "content": "តើអ្នកប្រាកដដែរឬទេថាចង់ដក \"{name}\" ចេញពីឧបករណ៍សំណព្វ?" + }, + "favoriteEditDialog": { + "titleAdd": "បន្ថែមទៅកាន់ឧបករណ៍សំណព្វ", + "titleEdit": "ការកំណត់", + "name": "ឈ្មោះឧបករណ៍", + "auto": "(auto)", + "ip": "អាសយដ្ឋាន IP", + "port": "ច្រក" + }, + "fileInfo": { + "title": "ព័ត៌មាននៃឯកសារ", + "fileName": "ឈ្មោះ​ឯកសារ:", + "path": "ទីតាំង:", + "size": "ទំហំ:", + "sender": "អ្នកផ្ញើ:", + "time": "រយៈពេល:" + }, + "fileNameInput": { + "title": "បញ្ចូលឈ្មោះឯកសារ", + "original": "ច្បាប់ដើម: {original}" + }, + "historyClearDialog": { + "title": "លុបជម្រះប្រវត្តិ", + "content": "តើអ្នកប្រាកដទេថាចង់លុបនូវរាល់ប្រវត្តិនៃការប្រើប្រាស់ទាំងអស់នេះ?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend មិន​អាច​រក​ឃើញ​ឧបករណ៍​ផ្សេង​ទៀត​ដោយ​មិន​មាន​ការ​អនុញ្ញាត​ក្នុង​ការ​ស្កែន​បណ្តាញរួមគ្នា​ទេ។ សូមផ្តល់ការអនុញ្ញាតនេះនៅក្នុងការកំណត់។", + "gotoSettings": "ការកំណត់" + }, + "messageInput": { + "title": "សរសេរសារ", + "multiline": "ពហុជួរ" + }, + "noFiles": { + "title": "គ្មានឯកសារត្រូវបានជ្រើសរើសទេ។", + "content": "សូមជ្រើសរើសយ៉ាងហោចណាស់មួយឯកសារ។" + }, + "noPermission": { + "title": "គ្មានការអនុញ្ញាត", + "content": "អ្នកមិន​ទាន់ត្រូវបានផ្តល់ការអនុញ្ញាតទេ។ សូមផ្តល់ឱ្យពួកគេនៅក្នុងការកំណត់។" + }, + "notAvailableOnPlatform": { + "title": "មិនដំណើរការ", + "content": "មុខងារនេះអាចប្រើបានតែនៅលើ:" + }, + "qr": { + "title": "កូដ QR" + }, + "quickActions": { + "title": "សកម្មភាពរហ័ស", + "counter": "Counter", + "prefix": "បុព្វបទ", + "padZero": "Pad with zeros", + "sortBeforeCount": "តម្រៀបតាមអក្ខរក្រមជាមុន", + "random": "ចៃដន្យ" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "សំណើឯកសារត្រូវបានទទួលយកដោយស្វ័យប្រវត្តិ។ ត្រូវ​ចំណាំ​ថា​អ្នក​រាល់​គ្នា​នៅ​ក្នុង​បណ្ដាញ​មូលដ្ឋាន​រួមគ្នាអាច​ផ្ញើ​ឯកសារ​មក​អ្នកបាន។" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "ឥឡូវនេះសំណើឯកសារត្រូវបានទទួលយកដោយស្វ័យប្រវត្តិពីឧបករណ៍ទាំងឡាយដែលមាននៅក្នុងបញ្ជីឧបករណ៍សំណព្វរបស់អ្នក។", + "ការព្រមាន៖ ពេលនេះជម្រើស ឬមុខងារមួយនេះមិនទាន់មានសុវត្ថិភាពទាំងស្រុងទេ និងណែនាំឲ្យប្រើប្រាស់នៅឡើយទេ ពីព្រោះជនអនាមិកដែលវាយប្រហារតាមប្រព័ន្ធបច្ចេកវិទ្យា ដែលស្គាល់ស្នាមដាននៃឧបករណ៍សំណព្វរបស់អ្នក អាចនឹងផ្ញើឯកសារផ្សេងៗមកអ្នកបាន។", + "ទោះ​ជា​យ៉ាង​ណាក៏ដោយ ជម្រើស​នេះ​នៅ​តែ​មាន​សុវត្ថិភាព​ជាង​ការ​អនុញ្ញាត​ឱ្យ​ឧបករណ៍​ទាំងអស់អាចផ្ញើមកអ្នកដោយសេរី​។" + ] + }, + "pin": { + "title": "វាយបញ្ចូលលេខកូដ" + }, + "sendModeHelp": { + "title": "របៀបនៃការផ្ញើ", + "single": "ផ្ញើឯកសារទៅអ្នកទទួលម្នាក់។ ការជ្រើសរើសនឹងត្រូវបានសម្អាតបន្ទាប់ពីការផ្ទេរឯកសារបានបញ្ចប់។", + "multiple": "ផ្ញើឯកសារទៅអ្នកទទួលច្រើននាក់។ ការជ្រើសរើសនឹងមិនត្រូវបានសម្អាតទេ។", + "link": "អ្នកទទួលដែលមិនបានដំឡើង LocalSend អាចទាញយកឯកសារដែលបានជ្រើសរើសដោយបើកតំណនៅក្នុងកម្មវិធី browser របស់ពួកគេ។" + }, + "zoom": { + "title": "តំណភ្ជាប់ URL" + } + }, + "sanitization": { + "empty": "ឈ្មោះឯកសារមិនអាចទទេបានទេ", + "invalid": "ឈ្មោះឯកសារមានផ្ទុកនូវតួអក្សរដែលមិនត្រឹមត្រូវ" + }, + "tray": { + "@info": "Apple Guidelines មានភាពតឹងរ៉ឹងខ្លាំងចំពោះពាក្យ 'បិទ' ។", + "open": "@:general.open", + "close": "ចាកចេញពីកម្មវិធី LocalSend", + "closeWindows": "ចាកចេញ" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "សូមបញ្ចូលលេខកូដ", + "invalidPin": "លេខកូដមិនត្រឹមត្រូវ", + "tooManyAttempts": "ចំនួននៃការប៉ុនប៉ងបញ្ចូលច្រើនដងពេកហើយ", + "rejected": "បានបដិសេធ", + "files": "ឯកសារ", + "fileName": "ឈ្មោះឯកសារ", + "size": "ទំហំ" + }, + "assetPicker": { + "@info": "ការបកប្រែសម្រាប់ឧបករណ៍ជ្រើសរើសមាតិកាសម្រាប់ទូរស័ព្ទ Android និង Iphone", + "confirm": "បញ្ជាក់", + "cancel": "បោះបង់", + "edit": "កែសម្រួល", + "gifIndicator": "រូបចលនា GIF", + "loadFailed": "ការផ្ទុកបរាជ័យ", + "original": "ប្រភពដើម", + "preview": "មើលលទ្ធផលទុកមុន", + "select": "ជ្រើសរើស", + "emptyList": "បញ្ជីទទេ", + "unSupportedAssetType": "ប្រភេទឯកសារដែលមិនគាំទ្រ។", + "unableToAccessAll": "មិនអាចចូលប្រើឯកសារទាំងអស់នៅលើឧបករណ៍បានទេ", + "viewingLimitedAssetsTip": "បានតែមើលឯកសារ និងអាល់ប៊ុមប៉ុណ្ណោះដែលអាចចូលដំណើរការបានក្នុងកម្មវិធី។", + "changeAccessibleLimitedAssets": "ចុចដើម្បីធ្វើបច្ចុប្បន្នភាពឯកសារដែលអាចចូលប្រើបាន។", + "accessAllTip": "កម្មវិធីអាចចូលប្រើបានតែឯកសារមួយចំនួននៅលើឧបករណ៍ប៉ុណ្ណោះ។ ចូលទៅកាន់ការកំណត់ប្រព័ន្ធ ហើយអនុញ្ញាតឱ្យកម្មវិធីចូលប្រើមាតិកាទាំងអស់នៅលើឧបករណ៍។", + "goToSystemSettings": "ចូលទៅកាន់ការកំណត់របស់ប្រព័ន្ធ", + "accessLimitedAssets": "បន្តជាមួយនឹងការចូលប្រើមានកំណត់", + "accessiblePathName": "ឯកសារដែលអាចចូលប្រើបាន", + "sTypeAudioLabel": "សម្លេង", + "sTypeImageLabel": "រូបភាព", + "sTypeVideoLabel": "វីដេអូ", + "sTypeOtherLabel": "មាតិកាផ្សេងទៀត", + "sActionPlayHint": "ចាក់", + "sActionPreviewHint": "មើលលទ្ធផលទុកមុន", + "sActionSelectHint": "ជ្រើសរើស", + "sActionSwitchPathLabel": "ប្តូរទីតាំង", + "sActionUseCameraHint": "ប្រើកាមេរ៉ា", + "sNameDurationLabel": "ថេរវេលា", + "sUnitAssetCountLabel": "ចំនួន" + } +} diff --git a/app/assets/i18n/ko.json b/app/assets/i18n/ko.json new file mode 100644 index 0000000..2d64d4d --- /dev/null +++ b/app/assets/i18n/ko.json @@ -0,0 +1,457 @@ +{ + "locale": "한국어", + "appName": "LocalSend", + "general": { + "accept": "수락", + "accepted": "수락됨", + "add": "추가", + "advanced": "상세", + "cancel": "취소", + "close": "닫기", + "confirm": "확인", + "continueStr": "계속", + "copy": "복사", + "copiedToClipboard": "클립보드에 복사했습니다", + "decline": "거부", + "done": "완료", + "delete": "삭제", + "edit": "편집", + "error": "에러", + "example": "예시", + "files": "파일", + "finished": "완료", + "hide": "숨김", + "off": "꺼짐", + "offline": "오프라인", + "on": "켜짐", + "online": "온라인", + "open": "열기", + "queue": "대기 중", + "quickSave": "빠른 저장", + "quickSaveFromFavorites": "\"즐겨찾기\"를 위한 빠른 저장", + "renamed": "이름 변경됨", + "reset": "변경사항 되돌리기", + "restart": "재시작", + "settings": "설정", + "skipped": "건너뜀", + "start": "시작", + "stop": "정지", + "save": "저장", + "unchanged": "변경사항 없음", + "unknown": "알 수 없음", + "noItemInClipboard": "클립보드가 비어있습니다." + }, + "receiveTab": { + "title": "받기", + "infoBox": { + "ip": "IP:", + "port": "포트:", + "alias": "별명:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "즐겨찾기", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "보내기", + "selection": { + "title": "선택", + "files": "파일 수: {files}", + "size": "크기: {size}" + }, + "picker": { + "file": "파일", + "folder": "폴더", + "media": "미디어", + "text": "텍스트", + "app": "앱", + "clipboard": "붙여넣기" + }, + "shareIntentInfo": "휴대전화의 '공유' 기능을 사용하면 보다 편리하게 파일을 선택할 수 있습니다", + "nearbyDevices": "근처 기기", + "thisDevice": "이 기기", + "scan": "기기 검색", + "manualSending": "수동 전송", + "sendMode": "전송 모드", + "sendModes": { + "single": "하나의 기기에 보내기", + "multiple": "여러 기기에 보내기", + "link": "링크로 공유하기" + }, + "sendModeHelp": "설명", + "help": "파일을 전송받을 기기도 동일한 Wi-Fi 네트워크에 연결되어 있어야 합니다.", + "placeItems": "드롭하여 공유하기" + }, + "settingsTab": { + "title": "설정", + "general": { + "title": "일반", + "brightness": "테마", + "brightnessOptions": { + "system": "시스템", + "dark": "다크", + "light": "라이트" + }, + "color": "색상", + "colorOptions": { + "system": "시스템", + "oled": "OLED" + }, + "language": "언어", + "languageOptions": { + "system": "시스템" + }, + "saveWindowPlacement": "종료 후 창 위치 기억", + "saveWindowPlacementWindows": "종료 후 창 위치 기억", + "minimizeToTray": "종료 시 시스템 트레이로 최소화", + "launchAtStartup": "로그인 시 자동으로 시작", + "launchMinimized": "최소화된 상태로 시작", + "showInContextMenu": "컨텍스트 메뉴에 LocalSend 표시", + "animations": "애니메이션" + }, + "receive": { + "title": "받기", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "자동 완료", + "destination": "저장 위치", + "downloads": "(다운로드 폴더)", + "saveToGallery": "갤러리에 미디어 저장", + "saveToHistory": "전송 기록 보관" + }, + "send": { + "title": "보내기", + "shareViaLinkAutoAccept": "\"링크로 공유하기\" 요청 자동 수락" + }, + "network": { + "title": "네트워크", + "needRestart": "변경 사항을 적용하려면 서버를 다시 시작하세요!", + "server": "서버", + "alias": "별명", + "deviceType": "기기 유형", + "deviceModel": "기기 모델", + "port": "포트", + "network": "네트워크", + "networkOptions": { + "all": "전체 허용", + "filtered": "일부 허용" + }, + "discoveryTimeout": "탐색 제한시간", + "useSystemName": "시스템 이름 사용", + "generateRandomAlias": "무작위 별명 생성", + "portWarning": "사용자 지정 포트를 사용하면 다른 장치에서 기기가 감지되지 않을 수 있습니다. (기본값: {defaultPort})", + "encryption": "암호화", + "multicastGroup": "멀티캐스트", + "multicastGroupWarning": "사용자 지정 멀티캐스트 주소를 사용하면 다른 장치에서 기기가 감지되지 않을 수 있습니다. (기본값: {defaultMulticast})" + }, + "other": { + "title": "기타", + "support": "LocalSend 후원하기", + "donate": "기부", + "privacyPolicy": "개인정보 처리 방침", + "termsOfUse": "이용 약관" + }, + "advancedSettings": "고급 설정" + }, + "troubleshootPage": { + "title": "문제 해결", + "subTitle": "앱이 제대로 작동하지 않나요? 이 곳에서 자주 발생하는 문제들에 대한 도움말을 찾을 수 있습니다.", + "solution": "도움말:", + "fixButton": "자동으로 해결하기", + "firewall": { + "symptom": "파일을 다른 기기로 보내는 데에는 문제가 없으나, 다른 기기로부터 파일을 받을 수 없는 경우", + "solution": "방화벽 설정으로 인한 문제일 가능성이 높습니다. {port} 포트로 들어오는 연결(UDP 및 TCP)을 허용하여 이 문제를 해결할 수 있습니다.", + "openFirewall": "방화벽 열기" + }, + "noDiscovery": { + "symptom": "현재 사용 중인 기기에서 다른 기기들이 감지되지 않는 경우", + "solution": "사용하려는 모든 기기가 동일한 Wi-Fi 네트워크에 연결되어 있고, 동일한 설정(포트, 멀티캐스트 주소, 암호화)이 적용되어 있는지 확인해보세요. 직접 상대의 IP 주소를 입력하여 기기를 추가할 수도 있습니다. 즐겨찾기에 등록하면 다음부터 자동으로 감지될 수 있습니다." + }, + "noConnection": { + "symptom": "양쪽 기기 모두 서로를 감지하지 못하거나, 파일을 전송할 수 없는 경우", + "solution": "양쪽 모두에 문제가 있는 경우, 두 기기가 동일한 Wi-Fi 네트워크에 연결되어 있고 동일한 설정(포트, 멀티캐스트 주소, 암호화)이 적용되어 있는지 확인해야 합니다. Wi-Fi 네트워크가 기기 간 통신을 허용하지 않는 경우일 수도 있습니다. 이 경우 라우터에서 관련 옵션을 수정해야 합니다." + } + }, + "networkInterfacesPage": { + "title": "네트워크 인터페이스", + "info": "기본적으로 LocalSend는 활용할 수 있는 모든 네트워크 인터페이스를 사용하도록 되어 있습니다. 원하지 않는 네트워크가 있다면 이 곳에서 비활성화할 수 있습니다. 변경사항을 적용하려면 서버를 다시 시작해야 합니다.", + "preview": "미리보기", + "whitelist": "허용 목록", + "blacklist": "거부 목록" + }, + "receiveHistoryPage": { + "title": "전송 기록", + "openFolder": "폴더 열기", + "deleteHistory": "기록 삭제", + "empty": "전송 기록이 비어 있습니다.", + "entryActions": { + "open": "파일 열기", + "showInFolder": "폴더에서 보기", + "info": "정보", + "deleteFromHistory": "기록에서 삭제" + } + }, + "apkPickerPage": { + "title": "앱 (APK)", + "excludeSystemApps": "시스템 앱 제외", + "excludeAppsWithoutLaunchIntent": "실행할 수 없는 앱 제외", + "apps": "{n} 개의 앱" + }, + "selectedFilesPage": { + "deleteAll": "모두 삭제" + }, + "receivePage": { + "subTitle": { + "one": "에서 파일을 보내려고 합니다", + "other": "에서 {n}개의 파일을 보내려고 합니다" + }, + "subTitleMessage": "에서 메시지를 보냈습니다:", + "subTitleLink": "에서 링크를 보냈습니다:", + "canceled": "보내는 사람이 요청을 취소했습니다." + }, + "receiveOptionsPage": { + "title": "설정", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend 폴더)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "폴더가 있어 자동으로 비활성화되었습니다." + }, + "sendPage": { + "waiting": "응답 대기 중…", + "rejected": "받는 사람이 요청을 거부했습니다", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "받는 사람이 다른 요청을 처리하는 중입니다." + }, + "progressPage": { + "titleSending": "파일 보내는 중", + "titleReceiving": "파일 받는 중", + "savedToGallery": "갤러리에 저장했습니다.", + "total": { + "title": { + "sending": "진행 시간 ({time})", + "finishedError": "에러와 함께 종료되었습니다", + "canceledSender": "보내는 사람에 의해 취소되었습니다", + "canceledReceiver": "받는 사람에 의해 취소되었습니다" + }, + "count": "파일: {curr} / {n}", + "size": "크기: {curr} / {n}", + "speed": "속도: {speed}/초" + } + }, + "webSharePage": { + "title": "링크로 공유하기", + "loading": "서버 시작 중...", + "stopping": "서버 중지 중...", + "error": "서버를 시작하는 도중 오류가 발생했습니다.", + "openLink": { + "one": "해당 링크를 브라우저에서 여세요:", + "other": "해당 링크들 중 하나를 브라우저에서 여세요:" + }, + "requests": "요청", + "noRequests": "아직 요청이 없습니다.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "요청 자동 수락", + "requirePin": "PIN 번호 사용", + "pinHint": "PIN 번호는 \"{pin}\" 입니다", + "encryptionHint": "LocalSend는 자체 서명된 인증서를 사용합니다. 브라우저에서 이를 허용해야 합니다.", + "pendingRequests": "대기 중인 요청: {n}" + }, + "aboutPage": { + "title": "LocalSend 정보", + "description": [ + "LocalSend는 인터넷에 연결하지 않고도 로컬 네트워크를 통해 주변 기기들과 파일 및 메시지를 안전하게 공유할 수 있는 무료 오픈소스 애플리케이션입니다.", + "이 앱은 Android, iOS, macOS, Windows 및 Linux에서 사용할 수 있습니다. 모든 다운로드 옵션은 공식 홈페이지에서 확인할 수 있습니다." + ], + "author": "작성자", + "contributors": "기여자", + "packagers": "패키지 관리자", + "translators": "번역가" + }, + "donationPage": { + "title": "기부", + "info": "LocalSend는 광고없이 무료로 제공되는 오픈소스 프로젝트입니다. 앱이 마음에 드신다면 후원을 통해 프로젝트 개발을 지원해주세요.", + "donate": "{amount} 기부하기", + "thanks": "진심으로 감사드립니다!", + "restore": "구매 복원" + }, + "changelogPage": { + "title": "변경사항" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "선택 파일 추가", + "content": "어떤 파일을 추가할까요?" + }, + "openFile": { + "title": "파일 열기", + "content": "전송받은 파일을 여시겠습니까?" + }, + "addressInput": { + "title": "주소 입력", + "hashtag": "해시태그", + "ip": "IP 주소", + "recentlyUsed": "최근 사용된 주소: " + }, + "cancelSession": { + "title": "파일 전송 취소", + "content": "정말로 파일 전송을 취소할까요?" + }, + "cannotOpenFile": { + "title": "열 수 없는 파일", + "content": "\"{file}\" 파일을 열 수 없습니다. 파일의 이름이 변경되었거나 이동 또는 삭제되었는지 확인해주세요." + }, + "encryptionDisabledNotice": { + "title": "암호화 비활성화", + "content": "이제부터 암호화되지 않은 HTTP 프로토콜을 사용해 파일을 주고 받습니다. HTTPS 프로토콜을 사용하려면 암호화를 다시 활성화해주세요." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "즐겨찾기", + "noFavorites": "즐겨찾기한 기기가 없습니다.", + "addFavorite": "추가" + }, + "favoriteDeleteDialog": { + "title": "즐겨찾기 삭제", + "content": "정말로 \"{name}\" 기기를 즐겨찾기에서 삭제하시겠습니까?" + }, + "favoriteEditDialog": { + "titleAdd": "즐겨찾기 추가", + "titleEdit": "편집", + "name": "별명", + "auto": "(자동)", + "ip": "IP 주소", + "port": "포트" + }, + "fileInfo": { + "title": "파일 정보", + "fileName": "파일 이름:", + "path": "경로:", + "size": "크기:", + "sender": "보낸 사람:", + "time": "시간:" + }, + "fileNameInput": { + "title": "파일 이름 입력", + "original": "기존 이름: {original}" + }, + "historyClearDialog": { + "title": "기록 삭제", + "content": "정말 모든 기록을 삭제하시겠습니까?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend가 다른 기기를 감지하려면 로컬 네트워크 탐색을 위한 권한이 필요합니다. 설정에서 권한을 허용해주세요.", + "gotoSettings": "설정" + }, + "messageInput": { + "title": "메시지 입력", + "multiline": "여러 줄" + }, + "noFiles": { + "title": "선택된 파일 없음", + "content": "적어도 하나 이상의 파일을 선택해주세요." + }, + "noPermission": { + "title": "권한 없음", + "content": "필요한 권한이 부여되지 않았습니다. 설정에서 권한을 허용해주세요." + }, + "notAvailableOnPlatform": { + "title": "사용 불가", + "content": "해당 기능은 다음 플랫폼에서만 사용할 수 있습니다:" + }, + "qr": { + "title": "QR 코드" + }, + "quickActions": { + "title": "퀵 액션", + "counter": "카운터", + "prefix": "접두어", + "padZero": "0으로 채우기", + "sortBeforeCount": "미리 알파벳순으로 정렬", + "random": "무작위" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "이제부터 파일 전송 요청이 자동으로 승인됩니다. 로컬 네트워크 상에 존재하는 모두가 당신에게 파일을 보낼 수 있다는 점을 명심하세요." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "이제부터 즐겨찾기 목록에 있는 기기에서 보내는 파일 전송 요청이 자동으로 승인됩니다.", + "다만, 이 기능은 아직 보안이 완벽하지 않으므로 주의가 필요합니다. 만약 해커가 즐겨찾기 기기의 식별 정보를 알아낸다면, 별다른 제한 없이 파일을 전송할 수도 있습니다.", + "그럼에도 불구하고, 로컬 네트워크 상에 존재하는 모든 기기로부터 파일 전송을 허용하는 것보다는 더 안전한 방법입니다." + ] + }, + "pin": { + "title": "PIN 번호 입력" + }, + "sendModeHelp": { + "title": "전송 모드", + "single": "파일을 하나의 기기에 보냅니다. 파일 전송이 완료된 후 선택 항목이 초기화됩니다.", + "multiple": "파일을 여러 기기에 보냅니다. 파일 전송이 완료된 뒤에도 선택 항목이 유지됩니다.", + "link": "LocalSend가 설치되지 않은 기기에서도 브라우저를 통해 링크에 접속하여 파일을 다운로드 받을 수 있습니다." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "파일 이름은 비워 둘 수 없습니다", + "invalid": "파일 이름에 잘못된 문자가 포함되어 있습니다" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "LocalSend 종료하기", + "closeWindows": "나가기" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "PIN 번호 입력", + "invalidPin": "PIN 번호가 올바르지 않습니다", + "tooManyAttempts": "시도 횟수를 초과했습니다", + "rejected": "거부됨", + "files": "파일", + "fileName": "파일 이름", + "size": "크기" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "확인", + "cancel": "취소", + "edit": "편집", + "gifIndicator": "GIF", + "loadFailed": "불러오기 실패", + "original": "원본", + "preview": "미리보기", + "select": "선택", + "emptyList": "목록이 비어있음", + "unSupportedAssetType": "지원하지 않는 파일 유형입니다.", + "unableToAccessAll": "기기의 모든 파일에 접근할 수 없습니다.", + "viewingLimitedAssetsTip": "앱에서 접근할 수 있는 파일과 앨범만 볼 수 있습니다.", + "changeAccessibleLimitedAssets": "접근이 허용된 파일 목록을 갱신하려면 클릭하세요.", + "accessAllTip": "앱은 기기의 일부 파일에만 접근할 수 있습니다. 설정으로 이동하여 앱이 모든 미디어에 접근할 수 있도록 허용해주세요.", + "goToSystemSettings": "설정으로 이동", + "accessLimitedAssets": "제한된 접근으로 계속하기", + "accessiblePathName": "접근 가능한 파일", + "sTypeAudioLabel": "오디오", + "sTypeImageLabel": "이미지", + "sTypeVideoLabel": "비디오", + "sTypeOtherLabel": "기타 미디어", + "sActionPlayHint": "재생", + "sActionPreviewHint": "미리보기", + "sActionSelectHint": "선택", + "sActionSwitchPathLabel": "경로 변경", + "sActionUseCameraHint": "카메라 사용", + "sNameDurationLabel": "길이", + "sUnitAssetCountLabel": "개수" + } +} diff --git a/app/assets/i18n/ml.json b/app/assets/i18n/ml.json new file mode 100644 index 0000000..3a4e597 --- /dev/null +++ b/app/assets/i18n/ml.json @@ -0,0 +1,443 @@ +{ + "general": { + "edit": "തിരുത്തുക", + "accept": "സ്വീകരിക്കുക", + "accepted": "അംഗീകരിച്ചു", + "add": "ചേർക്കുക", + "advanced": "അഡ്വാൻസ്ഡ്", + "cancel": "വേണ്ടെന്നു വയ്ക്കുക", + "confirm": "സ്ഥിരീകരിക്കുക", + "continueStr": "തുടരുക", + "copy": "പകർത്തുക", + "decline": "നിരസിക്കുക", + "delete": "നീക്കം ചെയ്യുക", + "error": "തകരാറ്", + "example": "ഉദാഹരണം", + "files": "ഫയലുകൾ", + "finished": "പൂർത്തിയാക്കി", + "hide": "മറയ്ക്കുക", + "save": "സേവ്", + "close": "അവസാനിപ്പിക്കുക", + "copiedToClipboard": "ക്ലിപ്പ്ബോർഡിലേക്ക് കോപ്പി ചെയ്തു", + "done": "ചെയ്തു കഴിഞ്ഞു", + "off": "നിർത്തുക", + "offline": "പ്രവർത്തനക്ഷമമല്ല", + "on": "തുടങ്ങുക", + "online": "പ്രവർത്തനക്ഷമമായി", + "open": "തുറക്കുക", + "queue": "കാത്തുനിൽക്കുക", + "quickSave": "വേഗത്തിൽ സേവ് ചെയ്യുക", + "quickSaveFromFavorites": "വേഗത്തിൽ ഫേവറിറ്റ് ആയി സേവ് ചെയ്യുക", + "renamed": "പേര് മാറ്റി", + "reset": "മാറ്റങ്ങൾ ഇല്ലാതാക്കുക", + "restart": "വീണ്ടും തുടങ്ങുക", + "settings": "സജ്ജീകരണങ്ങൾ", + "skipped": "വിട്ടു കളഞ്ഞു", + "start": "ആരംഭിക്കുക", + "stop": "നിർത്തുക", + "unchanged": "മാറ്റമില്ലാത്ത", + "unknown": "അജ്ഞാതമായ", + "noItemInClipboard": "ക്ലിപ്ബോർഡിൽ ഒന്നും ഇല്ല." + }, + "appName": "ലോക്കൽസെൻഡ്‌", + "locale": "മലയാളം", + "sendTab": { + "shareIntentInfo": "താങ്കൾക്ക് മൊബൈലിലെ ഷെയർ ഫീച്ചർ ഉപയോഗിച്ചു എളുപ്പത്തിൽ ഫയൽസ് സെലക്ട് ചെയ്യാം.", + "title": "അയക്കുക", + "selection": { + "title": "തിരഞ്ഞെടുക്കപ്പെട്ടത്", + "files": "ഫയലുകൾ:{files}", + "size": "വലുപ്പം : {size}" + }, + "picker": { + "file": "ഫയൽ", + "folder": "ഫോൾഡർ", + "media": "മീഡിയ", + "text": "ടെക്സ്റ്റ്", + "app": "ആപ്പ്", + "clipboard": "പേസ്റ്റ്" + }, + "nearbyDevices": "അടുത്തുള്ള ഉപകരണങ്ങൾ", + "thisDevice": "ഈ ഉപകരണം", + "scan": "സെർച്ച് ഡിവൈസസ്", + "manualSending": "മാന്വലായി അയക്കുക", + "sendMode": "അയക്കുന്ന രീതി", + "sendModes": { + "single": "സ്വീകരിക്കുന്നയാൾ", + "multiple": "സ്വീകരിക്കുന്നവർ", + "link": "ലിങ്ക് ഉപയോഗിച് ഷെയർ ചെയ്യുക" + }, + "sendModeHelp": "വിശദീകരണം", + "help": "ലഭിക്കേണ്ടയാളും ഒരേ WIFI യിൽ കണക്റ്റഡ് ആണെന്ന് ഉറപ്പു വരുത്തുക.", + "placeItems": "ഷെയർ ചെയ്യേണ്ട ഐറ്റംസ് ഇടുക." + }, + "receiveTab": { + "title": "സ്വീകരിക്കുക", + "infoBox": { + "ip": "IP:", + "port": "port:", + "alias": "പേര് :" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "പ്രിയപ്പെട്ട", + "on": "@:general.on" + } + }, + "settingsTab": { + "general": { + "saveWindowPlacementWindows": "എക്സിറ് ആയ ശേഷം ഇപ്പോൾ ഉള്ള വിൻഡോ പൊസിഷൻ സേവ് ചെയ്യുക", + "showInContextMenu": "കണ്ടെക്സ്റ് മെനുവിൽ ഈ അപ്ലിക്കേഷൻ കാണിക്കുക", + "title": "പൊതുവായത്", + "brightness": "തീം", + "brightnessOptions": { + "system": "സിസ്റ്റം", + "dark": "ഇരുണ്ട", + "light": "വെളിച്ചമുള്ള" + }, + "color": "നിറം", + "colorOptions": { + "system": "സിസ്റ്റം", + "oled": "OLED" + }, + "language": "ഭാഷ", + "languageOptions": { + "system": "സിസ്റ്റം" + }, + "saveWindowPlacement": "എക്സിറ് ആയ ശേഷം ഇപ്പോൾ ഉള്ള വിന്ഡോ പൊസിഷൻ സേവ് ചെയ്യുക", + "minimizeToTray": "ക്ലോസ് ചെയ്യുന്ന സമയത്തു മെനുബാറിലേക്കോ/സിസ്റ്റം ട്രയിലേക്കോ മിനിമൈസ് ചെയ്യുക", + "launchAtStartup": "ലോഗിൻ ആയ ശേഷം താനേ പ്രവർത്തിക്കുക", + "launchMinimized": "താനെ പ്രവർത്തിക്കുക: തുടങ്ങുമ്പോൾ ഹൈഡ് ആയി തുടങ്ങുക", + "animations": "അനിമേഷനുകൾ" + }, + "network": { + "needRestart": "പതിയ മാറ്റങ്ങൾ അപ്ലൈ ചെയ്യാൻ സെർവർ റീസ്റ്റാർട്ട് ചെയ്യുക!", + "title": "നെറ്റ്‌വർക്ക്", + "server": "സെർവർ", + "deviceType": "ഡിവൈസിന്റെ തരം", + "alias": "ഡിവൈസിന്റെ പേര്", + "deviceModel": "ഡിവൈസിന്റെ മോഡൽ", + "port": "Port", + "network": "നെറ്റ്‌വർക്ക്", + "networkOptions": { + "all": "മുഴുവൻ", + "filtered": "ഫിൽറ്റർ ചെയ്യപ്പെട്ട" + }, + "discoveryTimeout": "ഡിസ്കവർ ചെയ്യാനുള്ള സമയം കഴിഞ്ഞു", + "useSystemName": "ഈ സിസ്റ്റത്തിന്റെ പേര് ഉപയോഗിക്കുക", + "generateRandomAlias": "ഒരു ആകസ്മികമായ മറുപേർ ഉണ്ടാക്കുക", + "portWarning": "നിങ്ങൾ ഒരു ഇഷ്ടാനുസൃത പോർട്ട് ഉപയോഗിക്കുന്നതിനാൽ മറ്റ് ഉപകരണങ്ങൾക്ക് നിങ്ങളെ കണ്ടെത്താൻ കഴിഞ്ഞേക്കില്ല. (default: {defaultPort})", + "encryption": "എൻക്രിപ്ഷൻ", + "multicastGroup": "മൾട്ടികാസ്റ്റ് അഡ്രസ്സ്", + "multicastGroupWarning": "നിങ്ങൾ ഒരു ഇഷ്ടാനുസൃത മൾട്ടികാസ്റ്റ് വിലാസം ഉപയോഗിക്കുന്നതിനാൽ മറ്റ് ഡിവൈസുകൾ നിങ്ങളെ കണ്ടെത്തിയേക്കില്ല. (default : {defaultMulticast})" + }, + "receive": { + "saveToGallery": "മീഡിയ ഫയൽസ് ഗാലറിയിലേക്ക് സേവ് ചെയ്യുക", + "title": "സ്വീകരിക്കുന്ന", + "autoFinish": "ഓട്ടോമാറ്റിക് ആയി ഫിനിഷ് ചെയ്യുക", + "destination": "ഫോൾഡറിലേക്കു സേവ് ചെയ്യുക", + "downloads": "(ഡൗൻലോഡ്)", + "saveToHistory": "ഹിസ്റ്ററിയിലേക്കു സേവ് ചെയ്യുക", + "requirePin": "@:webSharePage.requirePin", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites" + }, + "send": { + "shareViaLinkAutoAccept": "\"ലിങ്ക് വഴി ഷെയർ\" ചെയ്യുമ്പോൾ ഓട്ടോമാറ്റിക് ആയി സ്വീകരിക്കുക", + "title": "അയക്കുക" + }, + "title": "ക്രമീകരണങ്ങൾ", + "other": { + "privacyPolicy": "സ്വകാര്യത നയം", + "support": "ലോക്കൽ സെൻഡ് പിന്തുണ നൽകുക", + "donate": "സംഭാവന ചെയ്യുക", + "termsOfUse": "ഉപയോഗ നിബന്ധനകൾ", + "title": "മറ്റുള്ളവ" + }, + "advancedSettings": "അഡ്വാൻസ്‌ഡ് ക്രമീകരണങ്ങൾ" + }, + "assetPicker": { + "accessLimitedAssets": "മുഴുവൻ ആക്സസ് ഇല്ലാതെ തന്നെ മുന്നോട് പോവുക", + "accessAllTip": "ഈ ഡിവൈസ്സിലെ കുറച്ച ഫയൽസ് മാത്രമേ അക്സസ്സ് ചെയ്യാൻ പറ്റുന്നുള്ളു . സിസ്റ്റം സെറ്റിങ്‌സിൽ നിന്നും അനുവദിക്കുക.", + "sNameDurationLabel": "ദൈർഖ്യം", + "@info": "ഐഫോണിന്റെയും ആൻഡ്രോയിഡ്ന്റെയും മീഡിയ സെക്ഷൻ ടൂളിന്റെ ട്രാൻസിലേഷൻ", + "confirm": "ഉറപ്പാക്കുക", + "cancel": "വേണ്ടെന്നു വയ്ക്കുക", + "edit": "മാറ്റം വരുത്തുക", + "gifIndicator": "GIF", + "loadFailed": "ലോഡ് ചെയ്യാൻ പരാജയപെട്ടു", + "original": "ഉത്ഭവം", + "preview": "സ്വകാര്യപ്രദർശനം", + "select": "തിരഞ്ഞെടുക്കുക", + "emptyList": "ഒഴിഞ്ഞ ലിസ്റ്റ്", + "unSupportedAssetType": "ഫയൽ ടൈപ് സപ്പോർട്ട് ചെയ്യുന്നില്ല.", + "unableToAccessAll": "ഈ ഡിവൈസ്സിലെ മുഴുവൻ ഫയൽസും അക്സസ്സ് ചെയ്യാൻ പറ്റുന്നില്ല", + "viewingLimitedAssetsTip": "വ്യൂ ഫയൽസും കൂടെ ആൽബവും മാത്രമേ അക്സസ്സ് ചെയ്യാൻ പറ്റുന്നുള്ളു.", + "changeAccessibleLimitedAssets": "ആക്സിസിബിൾ ആയിട്ടുള്ള ഫയൽസ് അപ്ഡേറ്റ് ചെയ്യാൻ ക്ലിക്ക് ചെയ്യുക", + "goToSystemSettings": "സിസ്റ്റം സെറ്റിങ്‌സിലേക്കു പോവുക", + "accessiblePathName": "അക്സസ്സ് ചെയ്യാൻ പറ്റുന്ന ഫയലുകൾ", + "sTypeAudioLabel": "ഓഡിയോ", + "sTypeImageLabel": "ഇമേജ്", + "sTypeVideoLabel": "വീഡിയോ", + "sTypeOtherLabel": "മറ്റു തരത്തിലുള്ളവ", + "sActionPlayHint": "പ്രവർത്തനം തുടങ്ങുക", + "sActionPreviewHint": "സ്വകാര്യപ്രദർശനം", + "sActionSelectHint": "തിരഞ്ഞെടുക്കുക", + "sActionSwitchPathLabel": "Path മാറ്റുക", + "sActionUseCameraHint": "ക്യാമറ ഉപയോഗിക്കുക", + "sUnitAssetCountLabel": "എണ്ണം" + }, + "web": { + "tooManyAttempts": "ഒരുപാട് തവണ തെറ്റായി ട്രൈ ചെയ്തു", + "fileName": "ഫയലിന്റെ പേര്", + "size": "സൈസ്", + "enterPin": "PIN എന്റർ ചെയ്യുക", + "invalidPin": "PIN തെറ്റാണു", + "rejected": "തള്ളിക്കളയപെട്ടു", + "files": "ഫയലുകൾ" + }, + "dialogs": { + "quickSaveFromFavoritesNotice": { + "content": [ + "നിങ്ങളുടെ ഫേവറൈറ്സ് ഉള്ള ഡിവൈസുകളിൽ നിന്നും ഓട്ടോമാറ്റിക് ആയി റിക്വസ്റ്റ് അക്സെപ്റ് ചെയ്യും.", + "മുന്നറിയിപ്പ് ! നിങ്ങളുടെ ഡിവൈസിനെ കുറിച്ച ഡീറ്റൈൽ ആയി അറിയാവുന്ന ഒരു ഹാക്കർക്ക് ,നേരിട്ട് ഫയൽ നിങ്ങള്ക്ക് അയക്കാൻ പറ്റും.", + "എന്നിരുന്നാലും , ഈ ഓപ്ഷൻ ലോക്കൽ നെറ്റ്‌വർക്കലെ എല്ലാവരെയും ഫയൽ സെൻറ് ചെയ്യാൻ അനുവദിക്കുന്നതിനേക്കാളും സേഫ് ആണ്." + ] + }, + "sendModeHelp": { + "link": "ലോക്കൽസെൻഡ്‌ ഇൻസ്റ്റാൾ ചെയ്തവർക് ഈ ലിങ്ക് ബ്രൗസറിൽ ഓപ്പൺ ചെയ്ത ഫയൽ ഡൌൺലോഡ് ചെയ്യാം.", + "title": "അയക്കാൻ പറ്റുന്ന രീതികൾ", + "single": "ഫയൽസ് എല്ലാം ഒരാൾക്ക് അയക്കുക, അയച്ചു കഴിഞ്ഞ ശേഷം സെക്ഷൻ ക്ലീൻ ചെയ്യപ്പെടും.", + "multiple": "ഫയൽസ് കുറേപേർക്കു അയക്കുക, അയച്ചു കഴിഞ്ഞ ശേഷം സെക്ഷൻ ക്ലീൻ ചെയ്യപ്പെടില്ല ." + }, + "pin": { + "title": "PIN എന്റർ ചെയ്യുക" + }, + "zoom": { + "title": "URL" + }, + "encryptionDisabledNotice": { + "content": "എൻക്രിപ്ട് ചെയ്യാത്ത HTTP പ്രോട്ടോകോൾ വഴിയാണ് ഇപ്പോൾ ആശയ വിനിമയം നടക്കുന്നത്. HTTPS പ്രോട്ടോകോൾ ഉപയോഗിക്കാൻ എൻക്രിപ്ഷൻ ഓൺ ചെയ്യുക.", + "title": "എൻക്രിപ്ഷൻ ഓഫ് ചെയ്തു" + }, + "localNetworkUnauthorized": { + "description": "അനുവാദം ഇല്ലാതെ ലോക്കൽ നെറ്റ്‌വർക്ക് സ്കാൻ ചെയ്തു മറ്റു ഡിവൈസുകൾ കണ്ടുപിടിക്കാൻ ലോക്കൽസെന്റിന്‌ കഴിയില്ല. ദയവായി സെറ്റിങ്സിൽ ഇതിനുള്ള അനുവാദം നൽകുക.", + "gotoSettings": "സജ്ജീകരണങ്ങൾ" + }, + "addFile": { + "title": "തിരഞ്ഞെടുത്തതിലേക്കു ചേർക്കുക", + "content": "എന്താണ് നിങ്ങൾക്കു ചേർക്കേണ്ടത്?" + }, + "openFile": { + "title": "ഫയൽ തുറക്കുക", + "content": "ലഭിച്ച ഫയൽ നിങ്ങൾക്കു തുറക്കണമോ?" + }, + "addressInput": { + "title": "വിലാസം എഴുതുക", + "hashtag": "ഹാഷ്ടാഗ്", + "ip": "ഐ പി അഡ്രസ്", + "recentlyUsed": "ഈയ്യിടെ ഉപയോഗിച്ചത്: " + }, + "cancelSession": { + "title": "ഫയൽ കൈമാറ്റം റദ്ദാക്കുക", + "content": "നിങ്ങൾക്കു തീർച്ചയായും ഫയലുകളുടെ കൈമാറ്റം റദ്ദാക്കണമോ?" + }, + "cannotOpenFile": { + "title": "ഫയൽ തുറക്കാൻ കഴിയുന്നില്ല", + "content": "\"{file}\" തുറക്കാൻ കഴിയുന്നില്ല. ഈ ഫയൽ ഡിലീറ്റ് ചെയ്യുകയോ പേര് മാറ്റുകയോ മറ്റൊരിടത്തേക്ക് നീക്കുകയോ ചെയ്തിരിക്കുന്നുവോ?" + }, + "favoriteDialog": { + "title": "ഫേവറിറ്റ്സ്", + "noFavorites": "ഫേവറിറ്റ് ഡിവൈസുകൾ ഇതുവരെ ഇല്ല.", + "addFavorite": "ചേർക്കുക" + }, + "favoriteDeleteDialog": { + "title": "ഫേവറിറ്റ്സിൽ നിന്ന് ഒഴിവാക്കുക", + "content": "നിങ്ങൾക്കു തീർച്ചയായും \"{name}\" ഫേവറിറ്റ്സിൽ നിന്ന് ഒഴിവാക്കണമോ?" + }, + "favoriteEditDialog": { + "titleAdd": "ഫേവറിറ്റ്സിൽ ചേർക്കുക", + "titleEdit": "സജ്ജീകരണങ്ങൾ", + "name": "ഡിവൈസ് നാമം", + "ip": "ഐ പി അഡ്രസ്", + "port": "പോർട്ട്" + }, + "fileInfo": { + "title": "ഫയൽ വിവരങ്ങൾ", + "fileName": "ഫയൽ നാമം:", + "path": "പാത:", + "size": "സൈസ്:", + "sender": "അയക്കുന്നവൻ:", + "time": "സമയം:" + }, + "fileNameInput": { + "title": "ഫയൽ നാമം എഴുതുക", + "original": "ഒറിജിനൽ: {original}" + }, + "historyClearDialog": { + "title": "ഹിസ്റ്ററി ക്ലിയർ ചെയ്യുക", + "content": "നിങ്ങൾക്കു തീർച്ചയായും മുഴുവൻ ഹിസ്റ്ററി ഡിലീറ്റ് ചെയ്യണമോ?" + }, + "messageInput": { + "title": "സന്ദേശം ടൈപ്പ് ചെയ്യുക", + "multiline": "ബഹുരേഖ" + }, + "noFiles": { + "title": "ഫയലുകളൊന്നും തിരഞ്ഞെടുത്തില്ല", + "content": "ദയവായി ഒരു ഫയൽ എങ്കിലും തിരഞ്ഞെടുക്കുക." + }, + "noPermission": { + "title": "അനുവാദമില്ല", + "content": "ആവശ്യമായ അനുമതികൾ നിങ്ങൾ അനുവദിച്ചിട്ടില്ല. ദയവായി സജ്ജീകരണങ്ങളിൽ അവ അനുവദിക്കുക." + }, + "notAvailableOnPlatform": { + "title": "ലഭ്യമല്ല", + "content": "ഈ ഫീച്ചർ ലഭ്യമായത് ഇവിടെ മാത്രം:" + }, + "qr": { + "title": "ക്യു ആർ കോഡ്" + }, + "quickActions": { + "title": "ചടുല പ്രവർത്തികൾ", + "counter": "കൗണ്ടർ", + "sortBeforeCount": "മുൻകൂട്ടി അകാരാദിക്രമത്തിൽ ഒത്തിരിക്കുക (A-Z)", + "random": "ക്രമമില്ലാത്തത്" + }, + "quickSaveNotice": { + "content": "ഫയൽ അപേക്ഷകൾ ഇപ്പോൾ ഓട്ടോമാറ്റിക് ആയി അനുവദിക്കുന്നു. ലോക്കൽ നെറ്റ്‌വർക്കിലുള്ള എല്ലാവര്ക്കും നിങ്ങൾക്കു ഫയൽ അയക്കാൻ കഴിയും എന്ന ബോധ്യമുണ്ടായിരിക്കുക." + } + }, + "tray": { + "@info": "Apple ന്റെ ക്ലോസ് വേർഡ് നെ കുറിച്ചുള്ള നയങ്ങൾ വളരെ കർക്കശമാണ്.", + "close": "ഈ അപ്പ്ലിക്കേഷനിൽ നിന്നും പുറത്തു കടക്കുക", + "closeWindows": "എക്സിറ്" + }, + "networkInterfacesPage": { + "preview": "സ്വകാര്യപ്രദർശനം", + "info": "ഡിഫോൾട്ടായി, ലോക്കൽസെൻഡ് ലഭ്യമായ എല്ലാ നെറ്റ്‌വർക്ക് ഇന്റർഫേസുകളും ഉപയോഗിക്കുന്നു. നിങ്ങൾക്ക് ഇവിടെ ആവശ്യമില്ലാത്ത നെറ്റ്‌വർക്കുകൾ ഒഴിവാക്കാം. മാറ്റങ്ങൾ പ്രയോഗിക്കാൻ നിങ്ങൾ സെർവർ പുനരാരംഭിക്കേണ്ടതുണ്ട്.", + "title": "നെറ്റ്‌വർക്ക് ഇന്റർഫേസുകൾ", + "whitelist": "വൈറ്റ്‌ലിസ്റ്റ്", + "blacklist": "ബ്ലാക്ക്‌ലിസ്റ്റ്" + }, + "sanitization": { + "empty": "ഫയലിന്റെ പേര് ആവശ്യമാണ്", + "invalid": "ഫയലിന്റെ പേരിൽ അംഗീകാരമില്ലാത്ത അക്ഷരങ്ങൾ ഉണ്ട്" + }, + "receivePage": { + "subTitle": { + "one": "നിങ്ങൾക്ക് ഒരു ഫയൽ അയയ്‌ക്കാൻ താൽപ്പര്യപ്പെടുന്നു", + "other": "നിങ്ങൾക്ക് {n} ഫയലുകൾ അയയ്‌ക്കാൻ താൽപ്പര്യപ്പെടുന്നു" + }, + "subTitleLink": "നിങ്ങൾക്ക് ഒരു ലിങ്ക് അയച്ചു:", + "subTitleMessage": "നിങ്ങൾക്ക് ഒരു സന്ദേശം അയച്ചു:", + "canceled": "അയച്ചയാൾ റിക്വസ്റ്റ് റദ്ദാക്കിയിരിക്കുന്നു." + }, + "receiveHistoryPage": { + "entryActions": { + "info": "വിവരങ്ങൾ", + "open": "ഫയൽ തുറക്കുക", + "showInFolder": "ഫോൾഡറിൽ കാണിക്കുക", + "deleteFromHistory": "ഹിസ്റ്ററിയിൽ നിന്ന് ഡിലീറ്റ് ചെയ്യുക" + }, + "title": "ഹിസ്റ്ററി", + "openFolder": "ഫോൾഡർ തുറക്കുക", + "deleteHistory": "ഹിസ്റ്ററി ഡിലീറ്റ് ചെയ്യുക", + "empty": "ഹിസ്റ്ററി ശൂന്യമാണ്." + }, + "receiveOptionsPage": { + "saveToGalleryOff": "ഫോൾഡറുകൾ ഉള്ളതിനാൽ ഓട്ടോമാറ്റിക്കായി ഓഫാക്കി.", + "title": "ഓപ്ഷനുകൾ", + "appDirectory": "(ലോക്കൽസെൻഡ് ഫോൾഡർ)" + }, + "apkPickerPage": { + "excludeSystemApps": "സിസ്റ്റം ആപ്പുകൾ ഒഴിവാക്കുക", + "title": "ആപ്പുകൾ (APK)", + "excludeAppsWithoutLaunchIntent": "ലോഞ്ച് ചെയ്യാൻ കഴിയാത്ത ആപ്പുകൾ ഒഴിവാക്കുക", + "apps": "{n} ആപ്പുകൾ" + }, + "troubleshootPage": { + "firewall": { + "solution": "ഇത് മിക്കവാറും ഒരു ഫയർവാൾ പ്രശ്നമാണ്. പോർട്ട് {port}-ൽ ഇൻകമിംഗ് കണക്ഷനുകൾ (UDP, TCP) അനുവദിച്ചുകൊണ്ട് നിങ്ങൾക്ക് ഇത് പരിഹരിക്കാൻ കഴിയും.", + "symptom": "ഈ ഡിവൈസിന് മറ്റ് ഡിവൈസുകളിലേക് ഫയലുകൾ അയയ്ക്കാൻ കഴിയും, എന്നാൽ മറ്റ് ഡിവൈസുകൾക്ക് ഈ ഡിവൈസിലേക്ക് ഫയലുകൾ അയയ്ക്കാൻ കഴിയില്ല.", + "openFirewall": "ഫയർവാൾ തുറക്കുക" + }, + "title": "ട്രബിൾഷൂട്ട് ചെയ്യുക", + "subTitle": "ആപ്പ് പ്രതീക്ഷിച്ചതുപോലെ പ്രവർത്തിക്കുന്നില്ലേ? പ്രശ്‌നങ്ങൾക്കുള്ള പൊതുവായ ചില പരിഹാരങ്ങൾ ഇവിടെ കാണാം.", + "solution": "പരിഹാരം:", + "noDiscovery": { + "symptom": "ഈ ഡിവൈസിനു മറ്റ് ഡിവൈസുകൾ കണ്ടെത്താൻ കഴിയില്ല.", + "solution": "ദയവായി എല്ലാ ഡിവൈസുകളും ഒരേ വൈഫൈ നെറ്റ്‌വർക്കിൽ ആണെന്നും ഒരേ കോൺഫിഗറേഷൻ(പോർട്ട്, മൾട്ടി കാസ്റ്റ് അഡ്രസ്സ്, എൻക്രിപ്ഷൻ) ആണെന്നും ഉറപ്പു വരുത്തുക. നിങ്ങൾ കണക്ട് ചെയ്യാൻ ശ്രമിക്കുന്ന ഡിവൈസിന്റെ ഐപി അഡ്രസ്സ് ടൈപ്പ് ചെയ്തു നോക്കാവുന്നതാണ്. ഇത് ഫലിക്കുക ആണെങ്കിൽ ഈ ഡിവൈസ് ഫേവറിറ്റ് ആയി സേവ് ചെയ്തു പിന്നീട് ഓട്ടോമാറ്റിക് ആയി കണക്ട് ചെയ്തു ഉപയോഗിക്കാവുന്നതാണ്." + }, + "fixButton": "ഓട്ടോമാറ്റിക്കായി ശരിയാക്കുക", + "noConnection": { + "symptom": "ഇരു ഡിവൈസുകൾക്കും പരസ്പരം കണ്ടെത്താനോ ഫയലുകൾ അയക്കാനോ കഴിയില്ല.", + "solution": "ഇരു ഭാഗങ്ങളിലും പ്രശ്നം ഉണ്ടോ? ഉണ്ടെങ്കിൽ, ദയവായി എല്ലാ ഡിവൈസുകളും ഒരേ വൈഫൈ നെറ്റ്‌വർക്കിൽ ആണെന്നും ഒരേ കോൺഫിഗറേഷൻ(പോർട്ട്, മൾട്ടി കാസ്റ്റ് അഡ്രസ്സ്, എൻക്രിപ്ഷൻ) ആണെന്നും ഉറപ്പു വരുത്തുക. അക്സസ്സ് പോയിന്റ്(എ.പി) ഐസൊലേഷൻ മൂലം പരസ്പരം ഉള്ള ആശയ വിനിമയം വൈഫൈ നെറ്റ്‌വർക്ക് അനുവദിക്കാതെ ഇരിക്കാൻ സാധ്യത ഉണ്ട്. അങ്ങനെ എങ്കിൽ ആ ഓപ്ഷൻ റൗട്ടറിൽ ഓഫ് ചെയ്തു വക്കേണ്ടതാണ്." + } + }, + "selectedFilesPage": { + "deleteAll": "എല്ലാം ഡിലീറ്റ് ചെയ്യുക" + }, + "sendPage": { + "waiting": "പ്രതികരണത്തിനായി കാത്തിരിക്കുന്നു…", + "rejected": "സ്വീകർത്താവ് അപേക്ഷ നിരസിച്ചിരിക്കുന്നു.", + "busy": "സ്വീകർത്താവ് മറ്റൊരു അപേക്ഷ മൂലം തിരക്കിലാണ്.", + "tooManyAttempts": "@:web.tooManyAttempts" + }, + "progressPage": { + "titleSending": "ഫയലുകൾ അയയ്ക്കുന്നു", + "titleReceiving": "ഫയലുകൾ സ്വീകരിക്കുന്നു", + "savedToGallery": "ഫോട്ടോസിൽ സേവ് ചെയ്തു", + "total": { + "title": { + "sending": "മുഴുവൻ പുരോഗതി ({time})", + "finishedError": "തെറ്റുകളോടെ പൂർത്തിയാക്കി", + "canceledSender": "അയക്കുന്നവൻ റദ്ധാക്കി", + "canceledReceiver": "സ്വീകർത്താവ് റദ്ധാക്കി" + }, + "count": "ഫയലുകൾ: {curr} / {n}", + "size": "വലിപ്പം: {curr} / {n}", + "speed": "വേഗത: {speed}/s" + } + }, + "webSharePage": { + "pinHint": "പിൻ ഇതാണ് \"{pin}\"", + "encryptionHint": "ലോക്കൽസെൻഡ്‌ ഉപയോഗിക്കുന്നത് സ്വയം ഒപ്പു വച്ച സാക്ഷ്യപത്രം ആണ്. നിങ്ങളുടെ ബ്രൗസറിൽ ഇത് നിങ്ങൾ അംഗീകരിക്കണം.", + "title": "ലിങ്ക് വഴി ഷെയർ ചെയ്യുക", + "loading": "സെർവർ ആരംഭിക്കുന്നു…", + "stopping": "സെർവർ നിർത്തുന്നു…", + "error": "സെർവർ ആരംഭിക്കുന്നതിൽ തടസ്സം നേരിട്ടു.", + "openLink": { + "one": "ഈ ലിങ്ക് നിങ്ങളുടെ ബ്രൗസറിൽ തുറക്കുക:", + "other": "ഏതെങ്കിലും ഒരു ലിങ്ക് നിങ്ങളുടെ ബ്രൗസറിൽ തുറക്കുക:" + }, + "requests": "അപേക്ഷകൾ", + "noRequests": "അപേക്ഷകളൊന്നും ഇതുവരെ ഇല്ല.", + "autoAccept": "ആട്ടോമാറ്റിക് ആയി അപേക്ഷകൾ സ്വീകരിക്കുക", + "requirePin": "പിൻ ആവശ്യമാണ്", + "pendingRequests": "തീരുമാനിക്കപ്പെടാത്ത അപേക്ഷകൾ: {n}" + }, + "donationPage": { + "info": "ലോക്കൽസെൻഡ്‌ സൗജന്യവും ഓപ്പൺ-സോഴ്സും പരസ്യങ്ങൾ ഇല്ലാത്തതും ആണ്. നിങ്ങൾക്കു ആപ്പ് ഇഷ്ടമായെങ്കിൽ ചെറിയ സംഭാവന നൽകി വികസനത്തിന് സഹായിക്കാവുന്നതാണ്.", + "title": "സംഭാവന ചെയ്യുക", + "donate": "സംഭാവന {amount}", + "thanks": "ഒരുപാട് നന്ദിയുണ്ട്!", + "restore": "വാങ്ങിയത് വീണ്ടെടുക്കുക" + }, + "aboutPage": { + "description": [ + "ഇന്റർനെറ്റ് കണക്ഷന്റെ ആവശ്യമില്ലാതെ ലോക്കൽ നെറ്റ്വർക്കിലൂടെ അടുത്തുള്ള ഡിവൈസുകളിലേക്ക് സുരക്ഷിതമായി ഫയലുകളും മെസ്സേജുകളും അയക്കാൻ അനുവദിക്കുന്ന ഒരു സൗജന്യ ഓപ്പൺ സോഴ്സ് ആപ്പ് ആണ് ലോക്കൽസെൻഡ്‌.", + "ഈ ആപ്പ് ആൻഡ്രോയിഡ്, ഐഒഎസ്, മാക് ഒഎസ്, വിൻഡോസ് , ലിനക്സ് എന്നീ പ്ലാറ്റുഫോമുകളിൽ ലഭ്യമാണ് . എല്ലാവിധ ഡൌൺലോഡ് ഓപ്ഷൻസും ഔദ്യോഗിക ഹോം പേജിൽ കാണാവുന്നതാണ്." + ], + "title": "ലോക്കൽസെൻഡിനെ കുറിച്ച്", + "author": "ലേഖകൻ", + "contributors": "സംഭാവന ചെയ്യുന്നവർ", + "packagers": "സംയോജിപ്പിക്കുന്നവർ", + "translators": "പരിഭാഷകർ" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "വിവിധ ദേശത്തു വിവിധ വാക്കുകൾ ഉണ്ടാകാം. അവ ഒരേപോലെ (1:1) തുല്യം ആവണമെന്നില്ല" + }, + "changelogPage": { + "title": "മാറ്റവിവരപട്ടിക" + } +} diff --git a/app/assets/i18n/mn.json b/app/assets/i18n/mn.json new file mode 100644 index 0000000..fca87cd --- /dev/null +++ b/app/assets/i18n/mn.json @@ -0,0 +1,266 @@ +{ + "locale": "Mongolian", + "appName": "LocalSend", + "general": { + "accept": "Зөвшөөрөх", + "accepted": "Зөвшөөрсөн", + "add": "Нэмэх", + "advanced": "Нэмэлт үйлчилгээ", + "cancel": "Цуцлах", + "close": "Хаах", + "confirm": "Баталгаажуулах", + "continueStr": "Үргэлжлүүлэх", + "copy": "Хуулах", + "copiedToClipboard": "Амжилттай хууллаа", + "decline": "Татгалзах", + "done": "Болсон", + "delete": "Устгах", + "edit": "Өөрчлөх", + "error": "Алдаа", + "example": "Жишээ", + "files": "Файлууд", + "finished": "Дууссан", + "hide": "Нуух", + "off": "Унтраах", + "offline": "Оффлайн", + "on": "Асаах", + "online": "Онлайн", + "open": "Нээх", + "queue": "Хүлээгдэж байгаа", + "quickSave": "Шууд хадгалах", + "renamed": "Дахин нэрлэсэн", + "reset": "Өөрчлөлтүүдийг буцаах", + "restart": "Дахин ачаалах", + "settings": "Тохиргоо", + "skipped": "Алгассан", + "start": "Эхлэх", + "stop": "Зогсоох", + "save": "Хадгалах", + "unchanged": "Өөрчлөгдөөгүй", + "unknown": "Үл мэдэгдэх", + "noItemInClipboard": "Санах ой хоосон байна." + }, + "receiveTab": { + "title": "Авах", + "infoBox": { + "ip": "IP хаяг:", + "port": "Порт:", + "alias": "Төхөөрөмжийн нэр:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Хадгалсан", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Илгээх", + "selection": { + "title": "Сонголт", + "files": "Файлууд: {files}", + "size": "Хэмжээ: {size}" + }, + "picker": { + "file": "Файл", + "folder": "Хавтас", + "media": "Медиа", + "text": "Бичвэр", + "app": "Апп", + "clipboard": "Санах ойгоос буулгах" + }, + "shareIntentInfo": "Та өөрийн төхөөрөмжийн \"Хуваалцах\" цэсийг ашиглан файлуудаа хялбар сонгох боломжтой.", + "nearbyDevices": "Ойролцоо төхөөрөмжүүд", + "thisDevice": "Энэ төхөөрөмж", + "scan": "Төхөөрөмжүүд хайх", + "manualSending": "Гар аргаар хайх", + "sendMode": "Илгээх горим", + "sendModes": { + "single": "Ганц хүлээн авагч", + "multiple": "Олон хүлээн авагч", + "link": "Холбоосоор хуваалцах" + }, + "sendModeHelp": "Тайлбар", + "help": "Хүлээн авах төхөөрөмжийг адилхан Wi-Fi сүлжээнд байгаа эсэхийг шалгана уу.", + "placeItems": "Хуваалцах зүйлсээ орулна уу." + }, + "settingsTab": { + "title": "Тохиргоо", + "general": { + "title": "Ерөнхий", + "brightness": "Үзэмж", + "brightnessOptions": { + "system": "Систем", + "dark": "Харанхуй", + "light": "Гэгээлэг" + }, + "color": "Өнгө", + "colorOptions": { + "system": "Систем", + "oled": "OLED" + }, + "language": "Хэл", + "languageOptions": { + "system": "Систем" + }, + "saveWindowPlacement": "Гарсаны дараа цонхны байрлал хадгалах", + "saveWindowPlacementWindows": "Гарсаны дараа цонхны байрлал хадгалах", + "minimizeToTray": "Цонх хаах үед програмыг нуух", + "launchAtStartup": "Нэвтрэх үед хамт нээх", + "launchMinimized": "Авто эхлүүлэх: Нуугдсан эхлэх", + "showInContextMenu": "Системийн цэсэнд LocalSend-д харуулах", + "animations": "Анимэйшн" + }, + "receive": { + "title": "Авах", + "quickSave": "@:general.quickSave", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Авто-дуусгах", + "destination": "Хавтаст хадгалах", + "downloads": "(Татсан файлууд)", + "saveToGallery": "Зургийн санд хадгалах", + "saveToHistory": "Түүхэнд хадгалах" + }, + "send": { + "title": "Илгээх", + "shareViaLinkAutoAccept": "\"Холбоосоор илгээх\" горимын хүсэлтүүдийн шууд зөвшөөрөх" + }, + "network": { + "title": "Сүлжээ", + "needRestart": "Серверийг дахин ачаалж тохиргоог идэвхжүүлнэ үү!", + "server": "Сервер", + "alias": "Төхөөрөмжийн нэр", + "deviceType": "Төхөөрөмжийн төрөл", + "deviceModel": "Төхөөрөмжийг модел", + "port": "Порт", + "discoveryTimeout": "Хайх хүчинтэй хугацаа", + "useSystemName": "Системийн нэр ашиглах", + "portWarning": "Та өөр порт ашиглаж байгаа тул бусад төхөөрөмжинд олдохгүй байж магадгүй . (өгөгдмөл: {defaultPort})", + "encryption": "Нууцлал", + "multicastGroup": "Мультикаст хаяг", + "multicastGroupWarning": "Хувийн multicast хаяг ашиглаж үед бусад төхөөрөмжид илрэхгүй байх магадлалтай. (default: {defaultMulticast})" + }, + "other": { + "title": "Бусад", + "support": "LocalSend-г дэмжих", + "donate": "Хандив өгөх", + "privacyPolicy": "Нууцлалын бодлого", + "termsOfUse": "Ашиглах нөхцөл" + }, + "advancedSettings": "Нэмэлт тохиргоо" + }, + "troubleshootPage": { + "title": "Асуудал илрүүлэх", + "subTitle": "Апп нь санаснаар ажиллахгүй байна уу? Эндээс асуудлыг нийтлэг асуудалуудыг олох боломжтой.", + "solution": "Шийдэл:", + "fixButton": "Автоматаар засварлах", + "firewall": { + "symptom": "Энэ төрөөрөмж бусадруу файл илгээж чадаж байгаа ч бусад төхөөрөмж энэ төхөөрөмжрүү илгээж чадахгүй байна.", + "solution": "Энэ нь ихэвчлэн firewall-н асуудл байдаг. Та {port} дээр ирж буй холболтыг (UDP ба TCP) зөвшөөрч шийдвэрлэх боломжтой.", + "openFirewall": "Firewall-г нээх" + }, + "noDiscovery": { + "symptom": "Энэ төхөөрөмж бусад төхөөрөмжийг илрүүлж чадахгүй байна.", + "solution": "Бүх төхөөрөмж адилхан Wi-Fi сүлжээнд орсон, адилхан тохиргоотой (порт, мультикаст хаяг, нууцлал) эсэхийг шалгана уу. Мөн төхөөрөмжийн IP хаягийг гараар оруулж үзнэ үү. Хэрэв болж байвал тухайн төхөөрөмжийг \"Хадгалсан\" хэсэгт нэмж дараа нь автоматаар таниулаарай." + }, + "noConnection": { + "symptom": "Төхөөрөмжүүд бие биенийгээ танихгүй, файл хуваалцаж чадахгүй байна.", + "solution": "Хоёр талдаа ажиллахгүй байна уу? Хэрэв тийм бол хоёр төхөөрөмж ижил Wi-Fi сүлжээнд байгаа эсэхийг эсвэл ижил тохиргоотой (порт, multicast хаяг, шифрлэлт) байгаа эсэхийг шалгана уу. Wi-Fi сүлжээ эсвэл Acess Point (AP) төхөөрөмж хоорондын харилцааг хаасан байж магадгүй. Энэ тохиолдолд Wi-Fi төхөөрөмжийн тохиргоог өөрчлөнө үү." + } + }, + "receiveHistoryPage": { + "title": "Түүх", + "openFolder": "Хавтас нээх", + "deleteHistory": "Түүх устгах", + "empty": "Түүх хоосон байна.", + "entryActions": { + "open": "Файл нээх", + "showInFolder": "Хавтаст харуулах", + "info": "Мэдээлэл", + "deleteFromHistory": "Түүхээс устгах" + } + }, + "apkPickerPage": { + "title": "Аппууд (APK)", + "excludeSystemApps": "Системийн аппуудыг хасах", + "excludeAppsWithoutLaunchIntent": "Нээх боломжгүй аппуудыг хасах", + "apps": "{n} апп" + }, + "selectedFilesPage": { + "deleteAll": "Бүгдийг устгах" + }, + "receivePage": { + "subTitle": { + "one": "танруу файл явуулахыг хүсэж байна", + "other": "танруу {n} файл явуулахыг хүсэж байна" + }, + "subTitleMessage": "танруу зурвас илгээлээ:", + "subTitleLink": "танруу холбоос илгээлээ:", + "canceled": "Илгээгч хүсэлтийг цуцалсан байна." + }, + "receiveOptionsPage": { + "title": "Сонголтын тохиргоо", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend-н хавтас)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Хавтсууд байгаа учир автоматаар унтраалаа." + }, + "sendPage": { + "waiting": "Хариу хүлээж байна…", + "rejected": "Хүлээн авагч хүсэлтйиг татгалзлаа.", + "busy": "Хүлээн авагч өөр хүсэлт авсан тул завгүй байна." + }, + "progressPage": { + "titleSending": "Файлууд илгээж байна", + "titleReceiving": "Файлыг татаж байна", + "savedToGallery": "Photos дээр амжилттай хадгаллаа", + "total": { + "title": { + "sending": "Нийт хугацаа ({time})", + "finishedError": "Амжилтгүй болсон", + "canceledSender": "Явуулж байгаа хүн цуцаллаа", + "canceledReceiver": "Хүлээн авагчийн хүсэлтээр цуцалсан" + }, + "count": "Файл: {curr} / {n}", + "size": "Хэмжээ: {curr} / {n}", + "speed": "Хурд: {speed}/s" + } + }, + "webSharePage": { + "title": "Линкээр хуваалцах", + "error": "Сервер асаахад алдаа гарлаа.", + "openLink": { + "one": "Энэ холбоосыг browser дээрээ нээнэ үү:", + "other": "Уг линкийн аль нэгрүү орно уу:" + }, + "requests": "Хүсэлтүүд", + "noRequests": "Одоогоор хүсэлт байхгүй байна.", + "autoAccept": "Хүсэлтийг автоматаар авах", + "requirePin": "PIN код ашиглах", + "pinHint": "PIN код: \"{pin}\"", + "encryptionHint": "LocalSend нь өөрийн гарын үсэг ашигладаг тул үүнийг browser дээрээ хүлээн зөвшөөрнө үү.", + "pendingRequests": "Хүлээгдэж буй хүсэлт: {n}" + }, + "aboutPage": { + "title": "LocalSend танилцуулга", + "description": [ + "LocalSend нь үнэгүй, нээлттэй эхийн програм бөгөөд танд интернет холболт шаардлагагүйгээр өөрийн дотоод сүлжээгээр ойролцоох төхөөрөмжүүдтэй файл, мессежийг аюулгүйгээр хуваалцах боломтой.", + "Энэ програмыг Android, iOS, macOS, Windows болон Linux дээр ашиглах боломжтой. Та албан ёсны веб сайтнаас татах боломжтой." + ], + "author": "Эзэмшигч", + "contributors": "Хамт тусалсан", + "translators": "Орчуулагч нар" + }, + "donationPage": { + "title": "Хандив", + "info": "LocalSend нь үнэ төлбөргүй, нээлттэй эх сурвалжтай бөгөөд ямар ч зар сурталчилгаагүй. Хэрэв энэ програм таалагдсан бол хандивын мөнгөөр хөгжлийг дэмжих боломжтой.", + "donate": "{amount} аар хандивлах", + "thanks": "Маш их баярлалаа!", + "restore": "Буцаах" + }, + "changelogPage": { + "title": "Шинэчлэлт" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + } +} diff --git a/app/assets/i18n/ms.json b/app/assets/i18n/ms.json new file mode 100644 index 0000000..fbb47e3 --- /dev/null +++ b/app/assets/i18n/ms.json @@ -0,0 +1,524 @@ +{ + "locale": "Bahasa Inggeris", + "appName": "LocalSend", + "general": { + "accept": "Terima", + "accepted": "Diterima", + "add": "Tambah", + "advanced": "Lanjutan", + "cancel": "Batal", + "close": "Tutup", + "confirm": "Sahkan", + "continueStr": "Teruskan", + "copy": "Salin", + "copiedToClipboard": "Disalin ke Papan Keratan", + "decline": "Tolak", + "done": "Selesai", + "delete": "Padam", + "edit": "Sunting", + "error": "Ralat", + "example": "Contoh", + "files": "Fail-fail", + "finished": "Telah selesai", + "hide": "Sembunyi", + "off": "Tutup", + "offline": "Luar talian", + "on": "Buka", + "online": "Dalam talian", + "open": "Buka", + "queue": "Baris gilir", + "quickSave": "Simpan Pantas", + "quickSaveFromFavorites": "Simpan Pantas untuk \"Kegemaran\"", + "renamed": "Dinamakan semula", + "reset": "Buat asal perubahan", + "restart": "Mula semula", + "settings": "Tetapan", + "skipped": "Dilangkau", + "start": "Mula", + "stop": "Henti", + "save": "Simpan", + "unchanged": "Tidak berubah", + "unknown": "Tidak diketahui", + "noItemInClipboard": "Tiada item dalam papan keratan." + }, + "receiveTab": { + "title": "Terima", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Nama peranti:" + }, + "quickSave": { + "favorites": "Kegemaran", + "off": "@:general.off", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Hantar", + "selection": { + "title": "Pilihan", + "files": "Fail: {files}", + "size": "Saiz: {size}" + }, + "picker": { + "file": "Fail", + "folder": "Folder", + "media": "Media", + "text": "Teks", + "app": "Aplikasi", + "clipboard": "Tampal" + }, + "shareIntentInfo": "Anda juga boleh menggunakan ciri \"Kongsi\" peranti mudah alih anda untuk memilih fail dengan lebih mudah.", + "nearbyDevices": "Peranti berdekatan", + "thisDevice": "Peranti Ini", + "scan": "Cari peranti", + "manualSending": "Penghantaran manual", + "sendMode": "Mod penghantaran", + "sendModes": { + "single": "Satu penerima", + "multiple": "Pelbagai penerima", + "link": "Kongsi melalui pautan" + }, + "sendModeHelp": "Penerangan", + "help": "Sila pastikan sasaran yang diingini juga berada dalam rangkaian Wi-Fi yang sama.", + "placeItems": "Letakkan item untuk dikongsi." + }, + "settingsTab": { + "title": "Tetapan", + "general": { + "title": "Umum", + "brightness": "Tema", + "brightnessOptions": { + "system": "Sistem", + "dark": "Gelap", + "light": "Cerah" + }, + "color": "Warna", + "colorOptions": { + "system": "Sistem", + "oled": "OLED" + }, + "language": "Bahasa", + "languageOptions": { + "system": "Sistem" + }, + "saveWindowPlacement": "Simpan kedudukan tetingkap selepas keluar", + "minimizeToTray": "Minimumkan ke dulang sistem/menu bar apabila menutup", + "launchAtStartup": "Mula automatik selepas log masuk", + "launchMinimized": "Mula automatik: Mula tersembunyi", + "showInContextMenu": "Tunjukkan LocalSend dalam menu konteks", + "animations": "Animasi", + "saveWindowPlacementWindows": "Simpan kedudukan tetingkap selepas keluar" + }, + "receive": { + "title": "Terima", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "Memerlukan PIN", + "autoFinish": "Selesai Automatik", + "destination": "Simpan ke folder", + "downloads": "(Muat turun)", + "saveToGallery": "Simpan media ke galeri", + "saveToHistory": "Simpan ke sejarah" + }, + "send": { + "title": "Hantar", + "shareViaLinkAutoAccept": "Terima permintaan secara automatik dalam mod \"Kongsi melalui pautan\"" + }, + "network": { + "title": "Rangkaian", + "needRestart": "Mulakan semula pelayan untuk menggunakan tetapan!", + "server": "Pelayan", + "alias": "Nama peranti", + "deviceType": "Jenis peranti", + "deviceModel": "Model peranti", + "port": "Port", + "discoveryTimeout": "Tamat Masa Penemuan", + "useSystemName": "Gunakan nama sistem", + "generateRandomAlias": "Jana alias rawak", + "portWarning": "Anda mungkin tidak dapat dikesan oleh peranti lain kerana anda menggunakan port tersuai. (lalai: {defaultPort})", + "encryption": "Penyulitan", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Anda mungkin tidak dapat dikesan oleh peranti lain kerana anda menggunakan alamat multicast tersuai. (lalai: {defaultMulticast})", + "network": "Rangkaian", + "networkOptions": { + "all": "Semua", + "filtered": "Ditapis" + } + }, + "other": { + "title": "Lain-lain", + "support": "Sokong LocalSend", + "donate": "Derma", + "privacyPolicy": "Dasar Privasi", + "termsOfUse": "Syarat Penggunaan" + }, + "advancedSettings": "Tetapan lanjutan" + }, + "troubleshootPage": { + "title": "Penyelesaian masalah", + "subTitle": "Aplikasi ini tidak berfungsi seperti yang diharapkan? Di sini anda boleh mencari penyelesaian umum.", + "solution": "Penyelesaian:", + "fixButton": "Baiki secara automatik", + "firewall": { + "symptom": "Peranti ini boleh menghantar fail ke peranti lain tetapi peranti lain tidak boleh menghantar fail ke peranti ini.", + "solution": "Ini kemungkinan besar adalah masalah firewall. Anda boleh menyelesaikannya dengan membenarkan sambungan masuk (UDP dan TCP) pada port {port}.", + "openFirewall": "Buka Firewall" + }, + "noDiscovery": { + "symptom": "Peranti ini tidak dapat menemui peranti lain.", + "solution": "Sila pastikan semua peranti berada dalam rangkaian Wi-Fi yang sama dan berkongsi konfigurasi yang sama (port, alamat multicast, penyulitan). Anda boleh cuba menaip alamat IP peranti sasaran secara manual. Jika ini berhasil, pertimbangkan untuk menambahkan peranti ini ke kegemaran agar ia dapat ditemui secara automatik pada masa hadapan." + }, + "noConnection": { + "symptom": "Kedua-dua peranti tidak dapat menemui satu sama lain atau tidak dapat berkongsi fail.", + "solution": "Adakah masalah wujud di kedua-dua belah pihak? Jika ya, anda perlu memastikan bahawa kedua-dua peranti berada dalam rangkaian Wi-Fi yang sama dan berkongsi konfigurasi yang sama (port, alamat multicast, penyulitan). Rangkaian Wi-Fi mungkin tidak membenarkan komunikasi antara peserta (pengasingan AP). Dalam kes ini, pilihan ini mesti diaktifkan pada penghala." + } + }, + "receiveHistoryPage": { + "title": "Sejarah", + "openFolder": "Buka folder", + "deleteHistory": "Padam sejarah", + "empty": "Sejarah kosong.", + "entryActions": { + "open": "Buka fail", + "showInFolder": "Tunjukkan dalam folder", + "info": "Maklumat", + "deleteFromHistory": "Padam dari sejarah" + } + }, + "apkPickerPage": { + "title": "Aplikasi (APK)", + "excludeSystemApps": "Kecualikan aplikasi sistem", + "excludeAppsWithoutLaunchIntent": "Kecualikan aplikasi yang tidak boleh dilancarkan", + "apps": "{n} Aplikasi" + }, + "selectedFilesPage": { + "deleteAll": "Padam semua" + }, + "receivePage": { + "subTitle": { + "one": "ingin menghantar fail kepada anda", + "other": "ingin menghantar {n} fail kepada anda" + }, + "subTitleMessage": "menghantar mesej kepada anda:", + "subTitleLink": "menghantar pautan kepada anda:", + "canceled": "Penghantar telah membatalkan permintaan." + }, + "receiveOptionsPage": { + "title": "Pilihan", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(folder LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Dimatikan secara automatik kerana terdapat folder." + }, + "sendPage": { + "waiting": "Menunggu respons…", + "rejected": "Penerima telah menolak permintaan.", + "busy": "Penerima sibuk dengan permintaan lain.", + "tooManyAttempts": "@:web.tooManyAttempts" + }, + "progressPage": { + "titleSending": "Menghantar fail", + "titleReceiving": "Menerima fail", + "savedToGallery": "Disimpan dalam Foto", + "total": { + "title": { + "sending": "Kemajuan keseluruhan ({time})", + "finishedError": "Selesai dengan ralat", + "canceledSender": "Dibatalkan oleh penghantar", + "canceledReceiver": "Dibatalkan oleh penerima" + }, + "count": "Fail: {curr} / {n}", + "size": "Saiz: {curr} / {n}", + "speed": "Kelajuan: {speed}/s" + } + }, + "webSharePage": { + "title": "Kongsi melalui pautan", + "loading": "Memulakan pelayan…", + "stopping": "Menghentikan pelayan…", + "error": "Ralat telah berlaku ketika memulakan pelayan.", + "openLink": { + "one": "Buka pautan ini dalam pelayar anda:", + "other": "Buka salah satu daripada pautan ini dalam pelayar anda:" + }, + "requests": "Permintaan", + "noRequests": "Tiada permintaan lagi.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Terima permintaan secara automatik", + "requirePin": "Memerlukan PIN", + "pinHint": "PIN ialah \"{pin}\"", + "pendingRequests": "Permintaan yang masih belum selesai: {n}", + "encryptionHint": "LocalSend menggunakan sijil yang ditandatangani sendiri. Anda perlu menerimanya di pelayar anda." + }, + "aboutPage": { + "title": "Tentang LocalSend", + "description": [ + "LocalSend adalah aplikasi percuma dan sumber terbuka yang membolehkan anda berkongsi fail dan mesej secara selamat dan terjamin dengan peranti berdekatan yang berada dalam rangkaian tempatan anda tanpa memerlukan sebarang sambungan internet.", + "Aplikasi ini tersedia di Android, iOS, macOS, Windows dan Linux. Anda boleh mencari semua pilihan untuk memuat turun di laman web rasmi." + ], + "author": "Pengarang", + "contributors": "Penyumbang", + "translators": "Penterjemah", + "packagers": "Pembungkus" + }, + "donationPage": { + "title": "Derma", + "info": "LocalSend adalah percuma, sumber terbuka dan tanpa iklan. Jika anda menyukai aplikasi ini, anda boleh menyokong pembangunannya dengan derma.", + "donate": "Derma {amount}", + "thanks": "Terima kasih banyak!", + "restore": "Pulihkan pembelian" + }, + "changelogPage": { + "title": "Log perubahan" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "adjectives": [ + "Comel", + "Cantik", + "Besar", + "Terang", + "Bersih", + "Bijak", + "Keren", + "Menarik", + "Licik", + "Bersemangat", + "Cekap", + "Hebat", + "Pantas", + "Baik", + "Segar", + "Bagus", + "Menakjubkan", + "Hebat", + "Tampan", + "Panas", + "Baik hati", + "Misteri", + "Kemas", + "Sabar", + "Cantik", + "Berkuasa", + "Kaya", + "Rahsia", + "Pintar", + "Kukuh", + "Istimewa", + "Strategik", + "Kuat", + "Kemas", + "Bijaksana" + ], + "fruits": [ + "Epal", + "Avokado", + "Pisang", + "Blackberi", + "Bluberi", + "Brokoli", + "Lobak merah", + "Ceri", + "Kelapa", + "Anggur", + "Lemon", + "Salad", + "Mangga", + "Tembikai", + "Cendawan", + "Bawang", + "Oren", + "Betik", + "Pic", + "Pir", + "Nanas", + "Kentang", + "Labu", + "Rasberi", + "Strawberi", + "Tomato" + ], + "combination": "{fruit} yang {adjective}", + "@combination": "Dalam bahasa Melayu, kata sifat biasanya diletakkan selepas kata nama.", + "@info": "Penempatan berbeza mungkin mempunyai perkataan yang berbeza, dan tidak sepadan 1:1" + }, + "dialogs": { + "addFile": { + "title": "Tambah ke pilihan", + "content": "Apa yang anda ingin tambah?" + }, + "addressInput": { + "title": "Masukkan alamat", + "hashtag": "Tanda pagar", + "ip": "Alamat IP", + "recentlyUsed": "Digunakan baru-baru ini: " + }, + "cancelSession": { + "title": "Batalkan pemindahan fail", + "content": "Adakah anda benar-benar mahu membatalkan pemindahan fail?" + }, + "cannotOpenFile": { + "title": "Tidak dapat membuka fail", + "content": "Tidak dapat membuka \"{file}\". Adakah fail ini telah dipindahkan, dinamakan semula atau dipadamkan?" + }, + "encryptionDisabledNotice": { + "title": "Penyulitan dimatikan", + "content": "Komunikasi kini berlaku melalui protokol HTTP yang tidak disulitkan. Untuk menggunakan protokol HTTPS, aktifkan penyulitan semula." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Kegemaran", + "noFavorites": "Tiada peranti kegemaran lagi.", + "addFavorite": "Tambah" + }, + "favoriteDeleteDialog": { + "title": "Padam dari kegemaran", + "content": "Adakah anda benar-benar mahu memadam \"{name}\" dari kegemaran?" + }, + "favoriteEditDialog": { + "titleAdd": "Tambah ke kegemaran", + "titleEdit": "Tetapan", + "name": "Nama peranti", + "auto": "(auto)", + "ip": "Alamat IP", + "port": "Port" + }, + "fileInfo": { + "title": "Maklumat fail", + "fileName": "Nama fail:", + "path": "Laluan:", + "size": "Saiz:", + "sender": "Penghantar:", + "time": "Masa:" + }, + "fileNameInput": { + "title": "Masukkan nama fail", + "original": "Asal: {original}" + }, + "historyClearDialog": { + "title": "Kosongkan sejarah", + "content": "Adakah anda benar-benar mahu memadamkan keseluruhan sejarah?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend tidak dapat mencari peranti lain tanpa mempunyai kebenaran untuk mengimbas rangkaian tempatan. Sila berikan kebenaran ini dalam tetapan.", + "gotoSettings": "Tetapan" + }, + "messageInput": { + "title": "Taip mesej", + "multiline": "Pelbagai baris" + }, + "noFiles": { + "title": "Tiada fail dipilih", + "content": "Sila pilih sekurang-kurangnya satu fail." + }, + "noPermission": { + "title": "Tiada kebenaran", + "content": "Anda belum memberikan kebenaran yang diperlukan. Sila berikan kebenaran dalam tetapan." + }, + "notAvailableOnPlatform": { + "title": "Tidak tersedia", + "content": "Ciri ini hanya tersedia di:" + }, + "qr": { + "title": "Kod QR" + }, + "quickActions": { + "title": "Tindakan Pantas", + "counter": "Kaunter", + "prefix": "Awalan", + "padZero": "Isi dengan sifar", + "sortBeforeCount": "Susun mengikut abjad terlebih dahulu", + "random": "Rawak" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Permintaan fail kini diterima secara automatik. Sila ambil perhatian bahawa semua orang dalam rangkaian tempatan boleh menghantar fail kepada anda." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Permintaan fail kini diterima secara automatik daripada peranti-peranti yang dalam senarai kegemaran anda.", + "Amaran! Pada waktu sekarang, ini tidak terjamin sepenuhnya, kerana penggodam yang mempunyai cap jari mana-mana peranti daripada senarai kegemaran anda boleh menghantar fail kepada anda tanpa sekatan.", + "Walau bagaimanapun, pilihan ini tetap lebih selamat daripada membenarkan semua pengguna dalam rangkaian tempatan menghantar fail kepada anda tanpa sekatan." + ] + }, + "pin": { + "title": "Masukkan PIN" + }, + "sendModeHelp": { + "title": "Mod penghantaran", + "single": "Menghantar fail kepada satu penerima. Pilihan akan dibersihkan selepas pemindahan fail selesai.", + "multiple": "Menghantar fail kepada beberapa penerima. Pilihan tidak akan dibersihkan.", + "link": "Penerima yang tidak mempunyai LocalSend dipasang boleh memuat turun fail yang dipilih dengan membuka pautan dalam pelayar mereka." + }, + "zoom": { + "title": "URL" + }, + "openFile": { + "title": "Buka fail", + "content": "Adakah anda mahu untuk membuka fail yang diterima?" + } + }, + "sanitization": { + "empty": "Nama fail tidak boleh kosong", + "invalid": "Nama fail mengandungi aksara yang tidak sah" + }, + "tray": { + "open": "@:general.open", + "close": "Keluar LocalSend", + "closeWindows": "Keluar", + "@info": "Garis Panduan Apple sangat ketat tentang perkataan \"tutup\"." + }, + "web": { + "waiting": "@:sendPage.waiting", + "rejected": "Ditolak", + "files": "Fail", + "fileName": "Nama fail", + "size": "Saiz", + "enterPin": "Masukkan PIN", + "invalidPin": "PIN Tidak Sah", + "tooManyAttempts": "Terlalu banyak percubaan" + }, + "assetPicker": { + "confirm": "Sahkan", + "cancel": "Batal", + "edit": "Sunting", + "gifIndicator": "GIF", + "loadFailed": "Gagal dimuat", + "original": "Asal", + "preview": "Pratonton", + "select": "Pilih", + "emptyList": "Senarai kosong", + "unSupportedAssetType": "Jenis fail tidak disokong.", + "unableToAccessAll": "Tidak dapat mengakses semua fail pada peranti", + "viewingLimitedAssetsTip": "Hanya lihat fail dan album yang boleh diakses oleh aplikasi.", + "changeAccessibleLimitedAssets": "Klik untuk mengemas kini fail yang boleh diakses", + "accessAllTip": "Aplikasi hanya dapat mengakses beberapa fail pada peranti. Pergi ke tetapan sistem dan benarkan aplikasi mengakses semua media pada peranti.", + "goToSystemSettings": "Pergi ke tetapan sistem", + "accessLimitedAssets": "Teruskan dengan akses terhad", + "accessiblePathName": "Fail yang boleh diakses", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Imej", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Media lain", + "sActionPlayHint": "main", + "sActionPreviewHint": "pratonton", + "sActionSelectHint": "pilih", + "sActionSwitchPathLabel": "tukar laluan", + "sActionUseCameraHint": "guna kamera", + "sNameDurationLabel": "tempoh", + "sUnitAssetCountLabel": "kiraan", + "@info": "Terjemahan untuk alat pemilihan Media untuk Android dan iPhone" + }, + "networkInterfacesPage": { + "info": "Secara lalai, LocalSend menggunakan semua antara muka rangkaian tersedia. Anda boleh memulaukan rangkaian yang tidak diingini. Anda perlu mula semula pelayan untuk mengenakan perubahan.", + "title": "Antara Muka Rangkaian", + "preview": "Pratonton", + "whitelist": "Senarai Putih", + "blacklist": "Senarai Hitam" + } +} diff --git a/app/assets/i18n/ne.json b/app/assets/i18n/ne.json new file mode 100644 index 0000000..6eaf7a4 --- /dev/null +++ b/app/assets/i18n/ne.json @@ -0,0 +1,525 @@ +{ + "locale": "नेपाली", + "appName": "LocalSend", + "general": { + "accept": "स्वीकार गर्नुहोस्", + "accepted": "स्वीकृत", + "add": "थप्नुहोस्", + "advanced": "उन्नत", + "cancel": "रद्द गर्नुहोस्", + "close": "बन्द गर्नुहोस्", + "confirm": "पुष्टि गर्नुहोस्", + "continueStr": "जारी राख्नुहोस्", + "copy": "कपी", + "copiedToClipboard": "क्लिपबोर्डमा प्रतिलिपि गरियो", + "decline": "अस्वीकार गर्नुहोस्", + "done": "सकियो", + "edit": "सम्पादन गर्नुहोस्", + "error": "त्रुटि", + "example": "उदाहरण", + "files": "फाइलहरू", + "finished": "समाप्त भयो", + "hide": "लुकाउनुहोस्", + "off": "बन्द", + "offline": "अफलाइन", + "on": "अन", + "online": "अनलाइन", + "open": "खोल्नुहोस्", + "queue": "लाम", + "quickSave": "छिटो सेव गर्नुहोस्", + "renamed": "नामाकरण गरियो", + "reset": "फिर्ता लिनुहोस्", + "restart": "पुनः सुरु", + "settings": "सेटिङहरू", + "skipped": "छोडियो", + "start": "सुरु", + "stop": "रोक", + "save": "सेव गर्नुहोस्", + "unchanged": "अपरिवर्तित", + "unknown": "अज्ञात", + "delete": "मेट्नुहोस्", + "noItemInClipboard": "क्लिपबोर्ड खाली छ।", + "quickSaveFromFavorites": "छिटो मनपर्नेमा राख्नुहोस्" + }, + "receiveTab": { + "title": "प्राप्त गर्नुहोस्", + "infoBox": { + "ip": "आईपी :", + "port": "पोर्ट:", + "alias": "उपकरणको नाम:" + }, + "quickSave": { + "favorites": "मनपर्नेहरू", + "on": "@:general.on", + "off": "@:general.off" + } + }, + "sendTab": { + "title": "पठाउनुहोस्", + "selection": { + "title": "चयन", + "files": "फाइलहरू: {files}", + "size": "आकार: {size}" + }, + "picker": { + "file": "फाइल", + "folder": "फोल्डर", + "media": "मिडिया", + "text": "पाठ", + "app": "अनुप्रयोग", + "clipboard": "पेस्ट गर्नुहोस्" + }, + "shareIntentInfo": "तपाईले आफ्नो मोबाइल उपकरणको \"साझेदारी\" सुविधा पनि प्रयोग गर्न सक्नुहुन्छ फाइलहरू थप सजिलै चयन गर्न।", + "nearbyDevices": "नजिकैका उपकरणहरू", + "thisDevice": "यो उपकरण", + "scan": "उपकरणहरू खोज्नुहोस्", + "sendMode": "पठाउने मोड", + "sendModes": { + "single": "एकल प्राप्तकर्ता", + "multiple": "एकाधिक प्राप्तकर्ता", + "link": "लिङ्क मार्फत सेयर गर्नुहोस्" + }, + "sendModeHelp": "स्पष्टीकरण", + "help": "कृपया सुनिश्चित गर्नुहोस् कि इच्छित लक्ष्य पनि उही वाइफाइ नेटवर्कमा छ।", + "placeItems": "साझेदारी गर्न वस्तुहरू राख्नुहोस्।", + "manualSending": "म्यानुअल पठाउने" + }, + "settingsTab": { + "title": "सेटिङहरू", + "general": { + "title": "सामान्य", + "brightness": "थीम", + "brightnessOptions": { + "system": "सिस्टम", + "dark": "अँध्यारो", + "light": "उज्यालो" + }, + "color": "रंग", + "colorOptions": { + "system": "सिस्टम", + "oled": "ओ एल ई डी" + }, + "language": "भाषा", + "languageOptions": { + "system": "सिस्टम" + }, + "saveWindowPlacement": "बन्द गरेपछि विन्डोको स्थिति सुरक्षित गर्नुहोस्", + "minimizeToTray": "छोड्नुहोस्: ट्रेमा न्यूनतम गर्नुहोस्", + "launchAtStartup": "लगइन पछि स्वत: सुरु गर्नुहोस्", + "launchMinimized": "स्वतः सुरु गर्नुहोस्: लुकेको सुरु गर्नुहोस्", + "animations": "एनिमेसनहरू", + "saveWindowPlacementWindows": "बाहिर निस्किएपछि विन्डोको स्थिति सुरक्षित गर्नुहोस्", + "showInContextMenu": "कन्टेक्स्ट मेनुमा LocalSend देखाउनुहोस्" + }, + "receive": { + "title": "प्राप्त गर्नुहोस्", + "quickSave": "@:general.quickSave", + "destination": "गन्तव्य", + "downloads": "(डाउनलोड)", + "saveToGallery": "मिडियालाई ग्यालरीमा सेभ गर्नुहोस्", + "saveToHistory": "इतिहासमा संचय गर्नुहोस्", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "स्वतः समाप्त" + }, + "network": { + "title": "नेटवर्क", + "needRestart": "सेटिङ्हरू लागू गर्न सर्भर पुन: सुरु गर्नुहोस्!", + "server": "सर्भर", + "alias": "उपकरणको नाम", + "deviceType": "उपकरणको प्रकार", + "deviceModel": "उपकरण मोडेल", + "port": "पोर्ट", + "portWarning": "आपको अन्य उपकर्णों द्वारा पहचाना नहीं जा सकता है क्योंकि आप कस्टम पोर्ट का उपयोग कर रहे हैं। (डिफ़ॉल्ट: {defaultPort})", + "encryption": "एनक्रिप्शन", + "multicastGroup": "मल्टीकास्ट", + "multicastGroupWarning": "आप अन्य उपकर्णों द्वारा पहचाना नहीं जा सकता है क्योंकि आप कस्टम मल्टीकास्ट पता का उपयोग कर रहे हैं। (डिफ़ॉल्ट: {defaultMulticast})", + "generateRandomAlias": "अनियमित उपनाम उत्पन्न गर्नुहोस्", + "useSystemName": "प्रणालीको नाम प्रयोग गर्नुहोस्", + "discoveryTimeout": "डिस्कभरी टाइमआउट", + "network": "नेटवर्क", + "networkOptions": { + "all": "सबै", + "filtered": "फिल्टर गरिएको" + } + }, + "advancedSettings": "उन्नत सेटिङहरू", + "send": { + "title": "पठाउनुहोस्", + "shareViaLinkAutoAccept": "\"लिङ्क मार्फत साझेदारी\" मोडमा स्वचालित रूपमा अनुरोधहरू स्वीकार गर्नुहोस्" + }, + "other": { + "donate": "दान गर्नुहोस्", + "title": "अन्य", + "privacyPolicy": "गोपनीयता नीति", + "termsOfUse": "प्रयोगका सर्तहरू", + "support": "LocalSend लाई समर्थन गर्नुहोस्" + } + }, + "troubleshootPage": { + "title": "समस्या निवारण गर्नुहोस्", + "subTitle": "के एपले अपेक्षा गरेअनुसार काम गर्दैन? यहाँ तपाईंले समस्याहरूको केही सामान्य समाधानहरू फेला पार्न सक्नुहुन्छ।", + "solution": "समाधान:", + "fixButton": "स्वतः समाधान गर्नुहोस्", + "firewall": { + "symptom": "यो यन्त्रले अन्य यन्त्रहरूमा फाइलहरू पठाउन सक्छ तर अन्य यन्त्रहरूले यस यन्त्रमा फाइलहरू पठाउन सक्दैनन्।", + "solution": "यो सम्भवतः फायरवाल समस्या हो। तपाईंले पोर्ट {port} मा आगमन जडानहरू (UDP र TCP) लाई अनुमति दिएर यो समाधान गर्न सक्नुहुन्छ।", + "openFirewall": "फायरवाल खोल्नुहोस्" + }, + "noConnection": { + "symptom": "दुबै उपकरणहरूले एकअर्कालाई पत्ता लगाउन सक्दैनन् न त फाइलहरू साझेदारी गर्न सक्छन्।", + "solution": "के समस्या दुवै तर्फ छ? यदि त्यसो हो भने, तपाईंले दुवै यन्त्रहरू एउटै Wi-Fi नेटवर्कमा छन् र एउटै कन्फिगरेसन (पोर्ट, मल्टिकास्ट ठेगाना, इन्क्रिप्शन) साझा गर्छन् भनी सुनिश्चित गर्नुपर्छ। पहुँच बिन्दु (AP) आइसोलेसनको कारणले Wi-Fi नेटवर्कले सहभागीहरू बीच सञ्चारलाई अनुमति नदिन सक्छ। यस अवस्थामा, यो विकल्प राउटरमा असक्षम पारिएको हुनुपर्छ।" + }, + "noDiscovery": { + "symptom": "यो उपकरणले अन्य उपकरणहरू पत्ता लगाउन सक्दैन।", + "solution": "कृपया सबै उपकरणहरू एउटै Wi-Fi नेटवर्कमा छन् र एउटै कन्फिगरेसन (पोर्ट, मल्टिकास्ट ठेगाना, इन्क्रिप्शन) साझा गर्छन् भनी सुनिश्चित गर्नुहोस्। तपाईं लक्षित उपकरणको IP ठेगाना म्यानुअल रूपमा टाइप गर्ने प्रयास गर्न सक्नुहुन्छ। यदि यसले काम गर्छ भने, यो उपकरणलाई मनपर्नेहरूमा थप्ने विचार गर्नुहोस् ताकि भविष्यमा यसलाई स्वचालित रूपमा पत्ता लगाउन सकियोस्।" + } + }, + "receiveHistoryPage": { + "title": "इतिहास", + "openFolder": "फोल्डर खोल्नुहोस्", + "deleteHistory": "इतिहास मेटाउनुहोस्", + "empty": "इतिहास खाली छ।", + "entryActions": { + "open": "फाइल खोल्नुहोस्", + "info": "सूचना", + "deleteFromHistory": "इतिहासबाट मेटाउनुहोस्", + "showInFolder": "फोल्डरमा हर्नुहोस" + } + }, + "apkPickerPage": { + "title": "अनुप्रयोग (APK)", + "excludeSystemApps": "प्रणाली एपहरू समावेश नगर्नुहोस्", + "excludeAppsWithoutLaunchIntent": "सुरु गर्न नसकिने एपहरू बहिष्कार गर्नुहोस्", + "apps": "{n} अनुप्रयोग" + }, + "selectedFilesPage": { + "deleteAll": "सबै मेटाउनुहोस्" + }, + "receivePage": { + "subTitle": { + "one": "तपाईंलाई एउटा फाइल पठाउन चाहन्छ", + "other": "तपाईलाई {n} फाइलहरू पठाउन चाहन्छ" + }, + "subTitleMessage": "तपाईलाई सन्देश पठाइयो:", + "subTitleLink": "तपाईंलाई लिङ्क पठाइयो:", + "canceled": "प्रेषकले अनुरोध रद्द गरेको छ।" + }, + "receiveOptionsPage": { + "title": "विकल्पहरू", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend फोल्डर)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "फोल्डरहरू भएकाले स्वतः बन्द भयो।" + }, + "sendPage": { + "waiting": "प्रतिक्रियाको प्रतीक्षा गर्दै…", + "rejected": "प्राप्तकर्ताले अनुरोध अस्वीकार गरेको छ।", + "busy": "प्राप्तकर्ता अर्को अनुरोधमा व्यस्त छ।", + "tooManyAttempts": "@:web.tooManyAttempts" + }, + "progressPage": { + "titleSending": "फाइलहरू पठाउँदै", + "titleReceiving": "फाइलहरू प्राप्त गर्दै", + "savedToGallery": "फोटोहरूमा सुरक्षित गरियो", + "total": { + "title": { + "sending": "कुल प्रगति ({time})", + "finishedError": "त्रुटि संग समाप्त भयो", + "canceledSender": "प्रेषकद्वारा रद्द गरियो", + "canceledReceiver": "प्राप्तकर्ता द्वारा रद्द गरियो" + }, + "count": "फाइलहरू: {curr} / {n}", + "size": "आकार: {curr} / {n}", + "speed": "गति: {speed}/s" + } + }, + "webSharePage": { + "title": "लिङ्क मार्फत सेयर गर्नुहोस्", + "loading": "सर्भर सुरु गर्दै…", + "stopping": "सर्भर रोकिँदै…", + "error": "सर्भर सुरु गर्दा एउटा त्रुटि भयो।", + "openLink": { + "one": "यो लिङ्क आफ्नो ब्राउजरमा खोल्नुहोस्:", + "other": "आफ्नो ब्राउजरमा यी मध्ये एउटा लिङ्क खोल्नुहोस्:" + }, + "requests": "अनुरोध", + "noRequests": "अहिलेसम्म कुनै अनुरोध छैन।", + "encryption": "@:settingsTab.network.encryption", + "encryptionHint": "LocalSend एक स्वयंसिग्ध प्रमाणपत्र प्रयोग गर्दछ। तपाईंले ब्राउजरमा यसलाई स्वीकार्नु पर्दछ।", + "pendingRequests": "लंबित अनुरोध: {n}", + "pinHint": "पिन \"{pin}\" हो", + "autoAccept": "स्वचालित रूपमा अनुरोधहरू स्वीकार गर्नुहोस्", + "requirePin": "पिन आवश्यक छ" + }, + "aboutPage": { + "title": "LocalSend को बारेमा", + "description": [ + "LocalSend एउटा नि:शुल्क, खुला स्रोत एप हो जसले तपाईंलाई इन्टरनेट जडानको आवश्यकता बिना नै आफ्नो स्थानीय नेटवर्कमा नजिकैका उपकरणहरूसँग फाइलहरू र सन्देशहरू सुरक्षित रूपमा साझेदारी गर्न अनुमति दिन्छ।", + "यो एप एन्ड्रोइड, आईओएस, म्याकओएस, विन्डोज र लिनक्समा उपलब्ध छ। तपाईंले आधिकारिक होमपेजमा सबै डाउनलोड विकल्पहरू फेला पार्न सक्नुहुन्छ।" + ], + "author": "लेखक", + "contributors": "योगदानकर्ताहरू", + "packagers": "प्याकेजरहरू", + "translators": "अनुवादकहरू" + }, + "changelogPage": { + "title": "परिवर्तन लग" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "फरक-फरक स्थानमा फरक-फरक शब्दहरू हुन सक्छन्, यो १:१ अनुपातमा नमिल्न सक्छ", + "adjectives": [ + "मनमोहक", + "सुन्दर", + "ठूलो", + "उज्यालो", + "सफा", + "चलाख", + "कूल", + "प्यारो", + "चतुर", + "निर्धारित", + "ऊर्जावान", + "कुशल", + "शानदार", + "छिटो", + "राम्रो", + "ताजा", + "राम्रो", + "भव्य", + "महान", + "सुन्दर", + "तातो", + "दयालु", + "प्यारो", + "रहस्यवादी", + "सफा", + "राम्रो", + "बिरामी", + "सुन्दर", + "शक्तिशाली", + "धनी", + "गोप्य", + "स्मार्ट", + "ठोस", + "विशेष", + "रणनीतिक", + "बलियो", + "व्यवस्थित", + "बुद्धिमान्" + ], + "fruits": [ + "स्याऊ", + "एभोकाडो", + "केरा", + "ब्ल्याकबेरी", + "ब्लूबेरी", + "ब्रोकाउली", + "गाजर", + "चेरी", + "नरिवल", + "अंगूर", + "कागती", + "सलाद", + "आँप", + "खरबुजा", + "च्याउ", + "प्याज", + "सुन्तला", + "पपीता", + "पीच", + "नाशपाती", + "अनानास", + "आलु", + "कद्दू", + "रास्पबेरी", + "स्ट्रबेरी", + "टमाटर" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "चयनमा थप्नुहोस्", + "content": "तपाईं के थप्न चाहनुहुन्छ?" + }, + "addressInput": { + "title": "ठेगाना प्रविष्ट गर्नुहोस्", + "hashtag": "ह्यासट्याग", + "ip": "IP ठेगाना", + "recentlyUsed": "हालसालै प्रयोग गरिएको: " + }, + "cancelSession": { + "title": "फाइल स्थानान्तरण रद्द गर्नुहोस्", + "content": "के तपाइँ साँच्चै फाइल स्थानान्तरण रद्द गर्न चाहनुहुन्छ?" + }, + "cannotOpenFile": { + "title": "फ़ाइल नहीं खोल सकते", + "content": "\"{file}\" फ़ाइल नहीं खोल सकती। क्या इस फ़ाइल को हटा दिया गया है, नाम बदल दिया गया है या मिटा दिया गया है?" + }, + "encryptionDisabledNotice": { + "title": "एन्क्रिप्शन अक्षम है", + "content": "अब संचरण बिना एनक्रिप्टों एचटीटीपी प्रोटोकॉल के माध्यम से होता है। एचटीटीपीएस का उपयोग करने के लिए, कृपया फिर से एन्क्रिप्शन सक्षम करें।" + }, + "errorDialog": { + "title": "@:general.error" + }, + "fileInfo": { + "title": "फ़ाइल की जानकारी", + "fileName": "फ़ाइल का नाम:", + "path": "पथ:", + "size": "आकार:", + "sender": "भेजने वाला:", + "time": "समय:" + }, + "fileNameInput": { + "title": "फाइल नाम प्रविष्ट गर्नुहोस्", + "original": "मूल: {original}" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend ले स्थानीय नेटवर्क स्क्यान गर्ने अनुमति बिना अन्य उपकरणहरू फेला पार्न सक्दैन। कृपया सेटिङहरूमा यो अनुमति दिनुहोस्।", + "gotoSettings": "सेटिंग्स" + }, + "messageInput": { + "title": "सन्देश टाइप गर्नुहोस्", + "multiline": "बहुरेखा" + }, + "noFiles": { + "title": "कुनै फाइल चयन गरिएको छैन", + "content": "कृपया कम्तिमा एउटा फाइल चयन गर्नुहोस्।" + }, + "noPermission": { + "title": "अनुमति नहीं है", + "content": "तपाईंले आवश्यक अनुमतिहरूको प्रदान गर्न दिएको छैन। कृपया सेटिङहरूमा तिनीहरूलाई प्रदान गर्नुहोस्।" + }, + "notAvailableOnPlatform": { + "title": "उपलब्ध छैन", + "content": "यो सुविधा निम्नमा मात्र उपलब्ध छ:" + }, + "qr": { + "title": "QR कोड" + }, + "quickActions": { + "title": "द्रुत कार्यहरू", + "counter": "काउन्टर", + "prefix": "उपसर्ग", + "padZero": "शून्य संग प्याड", + "sortBeforeCount": "पहिले वर्णमाला क्रमबद्ध गर्नुहोस्", + "random": "अनियमित" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "फाइल अनुरोधहरू अब स्वचालित रूपमा स्वीकार गरिन्छन्। स्थानीय नेटवर्कमा भएका सबैले तपाईंलाई फाइलहरू पठाउन सक्छन् भन्ने कुरामा सचेत रहनुहोस्।" + }, + "sendModeHelp": { + "title": "पठाउने मोडहरू", + "single": "एउटा प्राप्तकर्तालाई फाइलहरू पठाउँछ। फाइलहरू स्थानान्तरण सम्पन्न भएपछि चयन खाली गरिनेछ।", + "multiple": "धेरै प्राप्तकर्ताहरूलाई फाइलहरू पठाउँछ। फाइलहरू स्थानान्तरण समाप्त भएपछि चयन खाली गरिने छैन।", + "link": "LocalSend इन्स्टल नगरेका प्राप्तकर्ताहरूले आफ्नो ब्राउजरमा लिङ्क खोलेर चयन गरिएका फाइलहरू डाउनलोड गर्न सक्छन्।" + }, + "openFile": { + "title": "फाइल खोल्नुहोस्", + "content": "के तपाईं प्राप्त फाइल खोल्न चाहनुहुन्छ?" + }, + "favoriteDeleteDialog": { + "content": "के तपाईं साँच्चै मनपर्ने \"{name}\" बाट मेटाउन चाहनुहुन्छ?", + "title": "मनपर्नेहरूबाट हटाउनुहोस्" + }, + "favoriteDialog": { + "addFavorite": "थप्नुहोस्", + "title": "मनपर्नेहरू", + "noFavorites": "अहिलेसम्म कुनै पनि मनपर्ने उपकरणहरू छैनन्।" + }, + "favoriteEditDialog": { + "titleAdd": "मनपर्नेमा थप्नुहोस्", + "titleEdit": "सेटिङहरू", + "name": "उपकरणको नाम", + "auto": "(स्वचालित)", + "ip": "IP ठेगाना", + "port": "पोर्ट" + }, + "historyClearDialog": { + "title": "इतिहास खाली गर्नुहोस्", + "content": "के तपाईं साँच्चै सम्पूर्ण इतिहास मेटाउन चाहनुहुन्छ?" + }, + "quickSaveFromFavoritesNotice": { + "content": [ + "फाइल अनुरोधहरू अब तपाईंको मनपर्ने सूचीमा रहेका उपकरणहरूबाट स्वचालित रूपमा स्वीकार गरिन्छन्।", + "चेतावनी! हाल, यो पूर्ण रूपमा सुरक्षित छैन, किनकि तपाईंको मनपर्ने सूचीबाट कुनै पनि उपकरणको फिंगरप्रिन्ट भएको ह्याकरले तपाईंलाई बिना प्रतिबन्ध फाइलहरू पठाउन सक्छ।", + "यद्यपि, यो विकल्प स्थानीय नेटवर्कमा रहेका सबै प्रयोगकर्ताहरूलाई तपाईंलाई कुनै प्रतिबन्ध बिना फाइलहरू पठाउन अनुमति दिनु भन्दा अझै सुरक्षित छ।" + ] + }, + "pin": { + "title": "पिन प्रविष्ट गर्नुहोस्" + }, + "zoom": { + "title": "URL" + } + }, + "tray": { + "@info": "Apple दिशानिर्देशहरू 'नजिक' शब्दको बारेमा धेरै सख्त छन्।", + "open": "@:general.open", + "close": "LocalSend बन्द गर्नुहोस्", + "closeWindows": "बाहिर निस्कनुहोस्" + }, + "web": { + "waiting": "@:sendPage.waiting", + "rejected": "अस्वीकृत", + "files": "फाइलहरू", + "fileName": "फाइलको नाम", + "size": "आकार", + "enterPin": "पिन प्रविष्ट गर्नुहोस्", + "invalidPin": "अमान्य पिन", + "tooManyAttempts": "धेरै प्रयासहरू" + }, + "assetPicker": { + "@info": "एन्ड्रोइड र आईफोनको लागि मिडिया चयन उपकरणको लागि अनुवादहरू", + "confirm": "पुष्टि गर्नुहोस्", + "cancel": "रद्द गर्नुहोस्", + "edit": "सम्पादन गर्नुहोस्", + "gifIndicator": "GIF", + "loadFailed": "लोड गर्न मिलेन", + "original": "मूल", + "preview": "पूर्वावलोकन गर्नुहोस्", + "select": "छान्नुहोस्", + "emptyList": "खाली सूची", + "unSupportedAssetType": "असमर्थित फाईल प्रकार।", + "unableToAccessAll": "यस उपकरणमा सबै फाईलहरूमा पहुँच प्राप्त गर्न सकिएन", + "viewingLimitedAssetsTip": "केवल फाईलहरू र एल्बमहरूलाई अनुप्रयोगको लागि पहुँचयोग्य हेर्नुहोस्।", + "changeAccessibleLimitedAssets": "पहुँचयोग्य फाईलहरू अद्यावधिक गर्न क्लिक गर्नुहोस्", + "accessAllTip": "अनुप्रयोगमा केहि फाईलहरूलाई मात्र पहुँच गर्न सक्दछ। प्रणाली सेटिङ्समा जानुहोस् र उपकरणमा सबै मिडिया मा अनुप्रयोगलाई पहुँच दिनुहोस्।", + "goToSystemSettings": "प्रणाली सेटिंग्समा जानुहोस्", + "accessLimitedAssets": "सीमित पहुँचको साथ जारी राख्नुहोस्", + "accessiblePathName": "पहुँचीने फाईलहरू", + "sTypeAudioLabel": "अडियो", + "sTypeImageLabel": "तस्वीर", + "sTypeVideoLabel": "भिडियो", + "sTypeOtherLabel": "अन्य मिडिया", + "sActionPlayHint": "प्ले गर्नुहोस्", + "sActionPreviewHint": "अग्रिम पूर्वावलोकन गर्नुहोस्", + "sActionSelectHint": "छान्नुहोस्", + "sActionSwitchPathLabel": "पथ परिवर्तन गर्नुहोस्", + "sActionUseCameraHint": "क्यामेरा प्रयोग गर्नुहोस्", + "sNameDurationLabel": "समय अवधि", + "sUnitAssetCountLabel": "गणना" + }, + "networkInterfacesPage": { + "title": "नेटवर्क इन्टरफेसहरू", + "preview": "पूर्वावलोकन", + "blacklist": "कालोसूची", + "whitelist": "श्वेतसूची", + "info": "पूर्वनिर्धारित रूपमा, LocalSend ले सबै उपलब्ध नेटवर्क इन्टरफेसहरू प्रयोग गर्दछ। तपाईं यहाँ अनावश्यक नेटवर्कहरू बहिष्कार गर्न सक्नुहुन्छ। परिवर्तनहरू लागू गर्न तपाईंले सर्भर पुन: सुरु गर्न आवश्यक छ।" + }, + "donationPage": { + "title": "दान गर्नुहोस्", + "info": "LocalSend नि:शुल्क, खुला स्रोत र कुनै पनि विज्ञापन बिनाको एप हो। यदि तपाईंलाई एप मनपर्छ भने, तपाईंले दान दिएर विकासलाई समर्थन गर्न सक्नुहुन्छ।", + "donate": "{amount} दान गर्नुहोस्", + "thanks": "धेरै धन्यवाद!", + "restore": "खरिद पुनर्स्थापित गर्नुहोस्" + }, + "sanitization": { + "empty": "फाइलको नाम खाली हुन सक्दैन", + "invalid": "फाइलको नाममा अवैध वर्णहरू छन्" + } +} diff --git a/app/assets/i18n/nl.json b/app/assets/i18n/nl.json new file mode 100644 index 0000000..017e0c7 --- /dev/null +++ b/app/assets/i18n/nl.json @@ -0,0 +1,465 @@ +{ + "locale": "Nederlands", + "appName": "LocalSend", + "general": { + "accept": "Accepteren", + "accepted": "Geaccepteerd", + "add": "Toevoegen", + "advanced": "Geavanceerd", + "cancel": "Annuleren", + "close": "Sluiten", + "confirm": "Bevestigen", + "continueStr": "Doorgaan", + "copy": "Kopiëren", + "copiedToClipboard": "Gekopieerd naar klembord", + "decline": "Weigeren", + "done": "Gereed", + "delete": "Verwijderen", + "edit": "Bewerken", + "error": "Fout", + "example": "Voorbeeld", + "files": "Bestanden", + "finished": "Voltooid", + "hide": "Verbergen", + "off": "Uit", + "offline": "Offline", + "on": "Aan", + "online": "Online", + "open": "Openen", + "queue": "Wachtrij", + "quickSave": "Snel opslaan", + "quickSaveFromFavorites": "Snel opslaan voor 'Favorieten'", + "renamed": "Hernoemd", + "reset": "Herstellen", + "restart": "Opnieuw starten", + "settings": "Instellingen", + "skipped": "Overgeslagen", + "start": "Starten", + "stop": "Stoppen", + "save": "Opslaan", + "unchanged": "Ongewijzigd", + "unknown": "Onbekend", + "noItemInClipboard": "Het klembord is leeg." + }, + "receiveTab": { + "title": "Ontvangen", + "infoBox": { + "ip": "IP-adres:", + "port": "Poort:", + "alias": "Apparaatnaam:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favorieten", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Verzenden", + "selection": { + "title": "Selectie", + "files": "Bestanden: {files}", + "size": "Grootte: {size}" + }, + "picker": { + "file": "Bestand", + "folder": "Map", + "media": "Media", + "text": "Tekst", + "app": "App", + "clipboard": "Plakken" + }, + "shareIntentInfo": "Je kunt ook de functie 'Delen' van je mobiele apparaat gebruiken om gemakkelijker bestanden te selecteren.", + "nearbyDevices": "Apparaten in de buurt", + "thisDevice": "Dit apparaat", + "scan": "Apparaten zoeken", + "manualSending": "Handmatig verzenden", + "sendMode": "Verzendmodus", + "sendModes": { + "single": "Eén ontvanger", + "multiple": "Meerdere ontvangers", + "link": "Delen via link" + }, + "sendModeHelp": "Informatie", + "help": "Zorg ervoor dat de ontvanger is verbonden met hetzelfde wifi-netwerk.", + "placeItems": "Zet items neer om te delen." + }, + "settingsTab": { + "title": "Instellingen", + "general": { + "title": "Algemeen", + "brightness": "Thema", + "brightnessOptions": { + "system": "Systeem", + "dark": "Donker", + "light": "Licht" + }, + "color": "Kleur", + "colorOptions": { + "system": "Systeem", + "oled": "OLED" + }, + "language": "Taal", + "languageOptions": { + "system": "Systeem" + }, + "saveWindowPlacement": "Vensterpositie na beëindigen opslaan", + "saveWindowPlacementWindows": "Vensterpositie na afsluiten opslaan", + "minimizeToTray": "Sluiten: minimaliseren naar systeemvak/menubalk", + "launchAtStartup": "Automatisch starten na aanmelden", + "launchMinimized": "Automatisch starten: verborgen", + "showInContextMenu": "LocalSend weergeven in contextmenu", + "animations": "Animaties" + }, + "receive": { + "title": "Ontvangen", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Automatisch voltooien", + "destination": "Opslaan in map", + "downloads": "(Downloads)", + "saveToGallery": "Media opslaan in galerij", + "saveToHistory": "Opslaan in geschiedenis" + }, + "send": { + "title": "Verzenden", + "shareViaLinkAutoAccept": "Automatisch verzoeken goedkeuren in modus 'Delen via link'" + }, + "network": { + "title": "Netwerk", + "needRestart": "Start de server opnieuw op om de instellingen toe te passen!", + "server": "Server", + "alias": "Apparaatnaam", + "deviceType": "Apparaattype", + "deviceModel": "Apparaatmodel", + "port": "Poort", + "discoveryTimeout": "Time-out voor scannen", + "useSystemName": "Systeemnaam gebruiken", + "generateRandomAlias": "Willekeurige naam genereren", + "portWarning": "Je apparaat kan mogelijk niet worden gevonden omdat je een aangepaste poort gebruikt. (Standaard: {defaultPort})", + "encryption": "Versleuteling", + "multicastGroup": "Multicast-adres", + "multicastGroupWarning": "Je apparaat kan mogelijk niet worden gevonden omdat je een aangepast multicast-adres gebruikt. (Standaard: {defaultMulticast})", + "network": "Netwerk", + "networkOptions": { + "all": "Alle", + "filtered": "Gefilterd" + } + }, + "other": { + "title": "Overig", + "support": "LocalSend steunen", + "donate": "Doneren", + "privacyPolicy": "Privacybeleid", + "termsOfUse": "Gebruiksvoorwaarden" + }, + "advancedSettings": "Geavanceerde instellingen" + }, + "troubleshootPage": { + "title": "Problemen oplossen", + "subTitle": "Werkt de app niet zoals verwacht? Op deze pagina vind je oplossingen voor veelvoorkomende problemen.", + "solution": "Oplossing:", + "fixButton": "Automatisch oplossen", + "firewall": { + "symptom": "Dit apparaat kan bestanden naar andere apparaten verzenden, maar andere apparaten kunnen geen bestanden naar dit apparaat verzenden.", + "solution": "Dit is hoogstwaarschijnlijk een firewallprobleem. Je kunt dit oplossen door inkomende verbindingen (UDP en TCP) op poort {port} toe te staan.", + "openFirewall": "Firewall openen" + }, + "noDiscovery": { + "symptom": "Dit apparaat vindt geen andere apparaten.", + "solution": "Zorg ervoor dat alle apparaten met hetzelfde wifi-netwerk zijn verbonden en dat ze dezelfde configuratie hebben (poort, multicast-adres, versleuteling). Je kunt proberen het IP-adres van het apparaat handmatig in te vullen. Als dat werkt, kun je het apparaat toevoegen aan je favorieten, zodat het voortaan automatisch kan worden gevonden." + }, + "noConnection": { + "symptom": "Beide apparaten kunnen elkaar niet vinden en kunnen ook geen bestanden delen.", + "solution": "Doet het probleem zich aan beide kanten voor? Zorg er dan voor dat beide apparaten met hetzelfde wifi-netwerk zijn verbonden en dat ze dezelfde configuratie hebben (poort, multicast-address, versleuteling). Mogelijk is onderlinge communicatie tussen apparaten op het wifi-netwerk geblokkeerd (AP-isolatie). Dit moet je dan toestaan in de instellingen van je router." + } + }, + "receiveHistoryPage": { + "title": "Geschiedenis", + "openFolder": "Map openen", + "deleteHistory": "Geschiedenis verwijderen", + "empty": "De geschiedenis is leeg.", + "entryActions": { + "open": "Bestand openen", + "showInFolder": "Weergeven in map", + "info": "Informatie", + "deleteFromHistory": "Verwijderen uit geschiedenis" + } + }, + "apkPickerPage": { + "title": "Apps (APK)", + "excludeSystemApps": "Systeemapps uitsluiten", + "excludeAppsWithoutLaunchIntent": "Niet-startbare apps uitsluiten", + "apps": "{n} apps" + }, + "selectedFilesPage": { + "deleteAll": "Alles verwijderen" + }, + "receivePage": { + "subTitle": { + "one": "wil een bestand naar je verzenden", + "other": "wil {n} bestanden naar je verzenden" + }, + "subTitleMessage": "heeft een bericht naar je verzonden:", + "subTitleLink": "heeft een link naar je verzonden:", + "canceled": "De verzender heeft het verzoek geannuleerd." + }, + "receiveOptionsPage": { + "title": "Opties", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend-map)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Automatisch uitgezet omdat er mappen bij zitten." + }, + "sendPage": { + "waiting": "Wachten op antwoord…", + "rejected": "De ontvanger heeft het verzoek geweigerd.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "De ontvanger is bezig met een ander verzoek." + }, + "progressPage": { + "titleSending": "Bestanden verzenden", + "titleReceiving": "Bestanden ontvangen", + "savedToGallery": "Opgeslagen in galerij", + "total": { + "title": { + "sending": "Totale voortgang ({time})", + "finishedError": "Voltooid met fouten", + "canceledSender": "Geannuleerd door verzender", + "canceledReceiver": "Geannuleerd door ontvanger" + }, + "count": "Bestanden: {curr} / {n}", + "size": "Grootte: {curr} / {n}", + "speed": "Snelheid: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Gebruik 'h' als afkorting voor uren en 'm' voor minuten", + "@days": "Gebruik 'd' voor dagen, 'h' voor uren en 'm' voor minuten" + } + }, + "webSharePage": { + "title": "Delen via link", + "loading": "Server starten…", + "stopping": "Server stoppen…", + "error": "Er is een fout opgetreden bij het starten van de server.", + "openLink": { + "one": "Open deze link in je browser:", + "other": "Open een van deze links in je browser:" + }, + "requests": "Verzoeken", + "noRequests": "Nog geen verzoeken.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Verzoeken automatisch accepteren", + "requirePin": "Code vereisen", + "pinHint": "De PINcode is \"{pin}\"", + "encryptionHint": "LocalSend maakt gebruik van een zelfondertekend certificaat. Je moet dit accepteren in je browser.", + "pendingRequests": "Openstaande verzoeken: {n}" + }, + "aboutPage": { + "title": "Over LocalSend", + "description": [ + "LocalSend is een gratis en opensource app waarmee je veilig bestanden en berichten met apparaten op je lokale netwerk kunt delen, zonder internetverbinding.", + "De app is beschikbaar voor Android, iOS, macOS, Windows en Linux. Je vindt alle downloadopties op de officiële website." + ], + "author": "Auteur", + "contributors": "Bijdragers", + "packagers": "Distributeurs", + "translators": "Vertalers" + }, + "donationPage": { + "title": "Doneren", + "info": "LocalSend is gratis, opensource en advertentievrij. Als je de app graag gebruikt, kun je de ontwikkeling steunen middels een donatie.", + "donate": "{amount} doneren", + "thanks": "Ontzettend bedankt!", + "restore": "Aankoop herstellen" + }, + "changelogPage": { + "title": "Wijzigingenoverzicht" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "Toevoegen aan selectie", + "content": "Wat wil je toevoegen?" + }, + "openFile": { + "title": "Bestand openen", + "content": "Wil je het ontvangen bestand openen?" + }, + "addressInput": { + "title": "Vul een adres in", + "hashtag": "Hashtag", + "ip": "IP-adres", + "recentlyUsed": "Onlangs gebruikt: " + }, + "cancelSession": { + "title": "Bestandsoverdracht annuleren", + "content": "Wil je de bestandsoverdracht annuleren?" + }, + "cannotOpenFile": { + "title": "Kan bestand niet openen", + "content": "Het bestand \"{file}\" kan niet worden geopend. Is het mogelijk verplaatst, hernoemd of verwijderd?" + }, + "encryptionDisabledNotice": { + "title": "Versleuteling uitgeschakeld", + "content": "Communicatie verloopt nu via het onversleutelde HTTP-protocol. Schakel versleuteling weer in om het HTTPS-protocol te gebruiken." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favorieten", + "noFavorites": "Nog geen favoriete apparaten.", + "addFavorite": "Toevoegen" + }, + "favoriteDeleteDialog": { + "title": "Verwijderen uit favorieten", + "content": "Wil je '{name}' uit je favorieten verwijderen?" + }, + "favoriteEditDialog": { + "titleAdd": "Toevoegen aan favorieten", + "titleEdit": "Instellingen", + "name": "Apparaatnaam", + "auto": "(automatisch)", + "ip": "IP-adres", + "port": "Poort" + }, + "fileInfo": { + "title": "Bestandsinformatie", + "fileName": "Bestandsnaam:", + "path": "Locatie:", + "size": "Grootte:", + "sender": "Afzender:", + "time": "Tijd:" + }, + "fileNameInput": { + "title": "Vul een bestandsnaam in", + "original": "Origineel: {original}" + }, + "historyClearDialog": { + "title": "Geschiedenis wissen", + "content": "Wil je de volledige geschiedenis verwijderen?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend heeft rechten nodig om op het lokale netwerk naar andere apparaten te kunnen zoeken. Verleen deze rechten in de instellingen.", + "gotoSettings": "Instellingen" + }, + "messageInput": { + "title": "Typ een bericht", + "multiline": "Meerdere regels" + }, + "noFiles": { + "title": "Geen bestanden geselecteerd", + "content": "Selecteer ten minste één bestand." + }, + "noPermission": { + "title": "Geen rechten", + "content": "Je hebt de benodigde rechten niet verleend. Verleen deze in de instellingen." + }, + "notAvailableOnPlatform": { + "title": "Niet beschikbaar", + "content": "Deze functie is alleen beschikbaar op:" + }, + "qr": { + "title": "QR-code" + }, + "quickActions": { + "title": "Snelle acties", + "counter": "Teller", + "prefix": "Voorvoegsel", + "padZero": "Aanvullen met nullen", + "sortBeforeCount": "Vooraf alfabetisch sorteren (A-Z)", + "random": "Willekeurig" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Bestandsverzoeken worden nu automatisch geaccepteerd. Iedereen op het lokale netwerk kan nu dus bestanden naar je verzenden." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Bestandsverzoeken van apparaten op je favorietenlijst worden nu automatisch geaccepteerd.", + "Waarschuwing! Dit is momenteel niet volkomen veilig. Een hacker die beschikt over de digitale vingerafdruk van een apparaat op je favorietenlijst zou zonder enige beperking bestanden naar je kunnen verzenden.", + "Desalniettemin is deze optie alsnog veiliger dan wanneer je zou toestaan dat alle gebruikers op het lokale netwerk bestanden naar je kunnen verzenden." + ] + }, + "pin": { + "title": "Vul de code in" + }, + "sendModeHelp": { + "title": "Verzendmodi", + "single": "Bestanden naar één ontvanger verzenden. De selectie wordt na de bestandsoverdracht gewist.", + "multiple": "Bestanden naar meerdere ontvangers verzenden. De selectie blijft na de bestandsoverdracht behouden.", + "link": "Ontvangers die LocalSend niet hebben geïnstalleerd kunnen de bestanden downloaden door de link in hun browser te openen." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Bestandsnaam mag niet leeg zijn", + "invalid": "Bestandsnaam bevat ongeldige tekens" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the \"close\" wording.", + "open": "@:general.open", + "close": "LocalSend afsluiten", + "closeWindows": "Sluiten" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Vul de code in", + "invalidPin": "Ongeldige code", + "tooManyAttempts": "Te veel pogingen", + "rejected": "Geweigerd", + "files": "Bestanden", + "fileName": "Bestandsnaam", + "size": "Grootte" + }, + "assetPicker": { + "@info": "Vertalingen voor de Mediaselectietool voor Android en iPhone", + "confirm": "Bevestigen", + "cancel": "Annuleren", + "edit": "Bewerken", + "gifIndicator": "GIF", + "loadFailed": "Laden mislukt", + "original": "Herkomst", + "preview": "Voorbeeld", + "select": "Selecteren", + "emptyList": "Lege lijst", + "unSupportedAssetType": "Niet-ondersteund bestandstype.", + "unableToAccessAll": "Geen toegang tot alle bestanden op het apparaat", + "viewingLimitedAssetsTip": "De app heeft beperkte toegang tot bestanden.", + "changeAccessibleLimitedAssets": "Toegankelijke bestanden aanpassen", + "accessAllTip": "De app heeft slechts beperkte toegang tot je bestanden. Ga naar de systeeminstellingen om de toegangsrechten aan te passen.", + "goToSystemSettings": "Naar systeeminstellingen", + "accessLimitedAssets": "Doorgaan met beperkte toegang", + "accessiblePathName": "Toegankelijke bestanden", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Foto's", + "sTypeVideoLabel": "Video's", + "sTypeOtherLabel": "Andere media", + "sActionPlayHint": "afspelen", + "sActionPreviewHint": "voorbeeld", + "sActionSelectHint": "selecteren", + "sActionSwitchPathLabel": "pad wijzigen", + "sActionUseCameraHint": "camera gebruiken", + "sNameDurationLabel": "duur", + "sUnitAssetCountLabel": "aantal" + }, + "networkInterfacesPage": { + "preview": "Voorvertoning", + "title": "Netwerkinterfaces", + "info": "Standaard gebruikt LocalSend alle beschikbare netwerkinterfaces. U kunt hier ongewenste netwerken uitsluiten. U moet de server opnieuw opstarten om de wijzigingen toe te passen.", + "whitelist": "Whitelist", + "blacklist": "Blacklist" + } +} diff --git a/app/assets/i18n/pl.json b/app/assets/i18n/pl.json new file mode 100644 index 0000000..4538494 --- /dev/null +++ b/app/assets/i18n/pl.json @@ -0,0 +1,465 @@ +{ + "locale": "Polski", + "appName": "LocalSend", + "general": { + "accept": "Akceptuj", + "accepted": "Zaakceptowane", + "add": "Dodaj", + "advanced": "Zaawansowane", + "cancel": "Anuluj", + "close": "Zamknij", + "confirm": "Potwierdź", + "continueStr": "Dalej", + "copy": "Kopiuj", + "copiedToClipboard": "Skopiowane do schowka", + "decline": "Odrzuć", + "done": "Gotowe", + "delete": "Usuń", + "edit": "Edytuj", + "error": "Błąd", + "example": "Przykład", + "files": "Pliki", + "finished": "Skończone", + "hide": "Schowaj", + "off": "Wyłączony", + "offline": "Offline", + "on": "Włączony", + "online": "Online", + "open": "Otwórz", + "queue": "Kolejka", + "quickSave": "Szybki zapis", + "quickSaveFromFavorites": "Szybki zapis dla „Ulubionych”", + "renamed": "Przemianowany", + "reset": "Resetowanie", + "restart": "Restartuj", + "settings": "Ustawienia", + "skipped": "Pominięty", + "start": "Zacznij", + "stop": "Zatrzymaj", + "save": "Zapisz", + "unchanged": "Bez zmian", + "unknown": "Nieznany", + "noItemInClipboard": "Schowek jest pusty" + }, + "receiveTab": { + "title": "Odbierz", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Alias:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Ulubione", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Wyślij", + "selection": { + "title": "Wybór", + "files": "Pliki: {files}", + "size": "Wielkość: {size}" + }, + "picker": { + "file": "Plik", + "folder": "Folder", + "media": "Media", + "text": "Tekst", + "app": "Aplikacja", + "clipboard": "Wklej" + }, + "shareIntentInfo": "Możesz także skorzystać z funkcji „Udostępnij” swojego urządzenia mobilnego, aby łatwiej wybierać pliki.", + "nearbyDevices": "Urządzenia w pobliżu", + "thisDevice": "To urządzenie", + "scan": "Szukaj urządzeń", + "manualSending": "Wysyłanie ręczne", + "sendMode": "Tryb wysyłania", + "sendModes": { + "single": "Pojedynczy odbiorca", + "multiple": "Wielu odbiorców", + "link": "Udostępnij przez link" + }, + "sendModeHelp": "Wyjaśnienie", + "help": "Upewnij się, że żądany cel również znajduje się w tej samej sieci Wi-Fi.", + "placeItems": "Umieść elementy do udostępnienia." + }, + "settingsTab": { + "title": "Ustawienia", + "general": { + "title": "Ogólne", + "brightness": "Motyw", + "brightnessOptions": { + "system": "Systemowy", + "dark": "Ciemny", + "light": "Jasny" + }, + "color": "Kolor", + "colorOptions": { + "system": "Systemowy", + "oled": "OLED" + }, + "language": "Język", + "languageOptions": { + "system": "Systemowy" + }, + "saveWindowPlacement": "Zapisz pozycję okna po zakończeniu", + "saveWindowPlacementWindows": "Zapisz pozycję okna po zamknięciu", + "minimizeToTray": "Zminimalizuj do menu ukrytych ikon przy zamykaniu", + "launchAtStartup": "Autostart po zalogowaniu", + "launchMinimized": "Autostart: start ukryty", + "showInContextMenu": "Pokaż LocalSend w menu kontekstowym", + "animations": "Animacje" + }, + "receive": { + "title": "Odbierz", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Zakończ automatycznie", + "destination": "Miejsce docelowe", + "downloads": "(Pobrane)", + "saveToGallery": "Zapisz media w galerii", + "saveToHistory": "Zapisz w historii" + }, + "send": { + "title": "Wyślij", + "shareViaLinkAutoAccept": "Udostępnij przez link: akceptuj automatycznie" + }, + "network": { + "title": "Sieć", + "needRestart": "Uruchom ponownie serwer, aby zastosować ustawienia!", + "server": "Serwer", + "alias": "Alias", + "deviceType": "Typ urządzenia", + "deviceModel": "Model urządzenia", + "port": "Port", + "discoveryTimeout": "Limit czasu wykrywania", + "useSystemName": "Użyj nazwy systemu", + "generateRandomAlias": "Wygeneruj losowy alias", + "portWarning": "Inne urządzenia mogą nie wykryć Twojego urządzenia, ponieważ używasz niestandardowego portu. (domyślnie: {defaultPort})", + "encryption": "Szyfrowanie", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Inne urządzenia mogą nie wykryć Twojego urządzenia, ponieważ używasz niestandardowego adresu multicast. (domyślnie: {defaultMulticast})", + "networkOptions": { + "all": "Wszystkie", + "filtered": "Przefiltrowane" + }, + "network": "Sieć" + }, + "other": { + "title": "Inne", + "support": "Wesprzyj LocalSend", + "donate": "Przekaż darowiznę", + "privacyPolicy": "Polityka prywatności", + "termsOfUse": "Warunki korzystania" + }, + "advancedSettings": "Zaawansowane ustawienia" + }, + "troubleshootPage": { + "title": "Rozwiązywanie problemów", + "subTitle": "Aplikacja nie działa zgodnie z oczekiwaniami? Tutaj znajdziesz powszechne rozwiązania.", + "solution": "Rozwiązanie:", + "fixButton": "Napraw automatycznie", + "firewall": { + "symptom": "Aplikacja może wysyłać pliki do innych urządzeń, ale inne urządzenia nie mogą wysyłać plików do tego urządzenia.", + "solution": "Prawdopodobnie jest to problem z zaporą. Możesz go rozwiązać, zezwalając na przychodzące połączenia (UDP i TCP) na porcie {port}.", + "openFirewall": "Otwórz zaporę" + }, + "noDiscovery": { + "symptom": "To urządzenie nie może wykryć innych urządzeń.", + "solution": "Upewnij się, że wszystkie urządzenia są w tej samej sieci Wi-Fi i mają tę samą konfigurację (port, adres multiemisji, szyfrowanie). Możesz spróbować wpisać adres IP urządzenia docelowego ręcznie. Jeśli to zadziała, rozważ dodanie tego urządzenia do ulubionych, aby mogło zostać automatycznie wykryte w przyszłości." + }, + "noConnection": { + "symptom": "Oba urządzenia nie mogą się nawzajem wykryć ani dzielić się plikami.", + "solution": "Problem istnieje po obu stronach? Upewnij się, że oba urządzenia są w tej samej sieci Wi-Fi i mają takie same ustawienia (port, adres multicast, szyfrowanie). Wi-Fi może nie zezwalać na komunikację między uczestnikami z powodu izolacji punktu dostępu (AP). W takim przypadku tę opcję należy wyłączyć w routerze." + } + }, + "receiveHistoryPage": { + "title": "Historia", + "openFolder": "Otwórz folder", + "deleteHistory": "Usuń historię", + "empty": "Historia jest pusta.", + "entryActions": { + "open": "Otwórz plik", + "showInFolder": "Pokaż w folderze", + "info": "Informacje", + "deleteFromHistory": "Usuń z historii" + } + }, + "apkPickerPage": { + "title": "Aplikacje (APK)", + "excludeSystemApps": "Wyklucz aplikacje systemowe", + "excludeAppsWithoutLaunchIntent": "Wyklucz aplikacje niewystartowalne", + "apps": "{n} aplikacje" + }, + "selectedFilesPage": { + "deleteAll": "Usuń wszystko" + }, + "receivePage": { + "subTitle": { + "one": "chce wysłać Ci plik", + "other": "chce wysłać Ci {n} plików" + }, + "subTitleMessage": "wysłał Ci wiadomość:", + "subTitleLink": "wysłał Ci link:", + "canceled": "Nadawca anulował żądanie." + }, + "receiveOptionsPage": { + "title": "Opcje", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(Folder LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Wyłączono automatycznie, ponieważ istnieją katalogi." + }, + "sendPage": { + "waiting": "Czekanie na odpowiedź…", + "rejected": "Odbiorca odrzucił żądanie.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Odbiorca jest zajęty innym żądaniem." + }, + "progressPage": { + "titleSending": "Wysyłanie plików", + "titleReceiving": "Odbieranie plików", + "savedToGallery": "Zapisane w galerii", + "total": { + "title": { + "sending": "Całkowity postęp ({time})", + "finishedError": "Zakończono z błędem", + "canceledSender": "Anulowane przez nadawcę", + "canceledReceiver": "Anulowane przez odbiorcę" + }, + "count": "Pliki: {curr} / {n}", + "size": "Wielkość: {curr} / {n}", + "speed": "Prędkość: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Użyj „h” w przypadku skrótu godzin i „m” w przypadku minut", + "@days": "Uży „d” w przypadku dni, „h” w przypadku godzin i „m” w przypadku minut" + } + }, + "webSharePage": { + "title": "Udostępnij przez link", + "loading": "Uruchamianie serwera…", + "stopping": "Zatrzymywanie serwera…", + "error": "Wystąpił błąd podczas uruchamiania serwera.", + "openLink": { + "one": "Otwórz ten link w przeglądarce:", + "other": "Otwórz jeden z tych linków w przeglądarce:" + }, + "requests": "Żądania", + "noRequests": "Brak żądań.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Automatycznie akceptuj żądania", + "requirePin": "Wymagaj kodu PIN", + "pinHint": "Kod PIN to „{pin}”", + "encryptionHint": "LocalSend używa samopodpisanego certyfikatu. Musisz go zaakceptować w przeglądarce.", + "pendingRequests": "Oczekujące żądania: {n}" + }, + "aboutPage": { + "title": "O LocalSend", + "description": [ + "LocalSend jest darmową, otwartoźródłową aplikacją, która pozwala na bezpieczne udostępnianie plików i wiadomości urządzeniom w pobliżu poprzez Twoją sieć lokalną, bez konieczności połączenia z internetem.", + "Ta aplikacja jest dostępna na systemach Android, iOS, macOS, Windows i Linux. Możesz znaleźć wszystkie opcje pobierania na oficjalnej stronie głównej." + ], + "author": "Autor", + "contributors": "Współautorzy", + "packagers": "Pakujący", + "translators": "Tłumacze" + }, + "donationPage": { + "title": "Przekaż darowiznę", + "info": "LocalSend jest darmową, otwartoźródłową aplikacją bez żadnych reklam. Jeśli podoba Ci się aplikacja, możesz wesprzeć jej rozwój darowizną.", + "donate": "Przekaż {amount}", + "thanks": "Bardzo Ci dziękuję!", + "restore": "Przywróć zakup" + }, + "changelogPage": { + "title": "Dziennik zmian" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "Dodaj do wyboru", + "content": "Co chcesz dodać?" + }, + "openFile": { + "title": "Otwórz plik", + "content": "Czy chcesz otworzyć odebrany plik?" + }, + "addressInput": { + "title": "Wpisz adres", + "hashtag": "Hashtag", + "ip": "Adres IP", + "recentlyUsed": "Ostatnio używane: " + }, + "cancelSession": { + "title": "Anuluj transfer plików", + "content": "Czy na pewno chcesz anulować transfer plików?" + }, + "cannotOpenFile": { + "title": "Nie można otworzyć pliku", + "content": "Nie można otworzyć „{file}”. Czy ten plik został przeniesiony, zmieniono mu nazwę lub usunięto?" + }, + "encryptionDisabledNotice": { + "title": "Szyfrowanie wyłączone", + "content": "Komunikacja odbywa się teraz za pomocą niezaszyfrowanego protokołu HTTP. Aby korzystać z HTTPS, włącz ponownie szyfrowanie." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Ulubione", + "noFavorites": "Brak ulubionych urządzeń.", + "addFavorite": "Dodaj" + }, + "favoriteDeleteDialog": { + "title": "Usuń z ulubionych", + "content": "Czy na pewno chcesz usunąć z ulubionych „{name}”?" + }, + "favoriteEditDialog": { + "titleAdd": "Dodaj do ulubionych", + "titleEdit": "Dostosuj", + "name": "Alias", + "auto": "(auto)", + "ip": "Adres IP", + "port": "Port" + }, + "fileInfo": { + "title": "Informacje o pliku", + "fileName": "Nazwa pliku:", + "path": "Ścieżka:", + "size": "Rozmiar:", + "sender": "Nadawca:", + "time": "Czas:" + }, + "fileNameInput": { + "title": "Wpisz nazwę pliku", + "original": "Oryginalny: {original}" + }, + "historyClearDialog": { + "title": "Wyczyść historię", + "content": "Czy na pewno chcesz usunąć całą historię?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend nie może znaleźć innych urządzeń bez uprawnienia do skanowania sieci lokalnej. Udziel tego uprawnienia w ustawieniach.", + "gotoSettings": "Ustawienia" + }, + "messageInput": { + "title": "Wpisz wiadomość", + "multiline": "Wieloliniowy" + }, + "noFiles": { + "title": "Nie wybrano pliku", + "content": "Wybierz jeden plik." + }, + "noPermission": { + "title": "Brak uprawnień", + "content": "Nie udzielono wymaganych uprawnień. Udziel ich w ustawieniach." + }, + "notAvailableOnPlatform": { + "title": "Niedostępne", + "content": "Ta funkcja jest dostępna tylko na:" + }, + "qr": { + "title": "Kod QR" + }, + "quickActions": { + "title": "Szybkie akcje", + "counter": "Licznik", + "prefix": "Prefiks", + "padZero": "Wypchnij zerami", + "sortBeforeCount": "Wcześniej posortuj alfabetycznie", + "random": "Losowy" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Żądania plików są akceptowane automatycznie. Pamiętaj, że każdy w sieci lokalnej może przesyłać Ci pliki." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Żądania plików są teraz akceptowane automatycznie z urządzeń na liście ulubionych.", + "Uwaga! Obecnie nie jest to całkowicie bezpieczne, ponieważ haker, który ma odcisk palca dowolnego urządzenia z listy ulubionych, może wysyłać Ci pliki bez ograniczeń.", + "Jednak ta opcja jest nadal bezpieczniejsza niż umożliwienie wszystkim użytkownikom w sieci lokalnej wysyłanie plików bez ograniczeń." + ] + }, + "pin": { + "title": "Wpisz kod PIN" + }, + "sendModeHelp": { + "title": "Tryby wysyłania", + "single": "Wysyła pliki do jednego odbiorcy. Wybór zostanie wyczyszczony po zakończonym transferze pliku.", + "multiple": "Wysyła pliki do wielu odbiorców. Wybór nie zostanie wyczyszczony.", + "link": "Odbiorcy, którzy nie mają zainstalowanego LocalSend, mogą pobrać wybrane pliki, otwierając link w swojej przeglądarce." + }, + "zoom": { + "title": "Adres URL" + } + }, + "sanitization": { + "empty": "Nazwa pliku nie może być pusta", + "invalid": "Nazwa pliku zawiera nieprawidłowe znaki" + }, + "tray": { + "@info": "Wytyczne Apple są bardzo surowe, jeśli chodzi o „zamknięte” sformułowanie.", + "open": "@:general.open", + "close": "Zakończ LocalSend", + "closeWindows": "Zamknij" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Wpisz kod PIN", + "invalidPin": "Nieprawidłowy kod PIN", + "tooManyAttempts": "Zbyt wiele prób", + "rejected": "Odrzucone", + "files": "Pliki", + "fileName": "Nazwa pliku", + "size": "Rozmiar" + }, + "assetPicker": { + "@info": "Tłumaczenia narzędzia wyboru mediów dla systemów Android i iPhone", + "confirm": "Potwierdź", + "cancel": "Anuluj", + "edit": "Edytuj", + "gifIndicator": "GIF", + "loadFailed": "Nie udało się załadować", + "original": "Oryginał", + "preview": "Podgląd", + "select": "Wybierz", + "emptyList": "Pusta lista", + "unSupportedAssetType": "Nieobsługiwany typ pliku.", + "unableToAccessAll": "Nie można uzyskać dostępu do wszystkich plików na urządzeniu", + "viewingLimitedAssetsTip": "Przeglądaj tylko pliki i albumy dostępne dla aplikacji.", + "changeAccessibleLimitedAssets": "Kliknij, aby zaktualizować dostępne pliki", + "accessAllTip": "Aplikacja może uzyskać dostęp tylko do niektórych plików na urządzeniu. Przejdź do ustawień systemowych i zezwól aplikacji na dostęp do wszystkich mediów na urządzeniu.", + "goToSystemSettings": "Przejdź do ustawień systemowych", + "accessLimitedAssets": "Kontynuuj z ograniczonym dostępem", + "accessiblePathName": "Dostępne pliki", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Obraz", + "sTypeVideoLabel": "Wideo", + "sTypeOtherLabel": "Inne media", + "sActionPlayHint": "odtwarzaj", + "sActionPreviewHint": "podgląd", + "sActionSelectHint": "wybierz", + "sActionSwitchPathLabel": "zmień ścieżkę", + "sActionUseCameraHint": "użyj kamery", + "sNameDurationLabel": "czas trwania", + "sUnitAssetCountLabel": "liczba" + }, + "networkInterfacesPage": { + "preview": "Podgląd", + "whitelist": "Biała lista", + "blacklist": "Czarna lista", + "title": "Interfejsy sieciowe", + "info": "Domyślnie LocalSend używa wszystkich dostępnych interfejsów sieciowych. Możesz tutaj wykluczyć niechciane sieci. Musisz ponownie uruchomić serwer, aby zastosować zmiany." + } +} diff --git a/app/assets/i18n/pt-BR.json b/app/assets/i18n/pt-BR.json new file mode 100644 index 0000000..38946d0 --- /dev/null +++ b/app/assets/i18n/pt-BR.json @@ -0,0 +1,525 @@ +{ + "locale": "Português (Brasil)", + "appName": "LocalSend", + "general": { + "accept": "Aceitar", + "accepted": "Aceito", + "add": "Adicionar", + "advanced": "Avançado", + "cancel": "Cancelar", + "close": "Fechar", + "confirm": "Confirmar", + "continueStr": "Continuar", + "copy": "Copiar", + "copiedToClipboard": "Copiado pra área de transferência", + "decline": "Recusar", + "done": "Pronto", + "delete": "Apagar", + "edit": "Editar", + "error": "Erro", + "example": "Exemplo", + "files": "Arquivos", + "finished": "Concluído", + "hide": "Ocultar", + "off": "Desativado", + "offline": "Off-line", + "on": "Ativado", + "online": "On-line", + "open": "Abrir", + "queue": "Fila", + "quickSave": "Salvar rápido", + "quickSaveFromFavorites": "Salvar rápido para \"Favoritos\"", + "renamed": "Renomeado", + "reset": "Desfazer alterações", + "restart": "Reiniciar", + "settings": "Configurações", + "skipped": "Pulado", + "start": "Iniciar", + "stop": "Parar", + "save": "Salvar", + "unchanged": "Inalterado", + "unknown": "Desconhecido", + "noItemInClipboard": "Não há nada na área de transferência." + }, + "receiveTab": { + "title": "Receber", + "infoBox": { + "ip": "IP:", + "port": "Porta:", + "alias": "Nome do dispositivo:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favoritos", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Enviar", + "selection": { + "title": "Seleção", + "files": "Arquivos: {files}", + "size": "Tamanho: {size}" + }, + "picker": { + "file": "Arquivo", + "folder": "Pasta", + "media": "Mídia", + "text": "Texto", + "app": "Aplicativo", + "clipboard": "Colar" + }, + "shareIntentInfo": "Você também pode usar o recurso \"Compartilhar\" do seu dispositivo móvel para selecionar arquivos com mais facilidade.", + "nearbyDevices": "Dispositivos por perto", + "thisDevice": "Este dispositivo", + "scan": "Procurar dispositivos", + "manualSending": "Envio manual", + "sendMode": "Modo de envio", + "sendModes": { + "single": "Único destinatário", + "multiple": "Vários destinatários", + "link": "Compartilhar via link" + }, + "sendModeHelp": "Explicação", + "help": "Certifique-se de que ambos os dispositivos estão na mesma rede Wi-Fi.", + "placeItems": "Insira os itens que quer compartilhar." + }, + "settingsTab": { + "title": "Configurações", + "general": { + "title": "Geral", + "brightness": "Tema", + "brightnessOptions": { + "system": "Sistema", + "dark": "Escuro", + "light": "Claro" + }, + "color": "Cores", + "colorOptions": { + "system": "Sistema", + "oled": "OLED" + }, + "language": "Idioma", + "languageOptions": { + "system": "Sistema" + }, + "saveWindowPlacement": "Salvar a posição da janela ao fechar", + "saveWindowPlacementWindows": "Salvar posição da janela ao sair", + "minimizeToTray": "Minimizar para a bandeja ao fechar", + "launchAtStartup": "Abrir junto com o usuário", + "launchMinimized": "Início automático: Abrir minimizado", + "showInContextMenu": "Mostrar LocalSend no menu de contexto", + "animations": "Animações" + }, + "receive": { + "title": "Recepção", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Concluir automaticamente", + "destination": "Pasta de destino", + "downloads": "(Downloads)", + "saveToGallery": "Salvar mídia na galeria", + "saveToHistory": "Salvar no histórico" + }, + "send": { + "title": "Envio", + "shareViaLinkAutoAccept": "Aceitar solicitações por link automaticamente" + }, + "network": { + "title": "Rede", + "needRestart": "Reinicie o servidor para aplicar as configurações!", + "server": "Servidor", + "alias": "Nome do dispositivo", + "deviceType": "Tipo do dispositivo", + "deviceModel": "Modelo do dispositivo", + "port": "Porta", + "discoveryTimeout": "Tempo limite de descoberta", + "useSystemName": "Usar nome do sistema", + "generateRandomAlias": "Gerar apelido aleatório", + "portWarning": "Você pode estar indetectável para outros dispositivos por estar usando uma porta customizada. (Padrão: {defaultPort})", + "encryption": "Criptografia", + "multicastGroup": "Endereço de multicast", + "multicastGroupWarning": "Você pode estar indetectável para outros dispositivos por estar usando um endereço de multicast customizado. (Padrão: {defaultMulticast})", + "network": "Rede", + "networkOptions": { + "all": "Todas", + "filtered": "Filtradas" + } + }, + "other": { + "title": "Outras", + "support": "Apoiar o LocalSend", + "donate": "Doar", + "privacyPolicy": "Política de privacidade", + "termsOfUse": "Termos de uso" + }, + "advancedSettings": "Configurações avançadas" + }, + "troubleshootPage": { + "title": "Resolução de problemas", + "subTitle": "Este aplicativo não está funcionando como esperado? Aqui você pode encontrar soluções para problemas comuns.", + "solution": "Solução:", + "fixButton": "Consertar automaticamente", + "firewall": { + "symptom": "Este aplicativo pode enviar arquivos para outros dispositivos, mas outros dispositivos não podem enviar arquivos para este dispositivo.", + "solution": "Provavelmente isto se trata de um problema de firewall. Você pode resolver esse problema permitindo conexões (UDP e TCP) recebidas na porta {port}.", + "openFirewall": "Abrir Firewall" + }, + "noDiscovery": { + "symptom": "Este dispositivo não consegue encontrar outros dispositivos.", + "solution": "Certifique-se de que todos os dispositivos estão na mesma rede Wi-Fi e utilizam as mesmas configurações (porta, endereço de multicast, criptografia). Você pode tentar digitar o endereço IP do outro dispositivo manualmente. Se isto funcionar, considere adicionar este dispositivo aos favoritos, assim ele será descoberto automaticamente no futuro." + }, + "noConnection": { + "symptom": "Ambos os dispositivos não se encontram nem podem compartilhar arquivos entre si.", + "solution": "O problema acontece em ambos? Então você precisa ter certeza de que os dispositivos estão na mesma rede Wi-Fi e utilizam as mesmas configurações (porta, endereço de multicast, criptografia). A rede Wi-Fi pode não permitir a comunicação entre os participantes devido à isolação de ponto de acesso (AP). Neste caso, esta opção deve ser desativada no roteador." + } + }, + "receiveHistoryPage": { + "title": "Histórico", + "openFolder": "Abrir pasta", + "deleteHistory": "Apagar histórico", + "empty": "O histórico está vazio.", + "entryActions": { + "open": "Abrir arquivo", + "showInFolder": "Mostrar na pasta", + "info": "Informações", + "deleteFromHistory": "Apagar do histórico" + } + }, + "apkPickerPage": { + "title": "Aplicativos (APK)", + "excludeSystemApps": "Excluir aplicativos do sistema", + "excludeAppsWithoutLaunchIntent": "Excluir aplicativos não executáveis", + "apps": "{n} aplicativos" + }, + "selectedFilesPage": { + "deleteAll": "Apagar tudo" + }, + "receivePage": { + "subTitle": { + "one": "quer te enviar um arquivo", + "other": "quer te enviar {n} arquivos" + }, + "subTitleMessage": "te enviou uma mensagem:", + "subTitleLink": "te enviou um link:", + "canceled": "O remetente cancelou a solicitação." + }, + "receiveOptionsPage": { + "title": "Opções", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(pasta do LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Desativada automaticamente pois há pastas." + }, + "sendPage": { + "waiting": "Aguardando resposta…", + "rejected": "O destinatário rejeitou a solicitação.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "O destinatário está ocupado com outra solicitação." + }, + "progressPage": { + "titleSending": "Enviando arquivos", + "titleReceiving": "Recebendo arquivos", + "savedToGallery": "Salvo na Galeria", + "total": { + "title": { + "sending": "Progresso total ({time})", + "finishedError": "Concluiu com erro", + "canceledSender": "Cancelado pelo remetente", + "canceledReceiver": "Cancelado pelo destinatário" + }, + "count": "Arquivos: {curr} / {n}", + "size": "Tamanho: {curr} / {n}", + "speed": "Velocidade: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Use 'h' para abreviar horas e 'm' para minutos", + "@days": "Use 'd' para dias, 'h' para horas e 'm' para minutos" + } + }, + "webSharePage": { + "title": "Compartilhar via link", + "loading": "Iniciando o servidor…", + "stopping": "Parando o servidor…", + "error": "Ocorreu um erro ao iniciar o servidor.", + "openLink": { + "one": "Abra este link no seu navegador:", + "other": "Abra um destes links no seu navegador:" + }, + "requests": "Solicitações", + "noRequests": "Nenhuma solicitação ainda.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Aceitar solicitações automaticamente", + "requirePin": "Solicitar PIN", + "pinHint": "O PIN é \"{pin}\"", + "encryptionHint": "O LocalSend utiliza um certificado autoassinado. Você precisa aceitá-lo no seu navegador.", + "pendingRequests": "Solicitações pendentes: {n}" + }, + "aboutPage": { + "title": "Sobre o LocalSend", + "description": [ + "O LocalSend é um aplicativo gratuito, de código aberto, que permite compartilhar arquivos e mensagens com dispositivos próximos através da sua rede local, sem a necessidade de uma conexão à internet.", + "Este aplicativo está disponível para Android, iOS, macOS, Windows e Linux. Você pode encontrar todas as opções de download na página oficial." + ], + "author": "Autor", + "contributors": "Contribuidores", + "packagers": "Empacotadores", + "translators": "Tradutores" + }, + "donationPage": { + "title": "Doe", + "info": "O LocalSend é gratuito, de código aberto e não tem anúncios. Se tu curte o app, então pense em apoiar o desenvolvimento com uma doação.", + "donate": "Doar {amount}", + "thanks": "Muito obrigado!", + "restore": "Restaurar compra" + }, + "changelogPage": { + "title": "Registro de alterações" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Idiomas diferentes podem usar palavras diferentes, pode não corresponder totalmente", + "adjectives": [ + "Adorável", + "Elegante", + "Grande", + "Brilhante", + "Legal", + "Inteligente", + "Eficiente", + "Quente", + "Gentil", + "Paciente", + "Forte", + "Especial", + "Carente", + "Cativante", + "Deslumbrante", + "Doce", + "Experiente", + "Exigente", + "Fascinante", + "Fiel", + "Genial", + "Formidável", + "Humilde", + "Incrível", + "Interessante", + "Perspicaz", + "Reluzente", + "Vigilante" + ], + "fruits": [ + "Maçã", + "Abacate", + "Banana", + "Maracujá", + "Ameixa", + "Brócolis", + "Cenoura", + "Cereja", + "Jaca", + "Uva", + "Limão", + "Alface", + "Manga", + "Melão", + "Cogumelo", + "Cebola", + "Laranja", + "Mamão", + "Pêssego", + "Pera", + "Abacaxi", + "Batata", + "Abóbora", + "Pitanga", + "Morango", + "Tomate" + ], + "combination": "{fruit} {adjective}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "Adicionar à seleção", + "content": "O que você quer adicionar?" + }, + "openFile": { + "title": "Abrir arquivo", + "content": "Você quer abrir o arquivo recebido?" + }, + "addressInput": { + "title": "Digite o endereço", + "hashtag": "Jogo da velha", + "ip": "Endereço de IP", + "recentlyUsed": "Usado recentemente: " + }, + "cancelSession": { + "title": "Cancelar transferência de arquivos", + "content": "Você quer mesmo cancelar a transferência de arquivos?" + }, + "cannotOpenFile": { + "title": "Não foi possível abrir o arquivo", + "content": "Não foi possível abrir \"{file}\". Por acaso, o arquivo foi movido, renomeado ou excluído?" + }, + "encryptionDisabledNotice": { + "title": "Criptografia desativada", + "content": "A comunicação agora ocorre via protocolo HTTP sem criptografia. Para usar o HTTPS, ative a criptografia novamente." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favoritos", + "noFavorites": "Nenhum dispositivo favorito ainda.", + "addFavorite": "Adicionar" + }, + "favoriteDeleteDialog": { + "title": "Apagar dos favoritos", + "content": "Você quer mesmo apagar \"{name}\" dos favoritos?" + }, + "favoriteEditDialog": { + "titleAdd": "Adicionar aos favoritos", + "titleEdit": "Configurações", + "name": "Nome do dispositivo", + "auto": "(auto.)", + "ip": "Endereço de IP", + "port": "Porta" + }, + "fileInfo": { + "title": "Informação do arquivo", + "fileName": "Nome do arquivo:", + "path": "Caminho:", + "size": "Tamanho:", + "sender": "Remetente:", + "time": "Horário:" + }, + "fileNameInput": { + "title": "Digite o nome do arquivo", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Limpar histórico", + "content": "Você quer mesmo apagar todo o histórico?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "O LocalSend não consegue encontrar outros dispositivos sem ter a permissão para escanear a rede local. Conceda esta permissão nas configurações.", + "gotoSettings": "Configurações" + }, + "messageInput": { + "title": "Digite a mensagem", + "multiline": "Várias linhas" + }, + "noFiles": { + "title": "Nenhum arquivo selecionado", + "content": "Selecione pelo menos um arquivo." + }, + "noPermission": { + "title": "Sem permissão", + "content": "Você não concedeu as permissões necessárias. Por favor, conceda-as nas configurações." + }, + "notAvailableOnPlatform": { + "title": "Não disponível", + "content": "Este recurso só está disponível no:" + }, + "qr": { + "title": "Código QR" + }, + "quickActions": { + "title": "Ações rápidas", + "counter": "Contador", + "prefix": "Prefixo", + "padZero": "Preencher com zeros", + "sortBeforeCount": "Ordenar alfabeticamente antes", + "random": "Aleatório" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Agora, as solicitações de arquivos são aceitas automaticamente. Tenha em mente que qualquer pessoa na rede local pode enviar arquivos para você." + }, + "quickSaveFromFavoritesNotice": { + "title": "Salvar rapidamento dos \"Favoritos\"", + "content": [ + "Agora, as solicitações de arquivos vindas de dispositivos na sua lista de favoritos são aceitas automaticamente.", + "Atenção! Atualmente, esta opção não é totalmente segura pois um hacker que saiba a identificação dos seus dispositivos favoritos pode te enviar arquivos sem restrições.", + "De qualquer forma, esta opção ainda é mais segura que permitir qualquer dispositivo na sua rede local envie arquivos sem restrições." + ] + }, + "pin": { + "title": "Digite o PIN" + }, + "sendModeHelp": { + "title": "Modos de envio", + "single": "Envia arquivos para um destinatário. A seleção será apagada após a conclusão da transferência dos arquivos.", + "multiple": "Envia arquivos para vários destinatários. A seleção não será apagada.", + "link": "Os destinatários que não têm o LocalSend instalado podem baixar os arquivos selecionados abrindo o link fornecido no navegador." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "O nome do arquivo não pode estar vazio", + "invalid": "O nome do arquivo contém caracteres inválidos" + }, + "tray": { + "@info": "As diretrizes da Apple são extremamente restritas sobre a nomenclatura do \"fechar\".", + "open": "@:general.open", + "close": "Sair do LocalSend", + "closeWindows": "Sair" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Digite o PIN", + "invalidPin": "PIN inválido", + "tooManyAttempts": "Muitas tentativas", + "rejected": "Recusado", + "files": "Arquivos", + "fileName": "Nome do arquivo", + "size": "Tamanho" + }, + "assetPicker": { + "@info": "Traduções para a ferramenta de seleção de mídia para Android e iPhone", + "confirm": "Confirmar", + "cancel": "Cancelar", + "edit": "Editar", + "gifIndicator": "GIF", + "loadFailed": "Falha ao carregar", + "original": "Origem", + "preview": "Pré-visualização", + "select": "Selecionar", + "emptyList": "Lista vazia", + "unSupportedAssetType": "Não há suporte para o tipo de arquivo.", + "unableToAccessAll": "Não é possível acessar todos os arquivos do dispositivo", + "viewingLimitedAssetsTip": "Somente visualizar arquivos e álbuns acessíveis ao aplicativo.", + "changeAccessibleLimitedAssets": "Clique para atualizar os arquivos acessíveis", + "accessAllTip": "O aplicativo só pode acessar alguns arquivos no dispositivo. Vá às configurações do sistema e permita que o aplicativo acesse todas as mídias do dispositivo.", + "goToSystemSettings": "Ir pras configurações do sistema", + "accessLimitedAssets": "Continuar com acesso limitado", + "accessiblePathName": "Arquivos acessíveis", + "sTypeAudioLabel": "Áudio", + "sTypeImageLabel": "Imagem", + "sTypeVideoLabel": "Vídeo", + "sTypeOtherLabel": "Outras mídias", + "sActionPlayHint": "reproduzir", + "sActionPreviewHint": "pré-visualizar", + "sActionSelectHint": "selecionar", + "sActionSwitchPathLabel": "mudar o caminho", + "sActionUseCameraHint": "usar a câmera", + "sNameDurationLabel": "duração", + "sUnitAssetCountLabel": "contagem" + }, + "networkInterfacesPage": { + "whitelist": "Lista de permissão", + "blacklist": "Lista de bloqueio", + "info": "Por padrão, o LocalSend utiliza todas as interfaces de rede disponíveis. Você pode excluir as redes indesejadas aqui. É necessário reiniciar o servidor para aplicar as alterações.", + "preview": "Pré-visualização", + "title": "Interfaces de rede" + } +} diff --git a/app/assets/i18n/pt-PT.json b/app/assets/i18n/pt-PT.json new file mode 100644 index 0000000..5e23fec --- /dev/null +++ b/app/assets/i18n/pt-PT.json @@ -0,0 +1,538 @@ +{ + "locale": "Português (Portugal)", + "appName": "LocalSend", + "general": { + "accept": "Aceitar", + "accepted": "Aceito", + "add": "Adicionar", + "advanced": "Avançado", + "cancel": "Cancelar", + "close": "Fechar", + "confirm": "Confirmar", + "continueStr": "Continuar", + "copy": "Copiar", + "copiedToClipboard": "Copiado para a Área de transferência", + "decline": "Rejeitar", + "done": "Concluído", + "delete": "Eliminar", + "edit": "Editar", + "error": "Erro", + "example": "Exemplo", + "files": "Ficheiros", + "finished": "Terminado", + "hide": "Ocultar", + "off": "Desativado", + "offline": "Offline", + "on": "Ativado", + "online": "Online", + "open": "Abrir", + "queue": "Fila", + "quickSave": "Guardar rápido", + "renamed": "Renomeado", + "reset": "Repor", + "restart": "Reiniciar", + "settings": "Definições", + "skipped": "Ignorado", + "start": "Iniciar", + "stop": "Parar", + "save": "Guardar", + "unchanged": "Inalterado", + "unknown": "Desconhecido", + "noItemInClipboard": "Nenhum item na área de transferência.", + "quickSaveFromFavorites": "Gravar rapidamente dos \"Favoritos\"" + }, + "receiveTab": { + "title": "Receber", + "infoBox": { + "ip": "IP:", + "port": "Porta:", + "alias": "Nome do dispositivo:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favoritos", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Enviar", + "selection": { + "title": "Seleção", + "files": "Ficheiros: {files}", + "size": "Tamanho: {size}" + }, + "picker": { + "file": "Ficheiro", + "folder": "Pasta", + "media": "Media", + "text": "Texto", + "app": "Aplicação", + "clipboard": "Colar" + }, + "shareIntentInfo": "Também pode usar o recurso \"Partilhar\" do seu dispositivo móvel para selecionar ficheiros com mais facilidade.", + "nearbyDevices": "Dispositivos próximos", + "thisDevice": "Este dispositivo", + "scan": "Procurar dispositivos", + "sendMode": "Modo de envio", + "sendModes": { + "single": "Único destinatário", + "multiple": "Vários destinatários", + "link": "Partilhar via link" + }, + "sendModeHelp": "Explicação", + "help": "Certifique-se de que ambos os dispositivos estejam na mesma rede Wi-Fi.", + "placeItems": "Coloque os itens para partilhar.", + "manualSending": "Envio manual" + }, + "settingsTab": { + "title": "Definições", + "general": { + "title": "Geral", + "brightness": "Tema", + "brightnessOptions": { + "system": "Sistema", + "dark": "Escuro", + "light": "Claro" + }, + "color": "Cores", + "colorOptions": { + "system": "Sistema", + "oled": "OLED" + }, + "language": "Idioma", + "languageOptions": { + "system": "Sistema" + }, + "saveWindowPlacement": "Guardar a posição da janela ao fechar", + "minimizeToTray": "Minimizar para a área de notificação ao fechar", + "launchAtStartup": "Abrir automaticamente após iniciar sessão", + "launchMinimized": "Início automático: Abrir minimizado", + "animations": "Animações", + "saveWindowPlacementWindows": "Gravar posição da janela ao sair", + "showInContextMenu": "Mostrar LocalSend no menu de contexto" + }, + "receive": { + "title": "Recepção", + "quickSave": "@:general.quickSave", + "autoFinish": "Concluir automaticamente", + "destination": "Destino", + "downloads": "(Descargas)", + "saveToGallery": "Guardar na galeria", + "saveToHistory": "Guardar no histórico", + "quickSaveFromFavorites": "Gravar rapidamente dos \"Favoritos\"", + "requirePin": "@:webSharePage.requirePin" + }, + "send": { + "title": "Enviar", + "shareViaLinkAutoAccept": "Partilhar via link: Aceitar automaticamente" + }, + "network": { + "title": "Rede", + "needRestart": "Reinicie o servidor para aplicar as definições!", + "server": "Servidor", + "alias": "Nome do dispositivo", + "deviceType": "Tipo de dispositivo", + "deviceModel": "Modelo do dispositivo", + "port": "Porta", + "discoveryTimeout": "Tempo limite de deteção", + "portWarning": "Pode estar indetectável para outros dispositivos por estar a usar uma porta personalizada. (Padrão: {defaultPort})", + "encryption": "Encriptação", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Pode estar indetectável para outros dispositivos por estar a usar um endereço multicast personalizado. (Padrão: {defaultMulticast})", + "generateRandomAlias": "Gerar apelido aleatório", + "network": "Rede", + "networkOptions": { + "all": "Todos", + "filtered": "Filtrado" + }, + "useSystemName": "Usar nome do sistema" + }, + "other": { + "title": "Outros", + "support": "Suporte o LocalSend", + "donate": "Doar", + "privacyPolicy": "Política de Privacidade", + "termsOfUse": "Termos de Utilização" + }, + "advancedSettings": "Definições avançadas" + }, + "troubleshootPage": { + "title": "Diagnosticar problemas", + "subTitle": "Esta aplicação não está a funcionar como esperado? Aqui pode encontrar soluções comuns.", + "solution": "Solução:", + "fixButton": "Corrigir automaticamente", + "firewall": { + "symptom": "Esta aplicação pode enviar ficheiros para outros dispositivos, mas outros dispositivos não podem enviar ficheiros para este dispositivo.", + "solution": "Provavelmente isto trata-se de um problema da firewall. Pode resolver este problema ao permitir ligações recebidas (UDP e TCP) na porta {port}.", + "openFirewall": "Abrir a Firewall" + }, + "noConnection": { + "symptom": "Ambos os dispositivos não se detectam nem podem partilhar ficheiros entre si.", + "solution": "O problema existe em ambos os lados? Então precisa de ter a certeza de que os dispositivos estão na mesma rede Wi-Fi e possuem a mesma configuração (porta, endereço multicast, encriptação). A rede Wi-Fi pode não permitir a comunicação entre os participantes. Neste caso, esta opção deve ser ativada no router." + }, + "noDiscovery": { + "symptom": "Este dispositivo não consegue descobrir outros dispositivos.", + "solution": "Certifique-se de que todos os dispositivos estão na mesma rede Wi-Fi e partilham as mesmas configurações (porta, endereço multicast, criptografia). Pode tentar digitar o endereço IP do dispositivo de destino manualmente. Se isto funcionar, considere adicionar este dispositivo aos favoritos, assim ele será descoberto automaticamente no futuro." + } + }, + "receiveHistoryPage": { + "title": "Histórico", + "openFolder": "Abrir pasta", + "deleteHistory": "Eliminar histórico", + "empty": "O histórico está vazio.", + "entryActions": { + "open": "Abrir ficheiro", + "info": "Informação", + "deleteFromHistory": "Remover do histórico", + "showInFolder": "Mostrar na pasta" + } + }, + "apkPickerPage": { + "title": "Aplicações (APK)", + "excludeSystemApps": "Ocultar aplicações do sistema", + "excludeAppsWithoutLaunchIntent": "Ocultar aplicações não executáveis", + "apps": "{n} Aplicações" + }, + "selectedFilesPage": { + "deleteAll": "Remover tudo" + }, + "receivePage": { + "subTitle": { + "one": "quer enviar um ficheiro", + "other": "quer enviar {n} ficheiros" + }, + "subTitleMessage": "enviou-lhe uma mensagem:", + "subTitleLink": "enviou-lhe um link:", + "canceled": "O remetente cancelou o pedido." + }, + "receiveOptionsPage": { + "title": "Opções", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(pasta LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Opção desligada automaticamente pois uma pasta está a ser transferida." + }, + "sendPage": { + "waiting": "A aguardar resposta…", + "rejected": "O destinatário rejeitou o pedido.", + "busy": "O destinatário está ocupado com outro pedido de transferência.", + "tooManyAttempts": "@:web.tooManyAttempts" + }, + "progressPage": { + "titleSending": "A enviar ficheiros", + "titleReceiving": "A receber ficheiros", + "savedToGallery": "Guardado na Galeria", + "total": { + "title": { + "sending": "Progresso total ({time})", + "finishedError": "Terminado com erro", + "canceledSender": "Cancelado pelo remetente", + "canceledReceiver": "Cancelado pelo destinatário" + }, + "count": "Ficheiros: {curr} / {n}", + "size": "Tamanho: {curr} / {n}", + "speed": "Velocidade: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Usar 'h' e 'm' para abreviar as palavras horas e minutos", + "@days": "Usar 'd' para dias, 'h' para horas e 'm' para minutos" + } + }, + "webSharePage": { + "title": "Partilhe via link", + "loading": "A iniciar o servidor…", + "stopping": "A parar o servidor…", + "error": "Ocorreu um erro enquanto o servidor tentava iniciar.", + "openLink": { + "one": "Abrir este link no navegador:", + "other": "Abrir um destes links no navegador:" + }, + "requests": "Pedidos", + "noRequests": "Nenhum pedido ainda.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Aceitar pedidos automaticamente", + "encryptionHint": "O LocalSend utiliza um certificado assinado automaticamente. Precisa de aceitá-lo no navegador.", + "pendingRequests": "Pedidos pendentes: {n}", + "requirePin": "Solicitar PIN", + "pinHint": "O PIN é \"{pin}\"" + }, + "aboutPage": { + "title": "Acerca do LocalSend", + "description": [ + "O LocalSend é uma aplicação gratuita e de código aberto que permite partilhar ficheiros e mensagens de forma segura com dispositivos próximos através da sua rede local, sem a necessidade de uma ligação à Internet.", + "Esta aplicação está disponível para Android, iOS, macOS, Windows e Linux. Pode encontrar todas as opções para descarregar na página oficial." + ], + "author": "Autor", + "contributors": "Contribuidores", + "translators": "Tradutores", + "packagers": "Empacotadores" + }, + "donationPage": { + "title": "Doar", + "info": "O LocalSend é um software gratuito, de código aberto e sem qualquer anúncio. Se gosta da aplicação, considere apoiar o desenvolvimento com um donativo.", + "donate": "Doar {amount}", + "thanks": "Muito obrigado!", + "restore": "Restaurar compra" + }, + "changelogPage": { + "title": "Histórico de alterações" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Idiomas diferentes podem ter palavras divergentes, estas podem não corresponder 1:1", + "adjectives": [ + "Adorável", + "Lindo", + "Grande", + "Brilhante", + "Limpo", + "Inteligente", + "Fixe", + "Giro", + "Astuto", + "Determinado", + "Enérgico", + "Eficiente", + "Fantástico", + "Rápido", + "Ótimo", + "Fresco", + "Bom", + "Deslumbrante", + "Bonito", + "Gentil", + "Adorável", + "Místico", + "Simpático", + "Paciente", + "Poderoso", + "Rico", + "Secreto", + "Inteligente", + "Sólido", + "Especial", + "Estratégico", + "Forte", + "Interessante", + "Perspicaz", + "Reluzente", + "Vigilante", + "Arrumado", + "Sábio" + ], + "fruits": [ + "Maçã", + "Abacate", + "Banana", + "Mirtilo", + "Maracujá", + "Ameixa", + "Amora", + "Brócolos", + "Cenoura", + "Cereja", + "Côco", + "Uva", + "Limão", + "Alface", + "Manga", + "Melão", + "Cogumelo", + "Cebola", + "Laranja", + "Papaia", + "Mamão", + "Pêssego", + "Pêra", + "Ananás", + "Abacaxi", + "Batata", + "Abóbora", + "Morango", + "Tomate" + ], + "combination": "{fruit} {adjective}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "Adicionar à seleção", + "content": "O que quer adicionar?" + }, + "addressInput": { + "title": "Digite o endereço", + "hashtag": "Hashtag", + "ip": "Endereço IP", + "recentlyUsed": "Recém ligado: " + }, + "cancelSession": { + "title": "Cancelar transferência de ficheiros", + "content": "Cancelar a transferência de ficheiros?" + }, + "cannotOpenFile": { + "title": "Não foi possível abrir o ficheiro", + "content": "Não foi possível abrir \"{file}\". O ficheiro foi movido, renomeado ou eliminado?" + }, + "encryptionDisabledNotice": { + "title": "Encriptação desativada", + "content": "A comunicação agora ocorre via protocolo HTTP não encriptado. Para usar HTTPS, ative a encriptação novamente." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favoritos", + "noFavorites": "Ainda não tem dispositivos favoritos.", + "addFavorite": "Adicionar" + }, + "favoriteDeleteDialog": { + "title": "Eliminar favorito", + "content": "Eliminar \"{name}\" dos favoritos?" + }, + "favoriteEditDialog": { + "titleAdd": "Adicionar aos favoritos", + "titleEdit": "Editar", + "name": "Nome do dispositivo", + "auto": "(auto)", + "ip": "Endereço IP", + "port": "Porta" + }, + "fileInfo": { + "title": "Informação do ficheiro", + "fileName": "Nome do ficheiro:", + "path": "Localização:", + "size": "Tamanho:", + "sender": "Remetente:", + "time": "Data:" + }, + "fileNameInput": { + "title": "Digite o nome do ficheiro", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Limpar histórico", + "content": "Eliminar todo o histórico?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "O LocalSend não consegue encontrar outros dispositivos sem ter a permissão para analisar a rede local. Conceda esta permissão nas definições.", + "gotoSettings": "Definições" + }, + "messageInput": { + "title": "Digite a mensagem", + "multiline": "Várias linhas" + }, + "noFiles": { + "title": "Nenhum ficheiro selecionado", + "content": "Selecione pelo menos um ficheiro." + }, + "noPermission": { + "title": "Sem permissão", + "content": "Não concedeu as permissões necessárias. Conceda-as nas definições." + }, + "notAvailableOnPlatform": { + "title": "Indisponível", + "content": "Esta funcionalidade só está disponível no:" + }, + "qr": { + "title": "QR Code" + }, + "quickActions": { + "title": "Ações rápidas", + "counter": "Contador", + "prefix": "Prefixo", + "padZero": "Preencher com zeros", + "sortBeforeCount": "Ordenar previamente por ordem alfabética", + "random": "Aleatório" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Pedidos de ficheiros são aceites automaticamente. Tenha em atenção que todas as pessoas na rede local podem enviar-lhe ficheiros." + }, + "sendModeHelp": { + "title": "Modos de envio", + "single": "Envia ficheiros para um destinatário. A seleção será apagada após a conclusão da transferência dos ficheiros.", + "multiple": "Envia ficheiros para vários destinatários. A seleção não será apagada.", + "link": "Os destinatários que não têm o LocalSend instalado podem descarregar os ficheiros selecionados abrindo o link fornecido no navegador." + }, + "zoom": { + "title": "URL" + }, + "quickSaveFromFavoritesNotice": { + "content": [ + "Requisições de ficheiro agora são aceitas automaticamente de dispositivos da sua lista de favoritos.", + "Atenção! Atualmente, esta opção não é totalmente segura pois um hacker que saiba a identificação dos seus dispositivos favoritos ainda pode te enviar ficheiros sem restrições.", + "De qualquer forma, esta opção ainda é mais segura que permitir qualquer dispositivo." + ], + "title": "Gravar rapidamento dos \"Favoritos\"" + }, + "openFile": { + "title": "Abrir ficheiro", + "content": "Quer abrir o ficheiro recebido?" + }, + "pin": { + "title": "Digite o PIN" + } + }, + "sanitization": { + "empty": "O nome do ficheiro não pode estar em branco", + "invalid": "O nome do ficheiro contém caracteres inválidos" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "Fechar o LocalSend", + "closeWindows": "Sair" + }, + "web": { + "waiting": "@:sendPage.waiting", + "rejected": "Ligação rejeitada", + "files": "Ficheiros", + "fileName": "Nome do ficheiro", + "size": "Tamanho", + "enterPin": "Digite o PIN", + "invalidPin": "PIN inválido", + "tooManyAttempts": "Muitas tentativas" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "Confirmar", + "cancel": "Cancelar", + "edit": "Editar", + "gifIndicator": "GIF", + "loadFailed": "Falha ao carregar", + "original": "Original", + "preview": "Pré-visualização", + "select": "Selecionar", + "emptyList": "Lista vazia", + "unSupportedAssetType": "Este tipo de ficheiro não é suportado.", + "unableToAccessAll": "Incapaz de aceder todos os ficheiros do dispositivo", + "viewingLimitedAssetsTip": "Apenas visualizar ficheiros e álbuns acessíveis à aplicação.", + "changeAccessibleLimitedAssets": "Clique para atualizar os ficheiros acessíveis", + "accessAllTip": "A aplicação só pode aceder a alguns ficheiros no dispositivo. Aceda às definições do sistema e permita que a aplicação aceda a todos os ficheiros no dispositivo.", + "goToSystemSettings": "Ir para definições do sistema", + "accessLimitedAssets": "Continuar com acesso limitado", + "accessiblePathName": "Ficheiros acessíveis", + "sTypeAudioLabel": "Áudio", + "sTypeImageLabel": "Imagem", + "sTypeVideoLabel": "Vídeo", + "sTypeOtherLabel": "Outros ficheiros", + "sActionPlayHint": "reproduzir", + "sActionPreviewHint": "pré-visualizar", + "sActionSelectHint": "selecionar", + "sActionSwitchPathLabel": "mudar a localização", + "sActionUseCameraHint": "use a câmara", + "sNameDurationLabel": "duração", + "sUnitAssetCountLabel": "total" + }, + "networkInterfacesPage": { + "title": "Interfaces de rede", + "info": "Por padrão, o LocalSend utiliza todas as interfaces de rede disponíveis. Pode excluir as redes indesejadas aqui. É necessário reiniciar o servidor para aplicar as alterações.", + "preview": "Anterior", + "whitelist": "Lista branca", + "blacklist": "Lista negra" + } +} diff --git a/app/assets/i18n/ro.json b/app/assets/i18n/ro.json new file mode 100644 index 0000000..e326a9c --- /dev/null +++ b/app/assets/i18n/ro.json @@ -0,0 +1,525 @@ +{ + "locale": "Română", + "appName": "LocalSend", + "general": { + "accept": "Acceptă", + "accepted": "Acceptat", + "add": "Adaugă", + "advanced": "Avansat", + "cancel": "Anulare", + "close": "Închide", + "confirm": "Confirmă", + "continueStr": "Continuă", + "copy": "Copiază", + "copiedToClipboard": "Copiat în Clipboard", + "decline": "Respinge", + "done": "Finalizat", + "delete": "Șterge", + "edit": "Editează", + "error": "Eroare", + "example": "Exemplu", + "files": "Fișiere", + "finished": "Finalizat", + "hide": "Ascunde", + "off": "Oprit", + "offline": "Offline", + "on": "Pornit", + "online": "Online", + "open": "Deschide", + "queue": "Coadă", + "quickSave": "Salvare rapidă", + "quickSaveFromFavorites": "Salvare rapidă pentru \"Favorite\"", + "renamed": "Redenumit", + "reset": "Anulează modificările", + "restart": "Repornire", + "settings": "Setări", + "skipped": "Omis", + "start": "Pornește", + "stop": "Oprește", + "save": "Salvează", + "unchanged": "Neschimbat", + "unknown": "Necunoscut", + "noItemInClipboard": "Fără elemente în clipboard." + }, + "receiveTab": { + "title": "Primire", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Nume dispozitivului:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favorite", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Trimite", + "selection": { + "title": "Selecție", + "files": "Fișiere: {files}", + "size": "Dimensiune: {size}" + }, + "picker": { + "file": "Fișier", + "folder": "Dosar", + "media": "Media", + "text": "Text", + "app": "Aplicație", + "clipboard": "Lipește" + }, + "shareIntentInfo": "Poți utiliza, de asemenea, funcția „Partajare” a dispozitivului pentru a selecta mai ușor fișierele.", + "nearbyDevices": "Dispozitive din apropiere", + "thisDevice": "Acest dispozitiv", + "scan": "Caută dispozitive", + "manualSending": "Trimitere manuală", + "sendMode": "Mod de trimitere", + "sendModes": { + "single": "Un singur destinatar", + "multiple": "Mai mulți destinatari", + "link": "Partajează prin link" + }, + "sendModeHelp": "Explicație", + "help": "Verifică dacă destinația se află în aceeași rețea Wi-Fi.", + "placeItems": "Adaugă elemente pentru a partaja." + }, + "settingsTab": { + "title": "Setări", + "general": { + "title": "General", + "brightness": "Tema", + "brightnessOptions": { + "system": "Sistem", + "dark": "Întuneric", + "light": "Luminoasă" + }, + "color": "Culoare", + "colorOptions": { + "system": "Sistem", + "oled": "OLED" + }, + "language": "Limba", + "languageOptions": { + "system": "Sistem" + }, + "saveWindowPlacement": "Reține locația ferestrei după ieșire", + "saveWindowPlacementWindows": "Salvarea poziției ferestrei după închidere", + "minimizeToTray": "Minimizează în Bara de Meniuri/Tray la închidere", + "launchAtStartup": "Pornire automată după autentificare", + "launchMinimized": "Autopornire: Pornire ascunsă", + "showInContextMenu": "Afișează LocalSend în meniul contextual", + "animations": "Animații" + }, + "receive": { + "title": "Primire", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Finisare automată", + "destination": "Salvează în dosar", + "downloads": "(Descărcări)", + "saveToGallery": "Salvează media în galerie", + "saveToHistory": "Salvează în istoric" + }, + "send": { + "title": "Trimite", + "shareViaLinkAutoAccept": "Acceptă automat cererile în modul „Partajare prin link”" + }, + "network": { + "title": "Rețea", + "needRestart": "Repornește serverul pentru a aplica setările!", + "server": "Server", + "alias": "Nume dispozitiv", + "deviceType": "Tip dispozitiv", + "deviceModel": "Model dispozitiv", + "port": "Port", + "discoveryTimeout": "Expirare descoperire", + "useSystemName": "Folosește numele sistemului", + "generateRandomAlias": "Generează alias aleatoriu", + "portWarning": "Este posibil să nu fii detectat de alte dispozitive pentru că folosești un port personalizat. (implicit: {defaultPort})", + "encryption": "Criptare", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Este posibil să nu fii detectat de alte dispozitive pentru că folosești o adresă multicast personalizată. (implicit: {defaultMulticast})", + "networkOptions": { + "all": "Toate", + "filtered": "Filtrat" + }, + "network": "Rețea" + }, + "other": { + "title": "Altele", + "support": "Susține LocalSend", + "donate": "Donează", + "privacyPolicy": "Politica de confidențialitate", + "termsOfUse": "Termeni de utilizare" + }, + "advancedSettings": "Setări avansate" + }, + "troubleshootPage": { + "title": "Depanare", + "subTitle": "Aplicația nu funcționează așa cum trebuie? Aici poți găsi câteva soluții comune.", + "solution": "Soluția:", + "fixButton": "Repară automat", + "firewall": { + "symptom": "Această aplicație poate trimite fișiere la alte dispozitive, dar alte dispozitive nu pot trimite fișiere de pe acest dispozitiv.", + "solution": "Cel mai probabil problema este de la firewall. Poți rezolva această problemă permițând conexiunile de intrare (UDP și TCP) pe portul {port}.", + "openFirewall": "Deschide Firewall" + }, + "noDiscovery": { + "symptom": "Acest dispozitiv nu poate descoperi alte dispozitive.", + "solution": "Asigură-te că toate dispozitivele sunt pe aceeași rețea Wi-Fi și au aceeași configurație (port, adresă de multicast, criptare). Poți încerca să scrii manual adresa IP pe dispozitivul ales. Dacă merge, consideră să adaugi dispozitivul la favorite ca să fie găsit automat în viitor." + }, + "noConnection": { + "symptom": "Ambele dispozitive nu se pot descoperi și nu pot partaja fișiere.", + "solution": "Problema există de ambele părți? Dacă da, trebuie să te asiguri că ambele dispozitive se află în aceeași rețea Wi-Fi și au aceeași configurație (port, adresă multicast, criptare). Este posibil ca rețeaua să nu permită comunicarea între participanți. În acest caz, această opțiune trebuie să fie activată pe router." + } + }, + "receiveHistoryPage": { + "title": "Istoric", + "openFolder": "Deschide dosarul", + "deleteHistory": "Șterge istoricul", + "empty": "Istoricul este gol.", + "entryActions": { + "open": "Deschide fișierul", + "showInFolder": "Afișează în dosar", + "info": "Informații", + "deleteFromHistory": "Șterge din istoric" + } + }, + "apkPickerPage": { + "title": "Aplicații (APK)", + "excludeSystemApps": "Exclude aplicațiile de sistem", + "excludeAppsWithoutLaunchIntent": "Exclude aplicațiile nelansabile", + "apps": "{n} Aplicații" + }, + "selectedFilesPage": { + "deleteAll": "Șterge tot" + }, + "receivePage": { + "subTitle": { + "one": "vrea să îți trimită un fișier", + "other": "vrea să îți trimită {n} fișiere" + }, + "subTitleMessage": "ți-a trimis un mesaj:", + "subTitleLink": "ți-a trimis un link:", + "canceled": "Expeditorul a anulat cererea." + }, + "receiveOptionsPage": { + "title": "Opțiuni", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(Dosarul LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Dezactivat automat deoarece există foldere." + }, + "sendPage": { + "waiting": "Așteptare răspuns…", + "rejected": "Destinatarul a respins cererea.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Destinatarul este ocupat cu o altă cerere." + }, + "progressPage": { + "titleSending": "Trimitere fișiere", + "titleReceiving": "Primire fișiere", + "savedToGallery": "Salvat în Galerie", + "total": { + "title": { + "sending": "Progres total ({time})", + "finishedError": "Finalizat cu eroare", + "canceledSender": "Anulat de expeditor", + "canceledReceiver": "Anulat de către destinatar" + }, + "count": "Fișiere: {curr} / {n}", + "size": "Dimensiune: {curr} / {n}", + "speed": "Viteză: {speed}/s" + } + }, + "webSharePage": { + "title": "Partajează prin link", + "loading": "Pornirea serverului…", + "stopping": "Oprirea serverului…", + "error": "A apărut o eroare la pornirea serverului.", + "openLink": { + "one": "Deschide acest link în browserul tău:", + "other": "Deschide unul dintre aceste linkuri în browserul tău:" + }, + "requests": "Cereri", + "noRequests": "Nicio cerere încă.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Acceptă automat cererile", + "requirePin": "Solicită PIN", + "pinHint": "PIN-ul este \"{pin}\"", + "encryptionHint": "LocalSend folosește un certificat auto-semnat. Trebuie să-l accepți în browserul tău.", + "pendingRequests": "Cereri în așteptare: {n}" + }, + "aboutPage": { + "title": "Despre LocalSend", + "description": [ + "LocalSend este o aplicație gratuită și open-source care îți permite să partajezi în siguranță fișiere și mesaje cu dispozitivele din apropiere prin rețeaua ta locală, fără a avea nevoie de o conexiune la internet.", + "Această aplicație este disponibilă pe Android, iOS, macOS, Windows și Linux. Poți găsi toate opțiunile de descărcare pe pagina oficială." + ], + "author": "Autor", + "contributors": "Contribuitori", + "packagers": "Pachetari", + "translators": "Traducători" + }, + "donationPage": { + "title": "Donează", + "info": "LocalSend este gratuit, open-source și fără reclame. Dacă îți place aplicația, poți susține dezvoltarea cu o donație.", + "donate": "Donează {amount}", + "thanks": "Îți mulțumim foarte mult!", + "restore": "Restabilește achiziția" + }, + "changelogPage": { + "title": "Schimbări" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Diferite localizări pot avea cuvinte diferite, este posibil să nu se potrivească cu 1: 1", + "adjectives": [ + "Adorabilă", + "Frumoasă", + "Mare", + "Strălucitoare", + "Curată", + "Deșteaptă", + "Cool", + "Drăguță", + "Vicleană", + "Determinantă", + "Energică", + "Eficientă", + "Fantastică", + "Repede", + "Bine", + "Sănătoasă", + "Proaspătă", + "Bună", + "Superbă", + "Grozavă", + "Coaptă", + "Fierbinte", + "Amabilă", + "Iubitoare", + "Mistică", + "îngrijită", + "Plăcută", + "Răbdătoare", + "Frumușică", + "Puternică", + "Delicioasă", + "Secretă", + "Inteligentă", + "Solidă", + "Specială", + "Strategică", + "Aromată", + "Înțeleaptă" + ], + "fruits": [ + "Caisă", + "Gutuie", + "Banană", + "Mură", + "Nucă", + "Afină", + "Vișină", + "Cireașă", + "Lămâie", + "Salată", + "Fasole", + "Conopidă", + "Ciupercă", + "Ceapă", + "Portocală", + "Piersică", + "Pară", + "Varză", + "Mazăre", + "Prună", + "Rodie", + "Zmeură", + "Căpșună", + "Roșie" + ], + "combination": "{fruit} {adjective}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "Adaugă la selecție", + "content": "Ce vrei să adaugi?" + }, + "openFile": { + "title": "Deschide fișierul", + "content": "Vrei să deschizi fișierul primit?" + }, + "addressInput": { + "title": "Introdu adresa", + "hashtag": "Hashtag", + "ip": "Adresă IP", + "recentlyUsed": "Folosit recent: " + }, + "cancelSession": { + "title": "Anulează trimiterea fișierelor", + "content": "Chiar vrei să anulezi transferul fișierelor?" + }, + "cannotOpenFile": { + "title": "Nu se poate deschide fișierul", + "content": "Nu s-a putut deschide \\\"{file}\\\". A fost mutat, redenumit sau șters?" + }, + "encryptionDisabledNotice": { + "title": "Criptare dezactivată", + "content": "Comunicarea are loc acum prin protocolul HTTP necriptat. Pentru a folosi HTTPS, activează din nou criptarea." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favorite", + "noFavorites": "Încă nu sunt dispozitive favorite.", + "addFavorite": "Adaugă" + }, + "favoriteDeleteDialog": { + "title": "Șterge din favorite", + "content": "Sigur vrei să ștergi din favorite \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Adaugă la favorite", + "titleEdit": "Setări", + "name": "Numele dispozitivului", + "auto": "(auto)", + "ip": "Adresă IP", + "port": "Port" + }, + "fileInfo": { + "title": "Informații despre fișier", + "fileName": "Numele fișierului:", + "path": "Calea:", + "size": "Dimensiune:", + "sender": "Expeditor:", + "time": "Timp:" + }, + "fileNameInput": { + "title": "Introdu numele fișierului", + "original": "Original: {original}" + }, + "historyClearDialog": { + "title": "Golește istoricul", + "content": "Sigur vrei să golești întregul istoric?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend nu poate găsi alte dispozitive fără permisiunea de a scana rețeaua locală. Acordă această permisiune în setări.", + "gotoSettings": "Setări" + }, + "messageInput": { + "title": "Scrie un mesaj", + "multiline": "Multi-linie" + }, + "noFiles": { + "title": "Niciun fișier selectat", + "content": "Selectează cel puțin un fișier." + }, + "noPermission": { + "title": "Fără permisiune", + "content": "Nu ai acordat permisiunile necesare. Acordă-le în setări." + }, + "notAvailableOnPlatform": { + "title": "Nu este disponibil", + "content": "Această funcție este disponibilă doar pe:" + }, + "qr": { + "title": "Cod QR" + }, + "quickActions": { + "title": "Acțiuni rapide", + "counter": "Contor", + "prefix": "Prefix", + "padZero": "Completează cu zerouri", + "sortBeforeCount": "Sortează alfabetic înainte", + "random": "Aleatoriu" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Cererile de fișiere sunt acceptate automat. Fii atent oricine din rețeaua locală îți poate trimite fișiere." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Cererile de fișiere sunt acum acceptate automat de la dispozitivele din lista dispozitivelor favorite.", + "Atenție! În prezent, aceasta nu este complet securizată, deoarece un hacker care are amprente pe oricare dintre dispozitivele din lista ta de favorite poate trimite fișiere fără restricții.", + "Oricum ar fi, această opțiune este mult mai sigură decât să permiți utilizatorilor din rețeaua locală să trimită fișiere fără restricții." + ] + }, + "pin": { + "title": "Introdu codul PIN" + }, + "sendModeHelp": { + "title": "Moduri de trimitere", + "single": "Trimite fișiere unui singur destinatar. Selecția va fi golită după ce transferul este finalizat.", + "multiple": "Trimite fișiere la mai mulți destinatari. Selecția nu va fi ștearsă după transferul de fișiere terminate.", + "link": "Destinatarii care nu au LocalSend instalat pot descărca fișierele selectate prin deschiderea linkului în browserul lor." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Numele fișierului nu poate fi gol", + "invalid": "Numele fișierului conține caractere greșite" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "Închide LocalSend", + "closeWindows": "Ieșire" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Introdu codul PIN", + "invalidPin": "Codul PIN introdus este greșit", + "tooManyAttempts": "Prea multe încercări", + "rejected": "Respins", + "files": "Fișiere", + "fileName": "Numele fișierului", + "size": "Dimensiune" + }, + "assetPicker": { + "@info": "Traduceri pentru instrumentul de selecție media pentru Android și iPhone", + "confirm": "Confirmă", + "cancel": "Anulează", + "edit": "Editează", + "gifIndicator": "GIF", + "loadFailed": "Eroare la încărcare", + "original": "Original", + "preview": "Previzualizare", + "select": "Selectează", + "emptyList": "Listă goală", + "unSupportedAssetType": "Tip de fișier neacceptat.", + "unableToAccessAll": "Nu se pot accesa toate fișierele de pe dispozitiv", + "viewingLimitedAssetsTip": "Aplicația poate vizualiza doar fișiere și albume la care are acces.", + "changeAccessibleLimitedAssets": "Apasă pentru a actualiza fișierele accesibile", + "accessAllTip": "Aplicația are acces doar la unele fișiere de pe dispozitiv. Accesează setările de sistem și permite aplicației să acceseze toate fișierele media de pe dispozitiv.", + "goToSystemSettings": "Accesează setările sistemului", + "accessLimitedAssets": "Continuă cu acces limitat", + "accessiblePathName": "Fișiere accesibile", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Imagini", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Alte fișiere media", + "sActionPlayHint": "redare", + "sActionPreviewHint": "previzualizare", + "sActionSelectHint": "selectează", + "sActionSwitchPathLabel": "schimbă calea", + "sActionUseCameraHint": "folosește camera", + "sNameDurationLabel": "durată", + "sUnitAssetCountLabel": "cantitate" + }, + "networkInterfacesPage": { + "title": "Interfețe de rețea", + "info": "În mod implicit, LocalSend folosește toate interfețele de rețea disponibile. Poți exclude rețelele nedorite aici. Trebuie să repornești serverul pentru a aplica modificările.", + "preview": "Previzualizare", + "whitelist": "Lista albă", + "blacklist": "Lista neagră" + } +} diff --git a/app/assets/i18n/ru.json b/app/assets/i18n/ru.json new file mode 100644 index 0000000..32bed94 --- /dev/null +++ b/app/assets/i18n/ru.json @@ -0,0 +1,465 @@ +{ + "locale": "Русский", + "appName": "LocalSend", + "general": { + "accept": "Принять", + "accepted": "Принято", + "add": "Добавить", + "advanced": "Подробнее", + "cancel": "Отменить", + "close": "Закрыть", + "confirm": "Подтвердить", + "continueStr": "Продолжить", + "copy": "Копировать", + "copiedToClipboard": "Скопировано в буфер обмена", + "decline": "Отклонить", + "done": "Готово", + "delete": "Удалить", + "edit": "Редактировать", + "error": "Ошибка", + "example": "Пример", + "files": "Файлы", + "finished": "Завершено", + "hide": "Скрыть", + "off": "Отключено", + "offline": "Не в сети", + "on": "Включено", + "online": "В сети", + "open": "Открыть", + "queue": "Очередь", + "quickSave": "Быстрое сохранение", + "quickSaveFromFavorites": "Быстрое сохранение для \"Избранных\"", + "renamed": "Переименовано", + "reset": "Отменить изменения", + "restart": "Перезапустить", + "settings": "Настройки", + "skipped": "Отклонено", + "start": "Запустить", + "stop": "Остановить", + "save": "Сохранить", + "unchanged": "Без изменений", + "unknown": "Неизвестно", + "noItemInClipboard": "Буфер обмена пуст." + }, + "receiveTab": { + "title": "Получить", + "infoBox": { + "ip": "IP:", + "port": "Порт:", + "alias": "Имя устройства:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Избранное", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Отправить", + "selection": { + "title": "Выборка", + "files": "Файлов: {files}", + "size": "Размер: {size}" + }, + "picker": { + "file": "Файл", + "folder": "Папка", + "media": "Медиа", + "text": "Текст", + "app": "Приложение", + "clipboard": "Вставить" + }, + "shareIntentInfo": "Вы также можете воспользоваться функцией \"Поделиться\" на своем мобильном устройстве, чтобы быстрее выбирать файлы.", + "nearbyDevices": "Устройства поблизости", + "thisDevice": "Это устройство", + "scan": "Поиск устройств", + "manualSending": "Ручная отправка", + "sendMode": "Режим отправки", + "sendModes": { + "single": "Один получатель", + "multiple": "Несколько получателей", + "link": "Поделиться по ссылке" + }, + "sendModeHelp": "Справка", + "help": "Пожалуйста, убедитесь, что получатель находится в той же Wi-Fi сети, что и отправитель.", + "placeItems": "Добавьте файлы, чтобы поделиться." + }, + "settingsTab": { + "title": "Настройки", + "general": { + "title": "Общие", + "brightness": "Тема", + "brightnessOptions": { + "system": "Системная", + "dark": "Темная", + "light": "Светлая" + }, + "color": "Цвет", + "colorOptions": { + "system": "Системный", + "oled": "OLED" + }, + "language": "Язык", + "languageOptions": { + "system": "Системный" + }, + "saveWindowPlacement": "Сохранять расположение окна после выхода", + "saveWindowPlacementWindows": "Сохранять расположение окна после выхода", + "minimizeToTray": "Сворачивать в системный трей/строку меню при закрытии", + "launchAtStartup": "Автозагрузка", + "launchMinimized": "Скрытая автозагрузка", + "showInContextMenu": "Отображать LocalSend в контекстном меню", + "animations": "Анимации" + }, + "receive": { + "title": "Получение", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Автозавершение", + "destination": "Сохранять в папку", + "downloads": "(Загрузки)", + "saveToGallery": "Сохранять медиафайлы в галерею", + "saveToHistory": "Сохранять историю" + }, + "send": { + "title": "Отправка", + "shareViaLinkAutoAccept": "Автоматически принимать запросы в режиме \"Поделиться по ссылке\"" + }, + "network": { + "title": "Сеть", + "needRestart": "Для применения изменений необходимо перезапустить сервер!", + "server": "Сервер", + "alias": "Имя устройства", + "deviceType": "Тип устройства", + "deviceModel": "Модель устройства", + "port": "Порт", + "discoveryTimeout": "Тайм-аут поиска", + "useSystemName": "Использовать системное имя", + "generateRandomAlias": "Сгенерировать случайный псевдоним", + "portWarning": "Другие устройства могут вас не найти, поскольку вы используете другой, собственный порт. (default: {defaultPort})", + "encryption": "Шифрование", + "multicastGroup": "Адрес мультивещание", + "multicastGroupWarning": "Другие устройства могут вас не найти, поскольку вы используете другой, собственный адрес мультивещания. (default: {defaultMulticast})", + "network": "Сеть", + "networkOptions": { + "all": "Все", + "filtered": "Фильтровано" + } + }, + "other": { + "title": "Другое", + "support": "Поддержать LocalSend", + "donate": "Пожертвовать", + "privacyPolicy": "Политика конфиденциальности", + "termsOfUse": "Условия использования" + }, + "advancedSettings": "Расширенные настройки" + }, + "troubleshootPage": { + "title": "Устранение неисправностей", + "subTitle": "Приложение не работает должным образом? Здесь вы можете найти некоторые распространенные решения проблем.", + "solution": "Решение:", + "fixButton": "Исправить автоматически", + "firewall": { + "symptom": "Это устройство может отправлять файлы на другие устройства, но другие устройства не могут отправлять файлы на это устройство.", + "solution": "Скорее всего, это проблема брандмауэра. Вы можете решить эту проблему, разрешив входящие соединения (UDP и TCP) для порта {port}.", + "openFirewall": "Открыть брандмауэр" + }, + "noDiscovery": { + "symptom": "Это устройство не может найти другие устройства.", + "solution": "Пожалуйста, убедитесь, что оба устройства находятся в одной Wi-Fi сети и имеют одинаковую конфигурацию (порт, адрес мультивещания, шифрование). Вы можете попробовать ввести IP-адрес целевого устройства вручную. Если это сработает, подумайте о том, чтобы добавить это устройство в избранное, чтобы его можно было автоматически находить в будущем." + }, + "noConnection": { + "symptom": "Оба устройства не могут найти друг друга и не могут обмениваться файлами.", + "solution": "Проблема существует с обеих сторон? Итак, вам нужно убедиться, что оба устройства находятся в одной Wi-Fi сети и имеют одинаковую конфигурацию (порт, адрес мультивещания, шифрование). Сеть Wi-Fi может не разрешать обмен (передачу) между участниками. В этом случае, вам необходимо включить эту опцию на своем маршрутизаторе." + } + }, + "receiveHistoryPage": { + "title": "История", + "openFolder": "Открыть папку", + "deleteHistory": "Очистить историю", + "empty": "История пуста.", + "entryActions": { + "open": "Открыть файл", + "showInFolder": "Показать в папке", + "info": "Информация", + "deleteFromHistory": "Удалить из истории" + } + }, + "apkPickerPage": { + "title": "Приложения (APK)", + "excludeSystemApps": "Исключить системные приложения", + "excludeAppsWithoutLaunchIntent": "Исключить незапускаемые приложения", + "apps": "{n} приложений" + }, + "selectedFilesPage": { + "deleteAll": "Удалить все" + }, + "receivePage": { + "subTitle": { + "one": "хочет отправить вам файл", + "other": "хочет отправить вам {n} файлы (-ов)" + }, + "subTitleMessage": "отправил вам сообщение:", + "subTitleLink": "отправил вам ссылку:", + "canceled": "Отправитель отменил запрос на передачу файлов." + }, + "receiveOptionsPage": { + "title": "Параметры получения", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(Папка LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Отключено автоматически, поскольку есть папки." + }, + "sendPage": { + "waiting": "Ожидание ответа…", + "rejected": "Получатель отклонил запрос.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Получатель занят другим запросом." + }, + "progressPage": { + "titleSending": "Отправка файлов", + "titleReceiving": "Получение файлов", + "savedToGallery": "Сохранено в галереи", + "total": { + "title": { + "sending": "Общее время передачи ({time})", + "finishedError": "Завершено с ошибкой", + "canceledSender": "Отменено отправителем", + "canceledReceiver": "Отменено получателем" + }, + "count": "Файлов: {curr} / {n}", + "size": "Размер: {curr} / {n}", + "speed": "Скорость: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}ч {m}мин", + "days": "{d}д {h}ч {m}мин", + "@hours": "Используйте \"h\" для обозначения часов, а \"m\" для минут", + "@days": "Используйте \"d\" для дней, \"h\" для часов и \"m\" для минут" + } + }, + "webSharePage": { + "title": "Поделиться по ссылке", + "loading": "Запуск сервера…", + "stopping": "Остановка сервера…", + "error": "При запуске сервера произошла ошибка.", + "openLink": { + "one": "Откройте эту ссылку в браузере:", + "other": "Откройте одну из этих ссылок в браузере:" + }, + "requests": "Запросы", + "noRequests": "Запросов пока нет.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Автоматически принимать запросы", + "requirePin": "Требовать PIN-код", + "pinHint": "PIN-код: \"{pin}\"", + "encryptionHint": "LocalSend использует самоподписанный сертификат. Вам необходимо принять его в браузере.", + "pendingRequests": "Ожидающие запросы: {n}" + }, + "aboutPage": { + "title": "О LocalSend", + "description": [ + "LocalSend — это бесплатное приложение с открытым исходным кодом, которое позволяет вам безопасно обмениваться файлами и сообщениями с находящимися поблизости устройствами через локальную сеть, без необходимости подключения к Интернету.", + "Это приложение доступно для Android, iOS, macOS, Windows и Linux. Вы можете найти все варианты загрузки на официальной домашней странице." + ], + "author": "Автор", + "contributors": "Участники", + "packagers": "Сборщики", + "translators": "Переводчики" + }, + "donationPage": { + "title": "Пожертвовать", + "info": "LocalSend — это бесплатное приложение с открытым исходным кодом и без рекламы. Если оно вам нравится, вы можете поддержать его разработку пожертвованием.", + "donate": "Пожертвовать {amount}", + "thanks": "Большое спасибо!", + "restore": "Восстановить покупку" + }, + "changelogPage": { + "title": "История изменений" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Разные локализации могут использовать разные слова, поэтому соответствие может быть не 1 к 1" + }, + "dialogs": { + "addFile": { + "title": "Добавить в выборку", + "content": "Что вы хотите добавить?" + }, + "openFile": { + "title": "Открыть файл", + "content": "Хотите открыть полученный файл?" + }, + "addressInput": { + "title": "Введите адрес", + "hashtag": "Хэштег", + "ip": "IP-адрес", + "recentlyUsed": "Недавно использованные: " + }, + "cancelSession": { + "title": "Отменить отправку файлов", + "content": "Вы действительно хотите отменить отправку файлов?" + }, + "cannotOpenFile": { + "title": "Не удалось открыть файл", + "content": "Не удалось открыть \"{file}\". Возможно, этот файл был перемещен, переименован или удален?" + }, + "encryptionDisabledNotice": { + "title": "Шифрование отключено", + "content": "Связь теперь происходит по незашифрованному HTTP протоколу. Чтобы использовать протокол HTTPS, снова включите шифрование." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Избранное", + "noFavorites": "Избранных устройств пока нет.", + "addFavorite": "Добавить" + }, + "favoriteDeleteDialog": { + "title": "Удалить из избранных", + "content": "Вы действительно хотите удалить из избранных \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Добавить в избранное", + "titleEdit": "Настройки", + "name": "Имя устройства", + "auto": "(автоматически)", + "ip": "IP-адрес", + "port": "Порт" + }, + "fileInfo": { + "title": "О файле", + "fileName": "Имя файла:", + "path": "Путь:", + "size": "Размер:", + "sender": "Отправитель:", + "time": "Время:" + }, + "fileNameInput": { + "title": "Введите имя файла", + "original": "Оригинальное имя файла: {original}" + }, + "historyClearDialog": { + "title": "Очистить историю", + "content": "Вы действительно хотите удалить всю историю?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend не может найти другие устройства без разрешения на сканирование локальной сети. Пожалуйста, предоставьте это разрешение в настройках.", + "gotoSettings": "Настройки" + }, + "messageInput": { + "title": "Введите сообщение", + "multiline": "Многострочное" + }, + "noFiles": { + "title": "Не выбрано ни одного файла", + "content": "Пожалуйста, добавьте как минимум один файл." + }, + "noPermission": { + "title": "Нет разрешения", + "content": "Вы не предоставили необходимые разрешения. Пожалуйста, предоставьте их в настройках." + }, + "notAvailableOnPlatform": { + "title": "Недоступно", + "content": "Эта функция доступна только на:" + }, + "qr": { + "title": "QR-код" + }, + "quickActions": { + "title": "Быстрые действия", + "counter": "Счетчик", + "prefix": "Префикс", + "padZero": "Добавить нули в начале", + "sortBeforeCount": "Отсортировать по алфавиту (А-Я)", + "random": "Случайно" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Запросы на получение файлов теперь принимаются автоматически. Будьте осторожны, все пользователи этой локальной сети могут отправлять вам файлы." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Запросы на получение файлов теперь принимаются автоматически от устройств из вашего списка избранных.", + "Предупреждение! На данный момент, это не совсем безопасно, поскольку хакер, имеющий отпечаток пальца любого устройства из вашего списка избранных, может беспрепятственно отправлять вам файлы.", + "Однако, этот вариант все равно безопаснее, чем разрешить всем пользователям локальной сети беспрепятственно отправлять вам файлы." + ] + }, + "pin": { + "title": "Введите PIN-код" + }, + "sendModeHelp": { + "title": "Режимы отправки", + "single": "Отправляет файлы одному получателю. Выборка будет очищена после завершения передачи файлов.", + "multiple": "Отправляет файлы нескольким получателям. Выборка не будет очищена после завершения передачи файлов.", + "link": "Получатели, у которых не установлен LocalSend, могут загрузить выбранные файлы, открыв ссылку в своем браузере." + }, + "zoom": { + "title": "URL-адрес" + } + }, + "sanitization": { + "empty": "Имя файла не может быть пустым", + "invalid": "Имя файла содержит недопустимые символы" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the \"close\" wording.", + "open": "@:general.open", + "close": "Выйти из LocalSend", + "closeWindows": "Выйти" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Введите PIN-код", + "invalidPin": "Неверный PIN-код", + "tooManyAttempts": "Слишком много попыток", + "rejected": "Отклонено", + "files": "Файлов", + "fileName": "Имя файла", + "size": "Размер" + }, + "assetPicker": { + "@info": "Переводы для инструмента выбора медиа для Android и iPhone", + "confirm": "Подтвердить", + "cancel": "Отменить", + "edit": "Редактировать", + "gifIndicator": "GIF", + "loadFailed": "Не удалось загрузить", + "original": "Оригинал", + "preview": "Предпросмотр", + "select": "Выбрать", + "emptyList": "Список пуст", + "unSupportedAssetType": "Неподдерживаемый тип файла.", + "unableToAccessAll": "Не удалось получить доступ ко всем файлам на устройстве", + "viewingLimitedAssetsTip": "Приложение может просматривать только файлы и альбомы, к которым у него есть доступ.", + "changeAccessibleLimitedAssets": "Разрешить доступ к дополнительным файлам", + "accessAllTip": "Приложение имеет доступ только к некоторым файлам на устройстве. Перейдите к системным настройкам и разрешите приложению получить доступ ко всем медиафайлам на устройстве.", + "goToSystemSettings": "Перейти к системным настройкам", + "accessLimitedAssets": "Продолжить с ограниченным доступом", + "accessiblePathName": "Доступные файлы", + "sTypeAudioLabel": "Аудио", + "sTypeImageLabel": "Изображение", + "sTypeVideoLabel": "Видео", + "sTypeOtherLabel": "Другие медиафайлы", + "sActionPlayHint": "воспроизвести", + "sActionPreviewHint": "предпросмотр", + "sActionSelectHint": "выбрать", + "sActionSwitchPathLabel": "изменить путь", + "sActionUseCameraHint": "использовать камеру", + "sNameDurationLabel": "продолжительность", + "sUnitAssetCountLabel": "количество" + }, + "networkInterfacesPage": { + "title": "Сетевые интерфейсы", + "preview": "Предосмотр", + "whitelist": "Белый список", + "blacklist": "Черный список", + "info": "По умолчанию, LocalSend использует все доступные сетевые интерфейсы. Вы можете исключить нежелательные сети здесь. Необходимо перезапустить сервер для применения изменений." + } +} diff --git a/app/assets/i18n/si.json b/app/assets/i18n/si.json new file mode 100644 index 0000000..e806f6c --- /dev/null +++ b/app/assets/i18n/si.json @@ -0,0 +1,457 @@ +{ + "locale": "සිංහල", + "appName": "LocalSend", + "general": { + "accept": "පිළිගන්න", + "accepted": "පිළිගත්", + "add": "ඇඩ් කරන්න", + "advanced": "ගැඹුරු", + "cancel": "අවලංගු කරන්න", + "close": "වසා දමන්න", + "confirm": "තහවුරු කරන්න", + "continueStr": "ඉදිරියට", + "copy": "කොපි කරන්න", + "copiedToClipboard": "Clipboard වෙත කොපි කරන ලදි", + "decline": "ප්‍රතික්ෂේප කරන්න", + "done": "සම්පූර්ණයි", + "delete": "මකන්න", + "edit": "සංස්කරණය", + "error": "දෝෂය", + "example": "උදාහරණය", + "files": "ගොනු", + "finished": "අවසන්", + "hide": "සඟවන්න", + "off": "ඕෆ් (Off)", + "offline": "ඕෆ්ලයින්", + "on": "ඔන් (On)", + "online": "ඔන්ලයින්", + "open": "විවෘත කරන්න", + "queue": "පෝලිම", + "quickSave": "Quick සේව්", + "quickSaveFromFavorites": "\"ප්‍රියතම\" සඳහා Quick සේව් කරන්න", + "renamed": "නම වෙනස් කරන ලදි", + "reset": "වෙනස්කම් අහෝසි කරන්න", + "restart": "නැවත ආරම්භ කරන්න", + "settings": "සැකසුම්", + "skipped": "මග හරින ලදි", + "start": "ආරම්භ කරන්න", + "stop": "නවත්වන්න", + "save": "සේව් කරන්න", + "unchanged": "නොවෙනස්", + "unknown": "නොදන්නා", + "noItemInClipboard": "Clipboard හි අයිතම නැත." + }, + "receiveTab": { + "title": "ලබාගන්න", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "උපාංගයේ නම:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "ප්‍රියතම", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "යවන්න", + "selection": { + "title": "තේරීම", + "files": "ගොනු: {files}", + "size": "ප්‍රමාණය: {size}" + }, + "picker": { + "file": "ගොනුව", + "folder": "ෆෝල්ඩරය", + "media": "මාධ්‍ය", + "text": "පේළි (Text)", + "app": "ඇප්", + "clipboard": "පේස්ට් කරන්න" + }, + "shareIntentInfo": "ඔබට වඩාත් පහසුවෙන් ගොනු තේරීමට ඔබගේ ජංගම උපාංගයේ \"Share\" විශේෂාංගය භාවිතා කළ හැක.", + "nearbyDevices": "ආසන්න උපාංග", + "thisDevice": "මෙම උපාංගය", + "scan": "උපාංග සොයන්න", + "manualSending": "Manual යැවීම", + "sendMode": "යැවීමේ ක්‍රමය", + "sendModes": { + "single": "තනි ලබන්නා", + "multiple": "බහු ලබන්නන්", + "link": "ලින්ක් (Link) ඔස්සේ බෙදාගන්න (Share)" + }, + "sendModeHelp": "පැහැදිලි කිරීම", + "help": "කරුණාකර ලබන්නාගේ උපාංගය හා ඔබේ උපාංගය එකම Wi-Fi ජාලයේ ඇති බව සහතික කර ගන්න.", + "placeItems": "බෙදා (Share) ගැනීමට අවශ්‍ය දේ තබන්න." + }, + "settingsTab": { + "title": "සැකසුම්", + "general": { + "title": "සාමාන්‍ය", + "brightness": "තේමාව", + "brightnessOptions": { + "system": "පද්ධතිය", + "dark": "අඳුරු", + "light": "එළිය" + }, + "color": "පාට", + "colorOptions": { + "system": "පද්ධතිය", + "oled": "OLED" + }, + "language": "භාෂාව", + "languageOptions": { + "system": "පද්ධතිය" + }, + "saveWindowPlacement": "ඉවත් වූ පසු කවුළුවේ පිහිටීම සුරකින්න", + "saveWindowPlacementWindows": "පිටවීමෙන් පසු කවුළුවේ පිහිටීම සුරකින්න", + "minimizeToTray": "වසා දැමීමේදී System Tray/Menu Bar වෙත අවම කරන්න", + "launchAtStartup": "පුරනය වීමෙන් පසු ස්වයංක්‍රීයව ආරම්භ කරන්න", + "launchMinimized": "ස්වයංක්‍රීය ආරම්භය: සඟවා ආරම්භ කරන්න", + "showInContextMenu": "Context මෙනුව තුළ LocalSend පෙන්වන්න", + "animations": "ඇනිමේශන්" + }, + "receive": { + "title": "ලබාගන්න", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "ස්වයංක්‍රීය අවසන් කිරීම", + "destination": "ෆෝල්ඩරය වෙත සුරකින්න", + "downloads": "(බාගත කිරීම්)", + "saveToGallery": "මාධ්‍ය ගැලරියට සුරකින්න", + "saveToHistory": "ඉතිහාසයට සුරකින්න" + }, + "send": { + "title": "යවන්න", + "shareViaLinkAutoAccept": "\"ලින්ක් (Link) ඔස්සේ බෙදාගන්න (Share)\" මාදිලියේ ඉල්ලීම් ස්වයංක්‍රීයව පිළිගන්න" + }, + "network": { + "title": "ජාලය", + "needRestart": "සැකසුම් යෙදීමට සේවාදායකය නැවත අරඹන්න!", + "server": "සේවාදායකය", + "alias": "උපාංගයේ නම", + "deviceType": "උපාංගයේ වර් ගය", + "deviceModel": "උපාංගයේ ආකෘතිය", + "port": "Port", + "discoveryTimeout": "සොයා ගැනීමේ කාලසීමාව", + "useSystemName": "පද්ධති නම භාවිතා කරන්න", + "generateRandomAlias": "අහඹු නමක් ජනනය කරන්න", + "portWarning": "ඔබ custom port එකක් භාවිතා කරන්නේ නම්, වෙනත් උපාංග වලට ඔබව හඳුනා ගත නොහැක. (default: {defaultPort})", + "encryption": "කේතනය", + "multicastGroup": "Multicast ලිපිනය", + "multicastGroupWarning": "ඔබ custom multicast ලිපිනයක් භාවිතා කරන්නේ නම්, වෙනත් උපාංග වලට ඔබව හඳුනා ගත නොහැක. (default: {defaultMulticast})", + "network": "ජාලය", + "networkOptions": { + "all": "සියල්ල", + "filtered": "වර්ග කළ" + } + }, + "other": { + "title": "වෙනත්", + "support": "LocalSend සඳහා සහය දක්වන්න", + "donate": "ආධාර කරන්න", + "privacyPolicy": "පුද්ගලික තොරතුරු ප්‍රතිපත්තිය", + "termsOfUse": "භාවිතා කිරීමේ කොන්දේසි" + }, + "advancedSettings": "ගැඹුරු සැකසුම්" + }, + "troubleshootPage": { + "title": "ගැටලු විසඳන්න", + "subTitle": "යෙදුම අපේක්ෂිත පරිදි ක්‍රියා නොකරන්නේද? මෙහි පොදු ගැටලු සඳහා විසඳුම් සොයා ගත හැක.", + "solution": "විසඳුම:", + "fixButton": "ස්වයංක්‍රීයව නිවැරදි කරන්න", + "firewall": { + "symptom": "මෙම උපාංගය මගින් වෙනත් උපාංගවලට ගොනු යැවිය හැක, නමුත් වෙනත් උපාංගවලින් මෙම උපාංගයට ගොනු යැවිය නොහැක.", + "solution": "මෙය බොහෝවිට firewall සම්බන්ධ ගැටලුවක් විය හැක. විසඳීමට port {port} එක සඳහා 'Allow Incoming Connections\" (TCP සහ UDP) ලබා දෙන්න.", + "openFirewall": "Firewall විවෘත කරන්න" + }, + "noDiscovery": { + "symptom": "මෙම උපාංගයට වෙනත් උපාංග සොයාගත නොහැක.", + "solution": "කරුණාකර සියලුම උපාංග එකම Wi-Fi ජාලයක ඇති බවත්, එකම configuration (port, multicast address, encryption) එකක් ඇති බවත් තහවුරු කරගන්න. ඔබට ඉලක්කගත උපාංගයේ IP ලිපිනය අතින් ටයිප් කිරීමට උත්සාහ කළ හැකිය. මෙය ක්‍රියාත්මක නම්, මෙම උපාංගය ප්‍රියතමයන් අතරට එක් කිරීමට සලකා බලන්න, එවිට අනාගතයේදී එය ස්වයංක්‍රීයව සොයාගත හැක." + }, + "noConnection": { + "symptom": "දෙපාර්ශ්වයටම එකිනෙකාගේ උපාංග හඳුනාගැනීම හෝ ගොනු බෙදාගැනීම කළ නොහැක.", + "solution": "ගැටලුව දෙපාර්ශවයේම තිබේ ද? එසේ නම්, දෙපාර්ශවයේම උපාංග එකම Wi-Fi ජාලයක ඇති බවත්, එකම configuration (port, multicast address, encryption) එකක් ඇති බවත් තහවුරු කරගන්න. Access Point (AP) Isolation මඟින් Wi-Fi ජාලය තුළ සහභාගීවන්නන් අතර සන්නිවේදනය වාරණය විය හැක. එවැනි අවස්තාවක, මෙම විකල්පය (AP Isolation) රවුටරයේ අක්‍රීය කළ යුතුය." + } + }, + "receiveHistoryPage": { + "title": "ඉතිහාසය", + "openFolder": "ෆෝල්ඩරය විවෘත කරන්න", + "deleteHistory": "ඉතිහාසය මකන්න", + "empty": "ඉතිහාසයේ කිසිවක් නැත.", + "entryActions": { + "open": "ගොනුව විවෘත කරන්න", + "showInFolder": "ෆෝල්ඩරය තුළ පෙන්වන්න", + "info": "තොරතුරු", + "deleteFromHistory": "ඉතිහාසයෙන් මකන්න" + } + }, + "apkPickerPage": { + "title": "ඇප් (APK)", + "excludeSystemApps": "පද්ධති යෙදුම් (System Apps) බැහැර කරන්න", + "excludeAppsWithoutLaunchIntent": "ක්‍රියාත්මක කිරීමට නොහැකි ඇප් බැහැර කරන්න", + "apps": "ඇප් {n}" + }, + "selectedFilesPage": { + "deleteAll": "සියල්ල මකන්න" + }, + "receivePage": { + "subTitle": { + "one": "ඔබට ගොනුවක් එවීමට කැමතියි", + "other": "ඔබට ගොනු {n} එවීමට කැමතියි" + }, + "subTitleMessage": "ඔබට පණිවිඩයක් එවා ඇත:", + "subTitleLink": "ඔබට ලින්ක් (Link) එකක් එවා ඇත:", + "canceled": "යවන්නා ඉල්ලීම අවලංගු කර ඇත." + }, + "receiveOptionsPage": { + "title": "විකල්ප", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend ෆෝල්ඩරය)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "ෆෝල්ඩර් නොමැති බැවින් ස්වයංක්‍රීයව ක්‍රියා විරහිත කරන ලදි." + }, + "sendPage": { + "waiting": "ප්‍රතිචාරයක් බලාපොරොත්තු වෙමින්…", + "rejected": "ලැබුම්කරු ඉල්ලීම ප්‍රතික්ෂේප කර ඇත.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "ලැබුම්කරු වෙනත් ඉල්ලීමක් නිසා කාර්‍යබහුලව ඇත." + }, + "progressPage": { + "titleSending": "ගොනු යවමින්", + "titleReceiving": "ගොනු ලබා ගනිමින්", + "savedToGallery": "Photos තුළ සේව් කරන ලදි", + "total": { + "title": { + "sending": "සම්පූර්ණ ප්‍රගතිය ({time})", + "finishedError": "දෝෂයක් සමඟ අවසන් විය", + "canceledSender": "යවන්නා විසින් අවලංගු කරන ලදී", + "canceledReceiver": "ලැබුම්කරු විසින් අවලංගු කරන ලදී" + }, + "count": "ගොනු: {curr} / {n}", + "size": "විශාලත්වය: {curr} / {n}", + "speed": "වේගය: {speed}/s" + } + }, + "webSharePage": { + "title": "ලින්ක් (Link) ඔස්සේ බෙදාගන්න (Share)", + "loading": "සේවාදායකය ආරම්භ කරමින්…", + "stopping": "සේවාදායකය නවතමින්…", + "error": "සේවාදායකය ආරම්භ කිරීමේදී දෝෂයක් සිදු විය.", + "openLink": { + "one": "මෙම ලින්ක් (Link) එක ඔබේ බ්‍රවුසරය (Browser) මගින් විවෘත කරන්න:", + "other": "මෙම ලින්ක් (Link) වලින් එකක් ඔබේ බ්‍රවුසරය (Browser) මගින් විවෘත කරන්න:" + }, + "requests": "ඉල්ලීම්", + "noRequests": "තවමත් කිසිදු ඉල්ලීමක් නැත.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "ඉල්ලීම් ස්වයංක්‍රීයව පිළිගන්න", + "requirePin": "PIN අවශ්‍යයි", + "pinHint": "PIN එක \"{pin}\"", + "encryptionHint": "LocalSend self-signed certificate එකක් භාවිතා කරයි. ඔබ විසින් එය බ්‍රවුසරය (browser) තුළ දි පිළිගැනීම (accept) අවශ්‍ය වේ.", + "pendingRequests": "Pending වන ඉල්ලීම්: {n}" + }, + "aboutPage": { + "title": "LocalSend පිළිබඳව", + "description": [ + "LocalSend යනු ඔබට අන්තර්ජාල සම්බන්ධතාවයක අවශ්‍යතාවයකින් තොරව, local ජාලයක් තුළ, සමීප උපාංග සමඟ ගොනු සහ පණිවිඩ ආරක්ෂිතව බෙදා ගත හැකි නිදහස්, විවෘත-මූලාශ්‍රය (Free and open-source) ඇප් එකකි.", + "මෙම ඇප් එක Android, iOS, macOS, Windows සහ Linux සඳහා පවතියි. එය ඩවුන්ලෝඩ් (Download) කරගත හැකි ආකාර අපේ අඩවියේ මුල් පිටුවෙන් සොයාගත හැක." + ], + "author": "කතෲ", + "contributors": "සහය දැක්වූවන්", + "packagers": "පැකේජ්ර්ස්", + "translators": "පරිවර්තකයන්" + }, + "donationPage": { + "title": "ආධාර කරන්න", + "info": "LocalSend නිදහස්, විවෘත-මූලාශ්‍ර වන අතර කිසිදු වෙළඳ දැන්වීමකින් තොර වේ. ඔබ මෙම ඇප් එකට කැමැති නම්, මෙහි සංවර්ධනය සඳහා මූල්‍යමය දායකත්වයක් ලබා දී සහය ලබා දීමට හැක.", + "donate": "දායකත්වය {amount}", + "thanks": "ඔබට බොහොම ස්තූතියි!", + "restore": "මිලදී ගැනීම ප්‍රතිස්ථාපනය (Restore) කරන්න" + }, + "changelogPage": { + "title": "වෙනස්කම් ලේඛනය" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "විවිධ භාෂා වල වෙනස් වචන තිබිය හැකි අතර, එය සෑමව්ටිම 1:1 අනුපාතයේ නොතිබීමට හැකියාව ඇත" + }, + "dialogs": { + "addFile": { + "title": "තේරීමට ඇඩ් කරන්න", + "content": "ඔබට ඇඩ් කිරීමට අවශ්‍ය මොනවා ද?" + }, + "openFile": { + "title": "ගොනුව විවෘත කරන්න", + "content": "ලබාගත් ගොනුව විවෘත කිරීමට කැමතිද?" + }, + "addressInput": { + "title": "ලිපිනය ඇතුලත් කරන්න", + "hashtag": "හැශ්ටැග්", + "ip": "IP ලිපිනය", + "recentlyUsed": "පෙර භාවිතා කළ: " + }, + "cancelSession": { + "title": "ගොනු මාරු අවලංගු කරන්න", + "content": "ඔබට ඇත්තටම ගොනු හුවමාරුව අවලංගු කිරීමට අවශ්‍යද?" + }, + "cannotOpenFile": { + "title": "ගොනුව විවෘත කළ නොහැක", + "content": "\"{file}\" විවෘත කිරීමට නොහැකි විය. මෙම ගොනුව වෙනත් තැනකට ගෙන ගොස් (moved) හෝ නැවත නම් කර (renamed) හෝ මකා දමා (deleted) තිබේද?" + }, + "encryptionDisabledNotice": { + "title": "කේතනය අක්‍රිය කර ඇත", + "content": "දැන් සන්නිවේදනය අනාරක්ශිත HTTP protocol හරහා සිදු වේ. HTTPS protocol භාවිතා කිරීමට, කේතනය නැවත සක්‍රීය කරන්න." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "ප්‍රියතම", + "noFavorites": "තවමත් ප්‍රියතම උපාංග නැත.", + "addFavorite": "ඇඩ් කරන්න" + }, + "favoriteDeleteDialog": { + "title": "ප්‍රියතම වලින් මකන්න", + "content": "ඔබට ඇත්තටම \"{name}\" ප්‍රියතම වෙතින් මැකීමට අවශ්‍යද?" + }, + "favoriteEditDialog": { + "titleAdd": "ප්‍රියතම වෙත එක් කරන්න", + "titleEdit": "සැකසුම්", + "name": "උපාංගයේ නම", + "auto": "(ස්වයංක්‍රීය)", + "ip": "IP ලිපිනය", + "port": "Port" + }, + "fileInfo": { + "title": "ගොනු විස්තර", + "fileName": "ගොනු විස්තර:", + "path": "පාත් (Path):", + "size": "ප්‍රමාණය:", + "sender": "යවන්නා:", + "time": "වේලාව:" + }, + "fileNameInput": { + "title": "ගොනුවේ නම ඇතුලත් කරන්න", + "original": "මුල්: {original}" + }, + "historyClearDialog": { + "title": "ඉතිහාසය ඉවත් කරන්න", + "content": "ඔබට ඇත්තටම ඉතිහාසය සම්පූර්ණයෙන් මකා දැමීමට අවශ්‍යද?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "ජාලය ස්කෑන් (Scan) කිරීමට අවසරයක් නොමැතිව, LocalSend හට අනෙකුත් උපාංග සොයාගත නොහැක. කාරුණිකව මෙම අවසරය සැකසුම් (Settings) තුළ ලබා දෙන්න.", + "gotoSettings": "සැකසුම්" + }, + "messageInput": { + "title": "පණිවිඩය ටයිප් කරන්න", + "multiline": "බහු පේලි" + }, + "noFiles": { + "title": "කිසිදු ගොනුවක් තෝරා නැත", + "content": "කරුණාකර අවම වශයෙන් එක් ගොනුවක්වත් තෝරන්න." + }, + "noPermission": { + "title": "අවසර නැත", + "content": "අවශ්‍ය අවසර ලබා නොදී ඇත. මෙම අවසර සැකසුම් (Settings) තුළ ලබා දෙන්න." + }, + "notAvailableOnPlatform": { + "title": "ලබා ගත නොහැක", + "content": "මෙම විශේෂාංගය ලබා ගත හැක්කේ පහත ක්‍රමවේද තුල පමණි:" + }, + "qr": { + "title": "QR කේතය" + }, + "quickActions": { + "title": "Quick යෙදුම්", + "counter": "කවුන්ටරය", + "prefix": "Prefix", + "padZero": "Pad with zeros", + "sortBeforeCount": "අකාරාදී පිළිවෙලට සකසන්න (A-Z)", + "random": "අහඹු" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "ගොනු ඉල්ලීම් දැන් ස්වයංක්‍රීයව පිළිගනු ලැබේ. ජාලයේ සිටින සෑම කෙනෙකුටම ඔබට ගොනු එවිය හැකි බව මතක තබා ගන්න." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "ඔබගේ ප්‍රියතම ලැයිස්තුවේ ඇති උපාංගවලින් ලැබෙන ගොනු ඉල්ලීම් දැන් ස්වයංක්‍රීයව පිළිගනු ලැබේ.", + "අවවාදයයි! දැනට, මෙය සම්පූර්ණයෙන්ම ආරක්ෂිත නැත, ඔබේ ප්‍රියතම ලැයිස්තුවේ ඇති ඕනෑම උපාංගයක ඇඟිලි සලකුණක් සහිත හැකර්වරයෙකුට (Hacker) කිසිඳු සීමාවකින් තොරව ඔබ වෙත ගොනු එවිය හැක.", + "කෙසේ වෙතත්, මෙම විකල්පය ජාලයේ සියලුම පරිශීලකයින්ට කිසිඳු සීමාවකින් තොරව ගොනු එවීමට ඉඩ දීමට වඩා ආරක්ෂිත වේ." + ] + }, + "pin": { + "title": "PIN ඇතුල් කරන්න" + }, + "sendModeHelp": { + "title": "යැවීමේ ක්‍රම", + "single": "එක් ලබන්නෙකුට පමණක් ගොනු යැවීම කරයි. ගොනු හුවමාරු කිරීමෙන් පසුව, තේරීම මකා දමනු ලැබේ.", + "multiple": "ලබන්නන් කිහිපදෙනෙකු වෙත ගොනු යැවීම කරයි. ගොනු හුවමාරු කිරීමෙන් පසුව ද තේරීම මකා දමන්නේ නැත.", + "link": "ලබන්නන් LocalSend ස්ථාපනය කර නොමැති නම්, ඔව්න්ගේ බ්‍රවුසර් (Browser) තුළ අදාල ලින්ක් (Link) එක විවෘත කර, ගොනු බාගත (Download) කළ හැක." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "ගොනුවේ නම හිස් විය නොහැක", + "invalid": "ගොනු නාමයේ වලංගු නොවන අක්ෂර අඩංගු වේ" + }, + "tray": { + "@info": "\"close\" වචනය සම්බන්ධයෙන් Apple මාර්ගෝපදේශ ඉතා දැඩි ය.", + "open": "@:general.open", + "close": "LocalSend වෙතින් ඉවත් වෙන්න", + "closeWindows": "පිටවීම" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "PIN ඇතුල් කරන්න", + "invalidPin": "වැරදි PIN", + "tooManyAttempts": "මේ සඳහා පමණට වඩා උත්සාහ කර ඇත", + "rejected": "ප්‍රතික්ෂේප කරන ලදී", + "files": "ගොනු", + "fileName": "ගොනුවේ නම", + "size": "ප්‍රමාණය" + }, + "assetPicker": { + "@info": "Android සහ iPhone සඳහා මාධ්‍ය තේරීමේ මෙවලම සඳහා වූ භාෂා පරිවර්තන", + "confirm": "තහවුරු කරන්න", + "cancel": "අවලංගු කරන්න", + "edit": "සංස්කරණය", + "gifIndicator": "GIF", + "loadFailed": "Load කිරීම අසාර්ථක විය", + "original": "මූලාශ්‍රය", + "preview": "පෙරදසුන", + "select": "තෝරන්න", + "emptyList": "හිස් ලැයිස්තුව", + "unSupportedAssetType": "සහය නොමැති ගොනු වර්ගයකි.", + "unableToAccessAll": "උපාංගයේ ඇති සියලුම ගොනු වෙත පිවිසීමට නොහැක", + "viewingLimitedAssetsTip": "ඇප් එකට ප්‍රවේශ විය හැකි ගොනු සහ ඇල්බම් පමණක් බලන්න.", + "changeAccessibleLimitedAssets": "ප්‍රවේශ කළ හැකි ගොනු යාවත්කාලීන (Update) කිරීමට ක්ලික් කරන්න", + "accessAllTip": "ඇප් එකට ප්‍රවේශ විය හැක්කේ උපාංගයේ ඇති සමහර ගොනුවලට පමණි. පද්ධති සැකසීම් (Settings) වෙත ගොස් උපාංගයේ සියලුම මාධ්‍ය වෙත ප්‍රවේශ වීමට ඇප් එකට අවසර ලබා දෙන්න.", + "goToSystemSettings": "පද්ධති සැකසුම් වෙත යන්න", + "accessLimitedAssets": "සීමිත ප්‍රවේශය සමඟ කරගෙන යන්න", + "accessiblePathName": "ප්‍රවේශ කළ හැකි ගොනු", + "sTypeAudioLabel": "හඬ", + "sTypeImageLabel": "චායාරූප", + "sTypeVideoLabel": "වීඩියෝ", + "sTypeOtherLabel": "වෙනත් මාධ්‍ය", + "sActionPlayHint": "වාදනය කරන්න", + "sActionPreviewHint": "පෙරදසුන", + "sActionSelectHint": "තෝරන්න", + "sActionSwitchPathLabel": "පාත් (Path) එක වෙනස් කරන්න", + "sActionUseCameraHint": "කැමරාව භාවිතා කරන්න", + "sNameDurationLabel": "කාලසීමාව", + "sUnitAssetCountLabel": "ගණන" + }, + "networkInterfacesPage": { + "info": "සාමාන්‍යයෙන් LocalSend ඔබගේ පවතින සියලු ජාල මුහුණත් භාවිතා කරයි. ඔබට අනවශ්‍ය මුහුණතක් වේ නම් එය මෙතනින් ඉවත් කළ හැක. ඔබ සිදු කරන වෙනස්කම් ක්‍රියාත්මක වීමට නම් server එක restart කළ යුතුය.", + "title": "ජාල අතුරුමුහුණත්", + "preview": "පෙනෙන අයුරු", + "whitelist": "අවසර ලත් ලැයිස්තුව", + "blacklist": "අවහිර කල ලැයිස්තුව" + } +} diff --git a/app/assets/i18n/sk.json b/app/assets/i18n/sk.json new file mode 100644 index 0000000..1a9d382 --- /dev/null +++ b/app/assets/i18n/sk.json @@ -0,0 +1,535 @@ +{ + "locale": "Slovenčina", + "appName": "LocalSend", + "general": { + "accept": "Prijať", + "accepted": "Prijaté", + "add": "Pridať", + "advanced": "Pokročilé", + "cancel": "Zrušiť", + "close": "Zavrieť", + "confirm": "Potvrdiť", + "continueStr": "Pokračovať", + "copy": "Kopírovať", + "copiedToClipboard": "Skopírované do schránky", + "decline": "Odmietnuť", + "done": "Hotovo", + "delete": "Odstrániť", + "edit": "Upraviť", + "error": "Chyba", + "example": "Príklad", + "files": "Súbory", + "finished": "Dokončené", + "hide": "Skryť", + "off": "Vypnuté", + "offline": "Offline", + "on": "Zapnuté", + "online": "Online", + "open": "Otvoriť", + "queue": "Fronta", + "quickSave": "Rýchle uloženie", + "quickSaveFromFavorites": "Rýchle uloženie pre \"Obľúbené\"", + "renamed": "Premenovaný", + "reset": "Vrátiť späť zmeny", + "restart": "Reštartovať", + "settings": "Nastavenia", + "skipped": "Preskočené", + "start": "Spustiť", + "stop": "Zastaviť", + "save": "Uložiť", + "unchanged": "Nezmenené", + "unknown": "Neznáme", + "noItemInClipboard": "Žiadne položky v schránke." + }, + "receiveTab": { + "title": "Prijať", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Názov zariadenia:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Obľúbené", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Odoslať", + "selection": { + "title": "Výber", + "files": "Súbory: {files}", + "size": "Veľkosť: {size}" + }, + "picker": { + "file": "Súbor", + "folder": "Priečinok", + "media": "Médiá", + "text": "Text", + "app": "Aplikácia", + "clipboard": "Vložiť" + }, + "shareIntentInfo": "Na jednoduchší výber súborov môžete použiť aj funkciu \"Zdieľať\" vášho mobilného zariadenia.", + "nearbyDevices": "Zariadenia v blízkosti", + "thisDevice": "Toto zariadenie", + "scan": "Vyhľadať zariadenia", + "manualSending": "Manuálne odoslanie", + "sendMode": "Režim odosielania", + "sendModes": { + "single": "Jeden príjemca", + "multiple": "Viacerí príjemcovia", + "link": "Zdieľať cez odkaz" + }, + "sendModeHelp": "Vysvetlenie", + "help": "Uistite sa, že je požadované zariadenie v rovnakej Wi-Fi sieti.", + "placeItems": "Umiestnite položky na zdieľanie." + }, + "settingsTab": { + "title": "Nastavenia", + "general": { + "title": "Všeobecné", + "brightness": "Téma", + "brightnessOptions": { + "system": "Systémová", + "dark": "Tmavá", + "light": "Svetlá" + }, + "color": "Farba", + "colorOptions": { + "system": "Systémová", + "oled": "OLED" + }, + "language": "Jazyk", + "languageOptions": { + "system": "Systémový" + }, + "saveWindowPlacement": "Uložiť polohu okna po ukončení", + "saveWindowPlacementWindows": "Uložiť polohu okna po ukončení", + "minimizeToTray": "Minimalizovať na systémový panel/panel ponuky pri zatvorení", + "launchAtStartup": "Autoštart po prihlásení", + "launchMinimized": "Autoštart: Spustiť skryté", + "showInContextMenu": "Zobraziť LocalSend v kontextovej ponuke", + "animations": "Animácie" + }, + "receive": { + "title": "Prijať", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Automatické dokončenie", + "destination": "Uložiť do priečinka", + "downloads": "(Stiahnuté)", + "saveToGallery": "Uložiť médiá do galérie", + "saveToHistory": "Uložiť do histórie" + }, + "send": { + "title": "Odoslať", + "shareViaLinkAutoAccept": "Automaticky prijímať žiadosti v režime \"Zdieľať cez odkaz\"" + }, + "network": { + "title": "Sieť", + "needRestart": "Ak chcete použiť nastavenia, reštartujte server!", + "server": "Server", + "alias": "Názov zariadenia", + "deviceType": "Typ zariadenia", + "deviceModel": "Model zariadenia", + "port": "Port", + "discoveryTimeout": "Časový limit hľadania", + "useSystemName": "Použiť systémové meno", + "generateRandomAlias": "Generovať náhodnú prezývku", + "portWarning": "Iné zariadenia vás nemusia rozpoznať, pretože používate vlastný port. (predvolené: {defaultPort})", + "encryption": "Šifrovanie", + "multicastGroup": "Multicast adresa", + "multicastGroupWarning": "Iné zariadenia vás nemusia rozpoznať, pretože používate vlastnú multicast adresu. (predvolené: {defaultMulticast})", + "network": "Sieť", + "networkOptions": { + "all": "Všetky", + "filtered": "Filtrované" + } + }, + "other": { + "title": "Iné", + "support": "Podporte LocalSend", + "donate": "Darovať", + "privacyPolicy": "Zásady ochrany osobných údajov", + "termsOfUse": "Podmienky používania" + }, + "advancedSettings": "Pokročilé nastavenia" + }, + "troubleshootPage": { + "title": "Riešenie problémov", + "subTitle": "Aplikácia nefunguje podľa očakávania? Tu nájdete niektoré bežné riešenia problémov.", + "solution": "Riešenie:", + "fixButton": "Opraviť automaticky", + "firewall": { + "symptom": "Toto zariadenie môže odosielať súbory do iných zariadení, ale iné zariadenia nemôžu odosielať súbory do tohto zariadenia.", + "solution": "S najväčšou pravdepodobnosťou ide o problém brány firewall. Môžete to vyriešiť povolením prichádzajúcich spojení (UDP a TCP) na porte {port}.", + "openFirewall": "Otvoriť firewall" + }, + "noDiscovery": { + "symptom": "Toto zariadenie nemôže nájsť iné zariadenia.", + "solution": "Uistite sa, že sú všetky zariadenia v rovnakej Wi-Fi sieti a zdieľajú rovnakú konfiguráciu (port, multicast adresa, šifrovanie). Môžete sa pokúsiť zadať IP adresu cieľového zariadenia ručne. Ak to funguje, zvážte pridanie tohto zariadenia do obľúbených položiek, aby mohlo byť v budúcnosti automaticky nájdené." + }, + "noConnection": { + "symptom": "Obe zariadenia sa nedokážu navzájom nájsť ani nemôžu zdieľať súbory.", + "solution": "Existuje problém na oboch stranách? Ak áno, musíte sa uistiť, že sú obe zariadenia v rovnakej Wi-Fi sieti a majú rovnakú konfiguráciu (port, multicastovú adresu, šifrovanie). Sieť Wi-Fi nemusí umožňovať komunikáciu medzi účastníkmi (izolácia prístupového bodu). V takom prípade musí byť táto možnosť povolená na smerovači." + } + }, + "receiveHistoryPage": { + "title": "História", + "openFolder": "Otvoriť priečinok", + "deleteHistory": "Odstrániť históriu", + "empty": "História je prázdna.", + "entryActions": { + "open": "Otvoriť súbor", + "showInFolder": "Zobraziť v priečinku", + "info": "Informácie", + "deleteFromHistory": "Vymazať z histórie" + } + }, + "apkPickerPage": { + "title": "Aplikácie (APK)", + "excludeSystemApps": "Vylúčiť systémové aplikácie", + "excludeAppsWithoutLaunchIntent": "Vylúčiť nespustiteľné aplikácie", + "apps": "{n} Aplikácie" + }, + "selectedFilesPage": { + "deleteAll": "Vymazať všetky" + }, + "receivePage": { + "subTitle": { + "one": "vám chce poslať súbor", + "other": "vám chce poslať {n} súborov" + }, + "subTitleMessage": "vám poslal správu:", + "subTitleLink": "vám poslal odkaz:", + "canceled": "Odosielateľ zrušil žiadosť." + }, + "receiveOptionsPage": { + "title": "Možnosti", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(Priečinok LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Automaticky vypnuté, pretože existujú priečinky." + }, + "sendPage": { + "waiting": "Čaká sa na odpoveď…", + "rejected": "Príjemca zamietol žiadosť.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Príjemca je zaneprázdnený inou žiadosťou." + }, + "progressPage": { + "titleSending": "Odosielanie súborov", + "titleReceiving": "Prijímanie súborov", + "savedToGallery": "Uložené vo Fotkách", + "total": { + "title": { + "sending": "Celkový priebeh ({time})", + "finishedError": "Dokončené s chybou", + "canceledSender": "Zrušené odosielateľom", + "canceledReceiver": "Zrušené príjemcom" + }, + "count": "Súbory: {curr} / {n}", + "size": "Veľkosť: {curr} / {n}", + "speed": "Rýchlosť: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Použiť „h“ pre skratku hodín a „m“ pre minúty", + "@days": "Použiť „d“ pre dni, „h“ pre hodiny a „m“ pre minúty" + } + }, + "webSharePage": { + "title": "Zdieľať cez odkaz", + "loading": "Spúšťa sa server…", + "stopping": "Zastavuje sa server…", + "error": "Pri spúšťaní servera sa vyskytla chyba.", + "openLink": { + "one": "Otvorte tento odkaz vo svojom prehliadači:", + "other": "Otvorte jeden z týchto odkazov vo svojom prehliadači:" + }, + "requests": "Žiadosti", + "noRequests": "Zatiaľ žiadne žiadosti.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Automaticky prijímať žiadosti", + "requirePin": "Vyžadovať PIN", + "pinHint": "PIN je \"{pin}\"", + "encryptionHint": "LocalSend používa certifikát s vlastným podpisom. Musíte ho prijať vo svojom prehliadači.", + "pendingRequests": "Nespracované žiadosti: {n}" + }, + "aboutPage": { + "title": "O aplikácii LocalSend", + "description": [ + "LocalSend je bezplatná aplikácia s otvoreným zdrojovým kódom, ktorá vám umožňuje bezpečne zdieľať súbory a správy so zariadeniami v okolí cez vašu lokálnu sieť bez potreby pripojenia k internetu.", + "Táto aplikácia je dostupná pre Android, iOS, macOS, Windows a Linux. Všetky možnosti stiahnutia nájdete na oficiálnej domovskej stránke." + ], + "author": "Autor", + "contributors": "Prispievatelia", + "packagers": "Zostavovatelia balíkov", + "translators": "Prekladatelia" + }, + "donationPage": { + "title": "Darovať", + "info": "LocalSend je bezplatný, s otvoreným kódom a bez reklám. Ak sa vám aplikácia páči, môžete jej vývoj podporiť darom.", + "donate": "Darovať {amount}", + "thanks": "Ďakujeme veľmi pekne!", + "restore": "Obnoviť nákup" + }, + "changelogPage": { + "title": "Zoznam zmien" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Rôzne miestne nastavenia môžu mať rôzne slová, nemusia sa presne zhodovať", + "adjectives": [ + "Rozkošná", + "Krásna", + "Veľká", + "Ľahká", + "Okúzľujúca", + "Šikovná", + "Pohodová", + "Roztomilá", + "Prefíkaná", + "Odhodlaná", + "Energická", + "Efektívna", + "Fantastická", + "Rýchla", + "Fajná", + "Čerstvá", + "Dobrá", + "Nádherná", + "Skvelá", + "Sympatická", + "Horúca", + "Milá", + "Zvodná", + "Mystická", + "Čistá", + "Úhľadná", + "Trpezlivá", + "Pekná", + "Výkonná", + "Bohatá", + "Tajomná", + "Inteligentná", + "Pôvabná", + "Špeciálna", + "Strategická", + "Silná", + "Vášnivá", + "Múdra" + ], + "fruits": [ + "hruška", + "višňa", + "čerešňa", + "broskyňa", + "slivka", + "marhuľa", + "ringlota", + "čučoriedka", + "brusnica", + "ríbezľa", + "malina", + "jahoda", + "moruša", + "mandarínka", + "marakuja", + "datľa", + "dula", + "figa", + "limetka", + "papája", + "tekvica", + "akébia", + "brokolica", + "cibuľa", + "kapusta", + "paradajka" + ], + "combination": "{adjective} {fruit}", + "@combination": "V niektorých jazykoch musí byť prídavné meno posledné." + }, + "dialogs": { + "addFile": { + "title": "Pridať do výberu", + "content": "Čo chcete pridať?" + }, + "openFile": { + "title": "Otvoriť súbor", + "content": "Chcete otvoriť prijatý súbor?" + }, + "addressInput": { + "title": "Zadajte adresu", + "hashtag": "Hashtag", + "ip": "IP adresa", + "recentlyUsed": "Nedávno použité: " + }, + "cancelSession": { + "title": "Zrušiť prenos súborov", + "content": "Naozaj chcete zrušiť prenos súborov?" + }, + "cannotOpenFile": { + "title": "Nie je možné otvoriť súbor", + "content": "Nepodarilo sa otvoriť súbor \"{file}\". Bol tento súbor presunutý, premenovaný alebo odstránený?" + }, + "encryptionDisabledNotice": { + "title": "Šifrovanie je vypnuté", + "content": "Komunikácia teraz prebieha cez nešifrovaný protokol HTTP. Ak chcete použiť protokol HTTPS, opäť povoľte šifrovanie." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Obľúbené", + "noFavorites": "Zatiaľ žiadne obľúbené zariadenia.", + "addFavorite": "Pridať" + }, + "favoriteDeleteDialog": { + "title": "Odstrániť z obľúbených", + "content": "Naozaj chcete odstrániť \"{name}\" z obľúbených?" + }, + "favoriteEditDialog": { + "titleAdd": "Pridať k obľúbeným", + "titleEdit": "Nastavenia", + "name": "Názov zariadenia", + "auto": "(automaticky)", + "ip": "IP adresa", + "port": "Port" + }, + "fileInfo": { + "title": "Informácie o súbore", + "fileName": "Názov súboru:", + "path": "Cesta:", + "size": "Veľkosť:", + "sender": "Odosielateľ:", + "time": "Čas:" + }, + "fileNameInput": { + "title": "Zadajte názov súboru", + "original": "Originál: {original}" + }, + "historyClearDialog": { + "title": "Vymazať históriu", + "content": "Naozaj chcete vymazať celú históriu?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend nemôže nájsť iné zariadenia bez povolenia na prehľadanie lokálnej siete. Povoľte prosím toto povolenie v nastaveniach.", + "gotoSettings": "Nastavenia" + }, + "messageInput": { + "title": "Napíšte správu", + "multiline": "Viacriadková" + }, + "noFiles": { + "title": "Nie sú vybraté žiadne súbory", + "content": "Vyberte prosím aspoň jeden súbor." + }, + "noPermission": { + "title": "Žiadne povolenie", + "content": "Neudelili ste potrebné povolenia. Udeľte ich prosím v nastaveniach." + }, + "notAvailableOnPlatform": { + "title": "Nie je k dispozícii", + "content": "Táto funkcia je dostupná iba na:" + }, + "qr": { + "title": "QR kód" + }, + "quickActions": { + "title": "Rýchle akcie", + "counter": "Počítadlo", + "prefix": "Predpona", + "padZero": "Vyplniť s nulami", + "sortBeforeCount": "Vopred zoradiť podľa abecedy (A-Z)", + "random": "Náhodne" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Žiadosti o súbor sú automaticky akceptované. Uvedomte si, že každý v miestnej sieti vám môže posielať súbory." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Žiadosti o súbory sa teraz automaticky prijímajú zo zariadení vo vašom zozname obľúbených.", + "Varovanie! V súčasnosti to nie je úplne bezpečné, pretože hacker, ktorý má odtlačok prsta akéhokoľvek zariadenia zo zoznamu obľúbených, vám môže posielať súbory bez obmedzenia.", + "Táto možnosť je však stále bezpečnejšia ako povoliť všetkým používateľom v miestnej sieti posielať súbory bez obmedzenia." + ] + }, + "pin": { + "title": "Zadajte PIN" + }, + "sendModeHelp": { + "title": "Režimy odosielania", + "single": "Odošle súbory jednému príjemcovi. Výber sa vymaže po dokončení prenosu súborov.", + "multiple": "Posiela súbory viacerým príjemcom. Výber sa vymaže po dokončení prenosu súborov.", + "link": "Príjemcovia, ktorí nemajú nainštalovaný LocalSend, si môžu stiahnuť vybrané súbory otvorením odkazu vo svojom prehliadači." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Názov súboru nemôže byť prázdny", + "invalid": "Názov súboru obsahuje neplatné znaky" + }, + "tray": { + "@info": "Pokyny spoločnosti Apple sú veľmi prísne, pokiaľ ide o výraz \"blízke\".", + "open": "@:general.open", + "close": "Ukončiť LocalSend", + "closeWindows": "Ukončiť" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Zadajte PIN", + "invalidPin": "Neplatný PIN kód", + "tooManyAttempts": "Príliš veľa pokusov", + "rejected": "Odmietnuté", + "files": "Súbory", + "fileName": "Názov súboru", + "size": "Veľkosť" + }, + "assetPicker": { + "@info": "Preklady pre nástroj na výber médií pre Android a iPhone", + "confirm": "Potvrdiť", + "cancel": "Zrušiť", + "edit": "Upraviť", + "gifIndicator": "GIF", + "loadFailed": "Načítanie zlyhalo", + "original": "Pôvod", + "preview": "Ukážka", + "select": "Vybrať", + "emptyList": "Prázdny zoznam", + "unSupportedAssetType": "Nepodporovaný typ súboru.", + "unableToAccessAll": "Nie je možné získať prístup ku všetkým súborom v zariadení", + "viewingLimitedAssetsTip": "Zobraziť iba súbory a albumy, ktoré má aplikácia prístupné.", + "changeAccessibleLimitedAssets": "Kliknutím aktualizujete prístupné súbory", + "accessAllTip": "Aplikácia má prístup iba k niektorým súborom v zariadení. Prejdite do systémových nastavení a povoľte aplikácii prístup ku všetkým médiám v zariadení.", + "goToSystemSettings": "Prejdite do nastavení systému", + "accessLimitedAssets": "Pokračovať s obmedzeným prístupom", + "accessiblePathName": "Prístupné súbory", + "sTypeAudioLabel": "Zvuk", + "sTypeImageLabel": "Obrázok", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Iné médiá", + "sActionPlayHint": "prehrať", + "sActionPreviewHint": "náhľad", + "sActionSelectHint": "vyberať", + "sActionSwitchPathLabel": "zmeniť cestu", + "sActionUseCameraHint": "použiť fotoaparát", + "sNameDurationLabel": "trvanie", + "sUnitAssetCountLabel": "počet" + }, + "networkInterfacesPage": { + "info": "V predvolenom nastavení LocalSend používa všetky dostupné sieťové rozhrania. Nežiaduce siete tu môžete vylúčiť. Na uplatnenie zmien je potrebné reštartovať server.", + "preview": "Náhľad", + "blacklist": "Zoznam zakázaných", + "title": "Sieťové rozhrania", + "whitelist": "Zoznam povolených" + } +} diff --git a/app/assets/i18n/sl.json b/app/assets/i18n/sl.json new file mode 100644 index 0000000..4df1fe5 --- /dev/null +++ b/app/assets/i18n/sl.json @@ -0,0 +1,501 @@ +{ + "locale": "Slovenščina", + "appName": "LocalSend", + "general": { + "accept": "Sprejmi", + "accepted": "Sprejeto", + "add": "Dodaj", + "advanced": "Napredno", + "cancel": "Prekliči", + "close": "Zapri", + "confirm": "Potrdi", + "continueStr": "Nadaljuj", + "copy": "Kopiraj", + "copiedToClipboard": "Kopirano v odložišče", + "decline": "Zavrni", + "done": "Končano", + "delete": "Izbriši", + "edit": "Uredi", + "error": "Napaka", + "example": "Primer", + "files": "Datoteke", + "finished": "Končano", + "hide": "Skrij", + "off": "Izklopljeno", + "offline": "Brez povezave", + "on": "Vklopljeno", + "online": "Na spletu", + "open": "Odpri", + "queue": "Čakalna vrsta", + "quickSave": "Hitro shranjevanje", + "quickSaveFromFavorites": "Hitro shranjevanje za »Priljubljene«", + "renamed": "Preimenovano", + "reset": "Razveljavi spremembe", + "restart": "Ponovni zagon", + "settings": "Nastavitve", + "skipped": "Preskočeno", + "start": "Začni", + "stop": "Ustavi", + "save": "Shrani", + "unchanged": "Nespremenjeno", + "unknown": "Neznano", + "noItemInClipboard": "V odložišču ni elementov." + }, + "receiveTab": { + "title": "Prejem", + "infoBox": { + "ip": "IP:", + "port": "Vrata:", + "alias": "Ime naprave:" + } + }, + "sendTab": { + "title": "Pošlji", + "selection": { + "title": "Izbira", + "files": "Datoteke: {files}", + "size": "Velikost: {size}" + }, + "picker": { + "file": "Datoteka", + "folder": "Mapa", + "media": "Mediji", + "text": "Besedilo", + "app": "Aplikacija", + "clipboard": "Prilepi" + }, + "shareIntentInfo": "Lahko uporabite funkcijo »Deli« na vaši mobilni napravi za lažjo izbiro datotek.", + "nearbyDevices": "Naprave v bližini", + "thisDevice": "Ta naprava", + "scan": "Išči naprave", + "manualSending": "Ročno pošiljanje", + "sendMode": "Način pošiljanja", + "sendModes": { + "single": "En prejemnik", + "multiple": "Več prejemnikov", + "link": "Deli prek povezave" + }, + "sendModeHelp": "Pojasnilo", + "help": "Preverite, da je ciljna naprava povezana v isto Wi-Fi omrežje.", + "placeItems": "Postavite elemente za deljenje." + }, + "settingsTab": { + "title": "Nastavitve", + "general": { + "title": "Splošno", + "brightness": "Tema", + "brightnessOptions": { + "system": "Sistem", + "dark": "Temna", + "light": "Svetla" + }, + "color": "Barva", + "colorOptions": { + "system": "Sistem", + "oled": "OLED" + }, + "language": "Jezik", + "languageOptions": { + "system": "Sistem" + }, + "saveWindowPlacement": "Shrani položaj okna ob izhodu", + "saveWindowPlacementWindows": "Shrani položaj okna ob zaprtju", + "minimizeToTray": "Ob zaprtju minimiziraj v sistemski pladenj / meni", + "launchAtStartup": "Samodejni zagon po prijavi", + "launchMinimized": "Samodejni zagon: Začni skrito", + "showInContextMenu": "Prikaži LocalSend v kontekstnem meniju", + "animations": "Animacije" + }, + "receive": { + "title": "Prejem", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Samodejno dokončaj", + "destination": "Shrani v mapo", + "downloads": "(Prenosi)", + "saveToGallery": "Shrani medije v galerijo", + "saveToHistory": "Shrani v zgodovino" + }, + "send": { + "title": "Pošlji", + "shareViaLinkAutoAccept": "Samodejno sprejmi zahteve v načinu »Deli prek povezave«" + }, + "network": { + "title": "Omrežje", + "needRestart": "Ponovno zaženite strežnik, da uveljavite nastavitve!", + "server": "Strežnik", + "alias": "Ime naprave", + "deviceType": "Tip naprave", + "deviceModel": "Model naprave", + "port": "Vrata", + "discoveryTimeout": "Časovna omejitev za odkrivanje", + "useSystemName": "Uporabi sistemsko ime", + "generateRandomAlias": "Ustvari naključni vzdevek", + "portWarning": "Morda vas druge naprave ne bodo zaznale, ker uporabljate nestandardna vrata. (privzeto: {defaultPort})", + "encryption": "Šifriranje", + "multicastGroup": "Večtočkovni naslov", + "multicastGroupWarning": "Morda vas druge naprave ne bodo zaznale, ker uporabljate nestandardni večtočkovni naslov. (privzeto: {defaultMulticast})" + }, + "other": { + "title": "Drugo", + "support": "Podprite LocalSend", + "donate": "Donirajte", + "privacyPolicy": "Politika zasebnosti", + "termsOfUse": "Pogoji uporabe" + }, + "advancedSettings": "Napredne nastavitve" + }, + "troubleshootPage": { + "title": "Odpravljanje težav", + "subTitle": "Aplikacija ne deluje pravilno? Tukaj najdete rešitve za pogoste težave.", + "solution": "Rešitev:", + "fixButton": "Samodejno odpravi", + "firewall": { + "symptom": "Ta naprava lahko pošilja datoteke, ne more pa jih prejemati.", + "solution": "Verjetno gre za težavo z požarnim zidom. Dovoli dohodne povezave (UDP in TCP) na vrata {port}.", + "openFirewall": "Odpri požarni zid" + }, + "noDiscovery": { + "symptom": "Ta naprava ne more najti drugih naprav.", + "solution": "Preverite, da so vse naprave v istem Wi-Fi omrežju in imajo enako konfiguracijo (vrata, večtočkovni naslov, šifriranje). Poskusite ročno vnesti IP naslov ciljne naprave. Če to deluje, jo dodajte med priljubljene za prihodnje odkrivanje." + }, + "noConnection": { + "symptom": "Naprave se ne najdejo in ne morejo deliti datotek.", + "solution": "Preverite, da so obe napravi v istem Wi-Fi omrežju in imajo enake nastavitve (vrata, večtočkovni naslov, šifriranje). Morda omrežje preprečuje komunikacijo med udeleženci (izolacija AP)." + } + }, + "receiveHistoryPage": { + "title": "Zgodovina", + "openFolder": "Odpri mapo", + "deleteHistory": "Izbriši zgodovino", + "empty": "Zgodovina je prazna.", + "entryActions": { + "open": "Odpri datoteko", + "showInFolder": "Prikaži v mapi", + "info": "Informacije", + "deleteFromHistory": "Izbriši iz zgodovine" + } + }, + "apkPickerPage": { + "title": "Aplikacije (APK)", + "excludeSystemApps": "Izključi sistemske aplikacije", + "excludeAppsWithoutLaunchIntent": "Izključi aplikacije, ki jih ni mogoče zagnati", + "apps": "{n} aplikacij" + }, + "selectedFilesPage": { + "deleteAll": "Izbriši vse" + }, + "receivePage": { + "subTitle": { + "one": "želi poslati datoteko", + "other": "želi poslati {n} datotek" + }, + "subTitleMessage": "vam je poslal sporočilo:", + "subTitleLink": "vam je poslal povezavo:", + "canceled": "Pošiljatelj je preklical zahtevo." + }, + "receiveOptionsPage": { + "title": "Možnosti", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(mapa LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Samodejno izklopljeno, ker obstajajo mape." + }, + "sendPage": { + "waiting": "Čakanje na odgovor...", + "rejected": "Prejemnik je zavrnil zahtevo.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Prejemnik je zaseden z drugo zahtevo." + }, + "progressPage": { + "titleSending": "Pošiljanje datotek", + "titleReceiving": "Prejemanje datotek", + "savedToGallery": "Shranjeno v Fotografije", + "total": { + "title": { + "sending": "Skupni napredek ({time})", + "finishedError": "Zaključeno z napako", + "canceledSender": "Preklical pošiljatelj", + "canceledReceiver": "Preklical prejemnik" + }, + "count": "Datoteke: {curr} / {n}", + "size": "Velikost: {curr} / {n}", + "speed": "Hitrost: {speed}/s" + } + }, + "webSharePage": { + "title": "Deli prek povezave", + "loading": "Zagon strežnika...", + "stopping": "Ustavitev strežnika...", + "error": "Prišlo je do napake pri zagonu strežnika.", + "openLink": { + "one": "Odprite to povezavo v svojem brskalniku:", + "other": "Odprite eno od teh povezav v svojem brskalniku:" + }, + "requests": "Zahteve", + "noRequests": "Zaenkrat ni nobenih zahtev.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Samodejno sprejemaj zahteve", + "requirePin": "Zahtevaj PIN", + "pinHint": "PIN je \"{pin}\"", + "encryptionHint": "LocalSend uporablja samopodpisano potrdilo. Sprejeti ga morate v svojem brskalniku.", + "pendingRequests": "Čakajoče zahteve: {n}" + }, + "aboutPage": { + "title": "O LocalSend", + "description": [ + "LocalSend je brezplačna, odprtokodna aplikacija, ki vam omogoča varno deljenje datotek in sporočil z napravami v bližini prek lokalnega omrežja brez potrebe po internetni povezavi.", + "Aplikacija je na voljo za Android, iOS, macOS, Windows in Linux. Vse možnosti prenosa lahko najdete na uradni spletni strani." + ], + "author": "Avtor", + "contributors": "Sodelavci", + "packagers": "Paketniki", + "translators": "Prevajalci" + }, + "donationPage": { + "title": "Doniraj", + "info": "LocalSend je brezplačna, odprtokodna in brez oglasov. Če vam je aplikacija všeč, lahko podprete razvoj z donacijo.", + "donate": "Doniraj {amount}", + "thanks": "Najlepša hvala!", + "restore": "Obnovi nakup" + }, + "changelogPage": { + "title": "Dnevnik sprememb" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Različne lokalizacije imajo lahko različne besede, morda se ne ujemajo 1:1", + "adjectives": [ + "Ljubek", + "Lep", + "Velik", + "Svetel", + "Čist", + "Pameten", + "Kul", + "Prisrčen", + "Prebrisan", + "Odločen", + "Energijski", + "Učinkovit", + "Fantastičen", + "Hiter", + "Fin", + "Svež", + "Dober", + "Čudovit", + "Odličen", + "Postaven", + "Vroč", + "Prijazen", + "Ljubek", + "Mističen", + "Urejen", + "Lep", + "Potrpežljiv", + "Prikupen", + "Mogočen", + "Bogat", + "Skrivnosten", + "Pameten", + "Trden", + "Poseben", + "Strateški", + "Močan", + "Pospravljeno", + "Moder" + ], + "fruits": [ + "Jabolko", + "Avokado", + "Banana", + "Robida", + "Borovnica", + "Brokoli", + "Korenček", + "Češnja", + "Kokos", + "Grozdje", + "Limona", + "Solata", + "Mango", + "Melona", + "Goba", + "Čebula", + "Pomaranča", + "Papaja", + "Breskev", + "Hruška", + "Ananas", + "Krompir", + "Buča", + "Malina", + "Jagoda", + "Paradižnik" + ], + "combination": "{adjective} {fruit}", + "@combination": "V nekaterih jezikih mora biti pridevnik na koncu." + }, + "dialogs": { + "addFile": { + "title": "Dodaj k izbiri", + "content": "Kaj želite dodati?" + }, + "addressInput": { + "title": "Vnesite naslov", + "hashtag": "Hashtag", + "ip": "IP naslov", + "recentlyUsed": "Nedavno uporabljeno: " + }, + "cancelSession": { + "title": "Prekliči prenos datotek", + "content": "Ali res želite preklicati prenos datotek?" + }, + "cannotOpenFile": { + "title": "Ne morem odpreti datoteke", + "content": "Ni mogoče odpreti \"{file}\". Ali je bila ta datoteka premaknjena, preimenovana ali izbrisana?" + }, + "encryptionDisabledNotice": { + "title": "Šifriranje onemogočeno", + "content": "Komunikacija zdaj poteka prek nezaščitenega HTTP protokola. Če želite uporabljati HTTPS, znova omogočite šifriranje." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Priljubljene naprave", + "noFavorites": "Ni še priljubljenih naprav.", + "addFavorite": "Dodaj" + }, + "favoriteDeleteDialog": { + "title": "Izbriši iz priljubljenih", + "content": "Ali res želite izbrisati napravo \"{name}\" iz priljubljenih?" + }, + "favoriteEditDialog": { + "titleAdd": "Dodaj v priljubljene", + "titleEdit": "Nastavitve", + "name": "Ime naprave", + "auto": "(samodejno)", + "ip": "IP naslov", + "port": "Vrata" + }, + "fileInfo": { + "title": "Informacije o datoteki", + "fileName": "Ime datoteke:", + "path": "Pot:", + "size": "Velikost:", + "sender": "Pošiljatelj:", + "time": "Čas:" + }, + "fileNameInput": { + "title": "Vnesite ime datoteke", + "original": "Izvirno: {original}" + }, + "historyClearDialog": { + "title": "Počisti zgodovino", + "content": "Ali res želite izbrisati celotno zgodovino?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend ne more najti drugih naprav brez dovoljenja za iskanje v lokalnem omrežju. Prosim, omogočite to dovoljenje v nastavitvah.", + "gotoSettings": "Nastavitve" + }, + "messageInput": { + "title": "Vnesite sporočilo", + "multiline": "Več vrstic" + }, + "noFiles": { + "title": "Ni izbranih datotek", + "content": "Prosim, izberite vsaj eno datoteko." + }, + "noPermission": { + "title": "Ni dovoljenja", + "content": "Niste podelili zahtevanih dovoljenj. Prosim, omogočite jih v nastavitvah." + }, + "notAvailableOnPlatform": { + "title": "Ni na voljo", + "content": "Ta funkcija je na voljo samo na:" + }, + "qr": { + "title": "QR koda" + }, + "quickActions": { + "title": "Hitre akcije", + "counter": "Števec", + "prefix": "Predpona", + "padZero": "Dodaj ničle", + "sortBeforeCount": "Predhodno uredi po abecedi (A-Ž)", + "random": "Naključno" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Zahteve za datoteke so zdaj samodejno sprejete. Bodite pozorni, da vam lahko vsi v lokalnem omrežju pošiljajo datoteke." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites" + }, + "pin": { + "title": "Vnesite PIN" + }, + "sendModeHelp": { + "title": "Načini pošiljanja", + "single": "Pošlje datoteke enemu prejemniku. Izbira bo po končanem prenosu izbrisana.", + "multiple": "Pošlje datoteke več prejemnikom. Izbira po končanem prenosu ne bo izbrisana.", + "link": "Prejemniki, ki nimajo nameščenega LocalSend, lahko prenesejo izbrane datoteke z odpiranjem povezave v brskalniku." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Ime datoteke ne sme biti prazno", + "invalid": "Ime datoteke vsebuje neveljavne znake" + }, + "tray": { + "@info": "Smernice Appla so zelo stroge glede uporabe besede \"zapri\".", + "open": "@:general.open", + "close": "Zapri LocalSend", + "closeWindows": "Izhod" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Vnesite PIN", + "invalidPin": "Neveljaven PIN", + "tooManyAttempts": "Preveč poskusov", + "rejected": "Zavrnjeno", + "files": "Datoteke", + "fileName": "Ime datoteke", + "size": "Velikost" + }, + "assetPicker": { + "@info": "Prevod za orodje za izbiro medijev na Androidu in iPhoneu", + "confirm": "Potrdi", + "cancel": "Prekliči", + "edit": "Uredi", + "gifIndicator": "GIF", + "loadFailed": "Nalaganje ni uspelo", + "original": "Izvirnik", + "preview": "Predogled", + "select": "Izberi", + "emptyList": "Prazno", + "unSupportedAssetType": "Nepodprt tip datoteke.", + "unableToAccessAll": "Ni mogoče dostopati do vseh datotek na napravi", + "viewingLimitedAssetsTip": "Prikaži samo datoteke in albume, do katerih ima aplikacija dostop.", + "changeAccessibleLimitedAssets": "Kliknite za posodobitev dostopnih datotek", + "accessAllTip": "Aplikacija lahko dostopa le do nekaterih datotek na napravi. Pojdite v sistemske nastavitve in omogočite dostop do vseh medijev na napravi.", + "goToSystemSettings": "Pojdi v sistemske nastavitve", + "accessLimitedAssets": "Nadaljuj z omejenim dostopom", + "accessiblePathName": "Dostopne datoteke", + "sTypeAudioLabel": "Zvok", + "sTypeImageLabel": "Slika", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Ostalo", + "sActionPlayHint": "predvajaj", + "sActionPreviewHint": "predogled", + "sActionSelectHint": "izberi", + "sActionSwitchPathLabel": "spremeni pot", + "sActionUseCameraHint": "uporabi kamero", + "sNameDurationLabel": "trajanje", + "sUnitAssetCountLabel": "številka" + } +} diff --git a/app/assets/i18n/sr-Cyrl.json b/app/assets/i18n/sr-Cyrl.json new file mode 100644 index 0000000..a4ab23c --- /dev/null +++ b/app/assets/i18n/sr-Cyrl.json @@ -0,0 +1,527 @@ +{ + "locale": "Српски (ћирилица)", + "appName": "LocalSend", + "general": { + "accept": "Прихвати", + "accepted": "Прихваћено", + "add": "Додај", + "advanced": "Напредно", + "cancel": "Откажи", + "close": "Затвори", + "confirm": "Потврди", + "continueStr": "Настави", + "copy": "Копирај", + "copiedToClipboard": "Копирано у привремену меморију", + "decline": "Одбиј", + "done": "Готово", + "delete": "Избриши", + "edit": "Измени", + "error": "Грешка", + "example": "Пример", + "files": "Фајлови", + "finished": "Завршено", + "hide": "Сакриј", + "off": "Искључено", + "offline": "Офлајн", + "on": "Укључено", + "online": "Онлајн", + "open": "Отвори", + "queue": "Редослед", + "quickSave": "Брзо чување", + "quickSaveFromFavorites": "Брзо чување у „Омиљено“", + "renamed": "Преименовано", + "reset": "Поништи промене", + "restart": "Рестартуј", + "settings": "Подешавања", + "skipped": "Прескочено", + "start": "Покрени", + "stop": "Заустави", + "save": "Сачувај", + "unchanged": "Непромењено", + "unknown": "Непознато", + "noItemInClipboard": "Нема предмета у привременој меморији." + }, + "receiveTab": { + "title": "Примање", + "infoBox": { + "ip": "IP:", + "port": "Порт:", + "alias": "Назив уређаја:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Омиљено", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Слање", + "selection": { + "title": "Избор", + "files": "Фајлови: {files}", + "size": "Величина: {size}" + }, + "picker": { + "file": "Фајл", + "folder": "Фолдер", + "media": "Медији", + "text": "Текст", + "app": "Aпликација", + "clipboard": "Налепи" + }, + "shareIntentInfo": "Такође, можете да користите функцију „Дели“ на свом мобилном уређају да бисте лакше бирали фајлове.", + "nearbyDevices": "Уређаји у близини", + "thisDevice": "Овај уређај", + "scan": "Претрага уређаја", + "manualSending": "Ручно слање", + "sendMode": "Режим слања", + "sendModes": { + "single": "Један прималац", + "multiple": "Више прималаца", + "link": "Дељење путем линка" + }, + "sendModeHelp": "Објашњење", + "help": "Уверите се да је прималац такође на истој Wi-Fi мрежи.", + "placeItems": "Поставите предмете за дељење." + }, + "settingsTab": { + "title": "Подешавања", + "general": { + "title": "Опште", + "brightness": "Тема", + "brightnessOptions": { + "system": "Системска", + "dark": "Тамна", + "light": "Светла" + }, + "color": "Боја", + "colorOptions": { + "system": "Системска", + "oled": "OLED" + }, + "language": "Језик", + "languageOptions": { + "system": "Системски" + }, + "saveWindowPlacement": "Сачувај положај прозора након напуштања", + "saveWindowPlacementWindows": "Сачувај положај прозора након излажења", + "minimizeToTray": "Минимизирај на системску траку/траку менија приликом затварања", + "launchAtStartup": "Аутоматски покрени након пријаве", + "launchMinimized": "Аутоматско покретање: Покретање скривено", + "showInContextMenu": "Прикажи LocalSend у контекстуалном менију", + "animations": "Анимације" + }, + "receive": { + "title": "Примање", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Аутоматски заврши", + "destination": "Чување у фолдер", + "downloads": "(Downloads)", + "saveToGallery": "Сачувај медије у галерију", + "saveToHistory": "Сачувај у историји" + }, + "send": { + "title": "Слање", + "shareViaLinkAutoAccept": "Аутоматски прихвати захтеве у режиму „Дељење путем линка“" + }, + "network": { + "title": "Мрежа", + "needRestart": "Рестартујте сервер да би се применила подешавања!", + "server": "Сервер", + "alias": "Назив уређаја", + "deviceType": "Тип уређаја", + "deviceModel": "Модел уређаја", + "port": "Порт", + "discoveryTimeout": "Откривање је истекло", + "useSystemName": "Користи системски назив", + "generateRandomAlias": "Генериши насумични псеудоним", + "portWarning": "Други уређаји вас можда неће открити, јер користите прилагођени порт. (подразумевани: {defaultPort})", + "encryption": "Шифровање", + "multicastGroup": "Адреса вишесмерног емитовања", + "multicastGroupWarning": "Други уређаји вас можда неће открити, јер користите прилагођену адресу вишесмерног емитовања. (подразумевана: {defaultMulticast})", + "network": "Мрежа", + "networkOptions": { + "all": "Све", + "filtered": "Филтрирана" + } + }, + "other": { + "title": "Остало", + "support": "Подржите LocalSend", + "donate": "Донирај", + "privacyPolicy": "Политика приватности", + "termsOfUse": "Услови коришћења" + }, + "advancedSettings": "Напредна подешавања" + }, + "troubleshootPage": { + "title": "Отклањање грешака", + "subTitle": "Да ли апликација ради како треба? Овде можете пронаћи нека уобичајена решења проблема.", + "solution": "Решење:", + "fixButton": "Поправи аутоматски", + "firewall": { + "symptom": "Овај уређај може слати фајлове другим уређајима; али други уређаји не могу слати фајлове овом уређају.", + "solution": "Ово је највероватније проблем са заштитним зидом. Ово можете решити тако што ћете дозволити долазне везе (UDP и TCP) на порту {port}.", + "openFirewall": "Отвори заштитни зид" + }, + "noDiscovery": { + "symptom": "Овај уређај не може да открије друге уређаје.", + "solution": "Уверите се да су сви уређаји на истој Wi-Fi мрежи и да имају исту конфигурацију (порт, адреса вишесмерног емитовања, шифровање). Можете покушати да ручно унесете IP адресу циљног уређаја. Ако то функционише, размислите о додавању тог уређаја у омиљене како би се могао аутоматски открити у будућности." + }, + "noConnection": { + "symptom": "Оба уређаја не могу да открију један другог нити могу да деле фајлове.", + "solution": "Да ли проблем постоји на обе стране? Ако је тако, потребно је да се уверите да су оба уређаја на истој Wi-Fi мрежи и да имају исту конфигурацију (порт, адреса вишесмерног емитовања, шифровање). Wi-Fi мрежа можда неће дозволити комуникацију између учесника због изолације приступне тачке (AP). У овом случају, ова опција мора бити онемогућена на рутеру." + } + }, + "receiveHistoryPage": { + "title": "Историја", + "openFolder": "Отвори фолдер", + "deleteHistory": "Избриши историју", + "empty": "Историја је празна.", + "entryActions": { + "open": "Отвори фајл", + "showInFolder": "Прикажи у фолдеру", + "info": "Информације", + "deleteFromHistory": "Избриши из историје" + } + }, + "apkPickerPage": { + "title": "Апликације (APK)", + "excludeSystemApps": "Изузми системске апликације", + "excludeAppsWithoutLaunchIntent": "Изузми апликације које се не покрећу", + "apps": "{n} апликација" + }, + "selectedFilesPage": { + "deleteAll": "Избриши све" + }, + "receivePage": { + "subTitle": { + "one": "жели да вам пошаље фајл", + "other": "жели да вам пошаље {n} фајлова" + }, + "subTitleMessage": "послао вам је поруку:", + "subTitleLink": "послао вам је линк:", + "canceled": "Пошиљалац је отказао захтев." + }, + "receiveOptionsPage": { + "title": "Опције", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend фолдер)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Аутоматски искључено јер постоје фолдери." + }, + "sendPage": { + "waiting": "Чекање одговора…", + "rejected": "Прималац је одбио захтев.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Прималац је заузет другим захтевом." + }, + "progressPage": { + "titleSending": "Слање фајлова", + "titleReceiving": "Примање фајлова", + "savedToGallery": "Сачувано у галерији", + "total": { + "title": { + "sending": "Укупан напредак ({time})", + "finishedError": "Завршено са грешком", + "canceledSender": "Пошиљалац је отказао", + "canceledReceiver": "Прималац је отказао" + }, + "count": "Фајлова: {curr} / {n}", + "size": "Величина: {curr} / {n}", + "speed": "Брзина: {speed}/s" + } + }, + "webSharePage": { + "title": "Дељење путем линка", + "loading": "Покретање сервера…", + "stopping": "Заустављање сервера…", + "error": "Дошло је до грешке приликом покретања сервера.", + "openLink": { + "one": "Отворите овај линк у вашем прегледачу:", + "other": "Отворите један од ових линкова у вашем прегледачу:" + }, + "requests": "Захтеви", + "noRequests": "Још увек нема захтева.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Аутоматски прихвати захтеве", + "requirePin": "Захтевај PIN", + "pinHint": "PIN је {pin}“„", + "encryptionHint": "LocalSend користи самопотписани сертификат. Морате га прихватити у свом прегледачу.", + "pendingRequests": "Захтеви на чекању: {n}" + }, + "aboutPage": { + "title": "О LocalSend-у", + "description": [ + "LocalSend је бесплатна апликација отвореног кода која вам омогућава да безбедно делите фајлове и поруке са уређајима у близини преко ваше локалне мреже, без потребе за интернет везом.", + "Ова апликације је доступна за Android, iOS, macOS, Windows i Linux. Можете пронаћи све опције за преузимање на званичној почетној страници." + ], + "author": "Аутор", + "contributors": "Сарадници", + "packagers": "Пакери", + "translators": "Преводиоци" + }, + "donationPage": { + "title": "Донација", + "info": "LocalSend је бесплатан, отвореног кода и без икаквих огласа. Ако вам се свиђа апликација, можете подржати развој донацијом.", + "donate": "Донирај {amount}", + "thanks": "Хвала вам пуно!", + "restore": "Врати куповину" + }, + "changelogPage": { + "title": "Евиденција промена" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Различити преводи могу имати различите речи, можда се не подударају 1:1", + "adjectives": [ + "Неодољива", + "Прелепа", + "Велика", + "Бистра", + "Чиста", + "Паметна", + "Хладњикава", + "Слатка", + "Лукава", + "Одлучна", + "Енергетска", + "Ефикасна", + "Фантастична", + "Брза", + "Фина", + "Свежа", + "Добра", + "Дивна", + "Велика", + "Згодна", + "Врућа", + "Нежна", + "Љубазна", + "Мистична", + "Уредна", + "Лепа", + "Стрпљива", + "Прелепа", + "Моћна", + "Богата", + "Тајновита", + "Паметна", + "Чврста", + "Специјална", + "Буђава", + "Јака", + "Уредна", + "Мудра" + ], + "fruits": [ + "Јабука", + "Шљива", + "Банана", + "Боровница", + "Рибизла", + "Кајсија", + "Шаргарепа", + "Трешња", + "Паприка", + "Папричица", + "Кромпируша", + "Купусара", + "Ротквица", + "Лубеница", + "Печурка", + "Мандарина", + "Поморанџа", + "Папаја", + "Бресква", + "Крушка", + "Шишарка", + "Диња", + "Бундева", + "Вишња", + "Јагода", + "Дуња" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last. Not the case in Serbian, but serbian adjectives must have endings which depend on the gender of the noun. That's why we put all the Fruits with the female form and corresponding adjective endings in female form for this translation." + }, + "dialogs": { + "addFile": { + "title": "Додајте у избор", + "content": "Шта желите додати?" + }, + "openFile": { + "title": "Отвори фајл", + "content": "Желите ли да отворите примљени фајл?" + }, + "addressInput": { + "title": "Унесите адресу", + "hashtag": "Хеш-ознака", + "ip": "IP адреса", + "recentlyUsed": "Недавно коришћено: " + }, + "cancelSession": { + "title": "Откажите пренос фајлова", + "content": "Желите ли заиста да откажете пренос фајлова?" + }, + "cannotOpenFile": { + "title": "Није могуће отворити фајл", + "content": "Није могуће отворити „{file}“. Да ли је овај фајл премештен, преименован, или избрисан?" + }, + "encryptionDisabledNotice": { + "title": "Шифровање онемогућено", + "content": "Комуникација се сада одвија преко нешифрованог HTTP протокола. Да бисте користили HTTPS протокол, поново омогућите шифровање." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Омиљено", + "noFavorites": "Још увек нема омиљених уређаја.", + "addFavorite": "Додај" + }, + "favoriteDeleteDialog": { + "title": "Избриши из омиљених", + "content": "Желите ли заиста да избришете „{name}“ из омиљених?" + }, + "favoriteEditDialog": { + "titleAdd": "Додајте у омиљене", + "titleEdit": "Подешавања", + "name": "Назив уређаја", + "auto": "(аутоматски)", + "ip": "IP адреса", + "port": "Порт" + }, + "fileInfo": { + "title": "Информације о фајлу", + "fileName": "Назив фајла:", + "path": "Путања:", + "size": "Величина:", + "sender": "Пошиљалац:", + "time": "Време:" + }, + "fileNameInput": { + "title": "Унесите назив фајла", + "original": "Оригинални назив фајла: {original}" + }, + "historyClearDialog": { + "title": "Очистите историју", + "content": "Желите ли заиста да очистите читаву историју?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend не може да пронађе друге уређаје без дозволе за скенирање локалне мреже. Дајте ову дозволу у подешавањима.", + "gotoSettings": "Подешавања" + }, + "messageInput": { + "title": "Напишите поруку", + "multiline": "Више редова" + }, + "noFiles": { + "title": "Није изабран ниједан фајл", + "content": "Изаберите бар један фајл." + }, + "noPermission": { + "title": "Нема дозволе", + "content": "Нисте дали неопходне дозволе. Дајте их у подешавањима." + }, + "notAvailableOnPlatform": { + "title": "Није доступно", + "content": "Ова функција је доступна само на:" + }, + "qr": { + "title": "QR кôд" + }, + "quickActions": { + "title": "Брзе радње", + "counter": "Бројач", + "prefix": "Префикс", + "padZero": "Допуна нулама", + "sortBeforeCount": "Сортирај унапред по абецеди (A-Z)", + "random": "Насумично" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Захтеви за фајлове се сада аутоматски прихватају. Имајте на уму да сви на локалној мрежи могу да вам шаљу фајлове." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Захтеви за фајлове се сада аутоматски прихватају са уређаја који су на вашој листи омиљених.", + "Упозорење! Тренутно, ово није потпуно безбедно, јер хакер који има отисак прста било ког уређаја са ваше листе омиљених може да вам шаље фајлове без ограничења.", + "Ипак, ова опција је и даље безбеднија од допуштања свим корисницима на локалној мрежи да вам шаљу фајлове без ограничења." + ] + }, + "pin": { + "title": "Унесите PIN" + }, + "sendModeHelp": { + "title": "Режими слања", + "single": "Слање фајлова једном примаоцу. Избор ће бити очишћен након завршеног преноса фајлова.", + "multiple": "Слање фајлове више прималаца. Избор неће бити очишћен након завршеног преноса фајлова.", + "link": "Примаоци који немају инсталиран LocalSend могу преузети изабране фајлове отварањем линка у свом прегледачу." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Назив фајла не може бити празан", + "invalid": "Назив фајла садржи неважеће знакове" + }, + "tray": { + "@info": "Apple смернице су веома строге у вези са „сличним“ формулацијама.", + "open": "@:general.open", + "close": "Напусти LocalSend", + "closeWindows": "Изађи" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Унесите PIN", + "invalidPin": "Неисправан PIN", + "tooManyAttempts": "Превише покушаја", + "rejected": "Одбијено", + "files": "Фајлови", + "fileName": "Назив фајла", + "size": "Величина" + }, + "assetPicker": { + "@info": "Преводи за алатку за избор медија за Android и iPhone", + "confirm": "Потврди", + "cancel": "Откажи", + "edit": "Измени", + "gifIndicator": "GIF", + "loadFailed": "Учитавање неуспешно", + "original": "Порекло", + "preview": "Преглед", + "select": "Изабери", + "emptyList": "Очисти листу", + "unSupportedAssetType": "Неподржан тип фајла.", + "unableToAccessAll": "Није могуће приступити свим фајловима на уређају", + "viewingLimitedAssetsTip": "Само фајлови за гледање и албуми доступни апликацији.", + "changeAccessibleLimitedAssets": "Додирните да ажурирате доступне фајлове", + "accessAllTip": "Апликација може да приступи само неким фајловима на уређају. Идите у системска подешавања и дозволите апликацији приступ свим медијима на уређају.", + "goToSystemSettings": "Иди у системска подешавања", + "accessLimitedAssets": "Настави са ограниченим приступом", + "accessiblePathName": "Доступни фајлови", + "sTypeAudioLabel": "Аудио", + "sTypeImageLabel": "Слика", + "sTypeVideoLabel": "Видео", + "sTypeOtherLabel": "Остали медији", + "sActionPlayHint": "пусти", + "sActionPreviewHint": "преглед", + "sActionSelectHint": "изабери", + "sActionSwitchPathLabel": "промени путању", + "sActionUseCameraHint": "користи камеру", + "sNameDurationLabel": "трајање", + "sUnitAssetCountLabel": "број" + }, + "networkInterfacesPage": { + "title": "Мрежни интерфејси", + "preview": "Преглед", + "whitelist": "Бела листа", + "blacklist": "Црна листа", + "info": "Подразумевано, LocalSend користи све доступне мрежне интерфејсе. Овде можете изузети нежељене мреже. Морате рестартовати сервер да би се примениле промене." + } +} diff --git a/app/assets/i18n/sr.json b/app/assets/i18n/sr.json new file mode 100644 index 0000000..233eab4 --- /dev/null +++ b/app/assets/i18n/sr.json @@ -0,0 +1,527 @@ +{ + "locale": "Srpski (latinica)", + "appName": "LocalSend", + "general": { + "accept": "Prihvati", + "accepted": "Prihvaćeno", + "add": "Dodaj", + "advanced": "Napredno", + "cancel": "Otkaži", + "close": "Zatvori", + "confirm": "Potvrdi", + "continueStr": "Nastavi", + "copy": "Kopiraj", + "copiedToClipboard": "Kopirano u privremenu memoriju", + "decline": "Odbij", + "done": "Gotovo", + "delete": "Izbriši", + "edit": "Izmeni", + "error": "Greška", + "example": "Primer", + "files": "Fajlovi", + "finished": "Završeno", + "hide": "Sakrij", + "off": "Isključeno", + "offline": "Oflajn", + "on": "Uključeno", + "online": "Onlajn", + "open": "Otvori", + "queue": "Redosled", + "quickSave": "Brzo čuvanje", + "quickSaveFromFavorites": "Brzo čuvanje u „Omiljeno“", + "renamed": "Preimenovano", + "reset": "Poništi promene", + "restart": "Restartuj", + "settings": "Podešavanja", + "skipped": "Preskočeno", + "start": "Pokreni", + "stop": "Zaustavi", + "save": "Sačuvaj", + "unchanged": "Nepromenjeno", + "unknown": "Nepoznato", + "noItemInClipboard": "Nema predmeta u privremenoj memoriji." + }, + "receiveTab": { + "title": "Primanje", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Naziv uređaja:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Omiljeno", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Slanje", + "selection": { + "title": "Izbor", + "files": "Fajlovi: {files}", + "size": "Veličina: {size}" + }, + "picker": { + "file": "Fajl", + "folder": "Folder", + "media": "Mediji", + "text": "Tekst", + "app": "Aplikacija", + "clipboard": "Nalepi" + }, + "shareIntentInfo": "Takođe, možete da koristite funkciju „Deli“ na svom mobilnom uređaju da biste lakše birali fajlove.", + "nearbyDevices": "Uređaji u blizini", + "thisDevice": "Ovaj uređaj", + "scan": "Pretraga uređaja", + "manualSending": "Ručno slanje", + "sendMode": "Režim slanja", + "sendModes": { + "single": "Jedan primalac", + "multiple": "Više primalaca", + "link": "Deljenje putem linka" + }, + "sendModeHelp": "Objašnjenje", + "help": "Uverite se da je primalac takođe na istoj Wi-Fi mreži.", + "placeItems": "Postavite predmete za deljenje." + }, + "settingsTab": { + "title": "Podešavanja", + "general": { + "title": "Opšte", + "brightness": "Tema", + "brightnessOptions": { + "system": "Sistemska", + "dark": "Tamna", + "light": "Svetla" + }, + "color": "Boja", + "colorOptions": { + "system": "Sistemska", + "oled": "OLED" + }, + "language": "Jezik", + "languageOptions": { + "system": "Sistemski" + }, + "saveWindowPlacement": "Sačuvaj položaj prozora nakon napuštanja", + "saveWindowPlacementWindows": "Sačuvaj položaj prozora nakon izlaženja", + "minimizeToTray": "Minimiziraj na sistemsku traku/traku menija prilikom zatvaranja", + "launchAtStartup": "Automatski pokreni nakon prijave", + "launchMinimized": "Automatsko pokretanje: Pokretanje skriveno", + "showInContextMenu": "Prikaži LocalSend u kontekstualnom meniju", + "animations": "Animacije" + }, + "receive": { + "title": "Primanje", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Automatski završi", + "destination": "Čuvanje u folder", + "downloads": "(Downloads)", + "saveToGallery": "Sačuvaj medije u galeriju", + "saveToHistory": "Sačuvaj u istoriji" + }, + "send": { + "title": "Slanje", + "shareViaLinkAutoAccept": "Automatski prihvati zahteve u režimu „Deljenje putem linka“" + }, + "network": { + "title": "Mreža", + "needRestart": "Restartujte server da bi se primenila podešavanja!", + "server": "Server", + "alias": "Naziv uređaja", + "deviceType": "Tip uređaja", + "deviceModel": "Model uređaja", + "port": "Port", + "discoveryTimeout": "Otkrivanje je isteklo", + "useSystemName": "Koristi sistemski naziv", + "generateRandomAlias": "Generiši nasumični pseudonim", + "portWarning": "Drugi uređaji vas možda neće otkriti, jer koristite prilagođeni port. (podrazumevani: {defaultPort})", + "encryption": "Šifrovanje", + "multicastGroup": "Adresa višesmernog emitovanja", + "multicastGroupWarning": "Drugi uređaji vas možda neće otkriti, jer koristite prilagođenu adresu višesmernog emitovanja. (podrazumevana: {defaultMulticast})", + "network": "Mreža", + "networkOptions": { + "filtered": "Filtrirana", + "all": "Sve" + } + }, + "other": { + "title": "Ostalo", + "support": "Podržite LocalSend", + "donate": "Doniraj", + "privacyPolicy": "Politika privatnosti", + "termsOfUse": "Uslovi korišćenja" + }, + "advancedSettings": "Napredna podešavanja" + }, + "troubleshootPage": { + "title": "Otklanjanje grešaka", + "subTitle": "Da li aplikacija radi kako treba? Ovde možete pronaći neka uobičajena rešenja problema.", + "solution": "Rešenje:", + "fixButton": "Popravi automatski", + "firewall": { + "symptom": "Ovaj uređaj može slati fajlove drugim uređajima, ali drugi uređaji ne mogu slati fajlove ovom uređaju.", + "solution": "Ovo je najverovatnije problem sa zaštitnim zidom. Ovo možete rešiti tako što ćete dozvoliti dolazne veze (UDP i TCP) na portu {port}.", + "openFirewall": "Otvori zaštitni zid" + }, + "noDiscovery": { + "symptom": "Ovaj uređaj ne može da otkrije druge uređaje.", + "solution": "Uverite se da su svi uređaji na istoj Wi-Fi mreži i da imaju istu konfiguraciju (port, adresa višesmernog emitovanja, šifrovanje). Možete pokušati da ručno unesete IP adresu ciljnog uređaja. Ako ovo funkcioniše, razmislite o dodavanju ovog uređaja u omiljene kako bi se mogao automatski otkriti u budućnosti." + }, + "noConnection": { + "symptom": "Oba uređaja ne mogu da otkriju jedan drugog niti mogu da dele fajlove.", + "solution": "Da li problem postoji na obe strane? Ako je tako, potrebno je da se uverite da su oba uređaja na istoj Wi-Fi mreži i da imaju istu konfiguraciju (port, adresa višesmernog emitovanja, šifrovanje). Wi-Fi mreža možda neće dozvoliti komunikaciju između učesnika zbog izolacije pristupne tačke (AP). U ovom slučaju, ova opcija mora biti onemogućena na ruteru." + } + }, + "receiveHistoryPage": { + "title": "Istorija", + "openFolder": "Otvori folder", + "deleteHistory": "Izbriši istoriju", + "empty": "Istorija je prazna.", + "entryActions": { + "open": "Otvori fajl", + "showInFolder": "Prikaži u folderu", + "info": "Informacije", + "deleteFromHistory": "Izbriši iz istorije" + } + }, + "apkPickerPage": { + "title": "Aplikacije (APK)", + "excludeSystemApps": "Izuzmi sistemske aplikacije", + "excludeAppsWithoutLaunchIntent": "Izuzmi aplikacije koje se ne pokreću", + "apps": "{n} aplikacija" + }, + "selectedFilesPage": { + "deleteAll": "Izbriši sve" + }, + "receivePage": { + "subTitle": { + "one": "želi da vam pošalje fajl", + "other": "želi da vam pošalje {n} fajlova" + }, + "subTitleMessage": "poslao vam je poruku:", + "subTitleLink": "poslao vam je link:", + "canceled": "Pošiljalac je otkazao zahtev." + }, + "receiveOptionsPage": { + "title": "Opcije", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend folder)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Automatski isključeno jer postoje folderi." + }, + "sendPage": { + "waiting": "Čekanje odgovora…", + "rejected": "Primalac je odbio zahtev.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Primalac je zauzet drugim zahtevom." + }, + "progressPage": { + "titleSending": "Slanje fajlova", + "titleReceiving": "Primanje fajlova", + "savedToGallery": "Sačuvano u galeriji", + "total": { + "title": { + "sending": "Ukupan napredak ({time})", + "finishedError": "Završeno sa greškom", + "canceledSender": "Pošiljalac je otkazao", + "canceledReceiver": "Primalac je otkazao" + }, + "count": "Fajlova: {curr} / {n}", + "size": "Veličina: {curr} / {n}", + "speed": "Brzina: {speed}/s" + } + }, + "webSharePage": { + "title": "Deljenje putem linka", + "loading": "Pokretanje servera…", + "stopping": "Zaustavljanje servera…", + "error": "Došlo je do greške prilikom pokretanja servera.", + "openLink": { + "one": "Otvorite ovaj link u vašem pregledaču:", + "other": "Otvorite jedan od ovih linkova u vašem pregledaču:" + }, + "requests": "Zahtevi", + "noRequests": "Još uvek nema zahteva.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Automatski prihvati zahteve", + "requirePin": "Zahtevaj PIN", + "pinHint": "PIN je „{pin}“", + "encryptionHint": "LocalSend koristi samopotpisani sertifikat. Morate ga prihvatiti u svom pregledaču.", + "pendingRequests": "Zahtevi na čekanju: {n}" + }, + "aboutPage": { + "title": "O LocalSend-u", + "description": [ + "LocalSend je besplatna aplikacija otvorenog koda koja vam omogućava da bezbedno delite fajlove i poruke sa uređajima u blizini preko vaše lokalne mreže, bez potrebe za internet vezom.", + "Ova aplikacije je dostupna za Android, iOS, macOS, Windows i Linux. Možete pronaći sve opcije za preuzimanje na zvaničnoj početnoj stranici." + ], + "author": "Autor", + "contributors": "Saradnici", + "packagers": "Pakeri", + "translators": "Prevodioci" + }, + "donationPage": { + "title": "Donacija", + "info": "LocalSend je besplatan, otvorenog koda i bez ikakvih oglasa. Ako vam se sviđa aplikacija, možete podržati razvoj donacijom.", + "donate": "Doniraj {amount}", + "thanks": "Hvala vam puno!", + "restore": "Vrati kupovinu" + }, + "changelogPage": { + "title": "Evidencija promena" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Različiti prevodi mogu imati različite reči, možda se ne podudaraju 1:1", + "adjectives": [ + "Neodoljiva", + "Prelepa", + "Velika", + "Bistra", + "Čista", + "Pametna", + "Hladnjikava", + "Slatka", + "Lukava", + "Odlučna", + "Energetska", + "Efikasna", + "Fantastična", + "Brza", + "Fina", + "Sveža", + "Dobra", + "Divna", + "Velika", + "Zgodna", + "Vruća", + "Nežna", + "Ljubazna", + "Mistična", + "Uredna", + "Lepa", + "Strpljiva", + "Prelepa", + "Moćna", + "Bogata", + "Tajnovita", + "Pametna", + "Čvrsta", + "Specijalna", + "Budjava", + "Jaka", + "Uredna", + "Mudra" + ], + "fruits": [ + "Jabuka", + "Šljiva", + "Banana", + "Borovnica", + "Ribizla", + "Kajsija", + "Šargarepa", + "Trešnja", + "Paprika", + "Papričica", + "Krompiruša", + "Kupusara", + "Rotkvica", + "Lubenica", + "Pečurka", + "Mandarina", + "Pomorandža", + "Papaja", + "Breskva", + "Kruška", + "Šišarka", + "Dinja", + "Bundeva", + "Višnja", + "Jagoda", + "Dunja" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last. Not the case in Serbian, but serbian adjectives must have endings which depend on the gender of the noun. That's why we put all the Fruits with the female form and corresponding adjective endings in female form for this translation." + }, + "dialogs": { + "addFile": { + "title": "Dodajte u izbor", + "content": "Šta želite dodati?" + }, + "openFile": { + "title": "Otvori fajl", + "content": "Želite li da otvorite primljeni fajl?" + }, + "addressInput": { + "title": "Unesite adresu", + "hashtag": "Heš-oznaka", + "ip": "IP adresa", + "recentlyUsed": "Nedavno korišćeno: " + }, + "cancelSession": { + "title": "Otkažite prenos fajlova", + "content": "Želite li zaista da otkažete prenos fajlova?" + }, + "cannotOpenFile": { + "title": "Nije moguće otvoriti fajl", + "content": "Nije moguće otvoriti „{file}“. Da li je ovaj fajl premešten, preimenovan ili izbrisan?" + }, + "encryptionDisabledNotice": { + "title": "Šifrovanje onemogućeno", + "content": "Komunikacija se sada odvija preko nešifrovanog HTTP protokola. Da biste koristili HTTPS protokol, ponovo omogućite šifrovanje." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Omiljeno", + "noFavorites": "Još uvek nema omiljenih uređaja.", + "addFavorite": "Dodaj" + }, + "favoriteDeleteDialog": { + "title": "Izbriši iz omiljenih", + "content": "Želite li zaista da izbrišete „{name}“ iz omiljenih?" + }, + "favoriteEditDialog": { + "titleAdd": "Dodajte u omiljene", + "titleEdit": "Podešavanja", + "name": "Naziv uređaja", + "auto": "(automatski)", + "ip": "IP adresa", + "port": "Port" + }, + "fileInfo": { + "title": "Informacije o fajlu", + "fileName": "Naziv fajla:", + "path": "Putanja:", + "size": "Veličina:", + "sender": "Pošiljalac:", + "time": "Vreme:" + }, + "fileNameInput": { + "title": "Unesite naziv fajla", + "original": "Originalni naziv fajla: {original}" + }, + "historyClearDialog": { + "title": "Očistite istoriju", + "content": "Želite li zaista da očistite čitavu istoriju?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend ne može da pronađe druge uređaje bez dozvole za skeniranje lokalne mreže. Dajte ovu dozvolu u podešavanjima.", + "gotoSettings": "Podešavanja" + }, + "messageInput": { + "title": "Napišite poruku", + "multiline": "Više redova" + }, + "noFiles": { + "title": "Nije izabran nijedan fajl", + "content": "Izaberite bar jedan fajl." + }, + "noPermission": { + "title": "Nema dozvole", + "content": "Niste dali neophodne dozvole. Dajte ih u podešavanjima." + }, + "notAvailableOnPlatform": { + "title": "Nije dostupno", + "content": "Ova funkcija je dostupna samo na:" + }, + "qr": { + "title": "QR kôd" + }, + "quickActions": { + "title": "Brze radnje", + "counter": "Brojač", + "prefix": "Prefiks", + "padZero": "Dopuna nulama", + "sortBeforeCount": "Sortiraj unapred po abecedi (A-Z)", + "random": "Nasumično" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Zahtevi za fajlove se sada automatski prihvataju. Imajte na umu da svi na lokalnoj mreži mogu da vam šalju fajlove." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Zahtevi za fajlove se sada automatski prihvataju sa uređaja koji su na vašoj listi omiljenih.", + "Upozorenje! Trenutno, ovo nije potpuno bezbedno, jer haker koji ima otisak prsta bilo kog uređaja sa vaše liste omiljenih može da vam šalje fajlove bez ograničenja.", + "Ipak, ova opcija je i dalje bezbednija od dopuštanja svim korisnicima na lokalnoj mreži da vam šalju fajlove bez ograničenja." + ] + }, + "pin": { + "title": "Unesite PIN" + }, + "sendModeHelp": { + "title": "Režimi slanja", + "single": "Slanje fajlova jednom primaocu. Izbor će biti očišćen nakon završenog prenosa fajlova.", + "multiple": "Slanje fajlova više primalaca. Izbor neće biti očišćen nakon završenog prenosa fajlova.", + "link": "Primaoci koji nemaju instaliran LocalSend mogu preuzeti izabrane fajlove otvaranjem linka u svom pregledaču." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Naziv fajla ne može biti prazan", + "invalid": "Naziv fajla sadrži nevažeće znakove" + }, + "tray": { + "@info": "Apple smernice su veoma stroge u vezi sa „sličnim“ formulacijama.", + "open": "@:general.open", + "close": "Napusti LocalSend", + "closeWindows": "Izađi" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Unesite PIN", + "invalidPin": "Neispravan PIN", + "tooManyAttempts": "Previše pokušaja", + "rejected": "Odbijeno", + "files": "Fajlovi", + "fileName": "Naziv fajla", + "size": "Veličina" + }, + "assetPicker": { + "@info": "Prevodi za alatku za izbor medija za Android i iPhone", + "confirm": "Potvrdi", + "cancel": "Otkaži", + "edit": "Izmeni", + "gifIndicator": "GIF", + "loadFailed": "Učitavanje neuspešno", + "original": "Poreklo", + "preview": "Pregled", + "select": "Izaberi", + "emptyList": "Očisti listu", + "unSupportedAssetType": "Nepodržan tip fajla.", + "unableToAccessAll": "Nije moguće pristupiti svim fajlovima na uređaju", + "viewingLimitedAssetsTip": "Samo fajlovi za gledanje i albumi dostupni aplikaciji.", + "changeAccessibleLimitedAssets": "Dodirnite da ažurirate dostupne fajlove", + "accessAllTip": "Aplikacija može da pristupi samo nekim fajlovima na uređaju. Idite u sistemska podešavanja i dozvolite aplikaciji pristup svim medijima na uređaju.", + "goToSystemSettings": "Idi u sistemska podešavanja", + "accessLimitedAssets": "Nastavi sa ograničenim pristupom", + "accessiblePathName": "Dostupni fajlovi", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Slika", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Ostali mediji", + "sActionPlayHint": "pusti", + "sActionPreviewHint": "pregled", + "sActionSelectHint": "izaberi", + "sActionSwitchPathLabel": "promeni putanju", + "sActionUseCameraHint": "koristi kameru", + "sNameDurationLabel": "trajanje", + "sUnitAssetCountLabel": "broj" + }, + "networkInterfacesPage": { + "title": "Mrežni interfejsi", + "preview": "Pregled", + "whitelist": "Bela lista", + "blacklist": "Crna lista", + "info": "Podrazumevano, LocalSend koristi sve dostupne mrežne interfejse. Ovde možete izuzeti neželjene mreže. Morate restartovati server da bi se primenile promene." + } +} diff --git a/app/assets/i18n/sv.json b/app/assets/i18n/sv.json new file mode 100644 index 0000000..c44d756 --- /dev/null +++ b/app/assets/i18n/sv.json @@ -0,0 +1,535 @@ +{ + "locale": "Svenska", + "appName": "LocalSend", + "general": { + "accept": "Acceptera", + "accepted": "Accepterad", + "add": "Lägg till", + "advanced": "Avancerat", + "cancel": "Avbryt", + "close": "Stäng", + "confirm": "Bekräfta", + "continueStr": "Vidare", + "copy": "Kopiera", + "copiedToClipboard": "Kopierat till urklipp", + "decline": "Avböj", + "done": "Klar", + "delete": "Ta bort", + "edit": "Redigera", + "error": "Fel", + "example": "Exempel", + "files": "Filer", + "finished": "Färdig", + "hide": "Göm", + "off": "Av", + "offline": "Offline", + "on": "På", + "online": "Online", + "open": "Öppna", + "queue": "Kö", + "quickSave": "Snabbspara", + "quickSaveFromFavorites": "Snabbspara för \"Favoriter\"", + "renamed": "Bytt namn", + "reset": "Återställ", + "restart": "Starta om", + "settings": "Inställningar", + "skipped": "Hoppad över", + "start": "Börja", + "stop": "Stopp", + "save": "Spara", + "unchanged": "Oförändrad", + "unknown": "Okänd", + "noItemInClipboard": "Inga objekt i urklipp." + }, + "receiveTab": { + "title": "Ta emot", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Alias:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favoriter", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Skicka", + "selection": { + "title": "Val", + "files": "Filer: {files}", + "size": "Storlek: {size}" + }, + "picker": { + "file": "Fil", + "folder": "Mapp", + "media": "Media", + "text": "Text", + "app": "App", + "clipboard": "Klistra in" + }, + "shareIntentInfo": "Du kan också använda \"Dela\"-funtionen i din mobiltelefon för att lättare välja filer.", + "nearbyDevices": "Närbelägna enhter", + "thisDevice": "Denna Enhet", + "scan": "Leta efter enheter", + "manualSending": "Manuell sändning", + "sendMode": "Sändningsläge", + "sendModes": { + "single": "En mottagare", + "multiple": "Flera mottagare", + "link": "Dela via länk" + }, + "sendModeHelp": "Förklaring", + "help": "Kontrollera att den sökta enheten är uppkopplad till samma wifi nätverk som din enhet.", + "placeItems": "Placera objekt att dela." + }, + "settingsTab": { + "title": "Inställningar", + "general": { + "title": "Allmänt", + "brightness": "Tema", + "brightnessOptions": { + "system": "System", + "dark": "Mörkt", + "light": "Ljust" + }, + "color": "Färg", + "colorOptions": { + "system": "System", + "oled": "OLED" + }, + "language": "Språk", + "languageOptions": { + "system": "System" + }, + "saveWindowPlacement": "Avsluta: Spara fönsterplacering", + "saveWindowPlacementWindows": "Spara fönsterposition efter avslut", + "minimizeToTray": "Lämna: minimera till tray", + "launchAtStartup": "Starta automatiskt efter inloggning", + "launchMinimized": "Starta automatiskt: starta gömd", + "showInContextMenu": "Visa LocalSend i snabbmenyn", + "animations": "Animationer" + }, + "receive": { + "title": "Ta emot", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Automatisk avslutning", + "destination": "Destination", + "downloads": "(Hämtade)", + "saveToGallery": "Spara media i galleriet", + "saveToHistory": "Spara till historik" + }, + "send": { + "title": "Skicka", + "shareViaLinkAutoAccept": "Acceptera förfrågningar automatiskt i läget \"Dela via länk\"" + }, + "network": { + "title": "Nätverk", + "needRestart": "Starta om servern för att tillämpa inställningarna!", + "server": "Server", + "alias": "Alias", + "deviceType": "Enhetstyp", + "deviceModel": "Enhet modell", + "port": "Port", + "discoveryTimeout": "Tidsgräns för upptäckt", + "useSystemName": "Använd systemnamn", + "generateRandomAlias": "Generera slumpmässigt alias", + "portWarning": "Du kanske inte upptäcks av andra enheter eftersom du använder en anpassad port. (standard: {defaultPort})", + "encryption": "Kryptering", + "multicastGroup": "Multicast", + "multicastGroupWarning": "Du kanske inte upptäcks av andra enheter eftersom du använder en anpassad multicast-adress. (standard: {defaultMulticast})", + "network": "Nätverk", + "networkOptions": { + "all": "Alla", + "filtered": "Filtrerad" + } + }, + "other": { + "title": "Annat", + "support": "Stöd LocalSend", + "donate": "Donera", + "privacyPolicy": "Sekretesspolicy", + "termsOfUse": "Användarvillkor" + }, + "advancedSettings": "Avancerade inställningar" + }, + "troubleshootPage": { + "title": "Felsökning", + "subTitle": "Gör appen inte som förväntat? Här hittar du vanliga lösningar.", + "solution": "Lösning:", + "fixButton": "Fixa automatiskt", + "firewall": { + "symptom": "Denna app kan skicka filer till andra enheter men andra enheter kan inte skicka filer till denna enhet.", + "solution": "Detta är troligtvis ett brandväggsproblem. Du kan lösa det genom att tillåta inkommande anslutningar (UDP och TCP) på port {port}.", + "openFirewall": "Öppna brandväggen" + }, + "noDiscovery": { + "symptom": "Denna enhet kan inte upptäcka andra enheter.", + "solution": "Se till att alla enheter är på samma Wi-Fi-nätverk och delar samma konfiguration (port, multicast-adress, kryptering). Du kan försöka skriva in IP-adressen för målenheten manuellt. Om detta fungerar, överväg att lägga till den här enheten till favoriterna så att den kan upptäckas automatiskt i framtiden." + }, + "noConnection": { + "symptom": "Båda enheterna kan inte upptäcka varandra eller dela filer.", + "solution": "Problemet finns på båda sidor? Då måste du se till att båda enheterna är anslutna till samma wifi-nätverk och delar samma konfiguration (port, multicast-adress, kryptering). Wi-Fi kanske inte tillåter kommunikation mellan deltagare. I så fall måste alternativet vara aktiverat på routern." + } + }, + "receiveHistoryPage": { + "title": "Historik", + "openFolder": "Öppna mapp", + "deleteHistory": "Radera historik", + "empty": "Historiken är tom.", + "entryActions": { + "open": "Öppna fil", + "showInFolder": "Visa i mapp", + "info": "Information", + "deleteFromHistory": "Ta bort från historik" + } + }, + "apkPickerPage": { + "title": "Appar (APK)", + "excludeSystemApps": "Exkludera systemappar", + "excludeAppsWithoutLaunchIntent": "Exkludera appar som inte kan startas", + "apps": "{n} Appar" + }, + "selectedFilesPage": { + "deleteAll": "Radera alla" + }, + "receivePage": { + "subTitle": { + "one": "vill skicka en fil till dig", + "other": "Vill skick {n} filer till dig" + }, + "subTitleMessage": "skickade ett meddelande till dig:", + "subTitleLink": "skickade en länk till dig:", + "canceled": "Sändaren har avbrutit begäran." + }, + "receiveOptionsPage": { + "title": "Alternativ", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend-mappen)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Avstängd automatiskt eftersom det finns kataloger." + }, + "sendPage": { + "waiting": "Väntar på svar…", + "rejected": "Mottagaren har avvisat begäran.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Mottagaren är upptagen med en annan förfrågan." + }, + "progressPage": { + "titleSending": "Skickar filer", + "titleReceiving": "Tar emot filer", + "savedToGallery": "Sparat i Foton", + "total": { + "title": { + "sending": "Totalt förlopp ({time})", + "finishedError": "Avslutad med fel", + "canceledSender": "Avbruten av sändaren", + "canceledReceiver": "Avbruten av mottagaren" + }, + "count": "Filer: {curr} / {n}", + "size": "Storlek: {curr} / {n}", + "speed": "Hastighet: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Använd \"h\" som förkortning för timmar och \"m\" för minuter", + "@days": "Använd \"d\" för dagar, \"h\" för timmar och \"m\" för minuter" + } + }, + "webSharePage": { + "title": "Dela via länk", + "loading": "Startar server…", + "stopping": "Stoppar servern…", + "error": "Ett fel inträffade vid start av servern.", + "openLink": { + "one": "Öppna denna länk i webbläsaren:", + "other": "Öppna en av dessa länkar i webbläsaren:" + }, + "requests": "Förfrågningar", + "noRequests": "Inga förfrågningar ännu.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Acceptera förfrågningar automatiskt", + "requirePin": "Kräv PIN-kod", + "pinHint": "PIN-koden är \"{pin}\"", + "encryptionHint": "LocalSend använder ett självsignerat certifikat. Du behöver acceptera det i webbläsaren.", + "pendingRequests": "Väntande förfrågningar: {n}" + }, + "aboutPage": { + "title": "Om LocalSend", + "description": [ + "LocalSend är fri programvara med öppen källkod som låter dig säkert dela filer och meddelanden med enheter i närheten över ditt lokala nätverk utan att behöva en internetanslutning.", + "Denna app är tillgänglig på Android, iOS, macOS, Windows och Linux. Du kan hitta alla nedladdningsalternativ på den officiella hemsidan." + ], + "author": "Upphovsman", + "contributors": "Bidragsgivare", + "packagers": "Förpackare", + "translators": "Översättare" + }, + "donationPage": { + "title": "Donera", + "info": "LocalSend är fri programvara med öppen källkod och utan några annonser. Om du gillar appen kan du stödja utvecklingen med en donation.", + "donate": "Donera {amount}", + "thanks": "Tack så mycket!", + "restore": "Återställ köp" + }, + "changelogPage": { + "title": "Ändringslog" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Olika språk kan ha olika ord, det kanske inte matchar 1:1", + "adjectives": [ + "Bedårande", + "Vacker", + "Stor", + "Ljus", + "Ren", + "Klyftig", + "Cool", + "Söt", + "Listig", + "Bestämd", + "Energisk", + "Effektiv", + "Fantastisk", + "Snabb", + "Fint", + "Fräsch", + "Bra", + "Underbar", + "Jättebra", + "Stilig", + "Het", + "Snäll", + "Underbar", + "Mystiker", + "Prydlig", + "Trevlig", + "Tålmodig", + "Snygg", + "Kraftfull", + "Rik", + "Hemlig", + "Smart", + "Solid", + "Speciell", + "Strategisk", + "Stark", + "Ordentlig", + "Vis" + ], + "fruits": [ + "Äpple", + "Avocado", + "Banan", + "Björnbär", + "Blåbär", + "Broccoli", + "Morot", + "Körsbär", + "Kokosnöt", + "Druva", + "Citron", + "Sallad", + "Mango", + "Melon", + "Svamp", + "Lök", + "Apelsin", + "Papaya", + "Persika", + "Päron", + "Ananas", + "Potatis", + "Pumpa", + "Hallon", + "Jordgubbe", + "Tomat" + ], + "combination": "{adjective} {fruit}", + "@combination": "In some languages, the adjective must be last." + }, + "dialogs": { + "addFile": { + "title": "Lägg till i val", + "content": "Vad vill du lägga till?" + }, + "openFile": { + "title": "Öppna fil", + "content": "Vill du öppna den mottagna filen?" + }, + "addressInput": { + "title": "Skriv in adress", + "hashtag": "Hashtag", + "ip": "IP Address", + "recentlyUsed": "Senast använda: " + }, + "cancelSession": { + "title": "Avbryt filöverföring", + "content": "Vill du verkligen avbryta filöverföringen?" + }, + "cannotOpenFile": { + "title": "Kan inte öppna fil", + "content": "Kunde inte öppna \"{file}\". Har denna fil flyttats, bytt namn eller raderats?" + }, + "encryptionDisabledNotice": { + "title": "Kryptering inaktiverad", + "content": "Kommunikationen sker nu via det oenkrypterade HTTP-protokollet. För att använda HTTPS, aktivera kryptering igen." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favoriter", + "noFavorites": "Inga favoritenheter än.", + "addFavorite": "Lägg till" + }, + "favoriteDeleteDialog": { + "title": "Ta bort från favoriter", + "content": "Vill du verkligen ta bort från favoriterna \"{name}\"?" + }, + "favoriteEditDialog": { + "titleAdd": "Lägg till i favoriter", + "titleEdit": "Inställningar", + "name": "Enhetens namn", + "auto": "(auto)", + "ip": "IP-adress", + "port": "Port" + }, + "fileInfo": { + "title": "Filinformation", + "fileName": "Filnamn:", + "path": "Sökväg:", + "size": "Storlek:", + "sender": "Avsändare:", + "time": "Tid:" + }, + "fileNameInput": { + "title": "Skriv in filnamn", + "original": "Orginal: {original}" + }, + "historyClearDialog": { + "title": "Rensa historik", + "content": "Vill du verkligen ta bort hela historiken?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend kan inte hitta andra enheter utan att ha behörighet att skanna det lokala nätverket. Bevilja denna behörighet i inställningarna.", + "gotoSettings": "Inställningar" + }, + "messageInput": { + "title": "Skriv meddelande", + "multiline": "Flerlinje" + }, + "noFiles": { + "title": "Ingen fil vald", + "content": "Var god välj minst en fil." + }, + "noPermission": { + "title": "Ingen behörighet", + "content": "Du har inte beviljat nödvändiga behörigheter. Var vänlig bevilja dem i inställningarna." + }, + "notAvailableOnPlatform": { + "title": "Inte tillgängligt", + "content": "Denna funktion är endast tillgänglig på:" + }, + "qr": { + "title": "QR-kod" + }, + "quickActions": { + "title": "Snabba Handlingar", + "counter": "Disken", + "prefix": "Prefix", + "padZero": "Block med nollor", + "sortBeforeCount": "Sortera alphabetiskt innan", + "random": "Slumpmässig" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Filförfrågningar accepteras automatiskt. Observera att alla i lokala nätverket kan skicka filer till dig." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Filförfrågningar accepteras nu automatiskt från enheter i din favoritlista.", + "Varning! För närvarande är detta inte helt säkert, eftersom en hacker som har fingeravtrycket från vilken enhet som helst från din favoritlista kan skicka filer till dig utan begränsningar.", + "Detta alternativ är dock fortfarande säkrare än att låta alla användare på det lokala nätverket skicka filer till dig utan begränsningar." + ] + }, + "pin": { + "title": "Ange PIN-kod" + }, + "sendModeHelp": { + "title": "Sändningslägen", + "single": "Skickar filer till en mottagare. Valet rensas efter avslutad filöverföring.", + "multiple": "Skickar filer till flera mottagare. Valet rensas inte.", + "link": "Mottagare som inte har LocalSend installerat kan ladda ner de valda filerna genom att öppna länken i deras webbläsare." + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "Filnamnet får inte vara tomt", + "invalid": "Filnamnet innehåller ogiltiga tecken" + }, + "tray": { + "@info": "Apples Riktlinjer är väldigt strikta kring 'stäng' formuleringen.", + "open": "@:general.open", + "close": "Avsluta LocalSend", + "closeWindows": "Avsluta" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Ange PIN-kod", + "invalidPin": "Ogiltig PIN-kod", + "tooManyAttempts": "För många försök", + "rejected": "Avvisad", + "files": "Filer", + "fileName": "Filnamn", + "size": "Storlek" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "Bekräfta", + "cancel": "Avbryt", + "edit": "Redigera", + "gifIndicator": "GIF", + "loadFailed": "Laddning misslyckades", + "original": "Original", + "preview": "Förhandsvisning", + "select": "Välj", + "emptyList": "Tom lista", + "unSupportedAssetType": "Ogiltig filtyp.", + "unableToAccessAll": "Kan inte få åtkomst till alla filer på enheten", + "viewingLimitedAssetsTip": "Endast visa filer och album som kan nås av appen.", + "changeAccessibleLimitedAssets": "Klicka för att uppdatera åtkomliga filer", + "accessAllTip": "Appen kan endast få åtkomst till vissa filer på enheten. Gå till systeminställningar och tillåt appen att få åtkomst till allt media på enheten.", + "goToSystemSettings": "Gå till systeminställningar", + "accessLimitedAssets": "Fortsätt med begränsad åtkomst", + "accessiblePathName": "Åtkomliga filer", + "sTypeAudioLabel": "Ljud", + "sTypeImageLabel": "Bild", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Annan media", + "sActionPlayHint": "spela", + "sActionPreviewHint": "förhandsvisa", + "sActionSelectHint": "välj", + "sActionSwitchPathLabel": "byt sökväg", + "sActionUseCameraHint": "använd kamera", + "sNameDurationLabel": "längd", + "sUnitAssetCountLabel": "antal" + }, + "networkInterfacesPage": { + "title": "Nätverksgränssnitt", + "info": "Som standard använder LocalSend alla tillgängliga nätverksgränssnitt. Du kan utesluta oönskade nätverk här. Du måste starta om servern för att tillämpa ändringarna.", + "preview": "Förhandsvisning", + "whitelist": "Vitlista", + "blacklist": "Svartlista" + } +} diff --git a/app/assets/i18n/ta.json b/app/assets/i18n/ta.json new file mode 100644 index 0000000..17760cb --- /dev/null +++ b/app/assets/i18n/ta.json @@ -0,0 +1,527 @@ +{ + "locale": "தமிழ்", + "appName": "உள்ளக", + "general": { + "accept": "ஏற்றுக்கொள்", + "accepted": "ஏற்றுக்கொள்ளப்பட்டது", + "add": "சேர்க்க", + "advanced": "மேம்பட்ட", + "cancel": "ரத்து செய்", + "close": "மூடு", + "confirm": "உறுதி", + "continueStr": "தொடரவும்", + "copy": "நகல் எடு", + "copiedToClipboard": "கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது", + "decline": "மறு", + "done": "முடிந்தது", + "delete": "நீக்கு", + "edit": "தொகுத்து அமை (திருத்து)", + "error": "பிழை / தவறு", + "example": "உதாரணம்", + "files": "கோப்புகள்", + "finished": "முடிந்தது", + "hide": "மறை", + "off": "ஆஃப் (Off)", + "offline": "ஆஃப்லைன் (Offline)", + "on": "ஆன் (On)", + "online": "ஆன்லைன் (Online)", + "open": "திறக்கவும்", + "queue": "வரிசை", + "quickSave": "விரைவில் சேமி", + "quickSaveFromFavorites": "விருப்பங்களுக்கு விரைவாகச் சேமி", + "renamed": "மறுபெயரிடப்பட்டது", + "reset": "மாற்றங்களைச் செயல்தவிர்", + "restart": "மறுதொடக்கம்", + "settings": "அமைப்புகள்", + "skipped": "தவிர்க்கப்பட்டது", + "start": "தொடங்கு", + "stop": "நிறுத்து", + "save": "சேமி", + "unchanged": "மாறாது", + "unknown": "தெரியவில்லை", + "noItemInClipboard": "கிளிப்போர்டில் உருப்படிகள் இல்லை." + }, + "receiveTab": { + "title": "பெறு", + "infoBox": { + "ip": "இணைய முகவரி:", + "port": "போர்ட்:", + "alias": "சாதனத்தின் பெயர்:" + }, + "quickSave": { + "off": "@: செனரல்", + "favorites": "பிடித்தவை", + "on": "@: செனரல்" + } + }, + "sendTab": { + "title": "அனுப்பு", + "selection": { + "title": "தேர்வு", + "files": "கோப்புகள்: {files}", + "size": "அளவு: {size}" + }, + "picker": { + "file": "கோப்பு", + "folder": "கோப்புறை", + "media": "மீடியா", + "text": "தட்டச்சு", + "app": "செயலி", + "clipboard": "ஒட்டவும்" + }, + "shareIntentInfo": "கோப்புகளை மிக எளிதாக தேர்ந்தெடுக்க உங்கள் மொபைல் சாதனத்தின் பகிர் அம்சத்தையும் பயன்படுத்தலாம்.", + "nearbyDevices": "அருகிலுள்ள சாதனங்கள்", + "thisDevice": "இந்த சாதனம்", + "scan": "சாதனங்களைத் தேடு", + "manualSending": "கைமுறையாக அனுப்புதல்", + "sendMode": "அனுப்பும் முறை", + "sendModes": { + "single": "ஒற்றை பெறுநர்", + "multiple": "பல பெறுநர்கள்", + "link": "இணைப்பு மூலம் பகிரவும்" + }, + "sendModeHelp": "விளக்கம்", + "help": "விரும்பிய இலக்கும் அதே வைஃபை நெட்வொர்க்கில் இருப்பதை உறுதிசெய்யவும்.", + "placeItems": "பகிர்ந்து கொள்ள பொருட்களை வைக்கவும்." + }, + "settingsTab": { + "title": "அமைப்புகள்", + "general": { + "title": "பொது", + "brightness": "தீம்", + "brightnessOptions": { + "system": "கணினி தீம்", + "dark": "இருண்ட தீம்", + "light": "ஒளி தீம்" + }, + "color": "நிறம்", + "colorOptions": { + "system": "கணினி நிறம்", + "oled": "ஓஎல்இடி" + }, + "language": "மொழி", + "languageOptions": { + "system": "கணினி மொழி" + }, + "saveWindowPlacement": "வெளியேறிய பிறகு சாளர நிலையை சேமிக்கவும்", + "saveWindowPlacementWindows": "வெளியேறிய பிறகு சாளர நிலையை சேமிக்கவும்", + "minimizeToTray": "மூடும் போது சிஸ்டம் ட்ரே/மெனு பட்டியில் குறைக்கவும்", + "launchAtStartup": "உள்நுழைந்த பிறகு தானாக துவக்கவும்", + "launchMinimized": "ஆட்டோஸ்டார்ட்: மறைக்கப்பட்ட தொடக்கம்", + "showInContextMenu": "சூழல் மெனுவில் LocalSend ஐக் காட்டு", + "animations": "அனிமேஷன்கள்" + }, + "receive": { + "title": "பெறு", + "quickSave": "@: general.quicksave", + "quickSaveFromFavorites": "@: general.quick பிடித்தவைகளிலிருந்து சேமிக்கவும்", + "requirePin": "@: websharepage.requirepin", + "autoFinish": "ஆட்டோ பினிஷ்", + "destination": "கோப்புறையில் சேமிக்கவும்", + "downloads": "(பதிவிறக்கங்கள்)", + "saveToGallery": "மீடியாவை கேலரியில் சேமிக்கவும்", + "saveToHistory": "வரலாற்றில் சேமிக்கவும்" + }, + "send": { + "title": "அனுப்பு", + "shareViaLinkAutoAccept": "\"இணைப்பு வழியாக பகிர்\" பயன்முறையில் கோரிக்கைகளை தானாக ஏற்கவும்" + }, + "network": { + "title": "நெட்வொர்க்", + "needRestart": "அமைப்புகளைப் பயன்படுத்த, சேவையகத்தை மறுதொடக்கம் செய்யுங்கள்!", + "server": "சர்வர்", + "alias": "சாதனத்தின் பெயர்", + "deviceType": "சாதன வகை", + "deviceModel": "சாதன மாதிரி", + "port": "போர்ட்", + "discoveryTimeout": "கண்டுபிடிப்பு நேரம் முடிந்தது", + "useSystemName": "அமைப்பின் பெயரைப் பயன்படுத்தவும்", + "generateRandomAlias": "சீரற்ற மாற்றுப்பெயரை உருவாக்கவும்", + "portWarning": "நீங்கள் தனிப்பயன் போர்ட்டைப் பயன்படுத்துவதால், பிற சாதனங்களால் உங்களைக் கண்டறிய முடியாமல் போகலாம். (இயல்புநிலை: {defaultPort})", + "encryption": "மறையாக்கம்", + "multicastGroup": "மல்டிகாஸ்ட் முகவரி", + "multicastGroupWarning": "நீங்கள் தனிப்பயன் மல்டிகாஸ்ட் முகவரியைப் பயன்படுத்துவதால் பிற சாதனங்களால் உங்களைக் கண்டறிய முடியாமல் போகலாம். (இயல்புநிலை: {defaultMulticast})", + "network": "பிணையம்", + "networkOptions": { + "all": "அனைத்தும்", + "filtered": "வடிகட்டப்பட்டது" + } + }, + "other": { + "title": "மற்றவை", + "support": "LocalSend ஐ ஆதரிக்க", + "donate": "நன்கொடை", + "privacyPolicy": "தனியுரிமைக் கொள்கை", + "termsOfUse": "பயன்பாட்டு விதிமுறைகள்" + }, + "advancedSettings": "மேம்பட்ட அமைப்புகள்" + }, + "troubleshootPage": { + "title": "பிரச்சனைகளை தீர்க்கவும்", + "subTitle": "ஆப் எதிர்பார்த்தது போல வேலை செய்யவில்லையா? இங்கே சில பொதுவான தீர்வுகளை நீங்கள் காணலாம்.", + "solution": "தீர்வு:", + "fixButton": "தானாக சரி செய்யவும்", + "firewall": { + "symptom": "இந்த சாதனம் மற்ற சாதனங்களுக்கு கோப்புகளை அனுப்ப முடிகிறது ஆனால் மற்ற சாதனங்கள் இந்த சாதனத்திற்கு கோப்புகளை அனுப்ப முடியாது.", + "solution": "இது பொதுவாக ஒரு ஃபயர்வால் பிரச்சனை ஆகும். {port} போர்ட் மீது உள்வரும் இணைப்புகளை (UDP மற்றும் TCP) அனுமதிப்பதன் மூலம் இதை சரி செய்யலாம்.", + "openFirewall": "ஃபயர்வால் திறக்கவும்" + }, + "noDiscovery": { + "symptom": "இந்த சாதனம் மற்ற சாதனங்களை கண்டறிய முடியவில்லை.", + "solution": "அனைத்து சாதனங்களும் ஒரே Wi-Fi நெட்வொர்க்கில் உள்ளன மற்றும் ஒரே அமைப்பைப் பகிர்ந்து கொள்கின்றன என்பதை உறுதிசெய்யவும் (போர்ட், மல்டிகாஸ்ட் முகவரி, குறியாக்கம்). இலக்கு சாதனத்தின் IP முகவரியை கையால் টাইப் செய்ய முயற்சிக்கவும். இது வேலை செய்தால், இந்த சாதனத்தை விருப்பங்களில் சேர்க்க பரிந்துரை செய்யப்படுகிறது, எனவே எதிர்காலத்தில் இது தானாகவே கண்டறியப்படும்." + }, + "noConnection": { + "symptom": "இரண்டு சாதனங்களும் ஒருவருக்கொருவர் கண்டறிய முடியவில்லை அல்லது கோப்புகளை பகிர முடியவில்லை.", + "solution": "பிரச்சனை இரு பக்கங்களிலும் உள்ளதா? அவ்வாறெனில், இரு சாதனங்களும் ஒரே Wi-Fi நெட்வொர்க்கில் உள்ளன மற்றும் ஒரே அமைப்பைப் பகிர்ந்து கொள்கின்றன என்பதை உறுதிசெய்ய வேண்டும் (போர்ட், மல்டிகாஸ்ட் முகவரி, குறியாக்கம்). Access Point (AP) Isolation காரணமாக Wi-Fi நெட்வொர்க்கில் பங்கேற்பாளர்கள் ஒருவருடன் ஒருவர் தொடர்பு கொள்ள முடியாமல் இருக்கலாம். இந்த விருப்பத்தை ரௌட்டரில் முடக்க வேண்டும்." + } + }, + "receiveHistoryPage": { + "title": "வரலாறு", + "openFolder": "கோப்புறையை திறக்கவும்", + "deleteHistory": "வரலாற்றை நீக்கவும்", + "empty": "வரலாறு காலியாக உள்ளது.", + "entryActions": { + "open": "கோப்பை திறக்கவும்", + "showInFolder": "கோப்புறையில் காண்பிக்கவும்", + "info": "தகவல்", + "deleteFromHistory": "வரலாற்றில் இருந்து நீக்கவும்" + } + }, + "apkPickerPage": { + "title": "செயலிகள் (APK)", + "excludeSystemApps": "கணினி செயலிகளைக் கணக்கில் எடுத்துக்கொள்ளாமல் விடவும்", + "excludeAppsWithoutLaunchIntent": "திறக்க முடியாத செயலிகளை தவிர்க்கவும்", + "apps": "{n} செயலிகள்" + }, + "selectedFilesPage": { + "deleteAll": "அனைத்தையும் நீக்கவும்" + }, + "receivePage": { + "subTitle": { + "one": "உங்களுக்கு ஒரு கோப்பை அனுப்ப விரும்புகிறார்", + "other": "உங்களுக்கு {n} கோப்புகளை அனுப்ப விரும்புகிறார்" + }, + "subTitleMessage": "உங்களுக்கு ஒரு செய்தியை அனுப்பினார்:", + "subTitleLink": "உங்களுக்கு ஒரு இணைப்பை அனுப்பினார்:", + "canceled": "அனுப்புபவர் கோரிக்கையை ரத்து செய்துள்ளார்." + }, + "receiveOptionsPage": { + "title": "விருப்பங்கள்", + "destination": "@: setsionStab.receive.destination", + "appDirectory": "(LocalSend கோப்புறை)", + "saveToGallery": "@: settionstab.receive.savetogallery", + "saveToGalleryOff": "கோப்புறைகள் இருப்பதால் தானாகவே முடக்கப்பட்டது." + }, + "sendPage": { + "waiting": "பதில் வரும் வரை காத்திருக்கிறது…", + "rejected": "பெறுநர் கோரிக்கையை நிராகரித்துள்ளார்.", + "tooManyAttempts": "@: web.doomanyattempts", + "busy": "பெறுநர் மற்றொரு கோரிக்கையுடன் ব্যস্তமாக உள்ளார்." + }, + "progressPage": { + "titleSending": "கோப்புகளை அனுப்புகிறது", + "titleReceiving": "கோப்புகளை பெறுகிறது", + "savedToGallery": "புகைப்படங்களில் சேமிக்கப்பட்டது", + "total": { + "title": { + "sending": "மொத்த முன்னேற்றம் ({time})", + "finishedError": "பிழையுடன் முடிந்தது", + "canceledSender": "அனுப்புநரால் ரத்து செய்யப்பட்டது", + "canceledReceiver": "பெறுநரால் ரத்து செய்யப்பட்டது" + }, + "count": "கோப்புகள்: {curr} / {n}", + "size": "அளவு: {curr} / {n}", + "speed": "வேகம்: {speed}/s" + } + }, + "webSharePage": { + "title": "இணைப்பின் மூலம் பகிரவும்", + "loading": "சேவையை தொடங்குகிறது…", + "stopping": "சேவையை நிறுத்துகிறது…", + "error": "சேவையை தொடங்கும்போது பிழை ஏற்பட்டது.", + "openLink": { + "one": "உங்கள் உலாவியில் இந்த இணைப்பை திறக்கவும்:", + "other": "உங்கள் உலாவியில் இந்த இணைப்புகளில் ஒன்றை திறக்கவும்:" + }, + "requests": "கோரிக்கைகள்", + "noRequests": "இன்னும் கோரிக்கைகள் இல்லை.", + "encryption": "@: settionstab.network.encryption", + "autoAccept": "கோரிக்கைகளை தானாகவே ஏற்கவும்", + "requirePin": "PIN தேவை", + "pinHint": "PIN \"{pin}\" ஆகும்", + "encryptionHint": "LocalSend ஒரு சுய கையொப்பம் செய்யப்பட்ட சான்றிதழைப் பயன்படுத்துகிறது. உங்களின் உலாவியில் அதை ஏற்க வேண்டும்.", + "pendingRequests": "நிலுவை கோரிக்கைகள்: {n}" + }, + "aboutPage": { + "title": "LocalSend பற்றி", + "description": [ + "LocalSend என்பது ஒரு இலவச, திறந்த மூல செயலி ஆகும், இது உங்களுக்கு உங்களின் உள்ளூர் நெட்வொர்க்கின் மூலம் அருகிலுள்ள சாதனங்களுடன் இணையம் தேவையின்றி பாதுகாப்பாக கோப்புகள் மற்றும் செய்திகளை பகிர அனுமதிக்கிறது.", + "இந்த செயலி Android, iOS, macOS, Windows மற்றும் Linux-ல் கிடைக்கிறது. அனைத்து பதிவிறக்கம் விருப்பங்களையும் உத்தியோகபூர்வ இணையதளத்தில் காணலாம்." + ], + "author": "ஆசிரியர்", + "contributors": "பங்களிப்பாளர்கள்", + "packagers": "பேக்கேஜர்கள்", + "translators": "மொழிபெயர்ப்பாளர்கள்" + }, + "donationPage": { + "title": "தானம்", + "info": "LocalSend இலவசம், திறந்த மூலமாக உள்ளது மற்றும் விளம்பரங்களின்றி உள்ளது. செயலியை நீங்கள் விரும்பினால், ஒரு தானம் மூலம் வளர்ச்சியை ஆதரிக்கலாம்.", + "donate": "{amount} தானம் செய்யவும்", + "thanks": "மிகவும் நன்றி!", + "restore": "கொள்முதல் மீட்டமை" + }, + "changelogPage": { + "title": "மாற்றம் பதிவு" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "வெவ்வேறு இடங்களுக்கு வெவ்வேறு சொற்கள் இருக்கலாம், அது 1: 1 உடன் பொருந்தாது", + "adjectives": [ + "அருமையான", + "அழகான", + "பெரிய", + "பிரகாசமான", + "சுத்தமான", + "திறமையான", + "குளிர்ச்சி", + "அழகான", + "வில்லங்கமான", + "உறுதியான", + "ஆற்றல் மிக்க", + "திறமையான", + "அபாரமான", + "வேகமான", + "நன்றாக", + "புதிய", + "நல்ல", + "கண்கவர்", + "சிறந்த", + "அழகான", + "சூடான", + "கருணைமிக்க", + "செல்வாக்கான", + "மர்மமான", + "ஒழுங்கான", + "நன்றான", + "பொறுமையான", + "அழகான", + "சக்திவாய்ந்த", + "செல்வந்தர்", + "ரகசியமான", + "சாமர்த்தியமான", + "உறுதியான", + "சிறப்பான", + "உத்தேசமான", + "வலுவான", + "சுத்தமாக", + "புத்திசாலி" + ], + "fruits": [ + "ஆப்பிள்", + "அவகேடோ", + "வாழை", + "கருப்பு திராட்சை", + "நீல திராட்சை", + "ப்ரோக்கோலி", + "கேரட்", + "செர்ரி", + "தேங்காய்", + "திராட்சை", + "எலுமிச்சை", + "லெட்டுஸ்", + "மாம்பழம்", + "மெலன்", + "மஷ்ரூம்", + "வெங்காயம்", + "ஆரஞ்சு", + "பப்பாளி", + "பீச்", + "பேரிக்காய்", + "அன்னாசி", + "உருளைக்கிழங்கு", + "மடிக்கோயா", + "ராஸ்பெர்ரி", + "ஸ்ட்ராபெர்ரி", + "தக்காளி" + ], + "combination": "{adjective} {fruit}", + "@combination": "சில மொழிகளில், பெயர்ச்சொல் இறுதியில் வர வேண்டும்." + }, + "dialogs": { + "addFile": { + "title": "தேர்வுக்கு சேர்", + "content": "நீங்கள் என்ன சேர்க்க விரும்புகிறீர்கள்?" + }, + "openFile": { + "title": "கோப்பை திறக்கவும்", + "content": "பெறப்பட்ட கோப்பை திறக்க விரும்புகிறீர்களா?" + }, + "addressInput": { + "title": "முகவரியை உள்ளிடவும்", + "hashtag": "ஹாஷ்டேக்", + "ip": "IP முகவரி", + "recentlyUsed": "சமீபத்தில் பயன்படுத்தப்பட்டது: " + }, + "cancelSession": { + "title": "கோப்புகள் பரிமாற்றத்தை ரத்து செய்யவும்", + "content": "நீங்கள் உண்மையிலேயே கோப்புகள் பரிமாற்றத்தை ரத்து செய்ய விரும்புகிறீர்களா?" + }, + "cannotOpenFile": { + "title": "கோப்பை திறக்க முடியவில்லை", + "content": "\"{file}\"-ஐ திறக்க முடியவில்லை. இந்த கோப்பு நகர்த்தப்பட்டதா, மறுபெயரிடப்பட்டதா அல்லது நீக்கப்பட்டதா?" + }, + "encryptionDisabledNotice": { + "title": "குறியாக்கம் முடக்கப்பட்டது", + "content": "இப்போது தகவல்தொடர்பு குறியாக்கமில்லாத HTTP நெறிமுறையின் மூலம் நடக்கிறது. HTTPS நெறிமுறையை பயன்படுத்த, குறியாக்கத்தை மீண்டும் இயக்கவும்." + }, + "errorDialog": { + "title": "@: general.error" + }, + "favoriteDialog": { + "title": "பிடித்தவை", + "noFavorites": "இன்னும் பிடித்த சாதனங்கள் இல்லை.", + "addFavorite": "சேர்" + }, + "favoriteDeleteDialog": { + "title": "பிடித்தவையிலிருந்து நீக்கவும்", + "content": "\"{name}\"-ஐ பிடித்தவையிலிருந்து உண்மையிலேயே நீக்க விரும்புகிறீர்களா?" + }, + "favoriteEditDialog": { + "titleAdd": "பிடித்தவைகளில் சேர்க்கவும்", + "titleEdit": "அமைப்புகள்", + "name": "சாதனத்தின் பெயர்", + "auto": "(தானாக)", + "ip": "IP முகவரி", + "port": "போர்ட்" + }, + "fileInfo": { + "title": "கோப்பு தகவல்", + "fileName": "கோப்பின் பெயர்:", + "path": "பாதை:", + "size": "அளவு:", + "sender": "அனுப்புநர்:", + "time": "நேரம்:" + }, + "fileNameInput": { + "title": "கோப்பின் பெயரை உள்ளிடவும்", + "original": "மூல: {original}" + }, + "historyClearDialog": { + "title": "வரலாற்றை அழிக்கவும்", + "content": "மொத்த வரலாற்றையும் உண்மையிலேயே நீக்க விரும்புகிறீர்களா?" + }, + "localNetworkUnauthorized": { + "title": "@: உரையாடல்.நோபர்மிசன்.டிடில்", + "description": "LocalSend உள்நாட்டு நெட்வொர்க்கை ஸ்கேன் செய்ய அனுமதியின்றி சாதனங்களை கண்டறிய முடியாது. தயவுசெய்து அமைப்புகளில் இந்த அனுமதியை வழங்கவும்.", + "gotoSettings": "அமைப்புகள்" + }, + "messageInput": { + "title": "செய்தியை தட்டச்சு செய்யவும்", + "multiline": "பல வரிகள்" + }, + "noFiles": { + "title": "கோப்புகள் தேர்ந்தெடுக்கப்படவில்லை", + "content": "குறைந்தது ஒரு கோப்பை தேர்ந்தெடுக்கவும்." + }, + "noPermission": { + "title": "அனுமதி இல்லை", + "content": "தேவையான அனுமதிகளை நீங்கள் வழங்கவில்லை. தயவுசெய்து அமைப்புகளில் அவற்றை வழங்கவும்." + }, + "notAvailableOnPlatform": { + "title": "கிடைக்கவில்லை", + "content": "இந்த அம்சம் மட்டுமே கிடைக்கிறது:" + }, + "qr": { + "title": "QR குறியீடு" + }, + "quickActions": { + "title": "விரைவு செயல்கள்", + "counter": "கணக்கிடுபவர்", + "prefix": "முன்னொட்டு", + "padZero": "பூஜ்யங்களால் நிரப்பவும்", + "sortBeforeCount": "முன்னதாக வரிசைப்படுத்தவும் (A-Z)", + "random": "சீரற்ற" + }, + "quickSaveNotice": { + "title": "@: general.quicksave", + "content": "கோப்பு கோரிக்கைகள் இப்போது தானாகவே ஏற்கப்படும். உள்ளூர் நெட்வொர்க்கில் உள்ள அனைவரும் உங்களுக்கு கோப்புகளை அனுப்ப முடியும் என்பதை கவனிக்கவும்." + }, + "quickSaveFromFavoritesNotice": { + "title": "@: general.quick பிடித்தவைகளிலிருந்து சேமிக்கவும்", + "content": [ + "உங்கள் பிடித்த பட்டியலில் உள்ள சாதனங்களில் இருந்து கோப்பு கோரிக்கைகள் இப்போது தானாகவே ஏற்கப்படும்.", + "எச்சரிக்கை! தற்போது, இது முழுமையாக பாதுகாப்பாக இல்லை, ஏனெனில் உங்கள் பிடித்த பட்டியலில் உள்ள சாதனங்களின் விரலடிகளை வைத்துள்ள ஒரு ஹேக்கர் எந்த கட்டுப்பாடுகளும் இல்லாமல் உங்களுக்கு கோப்புகளை அனுப்ப முடியும்.", + "என்ன தவிர, இந்த விருப்பம் உள்ளூர் நெட்வொர்க்கில் உள்ள அனைத்து பயனர்களும் எந்த கட்டுப்பாடுகளும் இல்லாமல் உங்களுக்கு கோப்புகளை அனுப்புவதை அனுமதிக்கும் விருப்பத்தை விட அதிகமாக பாதுகாப்பாக உள்ளது." + ] + }, + "pin": { + "title": "PIN-ஐ உள்ளிடவும்" + }, + "sendModeHelp": { + "title": "அனுப்பும் முறைகள்", + "single": "கோப்புகளை ஒரு பெறுநருக்கு அனுப்புகிறது. கோப்புகள் பரிமாற்றம் முடிந்த பிறகு தேர்வு அழிக்கப்படும்.", + "multiple": "கோப்புகளை பல பெறுநர்களுக்கு அனுப்புகிறது. கோப்புகள் பரிமாற்றம் முடிந்த பிறகு தேர்வு அழிக்கப்படாது.", + "link": "LocalSend நிறுவப்படாத பெறுநர்கள் தங்கள் உலாவியில் இணைப்பைத் திறக்க மூலம் தேர்ந்தெடுக்கப்பட்ட கோப்புகளை பதிவிறக்கம் செய்ய முடியும்." + }, + "zoom": { + "title": "முகவரி" + } + }, + "sanitization": { + "empty": "கோப்பின் பெயர் காலியாக இருக்க முடியாது", + "invalid": "கோப்பின் பெயரில் தவறான எழுத்துக்கள் உள்ளன" + }, + "tray": { + "@info": "ஆப்பிள் வழிகாட்டுதல்கள் \"மூடு\" வார்த்தையில் மிக கடுமையாக உள்ளன.", + "open": "@: general.open", + "close": "LocalSend-ஐ நிறுத்து", + "closeWindows": "வெளியேறு" + }, + "web": { + "waiting": "@: sendPage.wainging", + "enterPin": "PIN-ஐ உள்ளிடவும்", + "invalidPin": "தவறான PIN", + "tooManyAttempts": "மிக அதிகமான முயற்சிகள்", + "rejected": "நிராகரிக்கப்பட்டது", + "files": "கோப்புகள்", + "fileName": "கோப்பின் பெயர்", + "size": "அளவு" + }, + "assetPicker": { + "@info": "ஆண்ட்ராய்டு மற்றும் ஐபோனுக்கான ஊடகத் தேர்வு கருவிக்கான மொழிபெயர்ப்புகள்", + "confirm": "உறுதிசெய்", + "cancel": "ரத்து செய்", + "edit": "தொகு", + "gifIndicator": "Gif", + "loadFailed": "ஏற்றுதல் தோல்வியடைந்தது", + "original": "மூல", + "preview": "முன்னோட்டம்", + "select": "தேர்வு செய்", + "emptyList": "காலி பட்டியல்", + "unSupportedAssetType": "ஆதரிக்கப்படாத கோப்பு வகை.", + "unableToAccessAll": "சாதனத்தின் அனைத்து கோப்புகளுக்கும் அணுக முடியவில்லை", + "viewingLimitedAssetsTip": "பயன்பாட்டால் அணுகக்கூடிய கோப்புகள் மற்றும் ஆல்பங்களை மட்டுமே பார்க்கவும்.", + "changeAccessibleLimitedAssets": "அணுகக்கூடிய கோப்புகளை புதுப்பிக்க கிளிக் செய்யவும்", + "accessAllTip": "பயன்பாடு சாதனத்தின் சில கோப்புகளுக்கே அணுக முடியும். முறைமை அமைப்புகள் செல்லவும் மற்றும் பயன்பாட்டுக்கு அனைத்து ஊடகத்திற்கும் அணுகலை அனுமதிக்கவும்.", + "goToSystemSettings": "முறைமை அமைப்புகள் செல்லவும்", + "accessLimitedAssets": "வரையறுக்கப்பட்ட அணுகலுடன் தொடரவும்", + "accessiblePathName": "அணுகக்கூடிய கோப்புகள்", + "sTypeAudioLabel": "ஒலி", + "sTypeImageLabel": "படம்", + "sTypeVideoLabel": "வீடியோ", + "sTypeOtherLabel": "மற்ற ஊடகம்", + "sActionPlayHint": "விளையாட", + "sActionPreviewHint": "முன்னோட்டம்", + "sActionSelectHint": "தேர்வு செய்", + "sActionSwitchPathLabel": "பாதையை மாற்றவும்", + "sActionUseCameraHint": "கேமராவை பயன்படுத்தவும்", + "sNameDurationLabel": "நேர அளவு", + "sUnitAssetCountLabel": "எண்ணிக்கை" + }, + "networkInterfacesPage": { + "title": "பிணைய இடைமுகங்கள்", + "info": "இயல்பாக, லோக்கல்சென்ட் கிடைக்கக்கூடிய அனைத்து பிணைய இடைமுகங்களையும் பயன்படுத்துகிறது. தேவையற்ற நெட்வொர்க்குகளை இங்கே விலக்கலாம். மாற்றங்களைப் பயன்படுத்த நீங்கள் சேவையகத்தை மறுதொடக்கம் செய்ய வேண்டும்.", + "preview": "முன்னோட்டம்", + "whitelist": "அனுமதிப்பட்டியலாளர்", + "blacklist": "தடுப்புப்பட்டியல்" + } +} diff --git a/app/assets/i18n/th.json b/app/assets/i18n/th.json new file mode 100644 index 0000000..afa52cd --- /dev/null +++ b/app/assets/i18n/th.json @@ -0,0 +1,527 @@ +{ + "locale": "ไทย", + "appName": "LocalSend", + "general": { + "accept": "ยอมรับ", + "accepted": "ยอมรับแล้ว", + "add": "เพิ่ม", + "advanced": "ขั้นสูง", + "cancel": "ยกเลิก", + "close": "ปิด", + "confirm": "ยืนยัน", + "continueStr": "ดำเนินการต่อ", + "copy": "คัดลอก", + "copiedToClipboard": "คัดลอกไปยังคลิปบอร์ดแล้ว", + "decline": "ปฏิเสธ", + "done": "เสร็จแล้ว", + "delete": "ลบ", + "edit": "แก้ไข", + "error": "ข้อผิดพลาด", + "example": "ตัวอย่าง", + "files": "ไฟล์", + "finished": "สำเร็จแล้ว", + "hide": "ซ่อน", + "off": "ปิด", + "offline": "ออฟไลน์", + "on": "เปิด", + "online": "ออนไลน์", + "open": "เปิด", + "queue": "ลำดับคิว", + "quickSave": "บันทึกด่วน", + "renamed": "เปลี่ยนชื่อแล้ว", + "reset": "เลิกทำการเปลี่ยนแปลง", + "restart": "เริ่มต้นใหม่", + "settings": "ตั้งค่า", + "skipped": "ข้ามไฟล์", + "start": "เริ่ม", + "stop": "หยุด", + "save": "บันทึก", + "unchanged": "ไม่เปลี่ยนแปลง", + "unknown": "ไม่รู้จัก", + "noItemInClipboard": "ไม่มีรายการใดในคลิปบอร์ด", + "quickSaveFromFavorites": "เซฟด่วน สำหรับ \"รายการโปรด\"" + }, + "receiveTab": { + "title": "รับ", + "infoBox": { + "ip": "ไอพี:", + "port": "พอร์ต:", + "alias": "ชื่ออุปกรณ์:" + }, + "quickSave": { + "favorites": "รายการโปรด", + "off": "บันทึกอย่างรวดเร็ว", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "ส่ง", + "selection": { + "title": "การเลือก", + "files": "ไฟล์: {files}", + "size": "ขนาด: {size}" + }, + "picker": { + "file": "ไฟล์", + "folder": "โฟลเดอร์", + "media": "มีเดีย", + "text": "ข้อความ", + "app": "แอป", + "clipboard": "วาง" + }, + "shareIntentInfo": "คุณยังสามารถใช้ฟีเจอร์ \"แชร์\" บนอุปกรณ์ของคุณเพื่อเลือกไฟล์ที่ต้องการได้อย่างง่ายดาย", + "nearbyDevices": "อุปกรณ์ที่อยู่ใกล้เคียง", + "thisDevice": "อุปกรณ์นี้", + "scan": "กำลังค้นหาอุปกรณ์ภายในเครือข่าย", + "sendMode": "โหมดการส่ง", + "sendModes": { + "single": "ผู้รับคนเดียว", + "multiple": "ผู้รับหลายคน", + "link": "แชร์ผ่านลิงก์" + }, + "sendModeHelp": "คำอธิบาย", + "help": "โปรดตรวจสอบให้แน่ใจว่าอุปกรณ์เป้าหมายเชื่อมต่ออยู่ภายในเครือข่าย WiFi เดียวกันแล้ว", + "placeItems": "วางไฟล์ที่ต้องการแชร์", + "manualSending": "ส่งด้วยตัวเอง" + }, + "settingsTab": { + "title": "การตั้งค่า", + "general": { + "title": "ทั่วไป", + "brightness": "ธีม", + "brightnessOptions": { + "system": "ตามระบบ", + "dark": "มืด", + "light": "สว่าง" + }, + "color": "สี", + "colorOptions": { + "system": "ตามระบบ", + "oled": "โอเล็ด" + }, + "language": "ภาษา", + "languageOptions": { + "system": "ตามระบบ" + }, + "saveWindowPlacement": "ออก: บันทึกตำแหน่งหน้าต่างของโปรแกรม", + "minimizeToTray": "ย่อแอปไปยัง System Tray/แถบเมนูเมื่อปิดโปรแกรม", + "launchAtStartup": "เริ่มอัตโนมัติหลังจากเข้าสู่ระบบ", + "launchMinimized": "เริ่มอัตโนมัติ: ซ่อนโปรแกรมหลังจากเริ่ม", + "showInContextMenu": "แสดง LocalSend ในเมนูคลิกขวา", + "animations": "ภาพเคลื่อนไหว", + "saveWindowPlacementWindows": "บันทึกตำแหน่งหน้าต่างหลังจากออก" + }, + "receive": { + "title": "รับ", + "quickSave": "@:general.quickSave", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "ดำเนินการให้เสร็จสิ้นโดยอัตโนมัติ", + "destination": "ปลายทาง", + "downloads": "(ดาวน์โหลด)", + "saveToGallery": "บันทึกมีเดียลงในแกลอรี่", + "saveToHistory": "บันทึกลงในประวัติย้อนหลัง", + "quickSaveFromFavorites": "บันทึกอย่างรวดเร็วจากรายการโปรด" + }, + "send": { + "title": "ส่ง", + "shareViaLinkAutoAccept": "ตอบรับคำขอในการโอนถ่ายข้อมูลจากโหมด \"แชร์ผ่านลิงก์\" โดยอัตโนมัติ" + }, + "network": { + "title": "เครือข่าย", + "needRestart": "เริ่มต้นเซิร์ฟเวอร์ใหม่อีกครั้งเพื่อปรับเปลี่ยนค่าให้เป็นไปตามที่ตั้งไว้ก่อนหน้า!", + "server": "เซิร์ฟเวอร์", + "alias": "ชื่ออุปกรณ์", + "deviceType": "ประเภทอุปกรณ์", + "deviceModel": "รุ่นอุปกรณ์", + "port": "พอร์ต", + "discoveryTimeout": "สิ้นสุดเวลาสำหรับการค้นหาอุปกรณ์ในเครือข่าย", + "portWarning": "อุปกรณ์เครื่องอื่นอาจจะไม่สามารถค้นหาอุปกรณ์เครื่องนี้เจอในเครื่อข่ายได้เนื่องจากคุณแก้ไขพอร์ตเป็นหมายเลขอื่น (default: {defaultPort})", + "encryption": "การเข้ารหัส", + "multicastGroup": "มัลติคาสต์", + "multicastGroupWarning": "อุปกรณ์เครื่องอื่นอาจจะไม่สามารถค้นหาอุปกรณ์เครื่องนี้เจอในเครื่อข่ายได้เนื่องจากคุณกำหนดที่อยู่มัลติคาสต์ใหม่ด้วยตนเอง (default: {defaultMulticast})", + "network": "เครือข่าย", + "networkOptions": { + "all": "ทั้งหมด", + "filtered": "ตัวกรอง" + }, + "useSystemName": "ใช้ชื่อในระบบ", + "generateRandomAlias": "สุ่มนามแฝง" + }, + "other": { + "title": "อื่นๆ", + "support": "สนับสนุน LocalSend", + "donate": "บริจาค", + "privacyPolicy": "นโยบายความเป็นส่วนตัว", + "termsOfUse": "ข้อกำหนดการใช้งาน" + }, + "advancedSettings": "ตั้งค่าขั้นสูง" + }, + "troubleshootPage": { + "title": "แก้ไขปัญหาเบื้องต้น", + "subTitle": "มีปัญหาเกี่ยวกับการใช้งานแอปอยู่หรือเปล่า? คุณสามารถค้นหาวิธีการแก้ปัญหาเบื้องต้นได้จากที่นี้", + "solution": "วิธีทำ:", + "fixButton": "แก้ไขให้โดยอัตโนมัติ", + "firewall": { + "symptom": "แอปนี้สามารถส่งไฟล์ข้อมูลไปยังอุปกรณ์อื่นได้ แต่อุปกรณ์อื่นไม่สามารถส่งไฟล์ข้อมูลมายังอุปกรณ์นี้ได้", + "solution": "ปัญหานี้อาจมีสาเหตุมาจากการตั้งค่าไฟร์วอลล์ คุณสามารถแก้ไขปัญหานี้ได้ด้วยการอนุญาตการเชื่อมต่อขาเข้า (UDP และ TCP) ผ่านพอร์ตหมายเลข {port}", + "openFirewall": "เปิดไฟร์วอลล์" + }, + "noDiscovery": { + "symptom": "อุปกรณ์นี้ไม่สามารถค้นหาอุปกรณ์อื่นได้", + "solution": "โปรดตรวจสอบให้แน่ใจว่าอุปกรณ์ทั้งหมดเชื่อมต่อกับเครือข่าย Wi-Fi เดียวกันและมีการตั้งค่าที่เหมือนกัน (พอร์ต, ที่อยู่ไอพีของมัลติแคสต์, การเข้ารหัส) คุณสามารถลองป้อนที่อยู่ IP ในอุปกรณ์ของคุณด้วยตนเองได้ หากได้ผล สามารถเพิ่มอุปกรณ์ดังกล่าวไปยังรายการโปรดเพื่อให้สามารถค้นพบได้โดยอัตโนมัติในครั้งถัดไป" + }, + "noConnection": { + "symptom": "อุปกรณ์สำหรับรับ-ส่งข้อมูลค้นหากันไม่เจอและไม่สามารถแชร์ไฟล์ได้", + "solution": "ปัญหานี้เกิดกับอุปกรณ์ที่จะรับและส่งข้อมูลใช่หรือไม่ ถ้าใช่ คุณจำเป็นต้องตรวจสอบให้แน่ใจว่าอุปกรณ์ทั้งสองได้เชื่อมต่อบนเครือข่ายเดียวกันและได้มีการตั้งค่าการเชื่อมต่อภายในแอปที่เหมือนกัน (ใช้หมายเลขพอร์ต, ที่อยู่มัลติคาสต์, วิธีการเข้ารหัสเดียวกัน) ทั้งนี้เครือข่ายที่คุณเชื่อมต่ออยู่อาจมีการตั้งค่าเพื่อป้องกันไม่ให้อุปกรณ์ภายในเครือข่ายสื่อสารกันได้ หากเป็นเช่นนั้น คุณจำเป็นต้องปรับการตั้งค่าของเราเตอร์ก่อนเป็นอันดับแรกเพื่อให้อุปกรณ์ในเครือข่ายสามารถสื่อสารเพื่อส่งข้อมูลได้" + } + }, + "receiveHistoryPage": { + "title": "ประวัติ", + "openFolder": "เปิดโฟลเดอร์", + "deleteHistory": "ลบประวัติ", + "empty": "ประวัติว่างเปล่า", + "entryActions": { + "open": "เปิดไฟล์", + "showInFolder": "แสดงในโฟลเดอร์", + "info": "ข้อมูล", + "deleteFromHistory": "ลบออกจากประวัติ" + } + }, + "apkPickerPage": { + "title": "แอป (APK)", + "excludeSystemApps": "ไม่แสดงแอปของระบบ", + "excludeAppsWithoutLaunchIntent": "ไม่แสดงแอปที่ไม่สามารถเปิดใช้งานได้", + "apps": "{n} แอป" + }, + "selectedFilesPage": { + "deleteAll": "ลบทั้งหมด" + }, + "receivePage": { + "subTitle": { + "one": "ต้องการส่งไฟล์ให้คุณ", + "other": "ต้องการส่งไฟล์จำนวน {n} ไฟล์ให้คุณ" + }, + "subTitleMessage": "ส่งข้อความถึงคุณ:", + "subTitleLink": "ส่งลิงค์ให้คุณ:", + "canceled": "ผู้ส่งได้ยกเลิกคำขอส่งไฟล์แล้ว" + }, + "receiveOptionsPage": { + "title": "ตัวเลือก", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(โฟลเดอร์ของ LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "ถูกปิดโดยอัตโนมัติเนื่องจากมีโฟลเดอร์" + }, + "sendPage": { + "waiting": "กำลังรอการตอบกลับ...", + "rejected": "ผู้รับได้ปฏิเสธคำขอส่งไฟล์", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "อุปกรณ์ของผู้รับกำลังประมวลผลคำขอรับ-ส่งไฟล์อื่นอยู่" + }, + "progressPage": { + "titleSending": "กำลังส่งไฟล์", + "titleReceiving": "กำลังรับไฟล์", + "savedToGallery": "บันทึกไว้ในแอปรูปถ่ายแล้ว", + "total": { + "title": { + "sending": "ความคืบหน้าทั้งหมด ({time})", + "finishedError": "ดำเนินการเสร็จสิ้นโดยมีข้อผิดพลาดเกิดขึ้น", + "canceledSender": "ถูกยกเลิกโดยผู้ส่ง", + "canceledReceiver": "ถูกยกเลิกโดยผู้รับ" + }, + "count": "ไฟล์: {curr} / {n}", + "size": "ขนาด: {curr} / {n}", + "speed": "ความเร็ว: {speed}/วิ" + } + }, + "webSharePage": { + "title": "แชร์ผ่านลิงก์", + "loading": "กำลังเริ่มเซิร์ฟเวอร์...", + "stopping": "กำลังหยุดเซิร์ฟเวอร์...", + "error": "เกิดข้อผิดพลาดขณะกำลังเริ่มเซิร์ฟเวอร์", + "openLink": { + "one": "เปิดลิงค์นี้ในเบราว์เซอร์:", + "other": "เปิดลิงก์ใดลิงก์หนึ่งในเบราว์เซอร์:" + }, + "requests": "คำขอ", + "noRequests": "ยังไม่มีคำขอ", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "ตอบรับคำขอโดยอัตโนมัติ", + "requirePin": "กรอกรหัส PIN", + "pinHint": "รหัส PIN คือ \"{pin}\"", + "encryptionHint": "LocalSend ใช้ใบรับรองอุปกรณ์จากเว็บเบราเซอร์ (self-signed certificate) คุณต้องกดยอมรับใบรับรองนี้ในเบราว์เซอร์บนอุปกรณ์ของคุณ", + "pendingRequests": "คำขอที่รอดำเนินการ: {n}" + }, + "aboutPage": { + "title": "เกี่ยวกับ LocalSend", + "description": [ + "LocalSend เป็นแอปโอเพ่นซอร์สที่คุณสามารถดาวน์โหลดมาใช้ได้ฟรีโดยไม่เสียค่าใช้จ่าย ซึ่งตัวแอปจะช่วยให้คุณสามารถแบ่งปันไฟล์และข้อความกับอุปกรณ์ใกล้เคียงได้อย่างปลอดภัยผ่านเครือข่ายท้องถิ่นที่เชื่อมต่อร่วมกันโดยไม่จำเป็นต้องเชื่อมต่ออินเทอร์เน็ต", + "แอปนี้พร้อมใช้งานบน Android, iOS, macOS, Windows และ Linux โดยคุณสามารถดาวน์โหลดแอปนี้เพื่อใช้กับระบบปฏิบัติการต่างๆ ได้ผ่านทางหน้าแรกของเว็บไซต์ทางการของเรา" + ], + "author": "ผู้เขียนโปรแกรม", + "contributors": "รายชื่อผู้มีส่วนร่วมพัฒนา", + "packagers": "ไลบรารี", + "translators": "รายชื่อนักแปล" + }, + "donationPage": { + "title": "บริจาค", + "info": "LocalSend เป็นแอปโอเพ่นซอร์สที่คุณสามารถดาวน์โหลดมาใช้ได้ฟรีโดยไม่เสียค่าใช้จ่ายหรือโฆษณาแฝง หากคุณชื่นชอบแอปนี้ คุณสามารถสนับสนุนการพัฒนาแอปได้ด้วยการบริจาคเงิน", + "donate": "บริจาคเงิน จำนวน {amount}", + "thanks": "ขอบคุณมาก!", + "restore": "เรียกคืนข้อมูลการซื้อ" + }, + "changelogPage": { + "title": "บันทึกรายการเปลี่ยนแปลง" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "ภาษาอื่นอาจมีคำที่แตกต่างกันออกไป อาจจะไม่ตรงกันแบบ 1:1", + "adjectives": [ + "น่ารัก", + "สวย", + "ใหญ่", + "สว่าง", + "ทำความสะอาด", + "ฉลาด", + "เย็น", + "น่ารัก", + "ฉลาดแกมโกง", + "มุ่งมั่น", + "กระฉับกระเฉง", + "มีประสิทธิภาพ", + "มหัศจรรย์", + "เร็ว", + "ดี", + "สด", + "ดี", + "งดงาม", + "ยอดเยี่ยม", + "หล่อ", + "ร้อน", + "ใจดี", + "น่ารัก", + "มิสติก", + "ประณีต", + "ดี", + "อดทน", + "สวย", + "ทรงพลัง", + "รวย", + "ความลับ", + "ปราดเปรื่อง", + "แข็ง", + "พิเศษ", + "เชิงกลยุทธ์", + "แข็งแกร่ง", + "เรียบร้อย", + "ฉลาด" + ], + "fruits": [ + "แอปเปิล", + "อาโวคาโด", + "กล้วย", + "แบล็คเบอร์รี่", + "บลูเบอร์รี่", + "บร็อคโคลี", + "แครอท", + "เชอร์รี่", + "มะพร้าว", + "องุ่น", + "มะนาว", + "ผักกาดหอม", + "มะม่วง", + "แตงโม", + "เห็ด", + "หัวหอม", + "ส้ม", + "มะละกอ", + "ลูกพีช", + "ลูกแพร์", + "สัปปะรด", + "มันฝรั่ง", + "ฟักทอง", + "ราสเบอร์รี่", + "สตรอเบอร์รี่", + "มะเขือเทศ" + ], + "combination": "{fruit} {adjective}", + "@combination": "ในบางภาษา คำคุณศัพท์จะต้องอยู่ท้ายสุด" + }, + "dialogs": { + "addFile": { + "title": "เพิ่มไปยังส่วนที่เลือกไว้", + "content": "คุณต้องการจะเพิ่มไฟล์ใด?" + }, + "addressInput": { + "title": "กรอกที่อยู่", + "hashtag": "แฮชแท็ก", + "ip": "ที่อยู่ไอพี", + "recentlyUsed": "ใช้งานล่าสุดเมื่อ: " + }, + "cancelSession": { + "title": "ยกเลิกการโอนไฟล์", + "content": "คุณต้องการยกเลิกการโอนไฟล์หรือไม่?" + }, + "cannotOpenFile": { + "title": "ไม่สามารถเปิดไฟล์ได้", + "content": "ไม่สามารถเปิดไฟล์ \"{file}\" ได้ โปรดตรวจสอบว่าไฟล์นี้ได้ถูกย้าย เปลี่ยนชื่อ หรือถูกลบไปแล้วหรือไม่" + }, + "encryptionDisabledNotice": { + "title": "ปิดใช้งานการเข้ารหัสอยู่", + "content": "การส่งข้อมูลที่เกิดขึ้นต่อจากนี้จะเป็นการส่งข้อมูลผ่านโปรโตคอล HTTP ที่ไม่ได้รับการเข้ารหัส หากต้องการส่งข้อมูลผ่านโปรโตคอล HTTPS คุณจำเป็นต้องเปิดใช้งานการเข้ารหัสอีกครั้ง" + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "รายการโปรด", + "noFavorites": "ยังไม่มีอุปกรณ์ในรายการโปรด", + "addFavorite": "เพิ่มอุปกรณ์" + }, + "favoriteDeleteDialog": { + "title": "ลบจากรายการโปรด", + "content": "คุณต้องการลบอุปกรณ์ \"{name}\" ออกจากรายการโปรดหรือไม่?" + }, + "favoriteEditDialog": { + "titleAdd": "เพิ่มในรายการโปรด", + "titleEdit": "ปรับแต่ง", + "name": "ชื่ออุปกรณ์", + "auto": "(ตั้งให้อัตโนมัติ)", + "ip": "ที่อยู่ IP", + "port": "พอร์ต" + }, + "fileInfo": { + "title": "ข้อมูลไฟล์", + "fileName": "ชื่อไฟล์:", + "path": "ที่อยู่ไฟล์บนเครื่อง:", + "size": "ขนาด:", + "sender": "ผู้ส่ง:", + "time": "เวลา:" + }, + "fileNameInput": { + "title": "กรอกชื่อไฟล์", + "original": "ชื่อไฟล์เดิม: {original}" + }, + "historyClearDialog": { + "title": "ล้างประวัติ", + "content": "คุณต้องการลบประวัติทั้งหมดหรือไม่?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend ไม่สามารถค้นหาอุปกรณ์อื่นได้หากคุณไม่ให้สิทธิ์การสแกนเครือข่ายที่อุปกรณ์นี้กำลังเชื่อมต่ออยู่ โปรดอนุญาตให้สิทธิ์ในการสแกนนี้ในหน้าการตั้งค่า", + "gotoSettings": "การตั้งค่า" + }, + "messageInput": { + "title": "พิมพ์ข้อความ", + "multiline": "หลายบรรทัด" + }, + "noFiles": { + "title": "ไม่ได้เลือกไฟล์", + "content": "กรุณาเลือกไฟล์อย่างน้อยหนึ่งไฟล์" + }, + "noPermission": { + "title": "ไม่มีสิทธิ์", + "content": "คุณยังไม่ได้ให้สิทธิ์ที่จำเป็น โปรดให้สิทธิ์เหล่านั้นในการตั้งค่า" + }, + "notAvailableOnPlatform": { + "title": "ไม่พร้อมใช้งาน", + "content": "ฟีเจอร์นี้ใช้งานได้เฉพาะบน:" + }, + "qr": { + "title": "คิวอาร์โค้ด" + }, + "quickActions": { + "title": "การดำเนินการอย่างรวดเร็ว", + "counter": "ตัวนับ", + "prefix": "คำนำหน้า", + "padZero": "เติมศูนย์ด้านหน้า", + "sortBeforeCount": "เรียงตามตัวอักษรไว้ก่อนหน้า", + "random": "สุ่ม" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "การตอบรับคำขอรับไฟล์จากอุปกรณ์อื่นจะเป็นไปโดยอัตโนมัติ โปรดทราบว่าทุกคนในเครือข่ายที่อุปกรณ์นี้เชื่อมต่ออยู่จะสามารถส่งไฟล์ถึงคุณได้" + }, + "pin": { + "title": "กรอกรหัส PIN" + }, + "sendModeHelp": { + "title": "โหมดส่งไฟล์", + "single": "ส่งไฟล์ไปยังผู้รับเพียงอุปกรณ์เดียว ไฟล์ที่เลือกไว้จะถูกล้างออกจากรายการทันทีที่โอนไฟล์สำเร็จ", + "multiple": "ส่งไฟล์ไปยังผู้รับหลายอุปกรณ์ ไฟล์ที่เลือกไว้จะไม่ถูกล้างออกจากรายการ", + "link": "ผู้รับที่ไม่ได้ติดตั้งแอป LocalSend สามารถดาวน์โหลดไฟล์ที่เลือกไว้ในรายการได้โดยการเปิดลิงก์ในเบราว์เซอร์" + }, + "zoom": { + "title": "URL" + }, + "quickSaveFromFavoritesNotice": { + "content": [ + "คำขอไฟล์ได้รับการยอมรับโดยอัตโนมัติจากอุปกรณ์ในรายการโปรดของคุณแล้ว", + "คำเตือน! ในขณะนี้ระบบยังไม่ปลอดภัยอย่างสมบูรณ์ เนื่องจากแฮกเกอร์ที่มีลายนิ้วมือดิจิทัลของอุปกรณ์ใดๆ จากรายการโปรดของคุณสามารถส่งไฟล์ถึงคุณได้โดยไม่มีข้อจำกัด", + "อย่างไรก็ตาม ตัวเลือกนี้ยังปลอดภัยกว่าการอนุญาตให้ผู้ใช้ทั้งหมดบนเครือข่ายท้องถิ่นส่งไฟล์ถึงคุณโดยไม่มีข้อจำกัด" + ], + "title": "บันทึกอย่างรวดเร็วจากรายการโปรด" + }, + "openFile": { + "title": "เปิดไฟล์", + "content": "ต้องการเปิดไฟล์ที่ได้รับหรือไม่?" + } + }, + "sanitization": { + "empty": "ชื่อไฟล์ไม่สามารถปล่อยเว้นว่างไว้ได้", + "invalid": "ชื่อไฟล์ประกอบไปด้วยอักขระที่ไม่รองรับ" + }, + "tray": { + "@info": "หลักเกณฑ์ของ Apple นั้นเข้มงวดมากเกี่ยวกับคำว่า 'ปิด' แอป", + "open": "@:general.open", + "close": "ออกจากแอป LocalSend", + "closeWindows": "ออก" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "กรอกรหัส PIN", + "invalidPin": "รหัส PIN ไม่ถูกต้อง", + "tooManyAttempts": "ป้อนรหัสผิดหลายครั้ง", + "rejected": "ถูกปฏิเสธ", + "files": "ไฟล์", + "fileName": "ชื่อไฟล์", + "size": "ขนาด" + }, + "assetPicker": { + "@info": "การแปลสำหรับเครื่องมือเลือกสื่อสำหรับ Android และ iPhone", + "confirm": "ยืนยัน", + "cancel": "ยกเลิก", + "edit": "แก้ไข", + "gifIndicator": "GIF", + "loadFailed": "โหลดล้มเหลว", + "original": "ต้นฉบับ", + "preview": "ตัวอย่าง", + "select": "เลือก", + "emptyList": "รายการว่างเปล่า", + "unSupportedAssetType": "ประเภทไฟล์ที่ไม่รองรับ", + "unableToAccessAll": "ไม่สามารถเข้าถึงไฟล์ทั้งหมดบนอุปกรณ์ได้", + "viewingLimitedAssetsTip": "เลือกดูเฉพาะไฟล์และอัลบั้มที่แอปสามารถเข้าถึงได้", + "changeAccessibleLimitedAssets": "คลิกเพื่ออัปเดตไฟล์ที่แอปจะเข้าถึงได้", + "accessAllTip": "แอปสามารถเข้าถึงไฟล์ที่อยู่ในอุปกรณ์ของคุณได้เพียงบางไฟล์เท่านั้น คุณต้องไปที่การตั้งค่าระบบและอนุญาตให้แอปสามารถเข้าถึงสื่อมีเดียทั้งหมดที่อยู่ในอุปกรณ์ก่อน", + "goToSystemSettings": "ไปที่การตั้งค่าระบบ", + "accessLimitedAssets": "ดำเนินการต่อด้วยการเข้าถึงแบบจำกัด", + "accessiblePathName": "ไฟล์ที่เข้าถึงได้", + "sTypeAudioLabel": "เสียง", + "sTypeImageLabel": "รูปภาพ", + "sTypeVideoLabel": "วิดีโอ", + "sTypeOtherLabel": "สื่ออื่นๆ", + "sActionPlayHint": "เล่น", + "sActionPreviewHint": "ดูตัวอย่าง", + "sActionSelectHint": "เลือก", + "sActionSwitchPathLabel": "เปลี่ยนที่เก็บไฟล์", + "sActionUseCameraHint": "ใช้กล้อง", + "sNameDurationLabel": "ความยาว", + "sUnitAssetCountLabel": "จำนวน" + }, + "networkInterfacesPage": { + "title": "อินเทอร์เฟซเครือข่าย", + "info": "ตามค่าเริ่มต้น LocalSend จะใช้อินเทอร์เฟซเครือข่ายที่มีอยู่ทั้งหมด คุณสามารถยกเว้นเครือข่ายที่ไม่ต้องการได้ที่นี่ คุณต้องรีสตาร์ทเซิร์ฟเวอร์เพื่อใช้การเปลี่ยนแปลง", + "whitelist": "ไวท์ลิสต์", + "blacklist": "บัญชีดำ", + "preview": "ดูตัวอย่าง" + } +} diff --git a/app/assets/i18n/tr.json b/app/assets/i18n/tr.json new file mode 100644 index 0000000..fe9bec4 --- /dev/null +++ b/app/assets/i18n/tr.json @@ -0,0 +1,465 @@ +{ + "locale": "Türkçe", + "appName": "LocalSend", + "general": { + "accept": "Kabul et", + "accepted": "Kabul edildi", + "add": "Ekle", + "advanced": "Gelişmiş", + "cancel": "İptal et", + "close": "Kapat", + "confirm": "Onayla", + "continueStr": "Devam et", + "copy": "Kopyala", + "copiedToClipboard": "Panoya kopyalandı", + "decline": "Reddet", + "done": "Bitir", + "delete": "Sil", + "edit": "Düzenle", + "error": "Hata", + "example": "Örnek", + "files": "Dosyalar", + "finished": "Sonlandırıldı", + "hide": "Gizle", + "off": "Kapalı", + "offline": "Çevrim dışı", + "on": "Açık", + "online": "Çevrim içi", + "open": "Aç", + "queue": "Sıra", + "quickSave": "Hızlı kaydetme", + "quickSaveFromFavorites": "Favoriler", + "renamed": "Yeniden adlandırıldı", + "reset": "Sıfırla", + "restart": "Yeniden başlat", + "settings": "Ayarlar", + "skipped": "Geçildi", + "start": "Başlat", + "stop": "Durdur", + "save": "Kaydet", + "unchanged": "Değiştirilmemiş", + "unknown": "Bilinmiyor", + "noItemInClipboard": "Panoda öğe yok." + }, + "receiveTab": { + "title": "Alım", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Takma isminiz:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Favoriler", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Gönder", + "selection": { + "title": "Seçiminiz", + "files": "Dosyalar: {files}", + "size": "Boyut: {size}" + }, + "picker": { + "file": "Dosya", + "folder": "Klasör", + "media": "Medya", + "text": "Metin", + "app": "Uygulama", + "clipboard": "Yapıştır" + }, + "shareIntentInfo": "Dosyalarınızı daha kolay seçmek için cihazınızın \"Paylaş\" özelliğini kullanabilirsiniz.", + "nearbyDevices": "Yakınınızdaki cihazlar", + "thisDevice": "Cihazınız", + "scan": "Cihazları tara", + "manualSending": "Manuel Gönderme", + "sendMode": "Gönderme Modu", + "sendModes": { + "single": "Tek alıcı", + "multiple": "Birden fazla alıcı", + "link": "Link üzerinden paylaşın" + }, + "sendModeHelp": "Açıklama", + "help": "Lütfen hedef cihaz ile aynı wifi ağında olduğunuzdan emin olun.", + "placeItems": "Paylaşmak istediğiniz dosyayı yerleştiriniz." + }, + "settingsTab": { + "title": "Ayarlar", + "general": { + "title": "Genel", + "brightness": "Tema", + "brightnessOptions": { + "system": "Sistem teması", + "dark": "Koyu", + "light": "Açık" + }, + "color": "Renk", + "colorOptions": { + "system": "Sistem", + "oled": "OLED" + }, + "language": "Dil", + "languageOptions": { + "system": "Sistem dili" + }, + "saveWindowPlacement": "Çıkış: Burayı Kaydet", + "saveWindowPlacementWindows": "Çıkıştan sonra pencere konumunu kaydet", + "minimizeToTray": "Çıkış: Simge durumuna küçült", + "launchAtStartup": "Giriş yapıldıktan sonra otomatik başlat", + "launchMinimized": "Otomatik başlatma: Gizli Başlatma", + "showInContextMenu": "LocalSend'i bağlam menüsünde göster", + "animations": "Animasyonlar" + }, + "receive": { + "title": "Alım", + "quickSave": "@:general.quickSave", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Otomatik bitir", + "destination": "Hedef klasör", + "downloads": "(İndirilenler)", + "saveToGallery": "Medyayı galeriye kaydet", + "saveToHistory": "Geçmişe kaydet", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites" + }, + "send": { + "title": "Gönder", + "shareViaLinkAutoAccept": "Link aracılığıyla paylaş: Otomatik olarak kabul et" + }, + "network": { + "title": "Ağ", + "needRestart": "Ayarları uygulamak için sunucuyu yeniden başlatınız!", + "server": "Sunucu", + "alias": "Takma isminiz", + "deviceType": "Cihaz tipi", + "deviceModel": "Cihaz modeli", + "port": "Port", + "discoveryTimeout": "Arama zaman aşımına uğradı", + "portWarning": "Kişiselleştirilmiş bir port kullanıyorsanız ağınızdaki diğer cihazlar tarafından bulunamayabilirsiniz. (varsayılan: {defaultPort})", + "encryption": "Şifreleme", + "multicastGroup": "Çoklu yayın", + "multicastGroupWarning": "Özel çoklu yayın adresini kullandığınız için diğer cihazlar tarafından algılanamayabilirsiniz.(varsayılan: {defaultMulticast})", + "network": "Ağ", + "networkOptions": { + "all": "Tümü", + "filtered": "Filtrelenmiş" + }, + "useSystemName": "Sistem adını kullan", + "generateRandomAlias": "Rastgele takma ad oluştur" + }, + "other": { + "title": "Diğer", + "support": "LocalSend'i destekle", + "donate": "Bağış yap", + "privacyPolicy": "Gizlilik politikası", + "termsOfUse": "Kullanım koşulları" + }, + "advancedSettings": "Gelişmiş ayarlar" + }, + "troubleshootPage": { + "title": "Sorun Giderme", + "subTitle": "Bu uygulama beklendiği gibi çalışmıyor mu? Burada ortak çözümler bulabilirsiniz.", + "solution": "Çözüm:", + "fixButton": "Otomatik olarak düzelt", + "firewall": { + "symptom": "Bu uygulama diğer cihazlara dosya gönderebilir, ancak diğer cihazlar bu cihaza dosya gönderemez.", + "solution": "Bu büyük olasılıkla bir güvenlik duvarı sorunudur. Port {port} 'da gelen bağlantılara (UDP ve TCP) izin vererek bunu çözebilirsiniz.", + "openFirewall": "Güvenlik Duvarını Aç" + }, + "noDiscovery": { + "symptom": "Bu cihaz diğer cihazları keşfedemez.", + "solution": "Lütfen tüm cihazların aynı Wi-Fi ağında olduğundan ve aynı yapılandırmayı (bağlantı noktası, çok noktaya yayın adresi, şifreleme) paylaştığından emin olun. Hedef cihazın IP adresini manuel olarak yazmayı deneyebilirsiniz. Bu işe yararsa, gelecekte otomatik olarak keşfedilebilmesi için bu cihazı favorilere eklemeyi düşünün." + }, + "noConnection": { + "symptom": "Her iki cihaz da birbirini keşfedemez ve dosya paylaşamazlar.", + "solution": "Sorun her iki tarafta da var mı? O zaman her iki cihazın da aynı WiFi ağında olduğundan ve aynı yapılandırmayı (bağlantı noktası, çoklu yayın adresi, şifreleme) paylaştığından emin olmanız gerekir. WiFi, katılımcılar arasında iletişime izin vermeyebilir. Bu durumda, bu seçenek yönlendiricide etkinleştirilmelidir." + } + }, + "receiveHistoryPage": { + "title": "Geçmiş", + "openFolder": "Dosyayı aç", + "deleteHistory": "Geçmişi sil", + "empty": "Geçmiş yok.", + "entryActions": { + "open": "Dosya aç", + "showInFolder": "Klasörde göster", + "info": "Bilgi", + "deleteFromHistory": "Geçmişten sil" + } + }, + "apkPickerPage": { + "title": "Uygulamalar (APK)", + "excludeSystemApps": "Sistem uygulamalarını hariç tut", + "excludeAppsWithoutLaunchIntent": "Başlatılamayan uygulamaları hariç tut", + "apps": "{n} Uygulamalar" + }, + "selectedFilesPage": { + "deleteAll": "Hepsini sil" + }, + "receivePage": { + "subTitle": { + "one": "sana bir dosya göndermek istiyor", + "other": "sana {n} tane dosya göndermek istiyor" + }, + "subTitleMessage": "bir mesaj gönderdi:", + "subTitleLink": "bir bağlantı gönderdi:", + "canceled": "Gönderici isteği iptal etti." + }, + "receiveOptionsPage": { + "title": "Seçenekler", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend klasörü)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Otomatik olarak kapanır çünkü bunlar klasör." + }, + "sendPage": { + "waiting": "Alıcıdan cevap bekleniyor…", + "rejected": "Alıcı isteği reddetti.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Alıcı başka bir istekle meşgul." + }, + "progressPage": { + "titleSending": "Dosyalar gönderiliyor", + "titleReceiving": "Dosyalar alınıyor", + "savedToGallery": "Galeriye kaydedildi", + "total": { + "title": { + "sending": "Toplam ilerleme ({time})", + "finishedError": "İşlem hatayla sonuçlandı", + "canceledSender": "Gönderici tarafından iptal edildi", + "canceledReceiver": "Alıcı tarafından iptal edildi" + }, + "count": "Dosyalar: {curr} / {n}", + "size": "Boyut: {curr} / {n}", + "speed": "Hız: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "@days": "Günler için 'g', saatler için 's' ve dakikalar için 'd' kullanın", + "@hours": "Saat kısaltması için 's', dakika kısaltması için 'd' kullanın", + "minutes": "{n}:{ss}", + "hours": "{h}s {m}d", + "days": "{d}g {h}s {m}d" + } + }, + "webSharePage": { + "title": "Link üzerinden paylaşın", + "loading": "Sunucu başlıyor…", + "stopping": "Sunucu durduruluyor…", + "error": "Sunucuyu başlatırken bir hata oluştu.", + "openLink": { + "one": "Bu bağlantıyı tarayıcıda açın:", + "other": "Bu bağlantılardan birini tarayıcıda açın:" + }, + "requests": "İstekler", + "noRequests": "Henüz istek yok.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "İstekleri otomatik olarak kabul et", + "requirePin": "PIN gerektir", + "pinHint": "PIN \"{pin}\"", + "encryptionHint": "LocalSend, tarayıcıda kabul etmeniz gereken kendi-üretimli bir sertifika kullanır.", + "pendingRequests": "Bekleyen istekler: {n}" + }, + "aboutPage": { + "title": "LocalSend hakkında", + "description": [ + "LocalSend, internet bağlantısına ihtiyaç duymadan yerel ağınız üzerinden yakınınızdaki cihazlarla dosya ve mesajlarınızı güvenli bir şekilde paylaşmanıza olanak tanıyan özgür ve açık kaynaklı bir uygulamadır.", + "Bu uygulama Android, iOS, macOS, Windows ve Linux'ta mevcuttur. Tüm indirme seçeneklerini resmi ana sayfada bulabilirsiniz." + ], + "author": "Yazar", + "contributors": "Katkıda bulunanlar", + "packagers": "Paketleyiciler", + "translators": "Çevirmenler" + }, + "donationPage": { + "title": "Bağış yap", + "info": "LocalSend ücretsiz, açık kaynaklı ve reklamsız bir uygulamadır. Eğer uygulamayı beğendiyseniz, bağış yaparak uygulamanın gelişimine katkıda bulunabilirsiniz.", + "donate": "Bağışta bulun {amount}", + "thanks": "Çok teşekkür ederim!", + "restore": "Satın alınanları geri yükle" + }, + "changelogPage": { + "title": "Değişiklik günlüğü" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "Seçime ekle", + "content": "Ne eklemek istiyorsunuz ?" + }, + "addressInput": { + "title": "Adresi giriniz", + "hashtag": "Hashtag", + "ip": "IP adresi", + "recentlyUsed": "Daha önce kullanılmış: " + }, + "cancelSession": { + "title": "Dosya transferini iptal et", + "content": "Gerçekten dosya transferini iptal etmek istiyor musunuz?" + }, + "cannotOpenFile": { + "title": "Dosya açılamadı", + "content": "\"{file}\" dosyası açılamadı. Dosya taşınmış, silinmiş veya ismi değiştirilmiş olabilir mi?" + }, + "encryptionDisabledNotice": { + "title": "Şifreleme devre dışı bırakıldı", + "content": "Artık iletişim şifrelenmemiş HTTP protokolü aracılığıyla gerçekleşiyor. HTTPS protokolünü kullanmak için şifrelemeyi yeniden aktif edin." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Favoriler", + "noFavorites": "Henüz favori cihaz yok.", + "addFavorite": "Ekle" + }, + "favoriteDeleteDialog": { + "title": "Favorilerden sil", + "content": "Favorilerden \"{name}\" öğesini gerçekten silmek istiyor musunuz?" + }, + "favoriteEditDialog": { + "titleAdd": "Favorilere ekle", + "titleEdit": "Düzenle", + "name": "Takma ad", + "auto": "(otomatik)", + "ip": "IP Adresi", + "port": "Port" + }, + "fileInfo": { + "title": "Dosya bilgileri", + "fileName": "Dosya adı:", + "path": "Yolu:", + "size": "Boyutu:", + "sender": "Gönderen:", + "time": "Zaman:" + }, + "fileNameInput": { + "title": "Dosya adını giriniz", + "original": "Orijinal: {original}" + }, + "historyClearDialog": { + "title": "Geçmişi temizle", + "content": "Gerçekten tüm geçmişi silmek istiyor musunuz?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend, lokal ağı tarama iznine sahip olmadan başka cihazları bulamıyor. Lütfen bu izni ayarlarda verin.", + "gotoSettings": "Ayarlar" + }, + "messageInput": { + "title": "Mesaj yazınız", + "multiline": "Çok satırlı mesaj" + }, + "noFiles": { + "title": "Herhangi bir dosya seçilmedi", + "content": "Lütfen bir dosya seçiniz." + }, + "noPermission": { + "title": "İzin yok", + "content": "Gerekli izinleri vermediniz. Lütfen ayarlardan izinleri verin." + }, + "notAvailableOnPlatform": { + "title": "Müsait değil", + "content": "Bu özellik yalnızca şurada mevcuttur:" + }, + "qr": { + "title": "QR Kod" + }, + "quickActions": { + "title": "Hızlı eylemler", + "counter": "Sayaç", + "prefix": "Ön ek", + "padZero": "Sıfırlar ile doldurun", + "sortBeforeCount": "Önceden alfabetik olarak sırala", + "random": "Rastgele" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Dosya gönderim istekleri otomatik olarak gerçekleşir. Yerel ağınızdaki herkesin size dosya gönderebileceğinin farkında olunuz." + }, + "pin": { + "title": "PIN girin" + }, + "sendModeHelp": { + "title": "Gönderme Modu", + "single": "Dosyaları bir alıcıya gönderir. Seçim, bitmiş dosya aktarımından sonra temizlenir.", + "multiple": "Dosyaları birden çok alıcıya gönderir. Seçim temizlenmeyecektir.", + "link": "LocalSend yüklü olmayan alıcılar, tarayıcılarındaki bağlantıyı açarak seçilen dosyaları indirebilir." + }, + "zoom": { + "title": "URL" + }, + "openFile": { + "title": "Dosya Aç", + "content": "Alınan dosyayı açmak istiyor musunuz?" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Favoriler listenizdeki cihazların paylaşım istekleri otomatik olarak kabul edilecektir.", + "Uyarı! Şu an, bu tamamen güvenli değildir çünkü favoriler listenizdeki herhangi bir cihazın parmak izine sahip olan hackerlar sınırlama olmadan size dosyalar gönderebilir.", + "Ancak, bu seçenek yinede ağdaki tüm kullanıcıların size sınırlandırma olmadan dosya göndermesine izin vermekten daha güvenlidir." + ] + } + }, + "sanitization": { + "empty": "Dosya ismi boş olamaz", + "invalid": "Dosya ismi geçersiz karakter bulunduruyor" + }, + "tray": { + "@info": "Apple'ın yönergeleri, 'kapat' ifadesi konusunda çok katıdır.", + "open": "@:general.open", + "close": "LocalSend'den çık", + "closeWindows": "Çıkış" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "PIN girin", + "invalidPin": "Geçersiz PIN", + "tooManyAttempts": "Çok fazla deneme", + "rejected": "Reddedildi", + "files": "Dosyalar", + "fileName": "Dosya adı", + "size": "Boyut" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "Onay", + "cancel": "İptal", + "edit": "Düzenle", + "gifIndicator": "GIF", + "loadFailed": "Yükleme başarısız", + "original": "Orijinal", + "preview": "Ön izleme", + "select": "Seç", + "emptyList": "Boş liste", + "unSupportedAssetType": "Desteklenmeyen dosya türü.", + "unableToAccessAll": "Cihazdaki tüm dosyalara erişilemiyor", + "viewingLimitedAssetsTip": "Yalnızca uygulamanın erişilebilir dosyalarını ve albümlerini görüntüleyin.", + "changeAccessibleLimitedAssets": "Erişilebilir dosyaları güncellemek için tıklayın", + "accessAllTip": "Uygulama yalnızca cihazdaki bazı dosyalara erişebilir. Sistem ayarlarına gidin ve uygulamanın cihazdaki tüm medyalara erişmesine izin verin.", + "goToSystemSettings": "Sistem ayarlarına gidin", + "accessLimitedAssets": "Sınırlı Erişimle Devam Et", + "accessiblePathName": "Erişilebilir dosyalar", + "sTypeAudioLabel": "Ses", + "sTypeImageLabel": "Görüntü", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Diğer medya", + "sActionPlayHint": "oynat", + "sActionPreviewHint": "Ön izleme", + "sActionSelectHint": "seç", + "sActionSwitchPathLabel": "dosya uzantısını değiştir", + "sActionUseCameraHint": "Kamera kullan", + "sNameDurationLabel": "süre", + "sUnitAssetCountLabel": "sayım" + }, + "networkInterfacesPage": { + "title": "Ağ Arayüzleri", + "preview": "Önizle", + "whitelist": "Beyaz liste", + "blacklist": "Kara liste", + "info": "Varsayılan olarak, LocalSend mevcut olan tüm ağları kullanır. Burada istenmeyen ağları engelleyebilirsiniz. Değişikliklerin uygulanması için sunucuyu yeniden başlatmanız gerekir." + } +} diff --git a/app/assets/i18n/uk.json b/app/assets/i18n/uk.json new file mode 100644 index 0000000..29d8c3b --- /dev/null +++ b/app/assets/i18n/uk.json @@ -0,0 +1,465 @@ +{ + "locale": "Українська", + "appName": "LocalSend", + "general": { + "accept": "Прийняти", + "accepted": "Прийнято", + "add": "Додати", + "advanced": "Детальніше", + "cancel": "Скасувати", + "close": "Закрити", + "confirm": "Підтвердити", + "continueStr": "Продовжити", + "copy": "Копіювати", + "copiedToClipboard": "Скопійовано в буфер обміну", + "decline": "Відхилити", + "done": "Виконано", + "delete": "Видалити", + "edit": "Редагувати", + "error": "Помилка", + "example": "Приклад", + "files": "Файли", + "finished": "Завершено", + "hide": "Приховати", + "off": "Вимкнено", + "offline": "Не в мережі", + "on": "Увімкнено", + "online": "У мережі", + "open": "Відкрити", + "queue": "Черга", + "quickSave": "Швидке збереження", + "quickSaveFromFavorites": "Швидке збереження для «Улюблених»", + "renamed": "Перейменовано", + "reset": "Скасувати зміни", + "restart": "Перезапустити", + "settings": "Налаштування", + "skipped": "Відхилено", + "start": "Запустити", + "stop": "Зупинити", + "save": "Зберегти", + "unchanged": "Без змін", + "unknown": "Невідомо", + "noItemInClipboard": "Буфер обміну порожній." + }, + "receiveTab": { + "title": "Отримати", + "infoBox": { + "ip": "IP:", + "port": "Порт:", + "alias": "Ім'я пристрою:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Улюблені", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Надіслати", + "selection": { + "title": "Вибірка", + "files": "Файлів: {files}", + "size": "Розмір: {size}" + }, + "picker": { + "file": "Файл", + "folder": "Папка", + "media": "Медіа", + "text": "Текст", + "app": "Програма", + "clipboard": "Вставити" + }, + "shareIntentInfo": "Ви також можете скористатися функцією «Поділитися» на своєму мобільному пристрої, щоб швидше вибирати файли.", + "nearbyDevices": "Пристрої поблизу", + "thisDevice": "Цей пристрій", + "scan": "Пошук пристроїв", + "manualSending": "Ручне надсилання", + "sendMode": "Режим надсилання", + "sendModes": { + "single": "Один отримувач", + "multiple": "Декілька отримувачів", + "link": "Поділитися через посилання" + }, + "sendModeHelp": "Довідка", + "help": "Будь ласка, переконайтеся, що отримувач перебуває в тій же ж Wi-Fi мережі, що й відправник.", + "placeItems": "Додайте файли, щоб поділитися." + }, + "settingsTab": { + "title": "Налаштування", + "general": { + "title": "Загальні", + "brightness": "Тема", + "brightnessOptions": { + "system": "Системна", + "dark": "Темна", + "light": "Світла" + }, + "color": "Колір", + "colorOptions": { + "system": "Системний", + "oled": "OLED" + }, + "language": "Мова", + "languageOptions": { + "system": "Системна" + }, + "saveWindowPlacement": "Зберігати розташування вікна після виходу", + "saveWindowPlacementWindows": "Зберігати розташування вікна після виходу", + "minimizeToTray": "Згортати в системний трей/смугу меню при закритті", + "launchAtStartup": "Автозапуск", + "launchMinimized": "Прихований автозапуск", + "showInContextMenu": "Відображати LocalSend в контекстному меню", + "animations": "Анімації" + }, + "receive": { + "title": "Отримання", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Автозавершення", + "destination": "Зберігати в папку", + "downloads": "(Завантаження)", + "saveToGallery": "Зберігати медіафайли в галерею", + "saveToHistory": "Зберігати історію" + }, + "send": { + "title": "Надсилання", + "shareViaLinkAutoAccept": "Автоматично приймати запити в режимі «Поділитися через посилання»" + }, + "network": { + "title": "Мережа", + "needRestart": "Для застосування змін необхідно перезапустити сервер!", + "server": "Сервер", + "alias": "Назва пристрою", + "deviceType": "Тип пристрою", + "deviceModel": "Модель пристрою", + "port": "Порт", + "discoveryTimeout": "Час пошуку вийшов", + "useSystemName": "Використати системну назву", + "generateRandomAlias": "Згенерувати випадковий псевдонім", + "portWarning": "Інші пристрої можуть вас не знайти, оскільки ви використовуєте інший, власний порт. (default: {defaultPort})", + "encryption": "Шифрування", + "multicastGroup": "Адреса групової передачі", + "multicastGroupWarning": "Інші пристрої можуть вас не знайти, оскільки ви використовуєте іншу, власну адресу групової передачі. (default: {defaultMulticast})", + "network": "Мережа", + "networkOptions": { + "all": "Все", + "filtered": "Фільтроване" + } + }, + "other": { + "title": "Інше", + "support": "Підтримати LocalSend", + "donate": "Пожертвувати", + "privacyPolicy": "Політика конфіденційності", + "termsOfUse": "Умови використання" + }, + "advancedSettings": "Розширені налаштування" + }, + "troubleshootPage": { + "title": "Усунення несправностей", + "subTitle": "Програма не працює належним чином? Тут ви можете знайти деякі поширені рішення проблем.", + "solution": "Рішення:", + "fixButton": "Виправити автоматично", + "firewall": { + "symptom": "Цей пристрій може надсилати файли на інші пристрої, але інші пристрої не можуть надсилати файли на цей пристрій.", + "solution": "Швидше за все, це проблема брандмауера. Ви можете вирішити дану проблему, дозволивши вхідні з'єднання (UDP та TCP) для порта: {port}.", + "openFirewall": "Відкрити брандмауер" + }, + "noDiscovery": { + "symptom": "Цей пристрій не може знайти інші пристрої.", + "solution": "Будь ласка, переконайтеся, що обидва пристрої знаходяться в одній Wi-Fi мережі та мають однакову конфігурацію (порт, адресу групової передачі, шифрування). Ви можете спробувати ввести IP-адресу цільового пристрою вручну. Якщо це спрацює, подумайте про те, щоб додати цей пристрій до улюблених, щоб його можна було автоматично знаходити в майбутньому." + }, + "noConnection": { + "symptom": "Обидва пристрої не можуть знайти один одного та не можуть обмінюватися файлами.", + "solution": "Проблема існує з обох сторін? Отже, вам потрібно переконатися, що обидва пристрої знаходяться в одній Wi-Fi мережі та мають однакову конфігурацію (порт, адресу групової передачі, шифрування). Мережа Wi-Fi може не дозволяти обмін (передачу) між учасниками. У такому разі, вам потрібно увімкнути дану опцію на своєму маршрутизаторі." + } + }, + "receiveHistoryPage": { + "title": "Історія", + "openFolder": "Відкрити папку", + "deleteHistory": "Видалити історію", + "empty": "Історія порожня.", + "entryActions": { + "open": "Відкрити файл", + "showInFolder": "Показати в папці", + "info": "Інформація", + "deleteFromHistory": "Видалити з історії" + } + }, + "apkPickerPage": { + "title": "Програми (APK)", + "excludeSystemApps": "Виключити системні програми", + "excludeAppsWithoutLaunchIntent": "Виключити програми, що не запускаються", + "apps": "{n} програм" + }, + "selectedFilesPage": { + "deleteAll": "Видалити все" + }, + "receivePage": { + "subTitle": { + "one": "хоче надіслати вам файл", + "other": "хоче надіслати вам {n} файли (-ів)" + }, + "subTitleMessage": "надіслав вам повідомлення:", + "subTitleLink": "надіслав вам посилання:", + "canceled": "Відправник скасував запит на передачу файлів." + }, + "receiveOptionsPage": { + "title": "Параметри отримання", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(Папка LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Вимкнено автоматично, оскільки є папки." + }, + "sendPage": { + "waiting": "Очікування відповіді…", + "rejected": "Отримувач відхилив запит.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Отримувач зайнятий іншим запитом." + }, + "progressPage": { + "titleSending": "Надсилання файлів", + "titleReceiving": "Отримання файлів", + "savedToGallery": "Збережено в галереї", + "total": { + "title": { + "sending": "Загальний час передачі ({time})", + "finishedError": "Завершено з помилкою", + "canceledSender": "Скасовано відправником", + "canceledReceiver": "Скасовано отримувачем" + }, + "count": "Файлів: {curr} / {n}", + "size": "Розмір: {curr} / {n}", + "speed": "Швидкість: {speed}/s" + }, + "remainingTime": { + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}", + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "Використовуйте «h» як скорочення для годин і «m» для хвилин", + "@days": "Використовуйте «d» для днів, «h» для годин і «m» для хвилин" + } + }, + "webSharePage": { + "title": "Поділитися через посилання", + "loading": "Запуск сервера…", + "stopping": "Зупинка сервера…", + "error": "Під час запуску сервера сталася помилка.", + "openLink": { + "one": "Відкрийте це посилання в браузері:", + "other": "Відкрийте одне з цих посилань в браузері:" + }, + "requests": "Запити", + "noRequests": "Запитів поки що немає.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Автоматично приймати запити", + "requirePin": "Вимагати PIN-код", + "pinHint": "PIN-код: «{pin}»", + "encryptionHint": "LocalSend використовує самопідписаний сертифікат. Вам потрібно прийняти його в браузері.", + "pendingRequests": "Запити, що очікують на розгляд: {n}" + }, + "aboutPage": { + "title": "Про LocalSend", + "description": [ + "LocalSend — це безплатна програма з відкритим вихідним кодом, яка дозволяє вам безпечно обмінюватися файлами та повідомленнями з пристроями поблизу через локальну мережу, без необхідності підключення до Інтернету.", + "Ця програма доступна для Android, iOS, macOS, Windows та Linux. Ви можете знайти всі варіанти завантаження на офіційній домашній сторінці." + ], + "author": "Автор", + "contributors": "Учасники", + "packagers": "Пакувальники", + "translators": "Перекладачі" + }, + "donationPage": { + "title": "Пожертвувати", + "info": "LocalSend — це безплатна програма з відкритим вихідним кодом та без реклами. Якщо вона вам подобається, ви можете підтримати її розробку пожертвою.", + "donate": "Пожертвувати {amount}", + "thanks": "Велике спасибі!", + "restore": "Відновити покупку" + }, + "changelogPage": { + "title": "Історія змін" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "У різних місцевостях можуть бути різні слова, вони можуть не збігатися 1 в 1" + }, + "dialogs": { + "addFile": { + "title": "Додати у вибірку", + "content": "Що ви хочете додати?" + }, + "openFile": { + "title": "Відкрити файл", + "content": "Хочете відкрити отриманий файл?" + }, + "addressInput": { + "title": "Введіть адресу", + "hashtag": "Хештег", + "ip": "IP-адреса", + "recentlyUsed": "Нещодавно використані: " + }, + "cancelSession": { + "title": "Скасувати надсилання файлів", + "content": "Ви справді хочете скасувати надсилання файлів?" + }, + "cannotOpenFile": { + "title": "Не вдалося відкрити файл", + "content": "Не вдалося відкрити «{file}». Можливо, цей файл було переміщено, перейменовано або видалено?" + }, + "encryptionDisabledNotice": { + "title": "Шифрування вимкнено", + "content": "Зв'язок тепер відбувається через незашифрований HTTP протокол. Щоб використовувати протокол HTTPS, знову увімкніть шифрування." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Улюблені", + "noFavorites": "Улюблених пристроїв поки що немає.", + "addFavorite": "Додати" + }, + "favoriteDeleteDialog": { + "title": "Видалити з улюблених", + "content": "Ви справді хочете видалити з улюблених «{name}»?" + }, + "favoriteEditDialog": { + "titleAdd": "Додати до улюблених", + "titleEdit": "Налаштування", + "name": "Ім'я пристрою", + "auto": "(автоматично)", + "ip": "IP-адреса", + "port": "Порт" + }, + "fileInfo": { + "title": "Інформація про файл", + "fileName": "Назва файлу:", + "path": "Шлях:", + "size": "Розмір:", + "sender": "Відправник:", + "time": "Час:" + }, + "fileNameInput": { + "title": "Введіть ім'я файлу", + "original": "Оригінальне ім'я файлу: {original}" + }, + "historyClearDialog": { + "title": "Очистити історію", + "content": "Ви справді хочете видалити всю історію?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend не може знайти інші пристрої без дозволу на сканування локальної мережі. Будь ласка, надайте цей дозвіл у налаштуваннях.", + "gotoSettings": "Налаштування" + }, + "messageInput": { + "title": "Введіть повідомлення", + "multiline": "Багаторядкове" + }, + "noFiles": { + "title": "Не вибрано жодного файлу", + "content": "Будь ласка, додайте як мінімум один файл." + }, + "noPermission": { + "title": "Немає дозволу", + "content": "Ви не надали необхідні дозволи. Будь ласка, надайте їх у налаштуваннях." + }, + "notAvailableOnPlatform": { + "title": "Недоступно", + "content": "Ця функція доступна тільки на:" + }, + "qr": { + "title": "QR-код" + }, + "quickActions": { + "title": "Швидкі дії", + "counter": "Лічильник", + "prefix": "Префікс", + "padZero": "Додати нулі на початку", + "sortBeforeCount": "Відсортувати за алфавітом (А-Я)", + "random": "Випадково" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Запити на отримання файлів відтепер приймаються автоматично. Будьте обережні, всі користувачі цієї локальної мережі можуть надсилати вам файли." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Запити на отримання файлів відтепер приймаються автоматично від пристроїв із вашого списку улюблених.", + "Попередження! Наразі, це не зовсім безпечно, оскільки хакер, який має відбиток пальця будь-якого пристрою з вашого списку улюблених, може безперешкодно надсилати вам файли.", + "Проте, цей варіант все одно безпечніший, ніж дозволити всім користувачам локальної мережі безперешкодно надсилати вам файли." + ] + }, + "pin": { + "title": "Введіть PIN-код" + }, + "sendModeHelp": { + "title": "Режими надсилання", + "single": "Надсилає файли одному отримувачу. Вибірку буде очищено після завершення передачі файлів.", + "multiple": "Надсилає файли декільком отримувачам. Вибірку не буде очищено після завершення передачі файлів.", + "link": "Отримувачі, у яких не встановлено LocalSend, можуть завантажити вибрані файли, відкривши посилання у своєму браузері." + }, + "zoom": { + "title": "URL-адреса" + } + }, + "sanitization": { + "empty": "Назва файлу не може бути порожнім", + "invalid": "Назва файлу містить недопустимі символи" + }, + "tray": { + "@info": "Керівництво Apple дуже суворо ставиться до формулювання «близький».", + "open": "@:general.open", + "close": "Вийти з LocalSend", + "closeWindows": "Вийти" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Введіть PIN-код", + "invalidPin": "Неправильний PIN-код", + "tooManyAttempts": "Забагато спроб", + "rejected": "Відхилено", + "files": "Файлів", + "fileName": "Назва файлу", + "size": "Розмір" + }, + "assetPicker": { + "@info": "Переклади для інструменту вибору медіа на Android та iPhone", + "confirm": "Підтвердити", + "cancel": "Скасувати", + "edit": "Редагувати", + "gifIndicator": "GIF", + "loadFailed": "Не вдалося завантажити", + "original": "Оригінал", + "preview": "Передперегляд", + "select": "Вибрати", + "emptyList": "Список порожній", + "unSupportedAssetType": "Непідтримуваний тип файлу.", + "unableToAccessAll": "Не вдалося отримати доступ до всіх файлів на пристрої", + "viewingLimitedAssetsTip": "Програма може переглядати тільки файли та альбоми, до яких вона має доступ.", + "changeAccessibleLimitedAssets": "Дозволити доступ до додаткових файлів", + "accessAllTip": "Програма має доступ тільки до деяких файлів на пристрої. Перейдіть до системних налаштувань та дозвольте програмі отримати доступ до всіх медіафайлів на пристрої.", + "goToSystemSettings": "Перейти до системних налаштувань", + "accessLimitedAssets": "Продовжити з обмеженим доступом", + "accessiblePathName": "Доступні файли", + "sTypeAudioLabel": "Аудіо", + "sTypeImageLabel": "Зображення", + "sTypeVideoLabel": "Відео", + "sTypeOtherLabel": "Інші медіафайли", + "sActionPlayHint": "відтворити", + "sActionPreviewHint": "передперегляд", + "sActionSelectHint": "вибрати", + "sActionSwitchPathLabel": "змінити шлях", + "sActionUseCameraHint": "використати камеру", + "sNameDurationLabel": "тривалість", + "sUnitAssetCountLabel": "кількість" + }, + "networkInterfacesPage": { + "title": "Мережевий інтерфейс", + "preview": "Передперегляд", + "whitelist": "Білий список", + "blacklist": "Чорний список", + "info": "Типово LocalSend використовує всі доступні мережеві інтерфейси. Ви можете виключити небажані мережі тут. Щоб застосувати зміни, потрібно перезапустити сервер." + } +} diff --git a/app/assets/i18n/ur.json b/app/assets/i18n/ur.json new file mode 100644 index 0000000..cc43dc6 --- /dev/null +++ b/app/assets/i18n/ur.json @@ -0,0 +1,424 @@ +{ + "locale": "اردو", + "appName": "LocalSend", + "general": { + "accept": "قبول کریں", + "accepted": "قبول کر لیا", + "add": "شامل کریں", + "advanced": "اعلی درجے کی", + "cancel": "منسوخ کریں", + "close": "بند کریں", + "confirm": "تصدیق کریں", + "continueStr": "جاری رہے", + "copy": "کاپی", + "copiedToClipboard": "کلپ بورڈ پر کاپی کیا گیا", + "decline": "رد کرنا", + "done": "ہو گیا", + "delete": "حذف کریں", + "edit": "ترمیم", + "error": "خرابی", + "example": "مثال", + "files": "فائلوں", + "finished": "ختم", + "hide": "چھپائیں", + "off": "بند", + "offline": "آف لائن", + "on": "پر", + "online": "آن لائن", + "open": "کھولیں", + "queue": "قطار", + "quickSave": "فوری محفوظ کریں", + "renamed": "نام تبدیل کر دیا گیا", + "reset": "دوبارہ ترتیب دیں", + "restart": "دوبارہ شروع کریں", + "settings": "ترتیبات", + "skipped": "چھوڑ دیا", + "start": "شروع کریں", + "stop": "رک جاؤ", + "save": "محفوظ کریں", + "unchanged": "غیر تبدیل شدہ", + "unknown": "نامعلوم", + "noItemInClipboard": "کلپ بورڈ میں کوئی آئٹم نہیں ہے۔" + }, + "receiveTab": { + "title": "وصول کریں", + "infoBox": { + "ip": ":آئی پی", + "port": ":پورٹ", + "alias": ":عرف" + } + }, + "sendTab": { + "title": "بھیجیں", + "selection": { + "title": "انتخاب", + "files": "فائلیں: {files}", + "size": "سائز: {size}" + }, + "picker": { + "file": "فائل", + "folder": "فولڈر", + "media": "میڈیا", + "text": "ٹیکسٹ", + "app": "ایپ", + "clipboard": "چسپاں کریں" + }, + "shareIntentInfo": "آپ اپنے موبائل ڈیوائس کی \"شیئر کریں\" فیچر کو بھی آسانی سے فائلوں کو منتخب کرنے کے لیے استعمال کرسکتے ہیں۔", + "nearbyDevices": "قریبی ڈیوائس", + "thisDevice": "یہ ڈیوائس", + "scan": "ڈیوائس تلاش کریں", + "manualSending": "خود بھیجنا", + "sendMode": "سینڈ موڈ", + "sendModes": { + "single": "سنگل رسپٹ", + "multiple": "ملٹیپل رسپٹ", + "link": "لنک کے ذریعے شیئر کریں" + }, + "sendModeHelp": "وضاحت", + "help": "براہ کرم یقینی بنائیں کہ مطلوبہ ہدف بھی اسی وائی فائی نیٹ ورک میں ہے۔", + "placeItems": "شئیر کرنے کے لیے اشیاء رکھیں۔" + }, + "settingsTab": { + "title": "ترتیبات", + "general": { + "title": "جنرل", + "brightness": "تھیم", + "brightnessOptions": { + "system": "سسٹم", + "dark": "اندھیرا", + "light": "روشنی" + }, + "color": "رنگ", + "colorOptions": { + "system": "نظام", + "oled": "OLED" + }, + "language": "زبان", + "languageOptions": { + "system": "سسٹم" + }, + "saveWindowPlacement": "چھوڑیں: ونڈو کی جگہ کو محفوظ کریں۔", + "saveWindowPlacementWindows": "بند ہونے پر ونڈو کی پوزیشن محفوظ کریں", + "minimizeToTray": "چھوڑیں: ٹرے میں چھوٹا کریں۔", + "launchAtStartup": "لاگ ان کے بعد آٹو اسٹارٹ", + "launchMinimized": "آٹو سٹارٹ: سٹارٹ پوشیدہ", + "showInContextMenu": "سیاق و سباق کے مینو میں LocalSend دکھائیں", + "animations": "تحریکات" + }, + "receive": { + "title": "وصول کریں", + "quickSave": "@:general.quickSave", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "خودکار تکمیل", + "destination": "منزل", + "downloads": "(ڈاؤن لوڈ)", + "saveToGallery": "میڈیا کو گیلری میں محفوظ کریں۔", + "saveToHistory": "تاریخچہ میں محفوظ کریں" + }, + "send": { + "title": "بھیجیں", + "shareViaLinkAutoAccept": "\"لنک کے ذریعے شیئر کریں\" موڈ میں درخواستیں خود بخود قبول کریں" + }, + "network": { + "title": "نیٹ ورک", + "needRestart": "ترتیبات کو لاگو کرنے کے لیے سرور کو دوبارہ شروع کریں!", + "server": "سرور", + "alias": "عرف", + "deviceType": "آلہ کی قسم", + "deviceModel": "آلہ کا ماڈل", + "port": "پورٹ", + "discoveryTimeout": "نیٹورک پرڈھونڈنے کی مدت ختم ہوگئ ہے", + "portWarning": "ہو سکتا ہے آپ کو دوسرے آلات سے پتہ نہ چل سکے کیونکہ آپ حسب ضرورت پورٹ استعمال کر رہے ہیں۔ (پہلے سے طے شدہ: {defaultPort})", + "encryption": "خفیہ کاری", + "multicastGroup": "ملٹی کاسٹ", + "multicastGroupWarning": "ہو سکتا ہے آپ کو دوسرے آلات سے پتہ نہ لگے کیونکہ آپ حسب ضرورت ملٹی کاسٹ ایڈریس استعمال کر رہے ہیں۔ (پہلے سے طے شدہ: {defaultMulticast})" + }, + "other": { + "title": "دیگر", + "support": "LocalSend کی حمایت کریں", + "donate": "عطیہ کریں", + "privacyPolicy": "رازداری کی پالیسی", + "termsOfUse": "استعمال کی شرائط" + }, + "advancedSettings": "تجاویز شھر کی ترتیبات" + }, + "troubleshootPage": { + "title": "خرابی کا سراغ لگانا", + "subTitle": "کیا یہ ایپ توقع کے مطابق کام نہیں کرتی؟ یہاں آپ عام حل تلاش کر سکتے ہیں۔", + "solution": "حل:", + "fixButton": "خود بخود درست کریں۔", + "firewall": { + "symptom": "یہ ایپ دیگر آلات پر فائلیں بھیج سکتی ہے لیکن دیگر آلات اس ڈیوائس پر فائلیں نہیں بھیج سکتے۔", + "solution": "یہ ممکنہ طور پر فائر وال کا مسئلہ ہے۔ آپ اسے پورٹ {port} پر آنے والے کنکشنز (UDP اور TCP) کی اجازت دے کر حل کر سکتے ہیں۔", + "openFirewall": "فائر وال کھولیں" + }, + "noDiscovery": { + "symptom": "یہ آلہ دوسرے آلات کو دریافت نہیں کر سکتا۔", + "solution": "براہ کرم یقینی بنائیں کہ تمام آلات ایک ہی وائی فائی نیٹ ورک پر ہیں اور ایک ہی ترتیب (پورٹ، ملٹی کاسٹ ایڈریس، انکرپشن) شیئر کرتے ہیں۔ آپ ہدف والے آلے کا IP پتہ دستی طور پر ٹائپ کرنے کی کوشش کر سکتے ہیں۔ اگر یہ کام کرتا ہے، تو اس آلے کو پسندیدہ میں شامل کرنے پر غور کریں تاکہ مستقبل میں اسے خود بخود دریافت کیا جا سکے۔" + }, + "noConnection": { + "symptom": "دونوں آلات ایک دوسرے کو دریافت نہیں کرسکتے ہیں اور نہ ہی وہ فائلوں کا اشتراک کرسکتے ہیں۔", + "solution": "مسئلہ دونوں طرف موجود ہے؟ پھر آپ کو یہ یقینی بنانا ہوگا کہ دونوں ڈیوائسز ایک ہی وائی فائی نیٹ ورک میں ہیں اور ایک ہی کنفیگریشن (پورٹ، ملٹی کاسٹ ایڈریس، انکرپشن) کا اشتراک کرتے ہیں۔ وائی فائی شرکاء کے درمیان مواصلت کی اجازت نہیں دے سکتا ہے۔ اس صورت میں، یہ اختیار روٹر پر فعال ہونا ضروری ہے." + } + }, + "receiveHistoryPage": { + "title": "تاریخ", + "openFolder": "فولڈر کھولیں", + "deleteHistory": "تاریخ کو حذف کریں", + "empty": "تاریخ خالی ہے۔", + "entryActions": { + "open": "فائل کھولو", + "showInFolder": "فولڈر میں دکھائیں", + "info": "معلومات", + "deleteFromHistory": "تاریخ سے حذف کریں" + } + }, + "apkPickerPage": { + "title": "اپلیکیشنز (APK)", + "excludeSystemApps": "سسٹم ایپس کو ختم کریں", + "excludeAppsWithoutLaunchIntent": "غیر لانچ ہونے والے ایپس کو ختم کریں", + "apps": "{n} ایپس" + }, + "selectedFilesPage": { + "deleteAll": "تمام حذف کریں" + }, + "receivePage": { + "subTitle": { + "one": "آپ کو ایک فائل بھیجنا چاہتا ہے۔", + "other": "آپ کو {n} فائلیں بھیجنا چاہتا ہے۔" + }, + "subTitleMessage": "آپ کو ایک پیغام بھیجا:", + "subTitleLink": "آپ کو ایک لنک بھیجا:", + "canceled": "بھیجنے والے نے درخواست منسوخ کر دی ہے۔" + }, + "receiveOptionsPage": { + "title": "اختیارات", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(@:appName folder)", + "saveToGallery": ". گیلری میں محفوظ کریں@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "خود کار طور پر منقطع ہوگیا ہے کیونکہ ڈائریکٹریاں ہیں۔" + }, + "sendPage": { + "waiting": "جواب کا منتظر...", + "rejected": "وصول کنندہ نے درخواست مسترد کر دی ہے۔", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "وصول کنندہ دوسری درخواست میں مصروف ہے۔" + }, + "progressPage": { + "titleSending": "فائلیں بھیج رہا ہے", + "titleReceiving": "فائلیں موصول ہو رہی ہیں", + "savedToGallery": "تصاویر میں محفوظ کیا گیا", + "total": { + "title": { + "sending": "کل پیش رفت ({time})", + "finishedError": "غلطی کے ساتھ ختم", + "canceledSender": "بھیجنے والے کے ذریعے منسوخ کر دیا گیا۔", + "canceledReceiver": "وصول کنندہ کے ذریعے منسوخ کر دیا گیا۔" + }, + "count": "فائلوں: {curr} / {n}", + "size": "سائز: {curr} / {n}", + "speed": "رفتار: {speed}/s" + } + }, + "webSharePage": { + "title": "لنک کے ذریعے شئیر کریں", + "loading": "سرور کو چالو کررہا ہے...", + "stopping": "سرور بند ہو رہا ہے...", + "error": "سرور چالو کرتے وقت خامی پیش آئی ہے۔", + "openLink": { + "one": "اس لنک کو براوزر میں کھولیں:", + "other": "ان میں سے کسی ایک لنک کو براوزر میں کھولیں:" + }, + "requests": "درخواستیں", + "noRequests": "ابھی تک کوئی درخواست نہیں۔", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "درخواستیں خود بخود قبول کریں", + "requirePin": "PIN درکار ہے", + "pinHint": "PIN ہے \"{pin}\"", + "encryptionHint": "LocalSend براؤزر میں استعمال کرنے کیلئے آپ کوخود سائن کردہ سرٹیفکیٹ قبول کرنا ہوگا۔", + "pendingRequests": "زیر التواء درخواستیں: {n}" + }, + "aboutPage": { + "title": "کے بارے میں LocalSend", + "description": [ + "LocalSend ایک مفت، اوپن سورس ایپ ہے جو آپ کو انٹرنیٹ کنکشن کی ضرورت کے بغیر اپنے مقامی نیٹ ورک کے ذریعے قریبی آلات کے ساتھ فائلیں اور پیغامات محفوظ طریقے سے شیئر کرنے کی اجازت دیتی ہے۔", + "یہ ایپ اینڈرائیڈ، iOS، macOS، ونڈوز، اور لینکس پر دستیاب ہے۔ آپ تمام ڈاؤن لوڈ کے اختیارات سرکاری ویب سائٹ پر تلاش کر سکتے ہیں۔" + ], + "author": "مصنف", + "contributors": "تعاون کنندگان", + "packagers": "پیکجرز", + "translators": "مترجمین" + }, + "donationPage": { + "title": "عطیہ کریں", + "info": "LocalSend مفت، اوپن سورس ہے اور اس میں کوئی اشتہارات نہیں ہیں۔ اگر آپ کو ایپ پسند ہے، تو آپ عطیہ کے ذریعے ترقی کی حمایت کر سکتے ہیں۔", + "donate": "عطیہ کریں {amount}", + "thanks": "آپ کا بہت بہت شکریہ!", + "restore": "خریداری بحال کریں" + }, + "changelogPage": { + "title": "چینج لاگ" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "انتخاب میں شامل کریں", + "content": "آپ کیا شامل کرنا چاہتے ہیں؟" + }, + "addressInput": { + "title": "پتہ درج کریں۔", + "hashtag": "Hashtag", + "ip": "اپ ایڈریس", + "recentlyUsed": "حال ہی میں استعمال ہوا:" + }, + "cancelSession": { + "title": "فائل ٹرانسفر منسوخ کریں۔", + "content": "کیا آپ واقعی فائل ٹرانسفر کو منسوخ کرنا چاہتے ہیں؟" + }, + "cannotOpenFile": { + "title": "فائل نہیں کھل سکی", + "content": "\"{file}\" کھول نہیں سکتا۔ کیا یہ فائل منتقل ہوگئی ہے، نام تبدیل ہوگیا ہے یا حذف ہوگئی ہے؟" + }, + "encryptionDisabledNotice": { + "title": "Encryption disabled", + "content": "Communication now takes place via the unencrypted HTTP protocol. To use HTTPS, enable encryption again." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "پسندیدہ", + "noFavorites": "ابھی تک کوئی پسندیدہ آلات نہیں ہیں۔", + "addFavorite": "شامل کریں" + }, + "favoriteDeleteDialog": { + "title": "پسندیدہ سے حذف کریں", + "content": "کیا آپ واقعی \"{name}\" کو پسندیدہ سے حذف کرنا چاہتے ہیں؟" + }, + "favoriteEditDialog": { + "titleAdd": "پسندیدہ میں شامل کریں", + "titleEdit": "ترتیبات", + "name": "آلے کا نام", + "auto": "(خودکار)", + "ip": "IP پتہ", + "port": "پورٹ" + }, + "fileInfo": { + "title": "فائل کی معلومات", + "fileName": "فائل کا نام:", + "path": "راستہ:", + "size": "سائز:", + "sender": "بھیجنے والا:", + "time": "وقت:" + }, + "fileNameInput": { + "title": "فائل کا نام درج کریں۔", + "original": "اصل: {original}" + }, + "historyClearDialog": { + "title": "تاریخ صاف کریں", + "content": "کیا آپ واقعی پوری تاریخ حذف کرنا چاہتے ہیں؟" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "لوکل نیٹ ورک کا سکین کرنے کی اجازت کے بغیر LocalSend، دیگر ڈیوائسز تلاش نہیں کرسکتا ہے۔ براہ کرم ترتیبات میں اس اجازت کو منظور کریں۔", + "gotoSettings": "ترتیبات" + }, + "messageInput": { + "title": "پیغام ٹائپ کریں۔", + "multiline": "ملٹی لائن" + }, + "noFiles": { + "title": "کوئی فائل منتخب نہیں کی گئی", + "content": "براہ کرم کم از کم ایک فائل منتخب کریں۔" + }, + "noPermission": { + "title": "اجازت نہیں", + "content": "آپ نے ضروری اجازتیں فراہم نہیں کی ہیں۔ براہ کرم انہیں ترتیبات میں فراہم کریں۔" + }, + "notAvailableOnPlatform": { + "title": "دستیاب نہیں", + "content": "یہ خصوصیت صرف یہاں دستیاب ہے:" + }, + "qr": { + "title": "QR کوڈ" + }, + "quickActions": { + "title": "فوری اقدامات", + "counter": "کاؤنٹر", + "prefix": "سابقہ", + "padZero": "زیرو کے ساتھ پیڈ", + "sortBeforeCount": "پہلے سے حروف تہجی کے مطابق ترتیب دیں۔", + "random": "بے ترتیب" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "فائل کی درخواستیں خود بخود قبول ہو جاتی ہیں۔ آگاہ رہیں کہ مقامی نیٹ ورک میں موجود ہر کوئی آپ کو فائلیں بھیج سکتا ہے۔" + }, + "pin": { + "title": "PIN درج کریں" + }, + "sendModeHelp": { + "title": "بھیجنے کے انداز", + "single": "ایک ریسیور کو فائل بھیجتا ہے۔ بھیجتے وقت سلیکشن ختم ہوجائیگا۔", + "multiple": "اکثر متعدد ریسیورز کو فائل بھیجتا ہے۔ سلیکشن ختم نہیں ہوگا۔", + "link": "LocalSend نصب نہیں ہونے والے رسیورز منتخب شدہ فائلز کو لنک اپنے براؤزر میں کھولنے سے ڈاؤن لوڈ کر سکتے ہیں۔" + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "فائل کا نام خالی نہیں ہو سکتا", + "invalid": "فائل کے نام میں غلط حروف ہیں" + }, + "tray": { + "@info": "ایپل کے رہنما خطوط 'قریبی' الفاظ کے بارے میں بہت سخت ہیں۔", + "open": "@:general.open", + "close": "چھوڑو LocalSend", + "closeWindows": "بند کریں" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "PIN درج کریں", + "invalidPin": "غلط PIN", + "tooManyAttempts": "بہت زیادہ کوششیں", + "rejected": "منسوخ کردیا", + "files": "فائلیں", + "fileName": "فائل کا نام", + "size": "سائز" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "تصدیق کریں", + "cancel": "منسوخ کریں", + "edit": "ترمیم کریں", + "gifIndicator": "جی آئی ایف", + "loadFailed": "لوڈ نہیں ہوسکی", + "original": "اصل ", + "preview": "پیش نظارہ", + "select": "منتخب کریں", + "emptyList": "خالی فہرست", + "unSupportedAssetType": "غیر معتبر فائل کی قسم۔", + "unableToAccessAll": "یہ ڈیوائس پر تمام فائلوں تک رسائی نہیں ہوسکتی ہے۔", + "viewingLimitedAssetsTip": "صرف ایپ تک رسائی پذیر فائلوں اور البم کونسیس ہوسکتی ہیں۔", + "changeAccessibleLimitedAssets": "رسائی پذیر فائلوں کو اپ ڈیٹ کرنے کے لئے کلک کریں", + "accessAllTip": "ایپ صرف چند فائلوں تک رسائی حاصل کرسکتی ہے ڈیوائس پر۔ سسٹم کی ترتیبات میں جائیں اور ایپ کو ڈیوائس پر تمام میڈیا تک رسائی کی اجازت دیں۔", + "goToSystemSettings": "سسٹم ترتیبات پر جائیں", + "accessLimitedAssets": "محدود رسائی کے ساتھ جاری رکھیں", + "accessiblePathName": "رسائی پذیر فائلیں", + "sTypeAudioLabel": "آڈیو", + "sTypeImageLabel": "تصویر", + "sTypeVideoLabel": "ویڈیو", + "sTypeOtherLabel": "دیگر میڈیا", + "sActionPlayHint": "چلائیں", + "sActionPreviewHint": "پیش نظارہ کریں", + "sActionSelectHint": "منتخب کریں", + "sActionSwitchPathLabel": "راستہ تبدیل کریں", + "sActionUseCameraHint": "کیمرہ استعمال کریں", + "sNameDurationLabel": "مدت", + "sUnitAssetCountLabel": "کاؤنٹ" + } +} diff --git a/app/assets/i18n/vi.json b/app/assets/i18n/vi.json new file mode 100644 index 0000000..58462fe --- /dev/null +++ b/app/assets/i18n/vi.json @@ -0,0 +1,457 @@ +{ + "locale": "Tiếng Anh", + "appName": "LocalSend", + "general": { + "accept": "Đồng ý", + "accepted": "Đã đồng ý", + "add": "Thêm", + "advanced": "Nâng cao", + "cancel": "Thoát", + "close": "Đóng", + "confirm": "Xác nhận", + "continueStr": "Tiếp tục", + "copy": "Sao chép", + "copiedToClipboard": "Đã sao chép vào bộ nhớ tạm", + "decline": "Từ chối", + "done": "Hoàn thành", + "delete": "Xoá", + "edit": "Sửa", + "error": "Lỗi", + "example": "Ví dụ", + "files": "Tập tin", + "finished": "Đã xong", + "hide": "Ẩn", + "off": "Tắt", + "offline": "Ngoại tuyến", + "on": "Bật", + "online": "Trực tuyến", + "open": "Mở", + "queue": "Hàng chờ", + "quickSave": "Lưu nhanh", + "quickSaveFromFavorites": "Lưu nhanh cho \"Yêu thích\"", + "renamed": "Đã đổi tên", + "reset": "Thiết lập lại", + "restart": "Khởi động lại", + "settings": "Cài đặt", + "skipped": "Đã bỏ qua", + "start": "Bắt đầu", + "stop": "Dừng", + "save": "Lưu", + "unchanged": "Chưa thay đổi", + "unknown": "Không rõ", + "noItemInClipboard": "Không có gì trong bộ nhớ tạm." + }, + "receiveTab": { + "title": "Nhận", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "Biệt danh:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "Yêu thích", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "Gửi", + "selection": { + "title": "Lựa chọn", + "files": "Tập tin: {files}", + "size": "Kích thước: {size}" + }, + "picker": { + "file": "Tập tin", + "folder": "Thư mục", + "media": "Media", + "text": "Văn bản", + "app": "Ứng dụng", + "clipboard": "Dán" + }, + "shareIntentInfo": "Bạn có thể dùng tính năng \"Chia sẻ\" trong điện thoại của bạn để lựa chọn các tập tin dễ dàng hơn.", + "nearbyDevices": "Thiết bị lân cận", + "thisDevice": "Thiết bị hiện tại", + "scan": "Tìm kiếm thiết bị", + "manualSending": "Gửi thủ công", + "sendMode": "Chế độ gửi", + "sendModes": { + "single": "Một người nhận", + "multiple": "Nhiều người nhận", + "link": "Chia sẻ liên kết" + }, + "sendModeHelp": "Giải thích", + "help": "Vui lòng đảm bảo thiết bị gửi và nhận dùng chung mạng wifi.", + "placeItems": "Đặt các mục để chia sẻ." + }, + "settingsTab": { + "title": "Cài đặt", + "general": { + "title": "Chung", + "brightness": "Chủ đề", + "brightnessOptions": { + "system": "Hệ thống", + "dark": "Tối", + "light": "Sáng" + }, + "color": "Màu sắc", + "colorOptions": { + "system": "Hệ thống", + "oled": "OLED" + }, + "language": "Ngôn ngữ", + "languageOptions": { + "system": "Hệ thống" + }, + "saveWindowPlacement": "Thoát: Lưu vị trí cửa sổ hiển thị", + "saveWindowPlacementWindows": "Lưu vị trí cửa sổ sau khi thoát ứng dụng", + "minimizeToTray": "Thoát: Ẩn xuống thanh tác vụ", + "launchAtStartup": "Tự khởi động sau khi đăng nhập", + "launchMinimized": "Tự khởi động: Khởi động ẩn", + "showInContextMenu": "Hiển thị LocalSend ở danh mục", + "animations": "Hoạt ảnh" + }, + "receive": { + "title": "Nhận", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "Tự động hoàn thành", + "destination": "Đích đến", + "downloads": "(Downloads)", + "saveToGallery": "Lưu media vào thư viện", + "saveToHistory": "Lưu vào lịch sử" + }, + "send": { + "title": "Gửi", + "shareViaLinkAutoAccept": "Chia sẻ qua liên kết: Tự động chấp nhận" + }, + "network": { + "title": "Mạng", + "needRestart": "Khởi động lại server để cài đặt có hiệu lực!", + "server": "Server", + "alias": "Biệt danh", + "deviceType": "Loại thiết bị", + "deviceModel": "Model thiết bị", + "port": "Port", + "discoveryTimeout": "Hết thời gian tìm kiếm", + "useSystemName": "Dùng tên hệ thống", + "generateRandomAlias": "Dùng bí danh ngẫu nhiên", + "portWarning": "Các thiết bị khác có thể không nhận diện được thiết bị của bạn, vì bạn đang dùng port tuỳ chỉnh. (mặc định: {defaultPort})", + "encryption": "Mã hoá", + "multicastGroup": "Đa phương tiện", + "multicastGroupWarning": "Các thiết bị khác có thể không nhận diện được thiết bị của bạn, vì bạn đang dùng địa chỉ multicast tuỳ chỉnh. (mặc định: {defaultMulticast})", + "networkOptions": { + "all": "Tất cả", + "filtered": "Đã lọc" + }, + "network": "Giao diện mạng" + }, + "other": { + "title": "Khác", + "support": "Hỗ trợ LocalSend", + "donate": "Ủng hộ", + "privacyPolicy": "Chính sách bảo mật", + "termsOfUse": "Điều khoản sử dụng" + }, + "advancedSettings": "Cài đặt nâng cao" + }, + "troubleshootPage": { + "title": "Gỡ lỗi", + "subTitle": "Ứng dụng không hoạt động như dự kiến? Bạn có thể tìm giải pháp cho những vấn đề thường gặp tại đây.", + "solution": "Giải pháp:", + "fixButton": "Sửa lỗi tự động", + "firewall": { + "symptom": "Ứng dụng có thể gửi tập tin tới các thiết bị khác, nhưng các thiết bị khác không thể gửi tập tin đến thiết bị này.", + "solution": "Có vẻ như đây là một vấn đề với tường lửa (firewall). Bạn có thể khắc phục bằng cách chấp thuận các kết nối đến (UDP và TCP) trên port {port}.", + "openFirewall": "Mở tường lửa(Firewall)" + }, + "noDiscovery": { + "symptom": "Thiết bị này không thể tìm thấy thiết bị khác.", + "solution": "Hãy đảm bảo rằng các thiết bị được kết nối với cùng một mạng Wi-Fi và dùng chung thiết lập (port, multicast address, encryption). Bạn có thể thử nhập địa chỉ IP của thiết bị đích đến. Nếu nó hoạt động, cân nhắc thêm thiết bị đó vào mục yêu thích. Thiết bị sẽ được nhận tự động trong những lần tìm kiếm trong tương lai." + }, + "noConnection": { + "symptom": "Cả hai thiết bị không thể nhận diện lẫn nhau cũng như không thể chia sẻ tập tin.", + "solution": "Vấn đề tồn tại ở cả 2 thiết bị? Nếu thế, bạn cần chắc chắn rằng cả hai thiết bị đang dùng chung một mạng wifi với cùng thiết lập (port, địa chỉ multicast, mã hoá). Wifi có thể không cho các thiết bị giao tiếp với nhau. Trong trường hợp đó, bạn cần tìm trong thiết lập của router." + } + }, + "receiveHistoryPage": { + "title": "Lịch sử", + "openFolder": "Mở thư mục", + "deleteHistory": "Xoá lịch sử", + "empty": "Lịch sử rỗng.", + "entryActions": { + "open": "Mở tập tin", + "showInFolder": "Hiển thị trong thư mục", + "info": "Thông tin", + "deleteFromHistory": "Xoá khỏi lịch sử" + } + }, + "apkPickerPage": { + "title": "Ứng dụng (APK)", + "excludeSystemApps": "Mở ứng dụng hệ thống", + "excludeAppsWithoutLaunchIntent": "Loại trừ các ứng dụng không thể khởi chạy", + "apps": "{n} Ứng dụng" + }, + "selectedFilesPage": { + "deleteAll": "Xoá toàn bộ" + }, + "receivePage": { + "subTitle": { + "one": "muốn gửi cho bạn một tập tin", + "other": "muốn gửi cho bạn {n} tập tin" + }, + "subTitleMessage": "đã gửi cho bạn một tin nhắn:", + "subTitleLink": "đã gửi cho bạn một liên kết:", + "canceled": "Người gửi đã xoá yêu cầu." + }, + "receiveOptionsPage": { + "title": "Tuỳ chọn", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(Thư mục LocalSend)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "Đã tự động tắt vì là thư mục." + }, + "sendPage": { + "waiting": "Đang chờ phản hồi…", + "rejected": "Người nhận đã từ chối yêu cầu.", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "Người nhận đang bận xử lý một yêu cầu khác." + }, + "progressPage": { + "titleSending": "Đang gửi tập tin", + "titleReceiving": "Đang nhận tập tin", + "savedToGallery": "Đã lưu vào Ảnh", + "total": { + "title": { + "sending": "Tổng tiến độ ({time})", + "finishedError": "Kết thúc với lỗi", + "canceledSender": "Đã huỷ bởi người gửi", + "canceledReceiver": "Đã huỷ bởi người nhận" + }, + "count": "Tập tin: {curr} / {n}", + "size": "Kích thước: {curr} / {n}", + "speed": "Tốc độ: {speed}/s" + } + }, + "webSharePage": { + "title": "Chia sẻ qua liên kết", + "loading": "Đang khởi tạo server…", + "stopping": "Đang dừng server…", + "error": "Một lỗi đã xảy ra khi khởi tạo server.", + "openLink": { + "one": "Mở liên kết trong trình duyệt:", + "other": "Mở một trong các liên kết với trình duyệt:" + }, + "requests": "Yêu cầu", + "noRequests": "Hiện không có yêu cầu nào.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "Tự động chấp nhận yêu cầu", + "requirePin": "Cần cung cấp mã PIN", + "pinHint": "Mã PIN là \"{pin}\"", + "encryptionHint": "LocalSend dùng chứng chỉ tự tạo. Bạn cần chấp thuận trong trình duyệt.", + "pendingRequests": "Yêu cầu chờ: {n}" + }, + "aboutPage": { + "title": "Thông tin về LocalSend", + "description": [ + "LocalSend là một phần mềm miễn phí mã nguồn mở, giúp bạn chia sẻ tập tin cũng như tin nhắn đến các thiết bị phụ cận một cách bảo mật thông qua mạng nội bộ mà không cần kết nối mạng đến bên ngoài.", + "Ứng dụng có trên Android, iOS, macOS, Windows và Linux. Bạn có thể tìm thấy các tuỳ chọn tải ở trang chủ." + ], + "author": "Tác giả", + "contributors": "Người đóng góp", + "packagers": "Người đóng gói", + "translators": "Người dịch" + }, + "donationPage": { + "title": "Ủng hộ", + "info": "LocalSend là ứng dụng miễn phí, mã nguồn mở, không chứa quảng cáo. Nếu bạn yêu thích ứng dụng này, bạn có thể hỗ trợ việc phát triển bằng việc ủng hộ.", + "donate": "Ủng hộ {amount}", + "thanks": "Xin chân thành cảm ơn!", + "restore": "Khôi phục lịch sử ủng hộ" + }, + "changelogPage": { + "title": "Lịch sử thay đổi" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "Thêm vào lựa chọn", + "content": "Bạn muốn thêm mục nào?" + }, + "openFile": { + "title": "Mở tệp tin", + "content": "Bạn có muốn mở tập tin vừa nhận được không?" + }, + "addressInput": { + "title": "Nhập địa chỉ", + "hashtag": "Hashtag", + "ip": "Địa chỉ IP", + "recentlyUsed": "Sử dụng gần đây: " + }, + "cancelSession": { + "title": "Dừng gửi tập tin", + "content": "Bạn có thực sự muống dừng quá trình gửi tập tin?" + }, + "cannotOpenFile": { + "title": "Không thể mở tập tin", + "content": "Không thể mở \"{file}\". Có thể tập tin có thể đã bị di chuyển, đổi tên hoặc xoá?" + }, + "encryptionDisabledNotice": { + "title": "Mã hoá đã tắt", + "content": "Kết nối hiện đang hoạt động trên giao thức HTTP. Để dùng HTTPS, hãy bật mã hoá." + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "Yêu thích", + "noFavorites": "Hiện không có thiết bị yêu thích.", + "addFavorite": "Thêm" + }, + "favoriteDeleteDialog": { + "title": "Xoá khỏi yêu thích", + "content": "Bạn có chắc chắn muốn xoá \"{name}\" khỏi yêu thích?" + }, + "favoriteEditDialog": { + "titleAdd": "Thêm vào yêu thích", + "titleEdit": "Điều chỉnh", + "name": "Biệt danh", + "auto": "(tự động)", + "ip": "Địa chỉ IP", + "port": "Port" + }, + "fileInfo": { + "title": "Thông tin tập tin", + "fileName": "Tên:", + "path": "Đường dẫn:", + "size": "Kích thước:", + "sender": "Người gửi:", + "time": "Thời gian:" + }, + "fileNameInput": { + "title": "Nhập tên", + "original": "Ban đầu: {original}" + }, + "historyClearDialog": { + "title": "Xoá lịch sử", + "content": "Bạn có chắc chắn muốn xoá toàn bộ lịch sử?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend không thể tìm kiếm thiết bị khác khi không được phép quét mạng nội bộ. Vui lòng trao quyền cho ứng dụng trong cài đặt.", + "gotoSettings": "Cài đặt" + }, + "messageInput": { + "title": "Nhập tin nhắn", + "multiline": "Nhiều dòng" + }, + "noFiles": { + "title": "Không có tập tin nào được chọn", + "content": "Vui lòng chọn ít nhất một tập tin." + }, + "noPermission": { + "title": "Chưa được trao quyền.", + "content": "Bạn chưa được trao quyền. Vui lòng trao quyền cho ứng dụng trong cài đặt." + }, + "notAvailableOnPlatform": { + "title": "Không khả dụng", + "content": "Tính năng chỉ có trên:" + }, + "qr": { + "title": "Mã QR" + }, + "quickActions": { + "title": "Thao Tác Nhanh", + "counter": "Bộ đếm", + "prefix": "Tiếp đầu ngữ", + "padZero": "Pad with zeros", + "sortBeforeCount": "Sắp xếp theo bảng chữ cái", + "random": "Ngẫu nhiên" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "Yêu cầu tập tin đã được chấp thuận tự động. Chú ý rằng bất kỳ ai dùng chung mạng nội bộ với bạn đều có thể gửi tập tin cho bạn." + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "Yêu cầu sẽ được chấp thuận tự động nếu thiết bị nằm trong danh sách yêu thích.", + "Lưu ý! Hiện tại, tính năng này không hoàn toàn an toàn, vì tin tặc có thể mạo danh thiết bị trong danh sách yêu thích và gửi tệp tin cho bạn mà không gặp trở ngại gì.", + "Tuy nhiên, tính năng này vẫn an toàn hơn tự động chấp thuận tập tin từ tất cả người dùng chung mạng nội bộ." + ] + }, + "pin": { + "title": "Nhập mã PIN" + }, + "sendModeHelp": { + "title": "Chế độ gửi", + "single": "Gửi tập tin tới một người nhận. Lựa chọn sẽ được xoá sau khi quá trình gửi hoàn thành.", + "multiple": "Gửi tập tin tới nhiều người nhận. Lựa chọn sẽ không bị xoá.", + "link": "Người nhận chưa cài đặt LocalSend có thể nhận tập tin bằng cách mở liên kết trong trình duyệt." + }, + "zoom": { + "title": "Đường dẫn" + } + }, + "sanitization": { + "empty": "Tên tập tin không được để trống", + "invalid": "Tên tập tin chứa ký tự không hợp lệ" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "Đóng LocalSend", + "closeWindows": "Thoát" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "Nhập mã PIN", + "invalidPin": "Sai mã PIN", + "tooManyAttempts": "Sai quá nhiều", + "rejected": "Đã từ chối", + "files": "Tập tin", + "fileName": "Tên", + "size": "Kích thước" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "Xác nhận", + "cancel": "Thoát", + "edit": "Sửa", + "gifIndicator": "GIF", + "loadFailed": "Tải lỗi", + "original": "Gốc", + "preview": "Xem trước", + "select": "Chọn", + "emptyList": "Danh sách trống", + "unSupportedAssetType": "Định dạng tập tin không được hỗ trợ.", + "unableToAccessAll": "Không thể truy cập tới tất cả tập tin trong thiết bị", + "viewingLimitedAssetsTip": "Chỉ hiển thị các tập tin và album mà ứng dụng có thể truy cập.", + "changeAccessibleLimitedAssets": "Ấn để cập nhận các tập tin có thể truy cập.", + "accessAllTip": "Ứng dụng chỉ có thể truy cập một số tập tin trong thiết bị. Hãy vào cài đặt hệ thống để chấp thuận ứng dụng có thể truy cập tất cả media trong thiết bị.", + "goToSystemSettings": "Truy cập cài đặt hệ thống", + "accessLimitedAssets": "Tiếp tục với truy cập bị giới hạn", + "accessiblePathName": "Các tập tin có thể truy cập", + "sTypeAudioLabel": "Audio", + "sTypeImageLabel": "Ảnh", + "sTypeVideoLabel": "Video", + "sTypeOtherLabel": "Media khác", + "sActionPlayHint": "mở", + "sActionPreviewHint": "xem trước", + "sActionSelectHint": "chọn", + "sActionSwitchPathLabel": "đổi đường dẫn", + "sActionUseCameraHint": "dùng camera", + "sNameDurationLabel": "thời lượng", + "sUnitAssetCountLabel": "đếm" + }, + "networkInterfacesPage": { + "info": "LocalSend mặc định sử dụng tất cả các giao diện mạng có sẵn. Bạn có thể loại trừ các mạng không mong muốn tại đây. Bạn cần khởi động lại server để áp dụng các thay đổi.", + "title": "Card mạng", + "preview": "Xem trước", + "whitelist": "Cho phép", + "blacklist": "Chặn" + } +} diff --git a/app/assets/i18n/zh-CN.json b/app/assets/i18n/zh-CN.json new file mode 100644 index 0000000..083ced4 --- /dev/null +++ b/app/assets/i18n/zh-CN.json @@ -0,0 +1,534 @@ +{ + "locale": "简体中文", + "appName": "LocalSend", + "general": { + "accept": "接受", + "accepted": "已接受", + "add": "添加", + "advanced": "高级", + "cancel": "取消", + "close": "关闭", + "confirm": "确认", + "continueStr": "继续", + "copy": "复制", + "copiedToClipboard": "已复制到剪贴板", + "decline": "拒绝", + "done": "完成", + "delete": "删除", + "edit": "编辑", + "error": "错误", + "example": "示例", + "files": "文件", + "finished": "已完成", + "hide": "隐藏", + "off": "关", + "offline": "离线", + "on": "开", + "online": "在线", + "open": "打开", + "queue": "队列", + "quickSave": "自动保存", + "quickSaveFromFavorites": "自动保存来自“收藏夹(白名单)”设备的文件", + "renamed": "重命名成功", + "reset": "重置", + "restart": "重启", + "settings": "设置", + "skipped": "已跳过", + "start": "开始", + "stop": "停止", + "save": "保存", + "unchanged": "未更改", + "unknown": "未知", + "noItemInClipboard": "剪贴板为空" + }, + "receiveTab": { + "title": "接收", + "infoBox": { + "ip": "IP:", + "port": "端口:", + "alias": "设备名称:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "收藏夹", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "发送", + "selection": { + "title": "选择", + "files": "文件:{files}", + "size": "大小:{size}" + }, + "picker": { + "file": "文件", + "folder": "文件夹", + "media": "媒体", + "text": "文本", + "app": "应用", + "clipboard": "剪贴板" + }, + "shareIntentInfo": "你也可以通过移动设备中的“分享”功能更简单地发送文件。", + "nearbyDevices": "附近的设备", + "thisDevice": "这台设备", + "scan": "扫描设备", + "manualSending": "手动发送", + "sendMode": "发送模式", + "sendModes": { + "single": "一个接收者", + "multiple": "多个接收者", + "link": "通过链接分享" + }, + "sendModeHelp": "提示", + "help": "请确保目标连接到同一个 Wi‑Fi 网络。", + "placeItems": "列出要分享的项目。" + }, + "settingsTab": { + "title": "设置", + "general": { + "title": "通用", + "brightness": "主题", + "brightnessOptions": { + "system": "跟随系统", + "dark": "深色", + "light": "浅色" + }, + "color": "颜色", + "colorOptions": { + "system": "跟随系统", + "oled": "OLED" + }, + "language": "语言", + "languageOptions": { + "system": "跟随系统" + }, + "saveWindowPlacement": "退出时保存窗口位置", + "saveWindowPlacementWindows": "退出时保存窗口位置", + "minimizeToTray": "关闭时最小化到系统托盘", + "launchAtStartup": "登录系统后自动启动程序", + "launchMinimized": "启动时最小化到任务栏", + "showInContextMenu": "在“发送到...”文件菜单中显示 LocalSend", + "animations": "动画效果" + }, + "receive": { + "title": "接收", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "自动完成传输任务", + "destination": "保存目录", + "downloads": "(下载)", + "saveToGallery": "保存到相册", + "saveToHistory": "保存到历史记录" + }, + "send": { + "title": "发送", + "shareViaLinkAutoAccept": "通过链接分享:自动同意接收请求" + }, + "network": { + "title": "网络", + "needRestart": "重启服务器后生效!", + "server": "服务器", + "alias": "设备名称", + "deviceType": "设备类型", + "deviceModel": "设备型号", + "port": "端口", + "discoveryTimeout": "搜索设备超时", + "useSystemName": "使用系统名称", + "generateRandomAlias": "生成随机昵称", + "portWarning": "由于正在使用自定义端口,你可能不会被其他设备检测到。(默认端口:{defaultPort})", + "encryption": "加密", + "multicastGroup": "多播", + "multicastGroupWarning": "由于正在使用自定义多播地址,你可能不会被其他设备检测到。(默认地址:{defaultMulticast})", + "network": "网络", + "networkOptions": { + "all": "所有", + "filtered": "已过滤" + } + }, + "other": { + "title": "其他", + "support": "支持 LocalSend", + "donate": "捐赠", + "privacyPolicy": "隐私政策", + "termsOfUse": "使用条款" + }, + "advancedSettings": "高级设置" + }, + "troubleshootPage": { + "title": "故障排除", + "subTitle": "应用没有按预期工作?您可以在这里找到常用解决方案。", + "solution": "解决方案:", + "fixButton": "自动修复", + "firewall": { + "symptom": "此设备可以发送文件至其他设备,但其它设备无法发送文件到此设备。", + "solution": "这最可能是由防火墙规则设定引起的。你可以通过在端口 {port} 上允许(UDP 和 TCP 的)传入请求来解决这个问题。", + "openFirewall": "打开防火墙" + }, + "noDiscovery": { + "symptom": "此设备未能发现其他设备。", + "solution": "确保所有设备都处于同一个 Wi‑Fi 网络上,且共享相同的网络配置(端口、多播地址、加密选项)。您可以尝试手动输入目标设备的 IP 地址。如果起到了效果,请考虑将此设备添加到收藏夹中,以便将来可以自动发现。" + }, + "noConnection": { + "symptom": "双方设备均无法发现对方或者分享文件。", + "solution": "当问题发生在双方设备上时,请先确认双方设备处于同一个 Wi‑Fi 网络上,且共享相同的网络配置(端口、多播地址、加密选项)。若因 Wi‑Fi 不允许参与者间通信,那么请在路由器中关闭“接入点(AP)隔离”选项。" + } + }, + "receiveHistoryPage": { + "title": "历史", + "openFolder": "打开目录", + "deleteHistory": "删除历史记录", + "empty": "无历史记录。", + "entryActions": { + "open": "打开文件", + "showInFolder": "在文件管理器中显示", + "info": "信息", + "deleteFromHistory": "从历史记录中删除" + } + }, + "apkPickerPage": { + "title": "应用(APK)", + "excludeSystemApps": "排除系统应用", + "excludeAppsWithoutLaunchIntent": "排除无法启动的应用", + "apps": "{n} 个应用" + }, + "selectedFilesPage": { + "deleteAll": "全部删除" + }, + "receivePage": { + "subTitle": { + "one": "想要发送给你一个文件", + "other": "想要发送给你 {n} 个文件" + }, + "subTitleMessage": "发送给你了一条消息:", + "subTitleLink": "发送给你了一个链接:", + "canceled": "发送者取消了请求。" + }, + "receiveOptionsPage": { + "title": "设置", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend 文件夹)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "由于分享内容中存在文件夹,已自动关闭。" + }, + "sendPage": { + "waiting": "等待响应中……", + "rejected": "对方拒绝了请求。", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "对方正在处理另一个请求。" + }, + "progressPage": { + "titleSending": "正在发送文件", + "titleReceiving": "正在接收文件", + "savedToGallery": "已保存到相册", + "total": { + "title": { + "sending": "总进度 ({time})", + "finishedError": "已完成,但发生错误", + "canceledSender": "发送者已取消", + "canceledReceiver": "接收者已取消" + }, + "count": "文件:{curr} / {n}", + "size": "大小:{curr} / {n}", + "speed": "速度:{speed}/s" + }, + "remainingTime": { + "hours": "{h}h {m}m", + "days": "{d}d {h}h {m}m", + "@hours": "使用'h'作为小时缩写,使用'm'作为分钟缩写", + "@days": "使用'd'作为天缩写,使用'h'作为小时缩写,使用'm'作为分钟缩写", + "seconds": "{n}:{ss}", + "minutes": "{n}:{ss}" + } + }, + "webSharePage": { + "title": "分享为链接", + "loading": "正在启动服务器……", + "stopping": "正在停止服务器……", + "error": "在启动服务器过程中发生了错误。", + "openLink": { + "one": "在浏览器中打开链接:", + "other": "在浏览器中打开其中一个链接:" + }, + "requests": "请求", + "noRequests": "尚无请求。", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "自动接受请求", + "requirePin": "启用 PIN 密码", + "pinHint": "PIN 为 “{pin}”", + "encryptionHint": "LocalSend 使用自签名证书。您需要在浏览器中允许它。", + "pendingRequests": "待处理请求:{n}" + }, + "aboutPage": { + "title": "关于 LocalSend", + "description": [ + "LocalSend 是一款免费的开源应用程序,可让您通过本地网络与附近的设备安全地分享文件和信息,而无需互联网连接。", + "本程序可在 Android、iOS、macOS、Windows 和 Linux 上使用。您可以在官方主页找到所有下载选项。" + ], + "author": "作者", + "contributors": "贡献者", + "packagers": "打包者", + "translators": "翻译者" + }, + "donationPage": { + "title": "捐赠", + "info": "LocalSend 免费、开源、无广告。如果您喜欢这款应用程序,可以捐款支持开发。", + "donate": "捐款 {amount}", + "thanks": "非常感谢您的支持!", + "restore": "恢复购买" + }, + "changelogPage": { + "title": "更新日志" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "由于英文中一些近义词无法被翻译为不同的中文,这里与英文会有所差异", + "adjectives": [ + "迷人", + "美丽", + "巨大", + "明亮", + "干净", + "聪明", + "帅气", + "可爱", + "狡猾", + "坚定", + "有活力", + "高效", + "极好", + "快速", + "不错", + "新鲜", + "好", + "华丽", + "伟大", + "英俊", + "炽热", + "善良", + "诚实", + "神秘", + "整洁", + "开心", + "耐心", + "漂亮", + "强大", + "富有", + "秘密", + "聪明", + "稳固", + "特别", + "战略性", + "强大", + "整洁", + "智慧" + ], + "fruits": [ + "苹果", + "鳄梨", + "香蕉", + "黑莓", + "蓝莓", + "西兰花", + "胡萝卜", + "樱桃", + "椰子", + "葡萄", + "柠檬", + "莴苣", + "芒果", + "甜瓜", + "蘑菇", + "洋葱", + "橙子", + "木瓜", + "桃子", + "梨", + "菠萝", + "土豆", + "南瓜", + "覆盆子", + "草莓", + "番茄" + ], + "combination": "{adjective}的{fruit}" + }, + "dialogs": { + "addFile": { + "title": "添加文件", + "content": "你想添加什么文件?" + }, + "openFile": { + "title": "打开文件", + "content": "您是否要打开接收的文件?" + }, + "addressInput": { + "title": "输入地址", + "hashtag": "标签", + "ip": "IP 地址", + "recentlyUsed": "最近使用: " + }, + "cancelSession": { + "title": "取消文件传输", + "content": "要取消文件传输吗?" + }, + "cannotOpenFile": { + "title": "无法打开文件", + "content": "无法打开 “{file}”。这个文件是否已被移动、重命名或删除?" + }, + "encryptionDisabledNotice": { + "title": "加密已关闭", + "content": "正在通过未加密的 HTTP 协议连接。要使用 HTTPS 协议,请开启加密选项。" + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "收藏夹", + "noFavorites": "还没有收藏的设备。", + "addFavorite": "新建" + }, + "favoriteDeleteDialog": { + "title": "删除收藏", + "content": "确定要取消收藏 “{name}” 吗?" + }, + "favoriteEditDialog": { + "titleAdd": "添加到收藏夹", + "titleEdit": "设置", + "name": "名称", + "auto": "(自动)", + "ip": "IP 地址", + "port": "端口" + }, + "fileInfo": { + "title": "文件信息", + "fileName": "文件名:", + "path": "路径:", + "size": "大小:", + "sender": "发送者:", + "time": "时间:" + }, + "fileNameInput": { + "title": "输入文件名", + "original": "原名:{original}" + }, + "historyClearDialog": { + "title": "清空历史记录", + "content": "确定要清空全部历史记录吗?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "LocalSend 在没有扫描本地网络的权限的情况下无法找到其他设备。请在设置中授予此权限。", + "gotoSettings": "设置" + }, + "messageInput": { + "title": "输入消息", + "multiline": "多行" + }, + "noFiles": { + "title": "未选择文件", + "content": "请至少选择一个文件。" + }, + "noPermission": { + "title": "没有权限", + "content": "您尚未授予必要的权限。请在设置中授予权限。" + }, + "notAvailableOnPlatform": { + "title": "不可用", + "content": "此功能只在以下平台可用:" + }, + "qr": { + "title": "二维码" + }, + "quickActions": { + "title": "快速操作", + "counter": "计数器", + "prefix": "前缀", + "padZero": "以零填充", + "sortBeforeCount": "事先以字母顺序排序", + "random": "随机" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "自动接受所有文件传输请求。请注意,这会让此网络中的所有人都可以向你发送文件。" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "当前会自动接受收藏夹中设备的文件请求。", + "警告:这目前并非绝对安全,知道您收藏夹列表中的设备指纹被黑客窃取,其仍可以向您发送文件。", + "但是,此选项比“允许任何设备”更安全。" + ] + }, + "pin": { + "title": "输入 PIN" + }, + "sendModeHelp": { + "title": "发送模式", + "single": "发送文件给一个接收者。已选择的文件在发送后会取消选择。", + "multiple": "发送文件给多个接收者。已选择的文件在发送后不会取消选择。", + "link": "未安装 LocalSend 的接收者可以在浏览器中打开链接以下载选中的文件。" + }, + "zoom": { + "title": "URL" + } + }, + "sanitization": { + "empty": "文件名不能为空", + "invalid": "文件名包含无效字符" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the \"close\" wording.", + "open": "@:general.open", + "close": "退出 LocalSend", + "closeWindows": "退出" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "输入 PIN", + "invalidPin": "PIN 无效", + "tooManyAttempts": "尝试次数过多", + "rejected": "已拒绝", + "files": "文件", + "fileName": "文件名", + "size": "大小" + }, + "assetPicker": { + "@info": "Android 和 iPhone 媒体选择工具的翻译", + "confirm": "确认", + "cancel": "取消", + "edit": "编辑", + "gifIndicator": "GIF", + "loadFailed": "加载失败", + "original": "原文件", + "preview": "预览", + "select": "选择", + "emptyList": "清空列表", + "unSupportedAssetType": "不支持该文件格式", + "unableToAccessAll": "无法访问设备上的所有文件", + "viewingLimitedAssetsTip": "应用程序仅能查看您允许的文件和相册。", + "changeAccessibleLimitedAssets": "点击以更改可访问文件范围", + "accessAllTip": "应用程序只能访问设备上的部分文件,请转到系统设置并允许该应用访问设备上的所有媒体文件。", + "goToSystemSettings": "转到系统设置", + "accessLimitedAssets": "继续受限访问", + "accessiblePathName": "可访问的文件", + "sTypeAudioLabel": "音频", + "sTypeImageLabel": "图片", + "sTypeVideoLabel": "视频", + "sTypeOtherLabel": "其他媒体文件", + "sActionPlayHint": "播放", + "sActionPreviewHint": "预览", + "sActionSelectHint": "选择", + "sActionSwitchPathLabel": "更改路径", + "sActionUseCameraHint": "使用摄像头", + "sNameDurationLabel": "时长", + "sUnitAssetCountLabel": "计数" + }, + "networkInterfacesPage": { + "title": "网络接口", + "info": "默认情况下,LocalSend 使用所有可用的网络接口。您可以在此处排除不需要的网络接口。您需要重新启动服务器以应用更改。", + "preview": "预览", + "whitelist": "白名单", + "blacklist": "黑名单" + } +} diff --git a/app/assets/i18n/zh-HK.json b/app/assets/i18n/zh-HK.json new file mode 100644 index 0000000..9c6b941 --- /dev/null +++ b/app/assets/i18n/zh-HK.json @@ -0,0 +1,458 @@ +{ + "locale": "繁體中文 (香港)", + "appName": "LocalSend", + "general": { + "accept": "接受", + "accepted": "已接受", + "add": "新增", + "advanced": "更多資訊", + "cancel": "取消", + "close": "關閉", + "confirm": "確認", + "continueStr": "繼續", + "copy": "複製", + "copiedToClipboard": "已複製到剪貼簿", + "decline": "拒絕", + "done": "完成", + "delete": "刪除", + "edit": "編輯", + "error": "錯誤", + "example": "範例", + "files": "檔案", + "finished": "搞掂", + "hide": "隱藏", + "off": "閂", + "offline": "離線", + "on": "開", + "online": "線上", + "open": "開啟", + "queue": "佇列", + "quickSave": "自動儲存", + "quickSaveFromFavorites": "自動儲存來自已收藏裝置嘅檔案", + "renamed": "改咗名", + "reset": "重設", + "restart": "重新啟動", + "settings": "設定", + "skipped": "已跳過", + "start": "開始", + "stop": "停止", + "save": "儲存", + "unchanged": "冇改過", + "unknown": "未知", + "noItemInClipboard": "剪貼簿冇嘢." + }, + "receiveTab": { + "title": "@:settingsTab.receive.title", + "infoBox": { + "ip": "IP:", + "port": "Port:", + "alias": "名:" + }, + "quickSave": { + "off": "關閉", + "favorites": "僅來自已收藏裝置嘅檔案", + "on": "來自所有裝置嘅檔案" + } + }, + "sendTab": { + "title": "@:settingsTab.send.title", + "selection": { + "title": "揀選", + "files": "檔案:{files}", + "size": "大細:{size}" + }, + "picker": { + "file": "檔案", + "folder": "資料夾", + "media": "媒體", + "text": "文字", + "app": "應用程式", + "clipboard": "貼上" + }, + "shareIntentInfo": "用你裝置嘅「分享」功能以更方便揀選檔案。", + "nearbyDevices": "附近裝置", + "thisDevice": "此裝置", + "scan": "掃描裝置", + "manualSending": "手動傳送", + "sendMode": "傳送模式", + "sendModes": { + "single": "單一接收者", + "multiple": "多個接收者", + "link": "用 link 分享" + }, + "sendModeHelp": "説明", + "help": "請確保目標裝置駁緊同一個 Wi‑Fi 網路。", + "placeItems": "將要分享嘅檔案拉過嚟呢度." + }, + "settingsTab": { + "title": "@:general.settings", + "general": { + "title": "一般", + "brightness": "亮度", + "brightnessOptions": { + "system": "跟機", + "dark": "暗色", + "light": "亮色" + }, + "color": "色彩", + "colorOptions": { + "system": "跟機", + "oled": "OLED" + }, + "language": "語言", + "languageOptions": { + "system": "跟機" + }, + "saveWindowPlacement": "退出嗰陣記低視窗位置", + "saveWindowPlacementWindows": "離開嗰陣記低視窗位置", + "minimizeToTray": "關閉嗰陣縮細做通知圖示", + "launchAtStartup": "開機自動啟動", + "launchMinimized": "自動啟動成通知圖示", + "showInContextMenu": "喺檔案功能表嘅「傳送到」項目顯示 LocalSend", + "animations": "動畫" + }, + "receive": { + "title": "接收", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "完成後自動關閉傳輸畫面", + "destination": "儲存位置", + "downloads": "(下載資料夾)", + "saveToGallery": "Save 落相簿", + "saveToHistory": "Save 去歷史紀錄" + }, + "send": { + "title": "傳送", + "shareViaLinkAutoAccept": "用 link 分享檔案嗰陣自動接收", + "@info": "Translating to 接收 rather than 接受 is intentional to reflect the actual usage." + }, + "network": { + "title": "網路", + "needRestart": "熄咗個 server 再開過,設定先會生效!", + "server": "Server", + "alias": "名", + "deviceType": "裝置類型", + "deviceModel": "裝置型號", + "port": "Port", + "discoveryTimeout": "裝置搜尋逾時", + "useSystemName": "使用系統名稱", + "generateRandomAlias": "求其改個名", + "portWarning": "改 port 嘅話其他裝置有機會偵測唔到你。(預設:{defaultPort})", + "encryption": "加密傳送", + "multicastGroup": "多播 IP 地址", + "multicastGroupWarning": "用自訂多播地址嘅話其他裝置有機會偵測唔到你。(預設:{defaultMulticast})", + "network": "網絡", + "networkOptions": { + "all": "全部", + "filtered": "已過濾" + } + }, + "other": { + "title": "其他", + "support": "支援 LocalSend", + "donate": "捐款", + "privacyPolicy": "私隱權政策", + "termsOfUse": "服務條款" + }, + "advancedSettings": "進階設定" + }, + "troubleshootPage": { + "title": "疑難排解", + "subTitle": "個 app 唔 work?你可以喺度揾到一啲常見問題嘅解決辦法。", + "solution": "解決辦法:", + "fixButton": "自動修復", + "firewall": { + "symptom": "我 send 到嘢但係接收唔到。", + "solution": "應該係防火牆嘅問題,可以透過允許接受 port {port} 嘅連線(UDP 同 TCP)嚟解決。", + "openFirewall": "開啟防火牆設定" + }, + "noDiscovery": { + "symptom": "呢部機偵測唔到其他裝置。", + "solution": "請確保所有裝置都駁緊同一個 Wi‑Fi 網路同用緊相同嘅設定(port、多播 IP 地址同有冇開加密傳送)。你亦都可以試下人手輸入目標裝置嘅 IP 地址。如果 work 嘅話可以選擇收藏呢部裝置,噉樣日後就會自動偵測到佢,毋須重新輸入。" + }, + "noConnection": { + "symptom": "兩部裝置都偵測唔到同 send 唔到嘢畀對方。", + "solution": "如果兩邊都發生同樣嘅情況,你要 check 清楚兩邊係咪駁緊同一個 Wi‑Fi 網路同用緊相同嘅設定(port、多播 IP 地址同有冇開加密傳送)。亦可能係個 Wi‑Fi 唔畀裝置之間通訊,呢種情況下要喺 router 嗰邊熄咗「接入點 (AP) 隔離」模式至得。" + } + }, + "receiveHistoryPage": { + "title": "歷史記錄", + "openFolder": "開啟資料夾", + "deleteHistory": "清除記錄", + "empty": "得個吉噃 :(.", + "entryActions": { + "open": "@:dialogs.openFile.title", + "showInFolder": "喺檔案瀏覽器顯示", + "info": "資訊", + "deleteFromHistory": "刪走呢筆記錄" + } + }, + "apkPickerPage": { + "title": "應用程式(APK)", + "excludeSystemApps": "排除系統應用程式", + "excludeAppsWithoutLaunchIntent": "排除唔開得嘅應用程式", + "apps": "{n} 個應用程式" + }, + "selectedFilesPage": { + "deleteAll": "全部刪除" + }, + "receivePage": { + "subTitle": { + "one": "想 send 1 個檔案畀你", + "other": "想 send {n} 個檔案畀你" + }, + "subTitleMessage": "send 咗條訊息畀你:", + "subTitleLink": "send 咗條 link 畀你:", + "canceled": "對方取消咗個請求。" + }, + "receiveOptionsPage": { + "title": "@:general.settings", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend 資料夾)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "因為有資料夾存在而自動閂咗." + }, + "sendPage": { + "waiting": "等緊回應……", + "rejected": "對方拒絕咗個請求。", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "對方忙緊另一個請求。" + }, + "progressPage": { + "titleSending": "正在傳送檔案", + "titleReceiving": "正在接收檔案", + "savedToGallery": "成功 save 咗落相簿", + "total": { + "title": { + "sending": "進度:{time}", + "finishedError": "搞掂,不過有 error", + "canceledSender": "傳送者取消咗", + "canceledReceiver": "接收者取消咗" + }, + "count": "檔案:{curr} / {n}", + "size": "大細:{curr} / {n}", + "speed": "速度:{speed}/s" + } + }, + "webSharePage": { + "title": "@:sendTab.sendModes.link", + "loading": "開緊個 server……", + "stopping": "閂緊個 server……", + "error": "開 server 嗰陣發生錯誤。", + "openLink": { + "one": "喺瀏覽器開啟以下連結:", + "other": "喺瀏覽器開啟以下任何一個連結:" + }, + "requests": "請求", + "noRequests": "未有請求.", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "自動接受請求", + "requirePin": "需要密碼", + "pinHint": "密碼為「{pin}」", + "encryptionHint": "LocalSend 用嘅係自我簽署憑證。麻煩你喺瀏覽器度允許咗佢。", + "pendingRequests": "仲有 {n} 個請求未處理" + }, + "aboutPage": { + "title": "關於 LocalSend", + "description": [ + "LocalSend 係一款免費嘅開源應用程式,佢可以透過區域網路幫你安全噉將檔案同訊息分享畀附近嘅裝置,全程無需互聯網連線。", + "呢個 app 喺 Android、iOS、macOS、Windows 同 Linux 都用得㗎。你可以喺我哋嘅網站揾到呢個 app 所有平台嘅版本同其他下載方式。" + ], + "author": "作者", + "contributors": "貢獻者", + "packagers": "封裝人員", + "translators": "翻譯人員" + }, + "donationPage": { + "title": "@:settingsTab.other.donate", + "info": "LocalSend 唔單只免費、開源,仲係冇廣告添㗎!如果你鍾意呢個 app,不妨捐款贊助我哋開發.", + "donate": "捐 {amount}", + "thanks": "多謝支持!", + "restore": "還原 app 內購買" + }, + "changelogPage": { + "title": "更新記錄" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "將檔案加至選擇", + "content": "您想新增什麼檔案?" + }, + "openFile": { + "title": "開啟檔案", + "content": "你係咪要開啟接收咗嘅檔案?" + }, + "addressInput": { + "title": "輸入地址", + "hashtag": "Hashtag", + "ip": "IP 地址", + "recentlyUsed": "輸入記錄: " + }, + "cancelSession": { + "title": "取消檔案傳輸", + "content": "你係咪要放棄傳輸檔案?" + }, + "cannotOpenFile": { + "title": "無法開啟檔案", + "content": "檔案「{file}」開唔到喎,係咪畀人郁過、改過名或者剷走咗?" + }, + "encryptionDisabledNotice": { + "title": "加密已停用", + "content": "而家會透過未經加密嘅 HTTP 協定嚟通訊。要用 HTTPS 請開返加密。" + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "收藏", + "noFavorites": "未收藏任何裝置.", + "addFavorite": "@:general.add" + }, + "favoriteDeleteDialog": { + "title": "取消收藏裝置", + "content": "你係咪要取消收藏裝置「{name}」?" + }, + "favoriteEditDialog": { + "titleAdd": "新增至收藏", + "titleEdit": "編輯", + "name": "名", + "auto": "(自動)", + "ip": "IP 地址", + "port": "Port" + }, + "fileInfo": { + "title": "檔案資訊", + "fileName": "檔案名稱:", + "path": "路徑:", + "size": "大小:", + "sender": "傳送者:", + "time": "時間:" + }, + "fileNameInput": { + "title": "輸入檔案名稱", + "original": "原名:{original}" + }, + "historyClearDialog": { + "title": "清除歷史記錄", + "content": "你係咪真係要剷走全部歷史記錄?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "喺冇權掃描區域網路嘅情況下 LocalSend 唔會偵測到其他裝置。麻煩你喺系統設定開返呢個權限。", + "gotoSettings": "開啟系統設定" + }, + "messageInput": { + "title": "輸入訊息", + "multiline": "多行" + }, + "noFiles": { + "title": "冇揀選檔案", + "content": "最少需要揀選一個檔案。" + }, + "noPermission": { + "title": "權限閂咗", + "content": "你冇畀足夠權限我哋進行處理。麻煩你喺系統設定開返啲權限。" + }, + "notAvailableOnPlatform": { + "title": "無法使用", + "content": "此功能只適用於:" + }, + "qr": { + "title": "QR Code" + }, + "quickActions": { + "title": "快速動作", + "counter": "計數器", + "prefix": "前綴", + "padZero": "補零", + "sortBeforeCount": "事前跟字母排序", + "random": "隨機" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "自動接受所有檔案傳輸請求。留意返,噉樣會令呢個網路嘅所有人都 send 得嘢畀你。" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "自動接受來自已收藏裝置嘅檔案傳輸請求。", + "警告:目前呢個選項並非絕對安全,因為只要黑客攞到你任何一部已收藏裝置嘅指紋,佢就可以無限制噉 send 嘢畀你。", + "不過揀已收藏裝置點都安全過揀所有裝置嘅。" + ] + }, + "pin": { + "title": "@:web.enterPin" + }, + "sendModeHelp": { + "title": "@:sendTab.sendMode", + "single": "淨係 send 畀一部裝置,傳輸完成後會清除揀選項目。", + "multiple": "一次過 send 畀多部裝置,揀選項目會一路保留。", + "link": "冇裝 LocalSend 嘅裝置可以透過條 link 嚟 download 返揀選嘅項目。" + }, + "zoom": { + "title": "網址" + } + }, + "sanitization": { + "empty": "檔案名稱唔可以係吉嘅", + "invalid": "檔案名稱唔可以包括唔用得嘅字元" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "退出 LocalSend", + "closeWindows": "離開" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "輸入密碼", + "invalidPin": "密碼無效", + "tooManyAttempts": "嘗試次數過多,請稍後再試", + "rejected": "已遭對方拒絕", + "files": "@:general.files", + "fileName": "檔案名稱", + "size": "大細" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "@:general.confirm", + "cancel": "@:general.cancel", + "edit": "@:general.edit", + "gifIndicator": "GIF", + "loadFailed": "載入失敗", + "original": "原始檔案", + "preview": "預覽", + "select": "揀選", + "emptyList": "列表冇嘢", + "unSupportedAssetType": "檔案類型唔支援。", + "unableToAccessAll": "無法存取裝置入面所有檔案", + "viewingLimitedAssetsTip": "你淨係可以睇到個 app 能夠存取嘅檔案同相簿。", + "changeAccessibleLimitedAssets": "撳呢度更新可存取檔案", + "accessAllTip": "個 app 只能夠存取裝置入面部分檔案。要存取所有媒體,你要去系統設定開返個權限。", + "goToSystemSettings": "開啟系統設定", + "accessLimitedAssets": "喺限制存取嘅情況下繼續", + "accessiblePathName": "可存取檔案", + "sTypeAudioLabel": "音樂", + "sTypeImageLabel": "相片", + "sTypeVideoLabel": "影片", + "sTypeOtherLabel": "其他媒體", + "sActionPlayHint": "播放", + "sActionPreviewHint": "@:assetPicker.preview", + "sActionSelectHint": "@:assetPicker.select", + "sActionSwitchPathLabel": "更改路徑", + "sActionUseCameraHint": "影相", + "sNameDurationLabel": "持續時間", + "sUnitAssetCountLabel": "數量" + }, + "networkInterfacesPage": { + "info": "LocalSend 預設使用所有可用的網路介面。您可以在這裡排除不需要的網路。您需要重新啟動伺服器才能套用變更。", + "title": "網路介面", + "preview": "預覽", + "whitelist": "白名單", + "blacklist": "黑名單" + } +} diff --git a/app/assets/i18n/zh-TW.json b/app/assets/i18n/zh-TW.json new file mode 100644 index 0000000..a1f9f44 --- /dev/null +++ b/app/assets/i18n/zh-TW.json @@ -0,0 +1,461 @@ +{ + "locale": "繁體中文 (台灣)", + "appName": "LocalSend", + "general": { + "accept": "接受", + "accepted": "已接受", + "add": "新增", + "advanced": "進階", + "cancel": "取消", + "close": "關閉", + "confirm": "確認", + "continueStr": "繼續", + "copy": "複製", + "copiedToClipboard": "已複製到剪貼簿", + "decline": "拒絕", + "done": "完成", + "delete": "刪除", + "edit": "編輯", + "error": "錯誤", + "example": "範例", + "files": "檔案", + "finished": "已完成", + "hide": "隱藏", + "off": "關閉", + "offline": "離線", + "on": "開啟", + "online": "線上", + "open": "開啟", + "queue": "佇列", + "quickSave": "自動儲存", + "quickSaveFromFavorites": "自動儲存來自「最愛」裝置的檔案", + "renamed": "已重新命名", + "reset": "復原變更", + "restart": "重新啟動", + "settings": "設定", + "skipped": "已跳過", + "start": "開始", + "stop": "停止", + "save": "儲存", + "unchanged": "未變更", + "unknown": "未知", + "noItemInClipboard": "剪貼簿中沒有內容。" + }, + "receiveTab": { + "title": "接收", + "infoBox": { + "ip": "IP:", + "port": "通訊埠:", + "alias": "裝置名稱:" + }, + "quickSave": { + "off": "@:general.off", + "favorites": "最愛", + "on": "@:general.on" + } + }, + "sendTab": { + "title": "傳送", + "selection": { + "title": "選取", + "files": "檔案:{files}", + "size": "大小:{size}" + }, + "picker": { + "file": "檔案", + "folder": "資料夾", + "media": "媒體", + "text": "文字", + "app": "應用程式", + "clipboard": "貼上" + }, + "shareIntentInfo": "您也可以使用您的行動裝置中的「分享」功能更簡單地選取檔案。", + "nearbyDevices": "附近的裝置", + "thisDevice": "此裝置", + "scan": "尋找裝置", + "manualSending": "手動傳送", + "sendMode": "傳送模式", + "sendModes": { + "single": "單一接收者", + "multiple": "多重接收者", + "link": "透過連結分享" + }, + "sendModeHelp": "說明", + "help": "請確保所需目標的處於相同的 Wi‑Fi 網路。", + "placeItems": "列出要分享的項目。" + }, + "settingsTab": { + "title": "設定", + "general": { + "title": "一般", + "brightness": "主題", + "brightnessOptions": { + "system": "系統", + "dark": "深色", + "light": "淺色" + }, + "color": "色彩", + "colorOptions": { + "system": "系統", + "oled": "OLED" + }, + "language": "語言", + "languageOptions": { + "system": "系統" + }, + "saveWindowPlacement": "退出時儲存視窗位置", + "saveWindowPlacementWindows": "離開時儲存視窗位置", + "minimizeToTray": "關閉時最小化至系統匣", + "launchAtStartup": "登入後自動啟動", + "launchMinimized": "自動啟動至系統匣", + "showInContextMenu": "在檔案功能表「傳送到」項目中顯示 LocalSend", + "animations": "動畫" + }, + "receive": { + "title": "接收", + "quickSave": "@:general.quickSave", + "quickSaveFromFavorites": "@:general.quickSaveFromFavorites", + "requirePin": "@:webSharePage.requirePin", + "autoFinish": "自動完成傳送任務", + "destination": "儲存目錄", + "downloads": "(下載)", + "saveToGallery": "儲存媒體至相簿", + "saveToHistory": "儲存至歷史記錄" + }, + "send": { + "title": "傳送", + "shareViaLinkAutoAccept": "透過連結分享:自動同意接收要求" + }, + "network": { + "title": "網路", + "needRestart": "重新啟動伺服器以套用設定!", + "server": "伺服器", + "alias": "裝置名稱", + "deviceType": "裝置類型", + "deviceModel": "裝置型號", + "port": "通訊埠", + "discoveryTimeout": "探索裝置逾時", + "useSystemName": "使用系統名稱", + "generateRandomAlias": "隨機產生別名", + "portWarning": "您可能無法被其他裝置偵測,因為您正在使用自訂通訊埠。(預設:{defaultPort})", + "encryption": "加密", + "multicastGroup": "多點傳送", + "multicastGroupWarning": "您可能無法被其他裝置偵測,因為您正在使用自訂多點傳送位址。(預設:{defaultMulticast})", + "network": "網路", + "networkOptions": { + "all": "全部", + "filtered": "已篩選" + } + }, + "other": { + "title": "其它", + "support": "支持 LocalSend", + "donate": "贊助", + "privacyPolicy": "隱私權政策", + "termsOfUse": "使用條款" + }, + "advancedSettings": "進階設定" + }, + "troubleshootPage": { + "title": "疑難排解", + "subTitle": "這個應用程式並未如預期運作?在這裡您可以找到常見的解決方案。", + "solution": "解決方案:", + "fixButton": "自動修正", + "firewall": { + "symptom": "此應用程式可以向其他裝置傳送檔案,但其他裝置無法向此裝置傳送檔案。", + "solution": "這很可能是防火牆問題。您可以透過允許通訊埠 {port} 上的連入連線 (UDP 和 TCP) 以解決此問題。", + "openFirewall": "開啟防火牆" + }, + "noDiscovery": { + "symptom": "本裝置無法探索其他裝置。", + "solution": "請確保所有裝置都在同一個 Wi‑Fi 網路上並共用相同的設定 (通訊埠、多點傳送位址、加密選項)。您可以嘗試手動輸入目標裝置的 IP 位址。如果這樣可以運作,考慮將此裝置新增至最愛,以便未來可以自動偵測到。" + }, + "noConnection": { + "symptom": "兩部裝置無法探索彼此,也無法分享檔案。", + "solution": "雙方都存在問題?然後你需要確保兩部裝置處於相同的 Wi‑Fi 網路中並共用相同的組態 (通訊埠、多點傳送位址、加密選項)。Wi‑Fi 可能不允許參與者之間進行通訊。在這種狀況下,必須在路由器上停用「存取點 (AP) 隔離」選項。" + } + }, + "receiveHistoryPage": { + "title": "歷史記錄", + "openFolder": "開啟資料夾", + "deleteHistory": "刪除歷史記錄", + "empty": "沒有歷史記錄。", + "entryActions": { + "open": "開啟檔案", + "showInFolder": "在資料夾中顯示", + "info": "資訊", + "deleteFromHistory": "從歷史記錄刪除" + } + }, + "apkPickerPage": { + "title": "應用程式 (APK)", + "excludeSystemApps": "排除系統應用程式", + "excludeAppsWithoutLaunchIntent": "排除不可啟動的應用程式", + "apps": "{n} 個應用程式" + }, + "selectedFilesPage": { + "deleteAll": "全部刪除" + }, + "receivePage": { + "subTitle": { + "one": "要傳送一個檔案給您", + "other": "要傳送 {n} 個檔案給您" + }, + "subTitleMessage": "已傳送一則訊息給您:", + "subTitleLink": "已傳送一個連結給您:", + "canceled": "傳送者已取消要求。" + }, + "receiveOptionsPage": { + "title": "選項", + "destination": "@:settingsTab.receive.destination", + "appDirectory": "(LocalSend 資料夾)", + "saveToGallery": "@:settingsTab.receive.saveToGallery", + "saveToGalleryOff": "因內容存在資料夾而自動關閉。" + }, + "sendPage": { + "waiting": "正在等候回應…", + "rejected": "接收者拒絕了要求。", + "tooManyAttempts": "@:web.tooManyAttempts", + "busy": "接收者正忙於處理另一個要求。" + }, + "progressPage": { + "titleSending": "正在傳送檔案", + "titleReceiving": "正在接收檔案", + "savedToGallery": "已儲存至相簿", + "total": { + "title": { + "sending": "整體進度 ({time})", + "finishedError": "已完成,但發生錯誤", + "canceledSender": "傳送者已取消", + "canceledReceiver": "接收者已取消" + }, + "count": "檔案:{curr} / {n}", + "size": "大小:{curr} / {n}", + "speed": "速度:{speed}/s" + }, + "remainingTime": { + "hours": "{h}小時 {m}分鐘", + "days": "{d}天 {h}小時 {m}分鐘" + } + }, + "webSharePage": { + "title": "透過連結分享", + "loading": "正在啟動伺服器…", + "stopping": "正在關閉伺服器…", + "error": "啟動伺服器時發生錯誤。", + "openLink": { + "one": "在瀏覽器開啟此連結:", + "other": "在瀏覽器中開啟其中一個連結:" + }, + "requests": "要求", + "noRequests": "目前沒有任何要求。", + "encryption": "@:settingsTab.network.encryption", + "autoAccept": "自動接受請求", + "requirePin": "需要 PIN 碼", + "pinHint": "PIN 碼是「{pin}」", + "encryptionHint": "LocalSend 使用自簽署憑證。您需要在瀏覽器中接受它。", + "pendingRequests": "待處理的要求:{n}" + }, + "aboutPage": { + "title": "關於 LocalSend", + "description": [ + "LocalSend 是一款免費的開源應用程式,可讓您透過區域網路與鄰近的裝置安全的分享檔案和訊息,無需網際網路連線。", + "此應用程式可在 Android、iOS、macOS、Windows 和 Linux 上使用。 您可以在官網首頁上找到所有下載選項。" + ], + "author": "作者", + "contributors": "貢獻者", + "packagers": "封裝人員", + "translators": "翻譯人員" + }, + "donationPage": { + "title": "贊助", + "info": "LocalSend 是免費、開源且沒有任何廣告的。如果您喜歡此應用程式,可以透過捐贈來支持開發。", + "donate": "贊助 {amount}", + "thanks": "非常感謝您!", + "restore": "復原購買" + }, + "changelogPage": { + "title": "變更記錄" + }, + "aliasGenerator(ignoreMissing, ignoreGpt)": { + "@info": "Inherits from the English version" + }, + "dialogs": { + "addFile": { + "title": "新增檔案", + "content": "您想要新增什麼檔案?" + }, + "openFile": { + "title": "開啟檔案", + "content": "您想開啟接收到的檔案嗎?" + }, + "addressInput": { + "title": "輸入位址", + "hashtag": "雜湊標記", + "ip": "IP 位址", + "recentlyUsed": "最近使用: " + }, + "cancelSession": { + "title": "取消檔案傳輸", + "content": "您確定要取消檔案傳輸嗎?" + }, + "cannotOpenFile": { + "title": "無法開啟檔案", + "content": "無法開啟「{file}」,這個檔案已被移動、重新命名或刪除了嗎?" + }, + "encryptionDisabledNotice": { + "title": "加密已停用", + "content": "目前的通訊透過未經加密的 HTTP 通訊協定執行。若要使用 HTTPS,請再次啟用加密。" + }, + "errorDialog": { + "title": "@:general.error" + }, + "favoriteDialog": { + "title": "最愛", + "noFavorites": "還沒有最愛的裝置。", + "addFavorite": "新增" + }, + "favoriteDeleteDialog": { + "title": "從最愛中刪除", + "content": "您確定要從最愛中刪除「{name}」嗎?" + }, + "favoriteEditDialog": { + "titleAdd": "新增至最愛", + "titleEdit": "設定", + "name": "裝置名稱", + "auto": "(自動)", + "ip": "IP 位址", + "port": "連接埠" + }, + "fileInfo": { + "title": "檔案資訊", + "fileName": "檔案名稱:", + "path": "路徑:", + "size": "大小:", + "sender": "傳送者:", + "time": "時間:" + }, + "fileNameInput": { + "title": "輸入檔案名稱", + "original": "原始檔案名稱:{original}" + }, + "historyClearDialog": { + "title": "清除歷史記錄", + "content": "您真的要刪除整個歷史記錄嗎?" + }, + "localNetworkUnauthorized": { + "title": "@:dialogs.noPermission.title", + "description": "在未取得掃描區域網路權限的狀況下 LocalSend 無法找到其他裝置,請在設定中授予此權限。", + "gotoSettings": "設定" + }, + "messageInput": { + "title": "輸入訊息", + "multiline": "多行" + }, + "noFiles": { + "title": "未選取檔案", + "content": "請至少選取一個檔案。" + }, + "noPermission": { + "title": "沒有權限", + "content": "您尚未授予必要的權限。請在設定中授予權限。" + }, + "notAvailableOnPlatform": { + "title": "無法使用", + "content": "此功能僅適用於:" + }, + "qr": { + "title": "QR 圖碼" + }, + "quickActions": { + "title": "快速動作", + "counter": "計數器", + "prefix": "前置詞", + "padZero": "字元零填補", + "sortBeforeCount": "事先依字母排序", + "random": "隨機" + }, + "quickSaveNotice": { + "title": "@:general.quickSave", + "content": "自動接受所有檔案要求。請注意,區域網路中的所有人都可以傳送檔案給您。" + }, + "quickSaveFromFavoritesNotice": { + "title": "@:general.quickSaveFromFavorites", + "content": [ + "自動接受來自您最愛清單中裝置傳送的檔案。", + "警告:目前這並非絕對安全,因為知道您最愛裝置指紋的駭客仍然可以向您傳送檔案。", + "但仍然比允許任何裝置更安全。" + ] + }, + "pin": { + "title": "@:web.enterPin" + }, + "sendModeHelp": { + "title": "傳送模式", + "single": "傳送檔案至單個接收者,選取項目將在檔案傳輸完成後被清除。", + "multiple": "傳送檔案至多重接收者,選取項目將不會被清除。", + "link": "未安裝 LocalSend 的接收者可以透過在瀏覽器開啟連結以下載選取的檔案." + }, + "zoom": { + "title": "網址" + } + }, + "sanitization": { + "empty": "檔案名稱不能為空", + "invalid": "檔案名稱包含無效字元" + }, + "tray": { + "@info": "Apple Guidelines are very strict about the 'close' wording.", + "open": "@:general.open", + "close": "退出 LocalSend", + "closeWindows": "離開" + }, + "web": { + "waiting": "@:sendPage.waiting", + "enterPin": "輸入 PIN 碼", + "invalidPin": "PIN 碼無效", + "tooManyAttempts": "嘗試次數過多,請稍後再試", + "rejected": "遭到拒絕", + "files": "檔案", + "fileName": "檔案名稱", + "size": "大小" + }, + "assetPicker": { + "@info": "Translations for the Media selection tool for Android and Iphone", + "confirm": "確認", + "cancel": "取消", + "edit": "編輯", + "gifIndicator": "GIF", + "loadFailed": "載入失敗", + "original": "原始檔案", + "preview": "預覽", + "select": "選取", + "emptyList": "空白清單", + "unSupportedAssetType": "不支援的檔案類型。", + "unableToAccessAll": "無法存取此裝置上的所有檔案", + "viewingLimitedAssetsTip": "僅檢視此應用程式可存取的檔案和相簿。", + "changeAccessibleLimitedAssets": "按一下以更新可存取的檔案", + "accessAllTip": "應用程式僅可存取此裝置的部分檔案,前往系統設定並允許應用程式存取此裝置上的所有媒體。", + "goToSystemSettings": "前往系統設定", + "accessLimitedAssets": "以受限制的存取繼續", + "accessiblePathName": "可存取的檔案", + "sTypeAudioLabel": "音樂", + "sTypeImageLabel": "圖片", + "sTypeVideoLabel": "影片", + "sTypeOtherLabel": "其他媒體", + "sActionPlayHint": "播放", + "sActionPreviewHint": "預覽", + "sActionSelectHint": "選取", + "sActionSwitchPathLabel": "變更路徑", + "sActionUseCameraHint": "使用相機", + "sNameDurationLabel": "持續時間", + "sUnitAssetCountLabel": "計數" + }, + "networkInterfacesPage": { + "info": "LocalSend 預設使用所有可用的網路介面,您可於此處排除不想使用的網路。您需要重新啟動伺服器以套用變更。", + "title": "網路介面", + "preview": "預覽", + "whitelist": "允許清單", + "blacklist": "禁止清單" + } +} diff --git a/app/assets/img/logo-128.png b/app/assets/img/logo-128.png new file mode 100644 index 0000000000000000000000000000000000000000..9affd87e13cdeedbd523497c427267adb15d1a37 GIT binary patch literal 1042 zcmV+t1nv8YP)C0000;P)t-s00000 zkBo4U_&~NWXk?U#~U$KTjqG-3Wi5;S3RO5O>im5qSZfO!Sv4&(jfl zKu6^R@cq(~d-}3Kfq6^JM(^}ZLjg_S-l54zHwXn7-He^$>*@t#>=J*5LUV@^yf-a# znp*RK(~W`(if%Ym*e3i{KozkzEmK>34wd+A1g;?gxA-k1nCi0ejFd^iQy^vI@C=@^c?R{S zq2UH3mJl&P5=Ledq!MfJ5)08Aq{ztgjHMzb(pHd=V#D_ksm#j4C5D9*7ruv*O2n_= zASKf6@l+&!1(x|R!1g~b_7-|tOlRQ`{yjyTy6F%zJ9#QRfSHQf@Bmci6I~!R8rek0 zn%KLGx$tMubyM+$id`d9@lRijFuWXN^E|{dD|Ytmf+VvflYv#TK>P|0QZC`5l&w?- zYl~7Dsp<_Cv60q>%y}?bFtu5jhLPqkLQ<@mqdPpB4F>8l-|!Xaf;ZfNK2+lkXr~+F zx6_UB+v$e*2aQ0%li}l5Er&kDt*9Nyr=i`kkvXNDk@ zo_4%u5Hu%dr`nAcu4Z=&ZWSimtL7=2Rze7lS?zt#UTfP9!1Ud?)KJXz+`9FzxOv^Y zegDzizL!m#Ak(fyuc7-K;m}>yzNzu}OZx~I6u`##8`*l0Np{<+z1AGM^t@jM;wxq` zhaJnXrF;OU>w!jFa-h*{2O7IzhDh9>pzv<_UW67|#uAb>LuH0Sbt_?LvdqR9b;Z~lyF{-yw}yml z!;GU|DC5Lu(aswoll=aP>k*J^tID8T%zu*mx-uq=~h5d^K07Arza0_?LC+-+GVpLlK zK)Ey(r44t`*z5VTb=6~e=-Vef4K!LlZqq$up5t{I%{7bDTPm6k;+Us0(x5y>29cAzh=)}%`mUc&15p?Cnc?tS zD?C@5mHq ziA7Cq>DS4LYMB84iy=M(AGY5O@lmP5ta5jZvclXm34? zy0obI!waBOf0NYKEQ9rbJP0pw02xZpR43Yi{v;M_JB(R39sb+C)e(6}NMgmRCM9|1 ziIVctXY9xe!{S%q`p(RXqYd*nOrnbZIBA#;Sp^ZcGMCbIT#wUgu}HfM zkbsgm^^OY=u3S7G1DiJcggei_uA&IYW56-HGlJnRY2_Nb@OZ^{N=?tvXBv4{y4O=2 z*p$D17rng?HrSSCa>PDswqsQh>f^0#w{=&l*AJcl?3)HXXi36N`{|+`5??cD(BfJs zR_N9jiY%x3^|m|9T%o^nO@i8}PEMCHF_#JV*lw#oym4A|{tnz}LcJc2UA{_E=1iS< zb(PC9a(sqJFZo&#%tg#azeTJ8A(6$auo#pL(*tB)9!euA=h>VrOG1#p)^dXXY z$|$La-Ru^ro|qS4_Nw9B;u(G!4}<2^toU$6!sA;*QqT6mc%xT0l3~PM3OwAk4fPo6 z?z?64)Q^-`qO?dUC5T@BmOjp{QlOEtG-P3ns~l4oRS2exEKivRLI`cDd!6Akkd`*Vi`rWJ$6;Qsv-)`$QNM5oV@wa$?Zl zw=urH$r}{Zs_A?K6eOx!Ctr3AYS*KF*UBXS^`I}b&J4=I{ zti6z>;ClexbHhVfg&>1RgcgN+$7fL5 zH@ZUj?9|k51BQS+9tNVZoPIpN)PG7e=9_ipiiMpvkQj^ko$1yMh~{LfI9Q5)_ity) zCwd@HsKt1)`iWp>=SE*Ld~4E!m+^x!f^!)d)Oj-THj@>ILYysmW+{yUd5)DDeAyis zc7AwA+ee^ax5LHrVF((tHXDpwW#iW&vUVJXXRA9RGE>@!g)DKK(@m*R)J~}=>&Uql zM*X}3{V*9a=pRCmih7)7&S_{Cqh@_Xo`G2VA=b;!rBgVJQFx-d<7n#b}z+1iaq*Sw0rd+#No^-52s(zkO?>$J^_ z1JB9^SV~dlJ?dI$htkjvdx~~Aj3aKAH~pci*KMVwbM`MVx8}*OF?n3$t&Wi=WKZu~ z8e!p^b*b1#hTF(0!F%uXgx6$QSRk-`NkmQtm`TqDB4+>VQ#b0musSg%V3`>0({P@6 z=+rOFdhI0YCa>_og3=UE69L0Wv=)*Nz!!Zz?q+WyE=a*D6Il~Kg&8`w1^H{B7TdC^ z&hy>*$JRT#*h5>lQ8^ed66^lYT`S3+Hn!L1oADi|Q-(1EUKbZ5TpP_*t6qi-nDU31 znzD;W7))xiZh{}Pr##6aE_GlE-{uoXcYu-j+1#Hh+5Y@&-p@ico-!rEaaXIT8F(rh zjkL>c3=1FxGdYS;{$*+Gip$s04b_(RhDm$f@Ye1ddqi9b|uHE($MyGIAa(HMSD;9nv zbkB52zL8INlX$^hp@mw)d95aQYq+@baq_+#8JvZTxafb$(=~TpY0zS~yVDKUw=e&T L)=u!(mMG#sHY(}U literal 0 HcmV?d00001 diff --git a/app/assets/img/logo-32-black.png b/app/assets/img/logo-32-black.png new file mode 100644 index 0000000000000000000000000000000000000000..871e5c93c4bba7bf306a39ee7664cdf57f3ab558 GIT binary patch literal 578 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dybpbvhu0VPKLDRP8H$dw(OM?7@ z85mjF*g3ek1%wq8l~q*Lb@cQtEQ3Qbv$7X0UUK%*{WPH*t>1sykZNkq^WA3c>Dg`IdJiVHLLIhCZT=uX+O4cF3?~* z^zuW`uKhfXGx*>9v-(iqdBCCe*9qkw|0UWFp4hg#hd192Nl;G*==d#Wz Gp$P!Z0L0(` literal 0 HcmV?d00001 diff --git a/app/assets/img/logo-32-white.png b/app/assets/img/logo-32-white.png new file mode 100644 index 0000000000000000000000000000000000000000..06933ce145426caccfd2f2b0751781b3d23b4b72 GIT binary patch literal 913 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U{nb332_B-|5FeAq@GcO#H1@+ z8M?qQiZ2QB3ua(sVrF4wW9Q%$5*8H`mz0u`m6KOcR8rQ})iW|Sx3sdcwX=6{jEIbi ziA_vSNli;HDlRRrtZHlT=<4q2?dzYoV)fc}8@6meaq`sZGiNW{z4zeZm#^Qx|M>aq z_n*K2Jl&=V0i)%hr;B4q#jUxQUj_*~inKi}-&MV9wko4gK+J^L)Ivu`Rqjp&##G}3 zBOj-tcmMU~c&SP*e8O&HfBt9MzE`XA zk#SU4>RNc=(Rh2ldNEmT=>_lK>_2@jVcCsouhzCSG5?%X~1;^rpRdR_BNmnT+8osYY`i1Fx_ISG~e zx)bN+McXA=PF&v7@T^tl(d4#>Us0azi`Des^NV;gckP*zRQWysD7((`PfO%Eq*Zlx zdfd8HtbD!FW~o~T8&gwwoaEtkCb#$2s<8H4%#-tIEts<9cwtZp3tLdv^?0?9A9N?V zY~h~QxqkJEhsU#vW*$6zC2ipbOV+-R+Lg2axdl(`=1Htia5|>Hq>1km-?yhlLdk2t zU&~Tkmm)9XEcGo#eQu6-<_3S^{4j}?^R8y4Ulp8o-QoZ9Tj$MHKBhBX`WLd|z>|5l o=OqIa`-L@@ZVlqE-c!$5cRs>DPyTEkFx@bCy85}Sb4q9e0BdO~=>Px# literal 0 HcmV?d00001 diff --git a/app/assets/img/logo-32.png b/app/assets/img/logo-32.png new file mode 100644 index 0000000000000000000000000000000000000000..88516a851927e8f469f994410b5d989012754c13 GIT binary patch literal 599 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 literal 0 HcmV?d00001 diff --git a/app/assets/img/logo-512.png b/app/assets/img/logo-512.png new file mode 100644 index 0000000000000000000000000000000000000000..3e20f217afd5a937edf5d07287c0b6557a7396ed GIT binary patch literal 4688 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 literal 0 HcmV?d00001 diff --git a/app/assets/img/logo.ico b/app/assets/img/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..8f99e2818e7db31b6fab2de75e4bbb6f438bab0c GIT binary patch literal 109492 zcmeHQ2|QHWAD5V zp+$R5<&}0RA>#l0X>M=+lVygnRrmAxI{R-u_uO;OIdhRnWRegGFEUA$WTinOIYFF8 z`+NhuNQ!k41JaVCMp}-;QiKSyp0@Zf@YIkTWobTP`MtM$SL~QRJif^9#Zuu8!#b#0 zh{&i~%XSEe?4_u-d#u1^)d)3xSJGE+S;2YqN4wL=-HZy3v6ulZ-S_RdIr{bukXmx$@fOW$^t z%^avED?=7^v~V;y(fLI06Jv`zOGyY09BHD%V9wBq7wF1(RdA}qlwIDBsE{Z$ z=zUeKdMx!3rtp?<=m_+vgp(etVFAETlY>AUH}8LJ9DN))*j zzjujL-!_D)XHG8jPszJ2JWzP4@Mn?+Wr)CiN=)oAD!7lhYPT z6%k_$P!qgq86jd#`8?XUn}u)qm`x7iTgZL_&!aB?*;#FR>{?f+Vtq#3>Xawz$jM}3 z((q33Zs&Ji@Aa8i{wz*b z??p-+O7iY#y#BV^X-yx$+<4V&Ydca$0}a!+u9OF)uwhGj(?9ReF*Lecy6nR-rVU!lynXvqY!S5iv%zVkhFXyYwE z3&jf93MWwg$7)yYSv+X^pv!Z6DO8JAik8W&ykxrNfwZ?!@QcE16|$+oLDC3H#dz&& zho)5}zE*m+;rS_&Co@o}FKP3s?9Pnw zsqqJoB!3!TzNcIDq{I6a1WF`JtOrbz-pd%zSVTW6W52D+<_+EUO$6of%NI(2(B5mt zrM#YyFF#*O(5{cU@|F<-wx5-l_r-G$pPm?-F4V{AHI?aTV4u0rIU&+K%W#%~;B9f| z>w&`ym6quZKD?WfkwU|T7{Tqd(dE?%$jmw#h+q=79;t#+_ZK7mOhXxJgZut~4xparge_UM}x+u6yUL z`qKB+pVT7Pr)A3m3i<|(_dOjFJE~NmuV8}fiTG{*cxb)4BQ_^u(#<`0MIr=E)?^-G zxGf3`mE0~ZZdQ6NRlIV~B~4Rj@@DS`p`^pdT?6P#69g7o`B<**vf!$4oN4Cpfy1NA z`k^??FBA33$>Et#FG_q`ZE{6ZCqAY3V1+SdpRnc?c_SdyS(ow85`A^+GMAxDOPI+?_V_P(y`LA<0Q)jjm?XO|1s}S zTE~5JyrlBx4OTyJ)JARdyzcs!yb^^kED}`Jm%4Q?`H*M2u*knhim!Hc?ow<}rt7{; z-~W7i&JEhi<+GK)Fs@&Z+RGRlP?_abDxe@cNJ1w!B>&D#sxo!x+h^qd)!MXoS$>)? zZG34;^wgwxz6^a2Z}Bh3Zp@MxyemUc(5~ywtkj7cZch^lqmLA+${KQDoNx$vaQ5Ie zQ^$^_gg@C$$t}6wb^nm^-2xeE*H7>HGgQhaKVx5xiB1CLT~W3sa|^|8%S-L+11cty zG*vr%{u(N|?TqvFTLwWpUnzF_pz$_YMa-jH^`}RZW<+Ob9qz-rbrysp0Amue(@z#QST7jYA zqTc!kw3d=5N4r)Hx2@<_v~F>^*M{`R0#ixJ+plf(aCOw&kRIB5_ujeVmmVU0n(%l` z-e8aU4~lLv?*8*Zy4TLi%yJcIb7rqk>E7Y;F;+2o2KrUrGK$wyDjsEp4YG|I^RO4m zIH%f+>302t#W~S1>NMLU@(EukKKUS^^l~six!mv7fZiUv zWeVJx8T+GY3Q^Zmgq2GMZ0%{Vj1idC;X~=o2%97ahupL4bE4A!9N*JNGxDI_S-HQm zhOR88x*MtG9D0;v_F49>f{nqD?rV>pmr`Dn89jfg-opiEHc`tvzO=6Ti?;e=f%MJ5 zOmSzMOM`k(TQJ_yX?wxI0oTWqLafRs2j^VL@3f2*VcsMA>qE0{d3v6TgAcm(mo2l| z{@kSFbq~tlH{RcO-e!CM%H~wkOtT)@x;bXyy>~y}H>Fa}Vb2Q9E0Zf!b8Sx=^^-j0 z=%B#x-T&-Eb^kw$h20`&zjF56bay`~Oz=&FRpOf=cEo>HCM zHvtlY3rQvm%17r21j($p^?dl7zGQI2YJl^qK%%!)zNZU&2kE7ymEjYRL#H~*5>o=dj zcrtXlGxh9%q?Eu**;=%5q6XLe;?hHlHHyykuv3?DUndme)2(YzLa>B&bWHa0i_bfn zDQ^+Dc5-?DNdkvdizCxrsgzsMFRTwn&Ay?qz;fG%1GKvr&AOz0(sH!;!*HLtQK#%~ z@`d8t6i)kpb-!soK*;!oiCBrY^oWQY$FqAGd(DQN=#U*$s?jC1O3dX^Uu)m$rM*I~ z_cJ7~`f}b)JI0WDP<^qk+NEOQ;Ee)y$Ezoto|C8(tG4;jxIQr_mj}L49Y-2CEHT&PYb0r2Qyel`;HrIOlV0Czr_pz7D=2#A-EX7vMtS-`tJvZ{2NJ)soFvd1!Bq1 zyU)5|{#->Zf>I@{=(MjyiYXWH;I^|xpcZM{B<4a#74fdqH$Q*7DE#I_wW(2Ljg07n zDfj=03B0lPi)1V%)}o;2ZOQ@v%qOE#*G+Zy>1OA4v%B*!vhr@v>z~r1)-pUsk=J?O zm@fUnler{m>W%x)C2y()lZWov|M;?@S`f`uPeor@AVYoe0`)+Hf%9*Pe_eKU*Zcf1 zx1zuYyI)^lpDO1rPZ4nODKr#I4G7CJm0efZEJiD8LaV@L^6Q@q0# z-9kVGfU-d3giy(=RO(RC2U|46?XSzH^-znT`ug{|!npSj z!<61XbXLZQ-8rF=BQ}_B9_(#6VmJNuzAO6=FqSZ8n{|%gI(d&6g>t_$eL}8+=X{xc z(r3gAGryi)^tR%JsJouK_TAD~_YVr_JpSC(a#xaq#(55E8#C-5`QG%!E=YLL*?XYI-?JC|K~$_VV?8kj=^!Z!bMA-mMM=u;9cRb zEGtiwv`nxlO)g!kGuk#uI#5(}_zVeXGs?5;GScAkQwnEa4>=y0Y`tvY&gxA4wC;1o zN?wHvUA26sMse!wzfiB=zA4_piwE^03s40eDLQ{GCA*uPT`PCOLhJ0h6mt4g<aT@Fm>vcc-3jr!YJN3%zf9~wShHOph*zl%po-5{Bh4Tc>t*kqK_!Dusc%%~ud zI|7Osz7-EgpQ(&>rN@o7Bb8h?F5j|PXSCcYadS}vOUQ`)P&v7SMym81i8q!fjkL6d zT{L^q9LBDD?0NHzbXi(ohLilpM8OQl1yn&h@w2x|)tROuuD*}&be&@AA>prcp^vCo zq=P}`3j@!i{gzjJRUf9_uhV_)gL@1wn8k(*dczZm%k{wId10X1wTNTQYas z`SnpBr;9%s@~7yDzNeEeMu@&BKQ&qy9zKal3ja)AMJbfFc~+v^J!nk6J@rlAgqP_q zs@mi)FAlBAiV(gOS*|GHlba}*o39`{{ABi=H8a%p1(WtTetEIhmT6~Mbvs_wR)%i0 zx!2A|om4xPl+P{e=SbBRPwF@&-{7*@vr3g7``=wt`ndj?@sgR#B3E6z{e*FdrcN`= z8>Z&ko1XH>{UTkRu9LgG^Z?^lz%f!(eWygg3BI9_fuiS78V@W)t~=Hlu5C)+B(@XK`6z-ee?63{e!lE~yGikvH@EbB7Y;vGBX$b8;T&h)!7ID?M>J-8)XteUem0-vDoU zoz7K0p0S_PE1oaiH`zkaF_qjmQOjM}UE;vF@JBo3a%b(NdoPi2*fvO|P0(K{qCG|*2rx2HND7P3 z{#tcs?~I;>e`(RyPaH_qRZQApWTGu>xMZk9vT?4mvcRS#I+hlN`Hy572MVVh^Or3| z`eKd|UD6dLrkUq2(y$(Ww2N@a>OUDTW7j%w^%lAU+!oeK0CH7?sdgD&6$?x zFVdgSl4FX;u00%d3xFFKPl|W=67iubw7lBr8O@crM&KEAoJGA5;15{`+o!HrxAV*5R%d0dAYR?GQ0A z9KZeKRzVG2_Y-3VSRZqHIQfxpOz_>yuHA=pwl_7OeQ<)R%BEo%!xW4Z``aH`CM0B@ zNKvG08qlL)#>>aM&x*`FPw5z^uV9@WvtZQI8GXbYM_j!Xe|(vip7G6~!FS^o$%}%+ zHimkJ~-)v;tKC0I$HDc?9!%Q)e^#0m9d3&_Dy zYp-3CR9bYYkMLOqRc2S=GYXC*|Da>{B~J=?YLUjj_RICL@=MJBWHe_|mjESS>o*y10rmC@F@U+r}UES8ae?EgDn0)>2nQgA!^V7O8<_u2J+cA19*=KgB zb`Cxak5 zC1L(H!h6T}Q*`q%ufPbqbECm-bO#A1v;BYbkbFks&H{hj9%(bxu2w<#?+bmWSP_9-4cn3_T-OQ zy55sW7xfl>pcY^3wX$dSr%mbp_wS!J^O?UkKmB#@hnrU3@wa>5FV|G3Y(e*sSofh( zW+nEtqx-~ldOp`OF?~Q&DVsLPx%c1jzr})-^Mk_5FYW3)Xn{I9q ztZt~Z10bk}vMf*T|amUpZr}Izs#-7%A_}4hO6qWH(Nf|HnW_{T@ z{SW%RKg44;24Ay{(4o2gOOsAwywJP88Je6Z|Cr<3Nvveh)&5N3s?DGz4ioZ>0ViUn?gN@g4{bhV}S!XSW0JLV2W5A@KAxoD*mV=* z7-h;Nvn`4tQMAYFdRuEulqd*V8!I?PSRJgR8%tum533OWup+{c86s6ViF9zwsZ@JL zWk`nS_OU_Qnq_3l*Nx`B7Yc8&eyKo0cQx4)7zQ!ujfVmyhws65$~EX44X z%=uT)Absm7Eyw%&pPo2AlnM4r99rN&^UWJHcO3bgglETGs(?mfhQG{klMw&h!% z(che+F3*pbdF`m^wEB$#*`xcB!7g#(GcA>+N0;Q^yfl^ZEOxEP@{DJ}k2@HS(sEi& zQ&8ig?gC{qN_IUfE{apSzE*GFOWZFjBNX*VA@&=fka z7(+frey-%4B$s6TwPIYSQkiRlR8NUH>Ak%>IaQLz1Wl>@n`CgmFj}aKZ-?aSeo|lx^#X6R^ z3Lkulq3?PW`ucoFGxeZldiH1cT%MV=A-%(iwDAld7|^#Jb=E#L(b`nZQ7>>UH6m1Y zjEkY#+ru4YoNZ%=&53vI?lNqSp!*B~9qp)f?~fj$EMNEKD`^S6bL@MYy${TclyWzn zBTswb5HR@6rZ3B=-7H=V&K*xK{1O#z^_Y54tvL2|^0-cF{m7}ybgWdpVn>Dhe3r2n z2($E=|E@a!#+chf(wOJED7gwBjJhvo|GZOh_IjD3(1~+y&x$EBaMzFDtsi>-qv`pM zjA%w&A0-!ITk^uf|mYfXfRH}YHb#mb?$4++LBDZPMSJPiF z@sLX{@02FyEEKCYW@_qS;p4(mvzS9WEh{xCelU3(J^4%dvz?4B^icsrw+fu{TX5R+ zMf9U5W+wJxl|AP5>)SP1O_~yvH|XBXwa@OJ_siQ&S-vTLOV_>vzJlJ0W!=?oeG!RU zm#OC2TP9OQ&*jUDQpKce*(ww{+RV7mebcUd@(4K*zr|@%r0sTTk|8;fd}T@LrT1Hm zs(Oy~9D3pu%rhvkt^DF?RXyiA5ivz$>HJl)i%(KB~X6Mv$vp%wT% zu)pZ7H6Iyj%ptLBi*`nmzF5o=E$Vpnz-aOPV}#vZinRrNWb%_Y4m_+r!pVy`9OLwLOJ5CgUDl1TZW6wT`8Mx`j_K-(f?j9ct?2K zi|OJ|hon&s3w0ftF}5P>sM(j(0-F9=GrO9TC*(|L7>W*}`W%$=u}Ya-{=uI~J+^Cc z=MCxW=-nATE)>HWE7LUV%Ba*GB4UvWm;Vi(rU7llQVtaINgPLog``FQ;#O5hEtu+0lg1Q(@}S7o_$*d{WO z)SsRgo1WEqW1jQXPje5k6C^E(vMmt^{Pbw~u?d;P!-NTypJm!c_OP zf9ed{uDA%%tA>9LH;g4&UZTt+&$L|qXO|~r<_N~j#i==3aRZ8s4N8{ltX3U!%tRusfuNj--+kK>wTq!k=Us}Qb*9X7{qxG{FAIKK5aqL>`2#$ z*|K})B~7ok8?M`JfcO@HflGC^_uLh!@unZ`&=S)RWXsRyvxg<8AvYl+z)e(n<2%JS!#>Xz89a8~`&$gjfO7>7kvC-qX}>IW z7mvvi{A{s*-`S1_!)SjAlseAa=qgyW!gArM+=SG_r<@nv98uIeZuhq3dhS|-$yN6} zg_l{H2v$nJx@Bn7Nmq1Rh0=n|u)BR14|0!Ndu^4}!LPC_E|075Rgcpv67`fE)cMZ6 z_>o_W)Xq*X5oUI?eB`dPRnBs$xm?h_!P1Kdsm&aiw{?`DZkICQl>;9MNmGQ?i+3IP ze2SjwZjkcSY(noh8{TOqJBk(=xqN*{9=bWR_)^GKBQ+&*qQGAcXD@Vcq^NDQF>o43 zCV6)b{`1H)QvdbO#`oHpKjoa&(%k96fw_vCq%|X^+pW9d6g+jiSJb3Csdd+Y1D^dsm(!W?ue_swZ{fdRj$}-lQ1N!&k&n|ErSy#!Crx!3Q84n8#6_7uCQn)auH1A% z+}MvHeKto>NAFrlDU=MSXO7UBp)PZ{+cx981IJ^sq}@$C+&qg{#|ZRRdmU}NFH2!j z<}go{)BEf)%_6&7CJcY(Xf6EZQ^5?Ts?v)&Z}yJ7aey(@an1RP3vz|m7+MO)Wko*O z95DznO6e;3A|YMhagpWo`_2!XcH9j*JpLaIx!gj1rEQbwX4L@_nwyVjyekm)S~+!3 zrDOk|!3sCLB?3JX?TzOtG1cWa`bAB`Rmbh`22}5mkNqrc(A}kv?CzHu2j%a|2TBJAU%2(0l(9zVf|*6( zq{otlXp zIKE~eWiu?c?V9x=V#gKRv&xwwYO?81w>b}tFc3SpG>W{W|MX2ZhGLP^{C!G&w)X0> zKL6UO^YWc3%0ixT?^FC{Ukh{hH7@cUeZZWthvE6A;KOSh32V*GIfo`J*4KF0QFw3v zLmOwE-1JWD&L;U|x*~TXdfoG%b<+CGgK2|aQC?g1FR$!kBrv7lfuoN^yaUH&-6^kf z@R%7sdJe3B46$EZ@ywjL|6sPB;uNLqC(C+%zP`L9eW<~ibvNW)-i^22sBIB6-DLaI ziKWzc)-EN2A)T`y4GHzsthQi`jnysnhv99QgG$qg!30n1tZI^X^mFR_PRcAeU!ztWu}gM$3*W8zA;O7 zXV&{a^(IvBA{poX%h0~QM8ZVMTVk8Rg&hL(qqAJzo3GBf&Kz_zwcufB>MB14voW78 zyxoP9*F!6}M3!iu-&@H{rjWM3-ENV`SZ@#t#aDVO55aNolbbh#ky$$NVI z1RdW>@Fm|> z0jIQ0G_np#NA|nf&%Kjc1*v-Y><^FrpkE#2N%?x6ZgRsaNj7-bjpacZSX&@vl|p#-t%7w!`v5yBrXk~z^W3Kn<;hz#6DeL% zIdS1(6{S&R%T$|Pd(Nnv{y}?GXc4g`)0|;wmyzv1vC7MMw0d?*yoOKj$mef2%n{vj zP-3jw#mEA~D{|?twf^mrlH8#e`G#zkmrvI7BG1HlbNN64-*mzByw5 zgvC1XULh9b2{QK5M&vTRuPS9{WXfVc_M~N=u*|=adr!0^-@S0yPD|@$$1MM?HeSE7 za_Y#cn96Bzx*&*gfHCn}f99)?=cr{)rjM6PmXURDEcxS7uj~V)NPQVAvMI%O)?4x; zDepV;&y%*9Gj`KYqPyVP=hyl#qKsc373%D|WS?_J)LK(Nsmj7(pNNAJ{p z^>C_`!K#(fIp#;z42Oi0_0pfZU7mY8&Y^6Ro_kho7R)ja0F7a*v99;kb`N z?p%wW({FEPNM)tY4$4t9SP_u@D$&@U9(%VFxnET0Wf6kmqkLxw9ut)^u7-mPuMel& zje0mhSu&=ppqqp@Y5I&!W~&$Y_lTJE$d7cStIf0cKIP{mwS^yzHaQ+W|I`fgCE_lB zpDeP9TJZo+SIZFFcJ0paRqY zR)BecRe(K!7{GZz79bCBiv^5h9+qL95C9$E1V9={OAzq;YGW2)`K2F(=;u(tRlp}e zHJ?!e^s)hA0OZvdAlSyt@k@x~=T~!&&jS0$0$v07?Q3r7A#apn7RvPdY8eZFy>X0B z0dVW5=B}5DGX1_<&H`ZX*=@-Gb6ZaH-<;3_;Cm6kqc+e7PzL<9#_y|zEdX}Mxp_q^ z_5tK=)xv83bnL)}jk>TMz!mTn(A>{>PWs3bc{l26Y`aD=Yom?822y|k!2ZVCgHEsM z1NPAV1Ax;<&6O?!UiQelF&F9zhytMQQjMX}p4))VWB~f?IRJfx_mWOibb|IufZc$P zfcpGi1?812;P{Oo(pXksTcjNfP;R2EIzWRMv(N@;i=TgS4vYqRssiExoOTXqicN{O zKvx1V65t6~4e$oc1XuvH09^o*fSUC@2vH`CV;+`i1F$Z(!M1AvNNWT@g5cAX5a_G} zaO$53c`8kz+m_pcZg|f-0&wi))E(0qfS>+C9a*~8W&^Yh+UTbm3qT)Pz!5-gIum(? zP)_;TI{@kkKwSyFYYWjetops zav8{u;~bp(Zg4(E===og{#4^$ZT>+W0jMjXcYPtwH_?Xe>H>LjjH3aFIc|MA5@iYP zO35Y&3wB8W5PCNhq7CVQcJXWkIfVcbfQIzqEML?FleVj-V4Fpauumkk!EXSy*$dm`de0H7^6?ZZtv0@}68djar;7rdJH z5^m&Vuk!`kxx;z6pZ;CHUdOW)!agFd3Ah6)0PMEnCXVmfEq(z{T$kYG{T_9}dA?1H z3)@Z@f^BSBHsZ$bL>=^jLrba%{BTXTp?y|DJ|cVvZ3efbob8bp+6aKQBJ9RZh`wl% zwPN6ddpY-cl;{f`m+2&P1+Yvzcm75Ts_rJ${9(_+#N816=hTPbisN+bq=Vu5qr~tUxwfQ0X-b|@qAK4yxGg$`6)wFX@Tsx@7@uB$9S2K5PoXz@CC}oi!S`Ci@pG$PtZ3%@Bh{+gKa7)plSvyzkqy?}@&OI{Y37c<5+gFMQs&$1$Jq zIcJEv{GJbR(FedzIL~iSb3IO9*Of+{e!mwq&qMMXkZsy)5SHkrrNlzx5u^17F{c5cPj8E)%LAg$e#sB1M#I?P)?mK?T*W%9sur1E3W&=_Hv)KCt#vv~jKM-j}1CsEd2Zd^tx{m!d!)&r#rBI>GZ-3DLIw>aq(z@_{~{+pFtr z#CP6MXC9y~yW?JelfHLYpDsWXRLP#FuYhviBdLS>L!* zpFBTP+4uX9-8M~$qptuB-B(wk4*DMFekFj0Y&xVAY>NDNMu^I8qo%}xmIZ(tdGPot!pmY#P_XseGLObG!bFYyY?hz>VC$_kXyv6F0WxtkYWiKe+eD z?HMe7@BapJ+3z@Q^)se7@$244I$&3B_kVHkpWE{vtNASB@ADu3jVJs*|FMS4dkcO4 z`~25`erS!cr4)S7n&-c$z`vny38G#2_I^r?BS4dzchA=FNlWr? z1+Gu$-{-&Uw@-bxYpATX&VOg4@9~1Lq2GV({#KK}e}S(YfSa+WAse>Wa=fpa>-QhQ zK)XJ>gc06^diA{n;BSbU?b|g#JE8$O>(imVmxU8P;CBc%RR-X1_v*6I_i+d6;BPQ% ztM?W1TjKYh$fq{`KXV@L&wu|7CcpiU^w4*Jx@_B*;0bl={QWol?}28$fH%r{67Vzo zx;EX8q3+Fjq3?i)D}eJX0IoNF|NS@00O{8L{sX6swb|@v$@>EKZZqG1VEKO*$dm%W zZ-j_6XTPkCHt_uY{g>Jd!>2s3uNYu1AQkY#_g~t`_n)4FY(L9AUY8y(Ku5l=_wdq1 zfOoCmf8vEkbJYde#sIiEw_KNP+j>6g#@Dsp=JG{r(FObb%+G;lSx0FtUo{6`@IQX1 zEECYy?`2-)L!DZDUez2vYHpffCnW&$C+Y*JOS7$^HMc)ngFe^`f5Y}OoDo7D`1ae$ z*6>AZ@dUg5{{IiHW&Ae6mo*Nw$7cb`{QJJ=Lq7sL;(VYz%?VM~-_LtK_?{pE_7nl& zH|^T;`T)v?@2@}QJRkHT0Vn_}fK2$NB}3qg=LT^Njo0_D=B|%xm#y+`f8g6}|Njwa zqtA5!0e}oZAprl^=o3H!U=g6T{{JiPqcpc)8={Zi_JI9>y7rI>+u#`Ava|Mzg%*S zt$?m0fLs4#J)A2IuAl1f(z+~wwqx0l7n?iQMX#y(aGn&O1BU^;$ny^B^X=P)P1T{j zv`3o((007o8hyjpai7y(KwlPck4L%QK>go+fYX?Dq|sIYv>7kHzYq0g>mbS3Y~X`) zsE<6#hkg0?v!DS_pp5{$-uLJW{RT+$wHWw00C0_omp+Q~0b9Nb@)HpQ+t>imM!eV* zec;g2W&obJHcaDDR@4jUvhJ%VrbK%XGjQ{TO&kW0ld!hv47xmwoTpl zoc3eQ2XJ1(ZGR@}E#jp0v!=l|cy5Q#o7*s=tvv4=@(bvO?*;f?!pr(VVncL)mU6HQ zp4sBo?`T7O&u-OuKCiY1c|qu!H6m`;37IirbXviM-p-zjg>2j$8&(%N=+%sxu->?wsw5u_WXG1^( z)DeKX*5`k;Rg3K9G)9NUv;lo^+;arfb%rDZ%6|F_bp)WUwfP@y;|TM-pY}Nj`l$f$ zd=jVr>-gb(peq3w3Gf800pPc=X96q$+JG(qNdWQfQ}hSMF%Qe|cgI*4+hE((0HlR9 zCHN#`0MO#pAJ5k{%eftX$jna~peK$6c&3y%SB!JqCY_^)_R0YK=4C_kO+4R;zZXDM zut21-jMFddX{5ay(4^n?L3SvP;{ElKO+sKMFsqHS9Q%*L?TIli+%fxYOvtv& z_`^9KaE=!>>1sv|H;gl|A?w1noZ}Jac=dgFMX_LP;T-Qc$3xEX5{&bm9o%6kJN|`> zRYF6J@nW@P{Fkl~nhEz!%~eLK@z{5PSdwr)4>+F})x-eJdY)9%KnuKzSR)*RNV7b` z`MfGq!4c`d=Naeot~#}*1NafoLsp0ILmuC*nhs-1q*xt@Elv2FsKJ>g{7sa9d!E*$ zdO=Sx1JD3uk}CX#%dF;ai~fPRl_bC%-~qt-*I5A0%boyUvVd{SI|IP^++qN>k!(?6 z`N#}p$NB0hz!yMc-&wFN(rA|#$i2M@x)U}FYRk&k=Nl-K1>9|d4X|yU-zb8zR=bcl zU_9V5pw8d>K^dNjKMcUVc*3U`;+{P2wIMLhUWRp#0P6hh0F;RXkT=TEq8IQ}1e^pA zGEZno0H}-KA2I^P5&TgW#fIAOqa65*0N}Vy@WyZ% zKWOtp19@`DfHIBXg$6Hmfj0VTDS)#dqyA33(Bem37MP0M3-+b9f=3u6to=WBMG>!*RYg znm8w&+!&h8*#>0-)Hc^f9e8>!Kz)3^b3Ws+A0VwZr#oR+l#L}LXP-q~xSAh8J?u~H za~pPA3khCL34y*4Kn0+~0>=6Bn|Gjt_X4}jL>zT$@PaxxpCsC_hhdGq-+>;EQ=9?Fs;+gl zN7{V(tpdNz1#+R^n^SkfCdi}B^#hQpIr==IGiMmWPyd1JO}d~xj&+w&&hu(7?eKktlV(e&Z`39mXCBCDSc|M@Auq3%d}Yq| zoM~u-@36$U+0r_*^FtXLe0PRAxaYv$4&$i%6OMe`i)rv%L{LYCqa7#hmQ1T~`iC=( zIss5OcDYdZmmGOtSFLJz%@Eq)+66nU){Hm!8(WZ-4EV|+GwS}U>;J3w|JuesCC>YY zGY$Qwy^Vj$9DN_}SJWM!0i5^luk!rEXFtvXIQ9Qk=072zy9bBu_^^Xo9Gp_a2tbefd=X|{J zlm=Sk04?Qnf)C%;zj#u%j>@2aZO;)xR(^+kUH_~@C7!ZD|6h9j8;u1v_+|G$h|a?5 z2RN_bcb~`mtJ(KGfCrA}xL5eI?SGC(-3UL`7D9P*?0@6>IIh$3+8?kD`k-E!>(HYq z``>7%+GK4P=O0+VArGrVhkDOHpe>;t;$$7|`FZ}O8}Pt2B!mi}!8N?ve9f5$beeSj z1?d5eU-tYHVNbBZFMIxt%?3Dj)ixI3J93*i|H!)E`F{S9bsylGX8zQMgn+>b+Goc%t=y4a@9vp7(O?`g;zWoWglKHgAjJy4>7>U2u$(Q0r1fRKMZ|IBwq+BO-ZCmQ~17vDMO%A z1-^~|@k;nI0s}+%G6D@l_+kP!s>1Kg)P#Nzg^T2eRj_hd%{LmDDn-)OWh&K0(h$N| zCyJz*D#)))xX2IrR{>%8%0|tH7nr1P-*sTHK8f)yOvR68kgLCL`S$ID55nI)Ve+qV`#2dsy>G!WK7hu}l-CFCIF!VhWGe0t-1$Ykm9O)o;v?|QTBK-h(_ z6Ja;Pj)YwaJAb!3;RnJmgr5k%5q<>EeDf>X8C=5hJANlZ7vKo^{+);(kZ6Vr`m-#+ z27uq*j|E%a({%}EFHvo<|-0FaJ zyKxeNyk@(AHWlCkz;XYFcUQ>k0r(qG2q*yHxBD0@U>x(X4D0mZ6cqBv0HlpPsGQ|Z zNdvv^0F(voi_fk)=dn%9+v%3z{-F!oJW@fkO%VO%eyDgu>iaV5PbvXuXFxc zmwXN7BTWF(Cioyvi-y|ORSs>@UQ+>tO$fS|Ag@k4)&{9%R1N9o--fn_5g791sBeGn1*@?e12eG z!+QqD0x`bMhXXbve^e2giqVNQOWX_OIwvLX-SosZ!6H)nnJ zG}OoO9mg=DKEFexUGMV&%JKby;EV5~_)bcs@%^IC@d?WC`9sugu5cc^&Di588vtb_ zc%$t2UQMJ6@H-K8T~Kd7TV0|Jzr+3Y@W*Ft0h$2kzM^EaGp@mqGB6Y@HLYt$Mx@M$yi z=Z5@MTRF&21+?4u7t{&lZ*%XDAX7`ezvDfG{g7IlkJ zHHQvakZ!RxP~-(bp6qr+nYyEl4P8*r0)Tyuy*>J&M?-C!T8=yboa?qI3s>vs1b?WH z`yQP4BiewgdzzrbONg`qoW4gHc-p@}p3nwS+x`)b1!P|2;-)Ur1mKv*?sK$zqxO#o zp3olq61z>%9&LXAj*uTikQeW1Vq8L-G}rzq(O;1lSNAHrob|f2Lj`mhhr&V4Z<#DDTuq(UOWKhdc!lO~avrf_Ub z7(zd$a213Mq$@xoJ;7s2>wr$pF(nA$f8MA7Jt9=WV^okQjUj>w$EzR|#*hs}eqAAZ zU5tOP$D&K{A^3g|S#l9_5^@uI5PA`M5_%JMAnZce>AT$sI}&y!?92*#kw_#}fEj>X z6N88hpa~cB4;=vB6Bhta0mUp}9P_ZO!EX!kA_CC+enGr9paf9YeTZe>=kE}2^aX8& z0Cd0xb|R401q1@@sJj93kOoh`)r0ytZe9VPo{8) ztaixXjTfHmb+IiQ9i;i)H|+I@IFzH_1n(+{qkVsPCKB}<3b8GV2GT-Zkan$hfPC~f zVRNis>wbPiJZmdQS^z=@!m$j@8%>c|T>vchpi3@2iIBH&pIb3tfC( zU_0bp%!>bT&qF@iry=?cmH#jw1)8f^bdh&!^KWhYUtrmywfZ0WxHa#;Rvmvh?~U5h zU>{z_e&T-MYW%H@A7>u$Z`S7z&~NqUFUZhp^AEH)@Nd=m7fXh2AV;grKaoFPz#pH> zgbdi1TWtRQO@bO3&<@00xJBPT*kow6_b);Q48acHFNn9;`{#G2Y!Tp3%-8Ulh0jgm z`HgYR!)FOk@88u-Sa5L^s;+dGGA;9~QYrGQl4kl<38z(8ufA9$eQ`AtqPTb5)y%meL^)6wZ2Ny}Y{Iu9-=Ajn<{@(?bjs# zv24-k{=;hDr2flBqfz${wkIy|Wlf)ikmwueUyOIeGR~_A)`0&}Cy~}YA(1vgFO(4> Wk=&t&sZ#$Rn1^Lp2kT-RZ2Ld{KHez+ literal 0 HcmV?d00001 diff --git a/app/assets/packaging/logo.ico b/app/assets/packaging/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..8f99e2818e7db31b6fab2de75e4bbb6f438bab0c GIT binary patch literal 109492 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 Wk=&t&sZ#$Rn1^Lp2kT-RZ2Ld{KHez+ literal 0 HcmV?d00001 diff --git a/app/assets/web/error-403.html b/app/assets/web/error-403.html new file mode 100644 index 0000000..69922bf --- /dev/null +++ b/app/assets/web/error-403.html @@ -0,0 +1,11 @@ + + + + + LocalSend + + +

403 Forbidden

+

You don't have permission to access this resource.

+ + diff --git a/app/assets/web/index.html b/app/assets/web/index.html new file mode 100644 index 0000000..974ea94 --- /dev/null +++ b/app/assets/web/index.html @@ -0,0 +1,98 @@ + + + + + + LocalSend + + + + + + +

LocalSend

+

+
+
+ + diff --git a/app/assets/web/main.js b/app/assets/web/main.js new file mode 100644 index 0000000..db5481d --- /dev/null +++ b/app/assets/web/main.js @@ -0,0 +1,178 @@ +// IMPORTANT: This script works in Internet Explorer 8! + +var BASE_URL = '/api/localsend/v2'; + +var i18n = {}; +var sessionId = sessionStorage.getItem('sessionId'); +var queryParams = location.search.slice(1).split('&'); +var queryPin = null; + +// Parse query parameters manually for IE +for (var i = 0; i < queryParams.length; i++) { + var pair = queryParams[i].split('='); + if (pair[0] === 'pin') { + queryPin = decodeURIComponent(pair[1]); + break; + } +} + +function firstRequestFiles() { + document.getElementById('status-text').innerText = i18n.waiting; + var initialUrl = BASE_URL + '/prepare-download'; + + if (sessionId) { + initialUrl += '?sessionId=' + encodeURIComponent(sessionId); + if (queryPin) { + initialUrl += '&pin=' + encodeURIComponent(queryPin); + } + } else if (queryPin) { + initialUrl += '?pin=' + encodeURIComponent(queryPin); + } + + makeRequest(initialUrl, 'POST', function (response) { + if (response.status === 401) { + pinRequestFiles(true); + return; + } + + if (response.status === 403) { + document.getElementById('status-text').innerText = i18n.rejected; + return; + } + + if (response.status === 429) { + document.getElementById('status-text').innerText = i18n.tooManyAttempts; + return; + } + + if (response.status !== 200) { + document.getElementById('status-text').innerText = 'Error: ' + response.status; + return; + } + + handleSuccess(response); + }); +} + +function pinRequestFiles(firstAttempt) { + var pin = prompt(i18n.enterPin + (firstAttempt ? '' : '\n' + i18n.invalidPin)); + if (!pin) { + document.getElementById('status-text').innerText = i18n.invalidPin; + return; + } + + makeRequest(BASE_URL + '/prepare-download?pin=' + encodeURIComponent(pin), 'POST', function (response) { + if (response.status === 401) { + pinRequestFiles(false); + return; + } + + if (response.status === 403) { + document.getElementById('status-text').innerText = i18n.rejected; + return; + } + + if (response.status === 429) { + document.getElementById('status-text').innerText = i18n.tooManyAttempts; + return; + } + + if (response.status !== 200) { + document.getElementById('status-text').innerText = 'Error: ' + response.status; + return; + } + + handleSuccess(response); + }); +} + +function makeRequest(url, method, callback) { + var xhr = new XMLHttpRequest(); + xhr.open(method, url, true); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + callback(xhr); + } + }; + xhr.send(); +} + +function fetchI18n(then) { + makeRequest('/i18n.json', 'GET', function (response) { + if (response.status === 200) { + i18n = JSON.parse(response.responseText); + then(); + } + }); +} + +function init() { + fetchI18n(firstRequestFiles); +} + +function handleSuccess(response) { + var data = JSON.parse(response.responseText); + var files = data.files; + sessionId = data.sessionId; + sessionStorage.setItem('sessionId', sessionId); + + document.getElementById('status-text').innerText = i18n.files + ' (' + getKeys(data.files).length + ')'; + + // Handling file display + handleFilesDisplay(files, sessionId); +} + +function handleFilesDisplay(files, sessionId) { + var html= ''; + var fileKeys = getKeys(files); + for (var i = 0; i < fileKeys.length; i++) { + var file = files[fileKeys[i]]; + html += '
' + + '
' + (i + 1) + '
' + + '
' + escapeHtml(file.fileName) + '
' + + '
' + formatBytes(file.size) + '
' + + '
'; + } + + if (fileKeys.length === 1) { + document.getElementById('single-file').innerHTML = html; + } else { + document.getElementById('file-list').innerHTML = html; + } +} + +function escapeHtml(text) { + if (text === null || text === undefined) { + return ''; + } + var map = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + return String(text).replace(/[&<>"']/g, function(m) { return map[m]; }); +} + +function formatBytes(bytes) { + if (bytes < 1024) { + return bytes + ' B'; + } else if (bytes < 1024 * 1024) { + return (bytes / 1024).toFixed(1) + ' KB'; + } else if (bytes < 1024 * 1024 * 1024) { + return (bytes / (1024 * 1024)).toFixed(1) + ' MB'; + } else { + return (bytes / (1024 * 1024 * 1024)).toFixed(1) + ' GB'; + } +} + +function getKeys(obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + } + return keys; +} + +init(); diff --git a/app/build.yaml b/app/build.yaml new file mode 100644 index 0000000..2d6be34 --- /dev/null +++ b/app/build.yaml @@ -0,0 +1,22 @@ +targets: + $default: + builders: + slang_build_runner: + options: + base_locale: en + fallback_strategy: base_locale + input_directory: assets/i18n + input_file_pattern: .json + string_interpolation: braces + timestamp: false # for F-Droid Reproducible Builds + flat_map: false + format: + enabled: true + width: 150 + dart_mappable_builder: + options: + renameMethods: + fromJson: deserialize + toJson: serialize + fromMap: fromJson + toMap: toJson diff --git a/app/flutter_rust_bridge.yaml b/app/flutter_rust_bridge.yaml new file mode 100644 index 0000000..69fc929 --- /dev/null +++ b/app/flutter_rust_bridge.yaml @@ -0,0 +1,3 @@ +rust_input: crate::api +rust_root: rust/ +dart_output: lib/rust diff --git a/app/ios/.gitignore b/app/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/app/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/app/ios/Flutter/AppFrameworkInfo.plist b/app/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..391a902 --- /dev/null +++ b/app/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/app/ios/Flutter/Debug.xcconfig b/app/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/app/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/app/ios/Flutter/Release.xcconfig b/app/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..c4855bf --- /dev/null +++ b/app/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/app/ios/MyLocalSendStoreKit.storekit b/app/ios/MyLocalSendStoreKit.storekit new file mode 100644 index 0000000..c563e47 --- /dev/null +++ b/app/ios/MyLocalSendStoreKit.storekit @@ -0,0 +1,140 @@ +{ + "appPolicies" : { + "eula" : "", + "policies" : [ + { + "locale" : "en_US", + "policyText" : "", + "policyURL" : "" + } + ] + }, + "identifier" : "D8FDEAE9", + "nonRenewingSubscriptions" : [ + + ], + "products" : [ + { + "displayPrice" : "5.0", + "familyShareable" : false, + "internalID" : "6472594578", + "localizations" : [ + { + "description" : "LocalSend Donation", + "displayName" : "LocalSend Donation", + "locale" : "en_US" + } + ], + "productID" : "localsend_ios_donate_5", + "referenceName" : "LocalSend Donation (05)", + "type" : "NonConsumable" + }, + { + "displayPrice" : "10.0", + "familyShareable" : false, + "internalID" : "6472594779", + "localizations" : [ + { + "description" : "LocalSend Donation", + "displayName" : "LocalSend Donation", + "locale" : "en_US" + } + ], + "productID" : "localsend_ios_donate_10", + "referenceName" : "LocalSend Donation (10)", + "type" : "NonConsumable" + }, + { + "displayPrice" : "20.0", + "familyShareable" : false, + "internalID" : "6472594819", + "localizations" : [ + { + "description" : "LocalSend Donation", + "displayName" : "LocalSend Donation", + "locale" : "en_US" + } + ], + "productID" : "localsend_ios_donate_20", + "referenceName" : "LocalSend Donation (20)", + "type" : "NonConsumable" + }, + { + "displayPrice" : "50.0", + "familyShareable" : false, + "internalID" : "6472595571", + "localizations" : [ + { + "description" : "LocalSend Donation", + "displayName" : "LocalSend Donation", + "locale" : "en_US" + } + ], + "productID" : "localsend_ios_donate_50", + "referenceName" : "LocalSend Donation (50)", + "type" : "NonConsumable" + } + ], + "settings" : { + "_applicationInternalID" : "1661733229", + "_developerTeamID" : "3W7H4PYMCV", + "_failTransactionsEnabled" : false, + "_lastSynchronizedDate" : 722042011.75185394, + "_locale" : "en_US", + "_storefront" : "USA", + "_storeKitErrors" : [ + { + "current" : null, + "enabled" : false, + "name" : "Load Products" + }, + { + "current" : null, + "enabled" : false, + "name" : "Purchase" + }, + { + "current" : null, + "enabled" : false, + "name" : "Verification" + }, + { + "current" : null, + "enabled" : false, + "name" : "App Store Sync" + }, + { + "current" : null, + "enabled" : false, + "name" : "Subscription Status" + }, + { + "current" : null, + "enabled" : false, + "name" : "App Transaction" + }, + { + "current" : null, + "enabled" : false, + "name" : "Manage Subscriptions Sheet" + }, + { + "current" : null, + "enabled" : false, + "name" : "Refund Request Sheet" + }, + { + "current" : null, + "enabled" : false, + "name" : "Offer Code Redeem Sheet" + } + ] + }, + "subscriptionGroups" : [ + + ], + "version" : { + "major" : 4, + "minor" : 0 + } +} diff --git a/app/ios/Podfile b/app/ios/Podfile new file mode 100644 index 0000000..c404a41 --- /dev/null +++ b/app/ios/Podfile @@ -0,0 +1,48 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + + # share_handler addition start + target 'ShareExtension' do + inherit! :search_paths + pod "share_handler_ios_models", :path => ".symlinks/plugins/share_handler_ios/ios/Models" + end + # share_handler addition end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock new file mode 100644 index 0000000..abd29c7 --- /dev/null +++ b/app/ios/Podfile.lock @@ -0,0 +1,210 @@ +PODS: + - connectivity_plus (0.0.1): + - Flutter + - device_info_plus (0.0.1): + - Flutter + - DKImagePickerController/Core (4.3.9): + - DKImagePickerController/ImageDataManager + - DKImagePickerController/Resource + - DKImagePickerController/ImageDataManager (4.3.9) + - DKImagePickerController/PhotoGallery (4.3.9): + - DKImagePickerController/Core + - DKPhotoGallery + - DKImagePickerController/Resource (4.3.9) + - DKPhotoGallery (0.0.19): + - DKPhotoGallery/Core (= 0.0.19) + - DKPhotoGallery/Model (= 0.0.19) + - DKPhotoGallery/Preview (= 0.0.19) + - DKPhotoGallery/Resource (= 0.0.19) + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Core (0.0.19): + - DKPhotoGallery/Model + - DKPhotoGallery/Preview + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Model (0.0.19): + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Preview (0.0.19): + - DKPhotoGallery/Model + - DKPhotoGallery/Resource + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Resource (0.0.19): + - SDWebImage + - SwiftyGif + - file_picker (0.0.1): + - DKImagePickerController/PhotoGallery + - Flutter + - file_selector_ios (0.0.1): + - Flutter + - Flutter (1.0.0) + - gal (1.0.0): + - Flutter + - FlutterMacOS + - image_picker_ios (0.0.1): + - Flutter + - in_app_purchase_storekit (0.0.1): + - Flutter + - FlutterMacOS + - network_info_plus (0.0.1): + - Flutter + - open_filex (0.0.2): + - Flutter + - package_info_plus (0.4.5): + - Flutter + - pasteboard (0.0.1): + - Flutter + - permission_handler_apple (9.4.8): + - Flutter + - photo_manager (3.10.0): + - Flutter + - FlutterMacOS + - rhttp (0.0.1): + - Flutter + - rust_lib_localsend_app (0.0.1): + - Flutter + - SDWebImage (5.20.0): + - SDWebImage/Core (= 5.20.0) + - SDWebImage/Core (5.20.0) + - share_handler_ios (0.0.14): + - Flutter + - share_handler_ios/share_handler_ios_models (= 0.0.14) + - share_handler_ios_models + - share_handler_ios/share_handler_ios_models (0.0.14): + - Flutter + - share_handler_ios_models + - share_handler_ios_models (0.0.9) + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - SwiftyGif (5.4.5) + - system_settings_2 (3.0.0): + - Flutter + - uri_content (0.0.1): + - Flutter + - url_launcher_ios (0.0.1): + - Flutter + - video_player_avfoundation (0.0.1): + - Flutter + - FlutterMacOS + - wakelock_plus (0.0.1): + - Flutter + +DEPENDENCIES: + - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) + - file_picker (from `.symlinks/plugins/file_picker/ios`) + - file_selector_ios (from `.symlinks/plugins/file_selector_ios/ios`) + - Flutter (from `Flutter`) + - gal (from `.symlinks/plugins/gal/darwin`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/darwin`) + - network_info_plus (from `.symlinks/plugins/network_info_plus/ios`) + - open_filex (from `.symlinks/plugins/open_filex/ios`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - pasteboard (from `.symlinks/plugins/pasteboard/ios`) + - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) + - photo_manager (from `.symlinks/plugins/photo_manager/darwin`) + - rhttp (from `.symlinks/plugins/rhttp/ios`) + - rust_lib_localsend_app (from `.symlinks/plugins/rust_lib_localsend_app/ios`) + - share_handler_ios (from `.symlinks/plugins/share_handler_ios/ios`) + - share_handler_ios_models (from `.symlinks/plugins/share_handler_ios/ios/Models`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + - system_settings_2 (from `.symlinks/plugins/system_settings_2/ios`) + - uri_content (from `.symlinks/plugins/uri_content/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) + - wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`) + +SPEC REPOS: + trunk: + - DKImagePickerController + - DKPhotoGallery + - SDWebImage + - SwiftyGif + +EXTERNAL SOURCES: + connectivity_plus: + :path: ".symlinks/plugins/connectivity_plus/ios" + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" + file_picker: + :path: ".symlinks/plugins/file_picker/ios" + file_selector_ios: + :path: ".symlinks/plugins/file_selector_ios/ios" + Flutter: + :path: Flutter + gal: + :path: ".symlinks/plugins/gal/darwin" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + in_app_purchase_storekit: + :path: ".symlinks/plugins/in_app_purchase_storekit/darwin" + network_info_plus: + :path: ".symlinks/plugins/network_info_plus/ios" + open_filex: + :path: ".symlinks/plugins/open_filex/ios" + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" + pasteboard: + :path: ".symlinks/plugins/pasteboard/ios" + permission_handler_apple: + :path: ".symlinks/plugins/permission_handler_apple/ios" + photo_manager: + :path: ".symlinks/plugins/photo_manager/darwin" + rhttp: + :path: ".symlinks/plugins/rhttp/ios" + rust_lib_localsend_app: + :path: ".symlinks/plugins/rust_lib_localsend_app/ios" + share_handler_ios: + :path: ".symlinks/plugins/share_handler_ios/ios" + share_handler_ios_models: + :path: ".symlinks/plugins/share_handler_ios/ios/Models" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + system_settings_2: + :path: ".symlinks/plugins/system_settings_2/ios" + uri_content: + :path: ".symlinks/plugins/uri_content/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + video_player_avfoundation: + :path: ".symlinks/plugins/video_player_avfoundation/darwin" + wakelock_plus: + :path: ".symlinks/plugins/wakelock_plus/ios" + +SPEC CHECKSUMS: + connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd + device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe + DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c + DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 + file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be + file_selector_ios: ec57ec07954363dd730b642e765e58f199bb621a + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + gal: baecd024ebfd13c441269ca7404792a7152fde89 + image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326 + in_app_purchase_storekit: 22cca7d08eebca9babdf4d07d0baccb73325d3c8 + network_info_plus: cf61925ab5205dce05a4f0895989afdb6aade5fc + open_filex: 432f3cd11432da3e39f47fcc0df2b1603854eff1 + package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 + pasteboard: 49088aeb6119d51f976a421db60d8e1ab079b63c + permission_handler_apple: 92d754bbaa7361d436db2d6c3c1c2a0fdcec462e + photo_manager: 93cc83778e33d5fd49dfd7e34b73f8f5a4f10aaf + rhttp: 359daed992674fc912552df3106bfbc746bcc929 + rust_lib_localsend_app: e74fed7b12bd94b7fb63a29f9b6afdde78f6a0a7 + SDWebImage: 73c6079366fea25fa4bb9640d5fb58f0893facd8 + share_handler_ios: e2244e990f826b2c8eaa291ac3831569438ba0fb + share_handler_ios_models: fc638c9b4330dc7f082586c92aee9dfa0b87b871 + shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb + SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 + system_settings_2: 5c4a7aaed51dfd09b46aaa9d36bb57f578642191 + uri_content: 70a99850f89322ef5eca2e69451ee38221b917ec + url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b + video_player_avfoundation: 3453f792138786248960ca029747fcd9f318ef52 + wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556 + +PODFILE CHECKSUM: 3a4ace682762b60a381ecc086ce3de34ab033988 + +COCOAPODS: 1.16.2 diff --git a/app/ios/Runner.xcodeproj/project.pbxproj b/app/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..cb39c0a --- /dev/null +++ b/app/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,845 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 28D9F9A529638D5E0028B96E /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28D9F9A429638D5E0028B96E /* ShareViewController.swift */; }; + 28D9F9A829638D5E0028B96E /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 28D9F9A629638D5E0028B96E /* MainInterface.storyboard */; }; + 28D9F9AC29638D5E0028B96E /* ShareExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 28D9F9A229638D5E0028B96E /* ShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 7DA3203436DA0EAD484C6129 /* Pods_ShareExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 052009B9C8E63670A6F30787 /* Pods_ShareExtension.framework */; }; + 840EA3FC2B0910B000C0FED7 /* MyLocalSendStoreKit.storekit in Resources */ = {isa = PBXBuildFile; fileRef = 840EA3FB2B0910B000C0FED7 /* MyLocalSendStoreKit.storekit */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + E90D52B8096B253F54908565 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0628E22A788D91D99A60B3EB /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 28D9F9AA29638D5E0028B96E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 28D9F9A129638D5E0028B96E; + remoteInfo = ShareExtension; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 28D9F9AD29638D5E0028B96E /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 28D9F9AC29638D5E0028B96E /* ShareExtension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0007FA5526976D661EA80645 /* Pods-ShareExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareExtension.release.xcconfig"; path = "Target Support Files/Pods-ShareExtension/Pods-ShareExtension.release.xcconfig"; sourceTree = ""; }; + 052009B9C8E63670A6F30787 /* Pods_ShareExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShareExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0628E22A788D91D99A60B3EB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0A5D3B0265815538882A3116 /* Pods-ShareExtension.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareExtension.profile.xcconfig"; path = "Target Support Files/Pods-ShareExtension/Pods-ShareExtension.profile.xcconfig"; sourceTree = ""; }; + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 281A2070295BE78500C3D1F9 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + 28D9F9A229638D5E0028B96E /* ShareExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ShareExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 28D9F9A429638D5E0028B96E /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = ""; }; + 28D9F9A729638D5E0028B96E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; + 28D9F9A929638D5E0028B96E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 28D9F9B229638F760028B96E /* ShareExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ShareExtension.entitlements; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 6C3C360E39C360756F5C1E62 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 840EA3FB2B0910B000C0FED7 /* MyLocalSendStoreKit.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = MyLocalSendStoreKit.storekit; sourceTree = ""; }; + 841A12B829EC22BD00B99343 /* LocalNetworkAuthorization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalNetworkAuthorization.swift; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A2BF1CF158EF83DE50B03565 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + B97818B16CFBA751581F52D0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + E27045CC3CCE78EFE26BEAA2 /* Pods-ShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareExtension.debug.xcconfig"; path = "Target Support Files/Pods-ShareExtension/Pods-ShareExtension.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 28D9F99F29638D5E0028B96E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7DA3203436DA0EAD484C6129 /* Pods_ShareExtension.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E90D52B8096B253F54908565 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 28D9F9A329638D5E0028B96E /* ShareExtension */ = { + isa = PBXGroup; + children = ( + 28D9F9B229638F760028B96E /* ShareExtension.entitlements */, + 28D9F9A429638D5E0028B96E /* ShareViewController.swift */, + 28D9F9A629638D5E0028B96E /* MainInterface.storyboard */, + 28D9F9A929638D5E0028B96E /* Info.plist */, + ); + path = ShareExtension; + sourceTree = ""; + }; + 59B9B2A902E417D8EA9C7BB8 /* Pods */ = { + isa = PBXGroup; + children = ( + 6C3C360E39C360756F5C1E62 /* Pods-Runner.debug.xcconfig */, + B97818B16CFBA751581F52D0 /* Pods-Runner.release.xcconfig */, + A2BF1CF158EF83DE50B03565 /* Pods-Runner.profile.xcconfig */, + E27045CC3CCE78EFE26BEAA2 /* Pods-ShareExtension.debug.xcconfig */, + 0007FA5526976D661EA80645 /* Pods-ShareExtension.release.xcconfig */, + 0A5D3B0265815538882A3116 /* Pods-ShareExtension.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 840EA3FB2B0910B000C0FED7 /* MyLocalSendStoreKit.storekit */, + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 28D9F9A329638D5E0028B96E /* ShareExtension */, + 97C146EF1CF9000F007C117D /* Products */, + 59B9B2A902E417D8EA9C7BB8 /* Pods */, + C869F3F44E625CCF2D1A5B44 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 28D9F9A229638D5E0028B96E /* ShareExtension.appex */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 281A2070295BE78500C3D1F9 /* Runner.entitlements */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + 841A12B829EC22BD00B99343 /* LocalNetworkAuthorization.swift */, + ); + path = Runner; + sourceTree = ""; + }; + C869F3F44E625CCF2D1A5B44 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 0628E22A788D91D99A60B3EB /* Pods_Runner.framework */, + 052009B9C8E63670A6F30787 /* Pods_ShareExtension.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 28D9F9A129638D5E0028B96E /* ShareExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 28D9F9B129638D5E0028B96E /* Build configuration list for PBXNativeTarget "ShareExtension" */; + buildPhases = ( + 0BD91A3FC61E700E2A8B7EA4 /* [CP] Check Pods Manifest.lock */, + 28D9F99E29638D5E0028B96E /* Sources */, + 28D9F99F29638D5E0028B96E /* Frameworks */, + 28D9F9A029638D5E0028B96E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ShareExtension; + productName = ShareExtension; + productReference = 28D9F9A229638D5E0028B96E /* ShareExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9C4064819D92C3F1614A347F /* [CP] Check Pods Manifest.lock */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 28D9F9AD29638D5E0028B96E /* Embed Foundation Extensions */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 38A5402B0B18EA0E910C92D1 /* [CP] Embed Pods Frameworks */, + EDE2155513425DDF45F39C27 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 28D9F9AB29638D5E0028B96E /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1400; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 28D9F9A129638D5E0028B96E = { + CreatedOnToolsVersion = 14.0; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 28D9F9A129638D5E0028B96E /* ShareExtension */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 28D9F9A029638D5E0028B96E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 28D9F9A829638D5E0028B96E /* MainInterface.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + 840EA3FC2B0910B000C0FED7 /* MyLocalSendStoreKit.storekit in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 0BD91A3FC61E700E2A8B7EA4 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ShareExtension-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 38A5402B0B18EA0E910C92D1 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; + }; + 9C4064819D92C3F1614A347F /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + EDE2155513425DDF45F39C27 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 28D9F99E29638D5E0028B96E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 28D9F9A529638D5E0028B96E /* ShareViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 28D9F9AB29638D5E0028B96E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 28D9F9A129638D5E0028B96E /* ShareExtension */; + targetProxy = 28D9F9AA29638D5E0028B96E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 28D9F9A629638D5E0028B96E /* MainInterface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 28D9F9A729638D5E0028B96E /* Base */, + ); + name = MainInterface.storyboard; + sourceTree = ""; + }; + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 3W7H4PYMCV; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.localsend.localsendApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 28D9F9AE29638D5E0028B96E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E27045CC3CCE78EFE26BEAA2 /* Pods-ShareExtension.debug.xcconfig */; + buildSettings = { + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 3W7H4PYMCV; + GCC_C_LANGUAGE_STANDARD = gnu11; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = ShareExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = ShareExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.localsend.localsendApp.ShareExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 28D9F9AF29638D5E0028B96E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0007FA5526976D661EA80645 /* Pods-ShareExtension.release.xcconfig */; + buildSettings = { + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 3W7H4PYMCV; + GCC_C_LANGUAGE_STANDARD = gnu11; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = ShareExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = ShareExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.localsend.localsendApp.ShareExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 28D9F9B029638D5E0028B96E /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0A5D3B0265815538882A3116 /* Pods-ShareExtension.profile.xcconfig */; + buildSettings = { + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 3W7H4PYMCV; + GCC_C_LANGUAGE_STANDARD = gnu11; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = ShareExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = ShareExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.localsend.localsendApp.ShareExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 3W7H4PYMCV; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.localsend.localsendApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 3W7H4PYMCV; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.localsend.localsendApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 28D9F9B129638D5E0028B96E /* Build configuration list for PBXNativeTarget "ShareExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 28D9F9AE29638D5E0028B96E /* Debug */, + 28D9F9AF29638D5E0028B96E /* Release */, + 28D9F9B029638D5E0028B96E /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..2fbd2ec --- /dev/null +++ b/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/ios/Runner.xcworkspace/contents.xcworkspacedata b/app/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/app/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/app/ios/Runner/AppDelegate.swift b/app/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..8929162 --- /dev/null +++ b/app/ios/Runner/AppDelegate.swift @@ -0,0 +1,27 @@ +import UIKit +import Flutter + +@main +@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } + + func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { + let channel = FlutterMethodChannel( + name: "ios-delegate-channel", + binaryMessenger: engineBridge.applicationRegistrar.messenger() + ) + channel.setMethodCallHandler { (call: FlutterMethodCall, result: @escaping FlutterResult) in + if call.method == "isReduceMotionEnabled" { + result(UIAccessibility.isReduceMotionEnabled) + } else { + result(FlutterMethodNotImplemented) + } + } + GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) + } +} diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..64a574e --- /dev/null +++ b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "images": [ + { + "size": "20x20", + "idiom": "iphone", + "filename": "Icon-App-20@2x.png", + "scale": "2x" + }, + { + "size": "20x20", + "idiom": "iphone", + "filename": "Icon-App-20@3x.png", + "scale": "3x" + }, + { + "size": "20x20", + "idiom": "ipad", + "filename": "Icon-App-20.png", + "scale": "1x" + }, + { + "size": "20x20", + "idiom": "ipad", + "filename": "Icon-App-20@2x.png", + "scale": "2x" + }, + { + "size": "29x29", + "idiom": "iphone", + "filename": "Icon-App-29@2x.png", + "scale": "2x" + }, + { + "size": "29x29", + "idiom": "iphone", + "filename": "Icon-App-29@3x.png", + "scale": "3x" + }, + { + "size": "40x40", + "idiom": "iphone", + "filename": "Icon-App-40@2x.png", + "scale": "2x" + }, + { + "size": "40x40", + "idiom": "iphone", + "filename": "Icon-App-40@3x.png", + "scale": "3x" + }, + { + "size": "60x60", + "idiom": "iphone", + "filename": "Icon-App-60@2x.png", + "scale": "2x" + }, + { + "size": "60x60", + "idiom": "iphone", + "filename": "Icon-App-60@3x.png", + "scale": "3x" + }, + { + "size": "29x29", + "idiom": "ipad", + "filename": "Icon-App-29.png", + "scale": "1x" + }, + { + "size": "29x29", + "idiom": "ipad", + "filename": "Icon-App-29@2x.png", + "scale": "2x" + }, + { + "size": "40x40", + "idiom": "ipad", + "filename": "Icon-App-40.png", + "scale": "1x" + }, + { + "size": "40x40", + "idiom": "ipad", + "filename": "Icon-App-40@2x.png", + "scale": "2x" + }, + { + "size": "76x76", + "idiom": "ipad", + "filename": "Icon-App-76.png", + "scale": "1x" + }, + { + "size": "76x76", + "idiom": "ipad", + "filename": "Icon-App-76@2x.png", + "scale": "2x" + }, + { + "size": "83.5x83.5", + "idiom": "ipad", + "filename": "Icon-App-83.5@2x.png", + "scale": "2x" + }, + { + "size": "1024x1024", + "idiom": "ios-marketing", + "filename": "Icon-App-1024.png", + "scale": "1x" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +} diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..625fde9ffed8d63a8e9e1bff45d4f9bfaa2471a1 GIT binary patch literal 46025 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 literal 0 HcmV?d00001 diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20@3x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..415eb87f0aaea690772d410d2f1c8b4457746aea GIT binary patch literal 1971 zcmV;k2Tb^hP)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z0WwfbR7L;)|Nj5~{{H^`{{H;_{`~#@`~Cg;{QUFy`11Gn@%Q)e_V(}g_3ric?ez5O z^785O^5^mK=J4?4@9*8~>e}h)+3D!n=;+ty=ho-v)#m2M-rmRF-N)VC#@*b-+}y<6 z+{4@3!rR-z+S} zjEg>tiaLpiI*5oego7)9e@3T$c!YibB;X$EO%1!-snX=ep!X9Q?x188RhXl4LrWdLPl zx#y8^OwAV9_H^Pm7*KXJs2S?&n*vn^CNX zSVl<4(M@~yP|iZ>g5_M4AS)l*v0fz&#ivP@HThJ8wBl{fuFD$a17mD+ERY9HUT?;V z(JT~hgl4vIlZR|nWSh=A3?wk6JZe5?_x2+u%dwB! zU9*T(J)KKYb#9dtuhjnO>9v-gR?#QcPf#)RS zVT3MsG+;>Eq3+0oAUkJFVNJsJSBx z?88W+$95+6!-9WeGxP#T2>UGX8A*N8sB+0F3sz+p4Y$t}Ipc!4%I^AwB^qDYYA2s+ zh3k-T9Z%ki!G9(B!+<}A_Ui+1t3Cj?EdkhF^gh$**bg+$+CVd44m2F26vq(9F+Oq(u6^~q{s0^*1Xlz)+#mn|002ovPDHLk FV1iom@3#N| literal 0 HcmV?d00001 diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29.png new file mode 100644 index 0000000000000000000000000000000000000000..d5692e878b19850b61ebb73b9fabd7dfc0732867 GIT binary patch literal 1479 zcmV;&1vvVNP)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z0FzKmR7L;)|Nj5~{r>*^{r&j+`}g|#_WJtv`T6ek_3rib?e+BS^z`fV^VsO<(&XgO z zaX9YMZgx>xU1qeH3;Z-&XQ_{vWAnDP#Msqak8hjjVS+I^JU3R@`sf3_D2aN2f2_ZQ z3ps?&GB55$zU;tA3T)n9KdQ2N=)GsJPy4_^SLIu!7eIe%&IG3v2DvI5Djz_44rqib zgQ&QEcCSSQnF?vddIia?G;Rs3bo|rZ;N0@=DRBPToi7MEvT8My!ck{OkF5UgFyyDd h?%8n9l|7UH@B)6t9^&8AfYAT|002ovPDHLkV1k)N^rHX( literal 0 HcmV?d00001 diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29@2x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fdabd35587e85545ace880da44dd31fd2bda091a GIT binary patch literal 1917 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 JPDHLkV1jXs=g$BD literal 0 HcmV?d00001 diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40.png new file mode 100644 index 0000000000000000000000000000000000000000..817e96beee7c3a98e227e4db1904ad4383a70116 GIT binary patch literal 1699 zcmV;U23+}xP)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z0O3$fR7L;)|Nj5~{{Q~{{{H;^{rmm>`~3X+{QUU)`}g|#_WAks`T6ts_wxAn^7r@g z_xJAg_3rib?e+BS^z`iX^y>2R>GJaF^6}Q^=ho-u%HQ9}-rmOD-NoG8m%+f6z`&Kj zzm>nglD@r>y}ggSyNXqlsHkqJr(>a@Vxgc`nwd_OluDA3 zNs^IBk&s4^k2{HoI*Eumh=(_ah9i4=5pZt~Zfy;2Z4GT~3v6o%Yib5*Xai_x17~Ie zXJ!ItWdUYo0A^$WWn=(kVgO@e0AF5<76P^a00Co3L_t(|+SQcVc7iYvhNHMIsC7kL zQCv|}KsMP#KzaWMsx+rHSnMg6&IOaq`8df;{u%J5mP-8ts!X=LDDvA$nNzpwR>>niK$p1dUW>r=nOnM zl+5&1GIS^zN@%|-Pg|g(3T{8Z3sUg-PY5sqilW4Pi(*}dqUd1pWEL&lIx5__t$;R{ t_uO2rIg8P*F$O@~krIDMp=0ko?Gp-+SGdej=~e&$002ovPDHLkV1n=qY0dxu literal 0 HcmV?d00001 diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40@2x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8f919bae2c245ab878f51a37c676946cb598292f GIT binary patch literal 2261 zcmV;`2rBo9P)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z0d7!CR7L;)|NZ{{{Qdp<{QUX*`}q6&_xt+|#J z^782N@#yjK)q??-0JGs=;+ty=hf!s(&XgP(4Xr-iLp`cTkmrs?IPnDESl#@%7l1Y-0NRg37kdH->k42ACw+Y(dU+pscOH0m8Fh3QbaNGRauINE z4sLA?Zfy;1Yz%E|3v6o&Y-kgJ1`jj{Z$>c6nM)J_V$xJU!bSndTV#KXQrpQ1`WO}svf<;pzl%r53i1qwWCXa zFcOPJg8s{+wUG{)hVz(GA)Q1#kCJJDQamryQ2m&JA~KKadY#(F^1r6QD-p6Zm!nyM zyar79(XqB#{ieKOP5z&5$L(?2_x9{gk9$X#AJc@qlQr2j+u{UUxUyI|0 z1cJ4^z$yTuuHI_>27gfi6zeOm=!+o$>Km-iZzw;ryfhy+DM*w)@P_bny2jKyTueaj&bx{Bw+qjC@Fb_aomA>@`1xS!ht_n6u z0)TF?MH6uZKpme(ziEwTvr+r))3AdAp!fvKuggmSy`PoLU(4*lT`11;@zCADY)i>J zp1&g?-cE+$co++@Q+4s2Eph0D;QQ8sQ1_IftCEI? z6yCNA(aZ}lc$qE;x88srN*Z1WK-`7Mo&yFsdqLC8eh*dt-6k07A?Vq}c-z<`e%MddyP6wyl<8e%-; zcE!ky62KsV%%XBP2Yk$+fT8lQEdQgh)8>|)HaCp4Q6#a&rMFdxrrAqxrXbudyYyD; z-yBw?x3Awawl76DSoueQ@`sf2$Ee5;se^uzW5X^*u4R-WVzG2meX(>}saWc)t(-gi zTh4VUQgA9?63Z{zmA_WVzxXJBH4_>1$+$eqy51^$0cSJm4Y67TVegazO$;U4EXp^6 jly6nBn`sRid{zDcLd-J_^X2eE00000NkvXXu0mjf;tq!$ literal 0 HcmV?d00001 diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40@3x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a8b318a0f183a5db16df617f39c8bf47baa3f6e3 GIT binary patch literal 3054 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 K<*$l1QU4Ez{~zoC literal 0 HcmV?d00001 diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76.png new file mode 100644 index 0000000000000000000000000000000000000000..e69f6c3b273635276e3171b77aa7b7b2dbedc75a GIT binary patch literal 2229 zcmV;m2uk;fP)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z0c%i9R7L;)|Nj5~{r>*^{{H;^{rmm>`~3X+{QUU)`}g|#_WJtv`T6zv`SSPo@AmcY z_4V%c_3iZZ?DX{N^YiNS^6K*P32SNyYibBq$gGRCwC$m}yhuKoEw53o0sVbQSMg@xsLuyigPsK@ksNBPiOK z3_&qq!twKWEmI_z1dvq9DvRe6J>9$^VY;U~Se-gQjbD9JR=dOLbl9y^eGRIlj9XVR zl;Jp*<+u!rU2Pdvi0Qor3W`vLQ+;hZP1rj_L>5trWGaU@+n{X_0H2AT$bJ+hCt$89JY~w%UW>b?+*JLu|{6bqW|97rxsh0g`8bxs>Hy%aw z^L|TpT0NdD39kWzlD{$V3S`#PQ;k;d1q(ptmX#xxb0h$J(OX%o`(2Aly9~-923MMT zSL?3$ygV!bdfF%-wef@iSWl(rwwDD!kBe9Z79SBncCUQU>!pib;})CEGTv3Xx}GM1Cd_40@gPs7axU>wr|sl6⁡Kzdf;aiaoAeipn1- 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 D?yGKH literal 0 HcmV?d00001 diff --git a/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5@2x.png b/app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..259a847dd98995edeafe68ee7d971463d5a4e766 GIT binary patch literal 3876 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 Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..b5b843a --- /dev/null +++ b/app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. diff --git a/app/ios/Runner/Base.lproj/LaunchScreen.storyboard b/app/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/app/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/ios/Runner/Base.lproj/Main.storyboard b/app/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/app/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/ios/Runner/Info.plist b/app/ios/Runner/Info.plist new file mode 100644 index 0000000..be6db5d --- /dev/null +++ b/app/ios/Runner/Info.plist @@ -0,0 +1,172 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + LocalSend + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + localsend_app + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneDelegateClassName + FlutterSceneDelegate + UISceneConfigurationName + flutter + UISceneStoryboardFile + Main + + + + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + + ITSAppUsesNonExemptEncryption + + + CFBundleLocalizations + + ar + az + bg + bn + ca + cs + da + de + el + en + en-IN + es-ES + et + eu + fa + fi + fil-PH + fr + gl + gu + he + hi + hu + id + it + ja + km + ko + ml + mn + ms + ne + nl + pl + pt-BR + pt-PT + ro + ru + si + sk + sl + sr + sr-Cyrl + sv + ta + th + tr + uk + ur + vi + zh-CN + zh-HK + zh-TW + + + + UISupportsDocumentBrowser + + + + NSPhotoLibraryUsageDescription + The app needs photo library access so that the user can select photos to share. + NSPhotoLibraryAddUsageDescription + The app saves received media to the photo library. + NSLocationAlwaysAndWhenInUseUsageDescription + The app requires the local IP to communicate. + NSLocationWhenInUseUsageDescription + The app requires the local IP to communicate. + NSLocalNetworkUsageDescription + The app uses the local network to find and connect to nearby devices. + NSBonjourServices + + _http._tcp + _bonjour._tcp + _lnp._tcp. + + + + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER) + + + + + + UIFileSharingEnabled + + LSSupportsOpeningDocumentsInPlace + + + diff --git a/app/ios/Runner/Runner-Bridging-Header.h b/app/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/app/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/app/ios/Runner/Runner.entitlements b/app/ios/Runner/Runner.entitlements new file mode 100644 index 0000000..03f3fb4 --- /dev/null +++ b/app/ios/Runner/Runner.entitlements @@ -0,0 +1,14 @@ + + + + + aps-environment + development + com.apple.developer.networking.multicast + + com.apple.security.application-groups + + group.org.localsend.localsendApp + + + diff --git a/app/ios/ShareExtension/Base.lproj/MainInterface.storyboard b/app/ios/ShareExtension/Base.lproj/MainInterface.storyboard new file mode 100644 index 0000000..286a508 --- /dev/null +++ b/app/ios/ShareExtension/Base.lproj/MainInterface.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/ios/ShareExtension/Info.plist b/app/ios/ShareExtension/Info.plist new file mode 100644 index 0000000..4abf39d --- /dev/null +++ b/app/ios/ShareExtension/Info.plist @@ -0,0 +1,40 @@ + + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + NSExtension + + NSExtensionAttributes + + NSExtensionActivationRule + + NSExtensionActivationSupportsWebPageWithMaxCount + 999 + NSExtensionActivationSupportsWebURLWithMaxCount + 999 + NSExtensionActivationSupportsMovieWithMaxCount + 999 + NSExtensionActivationSupportsImageWithMaxCount + 999 + NSExtensionActivationSupportsFileWithMaxCount + 999 + NSExtensionActivationSupportsAttachmentsWithMaxCount + 999 + NSExtensionActivationSupportsText + + + PHSupportedMediaTypes + + Video + Image + + + NSExtensionMainStoryboard + MainInterface + NSExtensionPointIdentifier + com.apple.share-services + + + diff --git a/app/ios/ShareExtension/ShareExtension.entitlements b/app/ios/ShareExtension/ShareExtension.entitlements new file mode 100644 index 0000000..d0f632a --- /dev/null +++ b/app/ios/ShareExtension/ShareExtension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.org.localsend.localsendApp + + + diff --git a/app/ios/ShareExtension/ShareViewController.swift b/app/ios/ShareExtension/ShareViewController.swift new file mode 100644 index 0000000..b17cff8 --- /dev/null +++ b/app/ios/ShareExtension/ShareViewController.swift @@ -0,0 +1,3 @@ +import share_handler_ios_models + +class ShareViewController: ShareHandlerIosViewController {} diff --git a/app/lib/config/init.dart b/app/lib/config/init.dart new file mode 100644 index 0000000..95085ae --- /dev/null +++ b/app/lib/config/init.dart @@ -0,0 +1,342 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:bitsdojo_window/bitsdojo_window.dart'; +import 'package:common/api_route_builder.dart'; +import 'package:common/constants.dart'; +import 'package:common/isolate.dart'; +import 'package:common/model/dto/file_dto.dart'; +import 'package:common/model/dto/multicast_dto.dart'; +import 'package:common/util/logger.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_displaymode/flutter_displaymode.dart'; +import 'package:localsend_app/config/refena.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/pages/home_page.dart'; +import 'package:localsend_app/pages/home_page_controller.dart'; +import 'package:localsend_app/provider/animation_provider.dart'; +import 'package:localsend_app/provider/app_arguments_provider.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/provider/network/nearby_devices_provider.dart'; +import 'package:localsend_app/provider/network/server/server_provider.dart'; +import 'package:localsend_app/provider/network/webrtc/signaling_provider.dart'; +import 'package:localsend_app/provider/persistence_provider.dart'; + +// [FOSS_REMOVE_START] +import 'package:localsend_app/provider/purchase_provider.dart'; + +// [FOSS_REMOVE_END] +import 'package:localsend_app/provider/selection/selected_sending_files_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/provider/tv_provider.dart'; +import 'package:localsend_app/provider/window_dimensions_provider.dart'; +import 'package:localsend_app/rust/api/logging.dart' as rust_logging; +import 'package:localsend_app/rust/frb_generated.dart'; +import 'package:localsend_app/util/i18n.dart'; +import 'package:localsend_app/util/native/autostart_helper.dart'; +import 'package:localsend_app/util/native/cache_helper.dart'; +import 'package:localsend_app/util/native/content_uri_helper.dart'; +import 'package:localsend_app/util/native/context_menu_helper.dart'; +import 'package:localsend_app/util/native/cross_file_converters.dart'; +import 'package:localsend_app/util/native/device_info_helper.dart'; +import 'package:localsend_app/util/native/macos_channel.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/util/native/tray_helper.dart'; +import 'package:localsend_app/util/rhttp.dart'; +import 'package:localsend_app/util/ui/dynamic_colors.dart'; +import 'package:localsend_app/util/ui/snackbar.dart'; +import 'package:logging/logging.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:rhttp/rhttp.dart'; +import 'package:share_handler/share_handler.dart'; +import 'package:window_manager/window_manager.dart'; + +final _logger = Logger('Init'); + +/// Will be called before the MaterialApp started +Future preInit(List args) async { + WidgetsFlutterBinding.ensureInitialized(); + + initLogger(args.contains('-v') || args.contains('--verbose') ? Level.ALL : Level.INFO); + MapperContainer.globals.use(const FileDtoMapper()); + + await RustLib.init(); + + if (kDebugMode) { + try { + await rust_logging.enableDebugLogging(); + } catch (e) { + _logger.warning('Enabling debug logging failed', e); + } + } + + await Rhttp.init(); + + final dynamicColors = await getDynamicColors(); + + final persistenceService = await PersistenceService.initialize( + supportsDynamicColors: dynamicColors != null, + ); + + if (persistenceService.isFirstAppStart && !persistenceService.isPortableMode()) { + await enableContextMenu(); + } + + await initI18n(); + + bool startHidden = false; + if (checkPlatformIsDesktop()) { + // Check if this app is already open and let it "show up". + // If this is the case, then exit the current instance. + + final client = createRhttpClient(const Duration(milliseconds: 100), persistenceService.getSecurityContext()); + + try { + await client.post( + ApiRoute.show.targetRaw( + '127.0.0.1', + persistenceService.getPort(), + persistenceService.isHttps(), + peerProtocolVersion, + ), + query: { + 'token': persistenceService.getShowToken(), + }, + body: HttpBody.json({ + 'args': args, + }), + ); + exit(0); // Another instance does exist because no error is thrown + } catch (_) {} + + // initialize tray AFTER i18n has been initialized + try { + await initTray(); + } catch (e) { + _logger.warning('Initializing tray failed: $e'); + } + + // initialize size and position + await WindowManager.instance.ensureInitialized(); + await WindowDimensionsController(persistenceService).initDimensionsConfiguration(); + if (args.contains(startHiddenFlag)) { + // keep this app hidden + startHidden = true; + } else if (defaultTargetPlatform == TargetPlatform.macOS) { + startHidden = await isLaunchedAsLoginItem() && await getLaunchAtLoginMinimized(); + } + + doWhenWindowReady(() { + if (startHidden) { + unawaited(hideToTray()); + } else { + unawaited(showFromTray()); + } + }); + + if (defaultTargetPlatform == TargetPlatform.macOS) { + await setupStatusBar(); + } + } + + setDefaultRouteTransition(); + + final container = RefenaContainer( + observers: kDebugMode ? [CustomRefenaObserver()] : [], + overrides: [ + persistenceProvider.overrideWithValue(persistenceService), + deviceRawInfoProvider.overrideWithValue(await getDeviceInfo()), + appArgumentsProvider.overrideWithValue(args), + tvProvider.overrideWithValue(await checkIfTv()), + dynamicColorsProvider.overrideWithValue(dynamicColors), + sleepProvider.overrideWithInitialState((ref) => startHidden), + ], + platformHint: RefenaScope.getPlatformHint(), // help Refena know the correct platform + ); + + // initialize multi-threading + container.set( + parentIsolateProvider.overrideWithNotifier((ref) { + final settings = ref.read(settingsProvider); + return IsolateController( + initialState: ParentIsolateState.initial( + SyncState( + init: () async { + await Rhttp.init(); + }, + rootIsolateToken: RootIsolateToken.instance!, + httpClientFactory: RhttpWrapper.create, + securityContext: persistenceService.getSecurityContext(), + deviceInfo: ref.read(deviceInfoProvider), + alias: settings.alias, + port: settings.port, + networkWhitelist: settings.networkWhitelist, + networkBlacklist: settings.networkBlacklist, + protocol: settings.https ? ProtocolType.https : ProtocolType.http, + multicastGroup: settings.multicastGroup, + discoveryTimeout: settings.discoveryTimeout, + serverRunning: true, + download: false, + ), + ), + ); + }), + ); + + await container + .redux(parentIsolateProvider) + .dispatchAsync( + IsolateSetupAction( + uriContentStreamResolver: AndroidUriContentStreamResolver(), + ), + ); + + return container; +} + +StreamSubscription? _sharedMediaSubscription; + +/// Will be called when home page has been initialized +Future postInit(BuildContext context, Ref ref, bool appStart) async { + await updateSystemOverlayStyle(context); + + if (checkPlatform([TargetPlatform.android])) { + try { + await FlutterDisplayMode.setHighRefreshRate(); + } catch (e) { + _logger.warning('Setting high refresh rate failed', e); + } + } + + try { + await ref.notifier(serverProvider).startServerFromSettings(); + } catch (e) { + if (context.mounted) { + context.showSnackBar(e.toString()); + } + } + + try { + ref.redux(nearbyDevicesProvider).dispatchAsync(StartMulticastListener()); // ignore: unawaited_futures + } catch (e) { + _logger.warning('Starting multicast listener failed', e); + } + + ref.redux(signalingProvider).dispatch(SetupSignalingConnection()); + + if (appStart) { + if (defaultTargetPlatform == TargetPlatform.macOS) { + // handle dropped files + pendingFilesStream.listen((files) async { + await ref.global.dispatchAsync( + _HandleAppStartArgumentsAction( + args: files, + ), + ); + }); + + // handle dropped strings + pendingStringsStream.listen((pendingStrings) { + for (final string in pendingStrings) { + ref.redux(selectedSendingFilesProvider).dispatch(AddMessageAction(message: string)); + } + ref.redux(homePageControllerProvider).dispatch(ChangeTabAction(HomeTab.send)); + }); + + await setupMethodCallHandler(); + } else { + final args = ref.read(appArgumentsProvider); + await ref.global.dispatchAsync( + _HandleAppStartArgumentsAction( + args: args, + ), + ); + } + } + + bool hasInitialShare = false; + + if (checkPlatformCanReceiveShareIntent()) { + final shareHandler = ShareHandlerPlatform.instance; + + if (appStart) { + final initialSharedPayload = await shareHandler.getInitialSharedMedia(); + if (initialSharedPayload != null) { + hasInitialShare = true; + // ignore: unawaited_futures + ref.global.dispatchAsync( + _HandleShareIntentAction( + payload: initialSharedPayload, + ), + ); + } + } + + _sharedMediaSubscription?.cancel(); // ignore: unawaited_futures + _sharedMediaSubscription = shareHandler.sharedMediaStream.listen((SharedMedia payload) async { + await ref.global.dispatchAsync( + _HandleShareIntentAction( + payload: payload, + ), + ); + }); + } + + if (appStart && !hasInitialShare && (checkPlatformWithGallery() || checkPlatformCanReceiveShareIntent())) { + // Clear cache on every app start. + // If we received a share intent, then don't clear it, otherwise the shared file will be lost. + ref.global.dispatchAsync(ClearCacheAction()); // ignore: unawaited_futures + } + + // [FOSS_REMOVE_START] + if (checkPlatformSupportPayment()) { + // ignore: unawaited_futures + ref.redux(purchaseProvider).dispatchAsync(InitPurchaseStream()); + } + // [FOSS_REMOVE_END] +} + +class _HandleShareIntentAction extends AsyncGlobalAction { + final SharedMedia payload; + + _HandleShareIntentAction({ + required this.payload, + }); + + @override + Future reduce() async { + final message = payload.content; + if (message != null && message.trim().isNotEmpty) { + ref.redux(selectedSendingFilesProvider).dispatch(AddMessageAction(message: message)); + } + await ref + .redux(selectedSendingFilesProvider) + .dispatchAsync( + AddFilesAction( + files: payload.attachments?.where((a) => a != null).cast() ?? [], + converter: CrossFileConverters.convertSharedAttachment, + ), + ); + + ref.redux(homePageControllerProvider).dispatch(ChangeTabAction(HomeTab.send)); + } +} + +class _HandleAppStartArgumentsAction extends AsyncGlobalAction { + final List args; + + _HandleAppStartArgumentsAction({ + required this.args, + }); + + @override + Future reduce() async { + final filesAdded = await ref.redux(selectedSendingFilesProvider).dispatchAsyncTakeResult(LoadSelectionFromArgsAction(args)); + if (filesAdded) { + ref.redux(homePageControllerProvider).dispatch(ChangeTabAction(HomeTab.send)); + } + } +} diff --git a/app/lib/config/init_error.dart b/app/lib/config/init_error.dart new file mode 100644 index 0000000..90e0f2b --- /dev/null +++ b/app/lib/config/init_error.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/util/native/tray_helper.dart'; +import 'package:logging/logging.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:window_manager/window_manager.dart'; + +final _logger = Logger('Init'); + +/// Shows an alternative app if the initialization failed. +void showInitErrorApp({ + required Object error, + required StackTrace stackTrace, +}) async { + _logger.severe('Error during init', error, stackTrace); + + if (checkPlatformIsDesktop()) { + await WindowManager.instance.ensureInitialized(); + await WindowManager.instance.show(); + } + + runApp( + RefenaScope( + child: _ErrorApp( + error: error, + stackTrace: stackTrace, + ), + ), + ); + + await showFromTray(); +} + +class _ErrorApp extends StatefulWidget { + final Object error; + final StackTrace stackTrace; + + const _ErrorApp({ + required this.error, + required this.stackTrace, + }); + + @override + State<_ErrorApp> createState() => _ErrorAppState(); +} + +class _ErrorAppState extends State<_ErrorApp> { + final _controller = TextEditingController(); + String? version; + + @override + void initState() { + super.initState(); + + _controller.text = 'Error: ${widget.error}\n\n${widget.stackTrace}'; + WidgetsBinding.instance.addPostFrameCallback((_) async { + final info = await PackageInfo.fromPlatform(); + _controller.text = 'LocalSend ${info.version} (${info.buildNumber})\n\nError: ${widget.error}\n\n${widget.stackTrace}'; + }); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'LocalSend: Error', + debugShowCheckedModeBanner: false, + home: Scaffold( + body: TextFormField( + controller: _controller, + maxLines: null, + readOnly: true, + decoration: const InputDecoration( + contentPadding: EdgeInsets.all(10), + border: OutlineInputBorder( + borderSide: BorderSide(), + ), + ), + ), + ), + ); + } +} diff --git a/app/lib/config/refena.dart b/app/lib/config/refena.dart new file mode 100644 index 0000000..bfea14d --- /dev/null +++ b/app/lib/config/refena.dart @@ -0,0 +1,34 @@ +import 'package:localsend_app/provider/local_ip_provider.dart'; +import 'package:localsend_app/provider/logging/discovery_logs_provider.dart'; +import 'package:localsend_app/provider/progress_provider.dart'; +import 'package:logging/logging.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:refena_inspector_client/refena_inspector_client.dart'; + +final _logger = Logger('Refena'); + +class CustomRefenaObserver extends RefenaMultiObserver { + CustomRefenaObserver() + : super( + observers: [ + RefenaDebugObserver( + onLine: (line) => _logger.info(line), + exclude: _exclude, + ), + RefenaTracingObserver( + limit: 100, + exclude: _exclude, + ), + RefenaInspectorObserver(), + ], + ); +} + +bool _exclude(RefenaEvent event) { + return switch (event) { + ChangeEvent() => event.notifier is DiscoveryLogger || event.notifier is LocalIpService || event.notifier is ProgressNotifier, + ActionDispatchedEvent() => event.action.runtimeType.toString() == '_FetchLocalIpAction', + ActionFinishedEvent() => event.action.runtimeType.toString() == '_FetchLocalIpAction', + _ => false, + }; +} diff --git a/app/lib/config/theme.dart b/app/lib/config/theme.dart new file mode 100644 index 0000000..a284902 --- /dev/null +++ b/app/lib/config/theme.dart @@ -0,0 +1,204 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/persistence/color_mode.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/util/ui/dynamic_colors.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:yaru/yaru.dart' as yaru; + +final _borderRadius = BorderRadius.circular(5); + +/// On desktop, we need to add additional padding to achieve the same visual appearance as on mobile +double get desktopPaddingFix => checkPlatformIsDesktop() ? 8 : 0; + +ThemeData getTheme(ColorMode colorMode, Brightness brightness, DynamicColors? dynamicColors) { + if (colorMode == ColorMode.yaru) { + return _getYaruTheme(brightness); + } + + final colorScheme = _determineColorScheme(colorMode, brightness, dynamicColors); + + final lightInputBorder = OutlineInputBorder( + borderSide: BorderSide(color: colorScheme.secondaryContainer), + borderRadius: _borderRadius, + ); + + final darkInputBorder = OutlineInputBorder( + borderSide: BorderSide(color: colorScheme.secondaryContainer), + borderRadius: _borderRadius, + ); + + // https://github.com/localsend/localsend/issues/52 + final String? fontFamily; + if (checkPlatform([TargetPlatform.windows])) { + fontFamily = switch (LocaleSettings.currentLocale) { + AppLocale.ja => 'Yu Gothic UI', + AppLocale.ko => 'Malgun Gothic', + AppLocale.zhCn => 'Microsoft YaHei UI', + AppLocale.zhHk || AppLocale.zhTw => 'Microsoft JhengHei UI', + _ => 'Segoe UI Variable Display', + }; + } else if (checkPlatform([TargetPlatform.linux])) { + fontFamily = switch (LocaleSettings.currentLocale) { + AppLocale.ja => 'Noto Sans CJK JP', + AppLocale.ko => 'Noto Sans CJK KR', + AppLocale.zhCn => 'Noto Sans CJK SC', + AppLocale.zhHk || AppLocale.zhTw => 'Noto Sans CJK TC', + _ => 'Noto Sans', + }; + } else { + fontFamily = null; + } + + return ThemeData( + colorScheme: colorScheme, + useMaterial3: true, + navigationBarTheme: colorScheme.brightness == Brightness.dark + ? NavigationBarThemeData( + iconTheme: WidgetStateProperty.all(const IconThemeData(color: Colors.white)), + ) + : null, + inputDecorationTheme: InputDecorationTheme( + filled: true, + fillColor: colorScheme.secondaryContainer, + border: colorScheme.brightness == Brightness.light ? lightInputBorder : darkInputBorder, + focusedBorder: colorScheme.brightness == Brightness.light ? lightInputBorder : darkInputBorder, + enabledBorder: colorScheme.brightness == Brightness.light ? lightInputBorder : darkInputBorder, + contentPadding: const EdgeInsets.symmetric(vertical: 0, horizontal: 10), + ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + foregroundColor: colorScheme.brightness == Brightness.dark ? Colors.white : null, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8 + desktopPaddingFix), + ), + ), + textButtonTheme: TextButtonThemeData( + style: TextButton.styleFrom( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8 + desktopPaddingFix), + ), + ), + fontFamily: fontFamily, + ); +} + +Future updateSystemOverlayStyle(BuildContext context) async { + final brightness = Theme.of(context).brightness; + await updateSystemOverlayStyleWithBrightness(brightness); +} + +Future updateSystemOverlayStyleWithBrightness(Brightness brightness) async { + if (checkPlatform([TargetPlatform.android])) { + // See https://github.com/flutter/flutter/issues/90098 + final darkMode = brightness == Brightness.dark; + final androidSdkInt = RefenaScope.defaultRef.read(deviceInfoProvider).androidSdkInt ?? 0; + final bool edgeToEdge = androidSdkInt >= 29; + + SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); // ignore: unawaited_futures + + SystemChrome.setSystemUIOverlayStyle( + SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarIconBrightness: brightness == Brightness.light ? Brightness.dark : Brightness.light, + systemNavigationBarColor: edgeToEdge ? Colors.transparent : (darkMode ? Colors.black : Colors.white), + systemNavigationBarContrastEnforced: false, + systemNavigationBarIconBrightness: darkMode ? Brightness.light : Brightness.dark, + ), + ); + } else { + SystemChrome.setSystemUIOverlayStyle( + SystemUiOverlayStyle( + statusBarBrightness: brightness, // iOS + statusBarColor: Colors.transparent, // Not relevant to this issue + ), + ); + } +} + +extension ThemeDataExt on ThemeData { + /// This is the actual [cardColor] being used. + Color get cardColorWithElevation { + return ElevationOverlay.applySurfaceTint(cardColor, colorScheme.surfaceTint, 1); + } +} + +extension ColorSchemeExt on ColorScheme { + Color get warning { + return Colors.orange; + } + + Color? get secondaryContainerIfDark { + return brightness == Brightness.dark ? secondaryContainer : null; + } + + Color? get onSecondaryContainerIfDark { + return brightness == Brightness.dark ? onSecondaryContainer : null; + } +} + +extension InputDecorationThemeExt on InputDecorationThemeData { + BorderRadius get borderRadius => _borderRadius; +} + +ColorScheme _determineColorScheme(ColorMode mode, Brightness brightness, DynamicColors? dynamicColors) { + final defaultColorScheme = ColorScheme.fromSeed( + seedColor: Colors.teal, + brightness: brightness, + ); + + final colorScheme = switch (mode) { + ColorMode.system => brightness == Brightness.light ? dynamicColors?.light : dynamicColors?.dark, + ColorMode.localsend => null, + ColorMode.oled => (dynamicColors?.dark ?? defaultColorScheme).copyWith( + surface: Colors.black, + ), + ColorMode.yaru => throw 'Should reach here', + }; + + return colorScheme ?? defaultColorScheme; +} + +ThemeData _getYaruTheme(Brightness brightness) { + final baseTheme = brightness == Brightness.light ? yaru.yaruLight : yaru.yaruDark; + final colorScheme = baseTheme.colorScheme; + + final lightInputBorder = OutlineInputBorder( + borderSide: BorderSide(color: colorScheme.secondaryContainer), + borderRadius: _borderRadius, + ); + + final darkInputBorder = OutlineInputBorder( + borderSide: BorderSide(color: colorScheme.secondaryContainer), + borderRadius: _borderRadius, + ); + + InputDecorationThemeData; + + return baseTheme.copyWith( + navigationBarTheme: colorScheme.brightness == Brightness.dark + ? NavigationBarThemeData( + iconTheme: WidgetStateProperty.all(const IconThemeData(color: Colors.white)), + ) + : null, + inputDecorationTheme: InputDecorationTheme( + filled: true, + fillColor: colorScheme.secondaryContainer, + border: colorScheme.brightness == Brightness.light ? lightInputBorder : darkInputBorder, + focusedBorder: colorScheme.brightness == Brightness.light ? lightInputBorder : darkInputBorder, + enabledBorder: colorScheme.brightness == Brightness.light ? lightInputBorder : darkInputBorder, + contentPadding: const EdgeInsets.symmetric(vertical: 0, horizontal: 10), + ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + foregroundColor: colorScheme.brightness == Brightness.dark ? Colors.white : null, + padding: checkPlatformIsDesktop() ? const EdgeInsets.all(16) : const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + ), + ), + textButtonTheme: TextButtonThemeData( + style: TextButton.styleFrom( + padding: checkPlatformIsDesktop() ? const EdgeInsets.all(16) : const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + ), + ), + ); +} diff --git a/app/lib/gen/assets.gen.dart b/app/lib/gen/assets.gen.dart new file mode 100644 index 0000000..82e1f8c --- /dev/null +++ b/app/lib/gen/assets.gen.dart @@ -0,0 +1,149 @@ +// dart format width=150 + +/// GENERATED CODE - DO NOT MODIFY BY HAND +/// ***************************************************** +/// FlutterGen +/// ***************************************************** + +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: deprecated_member_use,directives_ordering,implicit_dynamic_list_literal,unnecessary_import + +import 'package:flutter/widgets.dart'; + +class $AssetsImgGen { + const $AssetsImgGen(); + + /// File path: assets/img/logo-128.png + AssetGenImage get logo128 => const AssetGenImage('assets/img/logo-128.png'); + + /// File path: assets/img/logo-256.png + AssetGenImage get logo256 => const AssetGenImage('assets/img/logo-256.png'); + + /// File path: assets/img/logo-32-black.png + AssetGenImage get logo32Black => const AssetGenImage('assets/img/logo-32-black.png'); + + /// File path: assets/img/logo-32-white.png + AssetGenImage get logo32White => const AssetGenImage('assets/img/logo-32-white.png'); + + /// File path: assets/img/logo-32.png + AssetGenImage get logo32 => const AssetGenImage('assets/img/logo-32.png'); + + /// File path: assets/img/logo-512-white.png + AssetGenImage get logo512White => const AssetGenImage('assets/img/logo-512-white.png'); + + /// File path: assets/img/logo-512.png + AssetGenImage get logo512 => const AssetGenImage('assets/img/logo-512.png'); + + /// File path: assets/img/logo.ico + String get logo => 'assets/img/logo.ico'; + + /// List of all assets + List get values => [logo128, logo256, logo32Black, logo32White, logo32, logo512White, logo512, logo]; +} + +class $AssetsWebGen { + const $AssetsWebGen(); + + /// File path: assets/web/error-403.html + String get error403 => 'assets/web/error-403.html'; + + /// File path: assets/web/index.html + String get index => 'assets/web/index.html'; + + /// File path: assets/web/main.js + String get main => 'assets/web/main.js'; + + /// List of all assets + List get values => [error403, index, main]; +} + +class Assets { + const Assets._(); + + static const String changelog = 'assets/CHANGELOG.md'; + static const $AssetsImgGen img = $AssetsImgGen(); + static const $AssetsWebGen web = $AssetsWebGen(); + + /// List of all assets + static List get values => [changelog]; +} + +class AssetGenImage { + const AssetGenImage(this._assetName, {this.size, this.flavors = const {}, this.animation}); + + final String _assetName; + + final Size? size; + final Set flavors; + final AssetGenImageAnimation? animation; + + Image image({ + Key? key, + AssetBundle? bundle, + ImageFrameBuilder? frameBuilder, + ImageErrorWidgetBuilder? errorBuilder, + String? semanticLabel, + bool excludeFromSemantics = false, + double? scale, + double? width, + double? height, + Color? color, + Animation? opacity, + BlendMode? colorBlendMode, + BoxFit? fit, + AlignmentGeometry alignment = Alignment.center, + ImageRepeat repeat = ImageRepeat.noRepeat, + Rect? centerSlice, + bool matchTextDirection = false, + bool gaplessPlayback = true, + bool isAntiAlias = false, + String? package, + FilterQuality filterQuality = FilterQuality.medium, + int? cacheWidth, + int? cacheHeight, + }) { + return Image.asset( + _assetName, + key: key, + bundle: bundle, + frameBuilder: frameBuilder, + errorBuilder: errorBuilder, + semanticLabel: semanticLabel, + excludeFromSemantics: excludeFromSemantics, + scale: scale, + width: width, + height: height, + color: color, + opacity: opacity, + colorBlendMode: colorBlendMode, + fit: fit, + alignment: alignment, + repeat: repeat, + centerSlice: centerSlice, + matchTextDirection: matchTextDirection, + gaplessPlayback: gaplessPlayback, + isAntiAlias: isAntiAlias, + package: package, + filterQuality: filterQuality, + cacheWidth: cacheWidth, + cacheHeight: cacheHeight, + ); + } + + ImageProvider provider({AssetBundle? bundle, String? package}) { + return AssetImage(_assetName, bundle: bundle, package: package); + } + + String get path => _assetName; + + String get keyName => _assetName; +} + +class AssetGenImageAnimation { + const AssetGenImageAnimation({required this.isAnimation, required this.duration, required this.frames}); + + final bool isAnimation; + final Duration duration; + final int frames; +} diff --git a/app/lib/gen/strings.g.dart b/app/lib/gen/strings.g.dart new file mode 100644 index 0000000..7e336eb --- /dev/null +++ b/app/lib/gen/strings.g.dart @@ -0,0 +1,956 @@ +/// Generated file. Do not edit. +/// +/// Source: assets/i18n +/// To regenerate, run: `dart run slang` +/// +/// Locales: 53 +/// Strings: 17825 (336 per locale) + +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'package:slang_flutter/slang_flutter.dart'; +export 'package:slang_flutter/slang_flutter.dart'; + +import 'strings_ar.g.dart' deferred as l_ar; +import 'strings_az.g.dart' deferred as l_az; +import 'strings_bg.g.dart' deferred as l_bg; +import 'strings_bn.g.dart' deferred as l_bn; +import 'strings_ca.g.dart' deferred as l_ca; +import 'strings_cs.g.dart' deferred as l_cs; +import 'strings_da.g.dart' deferred as l_da; +import 'strings_de.g.dart' deferred as l_de; +import 'strings_el.g.dart' deferred as l_el; +import 'strings_et.g.dart' deferred as l_et; +import 'strings_eu.g.dart' deferred as l_eu; +import 'strings_fa.g.dart' deferred as l_fa; +import 'strings_fi.g.dart' deferred as l_fi; +import 'strings_fr.g.dart' deferred as l_fr; +import 'strings_gl.g.dart' deferred as l_gl; +import 'strings_gu.g.dart' deferred as l_gu; +import 'strings_he.g.dart' deferred as l_he; +import 'strings_hi.g.dart' deferred as l_hi; +import 'strings_hu.g.dart' deferred as l_hu; +import 'strings_id.g.dart' deferred as l_id; +import 'strings_it.g.dart' deferred as l_it; +import 'strings_ja.g.dart' deferred as l_ja; +import 'strings_km.g.dart' deferred as l_km; +import 'strings_ko.g.dart' deferred as l_ko; +import 'strings_ml.g.dart' deferred as l_ml; +import 'strings_mn.g.dart' deferred as l_mn; +import 'strings_ms.g.dart' deferred as l_ms; +import 'strings_ne.g.dart' deferred as l_ne; +import 'strings_nl.g.dart' deferred as l_nl; +import 'strings_pl.g.dart' deferred as l_pl; +import 'strings_ro.g.dart' deferred as l_ro; +import 'strings_ru.g.dart' deferred as l_ru; +import 'strings_si.g.dart' deferred as l_si; +import 'strings_sk.g.dart' deferred as l_sk; +import 'strings_sl.g.dart' deferred as l_sl; +import 'strings_sr.g.dart' deferred as l_sr; +import 'strings_sv.g.dart' deferred as l_sv; +import 'strings_ta.g.dart' deferred as l_ta; +import 'strings_th.g.dart' deferred as l_th; +import 'strings_tr.g.dart' deferred as l_tr; +import 'strings_uk.g.dart' deferred as l_uk; +import 'strings_ur.g.dart' deferred as l_ur; +import 'strings_vi.g.dart' deferred as l_vi; +import 'strings_en_IN.g.dart' deferred as l_en_IN; +import 'strings_es_ES.g.dart' deferred as l_es_ES; +import 'strings_fil_PH.g.dart' deferred as l_fil_PH; +import 'strings_pt_BR.g.dart' deferred as l_pt_BR; +import 'strings_pt_PT.g.dart' deferred as l_pt_PT; +import 'strings_sr_Cyrl.g.dart' deferred as l_sr_Cyrl; +import 'strings_zh_CN.g.dart' deferred as l_zh_CN; +import 'strings_zh_HK.g.dart' deferred as l_zh_HK; +import 'strings_zh_TW.g.dart' deferred as l_zh_TW; +part 'strings_en.g.dart'; + +/// Supported locales. +/// +/// Usage: +/// - LocaleSettings.setLocale(AppLocale.en) // set locale +/// - Locale locale = AppLocale.en.flutterLocale // get flutter locale from enum +/// - if (LocaleSettings.currentLocale == AppLocale.en) // locale check +enum AppLocale with BaseAppLocale { + en(languageCode: 'en'), + ar(languageCode: 'ar'), + az(languageCode: 'az'), + bg(languageCode: 'bg'), + bn(languageCode: 'bn'), + ca(languageCode: 'ca'), + cs(languageCode: 'cs'), + da(languageCode: 'da'), + de(languageCode: 'de'), + el(languageCode: 'el'), + et(languageCode: 'et'), + eu(languageCode: 'eu'), + fa(languageCode: 'fa'), + fi(languageCode: 'fi'), + fr(languageCode: 'fr'), + gl(languageCode: 'gl'), + gu(languageCode: 'gu'), + he(languageCode: 'he'), + hi(languageCode: 'hi'), + hu(languageCode: 'hu'), + id(languageCode: 'id'), + it(languageCode: 'it'), + ja(languageCode: 'ja'), + km(languageCode: 'km'), + ko(languageCode: 'ko'), + ml(languageCode: 'ml'), + mn(languageCode: 'mn'), + ms(languageCode: 'ms'), + ne(languageCode: 'ne'), + nl(languageCode: 'nl'), + pl(languageCode: 'pl'), + ro(languageCode: 'ro'), + ru(languageCode: 'ru'), + si(languageCode: 'si'), + sk(languageCode: 'sk'), + sl(languageCode: 'sl'), + sr(languageCode: 'sr'), + sv(languageCode: 'sv'), + ta(languageCode: 'ta'), + th(languageCode: 'th'), + tr(languageCode: 'tr'), + uk(languageCode: 'uk'), + ur(languageCode: 'ur'), + vi(languageCode: 'vi'), + enIn(languageCode: 'en', countryCode: 'IN'), + esEs(languageCode: 'es', countryCode: 'ES'), + filPh(languageCode: 'fil', countryCode: 'PH'), + ptBr(languageCode: 'pt', countryCode: 'BR'), + ptPt(languageCode: 'pt', countryCode: 'PT'), + srCyrl(languageCode: 'sr', scriptCode: 'Cyrl'), + zhCn(languageCode: 'zh', countryCode: 'CN'), + zhHk(languageCode: 'zh', countryCode: 'HK'), + zhTw(languageCode: 'zh', countryCode: 'TW') + ; + + const AppLocale({ + required this.languageCode, + this.scriptCode, // ignore: unused_element, unused_element_parameter + this.countryCode, // ignore: unused_element, unused_element_parameter + }); + + @override + final String languageCode; + @override + final String? scriptCode; + @override + final String? countryCode; + + @override + Future build({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + }) async { + switch (this) { + case AppLocale.en: + return TranslationsEn( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ar: + await l_ar.loadLibrary(); + return l_ar.TranslationsAr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.az: + await l_az.loadLibrary(); + return l_az.TranslationsAz( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.bg: + await l_bg.loadLibrary(); + return l_bg.TranslationsBg( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.bn: + await l_bn.loadLibrary(); + return l_bn.TranslationsBn( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ca: + await l_ca.loadLibrary(); + return l_ca.TranslationsCa( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.cs: + await l_cs.loadLibrary(); + return l_cs.TranslationsCs( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.da: + await l_da.loadLibrary(); + return l_da.TranslationsDa( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.de: + await l_de.loadLibrary(); + return l_de.TranslationsDe( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.el: + await l_el.loadLibrary(); + return l_el.TranslationsEl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.et: + await l_et.loadLibrary(); + return l_et.TranslationsEt( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.eu: + await l_eu.loadLibrary(); + return l_eu.TranslationsEu( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.fa: + await l_fa.loadLibrary(); + return l_fa.TranslationsFa( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.fi: + await l_fi.loadLibrary(); + return l_fi.TranslationsFi( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.fr: + await l_fr.loadLibrary(); + return l_fr.TranslationsFr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.gl: + await l_gl.loadLibrary(); + return l_gl.TranslationsGl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.gu: + await l_gu.loadLibrary(); + return l_gu.TranslationsGu( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.he: + await l_he.loadLibrary(); + return l_he.TranslationsHe( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.hi: + await l_hi.loadLibrary(); + return l_hi.TranslationsHi( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.hu: + await l_hu.loadLibrary(); + return l_hu.TranslationsHu( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.id: + await l_id.loadLibrary(); + return l_id.TranslationsId( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.it: + await l_it.loadLibrary(); + return l_it.TranslationsIt( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ja: + await l_ja.loadLibrary(); + return l_ja.TranslationsJa( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.km: + await l_km.loadLibrary(); + return l_km.TranslationsKm( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ko: + await l_ko.loadLibrary(); + return l_ko.TranslationsKo( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ml: + await l_ml.loadLibrary(); + return l_ml.TranslationsMl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.mn: + await l_mn.loadLibrary(); + return l_mn.TranslationsMn( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ms: + await l_ms.loadLibrary(); + return l_ms.TranslationsMs( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ne: + await l_ne.loadLibrary(); + return l_ne.TranslationsNe( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.nl: + await l_nl.loadLibrary(); + return l_nl.TranslationsNl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.pl: + await l_pl.loadLibrary(); + return l_pl.TranslationsPl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ro: + await l_ro.loadLibrary(); + return l_ro.TranslationsRo( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ru: + await l_ru.loadLibrary(); + return l_ru.TranslationsRu( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.si: + await l_si.loadLibrary(); + return l_si.TranslationsSi( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.sk: + await l_sk.loadLibrary(); + return l_sk.TranslationsSk( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.sl: + await l_sl.loadLibrary(); + return l_sl.TranslationsSl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.sr: + await l_sr.loadLibrary(); + return l_sr.TranslationsSr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.sv: + await l_sv.loadLibrary(); + return l_sv.TranslationsSv( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ta: + await l_ta.loadLibrary(); + return l_ta.TranslationsTa( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.th: + await l_th.loadLibrary(); + return l_th.TranslationsTh( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.tr: + await l_tr.loadLibrary(); + return l_tr.TranslationsTr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.uk: + await l_uk.loadLibrary(); + return l_uk.TranslationsUk( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ur: + await l_ur.loadLibrary(); + return l_ur.TranslationsUr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.vi: + await l_vi.loadLibrary(); + return l_vi.TranslationsVi( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.enIn: + await l_en_IN.loadLibrary(); + return l_en_IN.TranslationsEnIn( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.esEs: + await l_es_ES.loadLibrary(); + return l_es_ES.TranslationsEsEs( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.filPh: + await l_fil_PH.loadLibrary(); + return l_fil_PH.TranslationsFilPh( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ptBr: + await l_pt_BR.loadLibrary(); + return l_pt_BR.TranslationsPtBr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ptPt: + await l_pt_PT.loadLibrary(); + return l_pt_PT.TranslationsPtPt( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.srCyrl: + await l_sr_Cyrl.loadLibrary(); + return l_sr_Cyrl.TranslationsSrCyrl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.zhCn: + await l_zh_CN.loadLibrary(); + return l_zh_CN.TranslationsZhCn( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.zhHk: + await l_zh_HK.loadLibrary(); + return l_zh_HK.TranslationsZhHk( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.zhTw: + await l_zh_TW.loadLibrary(); + return l_zh_TW.TranslationsZhTw( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + } + } + + @override + Translations buildSync({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + }) { + switch (this) { + case AppLocale.en: + return TranslationsEn( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ar: + return l_ar.TranslationsAr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.az: + return l_az.TranslationsAz( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.bg: + return l_bg.TranslationsBg( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.bn: + return l_bn.TranslationsBn( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ca: + return l_ca.TranslationsCa( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.cs: + return l_cs.TranslationsCs( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.da: + return l_da.TranslationsDa( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.de: + return l_de.TranslationsDe( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.el: + return l_el.TranslationsEl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.et: + return l_et.TranslationsEt( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.eu: + return l_eu.TranslationsEu( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.fa: + return l_fa.TranslationsFa( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.fi: + return l_fi.TranslationsFi( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.fr: + return l_fr.TranslationsFr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.gl: + return l_gl.TranslationsGl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.gu: + return l_gu.TranslationsGu( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.he: + return l_he.TranslationsHe( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.hi: + return l_hi.TranslationsHi( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.hu: + return l_hu.TranslationsHu( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.id: + return l_id.TranslationsId( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.it: + return l_it.TranslationsIt( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ja: + return l_ja.TranslationsJa( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.km: + return l_km.TranslationsKm( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ko: + return l_ko.TranslationsKo( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ml: + return l_ml.TranslationsMl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.mn: + return l_mn.TranslationsMn( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ms: + return l_ms.TranslationsMs( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ne: + return l_ne.TranslationsNe( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.nl: + return l_nl.TranslationsNl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.pl: + return l_pl.TranslationsPl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ro: + return l_ro.TranslationsRo( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ru: + return l_ru.TranslationsRu( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.si: + return l_si.TranslationsSi( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.sk: + return l_sk.TranslationsSk( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.sl: + return l_sl.TranslationsSl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.sr: + return l_sr.TranslationsSr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.sv: + return l_sv.TranslationsSv( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ta: + return l_ta.TranslationsTa( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.th: + return l_th.TranslationsTh( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.tr: + return l_tr.TranslationsTr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.uk: + return l_uk.TranslationsUk( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ur: + return l_ur.TranslationsUr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.vi: + return l_vi.TranslationsVi( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.enIn: + return l_en_IN.TranslationsEnIn( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.esEs: + return l_es_ES.TranslationsEsEs( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.filPh: + return l_fil_PH.TranslationsFilPh( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ptBr: + return l_pt_BR.TranslationsPtBr( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.ptPt: + return l_pt_PT.TranslationsPtPt( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.srCyrl: + return l_sr_Cyrl.TranslationsSrCyrl( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.zhCn: + return l_zh_CN.TranslationsZhCn( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.zhHk: + return l_zh_HK.TranslationsZhHk( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + case AppLocale.zhTw: + return l_zh_TW.TranslationsZhTw( + overrides: overrides, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + } + } + + /// Gets current instance managed by [LocaleSettings]. + Translations get translations => LocaleSettings.instance.getTranslations(this); +} + +/// Method A: Simple +/// +/// No rebuild after locale change. +/// Translation happens during initialization of the widget (call of t). +/// Configurable via 'translate_var'. +/// +/// Usage: +/// String a = t.someKey.anotherKey; +Translations get t => LocaleSettings.instance.currentTranslations; + +/// Method B: Advanced +/// +/// All widgets using this method will trigger a rebuild when locale changes. +/// Use this if you have e.g. a settings page where the user can select the locale during runtime. +/// +/// Step 1: +/// wrap your App with +/// TranslationProvider( +/// child: MyApp() +/// ); +/// +/// Step 2: +/// final t = Translations.of(context); // Get t variable. +/// String a = t.someKey.anotherKey; // Use t variable. +class TranslationProvider extends BaseTranslationProvider { + TranslationProvider({required super.child}) : super(settings: LocaleSettings.instance); + + static InheritedLocaleData of(BuildContext context) => InheritedLocaleData.of(context); +} + +/// Method B shorthand via [BuildContext] extension method. +/// Configurable via 'translate_var'. +/// +/// Usage (e.g. in a widget's build method): +/// context.t.someKey.anotherKey +extension BuildContextTranslationsExtension on BuildContext { + Translations get t => TranslationProvider.of(this).translations; +} + +/// Manages all translation instances and the current locale +class LocaleSettings extends BaseFlutterLocaleSettings { + LocaleSettings._() + : super( + utils: AppLocaleUtils.instance, + lazy: true, + ); + + static final instance = LocaleSettings._(); + + // static aliases (checkout base methods for documentation) + static AppLocale get currentLocale => instance.currentLocale; + static Stream getLocaleStream() => instance.getLocaleStream(); + static Future setLocale(AppLocale locale, {bool? listenToDeviceLocale = false}) => + instance.setLocale(locale, listenToDeviceLocale: listenToDeviceLocale); + static Future setLocaleRaw(String rawLocale, {bool? listenToDeviceLocale = false}) => + instance.setLocaleRaw(rawLocale, listenToDeviceLocale: listenToDeviceLocale); + static Future useDeviceLocale() => instance.useDeviceLocale(); + static Future setPluralResolver({String? language, AppLocale? locale, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver}) => + instance.setPluralResolver( + language: language, + locale: locale, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + + // synchronous versions + static AppLocale setLocaleSync(AppLocale locale, {bool? listenToDeviceLocale = false}) => + instance.setLocaleSync(locale, listenToDeviceLocale: listenToDeviceLocale); + static AppLocale setLocaleRawSync(String rawLocale, {bool? listenToDeviceLocale = false}) => + instance.setLocaleRawSync(rawLocale, listenToDeviceLocale: listenToDeviceLocale); + static AppLocale useDeviceLocaleSync() => instance.useDeviceLocaleSync(); + static void setPluralResolverSync({String? language, AppLocale? locale, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver}) => + instance.setPluralResolverSync( + language: language, + locale: locale, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); +} + +/// Provides utility functions without any side effects. +class AppLocaleUtils extends BaseAppLocaleUtils { + AppLocaleUtils._() + : super( + baseLocale: AppLocale.en, + locales: AppLocale.values, + ); + + static final instance = AppLocaleUtils._(); + + // static aliases (checkout base methods for documentation) + static AppLocale parse(String rawLocale) => instance.parse(rawLocale); + static AppLocale parseLocaleParts({required String languageCode, String? scriptCode, String? countryCode}) => + instance.parseLocaleParts(languageCode: languageCode, scriptCode: scriptCode, countryCode: countryCode); + static AppLocale findDeviceLocale() => instance.findDeviceLocale(); + static List get supportedLocales => instance.supportedLocales; + static List get supportedLocalesRaw => instance.supportedLocalesRaw; +} diff --git a/app/lib/gen/strings_ar.g.dart b/app/lib/gen/strings_ar.g.dart new file mode 100644 index 0000000..fe464d4 --- /dev/null +++ b/app/lib/gen/strings_ar.g.dart @@ -0,0 +1,1518 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsAr extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsAr({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ar, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsAr _root = this; // ignore: unused_field + + @override + TranslationsAr $copyWith({TranslationMetadata? meta}) => TranslationsAr(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'العربية'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$ar general = _Translations$general$ar._(_root); + @override + late final _Translations$receiveTab$ar receiveTab = _Translations$receiveTab$ar._(_root); + @override + late final _Translations$sendTab$ar sendTab = _Translations$sendTab$ar._(_root); + @override + late final _Translations$settingsTab$ar settingsTab = _Translations$settingsTab$ar._(_root); + @override + late final _Translations$troubleshootPage$ar troubleshootPage = _Translations$troubleshootPage$ar._(_root); + @override + late final _Translations$receiveHistoryPage$ar receiveHistoryPage = _Translations$receiveHistoryPage$ar._(_root); + @override + late final _Translations$apkPickerPage$ar apkPickerPage = _Translations$apkPickerPage$ar._(_root); + @override + late final _Translations$selectedFilesPage$ar selectedFilesPage = _Translations$selectedFilesPage$ar._(_root); + @override + late final _Translations$receivePage$ar receivePage = _Translations$receivePage$ar._(_root); + @override + late final _Translations$receiveOptionsPage$ar receiveOptionsPage = _Translations$receiveOptionsPage$ar._(_root); + @override + late final _Translations$sendPage$ar sendPage = _Translations$sendPage$ar._(_root); + @override + late final _Translations$progressPage$ar progressPage = _Translations$progressPage$ar._(_root); + @override + late final _Translations$webSharePage$ar webSharePage = _Translations$webSharePage$ar._(_root); + @override + late final _Translations$aboutPage$ar aboutPage = _Translations$aboutPage$ar._(_root); + @override + late final _Translations$donationPage$ar donationPage = _Translations$donationPage$ar._(_root); + @override + late final _Translations$changelogPage$ar changelogPage = _Translations$changelogPage$ar._(_root); + @override + late final _Translations$aliasGenerator$ar aliasGenerator = _Translations$aliasGenerator$ar._(_root); + @override + late final _Translations$dialogs$ar dialogs = _Translations$dialogs$ar._(_root); + @override + late final _Translations$sanitization$ar sanitization = _Translations$sanitization$ar._(_root); + @override + late final _Translations$tray$ar tray = _Translations$tray$ar._(_root); + @override + late final _Translations$web$ar web = _Translations$web$ar._(_root); + @override + late final _Translations$assetPicker$ar assetPicker = _Translations$assetPicker$ar._(_root); + @override + late final _Translations$networkInterfacesPage$ar networkInterfacesPage = _Translations$networkInterfacesPage$ar._(_root); +} + +// Path: general +class _Translations$general$ar extends Translations$general$en { + _Translations$general$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get accept => 'اقبل'; + @override + String get accepted => 'قُبلت'; + @override + String get add => 'إضافة'; + @override + String get advanced => 'متقدم'; + @override + String get cancel => 'ألغِ'; + @override + String get close => 'أغلِق'; + @override + String get confirm => 'أكِّد'; + @override + String get continueStr => 'أكمل'; + @override + String get copy => 'انسخ'; + @override + String get copiedToClipboard => 'نُسخ إلى الحافظة'; + @override + String get decline => 'ارفض'; + @override + String get done => 'تم'; + @override + String get delete => 'احذف'; + @override + String get edit => 'عدِّل'; + @override + String get error => 'خطأ'; + @override + String get example => 'مثال'; + @override + String get files => 'ملفات'; + @override + String get finished => 'انتهى'; + @override + String get hide => 'أخفِ'; + @override + String get off => 'إيقاف'; + @override + String get offline => 'غير متصل بالانترنت'; + @override + String get on => 'تشغيل'; + @override + String get online => 'متصل بالانترنت'; + @override + String get open => 'افتح'; + @override + String get queue => 'صفّ'; + @override + String get quickSave => 'حفظ سريع'; + @override + String get quickSaveFromFavorites => 'حفظ سريع لـ "المفضلات"'; + @override + String get renamed => 'اعادة تسمية'; + @override + String get reset => 'إعادة ضبط'; + @override + String get restart => 'إعادة تشغيل'; + @override + String get settings => 'الإعدادات'; + @override + String get skipped => 'تم تخطيه'; + @override + String get start => 'ابدأ'; + @override + String get stop => 'قف'; + @override + String get save => 'احفظ'; + @override + String get unchanged => 'دون تغيير'; + @override + String get unknown => 'مجهول'; + @override + String get noItemInClipboard => 'لا توجد عناصر في الحافظة.'; +} + +// Path: receiveTab +class _Translations$receiveTab$ar extends Translations$receiveTab$en { + _Translations$receiveTab$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'استلام'; + @override + late final _Translations$receiveTab$infoBox$ar infoBox = _Translations$receiveTab$infoBox$ar._(_root); + @override + late final _Translations$receiveTab$quickSave$ar quickSave = _Translations$receiveTab$quickSave$ar._(_root); +} + +// Path: sendTab +class _Translations$sendTab$ar extends Translations$sendTab$en { + _Translations$sendTab$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'إرسال'; + @override + late final _Translations$sendTab$selection$ar selection = _Translations$sendTab$selection$ar._(_root); + @override + late final _Translations$sendTab$picker$ar picker = _Translations$sendTab$picker$ar._(_root); + @override + String get shareIntentInfo => 'يمكنك أيضًا استخدام ميزة "مشاركة" بجهازك المحمول لتحديد الملفات بسهولة.'; + @override + String get nearbyDevices => 'الأجهزة القريبة'; + @override + String get thisDevice => 'هذا الجهاز'; + @override + String get scan => 'ابحث عن أجهزة'; + @override + String get manualSending => 'الإرسال اليدوي'; + @override + String get sendMode => 'وضع الإرسال'; + @override + late final _Translations$sendTab$sendModes$ar sendModes = _Translations$sendTab$sendModes$ar._(_root); + @override + String get sendModeHelp => 'شرح'; + @override + String get help => 'يُرجى التأكد من أن الهدف المطلوب موجود أيضًا في نفس شبكة الواي فاي.'; + @override + String get placeItems => 'ضع العناصر للمشاركة.'; +} + +// Path: settingsTab +class _Translations$settingsTab$ar extends Translations$settingsTab$en { + _Translations$settingsTab$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'الإعدادات'; + @override + late final _Translations$settingsTab$general$ar general = _Translations$settingsTab$general$ar._(_root); + @override + late final _Translations$settingsTab$receive$ar receive = _Translations$settingsTab$receive$ar._(_root); + @override + late final _Translations$settingsTab$send$ar send = _Translations$settingsTab$send$ar._(_root); + @override + late final _Translations$settingsTab$network$ar network = _Translations$settingsTab$network$ar._(_root); + @override + late final _Translations$settingsTab$other$ar other = _Translations$settingsTab$other$ar._(_root); + @override + String get advancedSettings => 'الإعدادات المتقدمة'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$ar extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'حل المشكلات'; + @override + String get subTitle => 'هل هذا التطبيق لا يعمل كما هو متوقع؟ هنا يمكنك العثور على الحلول الشائعة.'; + @override + String get solution => 'الحل:'; + @override + String get fixButton => 'إصلاح تلقائيًا'; + @override + late final _Translations$troubleshootPage$firewall$ar firewall = _Translations$troubleshootPage$firewall$ar._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$ar noDiscovery = _Translations$troubleshootPage$noDiscovery$ar._(_root); + @override + late final _Translations$troubleshootPage$noConnection$ar noConnection = _Translations$troubleshootPage$noConnection$ar._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$ar extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'التاريخ'; + @override + String get openFolder => 'افتح المجلد'; + @override + String get deleteHistory => 'احذف التاريخ'; + @override + String get empty => 'التاريخ فارغ.'; + @override + late final _Translations$receiveHistoryPage$entryActions$ar entryActions = _Translations$receiveHistoryPage$entryActions$ar._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$ar extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'التطبيقات (APK)'; + @override + String get excludeSystemApps => 'استبعاد التطبيقات النظام'; + @override + String get excludeAppsWithoutLaunchIntent => 'استبعاد التطبيقات غير القابلة للتشغيل'; + @override + String apps({required Object n}) => '${n} تطبيق'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$ar extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'احذف الكل'; +} + +// Path: receivePage +class _Translations$receivePage$ar extends Translations$receivePage$en { + _Translations$receivePage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ar'))( + n, + one: 'يريد أن يرسل لك ملف', + other: 'يريد أن يرسل لك ${n} ملفات', + ); + @override + String get subTitleMessage => 'أرسل لك رسالة:'; + @override + String get subTitleLink => 'أرسل لك ارتباط:'; + @override + String get canceled => 'أُلغِيَ المرسل الطلب.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$ar extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'خيارات'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(مجلد LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'تم إيقافه تلقائيًا لوجود مجلدات.'; +} + +// Path: sendPage +class _Translations$sendPage$ar extends Translations$sendPage$en { + _Translations$sendPage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'بإنتظار الرد…'; + @override + String get rejected => 'المستلم رفض الطلب.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'المستلم مشغول بطلب آخر.'; +} + +// Path: progressPage +class _Translations$progressPage$ar extends Translations$progressPage$en { + _Translations$progressPage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'جارِ إرسال الملفات'; + @override + String get titleReceiving => 'جارِ استلام الملفات'; + @override + String get savedToGallery => 'حُفظ في الصور'; + @override + late final _Translations$progressPage$total$ar total = _Translations$progressPage$total$ar._(_root); + @override + late final _Translations$progressPage$remainingTime$ar remainingTime = _Translations$progressPage$remainingTime$ar._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$ar extends Translations$webSharePage$en { + _Translations$webSharePage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'مشاركة عبر الرابط'; + @override + String get loading => 'جارِ بدء الخادم…'; + @override + String get stopping => 'جارِ إيقاف الخادم…'; + @override + String get error => 'حدث خطأ أثناء بدء الخادم.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ar'))( + n, + one: 'افتح هذا الرابط في المتصفح:', + other: 'افتح أحد هذه الروابط في المتصفح:', + ); + @override + String get requests => 'الطلبات'; + @override + String get noRequests => 'لا يوجد طلبات حتى الآن.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'قبول الطلبات تلقائيًا'; + @override + String get requirePin => 'يتطلب رمز PIN'; + @override + String pinHint({required Object pin}) => 'رمز PIN هو "${pin}"'; + @override + String get encryptionHint => 'يستخدم تطبيق LocalSend شهادة موقع ذاتية التوقيع. يجب عليك قبولها في المتصفح.'; + @override + String pendingRequests({required Object n}) => 'الطلبات المعلقة: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$ar extends Translations$aboutPage$en { + _Translations$aboutPage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'عن LocalSend'; + @override + List get description => [ + 'LocalSend هو تطبيق مجاني مفتوح المصدر يسمح لك بمشاركة الملفات والرسائل بشكل آمن مع الأجهزة القريبة عبر شبكتك المحلية دون الحاجة إلى اتصال بالإنترنت.', + 'هذا التطبيق متاح على أنظمة Android وiOS وmacOS وWindows وLinux. يمكنك العثور على جميع خيارات التنزيل على الصفحة الرئيسية الرسمية.', + ]; + @override + String get author => 'المؤلف'; + @override + String get contributors => 'المساهمون'; + @override + String get packagers => 'محزمي التطبيقات'; + @override + String get translators => 'المترجمون'; +} + +// Path: donationPage +class _Translations$donationPage$ar extends Translations$donationPage$en { + _Translations$donationPage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'تبرّع'; + @override + String get info => 'LocalSend مجاني ومفتوح المصدر وبدون أي إعلانات. إذا أعجبك التطبيق، يمكنك دعم التطوير بالتبرع.'; + @override + String donate({required Object amount}) => 'تبرّع ${amount}'; + @override + String get thanks => 'شكراً جزيلاً!'; + @override + String get restore => 'استعادة شراء'; +} + +// Path: changelogPage +class _Translations$changelogPage$ar extends Translations$changelogPage$en { + _Translations$changelogPage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'سجل التغييرات'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$ar extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'محبوب', + 'جميل', + 'كبير', + 'ساطع', + 'نظيف', + 'ذكي', + 'رائع', + 'جذاب', + 'ماكر', + 'مصمم', + 'نشيط', + 'فعال', + 'خيالي', + 'سريع', + 'جيد', + 'طازج', + 'حسن', + 'خلاب', + 'رائع', + 'جميل المظهر', + 'حار', + 'حنون', + 'محبوب', + 'صوفي', + 'مرتب', + 'لطيف', + 'صبور', + 'جميل', + 'قوي', + 'ثري', + 'سري', + 'ذكي', + 'صلب', + 'مميز', + 'استراتيجي', + 'قوي', + 'مرتب', + 'حكيم', + ]; + @override + List get fruits => [ + 'تفاح', + 'أفوكادو', + 'موز', + 'بلاك بيري', + 'توت', + 'بروكلي', + 'جزر', + 'كرز', + 'جوز الهند', + 'عنب', + 'ليمون', + 'خَسّ', + 'مانجو', + 'شمام', + 'فطر', + 'بصل', + 'برتقال', + 'بابايا', + 'خَوخ', + 'إجاص', + 'أناناس', + 'بطاطس', + 'يقطين', + 'توت العُليق', + 'فراولة', + 'طماطم', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$ar extends Translations$dialogs$en { + _Translations$dialogs$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$ar addFile = _Translations$dialogs$addFile$ar._(_root); + @override + late final _Translations$dialogs$openFile$ar openFile = _Translations$dialogs$openFile$ar._(_root); + @override + late final _Translations$dialogs$addressInput$ar addressInput = _Translations$dialogs$addressInput$ar._(_root); + @override + late final _Translations$dialogs$cancelSession$ar cancelSession = _Translations$dialogs$cancelSession$ar._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$ar cannotOpenFile = _Translations$dialogs$cannotOpenFile$ar._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$ar encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$ar._(_root); + @override + late final _Translations$dialogs$errorDialog$ar errorDialog = _Translations$dialogs$errorDialog$ar._(_root); + @override + late final _Translations$dialogs$favoriteDialog$ar favoriteDialog = _Translations$dialogs$favoriteDialog$ar._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$ar favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$ar._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$ar favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$ar._(_root); + @override + late final _Translations$dialogs$fileInfo$ar fileInfo = _Translations$dialogs$fileInfo$ar._(_root); + @override + late final _Translations$dialogs$fileNameInput$ar fileNameInput = _Translations$dialogs$fileNameInput$ar._(_root); + @override + late final _Translations$dialogs$historyClearDialog$ar historyClearDialog = _Translations$dialogs$historyClearDialog$ar._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$ar localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$ar._(_root); + @override + late final _Translations$dialogs$messageInput$ar messageInput = _Translations$dialogs$messageInput$ar._(_root); + @override + late final _Translations$dialogs$noFiles$ar noFiles = _Translations$dialogs$noFiles$ar._(_root); + @override + late final _Translations$dialogs$noPermission$ar noPermission = _Translations$dialogs$noPermission$ar._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$ar notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$ar._(_root); + @override + late final _Translations$dialogs$qr$ar qr = _Translations$dialogs$qr$ar._(_root); + @override + late final _Translations$dialogs$quickActions$ar quickActions = _Translations$dialogs$quickActions$ar._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$ar quickSaveNotice = _Translations$dialogs$quickSaveNotice$ar._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$ar quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$ar._(_root); + @override + late final _Translations$dialogs$pin$ar pin = _Translations$dialogs$pin$ar._(_root); + @override + late final _Translations$dialogs$sendModeHelp$ar sendModeHelp = _Translations$dialogs$sendModeHelp$ar._(_root); + @override + late final _Translations$dialogs$zoom$ar zoom = _Translations$dialogs$zoom$ar._(_root); +} + +// Path: sanitization +class _Translations$sanitization$ar extends Translations$sanitization$en { + _Translations$sanitization$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get empty => 'لا يمكن أن يكون اسم الملف فارغًا'; + @override + String get invalid => 'يحتوي اسم الملف على أحرف غير صالحة'; +} + +// Path: tray +class _Translations$tray$ar extends Translations$tray$en { + _Translations$tray$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'أنهِ LocalSend'; + @override + String get closeWindows => 'اخرج'; +} + +// Path: web +class _Translations$web$ar extends Translations$web$en { + _Translations$web$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'أدخل رمز PIN'; + @override + String get invalidPin => 'رمز PIN غير صالح'; + @override + String get tooManyAttempts => 'محاولات كثيرة جدًا'; + @override + String get rejected => 'رُفض'; + @override + String get files => 'الملفات'; + @override + String get fileName => 'اسم الملف'; + @override + String get size => 'الحجم'; +} + +// Path: assetPicker +class _Translations$assetPicker$ar extends Translations$assetPicker$en { + _Translations$assetPicker$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'أكّد'; + @override + String get cancel => 'ألغِ'; + @override + String get edit => 'عدّل'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'فشل التحميل'; + @override + String get original => 'أصلي'; + @override + String get preview => 'معاينة'; + @override + String get select => 'حدّد'; + @override + String get emptyList => 'القائمة فارغة'; + @override + String get unSupportedAssetType => 'نوع الملف غير مدعوم.'; + @override + String get unableToAccessAll => 'لا يمكن الوصول إلى جميع الملفات الموجودة على الجهاز'; + @override + String get viewingLimitedAssetsTip => 'إظهار الملفات والألبومات التي يمكن للتطبيق الوصول إليها فقط.'; + @override + String get changeAccessibleLimitedAssets => 'انقر لتحديث الملفات التي يمكن الوصول إليها'; + @override + String get accessAllTip => + 'يمكن للتطبيق الوصول فقط إلى بعض الملفات على الجهاز. اذهب إلى إعدادات النظام واسمح للتطبيق بالوصول إلى جميع الوسائط على الجهاز.'; + @override + String get goToSystemSettings => 'اذهب إلى إعدادات النظام'; + @override + String get accessLimitedAssets => 'استمر بوصول محدود'; + @override + String get accessiblePathName => 'ملفات يمكن الوصول إليها'; + @override + String get sTypeAudioLabel => 'صوتي'; + @override + String get sTypeImageLabel => 'صورة'; + @override + String get sTypeVideoLabel => 'فيديو'; + @override + String get sTypeOtherLabel => 'وسائط أخرى'; + @override + String get sActionPlayHint => 'شغِّل'; + @override + String get sActionPreviewHint => 'معاينة'; + @override + String get sActionSelectHint => 'حدّد'; + @override + String get sActionSwitchPathLabel => 'غيّر المسار'; + @override + String get sActionUseCameraHint => 'استخدم الكاميرا'; + @override + String get sNameDurationLabel => 'مدة'; + @override + String get sUnitAssetCountLabel => 'عدد'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$ar extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get whitelist => 'القائمة البيضاء'; + @override + String get title => 'واجهات الشبكة'; + @override + String get blacklist => 'القائمة السوداء'; + @override + String get info => + 'بشكل افتراضي، يستخدم LocalSend جميع واجهات الشبكة المتاحة. يمكنك استبعاد الشبكات غير المرغوب فيها هنا. تحتاج إلى إعادة تشغيل الخادم لتطبيق التغييرات.'; + @override + String get preview => 'معاينة'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$ar extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'منفذ:'; + @override + String get alias => 'اسم الجهاز:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$ar extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'المفضلات'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$ar extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'اختيار'; + @override + String files({required Object files}) => 'ملفات: ${files}'; + @override + String size({required Object size}) => 'حجم: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$ar extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get file => 'ملف'; + @override + String get folder => 'مجلد'; + @override + String get media => 'وسائط'; + @override + String get text => 'نص'; + @override + String get app => 'تطبيق'; + @override + String get clipboard => 'لصق'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$ar extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get single => 'مستلم واحد'; + @override + String get multiple => 'متعدد المستلمين'; + @override + String get link => 'مشاركة عبر الرابط'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$ar extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'عام'; + @override + String get brightness => 'السمة'; + @override + late final _Translations$settingsTab$general$brightnessOptions$ar brightnessOptions = _Translations$settingsTab$general$brightnessOptions$ar._( + _root, + ); + @override + String get color => 'اللون'; + @override + late final _Translations$settingsTab$general$colorOptions$ar colorOptions = _Translations$settingsTab$general$colorOptions$ar._(_root); + @override + String get language => 'اللغة'; + @override + late final _Translations$settingsTab$general$languageOptions$ar languageOptions = _Translations$settingsTab$general$languageOptions$ar._(_root); + @override + String get saveWindowPlacement => 'إنهاء: حفظ موقع النافذة'; + @override + String get saveWindowPlacementWindows => 'حفظ موضع النافذة بعد الخروج'; + @override + String get minimizeToTray => 'إنهاء : أخفاء في شريط المهام'; + @override + String get launchAtStartup => 'تشغيل تلقائي بعد تسجيل الدخول'; + @override + String get launchMinimized => 'تشغيل تلقائي: ابدأ مخفيًا'; + @override + String get showInContextMenu => 'إظهار LocalSend في قائمة السياق'; + @override + String get animations => 'الرسوم المتحركة'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$ar extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'استلم'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'إنهاء تلقائي'; + @override + String get destination => 'احفظ في المجلد'; + @override + String get downloads => '(التنزيلات)'; + @override + String get saveToGallery => 'حفظ الوسائط في المعرض'; + @override + String get saveToHistory => 'حفظ في التاريخ'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$ar extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'أرسِل'; + @override + String get shareViaLinkAutoAccept => 'المشاركة عبر الرابط: قبول تلقائي'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$ar extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'شبكة الاتصال'; + @override + String get needRestart => 'أعد تشغيل الخادم لتطبيق الإعدادات!'; + @override + String get server => 'الخادم'; + @override + String get alias => 'اسم مستعار'; + @override + String get deviceType => 'نوع الجهاز'; + @override + String get deviceModel => 'نموذج الجهاز'; + @override + String get port => 'منفذ'; + @override + String get discoveryTimeout => 'مهلة الاكتشاف'; + @override + String get useSystemName => 'استخدم اسم النظام'; + @override + String get generateRandomAlias => 'ولّد كنية عشوائية'; + @override + String portWarning({required Object defaultPort}) => + 'ربما لا يتم الكشف عنك من قبل الأجهزة الأخرى لأنك تستخدم منفذ مخصص. (الافتراضي: ${defaultPort})'; + @override + String get encryption => 'التعمية'; + @override + String get multicastGroup => 'فرق البث المتعدد'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'ربما لا يتم الكشف عنك من قبل الأجهزة الأخرى لأنك تستخدم عنوان بث متعدد مخصص. (الافتراضي: ${defaultMulticast})'; + @override + late final _Translations$settingsTab$network$networkOptions$ar networkOptions = _Translations$settingsTab$network$networkOptions$ar._(_root); + @override + String get network => 'الشبكة'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$ar extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'أخرى'; + @override + String get support => 'دعم LocalSend'; + @override + String get donate => 'تبرّع'; + @override + String get privacyPolicy => 'سياسة الخصوصيّة'; + @override + String get termsOfUse => 'شروط الاستخدام'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$ar extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'يمكن لهذا التطبيق إرسال الملفات إلى الأجهزة الأخرى ولكن الأجهزة الأخرى لا يمكنها إرسال الملفات إلى هذا الجهاز.'; + @override + String solution({required Object port}) => + 'هذه المشكلة عادة ما تكون مشكلة في جدار الحماية. يمكنك حل هذه المشكلة عن طريق السماح بالاتصالات الواردة (UDP و TCP) على المنفذ ${port}.'; + @override + String get openFirewall => 'افتح جدار الحماية'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$ar extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'هذا الجهاز لا يمكنه اكتشاف الأجهزة الأخرى.'; + @override + String get solution => + 'يُرجى التأكد من أن جميع الأجهزة متصلة بنفس شبكة الواي فاي وتشارك نفس التكوين (المنفذ، عنوان البث المتعدد، التعمية). يمكنك محاولة كتابة عنوان IP للجهاز المستهدف يدويًا. إذا نجح ذلك، فكر في إضافة هذا الجهاز إلى قائمة المفضلات حتى يتم اكتشافه تلقائيًا في المستقبل.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$ar extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'لا يمكن للجهازين اكتشاف بعضهما البعض ولا يمكنهما مشاركة الملفات.'; + @override + String get solution => + 'هل المشكلة موجودة على كِلا الجانبين؟ إذا كان الأمر كذلك، يجب التأكد من أن كِلا الجهازين متصلان بنفس شبكة الواي فاي ويشتركان في نفس الإعدادات (المنفذ، عنوان البث المتعدد، التعمية). قد تمنع شبكة الواي فاي الاتصال بين المشاركين بسبب عزل نقطة الوصول (AP Isolation). في هذه الحالة، يجب تعطيل هذا الخيار على الراوتر.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$ar extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get open => 'افتح الملف'; + @override + String get showInFolder => 'اعرض في المجلد'; + @override + String get info => 'معلومات'; + @override + String get deleteFromHistory => 'احذف من التاريخ'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$ar extends Translations$progressPage$total$en { + _Translations$progressPage$total$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$ar title = _Translations$progressPage$total$title$ar._(_root); + @override + String count({required Object curr, required Object n}) => 'ملفات: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'حجم: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'سرعة: ${speed}/ثانية'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$ar extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// استخدم 'س' لاختصار الساعات و'د' للدقائق + @override + String hours({required Object h, required Object m}) => '${h}س ${m}د'; + + /// استخدم 'ي' للأيام، و'س' للساعات، و'د' للدقائق + @override + String days({required Object d, required Object h, required Object m}) => '${d}ي ${h}س ${m}د'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$ar extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'أضف إلى الاختيار'; + @override + String get content => 'ماذا تريد أن تضيف؟'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$ar extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'افتح الملف'; + @override + String get content => 'هل تريد فتح الملف المُستلم؟'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$ar extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'أدخل العنوان'; + @override + String get hashtag => 'رابطة هاشتاق'; + @override + String get ip => 'عنوان IP'; + @override + String get recentlyUsed => 'المستخدمة حديثًا: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$ar extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'ألغِ نقل الملف'; + @override + String get content => 'هل تريد حقًا إلغاء نقل الملف؟'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$ar extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'لا يمكن فتح الملف'; + @override + String content({required Object file}) => 'تعذر فتح "${file}". هل نُقل هذا الملف أو إعادة تسميته أو حذفه؟'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$ar extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'التعمية مُعطّلة'; + @override + String get content => 'الاتصال يتم الآن عبر بروتوكول HTTP غير المُعمّى. لاستخدام HTTPS، فعِّل التعمية مرة أخرى.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$ar extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$ar extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'المفضلات'; + @override + String get noFavorites => 'لا توجد أجهزة مفضلة بعد.'; + @override + String get addFavorite => 'أضف'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$ar extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'احذف من المفضلات'; + @override + String content({required Object name}) => 'هل ترغب حقًا في حذف "${name}" من المفضلات؟'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$ar extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'أضف إلى المفضلات'; + @override + String get titleEdit => 'اﻹعدادات'; + @override + String get name => 'اسم الجهاز'; + @override + String get auto => '(تلقائي)'; + @override + String get ip => 'عنوان IP'; + @override + String get port => 'المنفذ'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$ar extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'معلومات الملف'; + @override + String get fileName => 'اسم الملف:'; + @override + String get path => 'المسار:'; + @override + String get size => 'الحجم:'; + @override + String get sender => 'المرسل:'; + @override + String get time => 'الوقت:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$ar extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'أدخل اسم الملف'; + @override + String original({required Object original}) => 'أصلي: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$ar extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'امسح التاريخ'; + @override + String get content => 'هل ترغب حقًا في مسح التاريخ بالكامل؟'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$ar extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => 'لا يمكن ل LocalSend العثور على الأجهزة الأخرى بدون الإذن بفحص الشبكة المحلية. يُرجى منح هذا الإذن في الإعدادات.'; + @override + String get gotoSettings => 'الإعدادات'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$ar extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'اكتب رسالة'; + @override + String get multiline => 'متعدد الأسطر'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$ar extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'لم يتم اختيار اي ملف'; + @override + String get content => 'الرجاء تحديد ملف واحد على الأقل.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$ar extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'بدون إذن'; + @override + String get content => 'لم تمنح الأذونات اللازمة. يُرجى منحها في الإعدادات.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$ar extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'غير متاح'; + @override + String get content => 'هذه الميزة متاحة فقط على:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$ar extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'رمز QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$ar extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'إجراءات سريعة'; + @override + String get counter => 'عداد'; + @override + String get prefix => 'بادئة'; + @override + String get padZero => 'احشو مع أصفار'; + @override + String get sortBeforeCount => 'افرز أبجديًا مسبقًا (أ-ي)'; + @override + String get random => 'عشوائي'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$ar extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'يتم قبول طلبات الملفات تلقائيًا. اعلم أن كل فرد في الشبكة المحلية يمكنه إرسال الملفات إليك.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$ar extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'يتم الآن قبول طلبات الملفات تلقائيًا من الأجهزة الموجودة في قائمة المفضلات لديك.', + 'تحذير! في الوقت الحالي، هذا ليس آمنًا تمامًا، حيث يمكن للمخترق الذي لديه بصمة أي جهاز من قائمة المفضلات لديك أن يرسل لك ملفات دون قيود.', + 'ومع ذلك، يظل هذا الخيار أكثر أمانًا من السماح لجميع المستخدمين على الشبكة المحلية بإرسال الملفات إليك دون قيود.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$ar extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'أدخل رمز PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$ar extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'أوضاع الإرسال'; + @override + String get single => 'يقوم بإرسال الملفات إلى مستلم واحد. سيتم مسح الاختيار بعد انتهاء نقل الملف.'; + @override + String get multiple => 'يرسل الملفات إلى عدة مستلمين. لن يتم مسح التحديد بعد الانتهاء من نقل الملفات.'; + @override + String get link => 'يمكن للمستلمين الذين لا يحتوون على LocalSend تنزيل الملفات المحددة عن طريق فتح الرابط في متصفحهم.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$ar extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get title => 'عنوان URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$ar extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get system => 'نظام'; + @override + String get dark => 'داكنة'; + @override + String get light => 'فاتحة'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$ar extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get system => 'النظام'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$ar extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get system => 'النظام'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$ar extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String get filtered => 'مُصفاة'; + @override + String get all => 'الكل'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$ar extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$ar._(TranslationsAr root) : this._root = root, super.internal(root); + + final TranslationsAr _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'التقدم الكلي (${time})'; + @override + String get finishedError => 'انتهى مع وجود خطأ'; + @override + String get canceledSender => 'أُلغِيَ من قِبل المرسل'; + @override + String get canceledReceiver => 'أُلغِيَ من قِبل المتلقي'; +} diff --git a/app/lib/gen/strings_az.g.dart b/app/lib/gen/strings_az.g.dart new file mode 100644 index 0000000..c62a592 --- /dev/null +++ b/app/lib/gen/strings_az.g.dart @@ -0,0 +1,1413 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsAz extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsAz({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.az, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsAz _root = this; // ignore: unused_field + + @override + TranslationsAz $copyWith({TranslationMetadata? meta}) => TranslationsAz(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Azərbaycanca'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$az general = _Translations$general$az._(_root); + @override + late final _Translations$receiveTab$az receiveTab = _Translations$receiveTab$az._(_root); + @override + late final _Translations$sendTab$az sendTab = _Translations$sendTab$az._(_root); + @override + late final _Translations$settingsTab$az settingsTab = _Translations$settingsTab$az._(_root); + @override + late final _Translations$receiveHistoryPage$az receiveHistoryPage = _Translations$receiveHistoryPage$az._(_root); + @override + late final _Translations$dialogs$az dialogs = _Translations$dialogs$az._(_root); + @override + late final _Translations$troubleshootPage$az troubleshootPage = _Translations$troubleshootPage$az._(_root); + @override + late final _Translations$webSharePage$az webSharePage = _Translations$webSharePage$az._(_root); + @override + late final _Translations$networkInterfacesPage$az networkInterfacesPage = _Translations$networkInterfacesPage$az._(_root); + @override + late final _Translations$assetPicker$az assetPicker = _Translations$assetPicker$az._(_root); + @override + late final _Translations$sendPage$az sendPage = _Translations$sendPage$az._(_root); + @override + late final _Translations$web$az web = _Translations$web$az._(_root); + @override + late final _Translations$tray$az tray = _Translations$tray$az._(_root); + @override + late final _Translations$apkPickerPage$az apkPickerPage = _Translations$apkPickerPage$az._(_root); + @override + late final _Translations$receivePage$az receivePage = _Translations$receivePage$az._(_root); + @override + late final _Translations$receiveOptionsPage$az receiveOptionsPage = _Translations$receiveOptionsPage$az._(_root); + @override + late final _Translations$progressPage$az progressPage = _Translations$progressPage$az._(_root); + @override + late final _Translations$donationPage$az donationPage = _Translations$donationPage$az._(_root); + @override + late final _Translations$selectedFilesPage$az selectedFilesPage = _Translations$selectedFilesPage$az._(_root); + @override + late final _Translations$aboutPage$az aboutPage = _Translations$aboutPage$az._(_root); + @override + late final _Translations$changelogPage$az changelogPage = _Translations$changelogPage$az._(_root); + @override + late final _Translations$sanitization$az sanitization = _Translations$sanitization$az._(_root); +} + +// Path: general +class _Translations$general$az extends Translations$general$en { + _Translations$general$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Qəbul et'; + @override + String get accepted => 'Qəbul edildi'; + @override + String get add => 'Əlavə et'; + @override + String get advanced => 'Qabaqcıl'; + @override + String get cancel => 'Ləğv et'; + @override + String get close => 'Bağla'; + @override + String get confirm => 'Təsdiqlə'; + @override + String get continueStr => 'Davam et'; + @override + String get copy => 'Köçür'; + @override + String get copiedToClipboard => 'Məlumat buferinə köçürüldü'; + @override + String get decline => 'İmtina et'; + @override + String get done => 'Oldu'; + @override + String get delete => 'Sil'; + @override + String get edit => 'Düzəliş et'; + @override + String get error => 'Xəta'; + @override + String get example => 'Nümunə'; + @override + String get files => 'Fayllar'; + @override + String get finished => 'Bitdi'; + @override + String get hide => 'Gizlət'; + @override + String get off => 'Bağlı'; + @override + String get offline => 'Oflayn'; + @override + String get on => 'Aktiv'; + @override + String get online => 'Onlayn'; + @override + String get open => 'Aç'; + @override + String get queue => 'Növbə'; + @override + String get quickSave => 'Cəld yadda saxla'; + @override + String get quickSaveFromFavorites => '"Sevimlilər" üçün cəld yadda saxla'; + @override + String get renamed => 'Adı dəyişdirildi'; + @override + String get reset => 'Dəyişiklikləri geri qaytar'; + @override + String get restart => 'Yenidən başlat'; + @override + String get settings => 'Parametrlər'; + @override + String get skipped => 'Ötürüldü'; + @override + String get start => 'Başlat'; + @override + String get stop => 'Dayandır'; + @override + String get save => 'Yadda saxla'; + @override + String get unchanged => 'Dəyişdirilməmiş'; + @override + String get unknown => 'Naməlum'; + @override + String get noItemInClipboard => 'Məlumat buferində element yoxdur.'; +} + +// Path: receiveTab +class _Translations$receiveTab$az extends Translations$receiveTab$en { + _Translations$receiveTab$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Qəbul et'; + @override + late final _Translations$receiveTab$infoBox$az infoBox = _Translations$receiveTab$infoBox$az._(_root); + @override + late final _Translations$receiveTab$quickSave$az quickSave = _Translations$receiveTab$quickSave$az._(_root); +} + +// Path: sendTab +class _Translations$sendTab$az extends Translations$sendTab$en { + _Translations$sendTab$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Göndər'; + @override + late final _Translations$sendTab$selection$az selection = _Translations$sendTab$selection$az._(_root); + @override + late final _Translations$sendTab$picker$az picker = _Translations$sendTab$picker$az._(_root); + @override + String get shareIntentInfo => 'Faylları daha rahat seçmək üçün mobil cihazınızın "Paylaş" xüsusiyyətin də istifadə edə bilərsiniz.'; + @override + String get nearbyDevices => 'Yaxınlıqdakı cihazlar'; + @override + String get thisDevice => 'Bu Cihaz'; + @override + String get scan => 'Cihazları axtar'; + @override + String get manualSending => 'Özünüz göndərin'; + @override + String get sendMode => 'Göndərmə üsulu'; + @override + late final _Translations$sendTab$sendModes$az sendModes = _Translations$sendTab$sendModes$az._(_root); + @override + String get sendModeHelp => 'İzahat'; + @override + String get help => 'Xahiş olunur, əmin olun ki, istədiyiniz hədəf eyni Wi-Fi şəbəkəsindədir.'; + @override + String get placeItems => 'Paylaşmaq üçün elementləri yerləşdir.'; +} + +// Path: settingsTab +class _Translations$settingsTab$az extends Translations$settingsTab$en { + _Translations$settingsTab$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tənzimləmələr'; + @override + late final _Translations$settingsTab$general$az general = _Translations$settingsTab$general$az._(_root); + @override + late final _Translations$settingsTab$receive$az receive = _Translations$settingsTab$receive$az._(_root); + @override + String get advancedSettings => 'Qabaqcıl parametrlər'; + @override + late final _Translations$settingsTab$send$az send = _Translations$settingsTab$send$az._(_root); + @override + late final _Translations$settingsTab$network$az network = _Translations$settingsTab$network$az._(_root); + @override + late final _Translations$settingsTab$other$az other = _Translations$settingsTab$other$az._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$az extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get openFolder => 'Qovluğu aç'; + @override + String get deleteHistory => 'Tarixçəni sil'; + @override + String get title => 'Tarixçə'; + @override + late final _Translations$receiveHistoryPage$entryActions$az entryActions = _Translations$receiveHistoryPage$entryActions$az._(_root); + @override + String get empty => 'Tarixçə boşdur.'; +} + +// Path: dialogs +class _Translations$dialogs$az extends Translations$dialogs$en { + _Translations$dialogs$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$noFiles$az noFiles = _Translations$dialogs$noFiles$az._(_root); + @override + late final _Translations$dialogs$fileInfo$az fileInfo = _Translations$dialogs$fileInfo$az._(_root); + @override + late final _Translations$dialogs$qr$az qr = _Translations$dialogs$qr$az._(_root); + @override + late final _Translations$dialogs$historyClearDialog$az historyClearDialog = _Translations$dialogs$historyClearDialog$az._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$az localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$az._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$az quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$az._(_root); + @override + late final _Translations$dialogs$pin$az pin = _Translations$dialogs$pin$az._(_root); + @override + late final _Translations$dialogs$sendModeHelp$az sendModeHelp = _Translations$dialogs$sendModeHelp$az._(_root); + @override + late final _Translations$dialogs$favoriteDialog$az favoriteDialog = _Translations$dialogs$favoriteDialog$az._(_root); + @override + late final _Translations$dialogs$errorDialog$az errorDialog = _Translations$dialogs$errorDialog$az._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$az favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$az._(_root); + @override + late final _Translations$dialogs$addFile$az addFile = _Translations$dialogs$addFile$az._(_root); + @override + late final _Translations$dialogs$openFile$az openFile = _Translations$dialogs$openFile$az._(_root); + @override + late final _Translations$dialogs$addressInput$az addressInput = _Translations$dialogs$addressInput$az._(_root); + @override + late final _Translations$dialogs$cancelSession$az cancelSession = _Translations$dialogs$cancelSession$az._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$az cannotOpenFile = _Translations$dialogs$cannotOpenFile$az._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$az encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$az._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$az favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$az._(_root); + @override + late final _Translations$dialogs$fileNameInput$az fileNameInput = _Translations$dialogs$fileNameInput$az._(_root); + @override + late final _Translations$dialogs$messageInput$az messageInput = _Translations$dialogs$messageInput$az._(_root); + @override + late final _Translations$dialogs$noPermission$az noPermission = _Translations$dialogs$noPermission$az._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$az notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$az._(_root); + @override + late final _Translations$dialogs$quickActions$az quickActions = _Translations$dialogs$quickActions$az._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$az quickSaveNotice = _Translations$dialogs$quickSaveNotice$az._(_root); + @override + late final _Translations$dialogs$zoom$az zoom = _Translations$dialogs$zoom$az._(_root); +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$az extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Problemləri həll etmə'; + @override + late final _Translations$troubleshootPage$noDiscovery$az noDiscovery = _Translations$troubleshootPage$noDiscovery$az._(_root); + @override + String get subTitle => 'Tətbiq gözlənildiyi kimi işləmir? Burada problemlərin ümumi həll yollarını tapa bilərsiniz.'; + @override + late final _Translations$troubleshootPage$firewall$az firewall = _Translations$troubleshootPage$firewall$az._(_root); + @override + late final _Translations$troubleshootPage$noConnection$az noConnection = _Translations$troubleshootPage$noConnection$az._(_root); + @override + String get solution => 'Həll:'; + @override + String get fixButton => 'Avtomatik düzəlt'; +} + +// Path: webSharePage +class _Translations$webSharePage$az extends Translations$webSharePage$en { + _Translations$webSharePage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get stopping => 'Server dayandırılır…'; + @override + String pendingRequests({required Object n}) => 'Gözləyən sorğular: ${n}'; + @override + String get loading => 'Server aktivləşdirilir…'; + @override + String get error => 'Serveri aktivləşdirərkən xəta baş verdi.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('az'))( + n, + one: 'Bu keçidi brauzerdə aç:', + other: 'Bu keçidlərdən birini brauzerdə aç:', + ); + @override + String get title => 'Keçid vasitəsilə paylaş'; + @override + String get requests => 'Sorğular'; + @override + String get noRequests => 'Hələ ki, heç bir sorğu yoxdur.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Sorğuları avtomatik qəbul et'; + @override + String get requirePin => 'PIN tələb et'; + @override + String pinHint({required Object pin}) => 'Sizin PIN: "${pin}"'; + @override + String get encryptionHint => 'LocalSend özü imzalanmış sertifikatdan istifadə edir. Siz onu brauzerinizdə qəbul etməlisiniz.'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$az extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get info => + 'Defolt olaraq, LocalSend bütün mövcud şəbəkə interfeyslərindən istifadə edir. Burada istənilməyən şəbəkələri istisna edə bilərsiniz. Dəyişiklikləri tətbiq etmək üçün serveri yenidən başlatmalısınız.'; + @override + String get whitelist => 'Ağ siyahı'; + @override + String get blacklist => 'Qara siyahı'; + @override + String get title => 'Şəbəkə interfeysləri'; + @override + String get preview => 'Önizlə'; +} + +// Path: assetPicker +class _Translations$assetPicker$az extends Translations$assetPicker$en { + _Translations$assetPicker$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get accessiblePathName => 'Əlçatan fayllar'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get loadFailed => 'Yükləmə uğursuz oldu'; + @override + String get accessLimitedAssets => 'Məhdud icazə ilə davam et'; + @override + String get preview => 'Önizləmə'; + @override + String get select => 'Seç'; + @override + String get emptyList => 'Boş siyahı'; + @override + String get unSupportedAssetType => 'Dəstəklənməyən fayl tipi.'; + @override + String get unableToAccessAll => 'Cihazdakı bütün fayllara daxil olmaq mümkün deyil'; + @override + String get viewingLimitedAssetsTip => 'Yalnız proqram üçün əlçatan olan fayl və albomlara bax.'; + @override + String get confirm => 'Təsdiqlə'; + @override + String get cancel => 'İmtina'; + @override + String get edit => 'Düzəliş et'; + @override + String get gifIndicator => 'GIF'; + @override + String get original => 'Orijinal'; + @override + String get changeAccessibleLimitedAssets => 'Əlçatan faylları yeniləmək üçün kliklə'; + @override + String get accessAllTip => + 'Tətbiq cihazdakı yalnız bəzi fayllara daxil ola bilər. Sistem parametrlərinə gedin və tətbiqin cihazdakı bütün mediaya daxil olmasına icazə verin.'; + @override + String get goToSystemSettings => 'Sistem parametrlərinə get'; + @override + String get sTypeImageLabel => 'Şəkil'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Digər media'; + @override + String get sActionPlayHint => 'aç'; + @override + String get sActionPreviewHint => 'önizləmə'; + @override + String get sActionSelectHint => 'seç'; + @override + String get sActionSwitchPathLabel => 'yolu dəyiş'; + @override + String get sActionUseCameraHint => 'kamera istifadə et'; + @override + String get sNameDurationLabel => 'müddət'; + @override + String get sUnitAssetCountLabel => 'say'; +} + +// Path: sendPage +class _Translations$sendPage$az extends Translations$sendPage$en { + _Translations$sendPage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get rejected => 'Qəbul edən bu sorğudan imtina etdi.'; + @override + String get waiting => 'Qarşı tərəfdən cavab gözlənilir…'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Qəbul edən başqa sorğu ilə məşğuldur.'; +} + +// Path: web +class _Translations$web$az extends Translations$web$en { + _Translations$web$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get fileName => 'Fayl adı'; + @override + String get files => 'Fayllar'; + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'PIN-i daxil et'; + @override + String get invalidPin => 'Səhv PIN'; + @override + String get tooManyAttempts => 'Çoxsaylı cəhd'; + @override + String get rejected => 'Rədd edildi'; + @override + String get size => 'Ölçü'; +} + +// Path: tray +class _Translations$tray$az extends Translations$tray$en { + _Translations$tray$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get closeWindows => 'Çıxış'; + @override + String get open => _root.general.open; + @override + String get close => 'LocalSend-dən çıx'; +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$az extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String apps({required Object n}) => '${n} tətbiq'; + @override + String get title => 'Tətbiqlər (APK)'; + @override + String get excludeSystemApps => 'Sistem tətbiqlərini istisna et'; + @override + String get excludeAppsWithoutLaunchIntent => 'Açıla bilməyən tətbiqləri istisna et'; +} + +// Path: receivePage +class _Translations$receivePage$az extends Translations$receivePage$en { + _Translations$receivePage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get subTitleLink => 'sənə keçid göndərdi:'; + @override + String get canceled => 'Göndərən bu sorğunu ləğv etdi.'; + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('az'))( + n, + one: 'sənə fayl göndərmək istəyir', + other: 'sənə ${n} fayl göndərmək istəyir', + ); + @override + String get subTitleMessage => 'sənə mesaj göndərdi:'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$az extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Seçimlər'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend qovluğu)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Qovluqlar olduğu üçün avtomatik söndürülür.'; +} + +// Path: progressPage +class _Translations$progressPage$az extends Translations$progressPage$en { + _Translations$progressPage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$az total = _Translations$progressPage$total$az._(_root); + @override + String get titleSending => 'Fayllar göndərilir'; + @override + String get titleReceiving => 'Fayllar qəbul edilir'; + @override + String get savedToGallery => 'Qalereyada saxlanıldı'; +} + +// Path: donationPage +class _Translations$donationPage$az extends Translations$donationPage$en { + _Translations$donationPage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get info => + 'LocalSend pulsuz, açıq mənbəlidir və heç bir reklam yoxdur. Proqramı bəyənirsinizsə, ianə ilə inkişafını dəstəkləyə bilərsiniz.'; + @override + String get title => 'İanə et'; + @override + String donate({required Object amount}) => '${amount} ianə et'; + @override + String get thanks => 'Çox təşəkkür edirəm!'; + @override + String get restore => 'Satın almaları bərpa et'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$az extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Hamısını sil'; +} + +// Path: aboutPage +class _Translations$aboutPage$az extends Translations$aboutPage$en { + _Translations$aboutPage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + List get description => [ + 'LocalSend internet bağlantısına ehtiyac olmadan lokal şəbəkə üzərindən yaxınlıqdakı cihazlarla faylları və mesajları təhlükəsiz paylaşmağa imkan verən pulsuz, açıq mənbəli proqramdır.', + 'Bu proqram Android, iOS, macOS, Windows və Linux sistemlərində mövcuddur. Bütün yükləmə variantlarını rəsmi saytda tapa bilərsiniz.', + ]; + @override + String get author => 'Müəllif'; + @override + String get contributors => 'Töhfə verənlər'; + @override + String get title => 'LocalSend haqqında'; + @override + String get packagers => 'Paketləyənlər'; + @override + String get translators => 'Tərcüməçilər'; +} + +// Path: changelogPage +class _Translations$changelogPage$az extends Translations$changelogPage$en { + _Translations$changelogPage$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Versiya jurnalı'; +} + +// Path: sanitization +class _Translations$sanitization$az extends Translations$sanitization$en { + _Translations$sanitization$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Fayl adı boş ola bilməz'; + @override + String get invalid => 'Fayl adında etibarsız simvollar ola bilməz'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$az extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Cihazın adı:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$az extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Sevimlilər'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$az extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Seçim'; + @override + String files({required Object files}) => 'Fayllar: ${files}'; + @override + String size({required Object size}) => 'Ölçü: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$az extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get file => 'Fayl'; + @override + String get folder => 'Qovluq'; + @override + String get media => 'Media'; + @override + String get text => 'Mətn'; + @override + String get app => 'Tətbiq'; + @override + String get clipboard => 'Yapışdır'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$az extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get single => 'Tək qəbul edən'; + @override + String get multiple => 'Çoxsaylı alıcılar'; + @override + String get link => 'Keçid vasitəsilə paylaş'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$az extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ümumi'; + @override + String get brightness => 'Tema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$az brightnessOptions = _Translations$settingsTab$general$brightnessOptions$az._( + _root, + ); + @override + String get color => 'Rəng'; + @override + late final _Translations$settingsTab$general$colorOptions$az colorOptions = _Translations$settingsTab$general$colorOptions$az._(_root); + @override + String get language => 'Dil'; + @override + late final _Translations$settingsTab$general$languageOptions$az languageOptions = _Translations$settingsTab$general$languageOptions$az._(_root); + @override + String get saveWindowPlacement => 'Çıxdıqdan sonra pəncərə mövqeyini saxla'; + @override + String get saveWindowPlacementWindows => 'Çıxış sonrası pəncərə mövqeyin saxla'; + @override + String get minimizeToTray => 'Bağlayanda Sistem Sahəsi/Menyu Cizgisinə kiçilt'; + @override + String get launchAtStartup => 'Girişdən sonra birbaşa başlat'; + @override + String get launchMinimized => 'Birbaşa başlat: Gizli başlat'; + @override + String get showInContextMenu => 'Məzmun menyusunda LocalSend-i göstər'; + @override + String get animations => 'Animasiyalar'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$az extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Qəbul et'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get autoFinish => 'Avtomatik Bitirmə'; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get destination => 'Qovluqda yadda saxla'; + @override + String get downloads => '(Yüklənənlər)'; + @override + String get saveToGallery => 'Medianı qalereyada yadda saxla'; + @override + String get saveToHistory => 'Tarixçədə yadda saxla'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$az extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Göndər'; + @override + String get shareViaLinkAutoAccept => '"Keçid vasitəsilə paylaş" rejimində sorğuları avtomatik qəbul et'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$az extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Şəbəkə'; + @override + String get needRestart => 'Parametrləri tətbiq etmək üçün serveri yenidən başladın!'; + @override + String get server => 'Server'; + @override + String get alias => 'Cihazın adı'; + @override + String get deviceType => 'Cihazın tipi'; + @override + String get deviceModel => 'Cihazın modeli'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Axtarışın zaman aşımı'; + @override + String get useSystemName => 'Sistemin adından istifadə et'; + @override + String get generateRandomAlias => 'Təsadüfi ad yarat'; + @override + String portWarning({required Object defaultPort}) => + 'Fərdi portdan istifadə etdiyiniz üçün başqa cihazlar tərəfindən aşkarlanmaya bilərsiniz. (defolt: ${defaultPort})'; + @override + String get multicastGroup => 'Multicast ünvanı'; + @override + String get encryption => 'Şifrələmə'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Fərdi multicast ünvanından istifadə etdiyiniz üçün başqa cihazlar tərəfindən aşkarlanmaya bilərsiniz. (defolt: ${defaultMulticast})'; + @override + String get network => 'Şəbəkə'; + @override + late final _Translations$settingsTab$network$networkOptions$az networkOptions = _Translations$settingsTab$network$networkOptions$az._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$az extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Digər'; + @override + String get support => 'LocalSend-i dəstəklə'; + @override + String get donate => 'İanə et'; + @override + String get privacyPolicy => 'Məxfilik siyasəti'; + @override + String get termsOfUse => 'İstifadə şərtləri'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$az extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get deleteFromHistory => 'Tarixçədən sil'; + @override + String get open => 'Faylı aç'; + @override + String get showInFolder => 'Qovluqda göstər'; + @override + String get info => 'Məlumat'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$az extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Heç bir fayl seçilməyib'; + @override + String get content => 'Zəhmət olmasa, ən azı bir fayl seçin.'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$az extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get size => 'Ölçüsü:'; + @override + String get path => 'Yol:'; + @override + String get sender => 'Göndərən:'; + @override + String get title => 'Fayl məlumatı'; + @override + String get fileName => 'Faylın adı:'; + @override + String get time => 'Vaxt:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$az extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR-kod'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$az extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get content => 'Bütün tarixçəni silmək istədiyinizə əminsiniz?'; + @override + String get title => 'Tarixçəni təmizlə'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$az extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend lokal şəbəkəni skan etmək icazəsi olmadan digər cihazları tapa bilmir. Zəhmət olmasa, parametrlərdən bu icazəni verin.'; + @override + String get gotoSettings => 'Parametrlər'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$az extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + List get content => [ + 'Fayl sorğuları artıq sevimlilər siyahısındakı cihazlardan avtomatik qəbul edəcək.', + 'Xəbərdarlıq! Hal-hazırda bu, tamamilə təhlükəsiz deyil, çünki sevimlilər siyahısındakı istənilən cihazın barmaq izinə sahib olan haker məhdudiyyətsiz sizə fayllar göndərə bilər.', + 'Bununla belə, bu seçim lokal şəbəkədəki bütün istifadəçilərin sizə məhdudiyyətsiz fayllar göndərməsinə icazə verməkdən daha təhlükəsizdir.', + ]; + @override + String get title => _root.general.quickSaveFromFavorites; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$az extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'PIN-i daxil et'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$az extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Göndərmə rejimləri'; + @override + String get single => 'Faylları bir cihaza göndərir. Faylların ötürülməsi başa çatdıqdan sonra seçim silinəcək.'; + @override + String get multiple => 'Faylları birdən çox cihaza göndərir. Faylların ötürülməsi tamamlandıqdan sonra seçim silinməyəcək.'; + @override + String get link => 'LocalSend-i quraşdırmamış alıcılar linki brauzerlərində açaraq seçilmiş faylları endirə bilərlər.'; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$az extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get addFavorite => 'Əlavə et'; + @override + String get title => 'Sevimlilər'; + @override + String get noFavorites => 'Hələ ki, sevimli cihaz yoxdur.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$az extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$az extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Sevimlilərə əlavə et'; + @override + String get titleEdit => 'Parametrlər'; + @override + String get name => 'Cihazın adı'; + @override + String get auto => '(avtomatik)'; + @override + String get ip => 'IP ünvan'; + @override + String get port => 'Port'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$az extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Seçilmişlərə əlavə et'; + @override + String get content => 'Nə əlavə etmək istəyirsiniz?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$az extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Faylı aç'; + @override + String get content => 'Qəbul edilmiş faylı açmaq istəyirsiniz?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$az extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ünvanı daxil et'; + @override + String get hashtag => 'Heşteq'; + @override + String get ip => 'IP ünvan'; + @override + String get recentlyUsed => 'Son istifadə olunan: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$az extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Fayl transferini ləğv et'; + @override + String get content => 'Siz həqiqətən faylların transferini ləğv etmək istəyirsiniz?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$az extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Faylı açmaq mümkün olmadı'; + @override + String content({required Object file}) => '"${file}" faylını açmaq mümkün olmadı. Fayl köçürülmüş, adı dəyişdirilmiş və ya silinmiş ola bilər?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$az extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Şifrələmə deaktiv edilib'; + @override + String get content => + 'Əlaqə artıq şifrələnməmiş HTTP protokolu vasitəsilə həyata keçirilir. HTTPS protokolundan istifadə etmək üçün şifrələməni yenidən aktiv edin.'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$az extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sevimlilərdən sil'; + @override + String content({required Object name}) => 'Həqiqətən də "${name}" cihazını sevimlilərdən silmək istəyirsiniz?'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$az extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Faylın adını daxil et'; + @override + String original({required Object original}) => 'Orijinal: ${original}'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$az extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mesaj yaz'; + @override + String get multiline => 'Çoxsətirli'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$az extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'İcazə yoxdur'; + @override + String get content => 'Siz lazımi icazələri verməmisiniz. Zəhmət olmasa, parametrlərdə icazə verin.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$az extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mövcud deyil'; + @override + String get content => 'Bu funksiya sadəcə burada mövcuddur:'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$az extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sürətli hərəkətlər'; + @override + String get counter => 'Sayğac'; + @override + String get prefix => 'Prefiks'; + @override + String get padZero => 'Sıfırlar ilə doldur'; + @override + String get sortBeforeCount => 'Qabaqcadan əlifba sırası ilə sırala'; + @override + String get random => 'Təsadüfi'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$az extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Fayl sorğuları artıq avtomatik qəbul ediləcək. Nəzərə alın ki, lokal şəbəkədəki hər kəs sizə fayl göndərə bilər.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$az extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$az extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get solution => + 'Zəhmət olmasa, bütün cihazların eyni Wi-Fi şəbəkəsində olduğundan və eyni konfiqurasiyanı (port, multicast ünvanı, şifrələmə) paylaşdığından əmin olun. Hədəf cihazın IP ünvanını əl ilə yazmağı cəhd edə bilərsiniz. Əgər bu işə yararsa, gələcəkdə avtomatik aşkarlanması üçün bu cihazı sevimlilərə əlavə etməyi nəzərdən keçirin.'; + @override + String get symptom => 'Bu cihaz digər cihazları aşkar edə bilməz.'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$az extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Bu cihaz digər cihazlara fayl göndərə bilər, lakin qəbul edə bilməz.'; + @override + String solution({required Object port}) => + 'Bu, çox güman ki, firewall problemidir. Siz ${port} portunda daxil olan bağlantılara (UDP və TCP) icazə verməklə bunu həll edə bilərsiniz.'; + @override + String get openFirewall => 'Şəbəkə ekranını (firewall) aç'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$az extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get solution => + 'Problem hər iki tərəfdə də var? Əgər belədirsə, hər iki cihazın eyni Wi-Fi şəbəkəsində olduğundan və eyni konfiqurasiyanı (port, multicast ünvanı, şifrələmə) paylaşdığından əmin olmalısınız. Wi-Fi şəbəkəsi Access Point (AP) izolyasiyasına görə iştirakçılar arasında ünsiyyətə icazə verməyə bilər. Bu halda, bu seçim ruterdə söndürülməlidir.'; + @override + String get symptom => 'Hər iki cihaz bir-birini aşkarlaya bilmir və faylları paylaşa bilmir.'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$az extends Translations$progressPage$total$en { + _Translations$progressPage$total$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$az title = _Translations$progressPage$total$title$az._(_root); + @override + String count({required Object curr, required Object n}) => 'Fayl: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Ölçü: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Sürət: ${speed}/s'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$az extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; + @override + String get dark => 'Qaranlıq'; + @override + String get light => 'İşıqlı'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$az extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$az extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$az extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get all => 'Hamısı'; + @override + String get filtered => 'Filtrlənmiş'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$az extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$az._(TranslationsAz root) : this._root = root, super.internal(root); + + final TranslationsAz _root; // ignore: unused_field + + // Translations + @override + String get canceledSender => 'Göndərən tərəfindən dayandırıldı'; + @override + String sending({required Object time}) => 'Ümumi proses (${time})'; + @override + String get finishedError => 'Proses xəta verərək dayandı'; + @override + String get canceledReceiver => 'Qəbul edən tərəfindən dayandırıldı'; +} diff --git a/app/lib/gen/strings_bg.g.dart b/app/lib/gen/strings_bg.g.dart new file mode 100644 index 0000000..5261a41 --- /dev/null +++ b/app/lib/gen/strings_bg.g.dart @@ -0,0 +1,1437 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsBg extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsBg({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.bg, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsBg _root = this; // ignore: unused_field + + @override + TranslationsBg $copyWith({TranslationMetadata? meta}) => TranslationsBg(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Български'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$bg general = _Translations$general$bg._(_root); + @override + late final _Translations$receiveTab$bg receiveTab = _Translations$receiveTab$bg._(_root); + @override + late final _Translations$sendTab$bg sendTab = _Translations$sendTab$bg._(_root); + @override + late final _Translations$settingsTab$bg settingsTab = _Translations$settingsTab$bg._(_root); + @override + late final _Translations$troubleshootPage$bg troubleshootPage = _Translations$troubleshootPage$bg._(_root); + @override + late final _Translations$receiveHistoryPage$bg receiveHistoryPage = _Translations$receiveHistoryPage$bg._(_root); + @override + late final _Translations$apkPickerPage$bg apkPickerPage = _Translations$apkPickerPage$bg._(_root); + @override + late final _Translations$selectedFilesPage$bg selectedFilesPage = _Translations$selectedFilesPage$bg._(_root); + @override + late final _Translations$receivePage$bg receivePage = _Translations$receivePage$bg._(_root); + @override + late final _Translations$receiveOptionsPage$bg receiveOptionsPage = _Translations$receiveOptionsPage$bg._(_root); + @override + late final _Translations$sendPage$bg sendPage = _Translations$sendPage$bg._(_root); + @override + late final _Translations$progressPage$bg progressPage = _Translations$progressPage$bg._(_root); + @override + late final _Translations$webSharePage$bg webSharePage = _Translations$webSharePage$bg._(_root); + @override + late final _Translations$aboutPage$bg aboutPage = _Translations$aboutPage$bg._(_root); + @override + late final _Translations$donationPage$bg donationPage = _Translations$donationPage$bg._(_root); + @override + late final _Translations$changelogPage$bg changelogPage = _Translations$changelogPage$bg._(_root); + @override + late final _Translations$dialogs$bg dialogs = _Translations$dialogs$bg._(_root); + @override + late final _Translations$sanitization$bg sanitization = _Translations$sanitization$bg._(_root); + @override + late final _Translations$tray$bg tray = _Translations$tray$bg._(_root); + @override + late final _Translations$web$bg web = _Translations$web$bg._(_root); + @override + late final _Translations$assetPicker$bg assetPicker = _Translations$assetPicker$bg._(_root); + @override + late final _Translations$networkInterfacesPage$bg networkInterfacesPage = _Translations$networkInterfacesPage$bg._(_root); +} + +// Path: general +class _Translations$general$bg extends Translations$general$en { + _Translations$general$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Приеми'; + @override + String get accepted => 'Прието'; + @override + String get add => 'Добави'; + @override + String get advanced => 'Разширено'; + @override + String get cancel => 'Отказ'; + @override + String get close => 'Затвори'; + @override + String get confirm => 'Потвърди'; + @override + String get continueStr => 'Продължи'; + @override + String get copy => 'Копирай'; + @override + String get copiedToClipboard => 'Копирано в клипборда'; + @override + String get decline => 'Откажи'; + @override + String get done => 'Готово'; + @override + String get delete => 'Изтриване'; + @override + String get edit => 'Редактирай'; + @override + String get error => 'Грешка'; + @override + String get example => 'Пример'; + @override + String get files => 'Файлове'; + @override + String get finished => 'Завършено'; + @override + String get hide => 'Скрий'; + @override + String get off => 'Изключено'; + @override + String get offline => 'Офлайн'; + @override + String get on => 'Включено'; + @override + String get online => 'Онлайн'; + @override + String get open => 'Отвори'; + @override + String get queue => 'Опашка'; + @override + String get quickSave => 'Бързо запазване'; + @override + String get quickSaveFromFavorites => 'Бързо запазване за „Любими“'; + @override + String get renamed => 'Преименуван'; + @override + String get reset => 'Отмяна на промените'; + @override + String get restart => 'Рестартирай'; + @override + String get settings => 'Настройки'; + @override + String get skipped => 'Пропуснато'; + @override + String get start => 'Започни'; + @override + String get stop => 'Спри'; + @override + String get save => 'Запази'; + @override + String get unchanged => 'Непроменено'; + @override + String get unknown => 'Неизвестно'; + @override + String get noItemInClipboard => 'Няма елементи в клипборда.'; +} + +// Path: receiveTab +class _Translations$receiveTab$bg extends Translations$receiveTab$en { + _Translations$receiveTab$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Получаване'; + @override + late final _Translations$receiveTab$infoBox$bg infoBox = _Translations$receiveTab$infoBox$bg._(_root); + @override + late final _Translations$receiveTab$quickSave$bg quickSave = _Translations$receiveTab$quickSave$bg._(_root); +} + +// Path: sendTab +class _Translations$sendTab$bg extends Translations$sendTab$en { + _Translations$sendTab$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Изпращане'; + @override + late final _Translations$sendTab$selection$bg selection = _Translations$sendTab$selection$bg._(_root); + @override + late final _Translations$sendTab$picker$bg picker = _Translations$sendTab$picker$bg._(_root); + @override + String get shareIntentInfo => 'Можете също да използвате функцията „Споделяне“ на вашето мобилно устройство, за да избирате файлове по-лесно.'; + @override + String get nearbyDevices => 'Устройства в близост'; + @override + String get thisDevice => 'Това устройство'; + @override + String get scan => 'Търсене на устройства'; + @override + String get manualSending => 'Ръчно изпращане'; + @override + String get sendMode => 'Режим на изпращане'; + @override + late final _Translations$sendTab$sendModes$bg sendModes = _Translations$sendTab$sendModes$bg._(_root); + @override + String get sendModeHelp => 'Обяснение'; + @override + String get help => 'Моля, уверете се, че желаната цел също е в същата Wi-Fi мрежа.'; + @override + String get placeItems => 'Поставете елементи за споделяне.'; +} + +// Path: settingsTab +class _Translations$settingsTab$bg extends Translations$settingsTab$en { + _Translations$settingsTab$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Настройки'; + @override + late final _Translations$settingsTab$general$bg general = _Translations$settingsTab$general$bg._(_root); + @override + late final _Translations$settingsTab$receive$bg receive = _Translations$settingsTab$receive$bg._(_root); + @override + late final _Translations$settingsTab$send$bg send = _Translations$settingsTab$send$bg._(_root); + @override + late final _Translations$settingsTab$network$bg network = _Translations$settingsTab$network$bg._(_root); + @override + late final _Translations$settingsTab$other$bg other = _Translations$settingsTab$other$bg._(_root); + @override + String get advancedSettings => 'Разширени настройки'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$bg extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Отстраняване на неизправност'; + @override + String get subTitle => 'Приложението не работи ли според очакванията? Тук можете да намерите някои общи решения на проблеми.'; + @override + String get solution => 'Решение:'; + @override + String get fixButton => 'Автоматично поправяне'; + @override + late final _Translations$troubleshootPage$firewall$bg firewall = _Translations$troubleshootPage$firewall$bg._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$bg noDiscovery = _Translations$troubleshootPage$noDiscovery$bg._(_root); + @override + late final _Translations$troubleshootPage$noConnection$bg noConnection = _Translations$troubleshootPage$noConnection$bg._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$bg extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'История'; + @override + String get openFolder => 'Отвори папка'; + @override + String get deleteHistory => 'Изтриване на историята'; + @override + String get empty => 'Историята е празна.'; + @override + late final _Translations$receiveHistoryPage$entryActions$bg entryActions = _Translations$receiveHistoryPage$entryActions$bg._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$bg extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Приложения (APK)'; + @override + String get excludeSystemApps => 'Изключване на системни приложения'; + @override + String get excludeAppsWithoutLaunchIntent => 'Изключване на приложения, които не могат да се стартират'; + @override + String apps({required Object n}) => '${n} Приложения'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$bg extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Изтриване на всички'; +} + +// Path: receivePage +class _Translations$receivePage$bg extends Translations$receivePage$en { + _Translations$receivePage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('bg'))( + n, + one: 'иска да ви изпрати файл', + other: 'иска да ви изпрати ${n} файлове', + ); + @override + String get subTitleMessage => 'Ви изпрати съобщение:'; + @override + String get subTitleLink => 'Ви изпрати връзка:'; + @override + String get canceled => 'Подателят е отменил заявката.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$bg extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Опции'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(папка на LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Изключва се автоматично, защото има папки.'; +} + +// Path: sendPage +class _Translations$sendPage$bg extends Translations$sendPage$en { + _Translations$sendPage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'В очакване на отговор…'; + @override + String get rejected => 'Получателят е отхвърлил заявката.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Получателят е зает с друга заявка.'; +} + +// Path: progressPage +class _Translations$progressPage$bg extends Translations$progressPage$en { + _Translations$progressPage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Изпращане на файлове'; + @override + String get titleReceiving => 'Получаване на файлове'; + @override + String get savedToGallery => 'Запазено в Снимки'; + @override + late final _Translations$progressPage$total$bg total = _Translations$progressPage$total$bg._(_root); + @override + late final _Translations$progressPage$remainingTime$bg remainingTime = _Translations$progressPage$remainingTime$bg._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$bg extends Translations$webSharePage$en { + _Translations$webSharePage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Споделете чрез връзка'; + @override + String get loading => 'Стартиране на сървъра…'; + @override + String get stopping => 'Спиране на сървъра…'; + @override + String get error => 'Възникна грешка при стартиране на сървъра.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('bg'))( + n, + one: 'Отворете тази връзка във вашия браузър:', + other: 'Отворете една от тези връзки във вашия браузър:', + ); + @override + String get requests => 'Заявки'; + @override + String get noRequests => 'Все още няма заявки.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Автоматично приемане на заявки'; + @override + String get requirePin => 'Изискване на ПИН код'; + @override + String pinHint({required Object pin}) => 'ПИН кодът е „${pin}“'; + @override + String get encryptionHint => 'LocalSend използва самоподписан сертификат. Трябва да го приемете във вашия браузър.'; + @override + String pendingRequests({required Object n}) => 'Чакащи заявки: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$bg extends Translations$aboutPage$en { + _Translations$aboutPage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Относно LocalSend'; + @override + List get description => [ + 'LocalSend е безплатно приложение с отворен код, което ви позволява сигурно да споделяте файлове и съобщения с устройства наблизо през вашата локална мрежа, без да се нуждаете от интернет връзка.', + 'Това приложение е достъпно за Android, iOS, macOS, Windows и Linux. Можете да намерите всички опции за изтегляне на официалната домашна страница.', + ]; + @override + String get author => 'Автор'; + @override + String get contributors => 'Сътрудници'; + @override + String get packagers => 'Опаковчици'; + @override + String get translators => 'Преводачи'; +} + +// Path: donationPage +class _Translations$donationPage$bg extends Translations$donationPage$en { + _Translations$donationPage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Дарение'; + @override + String get info => + 'LocalSend е безплатен, с отворен код и без никакви реклами. Ако харесвате приложението, можете да подкрепите разработката с дарение.'; + @override + String donate({required Object amount}) => 'Дарение ${amount}'; + @override + String get thanks => 'Благодаря много!'; + @override + String get restore => 'Възстановяване на покупка'; +} + +// Path: changelogPage +class _Translations$changelogPage$bg extends Translations$changelogPage$en { + _Translations$changelogPage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Дневник на промените'; +} + +// Path: dialogs +class _Translations$dialogs$bg extends Translations$dialogs$en { + _Translations$dialogs$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$bg addFile = _Translations$dialogs$addFile$bg._(_root); + @override + late final _Translations$dialogs$openFile$bg openFile = _Translations$dialogs$openFile$bg._(_root); + @override + late final _Translations$dialogs$addressInput$bg addressInput = _Translations$dialogs$addressInput$bg._(_root); + @override + late final _Translations$dialogs$cancelSession$bg cancelSession = _Translations$dialogs$cancelSession$bg._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$bg cannotOpenFile = _Translations$dialogs$cannotOpenFile$bg._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$bg encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$bg._(_root); + @override + late final _Translations$dialogs$errorDialog$bg errorDialog = _Translations$dialogs$errorDialog$bg._(_root); + @override + late final _Translations$dialogs$favoriteDialog$bg favoriteDialog = _Translations$dialogs$favoriteDialog$bg._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$bg favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$bg._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$bg favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$bg._(_root); + @override + late final _Translations$dialogs$fileInfo$bg fileInfo = _Translations$dialogs$fileInfo$bg._(_root); + @override + late final _Translations$dialogs$fileNameInput$bg fileNameInput = _Translations$dialogs$fileNameInput$bg._(_root); + @override + late final _Translations$dialogs$historyClearDialog$bg historyClearDialog = _Translations$dialogs$historyClearDialog$bg._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$bg localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$bg._(_root); + @override + late final _Translations$dialogs$messageInput$bg messageInput = _Translations$dialogs$messageInput$bg._(_root); + @override + late final _Translations$dialogs$noFiles$bg noFiles = _Translations$dialogs$noFiles$bg._(_root); + @override + late final _Translations$dialogs$noPermission$bg noPermission = _Translations$dialogs$noPermission$bg._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$bg notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$bg._(_root); + @override + late final _Translations$dialogs$qr$bg qr = _Translations$dialogs$qr$bg._(_root); + @override + late final _Translations$dialogs$quickActions$bg quickActions = _Translations$dialogs$quickActions$bg._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$bg quickSaveNotice = _Translations$dialogs$quickSaveNotice$bg._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$bg quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$bg._(_root); + @override + late final _Translations$dialogs$pin$bg pin = _Translations$dialogs$pin$bg._(_root); + @override + late final _Translations$dialogs$sendModeHelp$bg sendModeHelp = _Translations$dialogs$sendModeHelp$bg._(_root); + @override + late final _Translations$dialogs$zoom$bg zoom = _Translations$dialogs$zoom$bg._(_root); +} + +// Path: sanitization +class _Translations$sanitization$bg extends Translations$sanitization$en { + _Translations$sanitization$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Името на файла не може да бъде празно'; + @override + String get invalid => 'Името на файла съдържа невалидни знаци'; +} + +// Path: tray +class _Translations$tray$bg extends Translations$tray$en { + _Translations$tray$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Излезте от LocalSend'; + @override + String get closeWindows => 'Изход'; +} + +// Path: web +class _Translations$web$bg extends Translations$web$en { + _Translations$web$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Въведете ПИН код'; + @override + String get invalidPin => 'Невалиден ПИН код'; + @override + String get tooManyAttempts => 'Твърде много опити'; + @override + String get rejected => 'Отхвърлено'; + @override + String get files => 'Файлове'; + @override + String get fileName => 'Име на файл'; + @override + String get size => 'Размер'; +} + +// Path: assetPicker +class _Translations$assetPicker$bg extends Translations$assetPicker$en { + _Translations$assetPicker$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Потвърди'; + @override + String get cancel => 'Отказ'; + @override + String get edit => 'Редактирай'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Неуспешно зареждане'; + @override + String get original => 'Произход'; + @override + String get preview => 'Преглед'; + @override + String get select => 'Избери'; + @override + String get emptyList => 'Празен списък'; + @override + String get unSupportedAssetType => 'Неподдържан тип файл.'; + @override + String get unableToAccessAll => 'Няма достъп до всички файлове на устройството'; + @override + String get viewingLimitedAssetsTip => 'Преглеждайте само файлове и албуми, достъпни за приложението.'; + @override + String get changeAccessibleLimitedAssets => 'Щракнете, за да актуализирате достъпните файлове'; + @override + String get accessAllTip => + 'Приложението има достъп само до някои файлове на устройството. Отидете в системните настройки и разрешете на приложението достъп до всички медии на устройството.'; + @override + String get goToSystemSettings => 'Отидете в системните настройки'; + @override + String get accessLimitedAssets => 'Продължете с ограничен достъп'; + @override + String get accessiblePathName => 'Достъпни файлове'; + @override + String get sTypeAudioLabel => 'Аудио'; + @override + String get sTypeImageLabel => 'Изображение'; + @override + String get sTypeVideoLabel => 'Видео'; + @override + String get sTypeOtherLabel => 'Друга медия'; + @override + String get sActionPlayHint => 'изпълни'; + @override + String get sActionPreviewHint => 'преглед'; + @override + String get sActionSelectHint => 'избери'; + @override + String get sActionSwitchPathLabel => 'промяна на пътя'; + @override + String get sActionUseCameraHint => 'използвай камера'; + @override + String get sNameDurationLabel => 'продължителност'; + @override + String get sUnitAssetCountLabel => 'брой'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$bg extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get preview => 'Преглед'; + @override + String get whitelist => 'Бял списък'; + @override + String get blacklist => 'Черен списък'; + @override + String get title => 'Мрежови интерфейси'; + @override + String get info => + 'По подразбиране, LocalSend използва всички налични мрежови интерфейси. Тук можете да изключите нежелани мрежи. Трябва да рестартирате сървъра, за да приложите промените.'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$bg extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Порт:'; + @override + String get alias => 'Име на устройството:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$bg extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Любими'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$bg extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Избор'; + @override + String files({required Object files}) => 'Файлове: ${files}'; + @override + String size({required Object size}) => 'Размер: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$bg extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get file => 'Файл'; + @override + String get folder => 'Папка'; + @override + String get media => 'Медия'; + @override + String get text => 'Текст'; + @override + String get app => 'Приложение'; + @override + String get clipboard => 'Постави'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$bg extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get single => 'Единичен получател'; + @override + String get multiple => 'Множество получатели'; + @override + String get link => 'Споделете чрез връзка'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$bg extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Общи'; + @override + String get brightness => 'Тема'; + @override + late final _Translations$settingsTab$general$brightnessOptions$bg brightnessOptions = _Translations$settingsTab$general$brightnessOptions$bg._( + _root, + ); + @override + String get color => 'Цвят'; + @override + late final _Translations$settingsTab$general$colorOptions$bg colorOptions = _Translations$settingsTab$general$colorOptions$bg._(_root); + @override + String get language => 'Език'; + @override + late final _Translations$settingsTab$general$languageOptions$bg languageOptions = _Translations$settingsTab$general$languageOptions$bg._(_root); + @override + String get saveWindowPlacement => 'Запази позицията на прозореца след напускане'; + @override + String get saveWindowPlacementWindows => 'Запази позицията на прозореца след излизане'; + @override + String get minimizeToTray => 'Минимизирай в Системна област/Лента с менюта при затваряне'; + @override + String get launchAtStartup => 'Автоматично стартиране след влизане'; + @override + String get launchMinimized => 'Автоматично стартиране: Стартирай скрито'; + @override + String get showInContextMenu => 'Покажи LocalSend в контекстното меню'; + @override + String get animations => 'Анимации'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$bg extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Получаване'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Автоматично завършване'; + @override + String get destination => 'Запази в папка'; + @override + String get downloads => '(Изтегляния)'; + @override + String get saveToGallery => 'Запази медия в галерия'; + @override + String get saveToHistory => 'Запази в история'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$bg extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Изпращане'; + @override + String get shareViaLinkAutoAccept => 'Автоматично приемане на заявки в режим "Споделяне чрез връзка"'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$bg extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Мрежа'; + @override + String get needRestart => 'Рестартирай сървъра, за да приложите настройките!'; + @override + String get server => 'Сървър'; + @override + String get alias => 'Име на устройството'; + @override + String get deviceType => 'Тип на устройството'; + @override + String get deviceModel => 'Модел на устройството'; + @override + String get port => 'Порт'; + @override + String get discoveryTimeout => 'Изчакване за откриване'; + @override + String get useSystemName => 'Използвай системно име'; + @override + String get generateRandomAlias => 'Създаване на случаен псевдоним'; + @override + String portWarning({required Object defaultPort}) => + 'Възможно е да не бъдете открити от други устройства, защото използвате персонализиран порт. (default: ${defaultPort})'; + @override + String get encryption => 'Шифроване'; + @override + String get multicastGroup => 'Адрес за множествено предаване'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Възможно е да не бъдете открити от други устройства, защото използвате персонализиран адрес за множествено предаване. (default: ${defaultMulticast})'; + @override + String get network => 'Мрежа'; + @override + late final _Translations$settingsTab$network$networkOptions$bg networkOptions = _Translations$settingsTab$network$networkOptions$bg._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$bg extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Други'; + @override + String get support => 'Поддръжка на LocalSend'; + @override + String get donate => 'Дарение'; + @override + String get privacyPolicy => 'Политика за поверителност'; + @override + String get termsOfUse => 'Условия за ползване'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$bg extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get symptom => + 'Това устройство може да изпраща файлове на други устройства, но други устройства не могат да изпращат файлове на това устройство.'; + @override + String solution({required Object port}) => + 'Това най-вероятно е проблем със защитната стена. Можете да разрешите това, като разрешите входящи връзки (UDP и TCP) на порт ${port}.'; + @override + String get openFirewall => 'Отворете защитната стена'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$bg extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Това устройство не може да открие други устройства.'; + @override + String get solution => + 'Моля, уверете се, че всички устройства са в една и съща Wi-Fi мрежа и споделят една и съща конфигурация (порт, адрес за множествено предаване, криптиране). Можете да опитате да въведете ръчно IP адреса на целевото устройство. Ако това работи, обмислете добавянето на това устройство към любими, за да може да бъде автоматично открито в бъдеще.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$bg extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'И двете устройства не могат да се откриват, нито могат да споделят файлове.'; + @override + String get solution => + 'Проблемът и от двете страни ли съществува? Ако е така, трябва да се уверите, че и двете устройства са в една и съща Wi-Fi мрежа и споделят една и съща конфигурация (порт, адрес за множествено предаване, криптиране). Wi-Fi мрежата може да не позволява комуникация между участниците поради изолация на точката за достъп (AP). В този случай тази опция трябва да бъде деактивирана на рутера.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$bg extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get open => 'Отвори файл'; + @override + String get showInFolder => 'Покажи в папка'; + @override + String get info => 'Информация'; + @override + String get deleteFromHistory => 'Изтриване от историята'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$bg extends Translations$progressPage$total$en { + _Translations$progressPage$total$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$bg title = _Translations$progressPage$total$title$bg._(_root); + @override + String count({required Object curr, required Object n}) => 'Файлове: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Размер: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Скорост: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$bg extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Използвайте „h“ като съкращение за часове и „m“ за минути + @override + String hours({required Object h, required Object m}) => '${h}ч ${m}мин'; + + /// Използвайте „d“ за дни, „h“ за часове и „m“ за минути + @override + String days({required Object d, required Object h, required Object m}) => '${d}д ${h}ч ${m}мин'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$bg extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Добави към избора'; + @override + String get content => 'Какво искате да добавите?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$bg extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Отвори файл'; + @override + String get content => 'Искате ли да отворите получения файл?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$bg extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Въведете адрес'; + @override + String get hashtag => 'Хаштаг'; + @override + String get ip => 'IP адрес'; + @override + String get recentlyUsed => 'Наскоро използван: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$bg extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Отмени прехвърлянето на файлове'; + @override + String get content => 'Наистина ли искате да отмените прехвърлянето на файлове?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$bg extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Не може да се отвори файл'; + @override + String content({required Object file}) => 'Не може да се отвори "${file}". Този файл бил ли е преместен, преименуван или изтрит?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$bg extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Шифроването е деактивирано'; + @override + String get content => + 'Комуникацията вече се осъществява чрез некриптиран HTTP протокол. За да използвате HTTPS протокол, активирайте криптирането отново.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$bg extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$bg extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Любими'; + @override + String get noFavorites => 'Все още няма любими устройства.'; + @override + String get addFavorite => 'Добави'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$bg extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Изтриване от любими'; + @override + String content({required Object name}) => 'Наистина ли искате да изтриете от любими "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$bg extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Добави към любими'; + @override + String get titleEdit => 'Настройки'; + @override + String get name => 'Име на устройство'; + @override + String get auto => '(автоматично)'; + @override + String get ip => 'IP адрес'; + @override + String get port => 'Порт'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$bg extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Информация за файла'; + @override + String get fileName => 'Име на файл:'; + @override + String get path => 'Път:'; + @override + String get size => 'Размер:'; + @override + String get sender => 'Подател:'; + @override + String get time => 'Време:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$bg extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Въведете име на файл'; + @override + String original({required Object original}) => 'Оригинално: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$bg extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Изчистване на история'; + @override + String get content => 'Наистина ли искате да изтриете цялата история?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$bg extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend не може да намери други устройства без разрешение за сканиране на локалната мрежа. Моля, предоставете това разрешение в настройките.'; + @override + String get gotoSettings => 'Настройки'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$bg extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Вид съобщение'; + @override + String get multiline => 'Многоредов'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$bg extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Няма избрани файлове'; + @override + String get content => 'Моля, изберете поне един файл.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$bg extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Няма разрешение'; + @override + String get content => 'Не сте предоставили необходимите разрешения. Моля, предоставете ги в настройките.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$bg extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Не е налична'; + @override + String get content => 'Тази функция е достъпна само на:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$bg extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR код'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$bg extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Бързи действия'; + @override + String get counter => 'Брояч'; + @override + String get prefix => 'Префикс'; + @override + String get padZero => 'Подложка с нули'; + @override + String get sortBeforeCount => 'Сортирай по азбучен ред предварително (A-Z)'; + @override + String get random => 'Случаен'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$bg extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Заявките за файлове вече се приемат автоматично. Имайте предвид, че всеки в локалната мрежа може да ви изпраща файлове.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$bg extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Заявките за файлове вече се приемат автоматично от устройства в списъка ви с любими.', + 'Внимание! В момента това не е напълно сигурно, тъй като хакер, който има пръстов отпечатък на всяко устройство от списъка ви с любими, може да ви изпраща файлове без ограничения.', + 'Въпреки това, тази опция все още е по-безопасна от разрешаването на всички потребители в локалната мрежа да ви изпращат файлове без ограничения.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$bg extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Въведете ПИН код'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$bg extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'Режими на изпращане'; + @override + String get single => 'Изпраща файлове до един получател. Изборът ще бъде изчистен след приключване на прехвърлянето на файлове.'; + @override + String get multiple => 'Изпраща файлове до множество получатели. Изборът няма да бъде изчистен след приключване на прехвърлянето на файлове.'; + @override + String get link => 'Получателите, които нямат инсталиран LocalSend, могат да изтеглят избраните файлове, като отворят връзката в своя браузър.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$bg extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL адрес'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$bg extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get system => 'Система'; + @override + String get dark => 'Тъмна'; + @override + String get light => 'Светла'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$bg extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get system => 'Система'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$bg extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get system => 'Система'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$bg extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String get all => 'Всички'; + @override + String get filtered => 'Филтриране'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$bg extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$bg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Общ напредък (${time})'; + @override + String get finishedError => 'Завършено с грешка'; + @override + String get canceledSender => 'Отменено от подателя'; + @override + String get canceledReceiver => 'Отменено от получателя'; +} diff --git a/app/lib/gen/strings_bn.g.dart b/app/lib/gen/strings_bn.g.dart new file mode 100644 index 0000000..c1cd168 --- /dev/null +++ b/app/lib/gen/strings_bn.g.dart @@ -0,0 +1,1520 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsBn extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsBn({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.bn, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsBn _root = this; // ignore: unused_field + + @override + TranslationsBn $copyWith({TranslationMetadata? meta}) => TranslationsBn(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'বাংলা'; + @override + String get appName => 'লোকালসেন্ড'; + @override + late final _Translations$general$bn general = _Translations$general$bn._(_root); + @override + late final _Translations$receiveTab$bn receiveTab = _Translations$receiveTab$bn._(_root); + @override + late final _Translations$sendTab$bn sendTab = _Translations$sendTab$bn._(_root); + @override + late final _Translations$settingsTab$bn settingsTab = _Translations$settingsTab$bn._(_root); + @override + late final _Translations$troubleshootPage$bn troubleshootPage = _Translations$troubleshootPage$bn._(_root); + @override + late final _Translations$networkInterfacesPage$bn networkInterfacesPage = _Translations$networkInterfacesPage$bn._(_root); + @override + late final _Translations$receiveHistoryPage$bn receiveHistoryPage = _Translations$receiveHistoryPage$bn._(_root); + @override + late final _Translations$apkPickerPage$bn apkPickerPage = _Translations$apkPickerPage$bn._(_root); + @override + late final _Translations$selectedFilesPage$bn selectedFilesPage = _Translations$selectedFilesPage$bn._(_root); + @override + late final _Translations$receivePage$bn receivePage = _Translations$receivePage$bn._(_root); + @override + late final _Translations$receiveOptionsPage$bn receiveOptionsPage = _Translations$receiveOptionsPage$bn._(_root); + @override + late final _Translations$sendPage$bn sendPage = _Translations$sendPage$bn._(_root); + @override + late final _Translations$progressPage$bn progressPage = _Translations$progressPage$bn._(_root); + @override + late final _Translations$webSharePage$bn webSharePage = _Translations$webSharePage$bn._(_root); + @override + late final _Translations$aboutPage$bn aboutPage = _Translations$aboutPage$bn._(_root); + @override + late final _Translations$donationPage$bn donationPage = _Translations$donationPage$bn._(_root); + @override + late final _Translations$changelogPage$bn changelogPage = _Translations$changelogPage$bn._(_root); + @override + late final _Translations$aliasGenerator$bn aliasGenerator = _Translations$aliasGenerator$bn._(_root); + @override + late final _Translations$dialogs$bn dialogs = _Translations$dialogs$bn._(_root); + @override + late final _Translations$sanitization$bn sanitization = _Translations$sanitization$bn._(_root); + @override + late final _Translations$tray$bn tray = _Translations$tray$bn._(_root); + @override + late final _Translations$web$bn web = _Translations$web$bn._(_root); + @override + late final _Translations$assetPicker$bn assetPicker = _Translations$assetPicker$bn._(_root); +} + +// Path: general +class _Translations$general$bn extends Translations$general$en { + _Translations$general$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get accept => 'অ্যাকসেপ্ট করুন'; + @override + String get accepted => 'অ্যাকসেপ্টেড'; + @override + String get add => 'অ্যাড করুন'; + @override + String get advanced => 'আডভান্স'; + @override + String get cancel => 'ক্যানসেল করুন'; + @override + String get close => 'বন্ধ করুন'; + @override + String get confirm => 'কনফার্ম করুন'; + @override + String get continueStr => 'চালিয়ে যান'; + @override + String get copy => 'কপি করুন'; + @override + String get copiedToClipboard => 'ক্লিপবোর্ডে কপি করা হয়েছে'; + @override + String get decline => 'প্রত্যাখ্যান করুন'; + @override + String get done => 'সম্পন্ন'; + @override + String get delete => 'ডিলিট'; + @override + String get edit => 'এডিট'; + @override + String get error => 'ভুল হয়েছে'; + @override + String get example => 'উদাহরণ'; + @override + String get files => 'ফাইল গুলো'; + @override + String get finished => 'শেষ হয়েছে'; + @override + String get hide => 'হাইড করুন'; + @override + String get off => 'বন্ধ'; + @override + String get offline => 'অফলাইন'; + @override + String get on => 'চালু'; + @override + String get online => 'অনলাইন'; + @override + String get open => 'খুলুন'; + @override + String get queue => 'কিউ'; + @override + String get quickSave => 'কুইক সেভ করুন'; + @override + String get quickSaveFromFavorites => '"ফেভারিট"দের জন্য কুইক সেভ করুন'; + @override + String get renamed => 'নাম পরিবর্তন করা হয়েছে'; + @override + String get reset => 'রিসেট করুন'; + @override + String get restart => 'পুনরায় চালু করুন'; + @override + String get settings => 'সেটিংস'; + @override + String get skipped => 'স্কিপ করা হয়েছে'; + @override + String get start => 'শুরু করুন'; + @override + String get stop => 'বন্ধ করুন'; + @override + String get save => 'সেভ করুন'; + @override + String get unchanged => 'অপরিবর্তিত'; + @override + String get unknown => 'আননোন'; + @override + String get noItemInClipboard => 'ক্লিপবোর্ডে কোনো আইটেম নেই।'; +} + +// Path: receiveTab +class _Translations$receiveTab$bn extends Translations$receiveTab$en { + _Translations$receiveTab$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'রিসিভ'; + @override + late final _Translations$receiveTab$infoBox$bn infoBox = _Translations$receiveTab$infoBox$bn._(_root); + @override + late final _Translations$receiveTab$quickSave$bn quickSave = _Translations$receiveTab$quickSave$bn._(_root); +} + +// Path: sendTab +class _Translations$sendTab$bn extends Translations$sendTab$en { + _Translations$sendTab$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'সেন্ড'; + @override + late final _Translations$sendTab$selection$bn selection = _Translations$sendTab$selection$bn._(_root); + @override + late final _Translations$sendTab$picker$bn picker = _Translations$sendTab$picker$bn._(_root); + @override + String get shareIntentInfo => 'আরো সহজে ফাইল সিলেক্ট করার জন্য আপনার মোবাইলের "Share" ফিচারটি ব্যবহার করতে পারেন।'; + @override + String get nearbyDevices => 'কাছাকাছি থাকা ডিভাইস'; + @override + String get thisDevice => 'এই ডিভাইস'; + @override + String get scan => 'ডিভাইস স্ক্যান করুন'; + @override + String get manualSending => 'ম্যানুয়াল সেন্ডিং'; + @override + String get sendMode => 'সেন্ড মোড'; + @override + late final _Translations$sendTab$sendModes$bn sendModes = _Translations$sendTab$sendModes$bn._(_root); + @override + String get sendModeHelp => 'ব্যাখ্যা'; + @override + String get help => 'অনুগ্রহ করে নিশ্চিত করুন যে পছন্দসই লক্ষ্যটিও একই ওয়াইফাই নেটওয়ার্কে রয়েছে।'; + @override + String get placeItems => 'শেয়ার করার জন্য আইটেম রাখুন।'; +} + +// Path: settingsTab +class _Translations$settingsTab$bn extends Translations$settingsTab$en { + _Translations$settingsTab$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'সেটিংস'; + @override + late final _Translations$settingsTab$general$bn general = _Translations$settingsTab$general$bn._(_root); + @override + late final _Translations$settingsTab$receive$bn receive = _Translations$settingsTab$receive$bn._(_root); + @override + late final _Translations$settingsTab$send$bn send = _Translations$settingsTab$send$bn._(_root); + @override + late final _Translations$settingsTab$network$bn network = _Translations$settingsTab$network$bn._(_root); + @override + late final _Translations$settingsTab$other$bn other = _Translations$settingsTab$other$bn._(_root); + @override + String get advancedSettings => 'আডভান্স সেটিংস'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$bn extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'ট্রাবলশুট'; + @override + String get subTitle => 'অ্যাপটি আশানুরূপ কাজ না করলে, এখানে আপনি কিছু সাধারণ সমাধান পেতে পারেন।'; + @override + String get solution => 'সমাধান:'; + @override + String get fixButton => 'অটোমেটিকালি ঠিক করুন'; + @override + late final _Translations$troubleshootPage$firewall$bn firewall = _Translations$troubleshootPage$firewall$bn._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$bn noDiscovery = _Translations$troubleshootPage$noDiscovery$bn._(_root); + @override + late final _Translations$troubleshootPage$noConnection$bn noConnection = _Translations$troubleshootPage$noConnection$bn._(_root); +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$bn extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'নেটওয়ার্ক ইন্টারফেস'; + @override + String get info => + 'LocalSend সব অ্যাভেলেবেল নেটওয়ার্ক ইন্টারফেস ব্যবহার করে। আপনি এখানে অপ্রয়োজনীয় নেটওয়ার্ক বাদ দিতে পারেন। কোন পরিবর্তন আনলে সার্ভারটি পুনরায় চালু করতে হবে।'; + @override + String get preview => 'প্রিভিউ'; + @override + String get whitelist => 'হোয়াইটলিস্ট'; + @override + String get blacklist => 'ব্ল্যাকলিস্ট'; +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$bn extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'হিস্ট্রি'; + @override + String get openFolder => 'ফোল্ডার খুলুন'; + @override + String get deleteHistory => 'হিস্ট্রি ক্লিয়ার করুন'; + @override + String get empty => 'হিস্ট্রি খালি।'; + @override + late final _Translations$receiveHistoryPage$entryActions$bn entryActions = _Translations$receiveHistoryPage$entryActions$bn._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$bn extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'অ্যাপস (এপিকে)'; + @override + String get excludeSystemApps => 'সিস্টেম অ্যাপ বাদ দিন'; + @override + String get excludeAppsWithoutLaunchIntent => 'অ-লঞ্চযোগ্য অ্যাপগুলি বাদ দিন'; + @override + String apps({required Object n}) => '${n} অ্যাপ্স'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$bn extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'সব ডিলিট করুন'; +} + +// Path: receivePage +class _Translations$receivePage$bn extends Translations$receivePage$en { + _Translations$receivePage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('bn'))( + n, + one: 'আপনাকে একটি ফাইল পাঠাতে চায়', + other: 'আপনাকে ${n}টি ফাইল পাঠাতে চায়', + ); + @override + String get subTitleMessage => 'আপনাকে একটি মেসেজ পাঠিয়েছে:'; + @override + String get subTitleLink => 'আপনাকে একটি লিঙ্ক পাঠিয়েছে:'; + @override + String get canceled => 'সেন্ডার রিকুয়েস্টটি ক্যানসেল করেছে।'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$bn extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'অপশনসমূহ'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(${_root.appName} folder)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'অটোমেটিকালি বন্ধ কারণ ডিরেক্টরি আছে.'; +} + +// Path: sendPage +class _Translations$sendPage$bn extends Translations$sendPage$en { + _Translations$sendPage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'রেস্পন্সের অপেক্ষায়…'; + @override + String get rejected => 'রিসিভার রিকুয়েস্টটি ক্যানসেল করেছে।'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'রিসিভার রিকুয়েস্টটি আরেকটি রিকুয়েস্টে ব্যস্ত।'; +} + +// Path: progressPage +class _Translations$progressPage$bn extends Translations$progressPage$en { + _Translations$progressPage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'ফাইল সেন্ড হচ্ছে'; + @override + String get titleReceiving => 'ফাইল রিসিভ করা হচ্ছে'; + @override + String get savedToGallery => 'Photos এ সেভ করা হয়েছে'; + @override + late final _Translations$progressPage$total$bn total = _Translations$progressPage$total$bn._(_root); + @override + late final _Translations$progressPage$remainingTime$bn remainingTime = _Translations$progressPage$remainingTime$bn._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$bn extends Translations$webSharePage$en { + _Translations$webSharePage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'লিঙ্কের মাধ্যমে শেয়ার করুন'; + @override + String get loading => 'সার্ভার চালু করা হচ্ছে…'; + @override + String get stopping => 'সার্ভার বন্ধ করা হচ্ছে…'; + @override + String get error => 'সার্ভার চালু করার সময় একটি সমস্যা হয়েছে৷'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('bn'))( + n, + one: 'ব্রাউজারে এই লিঙ্কটি খুলুন:', + other: 'ব্রাউজারে এই লিঙ্কগুলির একটি খুলুন:', + ); + @override + String get requests => 'রিকুয়েস্ট'; + @override + String get noRequests => 'এখনো কোনো রিকুয়েস্ট নেই.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'রিকুয়েস্ট অটো এক্সেপ্ট করুন'; + @override + String get requirePin => 'পিন প্রয়োজন'; + @override + String pinHint({required Object pin}) => 'পিনটি "${pin}"'; + @override + String get encryptionHint => 'LocalSend একটি সেল্ফ-সাইন্ড সার্টিফিকেট ব্যবহার করে। আপনাকে ব্রাউজারে এটি একসেপ্ট করতে হবে।'; + @override + String pendingRequests({required Object n}) => 'রিকুয়েস্ট অপেক্ষারত: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$bn extends Translations$aboutPage$en { + _Translations$aboutPage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'LocalSend সম্পর্কে'; + @override + List get description => [ + 'LocalSend হল একটি ফ্রী, ওপেন সোর্স অ্যাপ যা ইন্টারনেট ছাড়াই আপনার লোকাল নেটওয়ার্কের ডিভাইসগুলির সাথে ফাইল এবং মেসেজ নিরাপদে শেয়ার করতে দেয়৷', + 'এই অ্যাপটি Android, iOS, macOS, Windows এবং Linux-এ অ্যাভেলেবেল। আপনি অফিসিয়াল হোমপেজে সব ডাউনলোড অপশন খুঁজে পাবেন।', + ]; + @override + String get author => 'লেখক'; + @override + String get contributors => 'অবদানকারী'; + @override + String get packagers => 'প্যাকেজেস'; + @override + String get translators => 'অনুবাদক'; +} + +// Path: donationPage +class _Translations$donationPage$bn extends Translations$donationPage$en { + _Translations$donationPage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'ডোনেট'; + @override + String get info => + 'LocalSend ফ্রী, ওপেন সোর্স এবং কোনো অ্যাড ছাড়াই। আপনি যদি অ্যাপটি পছন্দ করেন তবে আপনি একটি ডোনেশন দিয়ে ডেভেলপমেন্টকে সাপোর্ট করতে পারেন।'; + @override + String donate({required Object amount}) => 'ডোনেট ${amount}'; + @override + String get thanks => 'আপনাকে অনেক ধন্যবাদ!'; + @override + String get restore => 'পারচেজ রিস্টোর'; +} + +// Path: changelogPage +class _Translations$changelogPage$bn extends Translations$changelogPage$en { + _Translations$changelogPage$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'চেঞ্জলগ'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$bn extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'আরাধ্য', + 'সুন্দর', + 'বড়', + 'উজ্জ্বল', + 'পরিষ্কার', + 'চতুর', + 'ঠান্ডা', + 'চতুর', + 'ধূর্ত', + 'নির্ধারিত', + 'অনলস', + 'দক্ষ', + 'অসাধারণ', + 'দ্রুত', + 'ভালো', + 'তাজা', + 'ভাল', + 'চমৎকার', + 'দারুণ', + 'সুদর্শন', + 'গরম', + 'দয়াময়', + 'সুন্দর', + 'রহস্যময়', + 'পরিচ্ছন্ন', + 'সুন্দর', + 'রোগী', + 'সুন্দর', + 'ক্ষমতাশালী', + 'ধনী', + 'গোপন', + 'স্মার্ট', + 'কঠিন', + 'বিশেষ', + 'কৌশলগত', + 'শক্তিশালী', + 'পরিপাটি', + 'জ্ঞানী', + ]; + @override + List get fruits => [ + 'আপেল', + 'অ্যাভোকাডো', + 'কলা', + 'ব্ল্যাকবেরি', + 'ব্লুবেরি', + 'ব্রকলি', + 'গাজর', + 'চেরি', + 'নারকেল', + 'আঙ্গুর', + 'লেবু', + 'লেটুস', + 'আম', + 'তরমুজ', + 'মাশরুম', + 'পেঁয়াজ', + 'কমলা', + 'পেঁপে', + 'পীচ', + 'নাশপাতি', + 'আনারস', + 'আলু', + 'কুমড়া', + 'রাস্পবেরি', + 'স্ট্রবেরি', + 'টমেটো', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$bn extends Translations$dialogs$en { + _Translations$dialogs$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$bn addFile = _Translations$dialogs$addFile$bn._(_root); + @override + late final _Translations$dialogs$openFile$bn openFile = _Translations$dialogs$openFile$bn._(_root); + @override + late final _Translations$dialogs$addressInput$bn addressInput = _Translations$dialogs$addressInput$bn._(_root); + @override + late final _Translations$dialogs$cancelSession$bn cancelSession = _Translations$dialogs$cancelSession$bn._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$bn cannotOpenFile = _Translations$dialogs$cannotOpenFile$bn._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$bn encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$bn._(_root); + @override + late final _Translations$dialogs$errorDialog$bn errorDialog = _Translations$dialogs$errorDialog$bn._(_root); + @override + late final _Translations$dialogs$favoriteDialog$bn favoriteDialog = _Translations$dialogs$favoriteDialog$bn._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$bn favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$bn._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$bn favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$bn._(_root); + @override + late final _Translations$dialogs$fileInfo$bn fileInfo = _Translations$dialogs$fileInfo$bn._(_root); + @override + late final _Translations$dialogs$fileNameInput$bn fileNameInput = _Translations$dialogs$fileNameInput$bn._(_root); + @override + late final _Translations$dialogs$historyClearDialog$bn historyClearDialog = _Translations$dialogs$historyClearDialog$bn._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$bn localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$bn._(_root); + @override + late final _Translations$dialogs$messageInput$bn messageInput = _Translations$dialogs$messageInput$bn._(_root); + @override + late final _Translations$dialogs$noFiles$bn noFiles = _Translations$dialogs$noFiles$bn._(_root); + @override + late final _Translations$dialogs$noPermission$bn noPermission = _Translations$dialogs$noPermission$bn._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$bn notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$bn._(_root); + @override + late final _Translations$dialogs$qr$bn qr = _Translations$dialogs$qr$bn._(_root); + @override + late final _Translations$dialogs$quickActions$bn quickActions = _Translations$dialogs$quickActions$bn._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$bn quickSaveNotice = _Translations$dialogs$quickSaveNotice$bn._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$bn quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$bn._(_root); + @override + late final _Translations$dialogs$pin$bn pin = _Translations$dialogs$pin$bn._(_root); + @override + late final _Translations$dialogs$sendModeHelp$bn sendModeHelp = _Translations$dialogs$sendModeHelp$bn._(_root); + @override + late final _Translations$dialogs$zoom$bn zoom = _Translations$dialogs$zoom$bn._(_root); +} + +// Path: sanitization +class _Translations$sanitization$bn extends Translations$sanitization$en { + _Translations$sanitization$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get empty => 'ফাইলের নাম খালি রাখা যাবে না'; + @override + String get invalid => 'ফাইলের নামে ইনভেলিড অক্ষর রয়েছে'; +} + +// Path: tray +class _Translations$tray$bn extends Translations$tray$en { + _Translations$tray$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'LocalSend থেকে বের হোন'; + @override + String get closeWindows => 'সব উইন্ডো বন্ধ করুন'; +} + +// Path: web +class _Translations$web$bn extends Translations$web$en { + _Translations$web$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'পিন দিন'; + @override + String get invalidPin => 'পিনটি সঠিক নয়'; + @override + String get tooManyAttempts => 'অনেক বার ভুল পিন দেওয়া হয়েছে'; + @override + String get rejected => 'রিজেক্টেড'; + @override + String get files => 'ফাইলস'; + @override + String get fileName => 'ফাইলের নাম'; + @override + String get size => 'সাইজ'; +} + +// Path: assetPicker +class _Translations$assetPicker$bn extends Translations$assetPicker$en { + _Translations$assetPicker$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'কনফার্ম করুন'; + @override + String get cancel => 'ক্যানসেল করুন'; + @override + String get edit => 'এডিট করুন'; + @override + String get gifIndicator => 'জিফ'; + @override + String get loadFailed => 'লোড করা যায়নি'; + @override + String get original => 'অরিজিনাল'; + @override + String get preview => 'প্রিভিউ'; + @override + String get select => 'সিলেক্ট করুন'; + @override + String get emptyList => 'খালি লিস্ট'; + @override + String get unSupportedAssetType => 'আনসাপোর্টেড ফাইল টাইপ.'; + @override + String get unableToAccessAll => 'ডিভাইসে সমস্ত ফাইল অ্যাক্সেস পাওয়া যায়নি'; + @override + String get viewingLimitedAssetsTip => 'শুধুমাত্র অ্যাপে অ্যাক্সেসযোগ্য ফাইল এবং অ্যালবাম দেখুন.'; + @override + String get changeAccessibleLimitedAssets => 'অ্যাক্সেসযোগ্য ফাইল আপডেট করতে ট্যাপ করুন'; + @override + String get accessAllTip => + 'অ্যাপ শুধুমাত্র ডিভাইসে কিছু ফাইল অ্যাক্সেস করতে পারে। সিস্টেম সেটিংসে যান এবং অ্যাপটিকে ডিভাইসের সমস্ত মিডিয়া অ্যাক্সেস করার পারমিশন দিন।'; + @override + String get goToSystemSettings => 'সিস্টেম সেটিংসে যান'; + @override + String get accessLimitedAssets => 'সীমিত অ্যাক্সেস দিয়ে চালিয়ে যান'; + @override + String get accessiblePathName => 'অ্যাক্সেসযোগ্য ফাইল'; + @override + String get sTypeAudioLabel => 'অডিও'; + @override + String get sTypeImageLabel => 'ছবি'; + @override + String get sTypeVideoLabel => 'ভিডিও'; + @override + String get sTypeOtherLabel => 'অন্যান্য মিডিয়া'; + @override + String get sActionPlayHint => 'প্লে'; + @override + String get sActionPreviewHint => 'প্রিভিউ'; + @override + String get sActionSelectHint => 'নির্বাচন করুন'; + @override + String get sActionSwitchPathLabel => 'পাথ পরিবর্তন'; + @override + String get sActionUseCameraHint => 'ক্যামেরা ব্যবহার করুন'; + @override + String get sNameDurationLabel => 'ডিউরেশন'; + @override + String get sUnitAssetCountLabel => 'কাউন্ট'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$bn extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get ip => 'আইপি:'; + @override + String get port => 'পোর্ট:'; + @override + String get alias => 'ডিভাইসের নাম:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$bn extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'ফেভারিট'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$bn extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'সিলেকশন'; + @override + String files({required Object files}) => 'ফাইলসমূহ: ${files}'; + @override + String size({required Object size}) => 'সাইজ: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$bn extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get file => 'ফাইল'; + @override + String get folder => 'ফোল্ডার'; + @override + String get media => 'মিডিয়া'; + @override + String get text => 'টেক্সট'; + @override + String get app => 'আবেদন'; + @override + String get clipboard => 'ক্লিপবোর্ড পেস্ট'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$bn extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get single => 'একজন রিসিভার'; + @override + String get multiple => 'একাধিক রিসিভার'; + @override + String get link => 'লিঙ্কের মাধ্যমে শেয়ার করুন'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$bn extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'জেনারেল'; + @override + String get brightness => 'থিম'; + @override + late final _Translations$settingsTab$general$brightnessOptions$bn brightnessOptions = _Translations$settingsTab$general$brightnessOptions$bn._( + _root, + ); + @override + String get color => 'অ্যাপ কালার'; + @override + late final _Translations$settingsTab$general$colorOptions$bn colorOptions = _Translations$settingsTab$general$colorOptions$bn._(_root); + @override + String get language => 'ভাষা'; + @override + late final _Translations$settingsTab$general$languageOptions$bn languageOptions = _Translations$settingsTab$general$languageOptions$bn._(_root); + @override + String get saveWindowPlacement => 'বের হোন: উইন্ডো প্লেসমেন্ট সেভ করুন'; + @override + String get saveWindowPlacementWindows => 'বের হবার পরে উইন্ডোর অবস্থান সেভ করুন'; + @override + String get minimizeToTray => 'বের হোন: ট্রেতে মিনিমাইজ করুন'; + @override + String get launchAtStartup => 'লগইন করার পরে অটোস্টার্ট করুন'; + @override + String get launchMinimized => 'অটোস্টার্ট: হিডেন রেখে শুরু করুন'; + @override + String get showInContextMenu => 'কনটেক্সট মেনুতে LocalSend দেখান'; + @override + String get animations => 'অ্যানিমেশন'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$bn extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'রিসিভ'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'অটো ফিনিশ'; + @override + String get destination => 'ডেস্টিনেশন'; + @override + String get downloads => '(Downloads)'; + @override + String get saveToGallery => 'মিডিয়া গ্যালারিতে সেভ করুন'; + @override + String get saveToHistory => 'হিস্ট্রি সেভ করুন'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$bn extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'সেন্ড'; + @override + String get shareViaLinkAutoAccept => '"Share via link" মোডের রিকুয়েস্ট অটো এক্সেপ্ট করুন'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$bn extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'নেটওয়ার্ক'; + @override + String get needRestart => 'সেটিংস অ্যাপ্লাই করতে সার্ভার রিস্টার্ট করুন!'; + @override + String get server => 'সার্ভার'; + @override + String get alias => 'ডিভাইসের নাম'; + @override + String get deviceType => 'ডিভাইসের ধরন'; + @override + String get deviceModel => 'ডিভাইস মডেল'; + @override + String get port => 'পোর্ট'; + @override + String get network => 'নেটওয়ার্ক'; + @override + late final _Translations$settingsTab$network$networkOptions$bn networkOptions = _Translations$settingsTab$network$networkOptions$bn._(_root); + @override + String get discoveryTimeout => 'ডিসকভারি টাইমআউট'; + @override + String get useSystemName => 'সিস্টেমের নাম ব্যবহার করুন'; + @override + String get generateRandomAlias => 'এলিয়াস তৈরি করুন'; + @override + String portWarning({required Object defaultPort}) => + 'আপনি একটি কাস্টম পোর্ট ব্যবহার করছেন, তাই অন্য ডিভাইস থেকে এই ডিভাইসকে খুঁজে নাও পাওয়া যেতে পারে। (default: ${defaultPort})'; + @override + String get encryption => 'এনক্রিপশন'; + @override + String get multicastGroup => 'মাল্টিকাস্ট'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'আপনি একটি কাস্টম মাল্টিকাস্ট অ্যাড্রেস ব্যবহার করছেন যেই কারণে আপনি অন্য ডিভাইস দ্বারা স্ক্যান নাও হতে পারেন। (default: ${defaultMulticast})'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$bn extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'অন্যান্য'; + @override + String get support => 'লোকাল সেন্ডকে সাপোর্ট করুন'; + @override + String get donate => 'ডোনেট'; + @override + String get privacyPolicy => 'গোপনীয়তা নীতি'; + @override + String get termsOfUse => 'ব্যবহারের শর্তাবলী'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$bn extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'এই অ্যাপটি অন্য ডিভাইসে ফাইল পাঠাতে পারে কিন্তু অন্য ডিভাইস এই ডিভাইসে ফাইল পাঠাতে পারে না।'; + @override + String solution({required Object port}) => + 'এটি সম্ভবত একটি ফায়ারওয়াল সমস্যা। আপনি পোর্টে ইনকামিং কানেকশন (UDP এবং TCP) পারমিশন দিয়ে এটি ঠিক করতে পারেন ${port}.'; + @override + String get openFirewall => 'ফায়ারওয়াল খুলুন'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$bn extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'এই ডিভাইসটি অন্য ডিভাইস খুঁজতে পারতেছে না।'; + @override + String get solution => + 'সব ডিভাইস একই ওয়াই-ফাই নেটওয়ার্কে আছে তা নিশ্চিত করুন এবং একই কনফিগারেশন ব্যাবহার করছে (পোর্ট, মাল্টিকাস্ট অ্যাড্রেস, এনক্রিপশন)। টার্গেট ডিভাইসের আইপি ম্যানুয়ালি টাইপ করতে পারেন। যদি এটা কাজ করে, তাহলে ভবিষ্যতে এই ডিভাইসটি অটোমেটিকালি ডিসকভার করা হবে, তা নিশ্চিত করতে এই ডিভাইসটি ফেভারিটে অ্যাড করুন।'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$bn extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'উভয় ডিভাইস একে অপরকে আবিষ্কার করতে পারে না বা তারা ফাইল ভাগ করতে পারে না।'; + @override + String get solution => + 'সমস্যা কি দুই দিকেই আছে? তারপরে আপনাকে নিশ্চিত করতে হবে যে উভয় ডিভাইস একই ওয়াইফাই নেটওয়ার্কে রয়েছে এবং একই কনফিগারেশন (পোর্ট, মাল্টিকাস্ট ঠিকানা, এনক্রিপশন) ভাগ করে নিয়েছে। ওয়াইফাই অংশগ্রহণকারীদের মধ্যে যোগাযোগের অনুমতি নাও দিতে পারে। এই ক্ষেত্রে, এই বিকল্পটি রাউটারে সক্রিয় করা আবশ্যক।'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$bn extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get open => 'ফাইল খুলুন'; + @override + String get showInFolder => 'ফোল্ডারে দেখুন'; + @override + String get info => 'ইনফো'; + @override + String get deleteFromHistory => 'হিস্ট্রি থেকে মুছে ফেলুন'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$bn extends Translations$progressPage$total$en { + _Translations$progressPage$total$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$bn title = _Translations$progressPage$total$title$bn._(_root); + @override + String count({required Object curr, required Object n}) => 'ফাইলগুলি: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'সাইজ: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'স্পীড: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$bn extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + + /// ঘন্টার জন্য 'h' এবং মিনিটের জন্য 'm' ব্যবহার করুন + @override + String hours({required Object h, required Object m}) => '${h}ঘণ্টা ${m}মিনিট'; + + /// দিনের জন্য 'd', ঘন্টার জন্য 'h' এবং মিনিটের জন্য 'm' ব্যবহার করুন + @override + String days({required Object d, required Object h, required Object m}) => '${d}দিন ${h}ঘণ্টা ${m}মিনিট'; + + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$bn extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'সিলেকশনে অ্যাড করুন'; + @override + String get content => 'আপনি কি অ্যাড করতে চান?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$bn extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'ফাইল খুলুন'; + @override + String get content => 'আপনি কি ফাইলটি খুলতে চান?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$bn extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'এড্রেস লিখুন'; + @override + String get hashtag => 'হ্যাশট্যাগ'; + @override + String get ip => 'আইপি অ্যাড্রেস'; + @override + String get recentlyUsed => 'সম্প্রতি ব্যবহৃত: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$bn extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'ফাইল ট্রান্সফার ক্যানসেল করুন'; + @override + String get content => 'আপনি কি ফাইল ট্রান্সফার ক্যানসেল করতে চান?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$bn extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'ফাইলটি খোলা যাচ্ছে না'; + @override + String content({required Object file}) => '"${file}" খোলা যায়নি। এই ফাইলটি কি সরানো হয়েছে, নাম পরিবর্তন বা মুছে ফেলা হয়েছে?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$bn extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'এনক্রিপশন বন্ধ করা হয়েছে'; + @override + String get content => 'এখন কমিউনিকেশন আনএনক্রিপ্টেড HTTP প্রটোকলের মাধ্যমে করা হচ্ছে। HTTPS ব্যবহার করার জন্য আবার এনক্রিপশন চালু করুন।'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$bn extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$bn extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'ফেভারিট'; + @override + String get noFavorites => 'এখনও কোন ফেভারিট ডিভাইস নেই.'; + @override + String get addFavorite => 'যোগ করুন'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$bn extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'যোগ করুনযোগ করুন'; + @override + String content({required Object name}) => 'আপনি কি সত্যিই ফেভারিট থেকে মুছে ফেলতে চান "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$bn extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'ফেভারিটে অ্যাড করুন'; + @override + String get titleEdit => 'এডিট করুন'; + @override + String get name => 'এলিয়াস'; + @override + String get auto => '(auto)'; + @override + String get ip => 'আইপি অ্যাড্রেস'; + @override + String get port => 'পোর্ট'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$bn extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'ফাইল ইনফো'; + @override + String get fileName => 'ফাইলের নাম:'; + @override + String get path => 'পাথ:'; + @override + String get size => 'সাইজ:'; + @override + String get sender => 'সেন্ডার:'; + @override + String get time => 'সময়:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$bn extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'ফাইলের নাম লিখুন'; + @override + String original({required Object original}) => 'অরিজিনাল: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$bn extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'হিস্ট্রি ক্লিয়ার করুন'; + @override + String get content => 'আপনি কি সব হিস্ট্রি ক্লিয়ার চান?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$bn extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => 'লোকাল নেটওয়ার্ক স্ক্যান করার পারমিশন ছাড়া LocalSend অন্য ডিভাইস খুঁজে পায় না। অনুগ্রহ করে সেটিংসে এই পারমিশনটি দিন।'; + @override + String get gotoSettings => 'সেটিংস'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$bn extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'মেসেজ লিখুন'; + @override + String get multiline => 'মাল্টিলাইন'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$bn extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'কোনো ফাইল সিলেক্ট করা হয়নি'; + @override + String get content => 'অন্তত একটি ফাইল সিলেক্ট করুন।'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$bn extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'পারমিশন নেই'; + @override + String get content => 'আপনি প্রয়োজনীয় পারমিশন প্রদান করেননি। অনুগ্রহ করে সেটিংসে তাদের পারমিশন দিন।'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$bn extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'পাওয়া যায় নি'; + @override + String get content => 'এই ফিচার শুধুমাত্র উপলব্ধ:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$bn extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR কোড'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$bn extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'কুইক অ্যাকশনস'; + @override + String get counter => 'কাউন্টার'; + @override + String get prefix => 'উপসর্গ'; + @override + String get padZero => 'শূন্য সহ প্যাড'; + @override + String get sortBeforeCount => 'আগে থেকে বর্ণানুক্রমিকভাবে সাজান'; + @override + String get random => 'র‍্যান্ডম'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$bn extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'ফাইল অনুরোধ অটোমেটিকালি এক্সেপ্ট করা হয়। সচেতন থাকুন যেনা লোকাল নেটওয়ার্কের সবাই আপনাকে ফাইল পাঠাতে পারে।'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$bn extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'আপনার ফেভারিট তালিকায় থাকা ডিভাইস থেকে ফাইল অটোমেটিক রিসিভ করা হয়।', + 'সতর্কতা! বর্তমানে, এটা সম্পূর্ণভাবে নিরাপদ নয়, কোন হ্যাকারের কাছে আপনার ফেভারিট তালিকার কোনও ডিভাইসের ফিঙ্গারপ্রিন্ট থাকে তাহলে সে সীমাবদ্ধতা ছাড়াই আপনাকে ফাইল পাঠাতে পারে।', + 'তবে, এই অপশনটি এখনও লোকাল নেটওয়ার্কের ব্যবহারকারীদের কোনও সীমাবদ্ধতা ছাড়াই আপনাকে ফাইল পাঠাতে দেয়।', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$bn extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'পিন দিন'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$bn extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'সেন্ড মোড'; + @override + String get single => 'একজন প্রাপকের কাছে ফাইল পাঠায়। ফাইল স্থানান্তর সমাপ্ত হওয়ার পরে নির্বাচন পরিষ্কার করা হবে.'; + @override + String get multiple => 'একাধিক প্রাপককে ফাইল পাঠায়। নির্বাচন সাফ করা হবে না।'; + @override + String get link => 'যাদের LocalSend ইনস্টল করা নেই তারা ব্রাউজারে লিঙ্কটি খুলে ফাইলগুলি ডাউনলোড করতে পারবেন।'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$bn extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$bn extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get system => 'সিস্টেম'; + @override + String get dark => 'ডার্ক'; + @override + String get light => 'লাইট'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$bn extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get system => 'সিস্টেম'; + @override + String get oled => 'ওলেড'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$bn extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get system => 'সিস্টেম'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$bn extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String get all => 'সব'; + @override + String get filtered => 'ফিল্টারড'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$bn extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$bn._(TranslationsBn root) : this._root = root, super.internal(root); + + final TranslationsBn _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'মোট অগ্রগতি (${time})'; + @override + String get finishedError => 'ত্রুটি সহ সমাপ্ত হয়েছে'; + @override + String get canceledSender => 'সেন্ডারের দ্বারা ক্যানসেল করা হয়েছে'; + @override + String get canceledReceiver => 'রিসিভার দ্বারা ক্যানসেল করা হয়েছে'; +} diff --git a/app/lib/gen/strings_ca.g.dart b/app/lib/gen/strings_ca.g.dart new file mode 100644 index 0000000..aa44cb9 --- /dev/null +++ b/app/lib/gen/strings_ca.g.dart @@ -0,0 +1,1500 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsCa extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsCa({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ca, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsCa _root = this; // ignore: unused_field + + @override + TranslationsCa $copyWith({TranslationMetadata? meta}) => TranslationsCa(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Català'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$ca general = _Translations$general$ca._(_root); + @override + late final _Translations$receiveTab$ca receiveTab = _Translations$receiveTab$ca._(_root); + @override + late final _Translations$sendTab$ca sendTab = _Translations$sendTab$ca._(_root); + @override + late final _Translations$settingsTab$ca settingsTab = _Translations$settingsTab$ca._(_root); + @override + late final _Translations$troubleshootPage$ca troubleshootPage = _Translations$troubleshootPage$ca._(_root); + @override + late final _Translations$receiveHistoryPage$ca receiveHistoryPage = _Translations$receiveHistoryPage$ca._(_root); + @override + late final _Translations$apkPickerPage$ca apkPickerPage = _Translations$apkPickerPage$ca._(_root); + @override + late final _Translations$selectedFilesPage$ca selectedFilesPage = _Translations$selectedFilesPage$ca._(_root); + @override + late final _Translations$receivePage$ca receivePage = _Translations$receivePage$ca._(_root); + @override + late final _Translations$receiveOptionsPage$ca receiveOptionsPage = _Translations$receiveOptionsPage$ca._(_root); + @override + late final _Translations$sendPage$ca sendPage = _Translations$sendPage$ca._(_root); + @override + late final _Translations$progressPage$ca progressPage = _Translations$progressPage$ca._(_root); + @override + late final _Translations$webSharePage$ca webSharePage = _Translations$webSharePage$ca._(_root); + @override + late final _Translations$aboutPage$ca aboutPage = _Translations$aboutPage$ca._(_root); + @override + late final _Translations$donationPage$ca donationPage = _Translations$donationPage$ca._(_root); + @override + late final _Translations$changelogPage$ca changelogPage = _Translations$changelogPage$ca._(_root); + @override + late final _Translations$aliasGenerator$ca aliasGenerator = _Translations$aliasGenerator$ca._(_root); + @override + late final _Translations$dialogs$ca dialogs = _Translations$dialogs$ca._(_root); + @override + late final _Translations$sanitization$ca sanitization = _Translations$sanitization$ca._(_root); + @override + late final _Translations$tray$ca tray = _Translations$tray$ca._(_root); + @override + late final _Translations$web$ca web = _Translations$web$ca._(_root); + @override + late final _Translations$assetPicker$ca assetPicker = _Translations$assetPicker$ca._(_root); + @override + late final _Translations$networkInterfacesPage$ca networkInterfacesPage = _Translations$networkInterfacesPage$ca._(_root); +} + +// Path: general +class _Translations$general$ca extends Translations$general$en { + _Translations$general$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Accepta'; + @override + String get accepted => 'Acceptat'; + @override + String get add => 'Afegeix'; + @override + String get advanced => 'Avançades'; + @override + String get cancel => 'Cancel·la'; + @override + String get close => 'Tanca'; + @override + String get confirm => 'Confirma'; + @override + String get continueStr => 'Continua'; + @override + String get copy => 'Copia'; + @override + String get copiedToClipboard => 'S\'ha copiat al porta-retalls'; + @override + String get decline => 'Rebutja'; + @override + String get done => 'Fet'; + @override + String get delete => 'Elimina'; + @override + String get edit => 'Edita'; + @override + String get error => 'Error'; + @override + String get example => 'Exemple'; + @override + String get files => 'Fitxers'; + @override + String get finished => 'Finalitzat'; + @override + String get hide => 'Amaga'; + @override + String get off => 'Desactivat'; + @override + String get offline => 'Desconnectat'; + @override + String get on => 'Activat'; + @override + String get online => 'En línia'; + @override + String get open => 'Obre'; + @override + String get queue => 'Cua'; + @override + String get quickSave => 'Desat ràpid'; + @override + String get quickSaveFromFavorites => 'Desat ràpid per als «Preferits»'; + @override + String get renamed => 'Canvia el nom'; + @override + String get reset => 'Desfés els canvis'; + @override + String get restart => 'Reinicia'; + @override + String get settings => 'Configuració'; + @override + String get skipped => 'Omès'; + @override + String get start => 'Inicia'; + @override + String get stop => 'Atura'; + @override + String get save => 'Desa'; + @override + String get unchanged => 'Sense canvis'; + @override + String get unknown => 'Desconegut'; + @override + String get noItemInClipboard => 'No hi ha elements al porta-retalls.'; +} + +// Path: receiveTab +class _Translations$receiveTab$ca extends Translations$receiveTab$en { + _Translations$receiveTab$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Recepció'; + @override + late final _Translations$receiveTab$infoBox$ca infoBox = _Translations$receiveTab$infoBox$ca._(_root); + @override + late final _Translations$receiveTab$quickSave$ca quickSave = _Translations$receiveTab$quickSave$ca._(_root); +} + +// Path: sendTab +class _Translations$sendTab$ca extends Translations$sendTab$en { + _Translations$sendTab$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Envia'; + @override + late final _Translations$sendTab$selection$ca selection = _Translations$sendTab$selection$ca._(_root); + @override + late final _Translations$sendTab$picker$ca picker = _Translations$sendTab$picker$ca._(_root); + @override + String get shareIntentInfo => + 'També podeu utilitzar l\'opció «Comparteix» del vostre dispositiu mòbil per a seleccionar fitxers d\'una manera més fàcil.'; + @override + String get nearbyDevices => 'Dispositius propers'; + @override + String get thisDevice => 'Aquest dispositiu'; + @override + String get scan => 'Cerca dispositius'; + @override + String get manualSending => 'Enviament manual'; + @override + String get sendMode => 'Mode d\'enviament'; + @override + late final _Translations$sendTab$sendModes$ca sendModes = _Translations$sendTab$sendModes$ca._(_root); + @override + String get sendModeHelp => 'Explicació'; + @override + String get help => 'Comproveu que el destinatari està en la mateixa xarxa Wi-Fi.'; + @override + String get placeItems => 'Col·loqueu els elements per compartir.'; +} + +// Path: settingsTab +class _Translations$settingsTab$ca extends Translations$settingsTab$en { + _Translations$settingsTab$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Configuració'; + @override + late final _Translations$settingsTab$general$ca general = _Translations$settingsTab$general$ca._(_root); + @override + late final _Translations$settingsTab$receive$ca receive = _Translations$settingsTab$receive$ca._(_root); + @override + late final _Translations$settingsTab$send$ca send = _Translations$settingsTab$send$ca._(_root); + @override + late final _Translations$settingsTab$network$ca network = _Translations$settingsTab$network$ca._(_root); + @override + late final _Translations$settingsTab$other$ca other = _Translations$settingsTab$other$ca._(_root); + @override + String get advancedSettings => 'Configuració avançada'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$ca extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Solució de problemes'; + @override + String get subTitle => 'L\'aplicació no funciona com s\'espera? Aquí podeu trobar solucions als problemes més comuns.'; + @override + String get solution => 'Solució:'; + @override + String get fixButton => 'Corregeix de manera automàtica'; + @override + late final _Translations$troubleshootPage$firewall$ca firewall = _Translations$troubleshootPage$firewall$ca._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$ca noDiscovery = _Translations$troubleshootPage$noDiscovery$ca._(_root); + @override + late final _Translations$troubleshootPage$noConnection$ca noConnection = _Translations$troubleshootPage$noConnection$ca._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$ca extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Historial'; + @override + String get openFolder => 'Obre la carpeta'; + @override + String get deleteHistory => 'Elimina l\'historial'; + @override + String get empty => 'L\'historial està buit.'; + @override + late final _Translations$receiveHistoryPage$entryActions$ca entryActions = _Translations$receiveHistoryPage$entryActions$ca._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$ca extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplicacions (APK)'; + @override + String get excludeSystemApps => 'Exclou les aplicacions del sistema'; + @override + String get excludeAppsWithoutLaunchIntent => 'Exclou les aplicacions no executables'; + @override + String apps({required Object n}) => '${n} Aplicacions'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$ca extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Elimina-ho tot'; +} + +// Path: receivePage +class _Translations$receivePage$ca extends Translations$receivePage$en { + _Translations$receivePage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ca'))( + n, + one: 'vol enviar-vos un fitxer', + other: 'vol enviar-vos ${n} fitxers', + ); + @override + String get subTitleMessage => 'us ha enviat un missatge:'; + @override + String get subTitleLink => 'us ha enviat un enllaç:'; + @override + String get canceled => 'El remitent ha cancel·lat la petició.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$ca extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Opcions'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(Carpeta LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'S\'ha desactivat automàticament perquè hi ha carpetes.'; +} + +// Path: sendPage +class _Translations$sendPage$ca extends Translations$sendPage$en { + _Translations$sendPage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'S\'està esperant una resposta…'; + @override + String get rejected => 'El destinatari ha rebutjat la petició.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'El destinatari està ocupat amb una altra petició.'; +} + +// Path: progressPage +class _Translations$progressPage$ca extends Translations$progressPage$en { + _Translations$progressPage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'S\'estan enviant els fitxers'; + @override + String get titleReceiving => 'S\'estan rebent els fitxers'; + @override + String get savedToGallery => 'Desat a Fotos'; + @override + late final _Translations$progressPage$total$ca total = _Translations$progressPage$total$ca._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$ca extends Translations$webSharePage$en { + _Translations$webSharePage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Comparteix via enllaç'; + @override + String get loading => 'S\'està iniciant el servidor…'; + @override + String get stopping => 'S\'està aturant el servidor…'; + @override + String get error => 'Hi ha hagut un error en iniciar el servidor.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ca'))( + n, + one: 'Obre l\'enllaç al navegador:', + other: 'Obre un d\'aquests enllaços al navegador:', + ); + @override + String get requests => 'Peticions'; + @override + String get noRequests => 'Encara no hi ha peticions.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Accepta les peticions automàticament'; + @override + String get requirePin => 'Demana un PIN'; + @override + String pinHint({required Object pin}) => 'El PIN és «${pin}»'; + @override + String get encryptionHint => 'El LocalSend utilitza un certificat auto-signat. Cal que l\'accepteu al navegador.'; + @override + String pendingRequests({required Object n}) => 'Peticions pendents: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$ca extends Translations$aboutPage$en { + _Translations$aboutPage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Quant al LocalSend'; + @override + List get description => [ + 'El LocalSend és una aplicació gratuïta i de codi obert que us permet compartir fitxers i missatges de manera segura amb dispositius propers a la vostra xarxa local sense necessitat de connexió a Internet.', + 'Aquesta aplicació està disponible per a Android, iOS, macOS, Windows i Linux. Podeu trobar totes les opcions de baixada a la pàgina d\'inici oficial.', + ]; + @override + String get author => 'Autor'; + @override + String get contributors => 'Col·laboradors'; + @override + String get packagers => 'Empaquetadors'; + @override + String get translators => 'Traductors'; +} + +// Path: donationPage +class _Translations$donationPage$ca extends Translations$donationPage$en { + _Translations$donationPage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Donació'; + @override + String get info => + 'El LocalSend és gratuït, de codi obert i sense anuncis. Si us agrada l\'aplicació, podeu donar suport al desenvolupament amb una donació.'; + @override + String donate({required Object amount}) => 'Donació: ${amount}'; + @override + String get thanks => 'Moltes gràcies!'; + @override + String get restore => 'Restaura la compra'; +} + +// Path: changelogPage +class _Translations$changelogPage$ca extends Translations$changelogPage$en { + _Translations$changelogPage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Registre de canvis'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$ca extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Adorable', + 'Bonic', + 'Gran', + 'Brillant', + 'Neteja', + 'Intel·ligent', + 'Guai', + 'Bonic', + 'Astúcia', + 'Determinat', + 'Energètic', + 'Eficient', + 'Fantàstic', + 'Ràpid', + 'Bé', + 'Fresca', + 'Bo', + 'Preciós', + 'Genial', + 'Guapo', + 'Calent', + 'Amable', + 'Encantador', + 'Místic', + 'Producte', + 'Bonic', + 'Pacient', + 'Bonic', + 'Potent', + 'Ric', + 'Secret', + 'Intel·ligent', + 'Sòlid', + 'Especial', + 'Estratègic', + 'Fort', + 'Endreçat', + 'Savi', + ]; + @override + List get fruits => [ + 'Poma', + 'Alvocat', + 'Plàtan', + 'Blackberry', + 'Nabiu', + 'Bròquil', + 'Pastanaga', + 'Cirera', + 'Coco', + 'Raïm', + 'Llimona', + 'Enciam', + 'Mango', + 'Meló', + 'Bolet', + 'Ceba', + 'Taronja', + 'Papaia', + 'Préssec', + 'Pera', + 'Pinya', + 'Patata', + 'Carbassa', + 'Gerd', + 'Maduixa', + 'Tomàquet', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object fruit, required Object adjective}) => '${fruit} ${adjective}'; +} + +// Path: dialogs +class _Translations$dialogs$ca extends Translations$dialogs$en { + _Translations$dialogs$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$ca addFile = _Translations$dialogs$addFile$ca._(_root); + @override + late final _Translations$dialogs$addressInput$ca addressInput = _Translations$dialogs$addressInput$ca._(_root); + @override + late final _Translations$dialogs$cancelSession$ca cancelSession = _Translations$dialogs$cancelSession$ca._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$ca cannotOpenFile = _Translations$dialogs$cannotOpenFile$ca._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$ca encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$ca._(_root); + @override + late final _Translations$dialogs$errorDialog$ca errorDialog = _Translations$dialogs$errorDialog$ca._(_root); + @override + late final _Translations$dialogs$favoriteDialog$ca favoriteDialog = _Translations$dialogs$favoriteDialog$ca._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$ca favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$ca._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$ca favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$ca._(_root); + @override + late final _Translations$dialogs$fileInfo$ca fileInfo = _Translations$dialogs$fileInfo$ca._(_root); + @override + late final _Translations$dialogs$fileNameInput$ca fileNameInput = _Translations$dialogs$fileNameInput$ca._(_root); + @override + late final _Translations$dialogs$historyClearDialog$ca historyClearDialog = _Translations$dialogs$historyClearDialog$ca._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$ca localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$ca._(_root); + @override + late final _Translations$dialogs$messageInput$ca messageInput = _Translations$dialogs$messageInput$ca._(_root); + @override + late final _Translations$dialogs$noFiles$ca noFiles = _Translations$dialogs$noFiles$ca._(_root); + @override + late final _Translations$dialogs$noPermission$ca noPermission = _Translations$dialogs$noPermission$ca._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$ca notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$ca._(_root); + @override + late final _Translations$dialogs$qr$ca qr = _Translations$dialogs$qr$ca._(_root); + @override + late final _Translations$dialogs$quickActions$ca quickActions = _Translations$dialogs$quickActions$ca._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$ca quickSaveNotice = _Translations$dialogs$quickSaveNotice$ca._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$ca quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$ca._(_root); + @override + late final _Translations$dialogs$pin$ca pin = _Translations$dialogs$pin$ca._(_root); + @override + late final _Translations$dialogs$sendModeHelp$ca sendModeHelp = _Translations$dialogs$sendModeHelp$ca._(_root); + @override + late final _Translations$dialogs$zoom$ca zoom = _Translations$dialogs$zoom$ca._(_root); + @override + late final _Translations$dialogs$openFile$ca openFile = _Translations$dialogs$openFile$ca._(_root); +} + +// Path: sanitization +class _Translations$sanitization$ca extends Translations$sanitization$en { + _Translations$sanitization$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get empty => 'El nom del fitxer no pot estar buit'; + @override + String get invalid => 'El nom del fitxer conté caràcters no vàlids'; +} + +// Path: tray +class _Translations$tray$ca extends Translations$tray$en { + _Translations$tray$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Surt del LocalSend'; + @override + String get closeWindows => 'Surt'; +} + +// Path: web +class _Translations$web$ca extends Translations$web$en { + _Translations$web$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Introduïu el PIN'; + @override + String get invalidPin => 'PIN no vàlid'; + @override + String get tooManyAttempts => 'Massa intents'; + @override + String get rejected => 'Rebutjat'; + @override + String get files => 'Fitxers'; + @override + String get fileName => 'Nom del fitxer'; + @override + String get size => 'Mida'; +} + +// Path: assetPicker +class _Translations$assetPicker$ca extends Translations$assetPicker$en { + _Translations$assetPicker$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Confirma'; + @override + String get cancel => 'Cancel·la'; + @override + String get edit => 'Edita'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Càrrega fallida'; + @override + String get original => 'Origen'; + @override + String get preview => 'Previsualitza'; + @override + String get select => 'Seleccioneu'; + @override + String get emptyList => 'Llista buida'; + @override + String get unSupportedAssetType => 'Tipus de fitxer no compatible.'; + @override + String get unableToAccessAll => 'No es pot accedir a tots els fitxers del dispositiu'; + @override + String get viewingLimitedAssetsTip => 'Visualitza només fitxers i àlbums accessibles per l\'aplicació.'; + @override + String get changeAccessibleLimitedAssets => 'Feu clic per a actualitzar els fitxers accessibles'; + @override + String get accessAllTip => + 'L\'aplicació només pot accedir a alguns fitxers del dispositiu. Aneu a la configuració del sistema i permeteu que l\'aplicació accedeixi a tots els mitjans del dispositiu.'; + @override + String get goToSystemSettings => 'Vés a la configuració del sistema'; + @override + String get accessLimitedAssets => 'Continua amb accés limitat'; + @override + String get accessiblePathName => 'Fitxers accessibles'; + @override + String get sTypeAudioLabel => 'Àudio'; + @override + String get sTypeImageLabel => 'Imatge'; + @override + String get sTypeVideoLabel => 'Vídeo'; + @override + String get sTypeOtherLabel => 'Altres fitxers'; + @override + String get sActionPlayHint => 'reprodueix'; + @override + String get sActionPreviewHint => 'previsualitza'; + @override + String get sActionSelectHint => 'selecccioneu'; + @override + String get sActionSwitchPathLabel => 'canvia la ruta'; + @override + String get sActionUseCameraHint => 'utilitza la càmera'; + @override + String get sNameDurationLabel => 'duració'; + @override + String get sUnitAssetCountLabel => 'compte'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$ca extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Interfícies de xarxa'; + @override + String get info => + 'De manera predefinida, el LocalSend utilitza totes les interfícies de xarxa disponibles. Podeu excloure les xarxes no desitjades aquí. Cal que reinicieu el servidor per a aplicar els canvis.'; + @override + String get preview => 'Previsualitza'; + @override + String get blacklist => 'Llista de denegades'; + @override + String get whitelist => 'Llista de permeses'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$ca extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Nom del dispositiu:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$ca extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Preferits'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$ca extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Selecció'; + @override + String files({required Object files}) => 'Fitxers: ${files}'; + @override + String size({required Object size}) => 'Mida: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$ca extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get file => 'Fitxer'; + @override + String get folder => 'Carpeta'; + @override + String get media => 'Multimèdia'; + @override + String get text => 'Text'; + @override + String get app => 'Aplicació'; + @override + String get clipboard => 'Enganxa'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$ca extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get single => 'Destinatari únic'; + @override + String get multiple => 'Múltiples destinataris'; + @override + String get link => 'Comparteix via enllaç'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$ca extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'General'; + @override + String get brightness => 'Tema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$ca brightnessOptions = _Translations$settingsTab$general$brightnessOptions$ca._( + _root, + ); + @override + String get color => 'Color'; + @override + late final _Translations$settingsTab$general$colorOptions$ca colorOptions = _Translations$settingsTab$general$colorOptions$ca._(_root); + @override + String get language => 'Llengua'; + @override + late final _Translations$settingsTab$general$languageOptions$ca languageOptions = _Translations$settingsTab$general$languageOptions$ca._(_root); + @override + String get saveWindowPlacement => 'Desa la posició de la finestra en sortir'; + @override + String get saveWindowPlacementWindows => 'Desa la posició de la finestra després de sortir'; + @override + String get minimizeToTray => 'Minimitza a la safata del sistema/barra de menú en tancar'; + @override + String get launchAtStartup => 'Inici automàtic en iniciar la sessió'; + @override + String get launchMinimized => 'Inici automàtic: Inici minimitzat'; + @override + String get showInContextMenu => 'Mostra el LocalSend al menú contextual'; + @override + String get animations => 'Animacions'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$ca extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Recepció'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Finalització automàtica'; + @override + String get destination => 'Desa en la carpeta'; + @override + String get downloads => '(Baixades)'; + @override + String get saveToGallery => 'Desa els fitxers multimèdia a la galeria'; + @override + String get saveToHistory => 'Desa a l\'historial'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$ca extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Enviament'; + @override + String get shareViaLinkAutoAccept => 'Accepta peticions de manera automàtica en el mode «Comparteix via enllaç»'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$ca extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Xarxa'; + @override + String get needRestart => 'Reinicieu el servidor per a aplicar la configuració.'; + @override + String get server => 'Servidor'; + @override + String get alias => 'Nom del dispositiu'; + @override + String get deviceType => 'Tipus de dispositiu'; + @override + String get deviceModel => 'Model del dispositiu'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Temps d\'espera de descobriment'; + @override + String get useSystemName => 'Utilitza el nom del sistema'; + @override + String get generateRandomAlias => 'Genera un àlies aleatori'; + @override + String portWarning({required Object defaultPort}) => + 'Altres dispositius podrien no detectar-vos perquè utilitzeu un port personalitzat. (predefinit: ${defaultPort})'; + @override + String get encryption => 'Xifratge'; + @override + String get multicastGroup => 'Adreça del Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Altres dispositius podrien no detectar-vos perquè utilitzeu una adreça multicast personalitzada. (predefinida: ${defaultMulticast})'; + @override + String get network => 'Xarxa'; + @override + late final _Translations$settingsTab$network$networkOptions$ca networkOptions = _Translations$settingsTab$network$networkOptions$ca._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$ca extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Altres'; + @override + String get support => 'Doneu suport al LocalSend'; + @override + String get donate => 'Donació'; + @override + String get privacyPolicy => 'Política de privadesa'; + @override + String get termsOfUse => 'Condicions d\'ús'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$ca extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Aquest dispositiu pot enviar fitxers a d\'altres, però altres dispositius no poden enviar fitxers a aquest.'; + @override + String solution({required Object port}) => + 'El més probable és que sigui un problema del tallafocs. Podeu solucionar-ho permetent les connexiions entrants (UDP i TCP) al port ${port}.'; + @override + String get openFirewall => 'Obre el tallafocs'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$ca extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Aquest dispositiu no pot descobrir altres dispositius.'; + @override + String get solution => + 'Comproveu que tots els dispositius estan a la mateixa xarxa Wi-Fi i tenen la mateixa configuració (port, adreça multicast i xifratge). Podeu provar d\'escriure l\'adreça IP del dispositiu de destí de manera manual. Si això funciona, considereu afegir aquest dispositiu als preferits perquè pugui ser descobert automàticament en un futur.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$ca extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Cap dels dos dispositius no poden trobar-se ni compartir fitxers.'; + @override + String get solution => + 'Existeix el problema als dos costats? Si és així, cal que comproveu que els dispositius estan a la mateixa xarxa Wi-Fi i comparteixen la mateixa configuració (port, adreça multicast i xifratge). La Wi-Fi podria no permetre la comunicació entre els participants a causa de l\'aïllament del punt d\'accés (Access Point, AP). En aquest cas, cal que desactiveu aquesta opció a l\'encaminador.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$ca extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get open => 'Obre el fitxer'; + @override + String get showInFolder => 'Mostra a la carpeta'; + @override + String get info => 'Informació'; + @override + String get deleteFromHistory => 'Elimina de l\'historial'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$ca extends Translations$progressPage$total$en { + _Translations$progressPage$total$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$ca title = _Translations$progressPage$total$title$ca._(_root); + @override + String count({required Object curr, required Object n}) => 'Fitxers: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Mida: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Velocitat: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$ca extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Afegeix-ho a la selecció'; + @override + String get content => 'Què voleu afegir?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$ca extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Introduïu l\'adreça'; + @override + String get hashtag => 'Etiqueta'; + @override + String get ip => 'Adreça IP'; + @override + String get recentlyUsed => 'Utilitzades recentment: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$ca extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Cancel·la la transferència de fitxers'; + @override + String get content => 'Segur que voleu cancel·lar la transferència dels fitxers?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$ca extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'No es pot obrir el fitxer'; + @override + String content({required Object file}) => 'No s\'ha pogut obrir «${file}». S\'ha mogut, reanomenat o eliminat?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$ca extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Xifratge desactivat'; + @override + String get content => 'La comunicació ara es fa mitjançant el protocol HTTP no xifrat. Per a utilitzar HTTPS, torneu a activar el xifratge.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$ca extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$ca extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Preferits'; + @override + String get noFavorites => 'Encara no hi ha cap dispositiu preferit.'; + @override + String get addFavorite => 'Afegeix'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$ca extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Elimina dels preferits'; + @override + String content({required Object name}) => 'Voleu eliminar «${name}» dels preferits?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$ca extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Afegeix als preferits'; + @override + String get titleEdit => 'Configuració'; + @override + String get name => 'Nom del dispositiu'; + @override + String get auto => '(auto)'; + @override + String get ip => 'Adreça IP'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$ca extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informació del fitxer'; + @override + String get fileName => 'Nom del fitxer:'; + @override + String get path => 'Ruta:'; + @override + String get size => 'Mida:'; + @override + String get sender => 'Remitent:'; + @override + String get time => 'Temps:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$ca extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Introduïu el nom del fitxer'; + @override + String original({required Object original}) => 'Original: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$ca extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Esborra l\'historial'; + @override + String get content => 'Segur que voleu eliminar tot l\'historial?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$ca extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'El LocalSend no pot trobar altres dispositius sense tenir permís per a escanejar la xarxa local. Concediu aquest permís a la configuració.'; + @override + String get gotoSettings => 'Configuració'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$ca extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tipus de missatge'; + @override + String get multiline => 'Multilínia'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$ca extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'No s\'ha seleccionat cap fitxer'; + @override + String get content => 'Seleccioneu com a mínim un fitxer.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$ca extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sense permisos'; + @override + String get content => 'No heu concedit els permisos necessaris. Concediu-los a la configuració.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$ca extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'No disponible'; + @override + String get content => 'Aquesta característica només està disponible a:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$ca extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Codi QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$ca extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Accions ràpides'; + @override + String get counter => 'Comptador'; + @override + String get prefix => 'Prefix'; + @override + String get padZero => 'Reomple amb zeros'; + @override + String get sortBeforeCount => 'Ordena abans alfabèticament'; + @override + String get random => 'Aleatori'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$ca extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Les sol·licituds de fitxers s\'accepten automàticament. Tingueu en compte que tothom a la xarxa local us pot enviar fitxers.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$ca extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Les sol·licituds de fitxers s\'accepten automàticament dels dispositius de la llista de preferits.', + 'Atenció! Actualment, això no és del tot segur, un hacker que tingués les emprentes de qualsevol del dispositiu de la llista de preferits podria enviar-vos fitxers sense restriccions.', + 'No obstant això, aquesta opció encara és més segura que permetre que tothom a la xarxa local us enviï fitxers sense restriccions.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$ca extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Introduïu el PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$ca extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Modes d\'enviament'; + @override + String get single => 'Envia fitxers a un destinatari. La selecció s\'esborrarà un cop finalitzada la transferència de fitxers.'; + @override + String get multiple => 'Envia fitxers a diversos destinataris. La selecció no s\'esborrarà en finalitzar la trasferència.'; + @override + String get link => + 'Els destinataris que no tinguin el LocalSend instal·lat poden baixar els fitxers seleccionats obrint l\'enllaç al seu navegador.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$ca extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$ca extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Obre el fitxer'; + @override + String get content => 'Voleu obrir el fitxer rebut?'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$ca extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get dark => 'Fosc'; + @override + String get light => 'Clar'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$ca extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$ca extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$ca extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String get all => 'Totes'; + @override + String get filtered => 'Filtrades'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$ca extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$ca._(TranslationsCa root) : this._root = root, super.internal(root); + + final TranslationsCa _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Progrés total (${time})'; + @override + String get finishedError => 'Finalitzat amb error'; + @override + String get canceledSender => 'Cancel·lat pel remitent'; + @override + String get canceledReceiver => 'Cancel·lat pel destinatari'; +} diff --git a/app/lib/gen/strings_cs.g.dart b/app/lib/gen/strings_cs.g.dart new file mode 100644 index 0000000..16cd497 --- /dev/null +++ b/app/lib/gen/strings_cs.g.dart @@ -0,0 +1,1411 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsCs extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsCs({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.cs, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsCs _root = this; // ignore: unused_field + + @override + TranslationsCs $copyWith({TranslationMetadata? meta}) => TranslationsCs(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Česky'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$cs general = _Translations$general$cs._(_root); + @override + late final _Translations$receiveTab$cs receiveTab = _Translations$receiveTab$cs._(_root); + @override + late final _Translations$sendTab$cs sendTab = _Translations$sendTab$cs._(_root); + @override + late final _Translations$settingsTab$cs settingsTab = _Translations$settingsTab$cs._(_root); + @override + late final _Translations$troubleshootPage$cs troubleshootPage = _Translations$troubleshootPage$cs._(_root); + @override + late final _Translations$networkInterfacesPage$cs networkInterfacesPage = _Translations$networkInterfacesPage$cs._(_root); + @override + late final _Translations$receiveHistoryPage$cs receiveHistoryPage = _Translations$receiveHistoryPage$cs._(_root); + @override + late final _Translations$apkPickerPage$cs apkPickerPage = _Translations$apkPickerPage$cs._(_root); + @override + late final _Translations$selectedFilesPage$cs selectedFilesPage = _Translations$selectedFilesPage$cs._(_root); + @override + late final _Translations$receivePage$cs receivePage = _Translations$receivePage$cs._(_root); + @override + late final _Translations$receiveOptionsPage$cs receiveOptionsPage = _Translations$receiveOptionsPage$cs._(_root); + @override + late final _Translations$sendPage$cs sendPage = _Translations$sendPage$cs._(_root); + @override + late final _Translations$progressPage$cs progressPage = _Translations$progressPage$cs._(_root); + @override + late final _Translations$webSharePage$cs webSharePage = _Translations$webSharePage$cs._(_root); + @override + late final _Translations$aboutPage$cs aboutPage = _Translations$aboutPage$cs._(_root); + @override + late final _Translations$donationPage$cs donationPage = _Translations$donationPage$cs._(_root); + @override + late final _Translations$changelogPage$cs changelogPage = _Translations$changelogPage$cs._(_root); + @override + late final _Translations$dialogs$cs dialogs = _Translations$dialogs$cs._(_root); + @override + late final _Translations$sanitization$cs sanitization = _Translations$sanitization$cs._(_root); + @override + late final _Translations$tray$cs tray = _Translations$tray$cs._(_root); + @override + late final _Translations$web$cs web = _Translations$web$cs._(_root); + @override + late final _Translations$assetPicker$cs assetPicker = _Translations$assetPicker$cs._(_root); +} + +// Path: general +class _Translations$general$cs extends Translations$general$en { + _Translations$general$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Přijmout'; + @override + String get accepted => 'Přijato'; + @override + String get add => 'Přidat'; + @override + String get advanced => 'Pokročilé'; + @override + String get cancel => 'Zrušit'; + @override + String get close => 'Zavřít'; + @override + String get confirm => 'Potvrdit'; + @override + String get continueStr => 'Pokračovat'; + @override + String get copy => 'Kopírovat'; + @override + String get copiedToClipboard => 'Zkopírováno do schránky'; + @override + String get decline => 'Odmítnout'; + @override + String get done => 'Hotovo'; + @override + String get delete => 'Vymazat'; + @override + String get edit => 'Upravit'; + @override + String get error => 'Chyba'; + @override + String get example => 'Příklad'; + @override + String get files => 'Soubory'; + @override + String get finished => 'Hotovo'; + @override + String get hide => 'Skrýt'; + @override + String get off => 'Vypnuto'; + @override + String get offline => 'Offline'; + @override + String get on => 'Zapnuto'; + @override + String get online => 'Online'; + @override + String get open => 'Otevřít'; + @override + String get queue => 'Fronta'; + @override + String get quickSave => 'Rychlé uložení'; + @override + String get quickSaveFromFavorites => 'Rychlé uložení pro "Oblíbené"'; + @override + String get renamed => 'Přejmenováno'; + @override + String get reset => 'Resetovat'; + @override + String get restart => 'Restartovat'; + @override + String get settings => 'Nastavení'; + @override + String get skipped => 'Přeskočeno'; + @override + String get start => 'Spustit'; + @override + String get stop => 'Zastavit'; + @override + String get save => 'Uložit'; + @override + String get unchanged => 'Nezměněno'; + @override + String get unknown => 'Neznámý'; + @override + String get noItemInClipboard => 'Žádná položka ve schránce'; +} + +// Path: receiveTab +class _Translations$receiveTab$cs extends Translations$receiveTab$en { + _Translations$receiveTab$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Příjmout'; + @override + late final _Translations$receiveTab$infoBox$cs infoBox = _Translations$receiveTab$infoBox$cs._(_root); + @override + late final _Translations$receiveTab$quickSave$cs quickSave = _Translations$receiveTab$quickSave$cs._(_root); +} + +// Path: sendTab +class _Translations$sendTab$cs extends Translations$sendTab$en { + _Translations$sendTab$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Odeslat'; + @override + late final _Translations$sendTab$selection$cs selection = _Translations$sendTab$selection$cs._(_root); + @override + late final _Translations$sendTab$picker$cs picker = _Translations$sendTab$picker$cs._(_root); + @override + String get shareIntentInfo => 'Pro snazší výběr souborů můžete také použít funkci "Sdílet" svého mobilního zařízení.'; + @override + String get nearbyDevices => 'Zařízení v okolí'; + @override + String get thisDevice => 'Toto zařízení'; + @override + String get scan => 'Hledat zařízení'; + @override + String get manualSending => 'Manuální odeslání'; + @override + String get sendMode => 'Režim odesílání'; + @override + late final _Translations$sendTab$sendModes$cs sendModes = _Translations$sendTab$sendModes$cs._(_root); + @override + String get sendModeHelp => 'Vysvětlení'; + @override + String get help => 'Ujistěte se, že se požadovaný cíl nachází ve stejné síti Wi-Fi.'; + @override + String get placeItems => 'Vložte položky, které chcete sdílet.'; +} + +// Path: settingsTab +class _Translations$settingsTab$cs extends Translations$settingsTab$en { + _Translations$settingsTab$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nastavení'; + @override + late final _Translations$settingsTab$general$cs general = _Translations$settingsTab$general$cs._(_root); + @override + late final _Translations$settingsTab$receive$cs receive = _Translations$settingsTab$receive$cs._(_root); + @override + late final _Translations$settingsTab$send$cs send = _Translations$settingsTab$send$cs._(_root); + @override + late final _Translations$settingsTab$network$cs network = _Translations$settingsTab$network$cs._(_root); + @override + late final _Translations$settingsTab$other$cs other = _Translations$settingsTab$other$cs._(_root); + @override + String get advancedSettings => 'Pokročilá nastavení'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$cs extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Odstraňování problémů'; + @override + String get subTitle => 'Tato aplikace nefunguje podle očekávání? Zde najdete častá řešení.'; + @override + String get solution => 'Řešení:'; + @override + String get fixButton => 'Opravit automaticky'; + @override + late final _Translations$troubleshootPage$firewall$cs firewall = _Translations$troubleshootPage$firewall$cs._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$cs noDiscovery = _Translations$troubleshootPage$noDiscovery$cs._(_root); + @override + late final _Translations$troubleshootPage$noConnection$cs noConnection = _Translations$troubleshootPage$noConnection$cs._(_root); +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$cs extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Síťová rozhraní'; + @override + String get info => + 'Ve výchozím nastavení používá LocalSend všechna dostupná síťová rozhraní. Zde můžete vyloučit nežádoucí sítě. Chcete-li použít změny, musíte restartovat server.'; + @override + String get preview => 'Náhled'; + @override + String get whitelist => 'Seznam povolených'; + @override + String get blacklist => 'Seznam zakázaných'; +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$cs extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Historie'; + @override + String get openFolder => 'Otevřít složku'; + @override + String get deleteHistory => 'Smazat historii'; + @override + String get empty => 'Historie je prázdná.'; + @override + late final _Translations$receiveHistoryPage$entryActions$cs entryActions = _Translations$receiveHistoryPage$entryActions$cs._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$cs extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplikace (APK)'; + @override + String get excludeSystemApps => 'Vyloučit systémové aplikace'; + @override + String get excludeAppsWithoutLaunchIntent => 'Vyloučit aplikace, které nelze spustit'; + @override + String apps({required Object n}) => '${n} Aplikace'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$cs extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Smazat vše'; +} + +// Path: receivePage +class _Translations$receivePage$cs extends Translations$receivePage$en { + _Translations$receivePage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('cs'))( + n, + one: 'vám chce poslat soubor', + other: 'vám chce poslat několik souborů: ${n}', + ); + @override + String get subTitleMessage => 'vám poslal zprávu:'; + @override + String get subTitleLink => 'vám poslal odkaz:'; + @override + String get canceled => 'Odesílatel zrušil požadavek.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$cs extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Možnosti'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend folder)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Automaticky vypnuto, protože existují adresáře.'; +} + +// Path: sendPage +class _Translations$sendPage$cs extends Translations$sendPage$en { + _Translations$sendPage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Čekání na odpověď...'; + @override + String get rejected => 'Příjemce žádost odmítl.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Příjemce je zaneprázdněn dalším požadavkem.'; +} + +// Path: progressPage +class _Translations$progressPage$cs extends Translations$progressPage$en { + _Translations$progressPage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Odesílání souborů'; + @override + String get titleReceiving => 'Přijímání souborů'; + @override + String get savedToGallery => 'Uloženo ve Fotkách'; + @override + late final _Translations$progressPage$total$cs total = _Translations$progressPage$total$cs._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$cs extends Translations$webSharePage$en { + _Translations$webSharePage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sdílet pomocí odkazu'; + @override + String get loading => 'Spouštění serveru...'; + @override + String get stopping => 'Zastavování serveru...'; + @override + String get error => 'Při spouštění serveru došlo k chybě.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('cs'))( + n, + one: 'Otevřete tento odkaz v prohlížeči:', + other: 'Otevřete v prohlížeči jeden z těchto odkazů:', + ); + @override + String get requests => 'Žádosti'; + @override + String get noRequests => 'Zatím žádné žádosti.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Automaticky přijímat žádosti'; + @override + String get requirePin => 'Vyžadovat PIN'; + @override + String pinHint({required Object pin}) => 'PIN je "${pin}"'; + @override + String get encryptionHint => 'LocalSend používá self-signed certifikát. Musíte ho přijmout ve vašem prohlížeči.'; + @override + String pendingRequests({required Object n}) => 'Čekající žádosti: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$cs extends Translations$aboutPage$en { + _Translations$aboutPage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'O aplikaci LocalSend'; + @override + List get description => [ + 'LocalSend je bezplatná aplikace s otevřeným zdrojovým kódem, která vám umožňuje bezpečně sdílet soubory a zprávy s okolními zařízeními přes vaši místní síť, aniž byste potřebovali připojení k internetu.', + 'Tato aplikace je dostupná pro Android, iOS, macOS, Windows a Linux. Všechny možnosti stahování najdete na oficiální domovské stránce.', + ]; + @override + String get author => 'Autor'; + @override + String get contributors => 'Přispěvatelé'; + @override + String get packagers => 'Baliči'; + @override + String get translators => 'Překladatelé'; +} + +// Path: donationPage +class _Translations$donationPage$cs extends Translations$donationPage$en { + _Translations$donationPage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Darovat'; + @override + String get info => 'LocalSend je zdarma, open source a bez reklam. Pokud se vám aplikace líbí, můžete její vývoj podpořit darem.'; + @override + String donate({required Object amount}) => 'Darovat ${amount}'; + @override + String get thanks => 'Děkuji mnohokrát!'; + @override + String get restore => 'Obnovit'; +} + +// Path: changelogPage +class _Translations$changelogPage$cs extends Translations$changelogPage$en { + _Translations$changelogPage$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Seznam změn'; +} + +// Path: dialogs +class _Translations$dialogs$cs extends Translations$dialogs$en { + _Translations$dialogs$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$cs addFile = _Translations$dialogs$addFile$cs._(_root); + @override + late final _Translations$dialogs$openFile$cs openFile = _Translations$dialogs$openFile$cs._(_root); + @override + late final _Translations$dialogs$addressInput$cs addressInput = _Translations$dialogs$addressInput$cs._(_root); + @override + late final _Translations$dialogs$cancelSession$cs cancelSession = _Translations$dialogs$cancelSession$cs._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$cs cannotOpenFile = _Translations$dialogs$cannotOpenFile$cs._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$cs encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$cs._(_root); + @override + late final _Translations$dialogs$errorDialog$cs errorDialog = _Translations$dialogs$errorDialog$cs._(_root); + @override + late final _Translations$dialogs$favoriteDialog$cs favoriteDialog = _Translations$dialogs$favoriteDialog$cs._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$cs favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$cs._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$cs favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$cs._(_root); + @override + late final _Translations$dialogs$fileInfo$cs fileInfo = _Translations$dialogs$fileInfo$cs._(_root); + @override + late final _Translations$dialogs$fileNameInput$cs fileNameInput = _Translations$dialogs$fileNameInput$cs._(_root); + @override + late final _Translations$dialogs$historyClearDialog$cs historyClearDialog = _Translations$dialogs$historyClearDialog$cs._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$cs localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$cs._(_root); + @override + late final _Translations$dialogs$messageInput$cs messageInput = _Translations$dialogs$messageInput$cs._(_root); + @override + late final _Translations$dialogs$noFiles$cs noFiles = _Translations$dialogs$noFiles$cs._(_root); + @override + late final _Translations$dialogs$noPermission$cs noPermission = _Translations$dialogs$noPermission$cs._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$cs notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$cs._(_root); + @override + late final _Translations$dialogs$qr$cs qr = _Translations$dialogs$qr$cs._(_root); + @override + late final _Translations$dialogs$quickActions$cs quickActions = _Translations$dialogs$quickActions$cs._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$cs quickSaveNotice = _Translations$dialogs$quickSaveNotice$cs._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$cs quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$cs._(_root); + @override + late final _Translations$dialogs$pin$cs pin = _Translations$dialogs$pin$cs._(_root); + @override + late final _Translations$dialogs$sendModeHelp$cs sendModeHelp = _Translations$dialogs$sendModeHelp$cs._(_root); + @override + late final _Translations$dialogs$zoom$cs zoom = _Translations$dialogs$zoom$cs._(_root); +} + +// Path: sanitization +class _Translations$sanitization$cs extends Translations$sanitization$en { + _Translations$sanitization$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Název souboru nemůže být prázdný'; + @override + String get invalid => 'Název souboru obsahuje neplatné znaky'; +} + +// Path: tray +class _Translations$tray$cs extends Translations$tray$en { + _Translations$tray$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Ukončit LocalSend'; + @override + String get closeWindows => 'Konec'; +} + +// Path: web +class _Translations$web$cs extends Translations$web$en { + _Translations$web$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Vložit PIN'; + @override + String get invalidPin => 'Neplatný PIN'; + @override + String get tooManyAttempts => 'Příliš mnoho pokusů'; + @override + String get rejected => 'Odmítnuto'; + @override + String get files => 'Soubory'; + @override + String get fileName => 'Název souboru'; + @override + String get size => 'Velikost'; +} + +// Path: assetPicker +class _Translations$assetPicker$cs extends Translations$assetPicker$en { + _Translations$assetPicker$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Potvrdit'; + @override + String get cancel => 'Zrušit'; + @override + String get edit => 'Editovat'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Načtení se nezdařilo'; + @override + String get original => 'Původ'; + @override + String get preview => 'Náhled'; + @override + String get select => 'Vybrat'; + @override + String get emptyList => 'Prázdný seznam'; + @override + String get unSupportedAssetType => 'Nepodporovaný typ souboru.'; + @override + String get unableToAccessAll => 'Nelze získat přístup ke všem souborům v zařízení'; + @override + String get viewingLimitedAssetsTip => 'Zobrazit pouze soubory a alba, ke kterým má aplikace přístup.'; + @override + String get changeAccessibleLimitedAssets => 'Kliknutím aktualizujete přístupné soubory'; + @override + String get accessAllTip => + 'Aplikace má přístup pouze k některým souborům v zařízení. Přejděte do nastavení systému a povolte aplikaci přístup ke všem médiím v zařízení.'; + @override + String get goToSystemSettings => 'Přejít do nastavení systému'; + @override + String get accessLimitedAssets => 'Pokračovat s omezeným přístupem'; + @override + String get accessiblePathName => 'Přístupné soubory'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Obrázek'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Ostatní média'; + @override + String get sActionPlayHint => 'přehrát'; + @override + String get sActionPreviewHint => 'náhled'; + @override + String get sActionSelectHint => 'vybrat'; + @override + String get sActionSwitchPathLabel => 'změnit cestu'; + @override + String get sActionUseCameraHint => 'použít kameru'; + @override + String get sNameDurationLabel => 'doba trvání'; + @override + String get sUnitAssetCountLabel => 'počet'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$cs extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Alias:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$cs extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Oblíbené'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$cs extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Vybrat'; + @override + String files({required Object files}) => 'Soubory: ${files}'; + @override + String size({required Object size}) => 'Velikost: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$cs extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get file => 'Soubor'; + @override + String get folder => 'Složka'; + @override + String get media => 'Média'; + @override + String get text => 'Text'; + @override + String get app => 'Aplikace'; + @override + String get clipboard => 'Vložit'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$cs extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get single => 'Jediný příjemce'; + @override + String get multiple => 'Více příjemců'; + @override + String get link => 'Sdílet pomocí odkazu'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$cs extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Všeobecné'; + @override + String get brightness => 'Motiv'; + @override + late final _Translations$settingsTab$general$brightnessOptions$cs brightnessOptions = _Translations$settingsTab$general$brightnessOptions$cs._( + _root, + ); + @override + String get color => 'Barva'; + @override + late final _Translations$settingsTab$general$colorOptions$cs colorOptions = _Translations$settingsTab$general$colorOptions$cs._(_root); + @override + String get language => 'Jazyk'; + @override + late final _Translations$settingsTab$general$languageOptions$cs languageOptions = _Translations$settingsTab$general$languageOptions$cs._(_root); + @override + String get saveWindowPlacement => 'Při ukončení uložit umístění okna'; + @override + String get saveWindowPlacementWindows => 'Uložit polohu okna po ukončení'; + @override + String get minimizeToTray => 'Při ukončení minimalizovat do lišty'; + @override + String get launchAtStartup => 'Automatické spuštění po přihlášení'; + @override + String get launchMinimized => 'Automatické spuštění: skrytý start'; + @override + String get showInContextMenu => 'Zobrazit LocalSend v kontextové nabídce'; + @override + String get animations => 'Animace'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$cs extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Soubory'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Automatické dokončování'; + @override + String get destination => 'Uložit do'; + @override + String get downloads => '(Downloads)'; + @override + String get saveToGallery => 'Uložit média do galerie'; + @override + String get saveToHistory => 'Uložit do historie'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$cs extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Poslat'; + @override + String get shareViaLinkAutoAccept => 'Automaticky přijímat požadavky v režimu "Sdílet přes odkaz".'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$cs extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Síť'; + @override + String get needRestart => 'Chcete-li použít nastavení, restartujte server!'; + @override + String get server => 'Server'; + @override + String get alias => 'Alias'; + @override + String get deviceType => 'Typ zařízení'; + @override + String get deviceModel => 'Model zařízení'; + @override + String get port => 'Port'; + @override + String get network => 'Síť'; + @override + late final _Translations$settingsTab$network$networkOptions$cs networkOptions = _Translations$settingsTab$network$networkOptions$cs._(_root); + @override + String get discoveryTimeout => 'Časový limit zjišťování'; + @override + String get useSystemName => 'Použít název systému'; + @override + String get generateRandomAlias => 'Generovat náhodný alias'; + @override + String portWarning({required Object defaultPort}) => + 'Je možné, že vás ostatní zařízení nezjistí, protože používáte vlastní port. (výchozí: ${defaultPort})'; + @override + String get encryption => 'Šifrování'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Je možné, že vás ostatní zařízení nezjistí, protože používáte vlastní adresu vícesměrového vysílání. (výchozí: ${defaultMulticast})'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$cs extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ostatní'; + @override + String get support => 'Podpora LocalSend'; + @override + String get donate => 'Darovat'; + @override + String get privacyPolicy => 'Zásady ochrany osobních údajů'; + @override + String get termsOfUse => 'Podmínky použití'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$cs extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Tato aplikace může odesílat soubory do jiných zařízení, ale jiná zařízení nemohou odesílat soubory do tohoto zařízení.'; + @override + String solution({required Object port}) => + 'S největší pravděpodobností se jedná o problém s firewallem. Můžete to vyřešit povolením příchozích připojení (UDP a TCP) na portu ${port}.'; + @override + String get openFirewall => 'Otevřít bránu firewall'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$cs extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Toto zařízení nemůže zjistit jiná zařízení.'; + @override + String get solution => + 'Ujistěte se, že jsou všechna zařízení ve stejné síti Wi-Fi a sdílejí stejnou konfiguraci (port, adresa vícesměrového vysílání, šifrování). Můžete zkusit zadat IP adresu cílového zařízení ručně. Pokud to funguje, zvažte přidání tohoto zařízení do oblíbených, aby mohlo být v budoucnu automaticky objeveno.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$cs extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Obě zařízení se nemohou navzájem objevit ani nemohou sdílet soubory.'; + @override + String get solution => + 'Problém je na obou stranách? Pak se musíte ujistit, že jsou obě zařízení ve stejné wifi síti a sdílejí stejnou konfiguraci (port, multicastová adresa, šifrování). Wifi nemusí umožňovat komunikaci mezi účastníky. V takovém případě musí být tato možnost povolena na routeru.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$cs extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get open => 'Otevřít soubor'; + @override + String get showInFolder => 'Zobrazit ve složce'; + @override + String get info => 'Informace'; + @override + String get deleteFromHistory => 'Smazat z historie'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$cs extends Translations$progressPage$total$en { + _Translations$progressPage$total$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$cs title = _Translations$progressPage$total$title$cs._(_root); + @override + String count({required Object curr, required Object n}) => 'Soubory: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Velikost: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Rychlost: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$cs extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Přidat do výběru'; + @override + String get content => 'Co chcete přidat?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$cs extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Otevřít soubor'; + @override + String get content => 'Chcete otevřít přijatý soubor?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$cs extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Zadat adresu'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP Adresa'; + @override + String get recentlyUsed => 'Nedávno použité: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$cs extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Zrušit přenos souborů'; + @override + String get content => 'Opravdu chcete zrušit přenos souborů?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$cs extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nelze otevřít soubor'; + @override + String content({required Object file}) => 'Nelze otevřít "${file}". Byl tento soubor přesunut, přejmenován nebo smazán?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$cs extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Šifrování zakázáno'; + @override + String get content => 'Komunikace nyní probíhá prostřednictvím nešifrovaného protokolu HTTP. Chcete-li použít HTTPS, znovu povolte šifrování.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$cs extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$cs extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Oblíbené'; + @override + String get noFavorites => 'Zatím nemáte žádná oblíbená zařízení.'; + @override + String get addFavorite => 'Přidat'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$cs extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Smazat z oblíbených'; + @override + String content({required Object name}) => 'Opravdu chcete smazat "${name}" z oblíbených?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$cs extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Přidat k oblíbeným'; + @override + String get titleEdit => 'Upravit'; + @override + String get name => 'Název zařízení'; + @override + String get auto => '(auto)'; + @override + String get ip => 'IP adresa'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$cs extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informace o souboru'; + @override + String get fileName => 'Název souboru:'; + @override + String get path => 'Cesta:'; + @override + String get size => 'Velikost:'; + @override + String get sender => 'Odesílatel:'; + @override + String get time => 'Čas:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$cs extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Zadejte název souboru'; + @override + String original({required Object original}) => 'Původní: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$cs extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Smazat historii'; + @override + String get content => 'Opravdu chcete smazat celou historii?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$cs extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend nemůže najít jiná zařízení, aniž by měl oprávnění skenovat místní síť. Udělte prosím toto oprávnění v nastavení.'; + @override + String get gotoSettings => 'Nastavení'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$cs extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Napište zprávu'; + @override + String get multiline => 'Více řádků'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$cs extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Žádný soubor nevybrán'; + @override + String get content => 'Vyberte prosím alespoň jeden soubor.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$cs extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Žádné oprávnění'; + @override + String get content => 'Neposkytli jste potřebná oprávnění. Prosím, udělte je v nastavení.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$cs extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Není k dispozici'; + @override + String get content => 'Tato funkce je dostupná pouze na:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$cs extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR kód'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$cs extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rychlé akce'; + @override + String get counter => 'Číslo'; + @override + String get prefix => 'Předpona'; + @override + String get padZero => 'Přidat nuly'; + @override + String get sortBeforeCount => 'Nejprve seřadit abecedně'; + @override + String get random => 'Náhodné jméno'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$cs extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Požadavky na soubor jsou automaticky přijímány. Uvědomte si, že každý v místní síti vám může posílat soubory.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$cs extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Žádosti o soubory jsou nyní přijímány automaticky ze zařízení ve vašem seznamu oblíbených.', + 'Upozornění: V současné době to není zcela bezpečné, protože hacker, který zná vaše oblíbené zařízení, vám stále může posílat soubory.', + 'Tato možnost je však stále bezpečnější než povolení libovolného zařízení.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$cs extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Vložit PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$cs extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Režimy odesílání'; + @override + String get single => 'Odešle soubory jednomu příjemci. Po dokončení přenosu souboru bude výběr vymazán.'; + @override + String get multiple => 'Odešle soubory více příjemcům. Výběr nebude vymazán.'; + @override + String get link => 'Příjemci, kteří nemají nainstalovaný LocalSend, si mohou vybrané soubory stáhnout otevřením odkazu ve svém prohlížeči.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$cs extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$cs extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get system => 'Systém'; + @override + String get dark => 'Tmavý'; + @override + String get light => 'Světlý'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$cs extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get system => 'Systém'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$cs extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get system => 'Systém'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$cs extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String get all => 'Vše'; + @override + String get filtered => 'Filtrované'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$cs extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$cs._(TranslationsCs root) : this._root = root, super.internal(root); + + final TranslationsCs _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Celkový průběh (${time})'; + @override + String get finishedError => 'Dokončeno s chybou'; + @override + String get canceledSender => 'Zrušeno odesílatelem'; + @override + String get canceledReceiver => 'Zrušeno příjemcem'; +} diff --git a/app/lib/gen/strings_da.g.dart b/app/lib/gen/strings_da.g.dart new file mode 100644 index 0000000..2f448ba --- /dev/null +++ b/app/lib/gen/strings_da.g.dart @@ -0,0 +1,1411 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsDa extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsDa({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.da, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsDa _root = this; // ignore: unused_field + + @override + TranslationsDa $copyWith({TranslationMetadata? meta}) => TranslationsDa(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Dansk'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$da general = _Translations$general$da._(_root); + @override + late final _Translations$receiveTab$da receiveTab = _Translations$receiveTab$da._(_root); + @override + late final _Translations$sendTab$da sendTab = _Translations$sendTab$da._(_root); + @override + late final _Translations$settingsTab$da settingsTab = _Translations$settingsTab$da._(_root); + @override + late final _Translations$troubleshootPage$da troubleshootPage = _Translations$troubleshootPage$da._(_root); + @override + late final _Translations$receiveHistoryPage$da receiveHistoryPage = _Translations$receiveHistoryPage$da._(_root); + @override + late final _Translations$apkPickerPage$da apkPickerPage = _Translations$apkPickerPage$da._(_root); + @override + late final _Translations$selectedFilesPage$da selectedFilesPage = _Translations$selectedFilesPage$da._(_root); + @override + late final _Translations$receivePage$da receivePage = _Translations$receivePage$da._(_root); + @override + late final _Translations$receiveOptionsPage$da receiveOptionsPage = _Translations$receiveOptionsPage$da._(_root); + @override + late final _Translations$sendPage$da sendPage = _Translations$sendPage$da._(_root); + @override + late final _Translations$progressPage$da progressPage = _Translations$progressPage$da._(_root); + @override + late final _Translations$webSharePage$da webSharePage = _Translations$webSharePage$da._(_root); + @override + late final _Translations$aboutPage$da aboutPage = _Translations$aboutPage$da._(_root); + @override + late final _Translations$donationPage$da donationPage = _Translations$donationPage$da._(_root); + @override + late final _Translations$changelogPage$da changelogPage = _Translations$changelogPage$da._(_root); + @override + late final _Translations$dialogs$da dialogs = _Translations$dialogs$da._(_root); + @override + late final _Translations$sanitization$da sanitization = _Translations$sanitization$da._(_root); + @override + late final _Translations$tray$da tray = _Translations$tray$da._(_root); + @override + late final _Translations$web$da web = _Translations$web$da._(_root); + @override + late final _Translations$assetPicker$da assetPicker = _Translations$assetPicker$da._(_root); + @override + late final _Translations$networkInterfacesPage$da networkInterfacesPage = _Translations$networkInterfacesPage$da._(_root); +} + +// Path: general +class _Translations$general$da extends Translations$general$en { + _Translations$general$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Acceptér'; + @override + String get accepted => 'Accepteret'; + @override + String get add => 'Tilføj'; + @override + String get advanced => 'Avanceret'; + @override + String get cancel => 'Afbryd'; + @override + String get close => 'Luk'; + @override + String get confirm => 'Bekræft'; + @override + String get continueStr => 'Fortsæt'; + @override + String get copy => 'Kopiér'; + @override + String get copiedToClipboard => 'Kopieret til udklipsholder'; + @override + String get decline => 'Afvis'; + @override + String get done => 'Færdig'; + @override + String get delete => 'Slet'; + @override + String get edit => 'Rediger'; + @override + String get error => 'Fejl'; + @override + String get example => 'Eksempel'; + @override + String get files => 'Filer'; + @override + String get finished => 'Fuldført'; + @override + String get hide => 'Skjul'; + @override + String get off => 'Fra'; + @override + String get offline => 'Offline'; + @override + String get on => 'Til'; + @override + String get online => 'Online'; + @override + String get open => 'Åbn'; + @override + String get queue => 'Kø'; + @override + String get quickSave => 'Gem hurtigt'; + @override + String get quickSaveFromFavorites => 'Gem hurtigt til "Favoritter"'; + @override + String get renamed => 'Omdøbt'; + @override + String get reset => 'Fortryd ændringer'; + @override + String get restart => 'Genstart'; + @override + String get settings => 'Indstillinger'; + @override + String get skipped => 'Sprunget over'; + @override + String get start => 'Start'; + @override + String get stop => 'Stop'; + @override + String get save => 'Gem'; + @override + String get unchanged => 'Uændret'; + @override + String get unknown => 'Ukendt'; + @override + String get noItemInClipboard => 'Ingen elementer i udklipsholder.'; +} + +// Path: receiveTab +class _Translations$receiveTab$da extends Translations$receiveTab$en { + _Translations$receiveTab$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Modtag'; + @override + late final _Translations$receiveTab$infoBox$da infoBox = _Translations$receiveTab$infoBox$da._(_root); + @override + late final _Translations$receiveTab$quickSave$da quickSave = _Translations$receiveTab$quickSave$da._(_root); +} + +// Path: sendTab +class _Translations$sendTab$da extends Translations$sendTab$en { + _Translations$sendTab$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Send'; + @override + late final _Translations$sendTab$selection$da selection = _Translations$sendTab$selection$da._(_root); + @override + late final _Translations$sendTab$picker$da picker = _Translations$sendTab$picker$da._(_root); + @override + String get shareIntentInfo => 'Du kan også bruge din mobilenheds "Del"-funktion til nemmere at vælge filer.'; + @override + String get nearbyDevices => 'Enheder i nærheden'; + @override + String get thisDevice => 'Denne enhed'; + @override + String get scan => 'Søg efter enheder'; + @override + String get manualSending => 'Manuel afsendelse'; + @override + String get sendMode => 'Send-tilstand'; + @override + late final _Translations$sendTab$sendModes$da sendModes = _Translations$sendTab$sendModes$da._(_root); + @override + String get sendModeHelp => 'Forklaring'; + @override + String get help => 'Sørg for, at den ønskede enhed er på det samme Wi-Fi-netværk.'; + @override + String get placeItems => 'Placer filer til deling.'; +} + +// Path: settingsTab +class _Translations$settingsTab$da extends Translations$settingsTab$en { + _Translations$settingsTab$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Indstillinger'; + @override + late final _Translations$settingsTab$general$da general = _Translations$settingsTab$general$da._(_root); + @override + late final _Translations$settingsTab$receive$da receive = _Translations$settingsTab$receive$da._(_root); + @override + late final _Translations$settingsTab$send$da send = _Translations$settingsTab$send$da._(_root); + @override + late final _Translations$settingsTab$network$da network = _Translations$settingsTab$network$da._(_root); + @override + late final _Translations$settingsTab$other$da other = _Translations$settingsTab$other$da._(_root); + @override + String get advancedSettings => 'Avancerede indstillinger'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$da extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Fejlsøgning'; + @override + String get subTitle => 'Fungerer appen ikke som forventet? Her finder du løsninger på almindelige problemer.'; + @override + String get solution => 'Løsning:'; + @override + String get fixButton => 'Løs automatisk'; + @override + late final _Translations$troubleshootPage$firewall$da firewall = _Translations$troubleshootPage$firewall$da._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$da noDiscovery = _Translations$troubleshootPage$noDiscovery$da._(_root); + @override + late final _Translations$troubleshootPage$noConnection$da noConnection = _Translations$troubleshootPage$noConnection$da._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$da extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Historik'; + @override + String get openFolder => 'Åbn mappe'; + @override + String get deleteHistory => 'Slet historik'; + @override + String get empty => 'Historikken er tom.'; + @override + late final _Translations$receiveHistoryPage$entryActions$da entryActions = _Translations$receiveHistoryPage$entryActions$da._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$da extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Apps (APK)'; + @override + String get excludeSystemApps => 'Ekskluder systemapps'; + @override + String get excludeAppsWithoutLaunchIntent => 'Ekskluder ikke-startbare apps'; + @override + String apps({required Object n}) => '${n} Apps'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$da extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Slet alle'; +} + +// Path: receivePage +class _Translations$receivePage$da extends Translations$receivePage$en { + _Translations$receivePage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('da'))( + n, + one: 'vil sende dig en fil', + other: 'vil sende dig ${n} filer', + ); + @override + String get subTitleMessage => 'sendte dig en besked:'; + @override + String get subTitleLink => 'sendte dig et link:'; + @override + String get canceled => 'Afsenderen har afbrudt delingen.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$da extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Muligheder'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend mappe)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Slået fra automatisk, fordi der er mapper.'; +} + +// Path: sendPage +class _Translations$sendPage$da extends Translations$sendPage$en { + _Translations$sendPage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Venter på svar…'; + @override + String get rejected => 'Modtageren har afvist delingen.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Modtageren er optaget med en anden deling.'; +} + +// Path: progressPage +class _Translations$progressPage$da extends Translations$progressPage$en { + _Translations$progressPage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Sender filer'; + @override + String get titleReceiving => 'Modtager filer'; + @override + String get savedToGallery => 'Gemt i fotos'; + @override + late final _Translations$progressPage$total$da total = _Translations$progressPage$total$da._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$da extends Translations$webSharePage$en { + _Translations$webSharePage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Del med link'; + @override + String get loading => 'Starter server…'; + @override + String get stopping => 'Stopper server…'; + @override + String get error => 'En fejl opstod, mens serveren blev startet.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('da'))( + n, + one: 'Åbn dette link i din browser:', + other: 'Åbn et af disse links i din browser:', + ); + @override + String get requests => 'Forespørgsler'; + @override + String get noRequests => 'Ingen forespørgsler endnu.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Accepter automatisk anmodninger'; + @override + String get requirePin => 'Kræv PIN-kode'; + @override + String pinHint({required Object pin}) => 'PIN-koden er "${pin}"'; + @override + String get encryptionHint => 'LocalSend bruger et selvsigneret certifikat. Du skal acceptere det i din browser.'; + @override + String pendingRequests({required Object n}) => 'Afventende forespørgsler: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$da extends Translations$aboutPage$en { + _Translations$aboutPage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Om LocalSend'; + @override + List get description => [ + 'LocalSend er en gratis, open source-app, der lader dig dele filer og beskeder sikkert med enheder i nærheden over dit lokale netværk uden behov for en internetforbindelse.', + 'Appen er tilgængelig på Android, iOS, macOS, Windows og Linux. Du finder alle downloadmuligheder på den officielle hjemmeside.', + ]; + @override + String get author => 'Skaber'; + @override + String get contributors => 'Bidragydere'; + @override + String get packagers => 'Pakkere'; + @override + String get translators => 'Oversættere'; +} + +// Path: donationPage +class _Translations$donationPage$da extends Translations$donationPage$en { + _Translations$donationPage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Donér'; + @override + String get info => 'LocalSend er gratis, open source og uden annoncer. Hvis du kan lide appen, kan du støtte udviklingen med en donation.'; + @override + String donate({required Object amount}) => 'Donér ${amount}'; + @override + String get thanks => 'Tusind tak for din støtte!'; + @override + String get restore => 'Gendan køb'; +} + +// Path: changelogPage +class _Translations$changelogPage$da extends Translations$changelogPage$en { + _Translations$changelogPage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ændringslog'; +} + +// Path: dialogs +class _Translations$dialogs$da extends Translations$dialogs$en { + _Translations$dialogs$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$da addFile = _Translations$dialogs$addFile$da._(_root); + @override + late final _Translations$dialogs$addressInput$da addressInput = _Translations$dialogs$addressInput$da._(_root); + @override + late final _Translations$dialogs$cancelSession$da cancelSession = _Translations$dialogs$cancelSession$da._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$da cannotOpenFile = _Translations$dialogs$cannotOpenFile$da._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$da encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$da._(_root); + @override + late final _Translations$dialogs$errorDialog$da errorDialog = _Translations$dialogs$errorDialog$da._(_root); + @override + late final _Translations$dialogs$favoriteDialog$da favoriteDialog = _Translations$dialogs$favoriteDialog$da._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$da favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$da._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$da favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$da._(_root); + @override + late final _Translations$dialogs$fileInfo$da fileInfo = _Translations$dialogs$fileInfo$da._(_root); + @override + late final _Translations$dialogs$fileNameInput$da fileNameInput = _Translations$dialogs$fileNameInput$da._(_root); + @override + late final _Translations$dialogs$historyClearDialog$da historyClearDialog = _Translations$dialogs$historyClearDialog$da._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$da localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$da._(_root); + @override + late final _Translations$dialogs$messageInput$da messageInput = _Translations$dialogs$messageInput$da._(_root); + @override + late final _Translations$dialogs$noFiles$da noFiles = _Translations$dialogs$noFiles$da._(_root); + @override + late final _Translations$dialogs$noPermission$da noPermission = _Translations$dialogs$noPermission$da._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$da notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$da._(_root); + @override + late final _Translations$dialogs$qr$da qr = _Translations$dialogs$qr$da._(_root); + @override + late final _Translations$dialogs$quickActions$da quickActions = _Translations$dialogs$quickActions$da._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$da quickSaveNotice = _Translations$dialogs$quickSaveNotice$da._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$da quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$da._(_root); + @override + late final _Translations$dialogs$pin$da pin = _Translations$dialogs$pin$da._(_root); + @override + late final _Translations$dialogs$sendModeHelp$da sendModeHelp = _Translations$dialogs$sendModeHelp$da._(_root); + @override + late final _Translations$dialogs$zoom$da zoom = _Translations$dialogs$zoom$da._(_root); + @override + late final _Translations$dialogs$openFile$da openFile = _Translations$dialogs$openFile$da._(_root); +} + +// Path: sanitization +class _Translations$sanitization$da extends Translations$sanitization$en { + _Translations$sanitization$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Filnavn må ikke være tomt'; + @override + String get invalid => 'Filnavn indeholder ugyldige tegn'; +} + +// Path: tray +class _Translations$tray$da extends Translations$tray$en { + _Translations$tray$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Afslut LocalSend'; + @override + String get closeWindows => 'Luk'; +} + +// Path: web +class _Translations$web$da extends Translations$web$en { + _Translations$web$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Indtast PIN-kode'; + @override + String get invalidPin => 'Ugyldig PIN-kode'; + @override + String get tooManyAttempts => 'For mange forsøg'; + @override + String get rejected => 'Afvist'; + @override + String get files => 'Filer'; + @override + String get fileName => 'Filnavn'; + @override + String get size => 'Størrelse'; +} + +// Path: assetPicker +class _Translations$assetPicker$da extends Translations$assetPicker$en { + _Translations$assetPicker$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Bekræft'; + @override + String get cancel => 'Afbryd'; + @override + String get edit => 'Rediger'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Indlæsning mislykkedes'; + @override + String get original => 'Original'; + @override + String get preview => 'Forhåndsvisning'; + @override + String get select => 'Vælg'; + @override + String get emptyList => 'Tom liste'; + @override + String get unSupportedAssetType => 'Ikke-understøttet filtype.'; + @override + String get unableToAccessAll => 'Kan ikke tilgå alle filer på enheden'; + @override + String get viewingLimitedAssetsTip => 'Vis kun filer og mapper tilgængelige for appen.'; + @override + String get changeAccessibleLimitedAssets => 'Klik for at opdatere tilgængelige filer'; + @override + String get accessAllTip => + 'Appen kan kun tilgå nogle filer på enheden. Gå til systemindstillingerne, og giv den adgang til alle medier på enheden.'; + @override + String get goToSystemSettings => 'Gå til systemindstillinger'; + @override + String get accessLimitedAssets => 'Fortsæt med begrænset adgang'; + @override + String get accessiblePathName => 'Tilgængelige filer'; + @override + String get sTypeAudioLabel => 'Lyd'; + @override + String get sTypeImageLabel => 'Billede'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Andre medier'; + @override + String get sActionPlayHint => 'Afspil'; + @override + String get sActionPreviewHint => 'Forhåndsvisning'; + @override + String get sActionSelectHint => 'Vælg'; + @override + String get sActionSwitchPathLabel => 'Ændr filsti'; + @override + String get sActionUseCameraHint => 'Brug kamera'; + @override + String get sNameDurationLabel => 'Varighed'; + @override + String get sUnitAssetCountLabel => 'Antal'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$da extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Netværksgrænseflader'; + @override + String get info => + 'Som standard bruger LocalSend alle tilgængelige netværksgrænseflader. Du kan ekskludere uønskede netværk her. Du skal genstarte serveren for at anvende ændringerne.'; + @override + String get preview => 'Forhåndsvisning'; + @override + String get whitelist => 'Hvidliste'; + @override + String get blacklist => 'Sortliste'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$da extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Enhedsnavn:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$da extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get favorites => 'Favoritter'; + @override + String get off => _root.general.off; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$da extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Valg'; + @override + String files({required Object files}) => 'Filer: ${files}'; + @override + String size({required Object size}) => 'Størrelse: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$da extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get file => 'Fil'; + @override + String get folder => 'Mappe'; + @override + String get media => 'Medie'; + @override + String get text => 'Tekst'; + @override + String get app => 'App'; + @override + String get clipboard => 'Indsæt'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$da extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get single => 'Enkel modtager'; + @override + String get multiple => 'Flere modtagere'; + @override + String get link => 'Del med link'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$da extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Generelt'; + @override + String get brightness => 'Tema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$da brightnessOptions = _Translations$settingsTab$general$brightnessOptions$da._( + _root, + ); + @override + String get color => 'Farve'; + @override + late final _Translations$settingsTab$general$colorOptions$da colorOptions = _Translations$settingsTab$general$colorOptions$da._(_root); + @override + String get language => 'Sprog'; + @override + late final _Translations$settingsTab$general$languageOptions$da languageOptions = _Translations$settingsTab$general$languageOptions$da._(_root); + @override + String get saveWindowPlacement => 'Gem vinduesposition ved afslutning'; + @override + String get saveWindowPlacementWindows => 'Gem vinduesposition ved lukning'; + @override + String get minimizeToTray => 'Minimer til systembakken/menulinjen ved lukning'; + @override + String get launchAtStartup => 'Autostart efter login'; + @override + String get launchMinimized => 'Autostart: Start skjult'; + @override + String get showInContextMenu => 'Vis LocalSend i kontekstmenu'; + @override + String get animations => 'Animationer'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$da extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Modtag'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Auto-fuldfør'; + @override + String get destination => 'Gem til mappe'; + @override + String get downloads => '(Overførsler)'; + @override + String get saveToGallery => 'Gem medier til galleri'; + @override + String get saveToHistory => 'Gem til historik'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$da extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Send'; + @override + String get shareViaLinkAutoAccept => 'Acceptér automatisk anmodninger i "Del med link"-tilstand'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$da extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Netværk'; + @override + String get needRestart => 'Genstart serveren for at anvende ændringerne!'; + @override + String get server => 'Server'; + @override + String get alias => 'Enhedsnavn'; + @override + String get deviceType => 'Enhedstype'; + @override + String get deviceModel => 'Enhedsmodel'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Timeout for søgning'; + @override + String portWarning({required Object defaultPort}) => + 'Andre enheder registrerer dig muligvis ikke, da du bruger en brugerdefineret port (standard: ${defaultPort}).'; + @override + String get encryption => 'Kryptering'; + @override + String get multicastGroup => 'Multicast-adresse'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Andre enheder registrerer dig muligvis ikke, da du bruger en brugerdefineret multicast-adresse (standard: ${defaultMulticast}).'; + @override + String get network => 'Netværk'; + @override + late final _Translations$settingsTab$network$networkOptions$da networkOptions = _Translations$settingsTab$network$networkOptions$da._(_root); + @override + String get useSystemName => 'Brug systemnavn'; + @override + String get generateRandomAlias => 'Generér tilfældigt alias'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$da extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Andet'; + @override + String get support => 'Støt LocalSend'; + @override + String get donate => 'Donér'; + @override + String get privacyPolicy => 'Privatlivspolitik'; + @override + String get termsOfUse => 'Brugsbetingelser'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$da extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Denne enhed kan sende filer til andre enheder, men andre kan ikke sende til denne enhed.'; + @override + String solution({required Object port}) => + 'Dette er sandsynligvis et firewall-problem. Løs det ved at tillade indgående forbindelser (UDP og TCP) på port ${port}.'; + @override + String get openFirewall => 'Åbn firewall'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$da extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Denne enhed kan ikke finde andre enheder.'; + @override + String get solution => + 'Sørg for, at alle enheder er på samme Wi-Fi-netværk og har den samme konfiguration (port, multicast-adresse, kryptering). Du kan prøve at indtaste den ønskede enheds IP-adresse manuelt. Hvis det virker, kan du føje enheden til favoritter, så den kan findes automatisk fremover.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$da extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Begge enheder kan hverken se hinanden eller dele data.'; + @override + String get solution => + 'Er problemet der på begge enheder? Hvis ja, skal du sikre, at begge er på samme Wi-Fi-netværk og har den samme konfiguration (port, multicast-adresse, kryptering). Det kan være, at Wi-Fi-netværket forhindrer kommunikation mellem enheder grundet Access Point (AP) Isolation. I så fald skal denne indstilling deaktiveres på routeren.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$da extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get open => 'Åbn fil'; + @override + String get showInFolder => 'Vis i mappe'; + @override + String get info => 'Information'; + @override + String get deleteFromHistory => 'Slet fra historik'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$da extends Translations$progressPage$total$en { + _Translations$progressPage$total$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$da title = _Translations$progressPage$total$title$da._(_root); + @override + String count({required Object curr, required Object n}) => 'Filer: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Størrelse: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Hastighed: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$da extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Føj til valg'; + @override + String get content => 'Hvad vil du tilføje?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$da extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Indtast adresse'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP-adresse'; + @override + String get recentlyUsed => 'Senest brugt: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$da extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Afbryd filoverførsel'; + @override + String get content => 'Vil du virkelig afbryde filoverførslen?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$da extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kan ikke åbne filen'; + @override + String content({required Object file}) => 'Filen "${file}" kunne ikke åbnes. Er denne fil blevet flyttet, omdøbt eller slettet?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$da extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kryptering deaktiveret'; + @override + String get content => 'Kommunikationen sker nu via den ukrypterede HTTP-protokol. Aktivér kryptering igen for at bruge HTTPS.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$da extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$da extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favoritter'; + @override + String get noFavorites => 'Ingen favoritter endnu.'; + @override + String get addFavorite => 'Tilføj'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$da extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Slet favorit'; + @override + String content({required Object name}) => 'Vil du virkelig slette "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$da extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Føj til favoritter'; + @override + String get titleEdit => 'Rediger favorit'; + @override + String get name => 'Enhedsnavn'; + @override + String get auto => '(auto)'; + @override + String get ip => 'IP-adresse'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$da extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Filoplysninger'; + @override + String get fileName => 'Filnavn:'; + @override + String get path => 'Sti:'; + @override + String get size => 'Størrelse:'; + @override + String get sender => 'Afsender:'; + @override + String get time => 'Tidspunkt:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$da extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Angiv filnavn'; + @override + String original({required Object original}) => 'Original: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$da extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ryd historik'; + @override + String get content => 'Vil du virkelig slette hele historikken?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$da extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend kan ikke finde andre enheder uden tilladelse til at scanne det lokale netværk. Giv venligst tilladelse i systemindstillingerne.'; + @override + String get gotoSettings => 'Indstillinger'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$da extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Skriv besked'; + @override + String get multiline => 'Flerlinjet'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$da extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ingen fil valgt'; + @override + String get content => 'Vælg mindst én fil.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$da extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ingen tilladelse'; + @override + String get content => 'Du har ikke givet de nødvendige tilladelser. Giv venligst tilladelse i systemindstillingerne.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$da extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ikke tilgængelig'; + @override + String get content => 'Denne funktion er ikke tilgængelig:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$da extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR-kode'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$da extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hurtighandlinger'; + @override + String get counter => 'Tæller'; + @override + String get prefix => 'Præfiks'; + @override + String get padZero => 'Fyld med nuller'; + @override + String get sortBeforeCount => 'Sortér alfabetisk på forhånd (A-Å)'; + @override + String get random => 'Tilfældig'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$da extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Filoverførsler accepteres nu automatisk. Bemærk, at alle på det lokale netværk kan sende dig filer.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$da extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Filoverførsler accepteres nu automatisk fra enheder på din favoritliste.', + 'Advarsel! Dette er ikke helt sikkert, da hvis en hacker har fingeraftrykket på enhver enhed fra din favoritliste, kan de sende filer til dig uden restriktioner.', + 'Denne mulighed er dog stadig sikrere end at tillade alle brugere på det lokale netværk at sende filer til dig uden restriktioner.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$da extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Indtast PIN-kode'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$da extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Send-tilstande'; + @override + String get single => 'Sender filer til én modtager. Valget ryddes efter filoverførsel er færdig.'; + @override + String get multiple => 'Sender filer til flere modtager. Valget ryddes ikke efter filoverførsel er færdig.'; + @override + String get link => 'Modtagere, der ikke har LocalSend installeret, kan hente de valgte filer ved at åbne linket i deres browser.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$da extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$da extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get title => 'Åbn fil'; + @override + String get content => 'Vil du åbne den modtagne fil?'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$da extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; + @override + String get dark => 'Mørk'; + @override + String get light => 'Lys'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$da extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$da extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$da extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String get all => 'Alle'; + @override + String get filtered => 'Filtreret'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$da extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$da._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Samlet tid (${time})'; + @override + String get finishedError => 'Fuldført med fejl'; + @override + String get canceledSender => 'Afbrudt af afsender'; + @override + String get canceledReceiver => 'Afbrudt af modtager'; +} diff --git a/app/lib/gen/strings_de.g.dart b/app/lib/gen/strings_de.g.dart new file mode 100644 index 0000000..366f253 --- /dev/null +++ b/app/lib/gen/strings_de.g.dart @@ -0,0 +1,1438 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsDe extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsDe({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.de, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsDe _root = this; // ignore: unused_field + + @override + TranslationsDe $copyWith({TranslationMetadata? meta}) => TranslationsDe(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Deutsch'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$de general = _Translations$general$de._(_root); + @override + late final _Translations$receiveTab$de receiveTab = _Translations$receiveTab$de._(_root); + @override + late final _Translations$sendTab$de sendTab = _Translations$sendTab$de._(_root); + @override + late final _Translations$settingsTab$de settingsTab = _Translations$settingsTab$de._(_root); + @override + late final _Translations$troubleshootPage$de troubleshootPage = _Translations$troubleshootPage$de._(_root); + @override + late final _Translations$networkInterfacesPage$de networkInterfacesPage = _Translations$networkInterfacesPage$de._(_root); + @override + late final _Translations$receiveHistoryPage$de receiveHistoryPage = _Translations$receiveHistoryPage$de._(_root); + @override + late final _Translations$apkPickerPage$de apkPickerPage = _Translations$apkPickerPage$de._(_root); + @override + late final _Translations$selectedFilesPage$de selectedFilesPage = _Translations$selectedFilesPage$de._(_root); + @override + late final _Translations$receivePage$de receivePage = _Translations$receivePage$de._(_root); + @override + late final _Translations$receiveOptionsPage$de receiveOptionsPage = _Translations$receiveOptionsPage$de._(_root); + @override + late final _Translations$sendPage$de sendPage = _Translations$sendPage$de._(_root); + @override + late final _Translations$progressPage$de progressPage = _Translations$progressPage$de._(_root); + @override + late final _Translations$webSharePage$de webSharePage = _Translations$webSharePage$de._(_root); + @override + late final _Translations$aboutPage$de aboutPage = _Translations$aboutPage$de._(_root); + @override + late final _Translations$donationPage$de donationPage = _Translations$donationPage$de._(_root); + @override + late final _Translations$changelogPage$de changelogPage = _Translations$changelogPage$de._(_root); + @override + late final _Translations$dialogs$de dialogs = _Translations$dialogs$de._(_root); + @override + late final _Translations$sanitization$de sanitization = _Translations$sanitization$de._(_root); + @override + late final _Translations$tray$de tray = _Translations$tray$de._(_root); + @override + late final _Translations$web$de web = _Translations$web$de._(_root); + @override + late final _Translations$assetPicker$de assetPicker = _Translations$assetPicker$de._(_root); +} + +// Path: general +class _Translations$general$de extends Translations$general$en { + _Translations$general$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Akzeptieren'; + @override + String get accepted => 'Akzeptiert'; + @override + String get add => 'Hinzufügen'; + @override + String get advanced => 'Erweitert'; + @override + String get cancel => 'Abbrechen'; + @override + String get close => 'Schließen'; + @override + String get confirm => 'Bestätigen'; + @override + String get continueStr => 'Weiter'; + @override + String get copy => 'Kopieren'; + @override + String get copiedToClipboard => 'In die Zwischenablage kopiert'; + @override + String get decline => 'Ablehnen'; + @override + String get done => 'Fertig'; + @override + String get delete => 'Löschen'; + @override + String get edit => 'Bearbeiten'; + @override + String get error => 'Fehler'; + @override + String get example => 'Beispiel'; + @override + String get files => 'Dateien'; + @override + String get finished => 'Abgeschlossen'; + @override + String get hide => 'Verstecken'; + @override + String get off => 'Aus'; + @override + String get offline => 'Offline'; + @override + String get on => 'An'; + @override + String get online => 'Online'; + @override + String get open => 'Öffnen'; + @override + String get queue => 'Warteschlange'; + @override + String get quickSave => 'Quick Save'; + @override + String get quickSaveFromFavorites => 'Quick Save für "Favoriten"'; + @override + String get renamed => 'Umbenannt'; + @override + String get reset => 'Zurücksetzen'; + @override + String get restart => 'Neustarten'; + @override + String get settings => 'Einstellungen'; + @override + String get skipped => 'Übersprungen'; + @override + String get start => 'Start'; + @override + String get stop => 'Stop'; + @override + String get save => 'Speichern'; + @override + String get unchanged => 'Unverändert'; + @override + String get unknown => 'Unbekannt'; + @override + String get noItemInClipboard => 'Kein Element in der Zwischenablage gefunden.'; +} + +// Path: receiveTab +class _Translations$receiveTab$de extends Translations$receiveTab$en { + _Translations$receiveTab$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Empfangen'; + @override + late final _Translations$receiveTab$infoBox$de infoBox = _Translations$receiveTab$infoBox$de._(_root); + @override + late final _Translations$receiveTab$quickSave$de quickSave = _Translations$receiveTab$quickSave$de._(_root); +} + +// Path: sendTab +class _Translations$sendTab$de extends Translations$sendTab$en { + _Translations$sendTab$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Senden'; + @override + late final _Translations$sendTab$selection$de selection = _Translations$sendTab$selection$de._(_root); + @override + late final _Translations$sendTab$picker$de picker = _Translations$sendTab$picker$de._(_root); + @override + String get shareIntentInfo => 'Du kannst auch die "Teilen"-Funktion deines mobilen Geräts nutzen, um Dateien einfacher auszuwählen.'; + @override + String get nearbyDevices => 'Geräte in der Nähe'; + @override + String get thisDevice => 'Dieses Gerät'; + @override + String get scan => 'Geräte suchen'; + @override + String get manualSending => 'Manuelles Senden'; + @override + String get sendMode => 'Sendemodus'; + @override + late final _Translations$sendTab$sendModes$de sendModes = _Translations$sendTab$sendModes$de._(_root); + @override + String get sendModeHelp => 'Erklärung'; + @override + String get help => 'Bitte stelle sicher, dass sich das gewünschte Ziel auch im selben WLAN-Netzwerk befindet.'; + @override + String get placeItems => 'Dateien ablegen, um zu teilen.'; +} + +// Path: settingsTab +class _Translations$settingsTab$de extends Translations$settingsTab$en { + _Translations$settingsTab$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Einstellungen'; + @override + late final _Translations$settingsTab$general$de general = _Translations$settingsTab$general$de._(_root); + @override + late final _Translations$settingsTab$receive$de receive = _Translations$settingsTab$receive$de._(_root); + @override + late final _Translations$settingsTab$send$de send = _Translations$settingsTab$send$de._(_root); + @override + late final _Translations$settingsTab$network$de network = _Translations$settingsTab$network$de._(_root); + @override + late final _Translations$settingsTab$other$de other = _Translations$settingsTab$other$de._(_root); + @override + String get advancedSettings => 'Erweiterte Einstellungen'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$de extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Fehlerbehebung'; + @override + String get subTitle => 'Diese App funktioniert nicht wie erwartet? Hier findest du häufige Lösungsansätze.'; + @override + String get solution => 'Lösung:'; + @override + String get fixButton => 'Automatisch beheben'; + @override + late final _Translations$troubleshootPage$firewall$de firewall = _Translations$troubleshootPage$firewall$de._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$de noDiscovery = _Translations$troubleshootPage$noDiscovery$de._(_root); + @override + late final _Translations$troubleshootPage$noConnection$de noConnection = _Translations$troubleshootPage$noConnection$de._(_root); +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$de extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Netzwerkschnittstellen'; + @override + String get info => + 'Standardmäßig verwendet LocalSend alle verfügbaren Netzwerkschnittstellen. Hier können Sie unerwünschte Netzwerke ausschließen. Sie müssen den Server neu starten, um die Änderungen zu übernehmen.'; + @override + String get preview => 'Vorschau'; + @override + String get whitelist => 'Whitelist'; + @override + String get blacklist => 'Blacklist'; +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$de extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Verlauf'; + @override + String get openFolder => 'Ordner öffnen'; + @override + String get deleteHistory => 'Verlauf löschen'; + @override + String get empty => 'Der Verlauf ist leer.'; + @override + late final _Translations$receiveHistoryPage$entryActions$de entryActions = _Translations$receiveHistoryPage$entryActions$de._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$de extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Apps (APK)'; + @override + String get excludeSystemApps => 'System-Apps ausschließen'; + @override + String get excludeAppsWithoutLaunchIntent => 'Nicht-startbare Apps ausschließen'; + @override + String apps({required Object n}) => '${n} Apps'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$de extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Alle löschen'; +} + +// Path: receivePage +class _Translations$receivePage$de extends Translations$receivePage$en { + _Translations$receivePage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('de'))( + n, + one: 'möchte dir eine Datei senden', + other: 'möchte dir ${n} Dateien senden', + ); + @override + String get subTitleMessage => 'sendet dir eine Nachricht:'; + @override + String get subTitleLink => 'sendet dir einen Link:'; + @override + String get canceled => 'Der Absender hat die Anfrage abgebrochen.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$de extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Optionen'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend-Ordner)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Aufgrund von Ordnern automatisch ausgeschaltet.'; +} + +// Path: sendPage +class _Translations$sendPage$de extends Translations$sendPage$en { + _Translations$sendPage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Warte auf Antwort…'; + @override + String get rejected => 'Der Empfänger hat die Anfrage abgelehnt.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Der Empfänger ist mit einer anderen Anfrage beschäftigt.'; +} + +// Path: progressPage +class _Translations$progressPage$de extends Translations$progressPage$en { + _Translations$progressPage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Sende Dateien'; + @override + String get titleReceiving => 'Empfange Dateien'; + @override + String get savedToGallery => 'in Fotos gespeichert'; + @override + late final _Translations$progressPage$total$de total = _Translations$progressPage$total$de._(_root); + @override + late final _Translations$progressPage$remainingTime$de remainingTime = _Translations$progressPage$remainingTime$de._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$de extends Translations$webSharePage$en { + _Translations$webSharePage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Per Link teilen'; + @override + String get loading => 'Starte Server…'; + @override + String get stopping => 'Stoppe server…'; + @override + String get error => 'Ein Fehler ist beim Starten des Servers aufgetreten.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('de'))( + n, + one: 'Öffne diesen Link im Browser:', + other: 'Öffne einer dieser Links im Browser:', + ); + @override + String get requests => 'Anfragen'; + @override + String get noRequests => 'Bisher keine Anfragen erhalten.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Anfragen automatisch akzeptieren'; + @override + String get requirePin => 'PIN erforderlich'; + @override + String pinHint({required Object pin}) => 'Die PIN lautet "${pin}"'; + @override + String get encryptionHint => 'LocalSend verwendet ein selbstsigniertes Zertifikat. Du musst es im Browser akzeptieren.'; + @override + String pendingRequests({required Object n}) => 'Offene Anfragen: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$de extends Translations$aboutPage$en { + _Translations$aboutPage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Über LocalSend'; + @override + List get description => [ + 'LocalSend ist eine kostenlose Open-Source-App, mit der du Dateien und Nachrichten sicher über dein lokales Netzwerk mit Geräten in der Nähe teilen kannst, ohne dass eine Internetverbindung erforderlich ist.', + 'Diese App ist für Android, iOS, macOS, Windows und Linux verfügbar. Alle Downloadmöglichkeiten findest du auf der offiziellen Homepage.', + ]; + @override + String get author => 'Autor'; + @override + String get contributors => 'Mitwirkende'; + @override + String get packagers => 'Paketierende'; + @override + String get translators => 'Übersetzende'; +} + +// Path: donationPage +class _Translations$donationPage$de extends Translations$donationPage$en { + _Translations$donationPage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Spenden'; + @override + String get info => + 'LocalSend ist kostenlos, quelloffen und frei von Werbung. Wenn dir diese App gefällt, kannst du die Entwicklung mit einer Spende unterstützen.'; + @override + String donate({required Object amount}) => 'Spende ${amount}'; + @override + String get thanks => 'Vielen Dank für deine Unterstützung!'; + @override + String get restore => 'Käufe wiederherstellen'; +} + +// Path: changelogPage +class _Translations$changelogPage$de extends Translations$changelogPage$en { + _Translations$changelogPage$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Änderungsprotokoll'; +} + +// Path: dialogs +class _Translations$dialogs$de extends Translations$dialogs$en { + _Translations$dialogs$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$de addFile = _Translations$dialogs$addFile$de._(_root); + @override + late final _Translations$dialogs$openFile$de openFile = _Translations$dialogs$openFile$de._(_root); + @override + late final _Translations$dialogs$addressInput$de addressInput = _Translations$dialogs$addressInput$de._(_root); + @override + late final _Translations$dialogs$cancelSession$de cancelSession = _Translations$dialogs$cancelSession$de._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$de cannotOpenFile = _Translations$dialogs$cannotOpenFile$de._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$de encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$de._(_root); + @override + late final _Translations$dialogs$errorDialog$de errorDialog = _Translations$dialogs$errorDialog$de._(_root); + @override + late final _Translations$dialogs$favoriteDialog$de favoriteDialog = _Translations$dialogs$favoriteDialog$de._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$de favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$de._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$de favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$de._(_root); + @override + late final _Translations$dialogs$fileInfo$de fileInfo = _Translations$dialogs$fileInfo$de._(_root); + @override + late final _Translations$dialogs$fileNameInput$de fileNameInput = _Translations$dialogs$fileNameInput$de._(_root); + @override + late final _Translations$dialogs$historyClearDialog$de historyClearDialog = _Translations$dialogs$historyClearDialog$de._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$de localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$de._(_root); + @override + late final _Translations$dialogs$messageInput$de messageInput = _Translations$dialogs$messageInput$de._(_root); + @override + late final _Translations$dialogs$noFiles$de noFiles = _Translations$dialogs$noFiles$de._(_root); + @override + late final _Translations$dialogs$noPermission$de noPermission = _Translations$dialogs$noPermission$de._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$de notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$de._(_root); + @override + late final _Translations$dialogs$qr$de qr = _Translations$dialogs$qr$de._(_root); + @override + late final _Translations$dialogs$quickActions$de quickActions = _Translations$dialogs$quickActions$de._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$de quickSaveNotice = _Translations$dialogs$quickSaveNotice$de._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$de quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$de._(_root); + @override + late final _Translations$dialogs$pin$de pin = _Translations$dialogs$pin$de._(_root); + @override + late final _Translations$dialogs$sendModeHelp$de sendModeHelp = _Translations$dialogs$sendModeHelp$de._(_root); + @override + late final _Translations$dialogs$zoom$de zoom = _Translations$dialogs$zoom$de._(_root); +} + +// Path: sanitization +class _Translations$sanitization$de extends Translations$sanitization$en { + _Translations$sanitization$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Dateiname darf nicht leer sein'; + @override + String get invalid => 'Dateiname enthält ungültige Zeichen'; +} + +// Path: tray +class _Translations$tray$de extends Translations$tray$en { + _Translations$tray$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'LocalSend beenden'; + @override + String get closeWindows => 'Beenden'; +} + +// Path: web +class _Translations$web$de extends Translations$web$en { + _Translations$web$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'PIN eingeben'; + @override + String get invalidPin => 'Ungültige PIN'; + @override + String get tooManyAttempts => 'Zu viele Versuche'; + @override + String get rejected => 'Abgelehnt'; + @override + String get files => 'Dateien'; + @override + String get fileName => 'Dateiname'; + @override + String get size => 'Größe'; +} + +// Path: assetPicker +class _Translations$assetPicker$de extends Translations$assetPicker$en { + _Translations$assetPicker$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Bestätigen'; + @override + String get cancel => 'Abbrechen'; + @override + String get edit => 'Bearbeiten'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Ladevorgang ist fehlgeschlagen'; + @override + String get original => 'Ursprung'; + @override + String get preview => 'Vorschau'; + @override + String get select => 'Auswählen'; + @override + String get emptyList => 'Leere Liste'; + @override + String get unSupportedAssetType => 'Format ist nicht unterstützt.'; + @override + String get unableToAccessAll => 'Zugriff nicht möglich'; + @override + String get viewingLimitedAssetsTip => 'Zeige nur Dateien und Alben an, auf die die App zugreifen kann.'; + @override + String get changeAccessibleLimitedAssets => 'Tippen, um erlaubte Dateien zu aktualisieren'; + @override + String get accessAllTip => + 'Die App kann nur auf einige der Dateien auf dem Gerät zugreifen. Öffne die Systemeinstellungen und erlaube der App, auf alle Dateien auf dem Gerät zuzugreifen.'; + @override + String get goToSystemSettings => 'Gehe zu den Systemeinstellungen'; + @override + String get accessLimitedAssets => 'Fahre mit eingeschränktem Zugriff fort'; + @override + String get accessiblePathName => 'Verfügbare Assets'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Bild'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Andere Medien'; + @override + String get sActionPlayHint => 'Abspielen'; + @override + String get sActionPreviewHint => 'Vorschau'; + @override + String get sActionSelectHint => 'Auswählen'; + @override + String get sActionSwitchPathLabel => 'Dateipfad ändern'; + @override + String get sActionUseCameraHint => 'Kamera benutzen'; + @override + String get sNameDurationLabel => 'Dauer'; + @override + String get sUnitAssetCountLabel => 'Anzahl'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$de extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Alias:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$de extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Favoriten'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$de extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Auswahl'; + @override + String files({required Object files}) => 'Dateien: ${files}'; + @override + String size({required Object size}) => 'Größe: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$de extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get file => 'Datei'; + @override + String get folder => 'Ordner'; + @override + String get media => 'Medien'; + @override + String get text => 'Text'; + @override + String get app => 'App'; + @override + String get clipboard => 'Ablage'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$de extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get single => 'Einzelner Empfänger'; + @override + String get multiple => 'Mehrere Empfänger'; + @override + String get link => 'Per Link teilen'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$de extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Allgemein'; + @override + String get brightness => 'Helligkeit'; + @override + late final _Translations$settingsTab$general$brightnessOptions$de brightnessOptions = _Translations$settingsTab$general$brightnessOptions$de._( + _root, + ); + @override + String get color => 'Farbe'; + @override + late final _Translations$settingsTab$general$colorOptions$de colorOptions = _Translations$settingsTab$general$colorOptions$de._(_root); + @override + String get language => 'Sprache'; + @override + late final _Translations$settingsTab$general$languageOptions$de languageOptions = _Translations$settingsTab$general$languageOptions$de._(_root); + @override + String get saveWindowPlacement => 'Beenden: Fensterposition speichern'; + @override + String get saveWindowPlacementWindows => 'Beenden: Fensterposition speichern'; + @override + String get minimizeToTray => 'Beenden: in Symbolleiste minimieren'; + @override + String get launchAtStartup => 'Autostart nach Login'; + @override + String get launchMinimized => 'Autostart: versteckt starten'; + @override + String get showInContextMenu => 'LocalSend im Kontextmenü anzeigen'; + @override + String get animations => 'Animationen'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$de extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Empfangen'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Autom. beenden'; + @override + String get destination => 'Ziel-Ordner'; + @override + String get downloads => '(Downloads)'; + @override + String get saveToGallery => 'Medien in die Galerie speichern'; + @override + String get saveToHistory => 'In Verlauf speichern'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$de extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Senden'; + @override + String get shareViaLinkAutoAccept => 'Link teilen: Autom. akzeptieren'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$de extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Netzwerk'; + @override + String get needRestart => 'Starte den Server neu, um die Änderungen zu übernehmen!'; + @override + String get server => 'Server'; + @override + String get alias => 'Alias'; + @override + String get deviceType => 'Gerätetyp'; + @override + String get deviceModel => 'Gerätemodell'; + @override + String get port => 'Port'; + @override + String get network => 'Netzwerk'; + @override + late final _Translations$settingsTab$network$networkOptions$de networkOptions = _Translations$settingsTab$network$networkOptions$de._(_root); + @override + String get discoveryTimeout => 'Erkennungs-Timeout'; + @override + String get useSystemName => 'Systemnamen verwenden'; + @override + String get generateRandomAlias => 'Zufälligen Alias generieren'; + @override + String portWarning({required Object defaultPort}) => + 'Möglicherweise wirst du von anderen Geräten nicht erkannt, weil du einen benutzerdefinierten Port verwendest. (Standard: ${defaultPort})'; + @override + String get encryption => 'Verschlüsselung'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Möglicherweise wirst du von anderen Geräten nicht erkannt, weil du eine benutzerdefinierte Multicast-Adresse verwendest. (Standard: ${defaultMulticast})'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$de extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Weitere'; + @override + String get support => 'LocalSend unterstützen'; + @override + String get donate => 'Spenden'; + @override + String get privacyPolicy => 'Datenschutzerklärung'; + @override + String get termsOfUse => 'Nutzungsbedingungen'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$de extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Diese App kann Dateien an andere Geräte senden, aber nicht umgekehrt.'; + @override + String solution({required Object port}) => + 'Dies ist höchstwahrscheinlich ein Firewall-Problem. Du kannst es lösen, indem du eingehende Verbindungen (UDP und TCP) auf Port ${port} zulässt.'; + @override + String get openFirewall => 'Firewall öffnen'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$de extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Dieses Gerät kann keine anderen Geräte entdecken.'; + @override + String get solution => + 'Stelle sicher, dass alle Geräte im selben Wi-Fi-Netzwerk sind und die gleiche Konfiguration teilen (Port, Multicast-Adresse, Verschlüsselung). Du kannst versuchen, die IP-Adresse des Zielgeräts manuell einzugeben. Wenn dies funktioniert, füge dieses Gerät zu den Favoriten hinzu, damit es in Zukunft automatisch entdeckt werden kann.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$de extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Beide Geräte können sich weder sehen noch können sie Dateien miteinander teilen.'; + @override + String get solution => + 'Das Problem tritt auf beiden Seiten auf? Dann stelle sicher, dass beide Geräte im selben WLAN sind sowie dieselbe Konfiguration (Port, Multicast-Adresse, Verschlüsselung) haben. Es kann sein, dass das WLAN keine Kommunikation zwischen Teilnehmern erlaubt (AP-Isolation). In diesem Fall muss am Router diese Option aktiviert werden.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$de extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get open => 'Datei öffnen'; + @override + String get showInFolder => 'Im Ordner anzeigen'; + @override + String get info => 'Information'; + @override + String get deleteFromHistory => 'Vom Verlauf entfernen'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$de extends Translations$progressPage$total$en { + _Translations$progressPage$total$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$de title = _Translations$progressPage$total$title$de._(_root); + @override + String count({required Object curr, required Object n}) => 'Dateien: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Größe: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Geschwindigkeit: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$de extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Benutze 'h' als Abkürzung für Stunden und 'm' für Minuten + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Benutze 'd' für Tage, 'h' für Stunden und 'm' für Minuten + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$de extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Zur Auswahl hinzufügen'; + @override + String get content => 'Was möchtest du zum Senden hinzufügen?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$de extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Datei öffnen'; + @override + String get content => 'Möchtest du die empfangene Datei öffnen?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$de extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Adresse eingeben'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP-Adresse'; + @override + String get recentlyUsed => 'Zuletzt verwendet: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$de extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dateiübertragung abbrechen'; + @override + String get content => 'Möchtest du wirklich die Dateiübertragung abbrechen?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$de extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Öffnen fehlgeschlagen'; + @override + String content({required Object file}) => + 'Die Datei "${file}" konnte nicht geöffnet werden. Wurde diese Datei verschoben, umbenannt oder gelöscht?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$de extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Verschlüsselung deaktiviert'; + @override + String get content => + 'Die Kommunikation erfolgt nun über das unverschlüsselte HTTP-Protokoll. Um HTTPS zu verwenden, aktiviere wieder die Verschlüsselung.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$de extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$de extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favoriten'; + @override + String get noFavorites => 'Keine Favoriten konfiguriert.'; + @override + String get addFavorite => 'Neu'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$de extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favorit löschen'; + @override + String content({required Object name}) => 'Möchtest du wirklich "${name}" löschen?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$de extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Favorit hinzufügen'; + @override + String get titleEdit => 'Favorit bearbeiten'; + @override + String get name => 'Name'; + @override + String get auto => '(auto)'; + @override + String get ip => 'IP-Adresse'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$de extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Datei-Information'; + @override + String get fileName => 'Dateiname:'; + @override + String get path => 'Pfad:'; + @override + String get size => 'Größe:'; + @override + String get sender => 'Absender:'; + @override + String get time => 'Zeit:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$de extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dateiname eingeben'; + @override + String original({required Object original}) => 'Original: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$de extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Verlauf löschen'; + @override + String get content => 'Möchtest du wirklich den gesamten Verlauf löschen?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$de extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend kann nicht auf das lokale Netzwerk zugreifen. Bitte erlaube LocalSend den Zugriff auf das lokale Netzwerk in den Einstellungen.'; + @override + String get gotoSettings => 'Einstellungen'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$de extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nachricht eingeben'; + @override + String get multiline => 'Mehrzeilig'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$de extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Keine Datei ausgewählt'; + @override + String get content => 'Bitte wähle mindestens eine Datei aus.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$de extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Keine Berechtigung'; + @override + String get content => 'Du hast die erforderlichen Berechtigungen nicht gewährt. Bitte gewähre sie in den Einstellungen.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$de extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nicht verfügbar'; + @override + String get content => 'Diese Funktion ist nur verfügbar auf:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$de extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR-Code'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$de extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Quick Actions'; + @override + String get counter => 'Zähler'; + @override + String get prefix => 'Prefix'; + @override + String get padZero => 'Mit Nullen auffüllen'; + @override + String get sortBeforeCount => 'Vorher alphabetisch sortieren'; + @override + String get random => 'Zufall'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$de extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Dateianfragen werden automatisch akzeptiert. Beachte, dass jeder im lokalen Netzwerk dir Dateien senden kann.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$de extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Dateianfragen werden jetzt automatisch von Geräten in deiner Favoritenliste akzeptiert.', + 'Warnung: Dies ist derzeit nicht vollständig sicher, da ein Hacker, der den Fingerabdruck der Geräte in deiner Favoritenliste kennt, dir immer noch Dateien senden kann.', + 'Diese Option ist jedoch immer noch sicherer als die Erlaubnis für jedes Gerät.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$de extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'PIN eingeben'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$de extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sendemodus'; + @override + String get single => 'Sende Dateien an einen Empfänger. Die Auswahl wird nach Abschluss der Dateiübertragung gelöscht.'; + @override + String get multiple => 'Sende Dateien an mehrere Empfänger. Die Auswahl bleibt erhalten.'; + @override + String get link => + 'Empfänger, die LocalSend nicht installiert haben, können die ausgewählten Dateien herunterladen, in dem sie den Link im Browser öffnen.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$de extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$de extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; + @override + String get dark => 'Dunkel'; + @override + String get light => 'Hell'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$de extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$de extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$de extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String get all => 'Alle'; + @override + String get filtered => 'Gefiltert'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$de extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$de._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Gesamtfortschritt (${time})'; + @override + String get finishedError => 'Abgeschlossen mit Fehler'; + @override + String get canceledSender => 'Abgebrochen durch Absender'; + @override + String get canceledReceiver => 'Abgebrochen durch Empfänger'; +} diff --git a/app/lib/gen/strings_el.g.dart b/app/lib/gen/strings_el.g.dart new file mode 100644 index 0000000..36a0743 --- /dev/null +++ b/app/lib/gen/strings_el.g.dart @@ -0,0 +1,1501 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsEl extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsEl({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.el, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsEl _root = this; // ignore: unused_field + + @override + TranslationsEl $copyWith({TranslationMetadata? meta}) => TranslationsEl(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Ελληνικά'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$el general = _Translations$general$el._(_root); + @override + late final _Translations$receiveTab$el receiveTab = _Translations$receiveTab$el._(_root); + @override + late final _Translations$sendTab$el sendTab = _Translations$sendTab$el._(_root); + @override + late final _Translations$settingsTab$el settingsTab = _Translations$settingsTab$el._(_root); + @override + late final _Translations$troubleshootPage$el troubleshootPage = _Translations$troubleshootPage$el._(_root); + @override + late final _Translations$receiveHistoryPage$el receiveHistoryPage = _Translations$receiveHistoryPage$el._(_root); + @override + late final _Translations$apkPickerPage$el apkPickerPage = _Translations$apkPickerPage$el._(_root); + @override + late final _Translations$selectedFilesPage$el selectedFilesPage = _Translations$selectedFilesPage$el._(_root); + @override + late final _Translations$receivePage$el receivePage = _Translations$receivePage$el._(_root); + @override + late final _Translations$receiveOptionsPage$el receiveOptionsPage = _Translations$receiveOptionsPage$el._(_root); + @override + late final _Translations$sendPage$el sendPage = _Translations$sendPage$el._(_root); + @override + late final _Translations$progressPage$el progressPage = _Translations$progressPage$el._(_root); + @override + late final _Translations$webSharePage$el webSharePage = _Translations$webSharePage$el._(_root); + @override + late final _Translations$aboutPage$el aboutPage = _Translations$aboutPage$el._(_root); + @override + late final _Translations$donationPage$el donationPage = _Translations$donationPage$el._(_root); + @override + late final _Translations$changelogPage$el changelogPage = _Translations$changelogPage$el._(_root); + @override + late final _Translations$aliasGenerator$el aliasGenerator = _Translations$aliasGenerator$el._(_root); + @override + late final _Translations$dialogs$el dialogs = _Translations$dialogs$el._(_root); + @override + late final _Translations$sanitization$el sanitization = _Translations$sanitization$el._(_root); + @override + late final _Translations$tray$el tray = _Translations$tray$el._(_root); + @override + late final _Translations$web$el web = _Translations$web$el._(_root); + @override + late final _Translations$assetPicker$el assetPicker = _Translations$assetPicker$el._(_root); + @override + late final _Translations$networkInterfacesPage$el networkInterfacesPage = _Translations$networkInterfacesPage$el._(_root); +} + +// Path: general +class _Translations$general$el extends Translations$general$en { + _Translations$general$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Αποδοχή'; + @override + String get accepted => 'Αποδεκτό'; + @override + String get add => 'Προσθήκη'; + @override + String get advanced => 'Προχωρημένες'; + @override + String get cancel => 'Άκυρο'; + @override + String get close => 'Κλείσιμο'; + @override + String get confirm => 'Επιβεβαίωση'; + @override + String get continueStr => 'Συνέχεια'; + @override + String get copy => 'Αντιγραφή'; + @override + String get copiedToClipboard => 'Αντιγράφηκε στο Πρόχειρο'; + @override + String get decline => 'Απόρριψη'; + @override + String get done => 'Έγινε'; + @override + String get delete => 'Διαγραφή'; + @override + String get edit => 'Επεξεργασία'; + @override + String get error => 'Σφάλμα'; + @override + String get example => 'Παράδειγμα'; + @override + String get files => 'Αρχεία'; + @override + String get finished => 'Ολοκληρώθηκε'; + @override + String get hide => 'Απόκρυψη'; + @override + String get off => 'Ανενεργή'; + @override + String get offline => 'Εκτός σύνδεσης'; + @override + String get on => 'Ενεργή'; + @override + String get online => 'Σε σύνδεση'; + @override + String get open => 'Άνοιγμα'; + @override + String get queue => 'Ουρά'; + @override + String get quickSave => 'Γρήγορη Αποθήκευση'; + @override + String get quickSaveFromFavorites => 'Γρήγορη Αποθήκευση των "Αγαπημένων"'; + @override + String get renamed => 'Μετονομάστηκε'; + @override + String get reset => 'Επαναφορά'; + @override + String get restart => 'Επανεκκίνηση'; + @override + String get settings => 'Ρυθμίσεις'; + @override + String get skipped => 'Παράλειψη'; + @override + String get start => 'Έναρξη'; + @override + String get stop => 'Διακοπή'; + @override + String get save => 'Αποθήκευση'; + @override + String get unchanged => 'Χωρίς αλλαγές'; + @override + String get unknown => 'Αγνωστο'; + @override + String get noItemInClipboard => 'Κανένα στοιχείο στο Πρόχειρο.'; +} + +// Path: receiveTab +class _Translations$receiveTab$el extends Translations$receiveTab$en { + _Translations$receiveTab$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Λήψη'; + @override + late final _Translations$receiveTab$infoBox$el infoBox = _Translations$receiveTab$infoBox$el._(_root); + @override + late final _Translations$receiveTab$quickSave$el quickSave = _Translations$receiveTab$quickSave$el._(_root); +} + +// Path: sendTab +class _Translations$sendTab$el extends Translations$sendTab$en { + _Translations$sendTab$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Αποστολή'; + @override + late final _Translations$sendTab$selection$el selection = _Translations$sendTab$selection$el._(_root); + @override + late final _Translations$sendTab$picker$el picker = _Translations$sendTab$picker$el._(_root); + @override + String get shareIntentInfo => + 'Μπορείτε επίσης να χρησιμοποιήσετε τη δυνατότητα "Κοινή χρήση" της κινητής συσκευής σας για να επιλέξετε αρχεία πιο εύκολα.'; + @override + String get nearbyDevices => 'Κοντινές συσκευές'; + @override + String get thisDevice => 'Αυτή η συσκευή'; + @override + String get scan => 'Αναζήτηση για συσκευές'; + @override + String get manualSending => 'Χειροκίνητη αποστολή'; + @override + String get sendMode => 'Λειτουργία αποστολής'; + @override + late final _Translations$sendTab$sendModes$el sendModes = _Translations$sendTab$sendModes$el._(_root); + @override + String get sendModeHelp => 'Επεξήγηση'; + @override + String get help => 'Βεβαιωθείτε ότι ο επιθυμητός παραλήπτης βρίσκεται επίσης στο ίδιο δίκτυο Wi-Fi.'; + @override + String get placeItems => 'Τοποθετήστε στοιχεία για διαμοιρασμό.'; +} + +// Path: settingsTab +class _Translations$settingsTab$el extends Translations$settingsTab$en { + _Translations$settingsTab$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ρυθμίσεις'; + @override + late final _Translations$settingsTab$general$el general = _Translations$settingsTab$general$el._(_root); + @override + late final _Translations$settingsTab$receive$el receive = _Translations$settingsTab$receive$el._(_root); + @override + late final _Translations$settingsTab$send$el send = _Translations$settingsTab$send$el._(_root); + @override + late final _Translations$settingsTab$network$el network = _Translations$settingsTab$network$el._(_root); + @override + late final _Translations$settingsTab$other$el other = _Translations$settingsTab$other$el._(_root); + @override + String get advancedSettings => 'Προχωρημένες ρυθμίσεις'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$el extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Αντιμετώπιση προβλημάτων'; + @override + String get subTitle => 'Αυτή η εφαρμογή δεν λειτουργεί όπως αναμένεται; Εδώ μπορείτε να βρείτε κοινές λύσεις.'; + @override + String get solution => 'Λύση:'; + @override + String get fixButton => 'Αυτόματη διόρθωση'; + @override + late final _Translations$troubleshootPage$firewall$el firewall = _Translations$troubleshootPage$firewall$el._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$el noDiscovery = _Translations$troubleshootPage$noDiscovery$el._(_root); + @override + late final _Translations$troubleshootPage$noConnection$el noConnection = _Translations$troubleshootPage$noConnection$el._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$el extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ιστορικό'; + @override + String get openFolder => 'Άνοιγμα φακέλου'; + @override + String get deleteHistory => 'Διαγραφή ιστορικού'; + @override + String get empty => 'Το ιστορικό είναι κενό.'; + @override + late final _Translations$receiveHistoryPage$entryActions$el entryActions = _Translations$receiveHistoryPage$entryActions$el._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$el extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Εφαρμογές (APK)'; + @override + String get excludeSystemApps => 'Εξαίρεση εφαρμογών συστήματος'; + @override + String get excludeAppsWithoutLaunchIntent => 'Εξαίρεση μη εκκινήσιμων εφαρμογών'; + @override + String apps({required Object n}) => '${n} Εφαρμογές'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$el extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Διαγραφή όλων'; +} + +// Path: receivePage +class _Translations$receivePage$el extends Translations$receivePage$en { + _Translations$receivePage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('el'))( + n, + one: 'θέλει να σου στείλει ένα αρχείο', + other: 'θέλει να σου στείλει ${n} αρχεία', + ); + @override + String get subTitleMessage => 'σου έστειλε ένα μήνυμα:'; + @override + String get subTitleLink => 'σου έστειλε ένα σύνδεσμο:'; + @override + String get canceled => 'Ο αποστολέας ακύρωσε το αίτημα.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$el extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Επιλογές'; + @override + String get appDirectory => '(Φάκελος LocalSend)'; + @override + String get saveToGalleryOff => 'Απενεργοποιήθηκε αυτόματα επειδή υπάρχουν κατάλογοι.'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; +} + +// Path: sendPage +class _Translations$sendPage$el extends Translations$sendPage$en { + _Translations$sendPage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Αναμονή για απάντηση…'; + @override + String get rejected => 'Ο παραλήπτης απέρριψε το αίτημα.'; + @override + String get busy => 'Ο παραλήπτης είναι απασχολημένος με άλλο αίτημα.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; +} + +// Path: progressPage +class _Translations$progressPage$el extends Translations$progressPage$en { + _Translations$progressPage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Γίνεται αποστολή αρχείων'; + @override + String get titleReceiving => 'Γίνεται λήψη αρχείων'; + @override + String get savedToGallery => 'Αποθηκεύτηκε στις Φωτογραφίες'; + @override + late final _Translations$progressPage$total$el total = _Translations$progressPage$total$el._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$el extends Translations$webSharePage$en { + _Translations$webSharePage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Διαμοιρασμός μέσω συνδέσμου'; + @override + String get loading => 'Εκκίνηση διακομιστή…'; + @override + String get stopping => 'Σταμάτημα διακομιστή…'; + @override + String get error => 'Ένα σφάλμα προέκυψε κατά την εκκίνηση του διακομιστή.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('el'))( + n, + one: 'Άνοιγμα αυτού του συνδέσμου στον φυλλομετρητή:', + other: 'Άνοιγμα ενός από αυτούς τους συνδέσμους στον φυλλομετρητή:', + ); + @override + String get requests => 'Αιτήματα'; + @override + String get noRequests => 'Κανένα αίτμηα ακόμα.'; + @override + String get autoAccept => 'Αυτόματη αποδοχή αιτημάτων'; + @override + String get requirePin => 'Απαίτηση PIN'; + @override + String pinHint({required Object pin}) => 'Το PIN είναι "${pin}"'; + @override + String get encryptionHint => 'Το LocalSend χρησιμοποιεί αυτο-υπογεγραμμένο πιστοποιητικό. Χρειάζεται να το αποθεχτείτε στον φυλλομετρητή.'; + @override + String pendingRequests({required Object n}) => 'Αναμονή αιτημάτων: ${n}'; + @override + String get encryption => _root.settingsTab.network.encryption; +} + +// Path: aboutPage +class _Translations$aboutPage$el extends Translations$aboutPage$en { + _Translations$aboutPage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Σχετικά με το LocalSend'; + @override + List get description => [ + 'Το LocalSend είναι μια δωρεάν εφαρμογή ανοιχτού κώδικα που σας επιτρέπει να μοιράζεστε με ασφάλεια αρχεία και μηνύματα με κοντινές συσκευές μέσω του τοπικού σας δικτύου χωρίς να χρειάζεστε σύνδεση στο διαδίκτυο.', + 'Αυτή η εφαρμογή είναι διαθέσιμη σε Android, iOS, macOS, Windows και Linux. Μπορείτε να βρείτε όλες τις επιλογές λήψης στην επίσημη αρχική σελίδα.', + ]; + @override + String get author => 'Δημιουργός'; + @override + String get contributors => 'Συντελεστές'; + @override + String get packagers => 'Συσκευαστές'; + @override + String get translators => 'Μεταφραστές'; +} + +// Path: donationPage +class _Translations$donationPage$el extends Translations$donationPage$en { + _Translations$donationPage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Δωρεά'; + @override + String get info => + 'Το LocalSend είναι δωρεάν, ανοιχτού κώδικα και χωρίς διαφημίσεις. Εάν σας αρέσει η εφαρμογή, μπορείτε να υποστηρίξετε την ανάπτυξή της με μια δωρεά.'; + @override + String donate({required Object amount}) => 'Δωρεά ${amount}'; + @override + String get thanks => 'Ευχαριστούμε πολύ!'; + @override + String get restore => 'Επαναφορά αγοράς'; +} + +// Path: changelogPage +class _Translations$changelogPage$el extends Translations$changelogPage$en { + _Translations$changelogPage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Καταγραφή αλλαγών'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$el extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Λατρευτό', + 'Πανεμορφο', + 'Μεγάλο', + 'Λαμπερό', + 'Ζουμερό', + 'Καλοπροαίρετο', + 'Δροσερό', + 'Χαριτωμένο', + 'Πονηρό', + 'Καταχθώνιο', + 'Ενεργητικό', + 'Αποτελεσματικό', + 'Φανταστικό', + 'Γρήγορο', + 'Ντροπαλό', + 'Φρέσκο', + 'Καλό', + 'Υπέροχο', + 'Εξαιρετικό', + 'Τεμπέλικο', + 'Θερμό', + 'Ψυχρό', + 'Νευρικό', + 'Ήρεμο', + 'Καθαρό', + 'Ομορφο', + 'Υπομονετικο', + 'Αρκετά', + 'Χαρούμενο', + 'Πλούσιο', + 'Μυστικό', + 'Έξυπνο', + 'Ανυπόμονο', + 'Οκνηρό', + 'Νυσταγμένο', + 'Ισχυρό', + 'Τακτοποιημένο', + 'Σοφό', + ]; + @override + List get fruits => [ + 'Μήλο', + 'Αβοκάντο', + 'Μανταρίνι', + 'Βατόμουρο', + 'Σκόρδο', + 'Μπρόκολο', + 'Καρότο', + 'Κεράσι', + 'Μαρούλι', + 'Σταφύλι', + 'Λεμόνι', + 'Λάχανο', + 'Μάνγκο', + 'Πεπόνι', + 'Μανιτάρι', + 'Κρεμμύδι', + 'Πορτοκάλι', + 'Κολοκύθι', + 'Ροδάκινο', + 'Αχλάδι', + 'Καρπούζι', + 'Κάστανο', + 'Πράσο', + 'Ακτινίδιο', + 'Σύκο', + 'Αγγούρι', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$el extends Translations$dialogs$en { + _Translations$dialogs$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$el addFile = _Translations$dialogs$addFile$el._(_root); + @override + late final _Translations$dialogs$openFile$el openFile = _Translations$dialogs$openFile$el._(_root); + @override + late final _Translations$dialogs$addressInput$el addressInput = _Translations$dialogs$addressInput$el._(_root); + @override + late final _Translations$dialogs$cancelSession$el cancelSession = _Translations$dialogs$cancelSession$el._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$el cannotOpenFile = _Translations$dialogs$cannotOpenFile$el._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$el encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$el._(_root); + @override + late final _Translations$dialogs$errorDialog$el errorDialog = _Translations$dialogs$errorDialog$el._(_root); + @override + late final _Translations$dialogs$favoriteDialog$el favoriteDialog = _Translations$dialogs$favoriteDialog$el._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$el favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$el._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$el favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$el._(_root); + @override + late final _Translations$dialogs$fileInfo$el fileInfo = _Translations$dialogs$fileInfo$el._(_root); + @override + late final _Translations$dialogs$fileNameInput$el fileNameInput = _Translations$dialogs$fileNameInput$el._(_root); + @override + late final _Translations$dialogs$historyClearDialog$el historyClearDialog = _Translations$dialogs$historyClearDialog$el._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$el localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$el._(_root); + @override + late final _Translations$dialogs$messageInput$el messageInput = _Translations$dialogs$messageInput$el._(_root); + @override + late final _Translations$dialogs$noFiles$el noFiles = _Translations$dialogs$noFiles$el._(_root); + @override + late final _Translations$dialogs$noPermission$el noPermission = _Translations$dialogs$noPermission$el._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$el notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$el._(_root); + @override + late final _Translations$dialogs$qr$el qr = _Translations$dialogs$qr$el._(_root); + @override + late final _Translations$dialogs$quickActions$el quickActions = _Translations$dialogs$quickActions$el._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$el quickSaveNotice = _Translations$dialogs$quickSaveNotice$el._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$el quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$el._(_root); + @override + late final _Translations$dialogs$pin$el pin = _Translations$dialogs$pin$el._(_root); + @override + late final _Translations$dialogs$sendModeHelp$el sendModeHelp = _Translations$dialogs$sendModeHelp$el._(_root); + @override + late final _Translations$dialogs$zoom$el zoom = _Translations$dialogs$zoom$el._(_root); +} + +// Path: sanitization +class _Translations$sanitization$el extends Translations$sanitization$en { + _Translations$sanitization$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Το όνομα του αρχείου δεν μπορεί να είναι κενό'; + @override + String get invalid => 'Το όνομα του αρχείου περιέχει μη έγκυρους χαρακτήρες'; +} + +// Path: tray +class _Translations$tray$el extends Translations$tray$en { + _Translations$tray$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Έξοδος από το LocalSend'; + @override + String get closeWindows => 'Έξοδος'; +} + +// Path: web +class _Translations$web$el extends Translations$web$en { + _Translations$web$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Εισαγωγή PIN'; + @override + String get invalidPin => 'Μη έγκυρο PIN'; + @override + String get tooManyAttempts => 'Πάρα πολλές προσπάθειες'; + @override + String get rejected => 'Απορρίφθηκε'; + @override + String get files => 'Αρχεία'; + @override + String get fileName => 'Όνομα αρχείου'; + @override + String get size => 'Μέγεθος'; +} + +// Path: assetPicker +class _Translations$assetPicker$el extends Translations$assetPicker$en { + _Translations$assetPicker$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Επιβεβαιώση'; + @override + String get cancel => 'Ακύρωση'; + @override + String get edit => 'Επεξεργασία'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Η φόρτωση απέτυχε'; + @override + String get original => 'Προέλευση'; + @override + String get preview => 'Προεπισκόπηση'; + @override + String get select => 'Επιλογή'; + @override + String get emptyList => 'Κενή λίστα'; + @override + String get unSupportedAssetType => 'Μη υποστηριζόμενος τύπος αρχείου.'; + @override + String get unableToAccessAll => 'Δεν είναι δυνατή η πρόσβαση σε όλα τα αρχεία της συσκευής'; + @override + String get viewingLimitedAssetsTip => 'Προβολή μόνο των αρχείων και άλμπουμ που είναι προσβάσιμα από την εφαρμογή.'; + @override + String get changeAccessibleLimitedAssets => 'Κάντε κλικ για ενημέρωση των προσβάσιμων αρχείων'; + @override + String get accessAllTip => + 'Η εφαρμογή μπορεί να έχει πρόσβαση μόνο σε ορισμένα αρχεία στη συσκευή. Μεταβείτε στις ρυθμίσεις συστήματος και επιτρέψτε στην εφαρμογή να έχει πρόσβαση σε όλα τα μέσα της συσκευής.'; + @override + String get goToSystemSettings => 'Μεταβείτε στις ρυθμίσεις συστήματος'; + @override + String get accessLimitedAssets => 'Συνεχίστε με περιορισμένη πρόσβαση'; + @override + String get accessiblePathName => 'Προσβάσιμα αρχεία'; + @override + String get sTypeAudioLabel => 'Ήχος'; + @override + String get sTypeImageLabel => 'Εικόνα'; + @override + String get sTypeVideoLabel => 'Βίντεο'; + @override + String get sTypeOtherLabel => 'Άλλα μέσα'; + @override + String get sActionPlayHint => 'αναπαραγωγή'; + @override + String get sActionPreviewHint => 'προεπισκόπηση'; + @override + String get sActionSelectHint => 'επιλογή'; + @override + String get sActionSwitchPathLabel => 'αλλαγή μονοπατιού'; + @override + String get sActionUseCameraHint => 'χρήση κάμερας'; + @override + String get sNameDurationLabel => 'διάρκεια'; + @override + String get sUnitAssetCountLabel => 'μετρητής'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$el extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get info => + 'Από προεπιλογή, το LocalSend χρησιμοποιεί όλες τις διαθέσιμες διεπαφές δικτύου. Μπορείτε να εξαιρέσετε τα ανεπιθύμητα δίκτυα εδώ. Πρέπει να κάνετε επανεκκίνηση του διακομιστή για να εφαρμόσετε τις αλλαγές.'; + @override + String get title => 'Διεπαφές δικτύου'; + @override + String get preview => 'Προεπισκόπηση'; + @override + String get whitelist => 'Λευκή λίστα'; + @override + String get blacklist => 'Μαύρη λίστα'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$el extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Θύρα:'; + @override + String get alias => 'Όνομα συσκευής:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$el extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Αγαπημένα'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$el extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Επιλογή'; + @override + String files({required Object files}) => 'Αρχεία: ${files}'; + @override + String size({required Object size}) => 'Μέγεθος: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$el extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get file => 'Αρχείο'; + @override + String get folder => 'Φάκελος'; + @override + String get media => 'Μέσα'; + @override + String get text => 'Κείμενο'; + @override + String get app => 'Εφαρμογή'; + @override + String get clipboard => 'Επικόλληση'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$el extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get single => 'Ένας παραλήπτης'; + @override + String get multiple => 'Πολλαπλοί παραλήπτες'; + @override + String get link => 'Διαμοιρασμός μέσω συνδέσμου'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$el extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Γενικά'; + @override + String get brightness => 'Θέμα'; + @override + late final _Translations$settingsTab$general$brightnessOptions$el brightnessOptions = _Translations$settingsTab$general$brightnessOptions$el._( + _root, + ); + @override + String get color => 'Χρώμα'; + @override + late final _Translations$settingsTab$general$colorOptions$el colorOptions = _Translations$settingsTab$general$colorOptions$el._(_root); + @override + String get language => 'Γλώσσα'; + @override + late final _Translations$settingsTab$general$languageOptions$el languageOptions = _Translations$settingsTab$general$languageOptions$el._(_root); + @override + String get saveWindowPlacement => 'Έξοδος: Αποθήκευση θέσης παραθύρου'; + @override + String get saveWindowPlacementWindows => 'Αποθήκευση της θέσης του παραθύρου κατά την έξοδο'; + @override + String get minimizeToTray => 'Έξοδος: Ελαχιστοποίηση στη γραμμή εργασιών/μενού'; + @override + String get launchAtStartup => 'Αυτόματη εκκίνηση μετά τη σύνδεση'; + @override + String get launchMinimized => 'Αυτόματη εκκίνηση: Έναρξη ελαχιστοποιημένο'; + @override + String get showInContextMenu => 'Προβολή του LocalSend στο μενού του περιβάλλοντος εργασίας'; + @override + String get animations => 'Οπτικά εφέ'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$el extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Λήψη'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Αυτόματη ολοκλήρωση'; + @override + String get destination => 'Προορισμός'; + @override + String get downloads => '(Λήψεις)'; + @override + String get saveToGallery => 'Αποθήκευση μέσου στη συλλογή'; + @override + String get saveToHistory => 'Αποθήκευση στο ιστορικό'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$el extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Αποστολή'; + @override + String get shareViaLinkAutoAccept => 'Κοινοποίηση μέσω συνδέσμου: Αυτόματη αποδοχή'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$el extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Δίκτυο'; + @override + String get needRestart => 'Κάντε επανεκκίνηση του διακομιστή για να εφαρμοστούν οι ρυθμίσεις!'; + @override + String get server => 'Διακομιστής'; + @override + String get alias => 'Όνομα συσκευής'; + @override + String get deviceType => 'Τύπος συσκευής'; + @override + String get deviceModel => 'Μοντέλο συσκευής'; + @override + String get port => 'Θύρα'; + @override + String get discoveryTimeout => 'Λήξη χρόνου ανακάλυψης'; + @override + String get useSystemName => 'Χρήση του ονόματος του συστήματος'; + @override + String get generateRandomAlias => 'Δημιουργία τυχαίου ψευδώνυμου'; + @override + String portWarning({required Object defaultPort}) => + 'Ενδέχεται να μην εντοπιστείτε από άλλες συσκευές επειδή χρησιμοποιείτε μια προσαρμοσμένη θύρα. (προεπιλογή: ${defaultPort})'; + @override + String get encryption => 'Κρυπτογράφηση'; + @override + String get multicastGroup => 'Αναμετάδοση'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Ενδέχεται να μην εντοπιστείτε από άλλες συσκευές επειδή χρησιμοποιείτε μια προσαρμοσμένη διεύθυνση αναμετάδοσης. (προεπιλογή: ${defaultMulticast})'; + @override + String get network => 'Δίκτυο'; + @override + late final _Translations$settingsTab$network$networkOptions$el networkOptions = _Translations$settingsTab$network$networkOptions$el._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$el extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Άλλα'; + @override + String get support => 'Υποστηρίξτε το LocalSend'; + @override + String get donate => 'Δωρεά'; + @override + String get privacyPolicy => 'Πολιτική Απορρήτου'; + @override + String get termsOfUse => 'Όροι Χρήσης'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$el extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get symptom => + 'Αυτή η εφαρμογή μπορεί να στείλει αρχεία σε άλλες συσκευές, αλλά άλλες συσκευές δεν μπορούν να στείλουν αρχεία σε αυτήν τη συσκευή.'; + @override + String solution({required Object port}) => + 'Αυτό είναι πιθανότατα ένα ζήτημα του τείχους προστασίας. Μπορείτε να το λύσετε επιτρέποντας τις εισερχόμενες συνδέσεις (UDP και TCP) στη θύρα ${port}.'; + @override + String get openFirewall => 'Άνοιγμα Τείχους Προστασίας'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$el extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Αυτή η συσκευή δεν μπορεί ανακαλυφθεί από άλλες συσεκυές.'; + @override + String get solution => + 'Βεβαιωθείτε ότι όλες οι συσκευές βρίσκονται στο ίδιο δίκτυο Wi-Fi και μοιράζονται την ίδια διαμόρφωση (θύρα, διεύθυνση multicast, κρυπτογράφηση). Μπορείτε να προσπαθήσετε να πληκτρολογήσετε τη διεύθυνση IP της συσκευής προορισμού με μη αυτόματο τρόπο. Εάν αυτό λειτουργεί, εξετάστε το ενδεχόμενο να προσθέσετε αυτήν τη συσκευή στα αγαπημένα, ώστε να μπορεί να ανακαλυφθεί αυτόματα στο μέλλον.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$el extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Και οι δύο συσκευές δεν μπορούν να ανακαλύψουν η μία την άλλη ούτε μπορούν να μοιραστούν αρχεία.'; + @override + String get solution => + 'Υπάρχει το πρόβλημα και από τις δύο πλευρές; Πρέπει να βεβαιωθείτε ότι και οι δύο συσκευές βρίσκονται στο ίδιο δίκτυο Wi-Fi και μοιράζονται την ίδια διαμόρφωση (θύρα, διεύθυνση αναμετάδοσης, κρυπτογράφηση). Το wifi ενδέχεται να μην επιτρέπει την επικοινωνία μεταξύ των συμμετεχόντων. Σε αυτήν την περίπτωση, αυτή η επιλογή πρέπει να είναι ενεργοποιημένη στο δρομολογητή.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$el extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get open => 'Άνοιγμα αρχείου'; + @override + String get showInFolder => 'Προβολή στον φάκελο'; + @override + String get info => 'Πληροφορίες'; + @override + String get deleteFromHistory => 'Διαγραφή από το ιστορικό'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$el extends Translations$progressPage$total$en { + _Translations$progressPage$total$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$el title = _Translations$progressPage$total$title$el._(_root); + @override + String count({required Object curr, required Object n}) => 'Αρχεία: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Μέγεθος: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Ταχύτητα: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$el extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Προσθήκη στις επιλογές'; + @override + String get content => 'Τι θέλετε να προστεθεί;'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$el extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Άνοιγμα αρχείου'; + @override + String get content => 'Θέλετε να ανοιχτεί το ληφθέν αρχείο;'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$el extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Εισαγωγή διεύθυνσης'; + @override + String get ip => 'Διεύθυνση IP'; + @override + String get recentlyUsed => 'Χρησιμοποιήθηκε πρόσφατα: '; + @override + String get hashtag => 'Χάσταγκ'; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$el extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ακύρωση της μεταφοράς του αρχείου'; + @override + String get content => 'Θέλετε σίγουρα να ακυρωθεί η μεταφορά του αρχείου?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$el extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Δεν μπορεί να ανοιχτεί το αρχείο'; + @override + String content({required Object file}) => 'Δεν μπορεί να ανοιχτεί το "${file}". Έχετε μήπως μετακινήσει, μενονομάσει ή διαγράψει το αρχείο;'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$el extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Η κρυπτογράφηση απενεργοποιήθηκε'; + @override + String get content => + 'Η επικοινωνία πραγματοποιείται πλέον μέσω του μη κρυπτογραφημένου πρωτοκόλλου HTTP. Για να χρησιμοποιήσετε το HTTPS, ενεργοποιήστε ξανά την κρυπτογράφηση.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$el extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$el extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Αγαπημένα'; + @override + String get noFavorites => 'Καμία αγαπημένη συσκευή προς το παρόν.'; + @override + String get addFavorite => 'Προσθήκη'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$el extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Διαγραφή από τα αγαπημένα'; + @override + String content({required Object name}) => 'Θέλετε σίγουρα να διαγραφεί από τα αγαπημένα το "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$el extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Προσθήκη στα αγαπημένα'; + @override + String get titleEdit => 'Ρυθμίσεις'; + @override + String get name => 'Όνομα συσκευής'; + @override + String get auto => '(αυτόματα)'; + @override + String get ip => 'Διεύθυνση IP'; + @override + String get port => 'Θύρα'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$el extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Πληροφορίες αρχείου'; + @override + String get fileName => 'Όνομα αρχείου:'; + @override + String get path => 'Μονοπάτι:'; + @override + String get size => 'Μέγεθος:'; + @override + String get sender => 'Αποστολέας:'; + @override + String get time => 'Ώρα:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$el extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Εισάγετε το όνομα του αρχείου'; + @override + String original({required Object original}) => 'Πρωτότυπο: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$el extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Καθαρισμός ιστορικού'; + @override + String get content => 'Θέλετε σίγουρα να διαγράψετε όλο το ιστορικό;'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$el extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'Το LocalSend δεν μπορεί να βρει άλλες συσκευές χωρίς την άδεια σάρωσης του τοπικού δικτύου. Παρακαλείστε να παραχωρήσετε αυτό το δικαίωμα στις ρυθμίσεις.'; + @override + String get gotoSettings => 'Ρυθμίσεις'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$el extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Πληκτρολογήστε το μήνυμα'; + @override + String get multiline => 'Πολλαπλών γραμμών'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$el extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Κανένα αρχείο δεν επιλέχθηκε'; + @override + String get content => 'Παρακαλώ επιλέξτε τουλάχιστον ένα αρχείο.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$el extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Χωρίς άδεια'; + @override + String get content => 'Δεν έχετε παραχωρήσει τις απαραίτητες άδειες. Παρακαλώ παραχωρήστε τα στις ρυθμίσεις.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$el extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Μη διαθέσιμο'; + @override + String get content => 'Αυτό το χαρακτηριστικό είναι διαθέσιμο μόνο σε:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$el extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Κώδικας QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$el extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Γρήγορες Ενέργειες'; + @override + String get counter => 'Μετρητής'; + @override + String get prefix => 'Πρόθεμα'; + @override + String get padZero => 'Συμπλήρωση με μηδενικά'; + @override + String get sortBeforeCount => 'Ταξινόμηση αλφαβητικά εκ των προτέρων'; + @override + String get random => 'Τυχαία'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$el extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get content => 'Τα αιτήματα αρχείων γίνονται αυτόματα δεκτά. Έχετε υπόψη σας ότι όλοι στο τοπικό δίκτυο μπορούν να σας στείλουν αρχεία.'; + @override + String get title => _root.general.quickSave; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$el extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + List get content => [ + 'Τα αιτήματα αρχείων γίνονται τώρα αυτόματα αποδεκτά από τις συσκευές της λίστας των αγαπημένων σας.', + 'Προειδοποίηση! Επί του παρόντος, αυτό δεν είναι απολύτως ασφαλές, ένας χάκερ που έχει το δακτυλικό αποτύπωμα οποιασδήποτε συσκευής από τη λίστα των αγαπημένων σας μπορεί να σας στείλει αρχεία χωρίς περιορισμό.', + 'Ωστόσο, αυτή η επιλογή είναι ακόμα πιο ασφαλής από το να επιτρέπεται σε όλους τους χρήστες στο τοπικό δίκτυο να σας στείλουν αρχεία χωρίς περιορισμό.', + ]; + @override + String get title => _root.general.quickSaveFromFavorites; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$el extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Εισαγωγή PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$el extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Λειτουργίες αποστολής'; + @override + String get single => 'Στέλνει αρχεία σε έναν παραλήπτη. Η επιλογή θα διαγραφεί μετά την ολοκλήρωση της μεταφοράς του αρχείου.'; + @override + String get multiple => 'Στέλνει αρχεία σε πολλούς παραλήπτες. Η επιλογή δεν θα διαγραφεί.'; + @override + String get link => + 'Οι παραλήπτες που δεν έχουν εγκαταστήσει το LocalSend μπορούν να πραγματοποιήσουν λήψη των επιλεγμένων αρχείων ανοίγοντας τον σύνδεσμο στον φυλλομετρητή τους.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$el extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$el extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Σύστημα'; + @override + String get dark => 'Σκοτεινό'; + @override + String get light => 'Φωτεινό'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$el extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Σύστημα'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$el extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Σύστημα'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$el extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String get all => 'Όλα'; + @override + String get filtered => 'Περιορισμένο'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$el extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$el._(TranslationsEl root) : this._root = root, super.internal(root); + + final TranslationsEl _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Συνολική πρόοδος (${time})'; + @override + String get finishedError => 'Ολοκληρώθηκε με σφάλμα'; + @override + String get canceledSender => 'Ακυρώθηκε από τον αποστολέα'; + @override + String get canceledReceiver => 'Ακυρώθηκε από τον παραλήπτη'; +} diff --git a/app/lib/gen/strings_en.g.dart b/app/lib/gen/strings_en.g.dart new file mode 100644 index 0000000..d8fb00d --- /dev/null +++ b/app/lib/gen/strings_en.g.dart @@ -0,0 +1,1775 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +part of 'strings.g.dart'; + +// Path: +typedef TranslationsEn = Translations; // ignore: unused_element + +class Translations with BaseTranslations { + /// Returns the current translations of the given [context]. + /// + /// Usage: + /// final t = Translations.of(context); + static Translations of(BuildContext context) => InheritedLocaleData.of(context).translations; + + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + Translations({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.en, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final Translations _root = this; // ignore: unused_field + + Translations $copyWith({TranslationMetadata? meta}) => Translations(meta: meta ?? this.$meta); + + // Translations + + /// en: 'English' + String get locale => 'English'; + + /// en: 'LocalSend' + String get appName => 'LocalSend'; + + late final Translations$general$en general = Translations$general$en.internal(_root); + late final Translations$receiveTab$en receiveTab = Translations$receiveTab$en.internal(_root); + late final Translations$sendTab$en sendTab = Translations$sendTab$en.internal(_root); + late final Translations$settingsTab$en settingsTab = Translations$settingsTab$en.internal(_root); + late final Translations$troubleshootPage$en troubleshootPage = Translations$troubleshootPage$en.internal(_root); + late final Translations$networkInterfacesPage$en networkInterfacesPage = Translations$networkInterfacesPage$en.internal(_root); + late final Translations$receiveHistoryPage$en receiveHistoryPage = Translations$receiveHistoryPage$en.internal(_root); + late final Translations$apkPickerPage$en apkPickerPage = Translations$apkPickerPage$en.internal(_root); + late final Translations$selectedFilesPage$en selectedFilesPage = Translations$selectedFilesPage$en.internal(_root); + late final Translations$receivePage$en receivePage = Translations$receivePage$en.internal(_root); + late final Translations$receiveOptionsPage$en receiveOptionsPage = Translations$receiveOptionsPage$en.internal(_root); + late final Translations$sendPage$en sendPage = Translations$sendPage$en.internal(_root); + late final Translations$progressPage$en progressPage = Translations$progressPage$en.internal(_root); + late final Translations$webSharePage$en webSharePage = Translations$webSharePage$en.internal(_root); + late final Translations$aboutPage$en aboutPage = Translations$aboutPage$en.internal(_root); + late final Translations$donationPage$en donationPage = Translations$donationPage$en.internal(_root); + late final Translations$changelogPage$en changelogPage = Translations$changelogPage$en.internal(_root); + late final Translations$aliasGenerator$en aliasGenerator = Translations$aliasGenerator$en.internal(_root); + late final Translations$dialogs$en dialogs = Translations$dialogs$en.internal(_root); + late final Translations$sanitization$en sanitization = Translations$sanitization$en.internal(_root); + late final Translations$tray$en tray = Translations$tray$en.internal(_root); + late final Translations$web$en web = Translations$web$en.internal(_root); + late final Translations$assetPicker$en assetPicker = Translations$assetPicker$en.internal(_root); +} + +// Path: general +class Translations$general$en { + Translations$general$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Accept' + String get accept => 'Accept'; + + /// en: 'Accepted' + String get accepted => 'Accepted'; + + /// en: 'Add' + String get add => 'Add'; + + /// en: 'Advanced' + String get advanced => 'Advanced'; + + /// en: 'Cancel' + String get cancel => 'Cancel'; + + /// en: 'Close' + String get close => 'Close'; + + /// en: 'Confirm' + String get confirm => 'Confirm'; + + /// en: 'Continue' + String get continueStr => 'Continue'; + + /// en: 'Copy' + String get copy => 'Copy'; + + /// en: 'Copied to Clipboard' + String get copiedToClipboard => 'Copied to Clipboard'; + + /// en: 'Decline' + String get decline => 'Decline'; + + /// en: 'Done' + String get done => 'Done'; + + /// en: 'Delete' + String get delete => 'Delete'; + + /// en: 'Edit' + String get edit => 'Edit'; + + /// en: 'Error' + String get error => 'Error'; + + /// en: 'Example' + String get example => 'Example'; + + /// en: 'Files' + String get files => 'Files'; + + /// en: 'Finished' + String get finished => 'Finished'; + + /// en: 'Hide' + String get hide => 'Hide'; + + /// en: 'Off' + String get off => 'Off'; + + /// en: 'Offline' + String get offline => 'Offline'; + + /// en: 'On' + String get on => 'On'; + + /// en: 'Online' + String get online => 'Online'; + + /// en: 'Open' + String get open => 'Open'; + + /// en: 'Queue' + String get queue => 'Queue'; + + /// en: 'Quick Save' + String get quickSave => 'Quick Save'; + + /// en: 'Quick Save for "Favorites"' + String get quickSaveFromFavorites => 'Quick Save for "Favorites"'; + + /// en: 'Renamed' + String get renamed => 'Renamed'; + + /// en: 'Undo changes' + String get reset => 'Undo changes'; + + /// en: 'Restart' + String get restart => 'Restart'; + + /// en: 'Settings' + String get settings => 'Settings'; + + /// en: 'Skipped' + String get skipped => 'Skipped'; + + /// en: 'Start' + String get start => 'Start'; + + /// en: 'Stop' + String get stop => 'Stop'; + + /// en: 'Save' + String get save => 'Save'; + + /// en: 'Unchanged' + String get unchanged => 'Unchanged'; + + /// en: 'Unknown' + String get unknown => 'Unknown'; + + /// en: 'No items in Clipboard.' + String get noItemInClipboard => 'No items in Clipboard.'; +} + +// Path: receiveTab +class Translations$receiveTab$en { + Translations$receiveTab$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Receive' + String get title => 'Receive'; + + late final Translations$receiveTab$infoBox$en infoBox = Translations$receiveTab$infoBox$en.internal(_root); + late final Translations$receiveTab$quickSave$en quickSave = Translations$receiveTab$quickSave$en.internal(_root); +} + +// Path: sendTab +class Translations$sendTab$en { + Translations$sendTab$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Send' + String get title => 'Send'; + + late final Translations$sendTab$selection$en selection = Translations$sendTab$selection$en.internal(_root); + late final Translations$sendTab$picker$en picker = Translations$sendTab$picker$en.internal(_root); + + /// en: 'You can also use the "Share" feature of your mobile device to select files more easily.' + String get shareIntentInfo => 'You can also use the "Share" feature of your mobile device to select files more easily.'; + + /// en: 'Nearby devices' + String get nearbyDevices => 'Nearby devices'; + + /// en: 'This Device' + String get thisDevice => 'This Device'; + + /// en: 'Search devices' + String get scan => 'Search devices'; + + /// en: 'Manual sending' + String get manualSending => 'Manual sending'; + + /// en: 'Send mode' + String get sendMode => 'Send mode'; + + late final Translations$sendTab$sendModes$en sendModes = Translations$sendTab$sendModes$en.internal(_root); + + /// en: 'Explanation' + String get sendModeHelp => 'Explanation'; + + /// en: 'Please ensure that the desired target is also on the same Wi-Fi network.' + String get help => 'Please ensure that the desired target is also on the same Wi-Fi network.'; + + /// en: 'Place items to share.' + String get placeItems => 'Place items to share.'; +} + +// Path: settingsTab +class Translations$settingsTab$en { + Translations$settingsTab$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Settings' + String get title => 'Settings'; + + late final Translations$settingsTab$general$en general = Translations$settingsTab$general$en.internal(_root); + late final Translations$settingsTab$receive$en receive = Translations$settingsTab$receive$en.internal(_root); + late final Translations$settingsTab$send$en send = Translations$settingsTab$send$en.internal(_root); + late final Translations$settingsTab$network$en network = Translations$settingsTab$network$en.internal(_root); + late final Translations$settingsTab$other$en other = Translations$settingsTab$other$en.internal(_root); + + /// en: 'Advanced settings' + String get advancedSettings => 'Advanced settings'; +} + +// Path: troubleshootPage +class Translations$troubleshootPage$en { + Translations$troubleshootPage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Troubleshoot' + String get title => 'Troubleshoot'; + + /// en: 'Does the app not work as expected? Here you can find some common solutions to problems.' + String get subTitle => 'Does the app not work as expected? Here you can find some common solutions to problems.'; + + /// en: 'Solution:' + String get solution => 'Solution:'; + + /// en: 'Fix automatically' + String get fixButton => 'Fix automatically'; + + late final Translations$troubleshootPage$firewall$en firewall = Translations$troubleshootPage$firewall$en.internal(_root); + late final Translations$troubleshootPage$noDiscovery$en noDiscovery = Translations$troubleshootPage$noDiscovery$en.internal(_root); + late final Translations$troubleshootPage$noConnection$en noConnection = Translations$troubleshootPage$noConnection$en.internal(_root); +} + +// Path: networkInterfacesPage +class Translations$networkInterfacesPage$en { + Translations$networkInterfacesPage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Network Interfaces' + String get title => 'Network Interfaces'; + + /// en: 'By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.' + String get info => + 'By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.'; + + /// en: 'Preview' + String get preview => 'Preview'; + + /// en: 'Whitelist' + String get whitelist => 'Whitelist'; + + /// en: 'Blacklist' + String get blacklist => 'Blacklist'; +} + +// Path: receiveHistoryPage +class Translations$receiveHistoryPage$en { + Translations$receiveHistoryPage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'History' + String get title => 'History'; + + /// en: 'Open folder' + String get openFolder => 'Open folder'; + + /// en: 'Delete history' + String get deleteHistory => 'Delete history'; + + /// en: 'The history is empty.' + String get empty => 'The history is empty.'; + + late final Translations$receiveHistoryPage$entryActions$en entryActions = Translations$receiveHistoryPage$entryActions$en.internal(_root); +} + +// Path: apkPickerPage +class Translations$apkPickerPage$en { + Translations$apkPickerPage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Apps (APK)' + String get title => 'Apps (APK)'; + + /// en: 'Exclude system apps' + String get excludeSystemApps => 'Exclude system apps'; + + /// en: 'Exclude non-launchable apps' + String get excludeAppsWithoutLaunchIntent => 'Exclude non-launchable apps'; + + /// en: '{n} Apps' + String apps({required Object n}) => '${n} Apps'; +} + +// Path: selectedFilesPage +class Translations$selectedFilesPage$en { + Translations$selectedFilesPage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Delete all' + String get deleteAll => 'Delete all'; +} + +// Path: receivePage +class Translations$receivePage$en { + Translations$receivePage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: '(one) {wants to send you a file} (other) {wants to send you {n} files}' + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('en'))( + n, + one: 'wants to send you a file', + other: 'wants to send you ${n} files', + ); + + /// en: 'sent you a message:' + String get subTitleMessage => 'sent you a message:'; + + /// en: 'sent you a link:' + String get subTitleLink => 'sent you a link:'; + + /// en: 'The sender has canceled the request.' + String get canceled => 'The sender has canceled the request.'; +} + +// Path: receiveOptionsPage +class Translations$receiveOptionsPage$en { + Translations$receiveOptionsPage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Options' + String get title => 'Options'; + + /// en: 'Save to folder' + String get destination => _root.settingsTab.receive.destination; + + /// en: '(LocalSend folder)' + String get appDirectory => '(LocalSend folder)'; + + /// en: 'Save media to gallery' + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + + /// en: 'Turned off automatically because there are folders.' + String get saveToGalleryOff => 'Turned off automatically because there are folders.'; +} + +// Path: sendPage +class Translations$sendPage$en { + Translations$sendPage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Waiting for response…' + String get waiting => 'Waiting for response…'; + + /// en: 'The recipient has rejected the request.' + String get rejected => 'The recipient has rejected the request.'; + + /// en: 'Too many attempts' + String get tooManyAttempts => _root.web.tooManyAttempts; + + /// en: 'The recipient is busy with another request.' + String get busy => 'The recipient is busy with another request.'; +} + +// Path: progressPage +class Translations$progressPage$en { + Translations$progressPage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Sending files' + String get titleSending => 'Sending files'; + + /// en: 'Receiving files' + String get titleReceiving => 'Receiving files'; + + /// en: 'Saved in Photos' + String get savedToGallery => 'Saved in Photos'; + + late final Translations$progressPage$total$en total = Translations$progressPage$total$en.internal(_root); + late final Translations$progressPage$remainingTime$en remainingTime = Translations$progressPage$remainingTime$en.internal(_root); +} + +// Path: webSharePage +class Translations$webSharePage$en { + Translations$webSharePage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Share via link' + String get title => 'Share via link'; + + /// en: 'Starting server…' + String get loading => 'Starting server…'; + + /// en: 'Stopping server…' + String get stopping => 'Stopping server…'; + + /// en: 'An error occurred while starting the server.' + String get error => 'An error occurred while starting the server.'; + + /// en: '(one) {Open this link in your browser:} (other) {Open one of these links in your browser:}' + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('en'))( + n, + one: 'Open this link in your browser:', + other: 'Open one of these links in your browser:', + ); + + /// en: 'Requests' + String get requests => 'Requests'; + + /// en: 'No requests yet.' + String get noRequests => 'No requests yet.'; + + /// en: 'Encryption' + String get encryption => _root.settingsTab.network.encryption; + + /// en: 'Automatically accept requests' + String get autoAccept => 'Automatically accept requests'; + + /// en: 'Require PIN' + String get requirePin => 'Require PIN'; + + /// en: 'The PIN is "{pin}"' + String pinHint({required Object pin}) => 'The PIN is "${pin}"'; + + /// en: 'LocalSend uses a self-signed certificate. You need to accept it in your browser.' + String get encryptionHint => 'LocalSend uses a self-signed certificate. You need to accept it in your browser.'; + + /// en: 'Pending requests: {n}' + String pendingRequests({required Object n}) => 'Pending requests: ${n}'; +} + +// Path: aboutPage +class Translations$aboutPage$en { + Translations$aboutPage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'About LocalSend' + String get title => 'About LocalSend'; + + List get description => [ + 'LocalSend is a free, open-source app that allows you to securely share files and messages with nearby devices over your local network without needing an internet connection.', + 'This app is available on Android, iOS, macOS, Windows and Linux. You can find all download options on the official homepage.', + ]; + + /// en: 'Author' + String get author => 'Author'; + + /// en: 'Contributors' + String get contributors => 'Contributors'; + + /// en: 'Packagers' + String get packagers => 'Packagers'; + + /// en: 'Translators' + String get translators => 'Translators'; +} + +// Path: donationPage +class Translations$donationPage$en { + Translations$donationPage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Donate' + String get title => 'Donate'; + + /// en: 'LocalSend is free, open-source and without any ads. If you like the app, you can support the development with a donation.' + String get info => 'LocalSend is free, open-source and without any ads. If you like the app, you can support the development with a donation.'; + + /// en: 'Donate {amount}' + String donate({required Object amount}) => 'Donate ${amount}'; + + /// en: 'Thank you very much!' + String get thanks => 'Thank you very much!'; + + /// en: 'Restore purchase' + String get restore => 'Restore purchase'; +} + +// Path: changelogPage +class Translations$changelogPage$en { + Translations$changelogPage$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Changelog' + String get title => 'Changelog'; +} + +// Path: aliasGenerator +class Translations$aliasGenerator$en { + Translations$aliasGenerator$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + List get adjectives => [ + 'Adorable', + 'Beautiful', + 'Big', + 'Bright', + 'Clean', + 'Clever', + 'Cool', + 'Cute', + 'Cunning', + 'Determined', + 'Energetic', + 'Efficient', + 'Fantastic', + 'Fast', + 'Fine', + 'Fresh', + 'Good', + 'Gorgeous', + 'Great', + 'Handsome', + 'Hot', + 'Kind', + 'Lovely', + 'Mystic', + 'Neat', + 'Nice', + 'Patient', + 'Pretty', + 'Powerful', + 'Rich', + 'Secret', + 'Smart', + 'Solid', + 'Special', + 'Strategic', + 'Strong', + 'Tidy', + 'Wise', + ]; + List get fruits => [ + 'Apple', + 'Avocado', + 'Banana', + 'Blackberry', + 'Blueberry', + 'Broccoli', + 'Carrot', + 'Cherry', + 'Coconut', + 'Grape', + 'Lemon', + 'Lettuce', + 'Mango', + 'Melon', + 'Mushroom', + 'Onion', + 'Orange', + 'Papaya', + 'Peach', + 'Pear', + 'Pineapple', + 'Potato', + 'Pumpkin', + 'Raspberry', + 'Strawberry', + 'Tomato', + ]; + + /// In some languages, the adjective must be last. + /// + /// en: '{adjective} {fruit}' + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class Translations$dialogs$en { + Translations$dialogs$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + late final Translations$dialogs$addFile$en addFile = Translations$dialogs$addFile$en.internal(_root); + late final Translations$dialogs$openFile$en openFile = Translations$dialogs$openFile$en.internal(_root); + late final Translations$dialogs$addressInput$en addressInput = Translations$dialogs$addressInput$en.internal(_root); + late final Translations$dialogs$cancelSession$en cancelSession = Translations$dialogs$cancelSession$en.internal(_root); + late final Translations$dialogs$cannotOpenFile$en cannotOpenFile = Translations$dialogs$cannotOpenFile$en.internal(_root); + late final Translations$dialogs$encryptionDisabledNotice$en encryptionDisabledNotice = Translations$dialogs$encryptionDisabledNotice$en.internal( + _root, + ); + late final Translations$dialogs$errorDialog$en errorDialog = Translations$dialogs$errorDialog$en.internal(_root); + late final Translations$dialogs$favoriteDialog$en favoriteDialog = Translations$dialogs$favoriteDialog$en.internal(_root); + late final Translations$dialogs$favoriteDeleteDialog$en favoriteDeleteDialog = Translations$dialogs$favoriteDeleteDialog$en.internal(_root); + late final Translations$dialogs$favoriteEditDialog$en favoriteEditDialog = Translations$dialogs$favoriteEditDialog$en.internal(_root); + late final Translations$dialogs$fileInfo$en fileInfo = Translations$dialogs$fileInfo$en.internal(_root); + late final Translations$dialogs$fileNameInput$en fileNameInput = Translations$dialogs$fileNameInput$en.internal(_root); + late final Translations$dialogs$historyClearDialog$en historyClearDialog = Translations$dialogs$historyClearDialog$en.internal(_root); + late final Translations$dialogs$localNetworkUnauthorized$en localNetworkUnauthorized = Translations$dialogs$localNetworkUnauthorized$en.internal( + _root, + ); + late final Translations$dialogs$messageInput$en messageInput = Translations$dialogs$messageInput$en.internal(_root); + late final Translations$dialogs$noFiles$en noFiles = Translations$dialogs$noFiles$en.internal(_root); + late final Translations$dialogs$noPermission$en noPermission = Translations$dialogs$noPermission$en.internal(_root); + late final Translations$dialogs$notAvailableOnPlatform$en notAvailableOnPlatform = Translations$dialogs$notAvailableOnPlatform$en.internal(_root); + late final Translations$dialogs$qr$en qr = Translations$dialogs$qr$en.internal(_root); + late final Translations$dialogs$quickActions$en quickActions = Translations$dialogs$quickActions$en.internal(_root); + late final Translations$dialogs$quickSaveNotice$en quickSaveNotice = Translations$dialogs$quickSaveNotice$en.internal(_root); + late final Translations$dialogs$quickSaveFromFavoritesNotice$en quickSaveFromFavoritesNotice = + Translations$dialogs$quickSaveFromFavoritesNotice$en.internal(_root); + late final Translations$dialogs$pin$en pin = Translations$dialogs$pin$en.internal(_root); + late final Translations$dialogs$sendModeHelp$en sendModeHelp = Translations$dialogs$sendModeHelp$en.internal(_root); + late final Translations$dialogs$zoom$en zoom = Translations$dialogs$zoom$en.internal(_root); +} + +// Path: sanitization +class Translations$sanitization$en { + Translations$sanitization$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Filename cannot be empty' + String get empty => 'Filename cannot be empty'; + + /// en: 'Filename contains invalid characters' + String get invalid => 'Filename contains invalid characters'; +} + +// Path: tray +class Translations$tray$en { + Translations$tray$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Open' + String get open => _root.general.open; + + /// en: 'Quit LocalSend' + String get close => 'Quit LocalSend'; + + /// en: 'Exit' + String get closeWindows => 'Exit'; +} + +// Path: web +class Translations$web$en { + Translations$web$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Waiting for response…' + String get waiting => _root.sendPage.waiting; + + /// en: 'Enter PIN' + String get enterPin => 'Enter PIN'; + + /// en: 'Invalid PIN' + String get invalidPin => 'Invalid PIN'; + + /// en: 'Too many attempts' + String get tooManyAttempts => 'Too many attempts'; + + /// en: 'Rejected' + String get rejected => 'Rejected'; + + /// en: 'Files' + String get files => 'Files'; + + /// en: 'File name' + String get fileName => 'File name'; + + /// en: 'Size' + String get size => 'Size'; +} + +// Path: assetPicker +class Translations$assetPicker$en { + Translations$assetPicker$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Confirm' + String get confirm => 'Confirm'; + + /// en: 'Cancel' + String get cancel => 'Cancel'; + + /// en: 'Edit' + String get edit => 'Edit'; + + /// en: 'GIF' + String get gifIndicator => 'GIF'; + + /// en: 'Load failed' + String get loadFailed => 'Load failed'; + + /// en: 'Origin' + String get original => 'Origin'; + + /// en: 'Preview' + String get preview => 'Preview'; + + /// en: 'Select' + String get select => 'Select'; + + /// en: 'Empty list' + String get emptyList => 'Empty list'; + + /// en: 'Unsupported file type.' + String get unSupportedAssetType => 'Unsupported file type.'; + + /// en: 'Unable to access all files on the device' + String get unableToAccessAll => 'Unable to access all files on the device'; + + /// en: 'Only view files and albums accessible to the app.' + String get viewingLimitedAssetsTip => 'Only view files and albums accessible to the app.'; + + /// en: 'Click to update accessible files' + String get changeAccessibleLimitedAssets => 'Click to update accessible files'; + + /// en: 'App can only access some files on the device. Go to system settings and allow the app to access all media on the device.' + String get accessAllTip => + 'App can only access some files on the device. Go to system settings and allow the app to access all media on the device.'; + + /// en: 'Go to system settings' + String get goToSystemSettings => 'Go to system settings'; + + /// en: 'Continue with limited access' + String get accessLimitedAssets => 'Continue with limited access'; + + /// en: 'Accessible files' + String get accessiblePathName => 'Accessible files'; + + /// en: 'Audio' + String get sTypeAudioLabel => 'Audio'; + + /// en: 'Image' + String get sTypeImageLabel => 'Image'; + + /// en: 'Video' + String get sTypeVideoLabel => 'Video'; + + /// en: 'Other media' + String get sTypeOtherLabel => 'Other media'; + + /// en: 'play' + String get sActionPlayHint => 'play'; + + /// en: 'preview' + String get sActionPreviewHint => 'preview'; + + /// en: 'select' + String get sActionSelectHint => 'select'; + + /// en: 'change path' + String get sActionSwitchPathLabel => 'change path'; + + /// en: 'use camera' + String get sActionUseCameraHint => 'use camera'; + + /// en: 'duration' + String get sNameDurationLabel => 'duration'; + + /// en: 'count' + String get sUnitAssetCountLabel => 'count'; +} + +// Path: receiveTab.infoBox +class Translations$receiveTab$infoBox$en { + Translations$receiveTab$infoBox$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'IP:' + String get ip => 'IP:'; + + /// en: 'Port:' + String get port => 'Port:'; + + /// en: 'Device name:' + String get alias => 'Device name:'; +} + +// Path: receiveTab.quickSave +class Translations$receiveTab$quickSave$en { + Translations$receiveTab$quickSave$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Off' + String get off => _root.general.off; + + /// en: 'Favorites' + String get favorites => 'Favorites'; + + /// en: 'On' + String get on => _root.general.on; +} + +// Path: sendTab.selection +class Translations$sendTab$selection$en { + Translations$sendTab$selection$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Selection' + String get title => 'Selection'; + + /// en: 'Files: {files}' + String files({required Object files}) => 'Files: ${files}'; + + /// en: 'Size: {size}' + String size({required Object size}) => 'Size: ${size}'; +} + +// Path: sendTab.picker +class Translations$sendTab$picker$en { + Translations$sendTab$picker$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'File' + String get file => 'File'; + + /// en: 'Folder' + String get folder => 'Folder'; + + /// en: 'Media' + String get media => 'Media'; + + /// en: 'Text' + String get text => 'Text'; + + /// en: 'App' + String get app => 'App'; + + /// en: 'Paste' + String get clipboard => 'Paste'; +} + +// Path: sendTab.sendModes +class Translations$sendTab$sendModes$en { + Translations$sendTab$sendModes$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Single recipient' + String get single => 'Single recipient'; + + /// en: 'Multiple recipients' + String get multiple => 'Multiple recipients'; + + /// en: 'Share via link' + String get link => 'Share via link'; +} + +// Path: settingsTab.general +class Translations$settingsTab$general$en { + Translations$settingsTab$general$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'General' + String get title => 'General'; + + /// en: 'Theme' + String get brightness => 'Theme'; + + late final Translations$settingsTab$general$brightnessOptions$en brightnessOptions = Translations$settingsTab$general$brightnessOptions$en.internal( + _root, + ); + + /// en: 'Color' + String get color => 'Color'; + + late final Translations$settingsTab$general$colorOptions$en colorOptions = Translations$settingsTab$general$colorOptions$en.internal(_root); + + /// en: 'Language' + String get language => 'Language'; + + late final Translations$settingsTab$general$languageOptions$en languageOptions = Translations$settingsTab$general$languageOptions$en.internal( + _root, + ); + + /// en: 'Save window position after quit' + String get saveWindowPlacement => 'Save window position after quit'; + + /// en: 'Save window position after exit' + String get saveWindowPlacementWindows => 'Save window position after exit'; + + /// en: 'Minimize to the System Tray/Menu Bar when closing' + String get minimizeToTray => 'Minimize to the System Tray/Menu Bar when closing'; + + /// en: 'Autostart after login' + String get launchAtStartup => 'Autostart after login'; + + /// en: 'Autostart: Start hidden' + String get launchMinimized => 'Autostart: Start hidden'; + + /// en: 'Show LocalSend in context menu' + String get showInContextMenu => 'Show LocalSend in context menu'; + + /// en: 'Animations' + String get animations => 'Animations'; +} + +// Path: settingsTab.receive +class Translations$settingsTab$receive$en { + Translations$settingsTab$receive$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Receive' + String get title => 'Receive'; + + /// en: 'Quick Save' + String get quickSave => _root.general.quickSave; + + /// en: 'Quick Save for "Favorites"' + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + + /// en: 'Require PIN' + String get requirePin => _root.webSharePage.requirePin; + + /// en: 'Auto Finish' + String get autoFinish => 'Auto Finish'; + + /// en: 'Save to folder' + String get destination => 'Save to folder'; + + /// en: '(Downloads)' + String get downloads => '(Downloads)'; + + /// en: 'Save media to gallery' + String get saveToGallery => 'Save media to gallery'; + + /// en: 'Save to history' + String get saveToHistory => 'Save to history'; +} + +// Path: settingsTab.send +class Translations$settingsTab$send$en { + Translations$settingsTab$send$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Send' + String get title => 'Send'; + + /// en: 'Automatically accept requests in "Share via link" mode' + String get shareViaLinkAutoAccept => 'Automatically accept requests in "Share via link" mode'; +} + +// Path: settingsTab.network +class Translations$settingsTab$network$en { + Translations$settingsTab$network$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Network' + String get title => 'Network'; + + /// en: 'Restart the server to apply the settings!' + String get needRestart => 'Restart the server to apply the settings!'; + + /// en: 'Server' + String get server => 'Server'; + + /// en: 'Device name' + String get alias => 'Device name'; + + /// en: 'Device type' + String get deviceType => 'Device type'; + + /// en: 'Device model' + String get deviceModel => 'Device model'; + + /// en: 'Port' + String get port => 'Port'; + + /// en: 'Network' + String get network => 'Network'; + + late final Translations$settingsTab$network$networkOptions$en networkOptions = Translations$settingsTab$network$networkOptions$en.internal(_root); + + /// en: 'Discovery Timeout' + String get discoveryTimeout => 'Discovery Timeout'; + + /// en: 'Use system name' + String get useSystemName => 'Use system name'; + + /// en: 'Generate random alias' + String get generateRandomAlias => 'Generate random alias'; + + /// en: 'You might not be detected by other devices because you are using a custom port. (default: {defaultPort})' + String portWarning({required Object defaultPort}) => + 'You might not be detected by other devices because you are using a custom port. (default: ${defaultPort})'; + + /// en: 'Encryption' + String get encryption => 'Encryption'; + + /// en: 'Multicast address' + String get multicastGroup => 'Multicast address'; + + /// en: 'You might not be detected by other devices because you are using a custom multicast address. (default: {defaultMulticast})' + String multicastGroupWarning({required Object defaultMulticast}) => + 'You might not be detected by other devices because you are using a custom multicast address. (default: ${defaultMulticast})'; +} + +// Path: settingsTab.other +class Translations$settingsTab$other$en { + Translations$settingsTab$other$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Other' + String get title => 'Other'; + + /// en: 'Support LocalSend' + String get support => 'Support LocalSend'; + + /// en: 'Donate' + String get donate => 'Donate'; + + /// en: 'Privacy Policy' + String get privacyPolicy => 'Privacy Policy'; + + /// en: 'Terms of Use' + String get termsOfUse => 'Terms of Use'; +} + +// Path: troubleshootPage.firewall +class Translations$troubleshootPage$firewall$en { + Translations$troubleshootPage$firewall$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'This device can send files to other devices but other devices cannot send files to this device.' + String get symptom => 'This device can send files to other devices but other devices cannot send files to this device.'; + + /// en: 'This is most likely a firewall issue. You can solve this by allowing incoming connections (UDP and TCP) on port {port}.' + String solution({required Object port}) => + 'This is most likely a firewall issue. You can solve this by allowing incoming connections (UDP and TCP) on port ${port}.'; + + /// en: 'Open Firewall' + String get openFirewall => 'Open Firewall'; +} + +// Path: troubleshootPage.noDiscovery +class Translations$troubleshootPage$noDiscovery$en { + Translations$troubleshootPage$noDiscovery$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'This device cannot discover other devices.' + String get symptom => 'This device cannot discover other devices.'; + + /// en: 'Please make sure that all devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). You can try to type the IP address of the target device manually. If this works, consider adding this device to the favorites so it can be automatically discovered in the future.' + String get solution => + 'Please make sure that all devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). You can try to type the IP address of the target device manually. If this works, consider adding this device to the favorites so it can be automatically discovered in the future.'; +} + +// Path: troubleshootPage.noConnection +class Translations$troubleshootPage$noConnection$en { + Translations$troubleshootPage$noConnection$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Both devices cannot discover each other nor can they share files.' + String get symptom => 'Both devices cannot discover each other nor can they share files.'; + + /// en: 'Does the problem exist on both sides? If so, you need to make sure that both devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). The Wi-Fi network may not allow communication between participants due to Access Point (AP) Isolation. In this case, this option must be disabled on the router.' + String get solution => + 'Does the problem exist on both sides? If so, you need to make sure that both devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). The Wi-Fi network may not allow communication between participants due to Access Point (AP) Isolation. In this case, this option must be disabled on the router.'; +} + +// Path: receiveHistoryPage.entryActions +class Translations$receiveHistoryPage$entryActions$en { + Translations$receiveHistoryPage$entryActions$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Open file' + String get open => 'Open file'; + + /// en: 'Show in folder' + String get showInFolder => 'Show in folder'; + + /// en: 'Information' + String get info => 'Information'; + + /// en: 'Delete from history' + String get deleteFromHistory => 'Delete from history'; +} + +// Path: progressPage.total +class Translations$progressPage$total$en { + Translations$progressPage$total$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + late final Translations$progressPage$total$title$en title = Translations$progressPage$total$title$en.internal(_root); + + /// en: 'Files: {curr} / {n}' + String count({required Object curr, required Object n}) => 'Files: ${curr} / ${n}'; + + /// en: 'Size: {curr} / {n}' + String size({required Object curr, required Object n}) => 'Size: ${curr} / ${n}'; + + /// en: 'Speed: {speed}/s' + String speed({required Object speed}) => 'Speed: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class Translations$progressPage$remainingTime$en { + Translations$progressPage$remainingTime$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: '{n}:{ss}' + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + + /// en: '{n}:{ss}' + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Use 'h' for hours abbreviation and 'm' for minutes + /// + /// en: '{h}h {m}m' + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Use 'd' for days, 'h' for hours, and 'm' for minutes + /// + /// en: '{d}d {h}h {m}m' + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: dialogs.addFile +class Translations$dialogs$addFile$en { + Translations$dialogs$addFile$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Add to selection' + String get title => 'Add to selection'; + + /// en: 'What do you want to add?' + String get content => 'What do you want to add?'; +} + +// Path: dialogs.openFile +class Translations$dialogs$openFile$en { + Translations$dialogs$openFile$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Open file' + String get title => 'Open file'; + + /// en: 'Do you want to open the received file?' + String get content => 'Do you want to open the received file?'; +} + +// Path: dialogs.addressInput +class Translations$dialogs$addressInput$en { + Translations$dialogs$addressInput$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Enter address' + String get title => 'Enter address'; + + /// en: 'Hashtag' + String get hashtag => 'Hashtag'; + + /// en: 'IP Address' + String get ip => 'IP Address'; + + /// en: 'Recently used: ' + String get recentlyUsed => 'Recently used: '; +} + +// Path: dialogs.cancelSession +class Translations$dialogs$cancelSession$en { + Translations$dialogs$cancelSession$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Cancel files transfer' + String get title => 'Cancel files transfer'; + + /// en: 'Do you really want to cancel the files transfer?' + String get content => 'Do you really want to cancel the files transfer?'; +} + +// Path: dialogs.cannotOpenFile +class Translations$dialogs$cannotOpenFile$en { + Translations$dialogs$cannotOpenFile$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Cannot open file' + String get title => 'Cannot open file'; + + /// en: 'Could not open "{file}". Has this file been moved, renamed or deleted?' + String content({required Object file}) => 'Could not open "${file}". Has this file been moved, renamed or deleted?'; +} + +// Path: dialogs.encryptionDisabledNotice +class Translations$dialogs$encryptionDisabledNotice$en { + Translations$dialogs$encryptionDisabledNotice$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Encryption disabled' + String get title => 'Encryption disabled'; + + /// en: 'Communication now takes place via the unencrypted HTTP protocol. To use HTTPS protocol, enable encryption again.' + String get content => 'Communication now takes place via the unencrypted HTTP protocol. To use HTTPS protocol, enable encryption again.'; +} + +// Path: dialogs.errorDialog +class Translations$dialogs$errorDialog$en { + Translations$dialogs$errorDialog$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Error' + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class Translations$dialogs$favoriteDialog$en { + Translations$dialogs$favoriteDialog$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Favorites' + String get title => 'Favorites'; + + /// en: 'No favorite devices yet.' + String get noFavorites => 'No favorite devices yet.'; + + /// en: 'Add' + String get addFavorite => 'Add'; +} + +// Path: dialogs.favoriteDeleteDialog +class Translations$dialogs$favoriteDeleteDialog$en { + Translations$dialogs$favoriteDeleteDialog$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Delete from favorites' + String get title => 'Delete from favorites'; + + /// en: 'Do you really want to delete from favorites "{name}"?' + String content({required Object name}) => 'Do you really want to delete from favorites "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class Translations$dialogs$favoriteEditDialog$en { + Translations$dialogs$favoriteEditDialog$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Add to favorites' + String get titleAdd => 'Add to favorites'; + + /// en: 'Settings' + String get titleEdit => 'Settings'; + + /// en: 'Device name' + String get name => 'Device name'; + + /// en: '(auto)' + String get auto => '(auto)'; + + /// en: 'IP Address' + String get ip => 'IP Address'; + + /// en: 'Port' + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class Translations$dialogs$fileInfo$en { + Translations$dialogs$fileInfo$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'File information' + String get title => 'File information'; + + /// en: 'File name:' + String get fileName => 'File name:'; + + /// en: 'Path:' + String get path => 'Path:'; + + /// en: 'Size:' + String get size => 'Size:'; + + /// en: 'Sender:' + String get sender => 'Sender:'; + + /// en: 'Time:' + String get time => 'Time:'; +} + +// Path: dialogs.fileNameInput +class Translations$dialogs$fileNameInput$en { + Translations$dialogs$fileNameInput$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Enter file name' + String get title => 'Enter file name'; + + /// en: 'Original: {original}' + String original({required Object original}) => 'Original: ${original}'; +} + +// Path: dialogs.historyClearDialog +class Translations$dialogs$historyClearDialog$en { + Translations$dialogs$historyClearDialog$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Clear history' + String get title => 'Clear history'; + + /// en: 'Do you really want to delete the entire history?' + String get content => 'Do you really want to delete the entire history?'; +} + +// Path: dialogs.localNetworkUnauthorized +class Translations$dialogs$localNetworkUnauthorized$en { + Translations$dialogs$localNetworkUnauthorized$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'No permission' + String get title => _root.dialogs.noPermission.title; + + /// en: 'LocalSend can't find other devices without having the permission to scan the local network. Please grant this permission in the settings.' + String get description => + 'LocalSend can\'t find other devices without having the permission to scan the local network. Please grant this permission in the settings.'; + + /// en: 'Settings' + String get gotoSettings => 'Settings'; +} + +// Path: dialogs.messageInput +class Translations$dialogs$messageInput$en { + Translations$dialogs$messageInput$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Type message' + String get title => 'Type message'; + + /// en: 'Multiline' + String get multiline => 'Multiline'; +} + +// Path: dialogs.noFiles +class Translations$dialogs$noFiles$en { + Translations$dialogs$noFiles$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'No files selected' + String get title => 'No files selected'; + + /// en: 'Please select at least one file.' + String get content => 'Please select at least one file.'; +} + +// Path: dialogs.noPermission +class Translations$dialogs$noPermission$en { + Translations$dialogs$noPermission$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'No permission' + String get title => 'No permission'; + + /// en: 'You have not granted the necessary permissions. Please grant them in the settings.' + String get content => 'You have not granted the necessary permissions. Please grant them in the settings.'; +} + +// Path: dialogs.notAvailableOnPlatform +class Translations$dialogs$notAvailableOnPlatform$en { + Translations$dialogs$notAvailableOnPlatform$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Not available' + String get title => 'Not available'; + + /// en: 'This feature is only available on:' + String get content => 'This feature is only available on:'; +} + +// Path: dialogs.qr +class Translations$dialogs$qr$en { + Translations$dialogs$qr$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'QR Code' + String get title => 'QR Code'; +} + +// Path: dialogs.quickActions +class Translations$dialogs$quickActions$en { + Translations$dialogs$quickActions$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Quick Actions' + String get title => 'Quick Actions'; + + /// en: 'Counter' + String get counter => 'Counter'; + + /// en: 'Prefix' + String get prefix => 'Prefix'; + + /// en: 'Pad with zeros' + String get padZero => 'Pad with zeros'; + + /// en: 'Sort alphabetically beforehand (A-Z)' + String get sortBeforeCount => 'Sort alphabetically beforehand (A-Z)'; + + /// en: 'Random' + String get random => 'Random'; +} + +// Path: dialogs.quickSaveNotice +class Translations$dialogs$quickSaveNotice$en { + Translations$dialogs$quickSaveNotice$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Quick Save' + String get title => _root.general.quickSave; + + /// en: 'File requests are now accepted automatically. Be aware that everyone on the local network can send you files.' + String get content => 'File requests are now accepted automatically. Be aware that everyone on the local network can send you files.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class Translations$dialogs$quickSaveFromFavoritesNotice$en { + Translations$dialogs$quickSaveFromFavoritesNotice$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Quick Save for "Favorites"' + String get title => _root.general.quickSaveFromFavorites; + + List get content => [ + 'File requests are now accepted automatically from devices in your favorites list.', + 'Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favorites list can send you files without restriction.', + 'However, this option is still safer than allowing all users on the local network to send you files without restriction.', + ]; +} + +// Path: dialogs.pin +class Translations$dialogs$pin$en { + Translations$dialogs$pin$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Enter PIN' + String get title => 'Enter PIN'; +} + +// Path: dialogs.sendModeHelp +class Translations$dialogs$sendModeHelp$en { + Translations$dialogs$sendModeHelp$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Send modes' + String get title => 'Send modes'; + + /// en: 'Sends files to one recipient. Selection will be cleared after finished files transfer.' + String get single => 'Sends files to one recipient. Selection will be cleared after finished files transfer.'; + + /// en: 'Sends files to multiple recipients. Selection will not be cleared after finished files transfer.' + String get multiple => 'Sends files to multiple recipients. Selection will not be cleared after finished files transfer.'; + + /// en: 'Recipients who do not have LocalSend installed can download the selected files by opening the link in their browser.' + String get link => 'Recipients who do not have LocalSend installed can download the selected files by opening the link in their browser.'; +} + +// Path: dialogs.zoom +class Translations$dialogs$zoom$en { + Translations$dialogs$zoom$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'URL' + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class Translations$settingsTab$general$brightnessOptions$en { + Translations$settingsTab$general$brightnessOptions$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'System' + String get system => 'System'; + + /// en: 'Dark' + String get dark => 'Dark'; + + /// en: 'Light' + String get light => 'Light'; +} + +// Path: settingsTab.general.colorOptions +class Translations$settingsTab$general$colorOptions$en { + Translations$settingsTab$general$colorOptions$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'System' + String get system => 'System'; + + /// en: 'OLED' + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class Translations$settingsTab$general$languageOptions$en { + Translations$settingsTab$general$languageOptions$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'System' + String get system => 'System'; +} + +// Path: settingsTab.network.networkOptions +class Translations$settingsTab$network$networkOptions$en { + Translations$settingsTab$network$networkOptions$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'All' + String get all => 'All'; + + /// en: 'Filtered' + String get filtered => 'Filtered'; +} + +// Path: progressPage.total.title +class Translations$progressPage$total$title$en { + Translations$progressPage$total$title$en.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Total progress ({time})' + String sending({required Object time}) => 'Total progress (${time})'; + + /// en: 'Finished with error' + String get finishedError => 'Finished with error'; + + /// en: 'Canceled by sender' + String get canceledSender => 'Canceled by sender'; + + /// en: 'Canceled by receiver' + String get canceledReceiver => 'Canceled by receiver'; +} diff --git a/app/lib/gen/strings_en_IN.g.dart b/app/lib/gen/strings_en_IN.g.dart new file mode 100644 index 0000000..0f4ee65 --- /dev/null +++ b/app/lib/gen/strings_en_IN.g.dart @@ -0,0 +1,1524 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsEnIn extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsEnIn({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.enIn, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsEnIn _root = this; // ignore: unused_field + + @override + TranslationsEnIn $copyWith({TranslationMetadata? meta}) => TranslationsEnIn(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'English(India)'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$en_IN general = _Translations$general$en_IN._(_root); + @override + late final _Translations$receiveTab$en_IN receiveTab = _Translations$receiveTab$en_IN._(_root); + @override + late final _Translations$sendTab$en_IN sendTab = _Translations$sendTab$en_IN._(_root); + @override + late final _Translations$settingsTab$en_IN settingsTab = _Translations$settingsTab$en_IN._(_root); + @override + late final _Translations$troubleshootPage$en_IN troubleshootPage = _Translations$troubleshootPage$en_IN._(_root); + @override + late final _Translations$receiveHistoryPage$en_IN receiveHistoryPage = _Translations$receiveHistoryPage$en_IN._(_root); + @override + late final _Translations$apkPickerPage$en_IN apkPickerPage = _Translations$apkPickerPage$en_IN._(_root); + @override + late final _Translations$selectedFilesPage$en_IN selectedFilesPage = _Translations$selectedFilesPage$en_IN._(_root); + @override + late final _Translations$receivePage$en_IN receivePage = _Translations$receivePage$en_IN._(_root); + @override + late final _Translations$receiveOptionsPage$en_IN receiveOptionsPage = _Translations$receiveOptionsPage$en_IN._(_root); + @override + late final _Translations$sendPage$en_IN sendPage = _Translations$sendPage$en_IN._(_root); + @override + late final _Translations$progressPage$en_IN progressPage = _Translations$progressPage$en_IN._(_root); + @override + late final _Translations$webSharePage$en_IN webSharePage = _Translations$webSharePage$en_IN._(_root); + @override + late final _Translations$aboutPage$en_IN aboutPage = _Translations$aboutPage$en_IN._(_root); + @override + late final _Translations$donationPage$en_IN donationPage = _Translations$donationPage$en_IN._(_root); + @override + late final _Translations$changelogPage$en_IN changelogPage = _Translations$changelogPage$en_IN._(_root); + @override + late final _Translations$aliasGenerator$en_IN aliasGenerator = _Translations$aliasGenerator$en_IN._(_root); + @override + late final _Translations$dialogs$en_IN dialogs = _Translations$dialogs$en_IN._(_root); + @override + late final _Translations$sanitization$en_IN sanitization = _Translations$sanitization$en_IN._(_root); + @override + late final _Translations$tray$en_IN tray = _Translations$tray$en_IN._(_root); + @override + late final _Translations$web$en_IN web = _Translations$web$en_IN._(_root); + @override + late final _Translations$assetPicker$en_IN assetPicker = _Translations$assetPicker$en_IN._(_root); + @override + late final _Translations$networkInterfacesPage$en_IN networkInterfacesPage = _Translations$networkInterfacesPage$en_IN._(_root); +} + +// Path: general +class _Translations$general$en_IN extends Translations$general$en { + _Translations$general$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Accept'; + @override + String get accepted => 'Accepted'; + @override + String get add => 'Add'; + @override + String get advanced => 'Advanced'; + @override + String get cancel => 'Cancel'; + @override + String get close => 'Close'; + @override + String get confirm => 'Confirm'; + @override + String get continueStr => 'Continue'; + @override + String get copy => 'Copy'; + @override + String get copiedToClipboard => 'Copied to Clipboard'; + @override + String get decline => 'Decline'; + @override + String get done => 'Done'; + @override + String get delete => 'Delete'; + @override + String get edit => 'Edit'; + @override + String get error => 'Error'; + @override + String get example => 'Example'; + @override + String get files => 'Files'; + @override + String get finished => 'Finished'; + @override + String get hide => 'Hide'; + @override + String get off => 'Off'; + @override + String get offline => 'Offline'; + @override + String get on => 'On'; + @override + String get online => 'Online'; + @override + String get open => 'Open'; + @override + String get queue => 'Queue'; + @override + String get quickSave => 'Quick Save'; + @override + String get quickSaveFromFavorites => 'Quick Save for "Favourites"'; + @override + String get renamed => 'Renamed'; + @override + String get reset => 'Reset'; + @override + String get restart => 'Restart'; + @override + String get settings => 'Settings'; + @override + String get skipped => 'Skipped'; + @override + String get start => 'Start'; + @override + String get stop => 'Stop'; + @override + String get save => 'Save'; + @override + String get unchanged => 'Unchanged'; + @override + String get unknown => 'Unknown'; + @override + String get noItemInClipboard => 'No items in Clipboard.'; +} + +// Path: receiveTab +class _Translations$receiveTab$en_IN extends Translations$receiveTab$en { + _Translations$receiveTab$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Receive'; + @override + late final _Translations$receiveTab$infoBox$en_IN infoBox = _Translations$receiveTab$infoBox$en_IN._(_root); + @override + late final _Translations$receiveTab$quickSave$en_IN quickSave = _Translations$receiveTab$quickSave$en_IN._(_root); +} + +// Path: sendTab +class _Translations$sendTab$en_IN extends Translations$sendTab$en { + _Translations$sendTab$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Send'; + @override + late final _Translations$sendTab$selection$en_IN selection = _Translations$sendTab$selection$en_IN._(_root); + @override + late final _Translations$sendTab$picker$en_IN picker = _Translations$sendTab$picker$en_IN._(_root); + @override + String get shareIntentInfo => 'You can also use the "Share" feature of your mobile device to select files more easily.'; + @override + String get nearbyDevices => 'Nearby devices'; + @override + String get thisDevice => 'This Device'; + @override + String get scan => 'Look for devices'; + @override + String get manualSending => 'Manual Sending'; + @override + String get sendMode => 'Send mode'; + @override + late final _Translations$sendTab$sendModes$en_IN sendModes = _Translations$sendTab$sendModes$en_IN._(_root); + @override + String get sendModeHelp => 'Explanation'; + @override + String get help => 'Please ensure that the desired target is also on the same Wi-Fi network.'; + @override + String get placeItems => 'Place items to share.'; +} + +// Path: settingsTab +class _Translations$settingsTab$en_IN extends Translations$settingsTab$en { + _Translations$settingsTab$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Settings'; + @override + late final _Translations$settingsTab$general$en_IN general = _Translations$settingsTab$general$en_IN._(_root); + @override + late final _Translations$settingsTab$receive$en_IN receive = _Translations$settingsTab$receive$en_IN._(_root); + @override + late final _Translations$settingsTab$send$en_IN send = _Translations$settingsTab$send$en_IN._(_root); + @override + late final _Translations$settingsTab$network$en_IN network = _Translations$settingsTab$network$en_IN._(_root); + @override + late final _Translations$settingsTab$other$en_IN other = _Translations$settingsTab$other$en_IN._(_root); + @override + String get advancedSettings => 'Advanced settings'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$en_IN extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Troubleshoot'; + @override + String get subTitle => 'Does the app not work as expected? Here you can find some common solutions.'; + @override + String get solution => 'Solution:'; + @override + String get fixButton => 'Fix automatically'; + @override + late final _Translations$troubleshootPage$firewall$en_IN firewall = _Translations$troubleshootPage$firewall$en_IN._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$en_IN noDiscovery = _Translations$troubleshootPage$noDiscovery$en_IN._(_root); + @override + late final _Translations$troubleshootPage$noConnection$en_IN noConnection = _Translations$troubleshootPage$noConnection$en_IN._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$en_IN extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'History'; + @override + String get openFolder => 'Open folder'; + @override + String get deleteHistory => 'Delete history'; + @override + String get empty => 'The history is empty.'; + @override + late final _Translations$receiveHistoryPage$entryActions$en_IN entryActions = _Translations$receiveHistoryPage$entryActions$en_IN._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$en_IN extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Apps (APK)'; + @override + String get excludeSystemApps => 'Exclude system apps'; + @override + String get excludeAppsWithoutLaunchIntent => 'Exclude non-launchable apps'; + @override + String apps({required Object n}) => '${n} Apps'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$en_IN extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Delete all'; +} + +// Path: receivePage +class _Translations$receivePage$en_IN extends Translations$receivePage$en { + _Translations$receivePage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('en'))( + n, + one: 'wants to send you a file', + other: 'wants to send you ${n} files', + ); + @override + String get subTitleMessage => 'sent you a message:'; + @override + String get subTitleLink => 'sent you a link:'; + @override + String get canceled => 'The sender has cancelled the request.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$en_IN extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Options'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend folder)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Turned off automatically because there are directories.'; +} + +// Path: sendPage +class _Translations$sendPage$en_IN extends Translations$sendPage$en { + _Translations$sendPage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Waiting for response…'; + @override + String get rejected => 'The recipient has rejected the request.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'The recipient is busy with another request.'; +} + +// Path: progressPage +class _Translations$progressPage$en_IN extends Translations$progressPage$en { + _Translations$progressPage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Sending files'; + @override + String get titleReceiving => 'Receiving files'; + @override + String get savedToGallery => 'Saved in Photos'; + @override + late final _Translations$progressPage$total$en_IN total = _Translations$progressPage$total$en_IN._(_root); + @override + late final _Translations$progressPage$remainingTime$en_IN remainingTime = _Translations$progressPage$remainingTime$en_IN._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$en_IN extends Translations$webSharePage$en { + _Translations$webSharePage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Share via link'; + @override + String get loading => 'Starting server…'; + @override + String get stopping => 'Stopping server…'; + @override + String get error => 'An error occurred while starting the server.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('en'))( + n, + one: 'Open this link in your browser:', + other: 'Open one of these links in your browser:', + ); + @override + String get requests => 'Requests'; + @override + String get noRequests => 'No requests yet.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Automatically accept requests'; + @override + String get requirePin => 'Require PIN'; + @override + String pinHint({required Object pin}) => 'The PIN is "${pin}"'; + @override + String get encryptionHint => 'LocalSend uses a self-signed certificate. You need to accept it in your browser.'; + @override + String pendingRequests({required Object n}) => 'Pending requests: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$en_IN extends Translations$aboutPage$en { + _Translations$aboutPage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'About LocalSend'; + @override + List get description => [ + 'LocalSend is a free, open-source app that allows you to securely share files and messages with nearby devices over your local network without needing an internet connection.', + 'This app is available on Android, iOS, macOS, Windows and Linux. You can find all download options on the official homepage.', + ]; + @override + String get author => 'Author'; + @override + String get contributors => 'Contributors'; + @override + String get packagers => 'Packagers'; + @override + String get translators => 'Translators'; +} + +// Path: donationPage +class _Translations$donationPage$en_IN extends Translations$donationPage$en { + _Translations$donationPage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Donate'; + @override + String get info => 'LocalSend is free, open-source and without any ads. If you like the app, you can support the development with a donation.'; + @override + String donate({required Object amount}) => 'Donate ${amount}'; + @override + String get thanks => 'Thank you very much!'; + @override + String get restore => 'Restore purchase'; +} + +// Path: changelogPage +class _Translations$changelogPage$en_IN extends Translations$changelogPage$en { + _Translations$changelogPage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Changelog'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$en_IN extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Adorable', + 'Beautiful', + 'Big', + 'Bright', + 'Clean', + 'Clever', + 'Cool', + 'Cute', + 'Cunning', + 'Determined', + 'Energetic', + 'Efficient', + 'Fantastic', + 'Fast', + 'Fine', + 'Fresh', + 'Good', + 'Gorgeous', + 'Great', + 'Handsome', + 'Hot', + 'Kind', + 'Lovely', + 'Mystic', + 'Neat', + 'Nice', + 'Patient', + 'Pretty', + 'Powerful', + 'Rich', + 'Secret', + 'Smart', + 'Solid', + 'Special', + 'Strategic', + 'Strong', + 'Tidy', + 'Wise', + ]; + @override + List get fruits => [ + 'Apple', + 'Avocado', + 'Banana', + 'Blackberry', + 'Blueberry', + 'Broccoli', + 'Carrot', + 'Cherry', + 'Coconut', + 'Grape', + 'Lemon', + 'Lettuce', + 'Mango', + 'Melon', + 'Mushroom', + 'Onion', + 'Orange', + 'Papaya', + 'Peach', + 'Pear', + 'Pineapple', + 'Potato', + 'Pumpkin', + 'Raspberry', + 'Strawberry', + 'Tomato', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$en_IN extends Translations$dialogs$en { + _Translations$dialogs$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$en_IN addFile = _Translations$dialogs$addFile$en_IN._(_root); + @override + late final _Translations$dialogs$openFile$en_IN openFile = _Translations$dialogs$openFile$en_IN._(_root); + @override + late final _Translations$dialogs$addressInput$en_IN addressInput = _Translations$dialogs$addressInput$en_IN._(_root); + @override + late final _Translations$dialogs$cancelSession$en_IN cancelSession = _Translations$dialogs$cancelSession$en_IN._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$en_IN cannotOpenFile = _Translations$dialogs$cannotOpenFile$en_IN._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$en_IN encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$en_IN._( + _root, + ); + @override + late final _Translations$dialogs$errorDialog$en_IN errorDialog = _Translations$dialogs$errorDialog$en_IN._(_root); + @override + late final _Translations$dialogs$favoriteDialog$en_IN favoriteDialog = _Translations$dialogs$favoriteDialog$en_IN._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$en_IN favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$en_IN._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$en_IN favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$en_IN._(_root); + @override + late final _Translations$dialogs$fileInfo$en_IN fileInfo = _Translations$dialogs$fileInfo$en_IN._(_root); + @override + late final _Translations$dialogs$fileNameInput$en_IN fileNameInput = _Translations$dialogs$fileNameInput$en_IN._(_root); + @override + late final _Translations$dialogs$historyClearDialog$en_IN historyClearDialog = _Translations$dialogs$historyClearDialog$en_IN._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$en_IN localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$en_IN._( + _root, + ); + @override + late final _Translations$dialogs$messageInput$en_IN messageInput = _Translations$dialogs$messageInput$en_IN._(_root); + @override + late final _Translations$dialogs$noFiles$en_IN noFiles = _Translations$dialogs$noFiles$en_IN._(_root); + @override + late final _Translations$dialogs$noPermission$en_IN noPermission = _Translations$dialogs$noPermission$en_IN._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$en_IN notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$en_IN._(_root); + @override + late final _Translations$dialogs$qr$en_IN qr = _Translations$dialogs$qr$en_IN._(_root); + @override + late final _Translations$dialogs$quickActions$en_IN quickActions = _Translations$dialogs$quickActions$en_IN._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$en_IN quickSaveNotice = _Translations$dialogs$quickSaveNotice$en_IN._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$en_IN quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$en_IN._(_root); + @override + late final _Translations$dialogs$pin$en_IN pin = _Translations$dialogs$pin$en_IN._(_root); + @override + late final _Translations$dialogs$sendModeHelp$en_IN sendModeHelp = _Translations$dialogs$sendModeHelp$en_IN._(_root); + @override + late final _Translations$dialogs$zoom$en_IN zoom = _Translations$dialogs$zoom$en_IN._(_root); +} + +// Path: sanitization +class _Translations$sanitization$en_IN extends Translations$sanitization$en { + _Translations$sanitization$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Filename cannot be empty'; + @override + String get invalid => 'Filename contains invalid characters'; +} + +// Path: tray +class _Translations$tray$en_IN extends Translations$tray$en { + _Translations$tray$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Quit LocalSend'; + @override + String get closeWindows => 'Exit'; +} + +// Path: web +class _Translations$web$en_IN extends Translations$web$en { + _Translations$web$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Enter PIN'; + @override + String get invalidPin => 'Invalid PIN'; + @override + String get tooManyAttempts => 'Too many attempts'; + @override + String get rejected => 'Rejected'; + @override + String get files => 'Files'; + @override + String get fileName => 'File name'; + @override + String get size => 'Size'; +} + +// Path: assetPicker +class _Translations$assetPicker$en_IN extends Translations$assetPicker$en { + _Translations$assetPicker$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Confirm'; + @override + String get cancel => 'Cancel'; + @override + String get edit => 'Edit'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Load failed'; + @override + String get original => 'Origin'; + @override + String get preview => 'Preview'; + @override + String get select => 'Select'; + @override + String get emptyList => 'Empty list'; + @override + String get unSupportedAssetType => 'Unsupported file type.'; + @override + String get unableToAccessAll => 'Unable to access all files on the device'; + @override + String get viewingLimitedAssetsTip => 'Only view files and albums accessible to the app.'; + @override + String get changeAccessibleLimitedAssets => 'Click to update accessible files'; + @override + String get accessAllTip => + 'App can only access some files on the device. Go to system settings and allow the app to access all media on the device.'; + @override + String get goToSystemSettings => 'Go to system settings'; + @override + String get accessLimitedAssets => 'Continue with limited access'; + @override + String get accessiblePathName => 'Accessible files'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Image'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Other media'; + @override + String get sActionPlayHint => 'play'; + @override + String get sActionPreviewHint => 'preview'; + @override + String get sActionSelectHint => 'select'; + @override + String get sActionSwitchPathLabel => 'change path'; + @override + String get sActionUseCameraHint => 'use camera'; + @override + String get sNameDurationLabel => 'duration'; + @override + String get sUnitAssetCountLabel => 'count'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$en_IN extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get preview => 'Preview'; + @override + String get info => + 'By default, LocalSend uses all available network interfaces. You can exclude unwanted networks here. You need to restart the server to apply the changes.'; + @override + String get whitelist => 'Whitelist'; + @override + String get blacklist => 'Blacklist'; + @override + String get title => 'Network Interfaces'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$en_IN extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Device name:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$en_IN extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Favourites'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$en_IN extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Selection'; + @override + String files({required Object files}) => 'Files: ${files}'; + @override + String size({required Object size}) => 'Size: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$en_IN extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get file => 'File'; + @override + String get folder => 'Folder'; + @override + String get media => 'Media'; + @override + String get text => 'Text'; + @override + String get app => 'App'; + @override + String get clipboard => 'Paste'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$en_IN extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get single => 'Single recipient'; + @override + String get multiple => 'Multiple recipients'; + @override + String get link => 'Share via link'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$en_IN extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'General'; + @override + String get brightness => 'Theme'; + @override + late final _Translations$settingsTab$general$brightnessOptions$en_IN brightnessOptions = + _Translations$settingsTab$general$brightnessOptions$en_IN._(_root); + @override + String get color => 'Color'; + @override + late final _Translations$settingsTab$general$colorOptions$en_IN colorOptions = _Translations$settingsTab$general$colorOptions$en_IN._(_root); + @override + String get language => 'Language'; + @override + late final _Translations$settingsTab$general$languageOptions$en_IN languageOptions = _Translations$settingsTab$general$languageOptions$en_IN._( + _root, + ); + @override + String get saveWindowPlacement => 'Quit: Save window placement'; + @override + String get saveWindowPlacementWindows => 'Save window position after exit'; + @override + String get minimizeToTray => 'Quit: Minimize to Tray/Menu Bar'; + @override + String get launchAtStartup => 'Autostart after login'; + @override + String get launchMinimized => 'Autostart: Start hidden'; + @override + String get showInContextMenu => 'Show LocalSend in context menu'; + @override + String get animations => 'Animations'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$en_IN extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Receive'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Auto Finish'; + @override + String get destination => 'Destination'; + @override + String get downloads => '(Downloads)'; + @override + String get saveToGallery => 'Save media to gallery'; + @override + String get saveToHistory => 'Save to history'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$en_IN extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Send'; + @override + String get shareViaLinkAutoAccept => 'Share via link: Auto accept'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$en_IN extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Network'; + @override + String get needRestart => 'Restart the server to apply the settings!'; + @override + String get server => 'Server'; + @override + String get alias => 'Device name'; + @override + String get deviceType => 'Device type'; + @override + String get deviceModel => 'Device model'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Discovery Timeout'; + @override + String get useSystemName => 'Use system name'; + @override + String get generateRandomAlias => 'Generate random alias'; + @override + String portWarning({required Object defaultPort}) => + 'You might not be detected by other devices because you are using a custom port. (default: ${defaultPort})'; + @override + String get encryption => 'Encryption'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'You might not be detected by other devices because you are using a custom multicast address. (default: ${defaultMulticast})'; + @override + String get network => 'Network'; + @override + late final _Translations$settingsTab$network$networkOptions$en_IN networkOptions = _Translations$settingsTab$network$networkOptions$en_IN._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$en_IN extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Other'; + @override + String get support => 'Support LocalSend'; + @override + String get donate => 'Donate'; + @override + String get privacyPolicy => 'Privacy Policy'; + @override + String get termsOfUse => 'Terms of Use'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$en_IN extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'This app can send files to other devices; but other devices cannot send files to this device.'; + @override + String solution({required Object port}) => + 'This is most likely a firewall issue. You can solve this by allowing incoming connections (UDP and TCP) on port ${port}.'; + @override + String get openFirewall => 'Open Firewall'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$en_IN extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'This device cannot discover other devices.'; + @override + String get solution => + 'Please make sure that all devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). You can try to type the IP address of the target device manually. If this works, consider adding this device to the favourites so it can be automatically discovered in the future.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$en_IN extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Both devices cannot discover each other nor can they share files.'; + @override + String get solution => + 'Does the problem exist on both sides? If so, you need to make sure that both devices are on the same Wi-Fi network and share the same configuration (port, multicast address, encryption). The network may not allow communication between participants. In this case, this option must be enabled on the router.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$en_IN extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get open => 'Open file'; + @override + String get showInFolder => 'Show in folder'; + @override + String get info => 'Information'; + @override + String get deleteFromHistory => 'Delete from history'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$en_IN extends Translations$progressPage$total$en { + _Translations$progressPage$total$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$en_IN title = _Translations$progressPage$total$title$en_IN._(_root); + @override + String count({required Object curr, required Object n}) => 'Files: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Size: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Speed: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$en_IN extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Use 'h' for hours abbreviation and 'm' for minutes + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Use 'd' for days, 'h' for hours, and 'm' for minutes + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$en_IN extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Add to selection'; + @override + String get content => 'What do you want to add?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$en_IN extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Open file'; + @override + String get content => 'Do you want to open the received file?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$en_IN extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Enter address'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP Address'; + @override + String get recentlyUsed => 'Recently used: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$en_IN extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Cancel file transfer'; + @override + String get content => 'Do you really want to cancel the file transfer?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$en_IN extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Cannot open file'; + @override + String content({required Object file}) => 'Could not open "${file}". Has this file been moved, renamed or deleted?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$en_IN extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Encryption disabled'; + @override + String get content => 'Communication now takes place via the unencrypted HTTP protocol. To use HTTPS, enable encryption again.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$en_IN extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$en_IN extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favorites'; + @override + String get noFavorites => 'No favourite devices yet.'; + @override + String get addFavorite => 'Add'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$en_IN extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Delete from favourites'; + @override + String content({required Object name}) => 'Do you really want to delete from favourites "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$en_IN extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Add to favourites'; + @override + String get titleEdit => 'Settings'; + @override + String get name => 'Device name'; + @override + String get auto => '(auto)'; + @override + String get ip => 'IP Address'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$en_IN extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'File information'; + @override + String get fileName => 'File name:'; + @override + String get path => 'Path:'; + @override + String get size => 'Size:'; + @override + String get sender => 'Sender:'; + @override + String get time => 'Time:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$en_IN extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Enter file name'; + @override + String original({required Object original}) => 'Original: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$en_IN extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Clear history'; + @override + String get content => 'Do you really want to delete the entire history?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$en_IN extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend can\'t find other devices without having the permission to scan the local network. Please grant this permission in the settings.'; + @override + String get gotoSettings => 'Settings'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$en_IN extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Type message'; + @override + String get multiline => 'Multiline'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$en_IN extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'No file selected'; + @override + String get content => 'Please select at least one file.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$en_IN extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'No permission'; + @override + String get content => 'You have not granted the necessary permissions. Please grant them in the settings.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$en_IN extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Not available'; + @override + String get content => 'This feature is only available on:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$en_IN extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR Code'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$en_IN extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Quick Actions'; + @override + String get counter => 'Counter'; + @override + String get prefix => 'Prefix'; + @override + String get padZero => 'Pad with zeros'; + @override + String get sortBeforeCount => 'Sort alphabetically beforehand'; + @override + String get random => 'Random'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$en_IN extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'File requests are automatically accepted. Be aware that everyone on the local network can send you files.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$en_IN extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'File requests are now accepted automatically from devices in your favourites list.', + 'Warning! Currently, this is not entirely secure, as a hacker who has the fingerprint of any device from your favourites list can send you files without restriction.', + 'However, this option is still safer than allowing all users on the local network to send you files without restriction.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$en_IN extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Enter PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$en_IN extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Send modes'; + @override + String get single => 'Sends files to one recipient. Selection will be cleared after finished file transfer.'; + @override + String get multiple => 'Sends files to multiple recipients. Selection will not be cleared.'; + @override + String get link => 'Recipients who do not have LocalSend installed can download the selected files by opening the link in their browser.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$en_IN extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$en_IN extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; + @override + String get dark => 'Dark'; + @override + String get light => 'Light'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$en_IN extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$en_IN extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$en_IN extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String get all => 'All'; + @override + String get filtered => 'Filtered'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$en_IN extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$en_IN._(TranslationsEnIn root) : this._root = root, super.internal(root); + + final TranslationsEnIn _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Total progress (${time})'; + @override + String get finishedError => 'Finished with error'; + @override + String get canceledSender => 'Cancelled by sender'; + @override + String get canceledReceiver => 'Cancelled by receiver'; +} diff --git a/app/lib/gen/strings_es_ES.g.dart b/app/lib/gen/strings_es_ES.g.dart new file mode 100644 index 0000000..07f5c5f --- /dev/null +++ b/app/lib/gen/strings_es_ES.g.dart @@ -0,0 +1,1443 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsEsEs extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsEsEs({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.esEs, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsEsEs _root = this; // ignore: unused_field + + @override + TranslationsEsEs $copyWith({TranslationMetadata? meta}) => TranslationsEsEs(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Español'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$es_ES general = _Translations$general$es_ES._(_root); + @override + late final _Translations$receiveTab$es_ES receiveTab = _Translations$receiveTab$es_ES._(_root); + @override + late final _Translations$sendTab$es_ES sendTab = _Translations$sendTab$es_ES._(_root); + @override + late final _Translations$settingsTab$es_ES settingsTab = _Translations$settingsTab$es_ES._(_root); + @override + late final _Translations$troubleshootPage$es_ES troubleshootPage = _Translations$troubleshootPage$es_ES._(_root); + @override + late final _Translations$receiveHistoryPage$es_ES receiveHistoryPage = _Translations$receiveHistoryPage$es_ES._(_root); + @override + late final _Translations$apkPickerPage$es_ES apkPickerPage = _Translations$apkPickerPage$es_ES._(_root); + @override + late final _Translations$selectedFilesPage$es_ES selectedFilesPage = _Translations$selectedFilesPage$es_ES._(_root); + @override + late final _Translations$receivePage$es_ES receivePage = _Translations$receivePage$es_ES._(_root); + @override + late final _Translations$receiveOptionsPage$es_ES receiveOptionsPage = _Translations$receiveOptionsPage$es_ES._(_root); + @override + late final _Translations$sendPage$es_ES sendPage = _Translations$sendPage$es_ES._(_root); + @override + late final _Translations$progressPage$es_ES progressPage = _Translations$progressPage$es_ES._(_root); + @override + late final _Translations$webSharePage$es_ES webSharePage = _Translations$webSharePage$es_ES._(_root); + @override + late final _Translations$aboutPage$es_ES aboutPage = _Translations$aboutPage$es_ES._(_root); + @override + late final _Translations$donationPage$es_ES donationPage = _Translations$donationPage$es_ES._(_root); + @override + late final _Translations$changelogPage$es_ES changelogPage = _Translations$changelogPage$es_ES._(_root); + @override + late final _Translations$dialogs$es_ES dialogs = _Translations$dialogs$es_ES._(_root); + @override + late final _Translations$sanitization$es_ES sanitization = _Translations$sanitization$es_ES._(_root); + @override + late final _Translations$tray$es_ES tray = _Translations$tray$es_ES._(_root); + @override + late final _Translations$web$es_ES web = _Translations$web$es_ES._(_root); + @override + late final _Translations$assetPicker$es_ES assetPicker = _Translations$assetPicker$es_ES._(_root); + @override + late final _Translations$networkInterfacesPage$es_ES networkInterfacesPage = _Translations$networkInterfacesPage$es_ES._(_root); +} + +// Path: general +class _Translations$general$es_ES extends Translations$general$en { + _Translations$general$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Aceptar'; + @override + String get accepted => 'Aceptado'; + @override + String get add => 'Añadir'; + @override + String get advanced => 'Avanzado'; + @override + String get cancel => 'Cancelar'; + @override + String get close => 'Cerrar'; + @override + String get confirm => 'Confirmar'; + @override + String get continueStr => 'Continuar'; + @override + String get copy => 'Copiar'; + @override + String get copiedToClipboard => 'Copiado al Portapapeles'; + @override + String get decline => 'Rechazar'; + @override + String get done => 'Hecho'; + @override + String get delete => 'Eliminar'; + @override + String get edit => 'Editar'; + @override + String get error => 'Error'; + @override + String get example => 'Ejemplo'; + @override + String get files => 'Archivos'; + @override + String get finished => 'Finalizado'; + @override + String get hide => 'Ocultar'; + @override + String get off => 'Apagado'; + @override + String get offline => 'Desconectado'; + @override + String get on => 'Encendido'; + @override + String get online => 'En línea'; + @override + String get open => 'Abrir'; + @override + String get queue => 'Cola'; + @override + String get quickSave => 'Guardado rápido'; + @override + String get quickSaveFromFavorites => 'Guardado rápido en "Favoritos"'; + @override + String get renamed => 'Renombrado'; + @override + String get reset => 'Deshacer cambios'; + @override + String get restart => 'Reiniciar'; + @override + String get settings => 'Ajustes'; + @override + String get skipped => 'Omitido'; + @override + String get start => 'Iniciar'; + @override + String get stop => 'Detener'; + @override + String get save => 'Guardar'; + @override + String get unchanged => 'Sin Cambios'; + @override + String get unknown => 'Desconocido'; + @override + String get noItemInClipboard => 'No hay ningún elemento en el portapapeles.'; +} + +// Path: receiveTab +class _Translations$receiveTab$es_ES extends Translations$receiveTab$en { + _Translations$receiveTab$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Recibir'; + @override + late final _Translations$receiveTab$infoBox$es_ES infoBox = _Translations$receiveTab$infoBox$es_ES._(_root); + @override + late final _Translations$receiveTab$quickSave$es_ES quickSave = _Translations$receiveTab$quickSave$es_ES._(_root); +} + +// Path: sendTab +class _Translations$sendTab$es_ES extends Translations$sendTab$en { + _Translations$sendTab$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Enviar'; + @override + late final _Translations$sendTab$selection$es_ES selection = _Translations$sendTab$selection$es_ES._(_root); + @override + late final _Translations$sendTab$picker$es_ES picker = _Translations$sendTab$picker$es_ES._(_root); + @override + String get shareIntentInfo => 'También puedes usar la opción "Compartir" de tu dispositivo para seleccionar archivos más fácilmente.'; + @override + String get nearbyDevices => 'Dispositivos Cercanos'; + @override + String get thisDevice => 'Este dispositivo'; + @override + String get scan => 'Buscar dispositivos'; + @override + String get manualSending => 'Enviar manualmente'; + @override + String get sendMode => 'Modo de envío'; + @override + late final _Translations$sendTab$sendModes$es_ES sendModes = _Translations$sendTab$sendModes$es_ES._(_root); + @override + String get sendModeHelp => 'Explicación'; + @override + String get help => 'Por favor asegúrese que el dispositivo de destino esté en la misma red Wi-Fi.'; + @override + String get placeItems => 'Selecciona elementos para compartir.'; +} + +// Path: settingsTab +class _Translations$settingsTab$es_ES extends Translations$settingsTab$en { + _Translations$settingsTab$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ajustes'; + @override + late final _Translations$settingsTab$general$es_ES general = _Translations$settingsTab$general$es_ES._(_root); + @override + late final _Translations$settingsTab$receive$es_ES receive = _Translations$settingsTab$receive$es_ES._(_root); + @override + late final _Translations$settingsTab$send$es_ES send = _Translations$settingsTab$send$es_ES._(_root); + @override + late final _Translations$settingsTab$network$es_ES network = _Translations$settingsTab$network$es_ES._(_root); + @override + late final _Translations$settingsTab$other$es_ES other = _Translations$settingsTab$other$es_ES._(_root); + @override + String get advancedSettings => 'Configuración avanzada'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$es_ES extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Solucionar problemas'; + @override + String get subTitle => '¿La aplicación no funciona como debería? Aquí puedes encontrar soluciones a problemas comunes.'; + @override + String get solution => 'Solución:'; + @override + String get fixButton => 'Corregir automáticamente'; + @override + late final _Translations$troubleshootPage$firewall$es_ES firewall = _Translations$troubleshootPage$firewall$es_ES._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$es_ES noDiscovery = _Translations$troubleshootPage$noDiscovery$es_ES._(_root); + @override + late final _Translations$troubleshootPage$noConnection$es_ES noConnection = _Translations$troubleshootPage$noConnection$es_ES._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$es_ES extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Historial'; + @override + String get openFolder => 'Abrir carpeta'; + @override + String get deleteHistory => 'Borrar historial'; + @override + String get empty => 'El historial está vacío.'; + @override + late final _Translations$receiveHistoryPage$entryActions$es_ES entryActions = _Translations$receiveHistoryPage$entryActions$es_ES._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$es_ES extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplicaciones (APK)'; + @override + String get excludeSystemApps => 'Excluir apps de sistema'; + @override + String get excludeAppsWithoutLaunchIntent => 'Excluir apps no ejecutables'; + @override + String apps({required Object n}) => '${n} Aplicaciones'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$es_ES extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Eliminar todo'; +} + +// Path: receivePage +class _Translations$receivePage$es_ES extends Translations$receivePage$en { + _Translations$receivePage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('es'))( + n, + one: 'quiere enviarte un archivo', + other: 'quiere enviarte ${n} archivos', + ); + @override + String get subTitleMessage => 'te ha enviado un mensaje:'; + @override + String get subTitleLink => 'te ha enviado un enlace:'; + @override + String get canceled => 'El remitente ha cancelado la petición.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$es_ES extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Opciones'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(Carpeta LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Desactivado automáticamente porque hay carpetas.'; +} + +// Path: sendPage +class _Translations$sendPage$es_ES extends Translations$sendPage$en { + _Translations$sendPage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Esperando respuesta…'; + @override + String get rejected => 'El destino ha rechazado la petición.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'El destino está ocupado con otra petición.'; +} + +// Path: progressPage +class _Translations$progressPage$es_ES extends Translations$progressPage$en { + _Translations$progressPage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Enviando archivos'; + @override + String get titleReceiving => 'Recibiendo archivos'; + @override + String get savedToGallery => 'Guardado en fotos'; + @override + late final _Translations$progressPage$total$es_ES total = _Translations$progressPage$total$es_ES._(_root); + @override + late final _Translations$progressPage$remainingTime$es_ES remainingTime = _Translations$progressPage$remainingTime$es_ES._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$es_ES extends Translations$webSharePage$en { + _Translations$webSharePage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Compartir mediante enlace'; + @override + String get loading => 'Iniciando servidor…'; + @override + String get stopping => 'Deteniendo servidor…'; + @override + String get error => 'Se ha producido un error al iniciar el servidor.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('es'))( + n, + one: 'Abre este enlace en el navegador:', + other: 'Abre uno de estos enlaces en el navegador:', + ); + @override + String get requests => 'Solicitudes'; + @override + String get noRequests => 'Aún no hay solicitudes.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Aceptar solicitudes automáticamente'; + @override + String get requirePin => 'Requerir PIN'; + @override + String pinHint({required Object pin}) => 'El PIN es "${pin}"'; + @override + String get encryptionHint => 'LocalSend utiliza un certificado autofirmado. Necesitas aceptarlo en el navegador.'; + @override + String pendingRequests({required Object n}) => 'Solicitudes pendientes: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$es_ES extends Translations$aboutPage$en { + _Translations$aboutPage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sobre LocalSend'; + @override + List get description => [ + 'LocalSend es una aplicación libre, de código abierto, que te permite compartir archivos y mensajes de forma segura con dispositivos cercanos a través de tu red local sin necesidad de conexión a Internet.', + 'Está disponible para Android, iOS, macOS, Windows y Linux. Puedes encontrar todas las opciones de descarga en la página web oficial.', + ]; + @override + String get author => 'Autor'; + @override + String get contributors => 'Colaboradores'; + @override + String get packagers => 'Empaquetadores'; + @override + String get translators => 'Traductores'; +} + +// Path: donationPage +class _Translations$donationPage$es_ES extends Translations$donationPage$en { + _Translations$donationPage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Donar'; + @override + String get info => + 'LocalSend es libre, open source y no contiene anuncios. Si te gusta la aplicación puedes ayudar al desarrollo con una donación.'; + @override + String donate({required Object amount}) => 'Donar ${amount}'; + @override + String get thanks => '¡Muchas gracias!'; + @override + String get restore => 'Restablecer compra'; +} + +// Path: changelogPage +class _Translations$changelogPage$es_ES extends Translations$changelogPage$en { + _Translations$changelogPage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Registro de cambios'; +} + +// Path: dialogs +class _Translations$dialogs$es_ES extends Translations$dialogs$en { + _Translations$dialogs$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$es_ES addFile = _Translations$dialogs$addFile$es_ES._(_root); + @override + late final _Translations$dialogs$openFile$es_ES openFile = _Translations$dialogs$openFile$es_ES._(_root); + @override + late final _Translations$dialogs$addressInput$es_ES addressInput = _Translations$dialogs$addressInput$es_ES._(_root); + @override + late final _Translations$dialogs$cancelSession$es_ES cancelSession = _Translations$dialogs$cancelSession$es_ES._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$es_ES cannotOpenFile = _Translations$dialogs$cannotOpenFile$es_ES._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$es_ES encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$es_ES._( + _root, + ); + @override + late final _Translations$dialogs$errorDialog$es_ES errorDialog = _Translations$dialogs$errorDialog$es_ES._(_root); + @override + late final _Translations$dialogs$favoriteDialog$es_ES favoriteDialog = _Translations$dialogs$favoriteDialog$es_ES._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$es_ES favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$es_ES._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$es_ES favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$es_ES._(_root); + @override + late final _Translations$dialogs$fileInfo$es_ES fileInfo = _Translations$dialogs$fileInfo$es_ES._(_root); + @override + late final _Translations$dialogs$fileNameInput$es_ES fileNameInput = _Translations$dialogs$fileNameInput$es_ES._(_root); + @override + late final _Translations$dialogs$historyClearDialog$es_ES historyClearDialog = _Translations$dialogs$historyClearDialog$es_ES._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$es_ES localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$es_ES._( + _root, + ); + @override + late final _Translations$dialogs$messageInput$es_ES messageInput = _Translations$dialogs$messageInput$es_ES._(_root); + @override + late final _Translations$dialogs$noFiles$es_ES noFiles = _Translations$dialogs$noFiles$es_ES._(_root); + @override + late final _Translations$dialogs$noPermission$es_ES noPermission = _Translations$dialogs$noPermission$es_ES._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$es_ES notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$es_ES._(_root); + @override + late final _Translations$dialogs$qr$es_ES qr = _Translations$dialogs$qr$es_ES._(_root); + @override + late final _Translations$dialogs$quickActions$es_ES quickActions = _Translations$dialogs$quickActions$es_ES._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$es_ES quickSaveNotice = _Translations$dialogs$quickSaveNotice$es_ES._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$es_ES quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$es_ES._(_root); + @override + late final _Translations$dialogs$pin$es_ES pin = _Translations$dialogs$pin$es_ES._(_root); + @override + late final _Translations$dialogs$sendModeHelp$es_ES sendModeHelp = _Translations$dialogs$sendModeHelp$es_ES._(_root); + @override + late final _Translations$dialogs$zoom$es_ES zoom = _Translations$dialogs$zoom$es_ES._(_root); +} + +// Path: sanitization +class _Translations$sanitization$es_ES extends Translations$sanitization$en { + _Translations$sanitization$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get empty => 'El nombre del archivo no puede estar vacío'; + @override + String get invalid => 'El nombre del archivo contiene caracteres no válidos'; +} + +// Path: tray +class _Translations$tray$es_ES extends Translations$tray$en { + _Translations$tray$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Cerrar LocalSend'; + @override + String get closeWindows => 'Cerrar'; +} + +// Path: web +class _Translations$web$es_ES extends Translations$web$en { + _Translations$web$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Ingresar PIN'; + @override + String get invalidPin => 'PIN Inválido'; + @override + String get tooManyAttempts => 'Demasiados intentos'; + @override + String get rejected => 'Rechazado'; + @override + String get files => 'Archivos'; + @override + String get fileName => 'Nombre del archivo'; + @override + String get size => 'Tamaño'; +} + +// Path: assetPicker +class _Translations$assetPicker$es_ES extends Translations$assetPicker$en { + _Translations$assetPicker$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Confirmar'; + @override + String get cancel => 'Cancelar'; + @override + String get edit => 'Editar'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Error de carga'; + @override + String get original => 'Original'; + @override + String get preview => 'Vista previa'; + @override + String get select => 'Seleccionar'; + @override + String get emptyList => 'Lista vacía'; + @override + String get unSupportedAssetType => 'Tipo de archivo no soportado.'; + @override + String get unableToAccessAll => 'No se puede acceder a todos los archivos del dispositivo'; + @override + String get viewingLimitedAssetsTip => 'Ver solo los archivos y álbumes accesibles para la aplicación.'; + @override + String get changeAccessibleLimitedAssets => 'Haga clic para actualizar los archivos accesibles'; + @override + String get accessAllTip => + 'La aplicación solo puede acceder a algunos archivos del dispositivo. Ve a la configuración del sistema y permite que la aplicación acceda a todos los archivos multimedia del dispositivo.'; + @override + String get goToSystemSettings => 'Ir a los ajustes del sistema'; + @override + String get accessLimitedAssets => 'Continuar con acceso limitado'; + @override + String get accessiblePathName => 'Archivos accesibles'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Imagen'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Otros medios'; + @override + String get sActionPlayHint => 'reproducir'; + @override + String get sActionPreviewHint => 'vista previa'; + @override + String get sActionSelectHint => 'selecccionar'; + @override + String get sActionSwitchPathLabel => 'cambiar ruta'; + @override + String get sActionUseCameraHint => 'usar cámara'; + @override + String get sNameDurationLabel => 'duración'; + @override + String get sUnitAssetCountLabel => 'conteo'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$es_ES extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Interfaces de la red'; + @override + String get info => + 'De forma predeterminada, LocalSend utiliza todas las interfaces de red disponibles. Aquí puede desactivar las redes no deseadas. Debe reiniciar el servidor para aplicar los cambios.'; + @override + String get preview => 'Vista previa'; + @override + String get whitelist => 'Lista blanca'; + @override + String get blacklist => 'Lista negra'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$es_ES extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Puerto:'; + @override + String get alias => 'Alias:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$es_ES extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Favoritos'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$es_ES extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Selección'; + @override + String files({required Object files}) => 'Archivos: ${files}'; + @override + String size({required Object size}) => 'Tamaño: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$es_ES extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get file => 'Archivo'; + @override + String get folder => 'Carpeta'; + @override + String get media => 'Medios'; + @override + String get text => 'Texto'; + @override + String get app => 'App'; + @override + String get clipboard => 'Pegar'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$es_ES extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get single => 'Solo un destino'; + @override + String get multiple => 'Múltiples destinos'; + @override + String get link => 'Compartir enlace'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$es_ES extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'General'; + @override + String get brightness => 'Luminosidad'; + @override + late final _Translations$settingsTab$general$brightnessOptions$es_ES brightnessOptions = + _Translations$settingsTab$general$brightnessOptions$es_ES._(_root); + @override + String get color => 'Color'; + @override + late final _Translations$settingsTab$general$colorOptions$es_ES colorOptions = _Translations$settingsTab$general$colorOptions$es_ES._(_root); + @override + String get language => 'Idioma'; + @override + late final _Translations$settingsTab$general$languageOptions$es_ES languageOptions = _Translations$settingsTab$general$languageOptions$es_ES._( + _root, + ); + @override + String get saveWindowPlacement => 'Al salir guardar la ubicación de la ventana'; + @override + String get saveWindowPlacementWindows => 'Guardar la posición de la ventana después de salir'; + @override + String get minimizeToTray => 'Cerrar: Minimizar ventana'; + @override + String get launchAtStartup => 'Inicio automático'; + @override + String get launchMinimized => 'Inicio automático: Iniciar minimizado'; + @override + String get showInContextMenu => 'Mostrar LocalSend en el menú contextual'; + @override + String get animations => 'Animaciones'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$es_ES extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Recibir'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Auto finalizar'; + @override + String get destination => 'Guardar en carpeta'; + @override + String get downloads => '(Descargas)'; + @override + String get saveToGallery => 'Guardar media en la galería'; + @override + String get saveToHistory => 'Guardar en el historial'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$es_ES extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Enviar'; + @override + String get shareViaLinkAutoAccept => 'Aceptar automáticamente solicitudes en el modo "Compartir mediante enlace"'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$es_ES extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Red'; + @override + String get needRestart => '¡Reinicia el servidor para aplicar los ajustes!'; + @override + String get server => 'Servidor'; + @override + String get alias => 'Alias'; + @override + String get deviceType => 'Tipo de dispositivo'; + @override + String get deviceModel => 'Modelo de dispositivo'; + @override + String get port => 'Puerto'; + @override + String get discoveryTimeout => 'Tiempo de espera para Detección'; + @override + String get useSystemName => 'Usar el nombre del sistema'; + @override + String get generateRandomAlias => 'Generar alias aleatorio'; + @override + String portWarning({required Object defaultPort}) => + 'Es posible que no seas visible para otros dispositivos porque estás utilizando un puerto personalizado. (Puerto por defecto: ${defaultPort})'; + @override + String get encryption => 'Encriptación'; + @override + String get multicastGroup => 'Direccion Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Es posible que no seas visible para otros dispositivos porque estás utilizando una dirección multicast personalizada. (Dirección multicast por defecto: ${defaultMulticast})'; + @override + String get network => 'Red'; + @override + late final _Translations$settingsTab$network$networkOptions$es_ES networkOptions = _Translations$settingsTab$network$networkOptions$es_ES._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$es_ES extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Otros'; + @override + String get support => 'Apoya a LocalSend'; + @override + String get donate => 'Donar'; + @override + String get privacyPolicy => 'Política de privacidad'; + @override + String get termsOfUse => 'Condiciones de uso'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$es_ES extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Este dispositivo puede enviar archivos a otros, pero otros dispositivos no pueden enviar archivos a este.'; + @override + String solution({required Object port}) => + 'Lo más probable es que se trate de un problema con el firewall, puedes solucionarlo permitiendo las conexiones entrantes (UDP y TCP) en el puerto ${port}.'; + @override + String get openFirewall => 'Abrir Firewall'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$es_ES extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Este dispositivo no puede descubrir otros dispositivos.'; + @override + String get solution => + 'Asegúrese que todos los dispositivos estén en la misma red Wi-Fi y compartan la misma configuración (puerto, dirección de multidifusión, cifrado). Puede intentar escribir la dirección IP del dispositivo de destino manualmente. Si esto funciona, considere agregar este dispositivo a los favoritos para que pueda detectarse automáticamente en el futuro.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$es_ES extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ambos dispositivos no pueden descubrirse ni compartir archivos.'; + @override + String get solution => + '¿El problema existe en ambos lados? Tienes que asegurarte que los dispositivos están en la misma red Wi-Fi y comparten la misma configuración (puerto, dirección multicast, encriptación). Es posible que el Wi-Fi no permita la comunicación entre los dispositivos. En este caso, hay que activar esta opción en el router.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$es_ES extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get open => 'Abrir archivo'; + @override + String get showInFolder => 'Mostrar en carpeta'; + @override + String get info => 'Información'; + @override + String get deleteFromHistory => 'Borrar del historial'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$es_ES extends Translations$progressPage$total$en { + _Translations$progressPage$total$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$es_ES title = _Translations$progressPage$total$title$es_ES._(_root); + @override + String count({required Object curr, required Object n}) => 'Archivos: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Tamaño: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Velocidad: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$es_ES extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Usa «h» como abreviatura de horas y «m» para minutos + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Usa «d» para días, «h» para horas y «m» para minutos + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$es_ES extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Añadir a selección'; + @override + String get content => '¿Qué quieres añadir?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$es_ES extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Abrir archivo'; + @override + String get content => '¿Quieres abrir el archivo recibido?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$es_ES extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Introducir dirección'; + @override + String get hashtag => 'Etiqueta'; + @override + String get ip => 'Dirección IP'; + @override + String get recentlyUsed => 'Usados recientemente: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$es_ES extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Cancelar transferencia de archivos'; + @override + String get content => '¿Realmente quieres cancelar la transferencia de archivos?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$es_ES extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'No se puede abrir el archivo'; + @override + String content({required Object file}) => 'No se ha podido abrir "${file}". ¿Es posible que el archivo se haya movido, renombrado o eliminado?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$es_ES extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Encriptación deshabilitada'; + @override + String get content => + 'La comunicación ahora tiene lugar mediante un protocolo HTTP sin encriptar. Para usar HTTPS, vuelve a habilitar la encriptación.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$es_ES extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$es_ES extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favoritos'; + @override + String get noFavorites => 'Aún no hay dispositivos favoritos.'; + @override + String get addFavorite => 'Agregar'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$es_ES extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Eliminar de favoritos'; + @override + String content({required Object name}) => '¿Realmente quieres borrar de favoritos "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$es_ES extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Agregar a favoritos'; + @override + String get titleEdit => 'Ajustes'; + @override + String get name => 'Alias'; + @override + String get auto => '(auto)'; + @override + String get ip => 'Dirección IP'; + @override + String get port => 'Puerto'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$es_ES extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Información del archivo'; + @override + String get fileName => 'Nombre del archivo:'; + @override + String get path => 'Ruta:'; + @override + String get size => 'Tamaño:'; + @override + String get sender => 'Emisor:'; + @override + String get time => 'Hora:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$es_ES extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Introduce el nombre'; + @override + String original({required Object original}) => 'Original: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$es_ES extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Borrar historial'; + @override + String get content => '¿Realmente quieres borrar todo el historial?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$es_ES extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend no puede encontrar otros dispositivos sin tener permiso para escanear la red local. Por favor, concede este permiso en los ajustes.'; + @override + String get gotoSettings => 'Ajustes'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$es_ES extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Escribe un mensaje'; + @override + String get multiline => 'Varias líneas'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$es_ES extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ningún archivo seleccionado'; + @override + String get content => 'Por favor selecciona al menos un archivo.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$es_ES extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sin autorización'; + @override + String get content => 'No has otorgado los permisos necesarios. Por favor, otórgalos en la configuración.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$es_ES extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'No disponible'; + @override + String get content => 'Esta característica solo está disponible en:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$es_ES extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Código QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$es_ES extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Acciones rápidas'; + @override + String get counter => 'Contador'; + @override + String get prefix => 'Prefijo'; + @override + String get padZero => 'Llenar con ceros'; + @override + String get sortBeforeCount => 'Ordenar alfabéticamente antes'; + @override + String get random => 'Aleatorio'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$es_ES extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Las solicitudes de archivos se aceptan automáticamente. Ten en cuenta que cualquiera en la red local podrá enviarte archivos.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$es_ES extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Se aceptarán automáticamente los archivos recibidos de los dispositivos incluidos en su lista de favoritos.', + 'Advertencia: esta opción no es completamente segura, cualquiera que conozca la huella digital de sus dispositivos favoritos aún puede enviarle archivos.', + 'Sin embargo, esta opción sigue siendo más segura que permitir que todos los usuarios en la red local te envíen archivos sin restricción.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$es_ES extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ingresar PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$es_ES extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Modos de envío'; + @override + String get single => 'Enviar archivos a un solo destino. La selección se borrará una vez finalizada la transferencia.'; + @override + String get multiple => 'Enviar archivos a múltiples destinos. La selección no se borrará.'; + @override + String get link => + 'Los destinatarios que no tengan LocalSend instalado pueden descargar los archivos seleccionados abriendo el enlace en su navegador.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$es_ES extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$es_ES extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get dark => 'Oscuro'; + @override + String get light => 'Claro'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$es_ES extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$es_ES extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$es_ES extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String get all => 'Todo'; + @override + String get filtered => 'Filtrado'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$es_ES extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$es_ES._(TranslationsEsEs root) : this._root = root, super.internal(root); + + final TranslationsEsEs _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Progreso total (${time})'; + @override + String get finishedError => 'Finalizado con error'; + @override + String get canceledSender => 'Cancelado por remitente'; + @override + String get canceledReceiver => 'Cancelado por destino'; +} diff --git a/app/lib/gen/strings_et.g.dart b/app/lib/gen/strings_et.g.dart new file mode 100644 index 0000000..895dd53 --- /dev/null +++ b/app/lib/gen/strings_et.g.dart @@ -0,0 +1,1437 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsEt extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsEt({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.et, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsEt _root = this; // ignore: unused_field + + @override + TranslationsEt $copyWith({TranslationMetadata? meta}) => TranslationsEt(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Eesti keel'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$et general = _Translations$general$et._(_root); + @override + late final _Translations$receiveTab$et receiveTab = _Translations$receiveTab$et._(_root); + @override + late final _Translations$sendTab$et sendTab = _Translations$sendTab$et._(_root); + @override + late final _Translations$settingsTab$et settingsTab = _Translations$settingsTab$et._(_root); + @override + late final _Translations$troubleshootPage$et troubleshootPage = _Translations$troubleshootPage$et._(_root); + @override + late final _Translations$receiveHistoryPage$et receiveHistoryPage = _Translations$receiveHistoryPage$et._(_root); + @override + late final _Translations$apkPickerPage$et apkPickerPage = _Translations$apkPickerPage$et._(_root); + @override + late final _Translations$selectedFilesPage$et selectedFilesPage = _Translations$selectedFilesPage$et._(_root); + @override + late final _Translations$receivePage$et receivePage = _Translations$receivePage$et._(_root); + @override + late final _Translations$receiveOptionsPage$et receiveOptionsPage = _Translations$receiveOptionsPage$et._(_root); + @override + late final _Translations$sendPage$et sendPage = _Translations$sendPage$et._(_root); + @override + late final _Translations$progressPage$et progressPage = _Translations$progressPage$et._(_root); + @override + late final _Translations$webSharePage$et webSharePage = _Translations$webSharePage$et._(_root); + @override + late final _Translations$aboutPage$et aboutPage = _Translations$aboutPage$et._(_root); + @override + late final _Translations$donationPage$et donationPage = _Translations$donationPage$et._(_root); + @override + late final _Translations$changelogPage$et changelogPage = _Translations$changelogPage$et._(_root); + @override + late final _Translations$dialogs$et dialogs = _Translations$dialogs$et._(_root); + @override + late final _Translations$sanitization$et sanitization = _Translations$sanitization$et._(_root); + @override + late final _Translations$tray$et tray = _Translations$tray$et._(_root); + @override + late final _Translations$web$et web = _Translations$web$et._(_root); + @override + late final _Translations$assetPicker$et assetPicker = _Translations$assetPicker$et._(_root); + @override + late final _Translations$networkInterfacesPage$et networkInterfacesPage = _Translations$networkInterfacesPage$et._(_root); +} + +// Path: general +class _Translations$general$et extends Translations$general$en { + _Translations$general$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Nõustu'; + @override + String get accepted => 'Nõustusid'; + @override + String get add => 'Lisa'; + @override + String get advanced => 'Lisavalikud'; + @override + String get cancel => 'Katkesta'; + @override + String get close => 'Sulge'; + @override + String get confirm => 'Kinnita'; + @override + String get continueStr => 'Jätka'; + @override + String get copy => 'Kopeeri'; + @override + String get copiedToClipboard => 'Kopeeritud lõikelauale'; + @override + String get decline => 'Keeldu'; + @override + String get done => 'Valmis'; + @override + String get delete => 'Kustuta'; + @override + String get edit => 'Muuda'; + @override + String get error => 'Viga'; + @override + String get example => 'Näide'; + @override + String get files => 'Failid'; + @override + String get finished => 'Valmis'; + @override + String get hide => 'Peida'; + @override + String get off => 'Väljas'; + @override + String get offline => 'Pole võrgus'; + @override + String get on => 'Sees'; + @override + String get online => 'Võrgus'; + @override + String get open => 'Ava'; + @override + String get queue => 'Järjekorras'; + @override + String get quickSave => 'Kiirsalvestus'; + @override + String get quickSaveFromFavorites => 'Kiirsalvestamine „Lemmikutelt“'; + @override + String get renamed => 'Nimi on muudetud'; + @override + String get reset => 'Tühista muudatused'; + @override + String get restart => 'Käivita uuesti'; + @override + String get settings => 'Seadistused'; + @override + String get skipped => 'Vahelejäetud'; + @override + String get start => 'Alusta'; + @override + String get stop => 'Peata'; + @override + String get save => 'Salvesta'; + @override + String get unchanged => 'Muutmata'; + @override + String get unknown => 'Teadmata'; + @override + String get noItemInClipboard => 'Lõikelaual pole midagi.'; +} + +// Path: receiveTab +class _Translations$receiveTab$et extends Translations$receiveTab$en { + _Translations$receiveTab$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Võta vastu'; + @override + late final _Translations$receiveTab$infoBox$et infoBox = _Translations$receiveTab$infoBox$et._(_root); + @override + late final _Translations$receiveTab$quickSave$et quickSave = _Translations$receiveTab$quickSave$et._(_root); +} + +// Path: sendTab +class _Translations$sendTab$et extends Translations$sendTab$en { + _Translations$sendTab$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Saada'; + @override + late final _Translations$sendTab$selection$et selection = _Translations$sendTab$selection$et._(_root); + @override + late final _Translations$sendTab$picker$et picker = _Translations$sendTab$picker$et._(_root); + @override + String get shareIntentInfo => 'Klikates nutiseadmes olevates rakendustes nuppu „Jaga“ võid kasutada ka mugavat jagamise võimalust.'; + @override + String get nearbyDevices => 'Läheduses asuvad seadmed'; + @override + String get thisDevice => 'See seade'; + @override + String get scan => 'Otsi seadmeid'; + @override + String get manualSending => 'Saada käsitsi'; + @override + String get sendMode => 'Saatmisviis'; + @override + late final _Translations$sendTab$sendModes$et sendModes = _Translations$sendTab$sendModes$et._(_root); + @override + String get sendModeHelp => 'Selgitus'; + @override + String get help => 'Palun kontrolli, et sihtseade asub sama WiFi ühenduse piires.'; + @override + String get placeItems => 'Lisa jagatavad failid siia.'; +} + +// Path: settingsTab +class _Translations$settingsTab$et extends Translations$settingsTab$en { + _Translations$settingsTab$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Seadistused'; + @override + late final _Translations$settingsTab$general$et general = _Translations$settingsTab$general$et._(_root); + @override + late final _Translations$settingsTab$receive$et receive = _Translations$settingsTab$receive$et._(_root); + @override + late final _Translations$settingsTab$send$et send = _Translations$settingsTab$send$et._(_root); + @override + late final _Translations$settingsTab$network$et network = _Translations$settingsTab$network$et._(_root); + @override + late final _Translations$settingsTab$other$et other = _Translations$settingsTab$other$et._(_root); + @override + String get advancedSettings => 'Täiendavad seadistused'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$et extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Veaotsing'; + @override + String get subTitle => 'Kas rakendus toimib nii, nagu vaja? Siin võid leida lahendusi levinumatele probleemidele.'; + @override + String get solution => 'Lahendus:'; + @override + String get fixButton => 'Paranda automaatselt'; + @override + late final _Translations$troubleshootPage$firewall$et firewall = _Translations$troubleshootPage$firewall$et._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$et noDiscovery = _Translations$troubleshootPage$noDiscovery$et._(_root); + @override + late final _Translations$troubleshootPage$noConnection$et noConnection = _Translations$troubleshootPage$noConnection$et._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$et extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ajalugu'; + @override + String get openFolder => 'Ava kaust'; + @override + String get deleteHistory => 'Kustuta ajalugu'; + @override + String get empty => 'Ajalugu on tühi.'; + @override + late final _Translations$receiveHistoryPage$entryActions$et entryActions = _Translations$receiveHistoryPage$entryActions$et._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$et extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rakendused (apk-failid)'; + @override + String get excludeSystemApps => 'Välista süsteemi rakendused'; + @override + String get excludeAppsWithoutLaunchIntent => 'Välista mittekäivitatavad rakendused'; + @override + String apps({required Object n}) => '${n} rakendust'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$et extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Kustuta kõik'; +} + +// Path: receivePage +class _Translations$receivePage$et extends Translations$receivePage$en { + _Translations$receivePage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('et'))( + n, + one: 'soovib sulle saata faili', + other: 'soovib sulle saata ${n} faili', + ); + @override + String get subTitleMessage => 'saatis sulle sõnumi:'; + @override + String get subTitleLink => 'saatis sulle lingi:'; + @override + String get canceled => 'Saatja on päringu tühistanud.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$et extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Eelistused'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSendi kaust)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Pole kasutusel, kuna saadetavate hulgas leidub kaustu.'; +} + +// Path: sendPage +class _Translations$sendPage$et extends Translations$sendPage$en { + _Translations$sendPage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Ootame vastust…'; + @override + String get rejected => 'Vastuvõtja on vastuvõtmisest keeldunud.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Vastuvõtja on hõivatud teise päringuga tegelemisega.'; +} + +// Path: progressPage +class _Translations$progressPage$et extends Translations$progressPage$en { + _Translations$progressPage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Saadame faile'; + @override + String get titleReceiving => 'Võtame faile vastu'; + @override + String get savedToGallery => 'Salvestatud kausta Fotod'; + @override + late final _Translations$progressPage$total$et total = _Translations$progressPage$total$et._(_root); + @override + late final _Translations$progressPage$remainingTime$et remainingTime = _Translations$progressPage$remainingTime$et._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$et extends Translations$webSharePage$en { + _Translations$webSharePage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Jaga lingi vahendusel'; + @override + String get loading => 'Käivitame serverit…'; + @override + String get stopping => 'Peatame serverit…'; + @override + String get error => 'Serveri käivitamisel tekkis viga.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('et'))( + n, + one: 'Ava see link oma veebibrauseris:', + other: 'Ava üks neist linkidest oma veebibrauseris:', + ); + @override + String get requests => 'Päringuid'; + @override + String get noRequests => 'Päringuid veel pole.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Nõustu päringutega automaatselt'; + @override + String get requirePin => 'Küsi PIN-koodi'; + @override + String pinHint({required Object pin}) => 'PIN-kood on „${pin}“'; + @override + String get encryptionHint => 'LocalSend kasutab enda poolt allkirjastatud sertifikaate. Ühenduse toimimiseks palun nõustu nendega veebibrauseris.'; + @override + String pendingRequests({required Object n}) => 'Ootel päringuid: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$et extends Translations$aboutPage$en { + _Translations$aboutPage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rakenduse teave: LocalSend'; + @override + List get description => [ + 'LocalSend põhineb avatud lähtekoodil, on kõikide jaoks vaba ning tasuta kasutatav. Rakenduse eesmärgiks on võimaldada failide ja tekstide jagamist kohtvõrgus asuvate arvutite vahel nii, et välist internetiühendust pole vaja kasutada.', + 'See rakendus on saadaval Androidi, iOSi, macOSi, Windowsi ja Linuxi jaoks. Kõik allalaaditavad paigaldusfailid leiad meie ametlikust veebisaidist.', + ]; + @override + String get author => 'Autor'; + @override + String get contributors => 'Kaasautorid'; + @override + String get packagers => 'Pakendajad'; + @override + String get translators => 'Tõlkijad'; +} + +// Path: donationPage +class _Translations$donationPage$et extends Translations$donationPage$en { + _Translations$donationPage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Toeta meid rahaliselt'; + @override + String get info => + 'LocalSend põhineb avatud lähtekoodil, on kõikide jaoks vaba ning tasuta kasutatav, ega sisalda reklaame. Kui sulle see rakendus meeldib, siis palun toeta meie arendust.'; + @override + String donate({required Object amount}) => 'Anneta ${amount}'; + @override + String get thanks => 'Suur tänu!'; + @override + String get restore => 'Taasta ost'; +} + +// Path: changelogPage +class _Translations$changelogPage$et extends Translations$changelogPage$en { + _Translations$changelogPage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Muudatuste logi'; +} + +// Path: dialogs +class _Translations$dialogs$et extends Translations$dialogs$en { + _Translations$dialogs$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$et addFile = _Translations$dialogs$addFile$et._(_root); + @override + late final _Translations$dialogs$openFile$et openFile = _Translations$dialogs$openFile$et._(_root); + @override + late final _Translations$dialogs$addressInput$et addressInput = _Translations$dialogs$addressInput$et._(_root); + @override + late final _Translations$dialogs$cancelSession$et cancelSession = _Translations$dialogs$cancelSession$et._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$et cannotOpenFile = _Translations$dialogs$cannotOpenFile$et._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$et encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$et._(_root); + @override + late final _Translations$dialogs$errorDialog$et errorDialog = _Translations$dialogs$errorDialog$et._(_root); + @override + late final _Translations$dialogs$favoriteDialog$et favoriteDialog = _Translations$dialogs$favoriteDialog$et._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$et favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$et._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$et favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$et._(_root); + @override + late final _Translations$dialogs$fileInfo$et fileInfo = _Translations$dialogs$fileInfo$et._(_root); + @override + late final _Translations$dialogs$fileNameInput$et fileNameInput = _Translations$dialogs$fileNameInput$et._(_root); + @override + late final _Translations$dialogs$historyClearDialog$et historyClearDialog = _Translations$dialogs$historyClearDialog$et._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$et localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$et._(_root); + @override + late final _Translations$dialogs$messageInput$et messageInput = _Translations$dialogs$messageInput$et._(_root); + @override + late final _Translations$dialogs$noFiles$et noFiles = _Translations$dialogs$noFiles$et._(_root); + @override + late final _Translations$dialogs$noPermission$et noPermission = _Translations$dialogs$noPermission$et._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$et notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$et._(_root); + @override + late final _Translations$dialogs$qr$et qr = _Translations$dialogs$qr$et._(_root); + @override + late final _Translations$dialogs$quickActions$et quickActions = _Translations$dialogs$quickActions$et._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$et quickSaveNotice = _Translations$dialogs$quickSaveNotice$et._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$et quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$et._(_root); + @override + late final _Translations$dialogs$pin$et pin = _Translations$dialogs$pin$et._(_root); + @override + late final _Translations$dialogs$sendModeHelp$et sendModeHelp = _Translations$dialogs$sendModeHelp$et._(_root); + @override + late final _Translations$dialogs$zoom$et zoom = _Translations$dialogs$zoom$et._(_root); +} + +// Path: sanitization +class _Translations$sanitization$et extends Translations$sanitization$en { + _Translations$sanitization$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Failil peab olema nimi'; + @override + String get invalid => 'Failinimes on valesid tähemärke'; +} + +// Path: tray +class _Translations$tray$et extends Translations$tray$en { + _Translations$tray$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Sulge LocalSend'; + @override + String get closeWindows => 'Välju'; +} + +// Path: web +class _Translations$web$et extends Translations$web$en { + _Translations$web$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Sisesta PIN-kood'; + @override + String get invalidPin => 'Vigane PIN-kood'; + @override + String get tooManyAttempts => 'Liiga palju sisestuskatseid'; + @override + String get rejected => 'Keelatud'; + @override + String get files => 'Failid'; + @override + String get fileName => 'Failinimi'; + @override + String get size => 'Suurus'; +} + +// Path: assetPicker +class _Translations$assetPicker$et extends Translations$assetPicker$en { + _Translations$assetPicker$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Kinnita'; + @override + String get cancel => 'Katkesta'; + @override + String get edit => 'Muuda'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Laadimine ei õnnestunud'; + @override + String get original => 'Algne'; + @override + String get preview => 'Eelvaade'; + @override + String get select => 'Vali'; + @override + String get emptyList => 'Tühi loend'; + @override + String get unSupportedAssetType => 'Failitüüp pole toetatud.'; + @override + String get unableToAccessAll => 'Selles seadmes puudub ligipääs failidele'; + @override + String get viewingLimitedAssetsTip => 'Näed vaid faile ja albumeid, millele oled sellele rakendusele ligipääsu andnud.'; + @override + String get changeAccessibleLimitedAssets => 'Ligipääsetavate failide loendi uuendmiseks klõpsi'; + @override + String get accessAllTip => + 'Rakendusel on selles nutiseadmes ligipääs vaid mõnedele failidele. Kui vajad ligipääsu kõikidele meediafailidele, siis ava seadistused ning luba vastavad õigused.'; + @override + String get goToSystemSettings => 'Ava süsteemi seadistused'; + @override + String get accessLimitedAssets => 'Jätka piiratud ligipääsuga'; + @override + String get accessiblePathName => 'Kasutatavad failid'; + @override + String get sTypeAudioLabel => 'Heli'; + @override + String get sTypeImageLabel => 'Pilt'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Muu meedia'; + @override + String get sActionPlayHint => 'esita'; + @override + String get sActionPreviewHint => 'eelvaade'; + @override + String get sActionSelectHint => 'vali'; + @override + String get sActionSwitchPathLabel => 'muuda asukohta'; + @override + String get sActionUseCameraHint => 'kasuta kaamerat'; + @override + String get sNameDurationLabel => 'kestus'; + @override + String get sUnitAssetCountLabel => 'kogus'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$et extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Võrguliidesed'; + @override + String get preview => 'Eelvaade'; + @override + String get whitelist => 'Lubatud loend'; + @override + String get blacklist => 'Keelatud loend'; + @override + String get info => + 'Vaikimisi kasutab LocalSend kõiki võrguliideseid. Kui sul on vaja, siis saad mittesoovitud võrgud siinkohal välistada ning muudatuste jõustumine eeldab serverikomponendi uuesti käivitamist.'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$et extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP-aadress:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Seadme nimi:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$et extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Lemmikud'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$et extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Valik'; + @override + String files({required Object files}) => 'Failid: ${files}'; + @override + String size({required Object size}) => 'Andmemaht: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$et extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get file => 'Fail'; + @override + String get folder => 'Kaust'; + @override + String get media => 'Meedia'; + @override + String get text => 'Tekst'; + @override + String get app => 'Rakendus'; + @override + String get clipboard => 'Aseta'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$et extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get single => 'Üks vastuvõtja'; + @override + String get multiple => 'Mitu vastuvõtjat'; + @override + String get link => 'Jagamine lingi vahendusel'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$et extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Üldised seadistused'; + @override + String get brightness => 'Kujundus'; + @override + late final _Translations$settingsTab$general$brightnessOptions$et brightnessOptions = _Translations$settingsTab$general$brightnessOptions$et._( + _root, + ); + @override + String get color => 'Värv'; + @override + late final _Translations$settingsTab$general$colorOptions$et colorOptions = _Translations$settingsTab$general$colorOptions$et._(_root); + @override + String get language => 'Keel'; + @override + late final _Translations$settingsTab$general$languageOptions$et languageOptions = _Translations$settingsTab$general$languageOptions$et._(_root); + @override + String get saveWindowPlacement => 'Peale väljumist salvesta akna asukoht'; + @override + String get saveWindowPlacementWindows => 'Peale lõpetamist salvesta akna asukoht'; + @override + String get minimizeToTray => 'Sulgemisel aseta rakendus süsteemisalve'; + @override + String get launchAtStartup => 'Sisselogimisel käivita automaatselt'; + @override + String get launchMinimized => 'Automaatsel käivitamisel: käivita peidetuna'; + @override + String get showInContextMenu => 'Näita LocalSendi kontekstimenüüs'; + @override + String get animations => 'Animatsioonid'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$et extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Vastuvõtmine'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Lõpeta automaatselt'; + @override + String get destination => 'Salvesta kausta'; + @override + String get downloads => '(Allalaadimised)'; + @override + String get saveToGallery => 'Lisa meedia galeriisse'; + @override + String get saveToHistory => 'Salvesta ajalukku'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$et extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Saatmine'; + @override + String get shareViaLinkAutoAccept => 'Kui kasutusel on „Jaga lingi abil“, siis nõustu vastuvõtmisega automaatselt'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$et extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Võrk'; + @override + String get needRestart => 'Muudatuste jõustamiseks palun käivita server uuesti!'; + @override + String get server => 'Server'; + @override + String get alias => 'Seadme nimi'; + @override + String get deviceType => 'Seadme tüüp'; + @override + String get deviceModel => 'Seadme mudel'; + @override + String get port => 'Kasutatav port'; + @override + String get discoveryTimeout => 'Leitavuse aegumine'; + @override + String get useSystemName => 'Kasuta süsteemset nime'; + @override + String get generateRandomAlias => 'Loo juhuslik nimi'; + @override + String portWarning({required Object defaultPort}) => + 'Kuna kasutad endamääratud porti, siis muud seadmed ei pruugi seda seadet leida. (vaikimisi: ${defaultPort})'; + @override + String get encryption => 'Krüptimine'; + @override + String get multicastGroup => 'Multiedastuse aadress'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Kuna kasutad endamääratud multiedastuse aadressi, siis muud seadmed ei pruugi seda seadet leida. (vaikimisi: ${defaultMulticast})'; + @override + late final _Translations$settingsTab$network$networkOptions$et networkOptions = _Translations$settingsTab$network$networkOptions$et._(_root); + @override + String get network => 'Võrk'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$et extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Muu teave'; + @override + String get support => 'Toeta LocalSendi'; + @override + String get donate => 'Toeta rahaliselt'; + @override + String get privacyPolicy => 'Andmekaitsepõhimõtted'; + @override + String get termsOfUse => 'Kasutustingimused'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$et extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Siit seadmest on võimalik teisele faile saata, kuid teised ei saa siia saata.'; + @override + String solution({required Object port}) => + 'Tõenäoliselt on see seotud tulemüüriga. Olukorra võid lahendada lubades sisenevad (UDP ja TCP) ühendused pordis ${port}.'; + @override + String get openFirewall => 'Ava tulemüüri seadistused'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$et extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'See seade ei suuda tuvastada teisi seadeid.'; + @override + String get solution => + 'Palun kontrolli, et kõik seadmed asuvad samas WiFi võrgus ning kasutavad samu seadistusi (port, multiedastuse aadress ja krüptimine). Sa võid ka proovida sihtseadme IP-aadressi lisamist käsitsi. Kui siis ühendus toimib, võid ta lisada lemmikuks ja hilisem tuvastamine saab olema automaatne.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$et extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Mõlemad seadmed ei suuda üksteist leida ega jagada faile.'; + @override + String get solution => + 'Kas identne probleem on mõlemas seadmes? Kui nii, siis palun kontrolli, et mõlemad seadmed asuvad samas WiFi võrgus ning kasutavad samu seadistusi (port, multiedastuse aadress ja krüptimine). Aga samas on võimalik, et WiFi võrk on seadistatud nii, et kõik seadmed on üksteisest isoleeritud. Sel juhul küsi abi võrgu haldajalt, kes saab ruuteris teha vajalikud muudatused.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$et extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get open => 'Ava fail'; + @override + String get showInFolder => 'Näita kaustas'; + @override + String get info => 'Teave'; + @override + String get deleteFromHistory => 'Kustuta ajaloost'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$et extends Translations$progressPage$total$en { + _Translations$progressPage$total$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$et title = _Translations$progressPage$total$title$et._(_root); + @override + String count({required Object curr, required Object n}) => 'Faile: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Andmemaht: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Kiirus: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$et extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Kasuta „h“ tunni lühendina ja „m“ minutite jaoks + @override + String hours({required Object h, required Object m}) => '${h} t ${m} min'; + + /// Kasuta „d“ päeva, lühendina „h“ tunni lühendina ja „m“ minutite jaoks + @override + String days({required Object d, required Object h, required Object m}) => '${d} pv ${h} t ${m} min'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$et extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lisa valiku hulka'; + @override + String get content => 'Mida sa sooviksid lisada?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$et extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ava fail'; + @override + String get content => 'Kas sa soovid avada saadud faili?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$et extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sisesta aadress'; + @override + String get hashtag => 'Teemaviide'; + @override + String get ip => 'IP-aadress'; + @override + String get recentlyUsed => 'Hiljuti kasutatud: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$et extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Katkesta failide edastamine'; + @override + String get content => 'Kas sa kindlasti soovid katkestada failide edastamise?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$et extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Faili avamine ei õnnestu'; + @override + String content({required Object file}) => '„${file}“ faili avamine ei õnnestunud. Kas ta võib olla teisaldatud, ümbernimetatud või kustutatud?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$et extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Krüptimine pole kasutusel'; + @override + String get content => + 'Andmevahetus toimub nüüd krüptimata HTTP-protokolli vahendusel. Turvalise HTTPS-protokolli kasutamiseks lülita krüptimine sisse.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$et extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$et extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lemmikud'; + @override + String get noFavorites => 'Ühtegi lemmikseadet veel pole.'; + @override + String get addFavorite => 'Lisa'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$et extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kustuta lemmikute hulgast'; + @override + String content({required Object name}) => 'Kas sa kindlasti soovid „${name}“ kustutada lemmikute hulgast?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$et extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Lisa lemmikuks'; + @override + String get titleEdit => 'Seadistused'; + @override + String get name => 'Seadme nimi'; + @override + String get auto => '(automaatne)'; + @override + String get ip => 'IP-aadress'; + @override + String get port => 'Kasutatav port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$et extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Faili teave'; + @override + String get fileName => 'Failinimi:'; + @override + String get path => 'Asukoht:'; + @override + String get size => 'Suurus:'; + @override + String get sender => 'Saatja:'; + @override + String get time => 'Kellaaeg:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$et extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sisesta failinimi'; + @override + String original({required Object original}) => 'Algne: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$et extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tühjenda ajalugu'; + @override + String get content => 'Kas sa kindlasti soovid kogu ajaloo kustutada?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$et extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'Ilma kohtvõrgu skaneerimise õiguseta ei suuda LocalSend leida teisi seadmeid. Palun luba süsteemi seadistustest vajalikud õigused.'; + @override + String get gotoSettings => 'Seadistused'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$et extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kirjuta sõnum'; + @override + String get multiline => 'Mitmerealine'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$et extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ühtegi faili pole valitud'; + @override + String get content => 'Palun vali vähemalt üks fail.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$et extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Õigused puuduvad'; + @override + String get content => 'Sa pole rakendusele jaganud vajalikke õigusi. Palun tee seda süsteemi seadistustes.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$et extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Pole saadaval'; + @override + String get content => 'See funktsionaalsus on saadaval vaid:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$et extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR-kood'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$et extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kiirtoimingud'; + @override + String get counter => 'Loendur'; + @override + String get prefix => 'Eesliide'; + @override + String get padZero => 'Täida nullidega'; + @override + String get sortBeforeCount => 'Enne loendamist järjesta tähestiku järjekorras (A-Z)'; + @override + String get random => 'Juhuslikult'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$et extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Failipäringutega nõustume nüüd automaatselt. Palun arvesta, et seeläbi võivad kõik sinu kohtvõrgus saata sulle faile.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$et extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Failipäringutega nõustume nüüd automaatselt vaid nende seadmete puhul, mis on lemmikuks märgitud.', + 'Hoiatus! Kui kohtvõrgus tegutsev võimalik pahatahtlik osapool saaks kätte sinul lemmikuks märgitud seadmete võtmed ja sõrmejäljed, siis saaks sulle piiranguteta faile saata ja seega pole lahendus hetkel täiesti turvaline.', + 'Aga siiski on see valik turvalisem, kui lubada kõigil sinu kohtvõrgu kasutajatel saata sulle faile ilma igasuguste piiranguteta.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$et extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sisesta PIN-kood'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$et extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Saatmisviisid'; + @override + String get single => 'Sellega saadame faile ühele vastuvõtjale. Peale failide saatmise lõppu eemaldame failid saatmisloendist.'; + @override + String get multiple => 'Sellega saadame faile mitmele vastuvõtjale. Peale failide saatmise lõppu failid jäävad saatmisloendisse alles.'; + @override + String get link => + 'Kui failide vastuvõtjatel pole arvutis või nutiseadmes rakendust LocalSend, siis avades etteantud lingi oma veebibrauseris, saavad nad failid alla laadida.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$et extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Võrguaadress'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$et extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get system => 'Süsteemi kujundus'; + @override + String get dark => 'Tume kujundus'; + @override + String get light => 'Hele kujundus'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$et extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get system => 'Süsteemi värvid'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$et extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get system => 'Süsteemi keel'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$et extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String get filtered => 'Filtreeritud'; + @override + String get all => 'Kõik'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$et extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$et._(TranslationsEt root) : this._root = root, super.internal(root); + + final TranslationsEt _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Edenemine kokku (${time})'; + @override + String get finishedError => 'Lõppes veaga'; + @override + String get canceledSender => 'Saatja poolt katkestatud'; + @override + String get canceledReceiver => 'Vastuvõtja poolt katkestatud'; +} diff --git a/app/lib/gen/strings_eu.g.dart b/app/lib/gen/strings_eu.g.dart new file mode 100644 index 0000000..86998b0 --- /dev/null +++ b/app/lib/gen/strings_eu.g.dart @@ -0,0 +1,1272 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsEu extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsEu({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.eu, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsEu _root = this; // ignore: unused_field + + @override + TranslationsEu $copyWith({TranslationMetadata? meta}) => TranslationsEu(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Euskara'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$eu general = _Translations$general$eu._(_root); + @override + late final _Translations$receiveTab$eu receiveTab = _Translations$receiveTab$eu._(_root); + @override + late final _Translations$sendTab$eu sendTab = _Translations$sendTab$eu._(_root); + @override + late final _Translations$settingsTab$eu settingsTab = _Translations$settingsTab$eu._(_root); + @override + late final _Translations$troubleshootPage$eu troubleshootPage = _Translations$troubleshootPage$eu._(_root); + @override + late final _Translations$receiveHistoryPage$eu receiveHistoryPage = _Translations$receiveHistoryPage$eu._(_root); + @override + late final _Translations$apkPickerPage$eu apkPickerPage = _Translations$apkPickerPage$eu._(_root); + @override + late final _Translations$selectedFilesPage$eu selectedFilesPage = _Translations$selectedFilesPage$eu._(_root); + @override + late final _Translations$receivePage$eu receivePage = _Translations$receivePage$eu._(_root); + @override + late final _Translations$receiveOptionsPage$eu receiveOptionsPage = _Translations$receiveOptionsPage$eu._(_root); + @override + late final _Translations$sendPage$eu sendPage = _Translations$sendPage$eu._(_root); + @override + late final _Translations$progressPage$eu progressPage = _Translations$progressPage$eu._(_root); + @override + late final _Translations$webSharePage$eu webSharePage = _Translations$webSharePage$eu._(_root); + @override + late final _Translations$aboutPage$eu aboutPage = _Translations$aboutPage$eu._(_root); + @override + late final _Translations$changelogPage$eu changelogPage = _Translations$changelogPage$eu._(_root); + @override + late final _Translations$dialogs$eu dialogs = _Translations$dialogs$eu._(_root); + @override + late final _Translations$tray$eu tray = _Translations$tray$eu._(_root); + @override + late final _Translations$web$eu web = _Translations$web$eu._(_root); + @override + late final _Translations$assetPicker$eu assetPicker = _Translations$assetPicker$eu._(_root); + @override + late final _Translations$sanitization$eu sanitization = _Translations$sanitization$eu._(_root); + @override + late final _Translations$networkInterfacesPage$eu networkInterfacesPage = _Translations$networkInterfacesPage$eu._(_root); +} + +// Path: general +class _Translations$general$eu extends Translations$general$en { + _Translations$general$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Onartu'; + @override + String get accepted => 'Onartuta'; + @override + String get add => 'Gehitu'; + @override + String get advanced => 'Aurreratua'; + @override + String get cancel => 'Utzi'; + @override + String get close => 'Itxi'; + @override + String get confirm => 'Baieztatu'; + @override + String get continueStr => 'Jarraitu'; + @override + String get copy => 'Kopiatu'; + @override + String get copiedToClipboard => 'Arbelean kopiatua'; + @override + String get decline => 'Ez onartu'; + @override + String get done => 'Egina'; + @override + String get delete => 'Ezabatu'; + @override + String get edit => 'Editatu'; + @override + String get error => 'Errorea'; + @override + String get example => 'Adibidea'; + @override + String get files => 'Fitxategiak'; + @override + String get finished => 'Amaituta'; + @override + String get hide => 'Ezkutatu'; + @override + String get off => 'Itzalita'; + @override + String get offline => 'Deskonektatua'; + @override + String get on => 'Piztuta'; + @override + String get online => 'Online'; + @override + String get open => 'Ireki'; + @override + String get queue => 'Ilara'; + @override + String get quickSave => 'Gordetze Azkarra'; + @override + String get renamed => 'Berizendatua'; + @override + String get reset => 'Berrezarri'; + @override + String get restart => 'Berrasieratu'; + @override + String get settings => 'Aukerak'; + @override + String get skipped => 'Utzita'; + @override + String get start => 'Hasieratu'; + @override + String get stop => 'Gelditu'; + @override + String get save => 'Gorde'; + @override + String get unchanged => 'Aldaketarik gabe'; + @override + String get unknown => 'Ezezaguna'; + @override + String get noItemInClipboard => 'Arbela hutsik dago.'; + @override + String get quickSaveFromFavorites => '“Gogokoetan” gorde'; +} + +// Path: receiveTab +class _Translations$receiveTab$eu extends Translations$receiveTab$en { + _Translations$receiveTab$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Eskuratu'; + @override + late final _Translations$receiveTab$infoBox$eu infoBox = _Translations$receiveTab$infoBox$eu._(_root); + @override + late final _Translations$receiveTab$quickSave$eu quickSave = _Translations$receiveTab$quickSave$eu._(_root); +} + +// Path: sendTab +class _Translations$sendTab$eu extends Translations$sendTab$en { + _Translations$sendTab$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Bidali'; + @override + late final _Translations$sendTab$selection$eu selection = _Translations$sendTab$selection$eu._(_root); + @override + late final _Translations$sendTab$picker$eu picker = _Translations$sendTab$picker$eu._(_root); + @override + String get shareIntentInfo => 'Zure gailuko "Elkarbanatu" aukera ere erabil dezakezu fitxategi gehiago errezago aukeratzeko.'; + @override + String get nearbyDevices => 'Inguruko Gailuak'; + @override + String get thisDevice => 'Gailu hau'; + @override + String get scan => 'Bilatu gailuak'; + @override + String get sendMode => 'Bidalketa modua'; + @override + late final _Translations$sendTab$sendModes$eu sendModes = _Translations$sendTab$sendModes$eu._(_root); + @override + String get sendModeHelp => 'Azalpena'; + @override + String get help => 'Ziurtatu zaitez aukeratutako hartzailea zure Wi-Fi sare berean dagoela.'; + @override + String get placeItems => 'Aukeratu elkarbanatzeko elementuak.'; + @override + String get manualSending => 'Eskuzko bidalketa'; +} + +// Path: settingsTab +class _Translations$settingsTab$eu extends Translations$settingsTab$en { + _Translations$settingsTab$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ezarpenak'; + @override + late final _Translations$settingsTab$general$eu general = _Translations$settingsTab$general$eu._(_root); + @override + late final _Translations$settingsTab$receive$eu receive = _Translations$settingsTab$receive$eu._(_root); + @override + late final _Translations$settingsTab$network$eu network = _Translations$settingsTab$network$eu._(_root); + @override + String get advancedSettings => 'Ezarpen aurreratuak'; + @override + late final _Translations$settingsTab$send$eu send = _Translations$settingsTab$send$eu._(_root); + @override + late final _Translations$settingsTab$other$eu other = _Translations$settingsTab$other$eu._(_root); +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$eu extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Konpondu arazoak'; + @override + String get subTitle => 'Aplikazioa ez dabil espero bezala? Hemen arazo arrunten konponbidea aurki dezakezu.'; + @override + String get solution => 'Konponbidea:'; + @override + String get fixButton => 'Konpondu automatikoki'; + @override + late final _Translations$troubleshootPage$firewall$eu firewall = _Translations$troubleshootPage$firewall$eu._(_root); + @override + late final _Translations$troubleshootPage$noConnection$eu noConnection = _Translations$troubleshootPage$noConnection$eu._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$eu noDiscovery = _Translations$troubleshootPage$noDiscovery$eu._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$eu extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Historia'; + @override + String get openFolder => 'Ireki direktorioa'; + @override + String get deleteHistory => 'Ezabatu historia'; + @override + String get empty => 'Historia hutsik dago.'; + @override + late final _Translations$receiveHistoryPage$entryActions$eu entryActions = _Translations$receiveHistoryPage$entryActions$eu._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$eu extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'App-ak (APK)'; + @override + String get excludeSystemApps => 'Baztertu sistemako app-ak'; + @override + String get excludeAppsWithoutLaunchIntent => 'Baztertu exekutatu ezin diren app-ak'; + @override + String apps({required Object n}) => '${n} App-ak'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$eu extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Ezabatu dena'; +} + +// Path: receivePage +class _Translations$receivePage$eu extends Translations$receivePage$en { + _Translations$receivePage$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('eu'))( + n, + one: '-(e)k fitxategi bat bidali nahi dizu', + other: '-(e)k ${n} fitxategi bidali nahi dizkizu', + ); + @override + String get subTitleMessage => '-(e)k mezu bat bidali dizu:'; + @override + String get subTitleLink => '-(e)k lotura bat bidali dizu:'; + @override + String get canceled => 'Bidaltzaileak bidalketa bertan behera utzi du.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$eu extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ezarpenak'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(directorio ${_root.appName})'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Direktorioak daudelako desaktibatua.'; +} + +// Path: sendPage +class _Translations$sendPage$eu extends Translations$sendPage$en { + _Translations$sendPage$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Erantzunaren zai...'; + @override + String get rejected => 'Hartzaileak ez du bidalketa onartu.'; + @override + String get busy => 'Hartzailea beste bidalketa batekin okupatuta dago.'; +} + +// Path: progressPage +class _Translations$progressPage$eu extends Translations$progressPage$en { + _Translations$progressPage$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Fitxategiak bidaltzen'; + @override + String get titleReceiving => 'Fitxategiak eskuratzen'; + @override + String get savedToGallery => 'Galerian gordeta'; + @override + late final _Translations$progressPage$total$eu total = _Translations$progressPage$total$eu._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$eu extends Translations$webSharePage$en { + _Translations$webSharePage$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Loturaren bidez elkarbanatu'; + @override + String get loading => 'Hasieratu zerbitzaria...'; + @override + String get stopping => 'Gelditu zerbitzaria...'; + @override + String get error => 'Zerbitzaria hasieratzean arazo bat gertatu da.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('eu'))( + n, + one: 'Ireki lotura nabigatzailean:', + other: 'Ireki hauetako lotura bat nabigatzailean:', + ); + @override + String get requests => 'Eskerak'; + @override + String get noRequests => 'Oraindik ez dago eskaerarik.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get encryptionHint => 'LocalSend-ek autosinatutako zertifikatuak erabiltzen ditu. Nabigatzailean onartu behar duzu'; + @override + String pendingRequests({required Object n}) => 'Eskerak: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$eu extends Translations$aboutPage$en { + _Translations$aboutPage$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'LocalSend buruz'; +} + +// Path: changelogPage +class _Translations$changelogPage$eu extends Translations$changelogPage$en { + _Translations$changelogPage$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aldaketak'; +} + +// Path: dialogs +class _Translations$dialogs$eu extends Translations$dialogs$en { + _Translations$dialogs$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$eu addFile = _Translations$dialogs$addFile$eu._(_root); + @override + late final _Translations$dialogs$addressInput$eu addressInput = _Translations$dialogs$addressInput$eu._(_root); + @override + late final _Translations$dialogs$cancelSession$eu cancelSession = _Translations$dialogs$cancelSession$eu._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$eu cannotOpenFile = _Translations$dialogs$cannotOpenFile$eu._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$eu encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$eu._(_root); + @override + late final _Translations$dialogs$errorDialog$eu errorDialog = _Translations$dialogs$errorDialog$eu._(_root); + @override + late final _Translations$dialogs$favoriteDialog$eu favoriteDialog = _Translations$dialogs$favoriteDialog$eu._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$eu favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$eu._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$eu favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$eu._(_root); + @override + late final _Translations$dialogs$fileInfo$eu fileInfo = _Translations$dialogs$fileInfo$eu._(_root); + @override + late final _Translations$dialogs$fileNameInput$eu fileNameInput = _Translations$dialogs$fileNameInput$eu._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$eu localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$eu._(_root); + @override + late final _Translations$dialogs$messageInput$eu messageInput = _Translations$dialogs$messageInput$eu._(_root); + @override + late final _Translations$dialogs$noFiles$eu noFiles = _Translations$dialogs$noFiles$eu._(_root); + @override + late final _Translations$dialogs$noPermission$eu noPermission = _Translations$dialogs$noPermission$eu._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$eu notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$eu._(_root); + @override + late final _Translations$dialogs$qr$eu qr = _Translations$dialogs$qr$eu._(_root); + @override + late final _Translations$dialogs$quickActions$eu quickActions = _Translations$dialogs$quickActions$eu._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$eu quickSaveNotice = _Translations$dialogs$quickSaveNotice$eu._(_root); + @override + late final _Translations$dialogs$sendModeHelp$eu sendModeHelp = _Translations$dialogs$sendModeHelp$eu._(_root); +} + +// Path: tray +class _Translations$tray$eu extends Translations$tray$en { + _Translations$tray$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Itxi LocalSend'; +} + +// Path: web +class _Translations$web$eu extends Translations$web$en { + _Translations$web$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get rejected => 'Bertan behera utzita'; + @override + String get files => 'Fitxategiak'; + @override + String get fileName => 'Fitxateig izena'; + @override + String get size => 'Tamaina'; +} + +// Path: assetPicker +class _Translations$assetPicker$eu extends Translations$assetPicker$en { + _Translations$assetPicker$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Baieztatu'; + @override + String get cancel => 'Utzi'; + @override + String get edit => 'Editatu'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Akatsa kargatzen'; + @override + String get original => 'Jatorrizkoa'; + @override + String get preview => 'Aurrebista'; + @override + String get select => 'Aukeratu'; + @override + String get emptyList => 'Zerrenda hutsik'; + @override + String get unSupportedAssetType => 'Fitxategi mota ez onartua.'; + @override + String get unableToAccessAll => 'Ezin da gailuko fitxategietara atzitu.'; + @override + String get viewingLimitedAssetsTip => 'Ikusi bakarrik aplikazioarentzat eskuragarri dauden fitxategi eta albumak.'; + @override + String get changeAccessibleLimitedAssets => 'Egin klik eskuragarri dauden fitxategiak eguneratzeko'; + @override + String get accessAllTip => + 'Aplikazioak gailu fitxategi batzuk bakarrik atzitu ditzake. Joan sistemako ezarpenetara eta eman aplikazioari media fitxategi guztiak atzitzeko baimena'; + @override + String get goToSystemSettings => 'Joan sistemako ezarpenetara'; + @override + String get accessLimitedAssets => 'Jarraitu atzipen mugatuarekin'; + @override + String get accessiblePathName => 'Eskuragarri dauden fitxategiak'; + @override + String get sTypeAudioLabel => 'Audioa'; + @override + String get sTypeImageLabel => 'Irudia'; + @override + String get sTypeVideoLabel => 'Bideoa'; + @override + String get sTypeOtherLabel => 'Bestelako medioak'; + @override + String get sActionPlayHint => 'erreproduzitu'; + @override + String get sActionPreviewHint => 'aurrebista'; + @override + String get sActionSelectHint => 'aukeratu'; + @override + String get sActionSwitchPathLabel => 'aldatu bidea'; + @override + String get sActionUseCameraHint => 'erabaili kamera'; + @override + String get sNameDurationLabel => 'iraupena'; + @override + String get sUnitAssetCountLabel => 'kontaketa'; +} + +// Path: sanitization +class _Translations$sanitization$eu extends Translations$sanitization$en { + _Translations$sanitization$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get invalid => 'Fitxategiaren izena karaktere baliogabeak ditu'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$eu extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sare interfazeak'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$eu extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Portua:'; + @override + String get alias => 'Aliasa:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$eu extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get on => _root.general.on; + @override + String get favorites => 'Gogokoak'; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$eu extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aukeraketa'; + @override + String files({required Object files}) => 'Fitxategiak: ${files}'; + @override + String size({required Object size}) => 'Tamaina: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$eu extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get file => 'Fitxategia'; + @override + String get folder => 'Direktorioa'; + @override + String get media => 'Media'; + @override + String get text => 'Testua'; + @override + String get app => 'App'; + @override + String get clipboard => 'Itsatsi'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$eu extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get single => 'Hartzaile bakarra'; + @override + String get multiple => 'Hartzaile anitz'; + @override + String get link => 'URL bidez partekatu'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$eu extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Orokorra'; + @override + String get brightness => 'Argitasuna'; + @override + late final _Translations$settingsTab$general$brightnessOptions$eu brightnessOptions = _Translations$settingsTab$general$brightnessOptions$eu._( + _root, + ); + @override + String get color => 'Kolorea'; + @override + late final _Translations$settingsTab$general$colorOptions$eu colorOptions = _Translations$settingsTab$general$colorOptions$eu._(_root); + @override + String get language => 'Hizkuntza'; + @override + late final _Translations$settingsTab$general$languageOptions$eu languageOptions = _Translations$settingsTab$general$languageOptions$eu._(_root); + @override + String get saveWindowPlacement => 'Ateratzean gorde lehioaren kokapena'; + @override + String get minimizeToTray => 'Itxi: txikitu lehioa'; + @override + String get launchAtStartup => 'Hasieratze automatikoa'; + @override + String get launchMinimized => 'Hasieratze automatikoa: hasi txikituta'; + @override + String get animations => 'Animazioak'; + @override + String get saveWindowPlacementWindows => 'Irteeran leihoaren kokapena gorde'; + @override + String get showInContextMenu => 'Erakutsi LocalSend testuinguru menuan'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$eu extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Eskuratu'; + @override + String get quickSave => _root.general.quickSave; + @override + String get destination => 'Hartzailea'; + @override + String get downloads => '(Deskargak)'; + @override + String get saveToGallery => 'Gorde galerian'; + @override + String get saveToHistory => 'Gorde historialean'; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get autoFinish => 'Automatikoki amaitu'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$eu extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Gorria'; + @override + String get needRestart => 'Berrabiarazi zerbitzaria aldaketak aplikatzeko!'; + @override + String get server => 'Zerbitzaria'; + @override + String get alias => 'Aliasa'; + @override + String get deviceType => 'Gailu mota'; + @override + String get deviceModel => 'Gailu modeloa'; + @override + String get port => 'Portua'; + @override + String portWarning({required Object defaultPort}) => + 'Portu berezi bat erabiltzen ari zarenez, agian ez zara beste gailuentzat ikusgarri izango (Lehenetsitako portua: ${defaultPort})'; + @override + String get encryption => 'Zifratzea'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Multicast helbide berezi bat erabiltzen ari zarenez, agian ez zara beste gailuentzat ikusgarri izango. (Lehenetsitako multicast helbidea: ${defaultMulticast})'; + @override + String get discoveryTimeout => 'Aurkikuntza denbora muga'; + @override + String get useSystemName => 'Erabili sistemaren izena'; + @override + String get generateRandomAlias => 'Ausazko "alias" sortu'; + @override + late final _Translations$settingsTab$network$networkOptions$eu networkOptions = _Translations$settingsTab$network$networkOptions$eu._(_root); + @override + String get network => 'Sarea'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$eu extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Bidali'; + @override + String get shareViaLinkAutoAccept => 'Eskaerak automatikoki onartu “URL bidez partekatu” moduan'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$eu extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Besteak'; + @override + String get support => 'LocalSend Lagundu'; + @override + String get donate => 'Dohaintza egin'; + @override + String get privacyPolicy => 'Pribatutasun politika'; + @override + String get termsOfUse => 'Erabilera baldintzak'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$eu extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get symptom => + 'Aplikazio honek fitxategiak bidal ditzake beste gailuei, baina beste gailuek ezin ditzakete fitxategiak bidali gailu honetara.'; + @override + String solution({required Object port}) => + 'Suhesiarekin erlazionatutako arazo bat izen liteke. ${port} portura sarrerako konexioak (UDP eta TCP) onartuz konpon dezakezu.'; + @override + String get openFirewall => 'Ireki Suhesia'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$eu extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Hartzaile eta bidaltzaileak ez dute elkar ikusten eta ezin diote fitxategiak elkarri bidali.'; + @override + String get solution => + 'Bi aldeetan dago arazoa? Ziurtatu Wi-Fi sare berdinean kokatuta daudela eta konfigurazio bera elkarbanatzen dutela (portua, multicast helbidea, zifratua). Arazoa Wi-Fi sareak partaideen arteko konexioak mugatzea ere izan liteke. Horrela bada, routerrean aukera hau aktibatu.'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$eu extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Gailu honek ezin ditu beste gailurik aurkitu.'; + @override + String get solution => + 'Ziurtatu gailu guztiak Wi-Fi sare berean daudela eta konfigurazio bera partekatzen dutela (atea, helbide multikasta, kodeketa). Helburuko gailuaren IP helbidea eskuz idatz dezakezu. Horrek balio badu, gehitu gailu hori gogokoetan, etorkizunean automatikoki aurkitu dadin.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$eu extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get open => 'Ireki fitxategia'; + @override + String get info => 'Informazioa'; + @override + String get deleteFromHistory => 'Ezabatu historia'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$eu extends Translations$progressPage$total$en { + _Translations$progressPage$total$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$eu title = _Translations$progressPage$total$title$eu._(_root); + @override + String count({required Object curr, required Object n}) => 'Fitxategiak: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Tamaina: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Abiadura: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$eu extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Gehitu aukeraketari'; + @override + String get content => 'Zer gehitu nahi duzu?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$eu extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sartu helbidea'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP Helbidea'; + @override + String get recentlyUsed => 'Duela gutxi erabilitakoak: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$eu extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Bertan behera utzi fitxategi bidalketa'; + @override + String get content => '¿Benetan nahi duzu bertan behera utzi fitxategi bidalketa?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$eu extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ezin da fitxategia ireki'; + @override + String content({required Object file}) => 'Ezin izan da "${file}" fitxategia ireki. Agian mugitu, berizendatu edo ezabatu egin da?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$eu extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Zifratua ezgaituta'; + @override + String get content => 'Orain komunikazioa zifratu gabeko HTTP konexioaren bidez egiten ari da. HTTPS erailtzeko, gaitu berriro zifratua'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$eu extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$eu extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Gogokoak'; + @override + String get noFavorites => 'Ez dago gogoko gailurik.'; + @override + String get addFavorite => 'Gehitu'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$eu extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ezabatu gogokoetatik'; + @override + String content({required Object name}) => 'Benetan nahi duzu "${name}" gogokoetatik ezabatu?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$eu extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Gehitu gogokoetara'; + @override + String get titleEdit => 'Doitu'; + @override + String get name => 'Aliasa'; + @override + String get auto => '(auto)'; + @override + String get ip => 'IP Helbidea'; + @override + String get port => 'Portua'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$eu extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Fitxategiari buruzko informazioa'; + @override + String get fileName => 'Fitxategiaren izena:'; + @override + String get path => 'Bidea:'; + @override + String get size => 'Tamaina:'; + @override + String get sender => 'Bidaltzailea:'; + @override + String get time => 'Ordua:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$eu extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sartu izena'; + @override + String original({required Object original}) => 'Jatorrizkoa: ${original}'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$eu extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'Sare lokala eskaneatzeko baimenik gabe, LocalSend-ek ezin ditu inguruko gailuak aurkitu. Mesedez, onartu baimen hau ezarpenetan.'; + @override + String get gotoSettings => 'Ezarpenak'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$eu extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Idatzi mezu bat'; + @override + String get multiline => 'Lerro anitz'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$eu extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ez da fitxategirik aukeratu'; + @override + String get content => 'Mesedez aukeratu gutxienez fitxategi bat.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$eu extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Baimenik gabe'; + @override + String get content => 'Ez dituzu beharrezko baimenak onartu. Mesedez, onartu itzazu ezarpenetan.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$eu extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ez dago eskuragarri'; + @override + String get content => 'Ezaugarri hau hurrengo plataforman bakarrik dago eskuragarri:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$eu extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR Kodea'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$eu extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ekintza azkarrak'; + @override + String get counter => 'Kontagailua'; + @override + String get prefix => 'Aurrizkia'; + @override + String get padZero => 'Hutsekin osatu'; + @override + String get sortBeforeCount => 'Aldez aurretik alfabetikoki ordenatu'; + @override + String get random => 'Ausazkoa'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$eu extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Fitxategi eskaerak automatikoki onartzen dira. Kontutan izan sare lokaleko edonork bidali ahal izango dizkizula fitxategiak.'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$eu extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Bidalketa moduak'; + @override + String get single => 'Bidali fitxategiak hartzaile bakar bati. Bidalketa bukatutakoan aukeraketa garbituko da.'; + @override + String get multiple => 'Bidali fitxategiak hartzaile anitzeri. Aukeraketa ez da garbituko.'; + @override + String get link => 'LocalSend instalatuta ez duten hartzaileak fitxategiak eskuratu ahali zango dituzte lotura nabigatzailean zabalduz.'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$eu extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get dark => 'Iluna'; + @override + String get light => 'Argia'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$eu extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$eu extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$eu extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String get all => 'Guztiak'; + @override + String get filtered => 'Iragazita'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$eu extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$eu._(TranslationsEu root) : this._root = root, super.internal(root); + + final TranslationsEu _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Aurrerapena (${time})'; + @override + String get finishedError => 'Akatsarekin amaitu da'; + @override + String get canceledSender => 'Bidaltzaileak bertan behera utzita'; + @override + String get canceledReceiver => 'Hartzaileak bertan behera utzita'; +} diff --git a/app/lib/gen/strings_fa.g.dart b/app/lib/gen/strings_fa.g.dart new file mode 100644 index 0000000..1e61c63 --- /dev/null +++ b/app/lib/gen/strings_fa.g.dart @@ -0,0 +1,1498 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsFa extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsFa({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.fa, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsFa _root = this; // ignore: unused_field + + @override + TranslationsFa $copyWith({TranslationMetadata? meta}) => TranslationsFa(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'فارسی'; + @override + String get appName => 'لوکال‌سِند'; + @override + late final _Translations$general$fa general = _Translations$general$fa._(_root); + @override + late final _Translations$receiveTab$fa receiveTab = _Translations$receiveTab$fa._(_root); + @override + late final _Translations$sendTab$fa sendTab = _Translations$sendTab$fa._(_root); + @override + late final _Translations$settingsTab$fa settingsTab = _Translations$settingsTab$fa._(_root); + @override + late final _Translations$troubleshootPage$fa troubleshootPage = _Translations$troubleshootPage$fa._(_root); + @override + late final _Translations$receiveHistoryPage$fa receiveHistoryPage = _Translations$receiveHistoryPage$fa._(_root); + @override + late final _Translations$apkPickerPage$fa apkPickerPage = _Translations$apkPickerPage$fa._(_root); + @override + late final _Translations$selectedFilesPage$fa selectedFilesPage = _Translations$selectedFilesPage$fa._(_root); + @override + late final _Translations$receivePage$fa receivePage = _Translations$receivePage$fa._(_root); + @override + late final _Translations$receiveOptionsPage$fa receiveOptionsPage = _Translations$receiveOptionsPage$fa._(_root); + @override + late final _Translations$sendPage$fa sendPage = _Translations$sendPage$fa._(_root); + @override + late final _Translations$progressPage$fa progressPage = _Translations$progressPage$fa._(_root); + @override + late final _Translations$webSharePage$fa webSharePage = _Translations$webSharePage$fa._(_root); + @override + late final _Translations$aboutPage$fa aboutPage = _Translations$aboutPage$fa._(_root); + @override + late final _Translations$donationPage$fa donationPage = _Translations$donationPage$fa._(_root); + @override + late final _Translations$changelogPage$fa changelogPage = _Translations$changelogPage$fa._(_root); + @override + late final _Translations$aliasGenerator$fa aliasGenerator = _Translations$aliasGenerator$fa._(_root); + @override + late final _Translations$dialogs$fa dialogs = _Translations$dialogs$fa._(_root); + @override + late final _Translations$sanitization$fa sanitization = _Translations$sanitization$fa._(_root); + @override + late final _Translations$tray$fa tray = _Translations$tray$fa._(_root); + @override + late final _Translations$web$fa web = _Translations$web$fa._(_root); + @override + late final _Translations$assetPicker$fa assetPicker = _Translations$assetPicker$fa._(_root); + @override + late final _Translations$networkInterfacesPage$fa networkInterfacesPage = _Translations$networkInterfacesPage$fa._(_root); +} + +// Path: general +class _Translations$general$fa extends Translations$general$en { + _Translations$general$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get accept => 'پذیرفتن'; + @override + String get accepted => 'پذیرفته‌شده'; + @override + String get add => 'افزودن'; + @override + String get advanced => 'پیشرفته'; + @override + String get cancel => 'ردکردن'; + @override + String get close => 'بستن'; + @override + String get confirm => 'پذیرفتن'; + @override + String get continueStr => 'ادامه'; + @override + String get copy => 'کپی'; + @override + String get copiedToClipboard => 'کپی شد'; + @override + String get decline => 'نپذیرفتن'; + @override + String get done => 'انجام شد'; + @override + String get delete => 'حذف'; + @override + String get edit => 'ویرایش'; + @override + String get error => 'خطا'; + @override + String get example => 'نمونه'; + @override + String get files => 'فایل‌ها'; + @override + String get finished => 'پایان‌یافت'; + @override + String get hide => 'مخفی'; + @override + String get off => 'خاموش'; + @override + String get offline => 'آفلاین'; + @override + String get on => 'روشن'; + @override + String get online => 'آنلاین'; + @override + String get open => 'باز کردن'; + @override + String get queue => 'صف'; + @override + String get quickSave => 'ذخیره سریع'; + @override + String get quickSaveFromFavorites => 'ذخیره سریع برای "موردعلاقه‌ها"'; + @override + String get renamed => 'نام ویرایش‌شد'; + @override + String get reset => 'بازنشانی'; + @override + String get restart => 'راه‌اندازی دوباره'; + @override + String get settings => 'تنظیمات'; + @override + String get skipped => 'رد شد'; + @override + String get start => 'شروع'; + @override + String get stop => 'توقف'; + @override + String get save => 'ذخیره'; + @override + String get unchanged => 'بدون تغییر'; + @override + String get unknown => 'ناشناخته'; + @override + String get noItemInClipboard => 'چیزی در کلیپ‌بورد وجود ندارد.'; +} + +// Path: receiveTab +class _Translations$receiveTab$fa extends Translations$receiveTab$en { + _Translations$receiveTab$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'دریافت'; + @override + late final _Translations$receiveTab$infoBox$fa infoBox = _Translations$receiveTab$infoBox$fa._(_root); + @override + late final _Translations$receiveTab$quickSave$fa quickSave = _Translations$receiveTab$quickSave$fa._(_root); +} + +// Path: sendTab +class _Translations$sendTab$fa extends Translations$sendTab$en { + _Translations$sendTab$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'ارسال'; + @override + late final _Translations$sendTab$selection$fa selection = _Translations$sendTab$selection$fa._(_root); + @override + late final _Translations$sendTab$picker$fa picker = _Translations$sendTab$picker$fa._(_root); + @override + String get shareIntentInfo => 'همچنین می‌توانید از ویژگی «هم‌رسانی» دستگاه تلفن‌همراه خود برای انتخاب آسان‌تر پرونده‌ها استفاده کنید.'; + @override + String get nearbyDevices => 'دستگاه‌های اطراف'; + @override + String get thisDevice => 'این دستگاه'; + @override + String get scan => 'جستجوی دستگاه‌ها'; + @override + String get manualSending => 'ارسال دستی'; + @override + String get sendMode => 'حالت ارسال'; + @override + late final _Translations$sendTab$sendModes$fa sendModes = _Translations$sendTab$sendModes$fa._(_root); + @override + String get sendModeHelp => 'توضیح'; + @override + String get help => 'لطفاً مطمئن شوید که دستگاه مورد نظر به شبکه وای‌فای یکسانی وصل باشد.'; + @override + String get placeItems => 'موارد را برای هم‌رسانی قرار دهید.'; +} + +// Path: settingsTab +class _Translations$settingsTab$fa extends Translations$settingsTab$en { + _Translations$settingsTab$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'تنظیمات'; + @override + late final _Translations$settingsTab$general$fa general = _Translations$settingsTab$general$fa._(_root); + @override + late final _Translations$settingsTab$receive$fa receive = _Translations$settingsTab$receive$fa._(_root); + @override + late final _Translations$settingsTab$send$fa send = _Translations$settingsTab$send$fa._(_root); + @override + late final _Translations$settingsTab$network$fa network = _Translations$settingsTab$network$fa._(_root); + @override + late final _Translations$settingsTab$other$fa other = _Translations$settingsTab$other$fa._(_root); + @override + String get advancedSettings => 'تنظیمات پیشرفته'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$fa extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'عیب یابی'; + @override + String get subTitle => 'این برنامه مطابق انتظار کار نمی‌کند؟ در اینجا می‌توانید راه حل‌های رایج را بیابید.'; + @override + String get solution => 'راه حل:'; + @override + String get fixButton => 'تعمیر خودکار'; + @override + late final _Translations$troubleshootPage$firewall$fa firewall = _Translations$troubleshootPage$firewall$fa._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$fa noDiscovery = _Translations$troubleshootPage$noDiscovery$fa._(_root); + @override + late final _Translations$troubleshootPage$noConnection$fa noConnection = _Translations$troubleshootPage$noConnection$fa._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$fa extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'تاریخچه'; + @override + String get openFolder => 'باز کردن پوشه'; + @override + String get deleteHistory => 'حذف تاریخچه'; + @override + String get empty => 'تاریخچه خالی است.'; + @override + late final _Translations$receiveHistoryPage$entryActions$fa entryActions = _Translations$receiveHistoryPage$entryActions$fa._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$fa extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'برنامه (APK)'; + @override + String get excludeSystemApps => 'شامل نشدن برنامه‌های سیستمی'; + @override + String get excludeAppsWithoutLaunchIntent => 'شامل نشدن برنامه‌های غیر اجرایی'; + @override + String apps({required Object n}) => '${n} برنامه'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$fa extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'حذف همه'; +} + +// Path: receivePage +class _Translations$receivePage$fa extends Translations$receivePage$en { + _Translations$receivePage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fa'))( + n, + one: 'می‌خواهد برای شما یک فایل ارسال کند', + other: 'می‌خواهد برای شما ${n} فایل ارسال کند', + ); + @override + String get subTitleMessage => 'به شما پیام داد:'; + @override + String get subTitleLink => 'برای شما یک لینک ارسال کرد:'; + @override + String get canceled => 'فرستنده درخواست را لغو کرد.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$fa extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'گزینه‌ها'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(پوشه لوکال‌سند)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'به دلیل وجود پوشه‌ها به طور خودکار خاموش می‌شود.'; +} + +// Path: sendPage +class _Translations$sendPage$fa extends Translations$sendPage$en { + _Translations$sendPage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'در انتظار پاسخ…'; + @override + String get rejected => 'گیرنده درخواست را رد کرد.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'گیرنده با درخواست دیگری مشغول است.'; +} + +// Path: progressPage +class _Translations$progressPage$fa extends Translations$progressPage$en { + _Translations$progressPage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'ارسال فایل‌ها'; + @override + String get titleReceiving => 'دریافت فایل‌ها'; + @override + String get savedToGallery => 'در تصاویر ذخیره شد'; + @override + late final _Translations$progressPage$total$fa total = _Translations$progressPage$total$fa._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$fa extends Translations$webSharePage$en { + _Translations$webSharePage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'اشتراک گذاری از طریق لینک'; + @override + String get loading => 'در حال راه‌اندازی سرور…'; + @override + String get stopping => 'در حال توقف سرور…'; + @override + String get error => 'هنگام راه‌اندازی سرور خطایی رخ داد.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fa'))( + n, + one: 'باز کردن لینک در مرورگر:', + other: 'باز کردن لینک‌ها در مرورگر:', + ); + @override + String get requests => 'درخواست‌ها'; + @override + String get noRequests => 'هنوز درخواستی وجود ندارد.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'درخواست‌ها به طور خودکار پذیرفته می‌شوند'; + @override + String get requirePin => 'نیاز به پین'; + @override + String pinHint({required Object pin}) => 'پین "${pin}" می‌باشد'; + @override + String get encryptionHint => 'لوکال‌سند از یک گواهی خودامضا استفاده می‌کند. شما باید آن را در مرورگر قبول کنید.'; + @override + String pendingRequests({required Object n}) => 'درخواست‌های در حال انتظار: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$fa extends Translations$aboutPage$en { + _Translations$aboutPage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'درباره لوکال‌سند'; + @override + List get description => [ + 'لوکال‌سند یک برنامه آزاد و متن‌باز است که به شما امکان می‌دهد پرونده‌ها و پیام‌ها را به‌طور ایمن با دستگاه‌های اطراف از طریق شبکه محلی خود و بدون نیاز به اینترنت هم‌رسانی کنید.', + 'این برنامه برای سیستم عامل‌های اندروید، آی او اس، مک او اس، ویندوز و لینوکس در دسترس است. شما می‌توانید با مراجعه به وبگاه رسمی برنامه کلیه روش‌های دانلود را مشاهده نمایید.', + ]; + @override + String get author => 'نویسنده'; + @override + String get contributors => 'مشارکت کنندگان'; + @override + String get packagers => 'بسته‌بندی‌ها'; + @override + String get translators => 'مترجمان'; +} + +// Path: donationPage +class _Translations$donationPage$fa extends Translations$donationPage$en { + _Translations$donationPage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'کمک مالی'; + @override + String get info => + 'لوکال‌سند آزاد، متن‌باز و فاقد هرگونه تبلیغات است. اگر به این برنامه علاقه‌مندید، می‌توانید با کمک مالی از توسعه آن حمایت کنید.'; + @override + String donate({required Object amount}) => 'کمک مالی ${amount}'; + @override + String get thanks => 'بسیار از شما سپاسگزاریم!'; + @override + String get restore => 'بازیابی خرید'; +} + +// Path: changelogPage +class _Translations$changelogPage$fa extends Translations$changelogPage$en { + _Translations$changelogPage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'تاریخچه تغییرات برنامه'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$fa extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'ستودنی', + 'زیبا', + 'بزرگ', + 'درخشان', + 'تمیز', + 'باهوش', + 'باحال', + 'بامزه', + 'کلک', + 'مصمم', + 'باانرژی', + 'چابک', + 'شگفت‌انگیز', + 'سریع', + 'شایسته', + 'سرحال', + 'خوب', + 'دلنشین', + 'باشکوه', + 'خوشتیپ', + 'جذاب', + 'مهربون', + 'دوست‌داشتنی', + 'مبهم', + 'بی‌نظیر', + 'باادب', + 'صبور', + 'زیبا', + 'نیرومند', + 'مایه‌دار', + 'اسرارآمیز', + 'باهوش', + 'سرسخت', + 'خاص', + 'خوش‌فکر', + 'قدرتمند', + 'منظم', + 'خردمند', + ]; + @override + List get fruits => [ + 'سیب', + 'آووکادو', + 'موز', + 'توت', + 'بلوبری', + 'کلم', + 'هویج', + 'گیلاس', + 'نارگیل', + 'انگور', + 'لیمو', + 'کاهو', + 'انبه', + 'خربزه', + 'قارچ', + 'پیاز', + 'پرتقال', + 'پاپایا', + 'هلو', + 'گلابی', + 'آناناس', + 'سیب‌زمینی', + 'کدوتنبل', + 'تمشک', + 'توت‌فرنگی', + 'گوجه', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object fruit, required Object adjective}) => '${fruit} ${adjective}'; +} + +// Path: dialogs +class _Translations$dialogs$fa extends Translations$dialogs$en { + _Translations$dialogs$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$fa addFile = _Translations$dialogs$addFile$fa._(_root); + @override + late final _Translations$dialogs$openFile$fa openFile = _Translations$dialogs$openFile$fa._(_root); + @override + late final _Translations$dialogs$addressInput$fa addressInput = _Translations$dialogs$addressInput$fa._(_root); + @override + late final _Translations$dialogs$cancelSession$fa cancelSession = _Translations$dialogs$cancelSession$fa._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$fa cannotOpenFile = _Translations$dialogs$cannotOpenFile$fa._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$fa encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$fa._(_root); + @override + late final _Translations$dialogs$errorDialog$fa errorDialog = _Translations$dialogs$errorDialog$fa._(_root); + @override + late final _Translations$dialogs$favoriteDialog$fa favoriteDialog = _Translations$dialogs$favoriteDialog$fa._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$fa favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$fa._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$fa favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$fa._(_root); + @override + late final _Translations$dialogs$fileInfo$fa fileInfo = _Translations$dialogs$fileInfo$fa._(_root); + @override + late final _Translations$dialogs$fileNameInput$fa fileNameInput = _Translations$dialogs$fileNameInput$fa._(_root); + @override + late final _Translations$dialogs$historyClearDialog$fa historyClearDialog = _Translations$dialogs$historyClearDialog$fa._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$fa localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$fa._(_root); + @override + late final _Translations$dialogs$messageInput$fa messageInput = _Translations$dialogs$messageInput$fa._(_root); + @override + late final _Translations$dialogs$noFiles$fa noFiles = _Translations$dialogs$noFiles$fa._(_root); + @override + late final _Translations$dialogs$noPermission$fa noPermission = _Translations$dialogs$noPermission$fa._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$fa notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$fa._(_root); + @override + late final _Translations$dialogs$qr$fa qr = _Translations$dialogs$qr$fa._(_root); + @override + late final _Translations$dialogs$quickActions$fa quickActions = _Translations$dialogs$quickActions$fa._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$fa quickSaveNotice = _Translations$dialogs$quickSaveNotice$fa._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$fa quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$fa._(_root); + @override + late final _Translations$dialogs$pin$fa pin = _Translations$dialogs$pin$fa._(_root); + @override + late final _Translations$dialogs$sendModeHelp$fa sendModeHelp = _Translations$dialogs$sendModeHelp$fa._(_root); + @override + late final _Translations$dialogs$zoom$fa zoom = _Translations$dialogs$zoom$fa._(_root); +} + +// Path: sanitization +class _Translations$sanitization$fa extends Translations$sanitization$en { + _Translations$sanitization$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get empty => 'نام فایل نمی‌تواند خالی باشد'; + @override + String get invalid => 'نام فایل حاوی کاراکترهای نامعتبر است'; +} + +// Path: tray +class _Translations$tray$fa extends Translations$tray$en { + _Translations$tray$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'خروج از لوکال‌سند'; + @override + String get closeWindows => 'خروج'; +} + +// Path: web +class _Translations$web$fa extends Translations$web$en { + _Translations$web$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'پین را وارد کنید'; + @override + String get invalidPin => 'پین اشتباه است'; + @override + String get tooManyAttempts => 'تلاش‌های بیش از اندازه'; + @override + String get rejected => 'پذیرفته نشد'; + @override + String get files => 'فایل‌ها'; + @override + String get fileName => 'نام فایل'; + @override + String get size => 'حجم'; +} + +// Path: assetPicker +class _Translations$assetPicker$fa extends Translations$assetPicker$en { + _Translations$assetPicker$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'تایید'; + @override + String get cancel => 'لغو'; + @override + String get edit => 'ویرایش'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'بارگذاری ناموفق'; + @override + String get original => 'اصلی'; + @override + String get preview => 'پیش نمایش'; + @override + String get select => 'انتخاب'; + @override + String get emptyList => 'لیست خالی'; + @override + String get unSupportedAssetType => 'نوع پرونده پشتیبانی نشده.'; + @override + String get unableToAccessAll => 'قادر به دسترسی به تمام فایل‌های موجود در دستگاه نیست'; + @override + String get viewingLimitedAssetsTip => 'فقط پرونده‌ها و آلبوم‌های قابل دسترسی برنامه را مشاهده کنید.'; + @override + String get changeAccessibleLimitedAssets => 'برای به‌روزرسانی فایل‌های در دسترس کلیک کنید'; + @override + String get accessAllTip => + 'برنامه فقط می‌تواند به برخی از پرونده‌های دستگاه دسترسی داشته باشد. به تنظیمات سیستم بروید و به برنامه اجازه دهید به تمام رسانه‌های موجود در دستگاه دسترسی داشته باشد.'; + @override + String get goToSystemSettings => 'رفتن به تنظیمات سیستم'; + @override + String get accessLimitedAssets => 'با دسترسی محدود ادامه دهید'; + @override + String get accessiblePathName => 'فایل‌های قابل دسترسی'; + @override + String get sTypeAudioLabel => 'صوت'; + @override + String get sTypeImageLabel => 'تصویر'; + @override + String get sTypeVideoLabel => 'ویدیو'; + @override + String get sTypeOtherLabel => 'دیگر رسانه‌ها'; + @override + String get sActionPlayHint => 'پخش'; + @override + String get sActionPreviewHint => 'پیش نمایش'; + @override + String get sActionSelectHint => 'انتخاب'; + @override + String get sActionSwitchPathLabel => 'تغییر مسیر'; + @override + String get sActionUseCameraHint => 'از دوربین استفاده کنید'; + @override + String get sNameDurationLabel => 'مدت زمان'; + @override + String get sUnitAssetCountLabel => 'شمردن'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$fa extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'رابط‌های شبکه'; + @override + String get info => + 'به طور پیش فرض، LocalSend از تمام رابط های شبکه موجود استفاده می کند. در اینجا می توانید شبکه های ناخواسته را حذف کنید. برای اعمال تغییرات باید سرور را ریستارت کنید.'; + @override + String get preview => 'پیشنمایش'; + @override + String get whitelist => 'لیست سفید'; + @override + String get blacklist => 'لیست سیاه'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$fa extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get ip => 'آی‌پی:'; + @override + String get port => 'پورت:'; + @override + String get alias => 'نام کوتاه:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$fa extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => '‌موردعلاقه‌ها'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$fa extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'انتخاب شده‌ها'; + @override + String files({required Object files}) => 'فایل‌ها: ${files}'; + @override + String size({required Object size}) => 'اندازه: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$fa extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get file => 'فایل'; + @override + String get folder => 'پوشه'; + @override + String get media => 'رسانه'; + @override + String get text => 'متن'; + @override + String get app => 'برنامه'; + @override + String get clipboard => 'کلیپ‌بورد'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$fa extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get single => 'یک دریافت کننده'; + @override + String get multiple => 'چندین دریافت کننده'; + @override + String get link => 'اشتراک گذاری از طریق لینک'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$fa extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'عمومی'; + @override + String get brightness => 'ظاهر'; + @override + late final _Translations$settingsTab$general$brightnessOptions$fa brightnessOptions = _Translations$settingsTab$general$brightnessOptions$fa._( + _root, + ); + @override + String get color => 'رنگ'; + @override + late final _Translations$settingsTab$general$colorOptions$fa colorOptions = _Translations$settingsTab$general$colorOptions$fa._(_root); + @override + String get language => 'زبان'; + @override + late final _Translations$settingsTab$general$languageOptions$fa languageOptions = _Translations$settingsTab$general$languageOptions$fa._(_root); + @override + String get saveWindowPlacement => 'ذخیره موقعیت پنجره پس از خروج'; + @override + String get saveWindowPlacementWindows => 'ذخیره موقعیت پنجره پس از خروج'; + @override + String get minimizeToTray => 'خروج: ارسال برنامه به سیستم تری'; + @override + String get launchAtStartup => 'شروع خودکار پس از ورود به سیستم'; + @override + String get launchMinimized => 'شروع خودکار: شروع به صورت پنجره پنهان'; + @override + String get showInContextMenu => 'نمایش لوکال‌سند در منوی زمینه'; + @override + String get animations => 'انیمیشن‌ها'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$fa extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'دریافت'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'پایان خودکار'; + @override + String get destination => 'مقصد'; + @override + String get downloads => '(دانلودها)'; + @override + String get saveToGallery => 'ذخیره رسانه در گالری'; + @override + String get saveToHistory => 'ذخیره در تاریخچه'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$fa extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'ارسال'; + @override + String get shareViaLinkAutoAccept => 'اشتراک‌گذاری از طریق لینک: تایید خودکار'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$fa extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'شبکه'; + @override + String get needRestart => 'برای اعمال تنظیمات، سرور را مجدد راه‌اندازی کنید!'; + @override + String get server => 'سرور'; + @override + String get alias => 'نام کوتاه'; + @override + String get deviceType => 'نوع دستگاه'; + @override + String get deviceModel => 'مدل دستگاه'; + @override + String get port => 'پورت'; + @override + String get discoveryTimeout => 'مدت کاوش'; + @override + String get useSystemName => 'استفاده از نام سیستم'; + @override + String get generateRandomAlias => 'ایجاد نام مستعار تصادفی'; + @override + String portWarning({required Object defaultPort}) => + 'ممکن است به دلیل استفاده از یک پورت سفارشی، دستگاه‌های دیگر شما را شناسایی نکنند (پیشفرض : ${defaultPort})'; + @override + String get encryption => 'رمزنگاری'; + @override + String get multicastGroup => 'چندپخشی'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'ممکن است به دلیل استفاده از چندپخشی سفارشی، دستگاه‌های دیگر شما را شناسایی نکنند (پیشفرض: ${defaultMulticast})'; + @override + String get network => 'شبکه'; + @override + late final _Translations$settingsTab$network$networkOptions$fa networkOptions = _Translations$settingsTab$network$networkOptions$fa._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$fa extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'سایر'; + @override + String get support => 'حمایت از لوکال‌سند'; + @override + String get donate => 'کمک مالی'; + @override + String get privacyPolicy => 'سیاست حفظ حریم خصوصی'; + @override + String get termsOfUse => 'شرایط استفاده'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$fa extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get symptom => + 'این برنامه می‌تواند پرونده‌ها را به دستگاه‌های دیگر ارسال کند اما دستگاه‌های دیگر نمی‌توانند پرونده‌ها را به این دستگاه ارسال کنند.'; + @override + String solution({required Object port}) => + 'این مشکل به احتمال زیاد مربوط به تنظیمات فایروال است. شما می‌توانید با دادن مجوز به اتصالات ورودی این مشکل را حل کنید (UDP و TCP) در پورت ${port}.'; + @override + String get openFirewall => 'بازکردن فایروال'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$fa extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'این دستگاه نمی‌تواند دستگاه‌های دیگر را پیدا کند.'; + @override + String get solution => + 'مطمئن شوید که هر دو دستگاه به یک شبکه وای‌فای متصل هستند و پیکربندی یکسانی دارند (پورت، آدرس چندپخشی، رمزنگاری). سعی کنید آدرس آی‌پی دستگاه مورد نظر را به صورت دستی تایپ کنید. اگر جواب داد، این دستگاه را به موارد موردعلاقه اضافه کنید تا در آینده به طور خودکار کشف شود.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$fa extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'هر دو دستگاه نمی‌توانند یکدیگر را پیدا کرده و پرونده‌ها را هم‌رسانی کنند.'; + @override + String get solution => + 'آیا مشکل در هر دو طرف وجود دارد؟ اگر چنین است، باید مطمئن شوید که هر دو دستگاه در یک شبکه Wi-Fi متصل هستند و تنظیمات یکسانی دارند (پورت، آدرس چندپخشی، رمزگذاری). ممکن است شبکه Wi-Fi اجازه‌ی ارتباط بین شرکت‌کنندگان را ندهد، به دلیل فعال بودن قابلیت ایزوله‌سازی نقطه دسترسی (AP Isolation). در این صورت باید این گزینه را در روتر غیرفعال کنید.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$fa extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get open => 'باز کردن فایل'; + @override + String get showInFolder => 'نمایش پوشه'; + @override + String get info => 'اطلاعات'; + @override + String get deleteFromHistory => 'حذف از تاریخچه'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$fa extends Translations$progressPage$total$en { + _Translations$progressPage$total$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$fa title = _Translations$progressPage$total$title$fa._(_root); + @override + String count({required Object curr, required Object n}) => 'فایل‌ها: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'حجم: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'سرعت: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$fa extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'افزودن به انتخاب شده‌ها'; + @override + String get content => 'چه چیزی می‌خواهید اضافه کنید؟'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$fa extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'باز کردن فایل'; + @override + String get content => 'آیا می‌خواهید فایل دریافتی را باز کنید؟'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$fa extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'آدرس را وارد کنید'; + @override + String get hashtag => 'هشتگ'; + @override + String get ip => 'آدرس آی‌پی'; + @override + String get recentlyUsed => 'اخیرا استفاده شده: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$fa extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => '‌‌لغو انتقال فایل'; + @override + String get content => 'واقعاً می‌خواهید انتقال فایل را لغو کنید؟'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$fa extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'نمی‌تواند فایل را باز کند'; + @override + String content({required Object file}) => 'نمی‌توان فایل "${file}" را باز کرد. آیا این فایل منتقل، تغییر نام یا حذف شده است؟'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$fa extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'رمزنگاری غیرفعال شد'; + @override + String get content => 'اکنون ارتباط از طریق پروتکل HTTP رمزنگاری نشده صورت می‌گیرد. برای استفاده از HTTPS، رمزنگاری را دوباره فعال کنید.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$fa extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$fa extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'علاقه‌مندی‌ها'; + @override + String get noFavorites => 'هنوز دستگاه مورد علاقه‌ای انتخاب نشده است.'; + @override + String get addFavorite => 'افزودن'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$fa extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'حذف از علاقه‌مندی‌ها'; + @override + String content({required Object name}) => 'واقعاً می‌خواهید از علاقه‌مندی‌ها حذف کنید "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$fa extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'افزودن به علاقه‌مندی‌ها'; + @override + String get titleEdit => 'تنظیمات'; + @override + String get name => 'نام مستعار'; + @override + String get auto => '(خودکار)'; + @override + String get ip => 'آدرس آی پی'; + @override + String get port => 'پورت'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$fa extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'مشخصات فایل'; + @override + String get fileName => 'نام فایل:'; + @override + String get path => 'مسیر:'; + @override + String get size => 'حجم:'; + @override + String get sender => 'فرستنده:'; + @override + String get time => 'زمان:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$fa extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'نام فایل را وارد کنید'; + @override + String original({required Object original}) => 'اصلی: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$fa extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'پاکسازی تاریخچه'; + @override + String get content => 'واقعاً می‌خواهید کل تاریخچه را حذف کنید؟'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$fa extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'لوکال‌سند نمی‌تواند دستگاه‌های دیگر را بدون داشتن مجوز اسکن شبکه محلی پیدا کند. لطفاً این مجوز را در تنظیمات به برنامه بدهید.'; + @override + String get gotoSettings => 'تنظیمات'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$fa extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'پیام را بنویسید'; + @override + String get multiline => 'چند خطی'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$fa extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'فایلی انتخاب نشده'; + @override + String get content => 'لطفا حداقل یک پرونده را انتخاب کنید.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$fa extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'بدون مجوز'; + @override + String get content => 'شما مجوزهای مورد نیاز را اعطا نکرده‌اید. لطفاً آنها را در تنظیمات مجوزدهی کنید.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$fa extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'در دسترس نیست'; + @override + String get content => 'این ویژگی فقط در دسترس است در:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$fa extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR کد'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$fa extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'اقدامات سریع'; + @override + String get counter => 'شمارنده'; + @override + String get prefix => 'پیشوند'; + @override + String get padZero => 'همگام سازی نام‌ها با افزودن صفر'; + @override + String get sortBeforeCount => 'از قبل بر اساس حروف الفبا مرتب کنید'; + @override + String get random => 'تصادفی'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$fa extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'درخواست‌ها به صورت خودکار پذیرفته می‌شوند. توجه داشته باشید که همه افراد در شبکه محلی می‌توانند برای شما پرونده ارسال کنند.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$fa extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'درخواست‌ها به طور خودکار از دستگاه‌های موجود در فهرست موردعلاقه‌ها پذیرفته می‌شود.', + 'هشدار: این روش در حال حاضر کاملاً ایمن نیست، زیرا در صورت دسترسی هکر به دستگاه‌های موجود در فهرست موردعلاقه‌ها، می‌تواند بدون محدودیت برای شما پرونده ارسال کند.', + 'با این حال، این گزینه هنوز هم ایمن‌تر از اجازه دادن به همه کاربران در شبکه محلی برای ارسال پرونده بدون محدودیت است.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$fa extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'پین را وارد کنید'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$fa extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'حالت‌های ارسال'; + @override + String get single => 'پرونده‌ها را به یک گیرنده ارسال می‌کند. فهرست انتخاب شده‌ها پس از اتمام انتقال پرونده پاک می‌شود.'; + @override + String get multiple => 'پرونده‌ها را برای چندین گیرنده ارسال می‌کند. فهرست انتخاب شده‌ها پاک نخواهد شد.'; + @override + String get link => 'گیرندگانی که لوکال‌سند را نصب نکرده اند، می‌توانند پرونده‌ها را با باز کردن پیوند در مرورگر خود دانلود کنند.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$fa extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get title => 'آدرس اینترنتی'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$fa extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get system => 'سیستم'; + @override + String get dark => 'تیره'; + @override + String get light => 'روشن'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$fa extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get system => 'سیستم'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$fa extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get system => 'سیستم'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$fa extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String get all => 'همه'; + @override + String get filtered => 'فیلتر شده'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$fa extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$fa._(TranslationsFa root) : this._root = root, super.internal(root); + + final TranslationsFa _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'مجموع پیشرفت (${time})'; + @override + String get finishedError => 'با خطا مواجه شد'; + @override + String get canceledSender => 'توسط فرستنده لغو شد'; + @override + String get canceledReceiver => 'توسط گیرنده لغو شد'; +} diff --git a/app/lib/gen/strings_fi.g.dart b/app/lib/gen/strings_fi.g.dart new file mode 100644 index 0000000..c49a8e7 --- /dev/null +++ b/app/lib/gen/strings_fi.g.dart @@ -0,0 +1,1527 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsFi extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsFi({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.fi, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsFi _root = this; // ignore: unused_field + + @override + TranslationsFi $copyWith({TranslationMetadata? meta}) => TranslationsFi(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Finnish'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$fi general = _Translations$general$fi._(_root); + @override + late final _Translations$receiveTab$fi receiveTab = _Translations$receiveTab$fi._(_root); + @override + late final _Translations$sendTab$fi sendTab = _Translations$sendTab$fi._(_root); + @override + late final _Translations$settingsTab$fi settingsTab = _Translations$settingsTab$fi._(_root); + @override + late final _Translations$troubleshootPage$fi troubleshootPage = _Translations$troubleshootPage$fi._(_root); + @override + late final _Translations$receiveHistoryPage$fi receiveHistoryPage = _Translations$receiveHistoryPage$fi._(_root); + @override + late final _Translations$apkPickerPage$fi apkPickerPage = _Translations$apkPickerPage$fi._(_root); + @override + late final _Translations$selectedFilesPage$fi selectedFilesPage = _Translations$selectedFilesPage$fi._(_root); + @override + late final _Translations$receivePage$fi receivePage = _Translations$receivePage$fi._(_root); + @override + late final _Translations$receiveOptionsPage$fi receiveOptionsPage = _Translations$receiveOptionsPage$fi._(_root); + @override + late final _Translations$sendPage$fi sendPage = _Translations$sendPage$fi._(_root); + @override + late final _Translations$progressPage$fi progressPage = _Translations$progressPage$fi._(_root); + @override + late final _Translations$webSharePage$fi webSharePage = _Translations$webSharePage$fi._(_root); + @override + late final _Translations$aboutPage$fi aboutPage = _Translations$aboutPage$fi._(_root); + @override + late final _Translations$donationPage$fi donationPage = _Translations$donationPage$fi._(_root); + @override + late final _Translations$changelogPage$fi changelogPage = _Translations$changelogPage$fi._(_root); + @override + late final _Translations$aliasGenerator$fi aliasGenerator = _Translations$aliasGenerator$fi._(_root); + @override + late final _Translations$dialogs$fi dialogs = _Translations$dialogs$fi._(_root); + @override + late final _Translations$sanitization$fi sanitization = _Translations$sanitization$fi._(_root); + @override + late final _Translations$tray$fi tray = _Translations$tray$fi._(_root); + @override + late final _Translations$web$fi web = _Translations$web$fi._(_root); + @override + late final _Translations$assetPicker$fi assetPicker = _Translations$assetPicker$fi._(_root); + @override + late final _Translations$networkInterfacesPage$fi networkInterfacesPage = _Translations$networkInterfacesPage$fi._(_root); +} + +// Path: general +class _Translations$general$fi extends Translations$general$en { + _Translations$general$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Hyväksy'; + @override + String get accepted => 'Hyväksytty'; + @override + String get add => 'Lisää'; + @override + String get advanced => 'Edistynyt'; + @override + String get cancel => 'Peruuta'; + @override + String get close => 'Sulje'; + @override + String get confirm => 'Vahvista'; + @override + String get continueStr => 'Jatka'; + @override + String get copy => 'Kopioi'; + @override + String get copiedToClipboard => 'Kopioitu leikepöydälle'; + @override + String get decline => 'Hylkää'; + @override + String get done => 'Valmis'; + @override + String get delete => 'Poista'; + @override + String get edit => 'Muokkaa'; + @override + String get error => 'Virhe'; + @override + String get example => 'Esimerkki'; + @override + String get files => 'Tiedostot'; + @override + String get finished => 'Valmis'; + @override + String get hide => 'Piilota'; + @override + String get off => 'Pois'; + @override + String get offline => 'Offline'; + @override + String get on => 'Päällä'; + @override + String get online => 'Online'; + @override + String get open => 'Avaa'; + @override + String get queue => 'Jono'; + @override + String get quickSave => 'Pikatallennus'; + @override + String get quickSaveFromFavorites => 'Pikatallennus suosikeiksi'; + @override + String get renamed => 'Nimetty uudelleen'; + @override + String get reset => 'Nollaa'; + @override + String get restart => 'Käynnistä uudelleen'; + @override + String get settings => 'Asetukset'; + @override + String get skipped => 'Ohitettu'; + @override + String get start => 'Aloita'; + @override + String get stop => 'Pysäytä'; + @override + String get save => 'Tallenna'; + @override + String get unchanged => 'Muuttumaton'; + @override + String get unknown => 'Tuntematon'; + @override + String get noItemInClipboard => 'Leikepöydällä ei ole mitään.'; +} + +// Path: receiveTab +class _Translations$receiveTab$fi extends Translations$receiveTab$en { + _Translations$receiveTab$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ota vastaan'; + @override + late final _Translations$receiveTab$infoBox$fi infoBox = _Translations$receiveTab$infoBox$fi._(_root); + @override + late final _Translations$receiveTab$quickSave$fi quickSave = _Translations$receiveTab$quickSave$fi._(_root); +} + +// Path: sendTab +class _Translations$sendTab$fi extends Translations$sendTab$en { + _Translations$sendTab$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lähetä'; + @override + late final _Translations$sendTab$selection$fi selection = _Translations$sendTab$selection$fi._(_root); + @override + late final _Translations$sendTab$picker$fi picker = _Translations$sendTab$picker$fi._(_root); + @override + String get shareIntentInfo => 'Sinä voit myös käyttää laitteesi "Jaa"-toimintoa valitaksesi tiedostoja helpommin.'; + @override + String get nearbyDevices => 'Lähellä olevat laitteet'; + @override + String get thisDevice => 'Tämä laite'; + @override + String get scan => 'Etsi laitteita'; + @override + String get manualSending => 'Manuaalinen lähetys'; + @override + String get sendMode => 'Lähetystapa'; + @override + late final _Translations$sendTab$sendModes$fi sendModes = _Translations$sendTab$sendModes$fi._(_root); + @override + String get sendModeHelp => 'Selitys'; + @override + String get help => 'Varmista, että haluttu kohde on myös samassa Wi-Fi-verkossa.'; + @override + String get placeItems => 'Lisää tiedostot tähän, jotta voit lähettää ne.'; +} + +// Path: settingsTab +class _Translations$settingsTab$fi extends Translations$settingsTab$en { + _Translations$settingsTab$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Asetukset'; + @override + late final _Translations$settingsTab$general$fi general = _Translations$settingsTab$general$fi._(_root); + @override + late final _Translations$settingsTab$receive$fi receive = _Translations$settingsTab$receive$fi._(_root); + @override + late final _Translations$settingsTab$send$fi send = _Translations$settingsTab$send$fi._(_root); + @override + late final _Translations$settingsTab$network$fi network = _Translations$settingsTab$network$fi._(_root); + @override + late final _Translations$settingsTab$other$fi other = _Translations$settingsTab$other$fi._(_root); + @override + String get advancedSettings => 'Edistyneet asetukset'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$fi extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ongelmanratkaisu'; + @override + String get subTitle => 'Eikö sovellus toimi odotetusti? Täältä löydät joitain yleisiä ratkaisuja.'; + @override + String get solution => 'Ratkaisu:'; + @override + String get fixButton => 'Automaattinen korjaus'; + @override + late final _Translations$troubleshootPage$firewall$fi firewall = _Translations$troubleshootPage$firewall$fi._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$fi noDiscovery = _Translations$troubleshootPage$noDiscovery$fi._(_root); + @override + late final _Translations$troubleshootPage$noConnection$fi noConnection = _Translations$troubleshootPage$noConnection$fi._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$fi extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Historia'; + @override + String get openFolder => 'Avaa kansio'; + @override + String get deleteHistory => 'Tyhjennä historia'; + @override + String get empty => 'Historia on tyhjä.'; + @override + late final _Translations$receiveHistoryPage$entryActions$fi entryActions = _Translations$receiveHistoryPage$entryActions$fi._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$fi extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sovellukset (APK)'; + @override + String get excludeSystemApps => 'lukuun ottamatta järjestelmäsovelluksia'; + @override + String get excludeAppsWithoutLaunchIntent => 'lukuun ottamatta sovelluksia, joilla ei ole käynnistysintentiota'; + @override + String apps({required Object n}) => '${n} sovellusta'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$fi extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Poista kaikki'; +} + +// Path: receivePage +class _Translations$receivePage$fi extends Translations$receivePage$en { + _Translations$receivePage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fi'))( + n, + one: 'on lähettämässä sinulle tiedostoa', + other: 'on lähettämässä sinulle ${n} tiedostoa', + ); + @override + String get subTitleMessage => 'lähetti sinulle viestin:'; + @override + String get subTitleLink => 'lähetti sinulle linkin:'; + @override + String get canceled => 'Lähettäjä on peruuttanut pyynnön.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$fi extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Asetukset'; + @override + String get destination => 'Vastaanottoasetukset'; + @override + String get appDirectory => '(LocalSend-kansio)'; + @override + String get saveToGallery => 'Tallenna galleriaan'; + @override + String get saveToGalleryOff => 'Poistettu käytöstä automaattisesti, koska lähetetyissä tiedostoissa on kansioita.'; +} + +// Path: sendPage +class _Translations$sendPage$fi extends Translations$sendPage$en { + _Translations$sendPage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Odotetaan vastausta...'; + @override + String get rejected => 'Vastaanottaja on peruuttanut pyynnön.'; + @override + String get busy => 'Vastaanottaja vastaanottaa toista pyyntöä.'; + @override + String get tooManyAttempts => 'Liian monta yritystä'; +} + +// Path: progressPage +class _Translations$progressPage$fi extends Translations$progressPage$en { + _Translations$progressPage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Tiedostojen lähetys'; + @override + String get titleReceiving => 'Tiedostojen vastaanotto'; + @override + String get savedToGallery => 'Tallennettu Kuvat-kansioon'; + @override + late final _Translations$progressPage$total$fi total = _Translations$progressPage$total$fi._(_root); + @override + late final _Translations$progressPage$remainingTime$fi remainingTime = _Translations$progressPage$remainingTime$fi._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$fi extends Translations$webSharePage$en { + _Translations$webSharePage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Jaa linkin kautta'; + @override + String get loading => 'Käynnistetään palvelinta…'; + @override + String get stopping => 'Pysäytetään palvelinta…'; + @override + String get error => 'Palvelimen käynnistyksessä tapahtui virhe.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fi'))( + n, + one: 'Avaa tämä linkki selaimessasi:', + other: 'Avaa jokin näistä linkeistä selaimessasi:', + ); + @override + String get requests => 'Pyynnöt'; + @override + String get noRequests => 'Ei pyyntöjä vielä.'; + @override + String get encryption => 'Verkon salaus'; + @override + String get autoAccept => 'Hyväksy pyynnöt automaattisesti'; + @override + String get requirePin => 'Vaadi PIN-koodi'; + @override + String pinHint({required Object pin}) => 'PIN-koodi on "${pin}"'; + @override + String get encryptionHint => 'LocalSend käyttää itse allekirjoitettua sertifikaattia. Sinun on hyväksyttävä se selaimessasi.'; + @override + String pendingRequests({required Object n}) => 'Odottavat pyynnöt: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$fi extends Translations$aboutPage$en { + _Translations$aboutPage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tietoja LocalSendista'; + @override + List get description => [ + 'LocalSend on ilmainen, avoimen lähdekoodin sovellus, jonka avulla voit turvallisesti jakaa tiedostoja ja lähettää viestejä läheisten laitteiden kanssa paikallisessa verkossasi ilman internet-yhteyttä.', + 'LocalSend on saatavilla Androidille, iOS:lle, Linuxille, macOS:lle ja Windowsille. Kaikki latausvaihtoehdot löytyvät virallisilta kotisivuilta.', + ]; + @override + String get author => 'Tekijä'; + @override + String get contributors => 'Avustajat'; + @override + String get packagers => 'Pakkaajat'; + @override + String get translators => 'Kääntäjät'; +} + +// Path: donationPage +class _Translations$donationPage$fi extends Translations$donationPage$en { + _Translations$donationPage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lahjoita'; + @override + String get info => + 'LocalSend on ilmainen, avoimen lähdekoodin sovellus ilman mainoksia. Voit tukea projektia lahjoituksella, jos pidät sovelluksesta.'; + @override + String donate({required Object amount}) => 'Lahjoita ${amount}'; + @override + String get thanks => 'Suuret kiitokset!'; + @override + String get restore => 'Palauta ostos'; +} + +// Path: changelogPage +class _Translations$changelogPage$fi extends Translations$changelogPage$en { + _Translations$changelogPage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Muutosloki'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$fi extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Stydi', + 'Jämä', + 'Raju', + 'Makee', + 'Siisti', + 'Kummallinen', + 'Hurja', + 'Hörisevä', + 'Naurava', + 'Suriseva', + 'Pöhelö', + 'Hölmö', + 'Spede', + 'Kummallinen', + 'Rampainen', + 'Jonne', + 'Lössi', + 'Kuuli', + 'Aukiva', + 'Lutsi', + 'Wallahi', + 'Pummi', + 'Köyhä', + 'Saunassa käyvä', + 'Bulkki', + 'Chilli', + 'Dokkaava', + 'Känni', + 'Broidi', + 'Kundi', + 'Göntsä', + 'Pelleilevä', + 'Haiseva', + 'Hakkeri', + ]; + @override + List get fruits => [ + 'Omena', + 'Banaani', + 'Appelsiini', + 'Mango', + 'Päärynä', + 'Kiivi', + 'Kirsikka', + 'Vadelma', + 'Mustikka', + 'Mansikka', + 'Luumu', + 'Persikka', + 'Punaherukka', + 'Mustaherukka', + 'Karhunvatukka', + 'Vesimeloni', + 'Hedelmä', + 'Päärynä', + 'Pihlajanmarja', + 'Karpalo', + 'Puolukka', + 'Lakka', + 'Kuusenkerkkä', + 'Kataja', + 'Kuusama', + 'Ananas', + 'Granaattiomena', + 'Sitruuna', + 'Lime', + 'Papaija', + 'Passionhedelmä', + 'Pomelo', + 'Kiinalainen karviainen', + 'Lychee', + 'Taateli', + 'Viikuna', + 'Rypäle', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$fi extends Translations$dialogs$en { + _Translations$dialogs$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$fi addFile = _Translations$dialogs$addFile$fi._(_root); + @override + late final _Translations$dialogs$openFile$fi openFile = _Translations$dialogs$openFile$fi._(_root); + @override + late final _Translations$dialogs$addressInput$fi addressInput = _Translations$dialogs$addressInput$fi._(_root); + @override + late final _Translations$dialogs$cancelSession$fi cancelSession = _Translations$dialogs$cancelSession$fi._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$fi cannotOpenFile = _Translations$dialogs$cannotOpenFile$fi._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$fi encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$fi._(_root); + @override + late final _Translations$dialogs$errorDialog$fi errorDialog = _Translations$dialogs$errorDialog$fi._(_root); + @override + late final _Translations$dialogs$favoriteDialog$fi favoriteDialog = _Translations$dialogs$favoriteDialog$fi._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$fi favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$fi._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$fi favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$fi._(_root); + @override + late final _Translations$dialogs$fileInfo$fi fileInfo = _Translations$dialogs$fileInfo$fi._(_root); + @override + late final _Translations$dialogs$fileNameInput$fi fileNameInput = _Translations$dialogs$fileNameInput$fi._(_root); + @override + late final _Translations$dialogs$historyClearDialog$fi historyClearDialog = _Translations$dialogs$historyClearDialog$fi._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$fi localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$fi._(_root); + @override + late final _Translations$dialogs$messageInput$fi messageInput = _Translations$dialogs$messageInput$fi._(_root); + @override + late final _Translations$dialogs$noFiles$fi noFiles = _Translations$dialogs$noFiles$fi._(_root); + @override + late final _Translations$dialogs$noPermission$fi noPermission = _Translations$dialogs$noPermission$fi._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$fi notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$fi._(_root); + @override + late final _Translations$dialogs$qr$fi qr = _Translations$dialogs$qr$fi._(_root); + @override + late final _Translations$dialogs$quickActions$fi quickActions = _Translations$dialogs$quickActions$fi._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$fi quickSaveNotice = _Translations$dialogs$quickSaveNotice$fi._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$fi quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$fi._(_root); + @override + late final _Translations$dialogs$pin$fi pin = _Translations$dialogs$pin$fi._(_root); + @override + late final _Translations$dialogs$sendModeHelp$fi sendModeHelp = _Translations$dialogs$sendModeHelp$fi._(_root); + @override + late final _Translations$dialogs$zoom$fi zoom = _Translations$dialogs$zoom$fi._(_root); +} + +// Path: sanitization +class _Translations$sanitization$fi extends Translations$sanitization$en { + _Translations$sanitization$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Tiedostonimi ei voi olla tyhjä'; + @override + String get invalid => 'Tiedostonimi sisältää kiellettyjä merkkejä'; +} + +// Path: tray +class _Translations$tray$fi extends Translations$tray$en { + _Translations$tray$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get open => 'Avaa'; + @override + String get close => 'Lopeta LocalSend'; + @override + String get closeWindows => 'Poistu'; +} + +// Path: web +class _Translations$web$fi extends Translations$web$en { + _Translations$web$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Odotetaan vastausta...'; + @override + String get enterPin => 'Syötä PIN-koodi'; + @override + String get invalidPin => 'Virheellinen PIN-koodi'; + @override + String get tooManyAttempts => 'Liian monta yritystä'; + @override + String get rejected => 'Hylätty'; + @override + String get files => 'Tiedostot'; + @override + String get fileName => 'Tiedoston nimi'; + @override + String get size => 'Koko'; +} + +// Path: assetPicker +class _Translations$assetPicker$fi extends Translations$assetPicker$en { + _Translations$assetPicker$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Vahvista'; + @override + String get cancel => 'Peruuta'; + @override + String get edit => 'Muokkaa'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Lataus epäonnistui'; + @override + String get original => 'Alkuperäinen'; + @override + String get preview => 'Esikatselu'; + @override + String get select => 'Valitse'; + @override + String get emptyList => 'Tyhjä lista'; + @override + String get unSupportedAssetType => 'Tiedostotyyppiä ei tueta.'; + @override + String get unableToAccessAll => 'Kaikkien tiedostojen käyttö laitteella ei onnistu'; + @override + String get viewingLimitedAssetsTip => 'Näytä vain sovelluksen käyttöön saatavilla olevat tiedostot ja albumit.'; + @override + String get changeAccessibleLimitedAssets => 'Päivitä käytettävissä olevat tiedostot napsauttamalla'; + @override + String get accessAllTip => + 'Sovellus pääsee käsiksi vain osaan laitteen tiedostoista. Siirry järjestelmäasetuksiin ja salli sovelluksen pääsy kaikkiin laitteen mediaan.'; + @override + String get goToSystemSettings => 'Siirry järjestelmäasetuksiin'; + @override + String get accessLimitedAssets => 'Jatka rajoitetulla pääsyllä'; + @override + String get accessiblePathName => 'Käytettävissä olevat tiedostot'; + @override + String get sTypeAudioLabel => 'Ääni'; + @override + String get sTypeImageLabel => 'Kuva'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Muut mediat'; + @override + String get sActionPlayHint => 'toista'; + @override + String get sActionPreviewHint => 'esikatsele'; + @override + String get sActionSelectHint => 'valitse'; + @override + String get sActionSwitchPathLabel => 'vaihda polkua'; + @override + String get sActionUseCameraHint => 'käytä kameraa'; + @override + String get sNameDurationLabel => 'kesto'; + @override + String get sUnitAssetCountLabel => 'määrä'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$fi extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Verkkokäyttöliittymät'; + @override + String get info => + 'Oletuksena LocalSend käyttää kaikkia saatavilla olevia verkkoliitäntöjä. Voit sulkea pois verkkoliitännät, joita et halua. Sinun tulee uudelleenkäynnistää LocalSend ottaaksesi muutokset käyttöön.'; + @override + String get preview => 'Esikatselu'; + @override + String get whitelist => 'Sallittujen lista'; + @override + String get blacklist => 'Estettyjen lista'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$fi extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP-osoite:'; + @override + String get port => 'Portti:'; + @override + String get alias => 'Laitteen nimi:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$fi extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get favorites => 'Suosikit'; + @override + String get off => _root.general.off; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$fi extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Valinta'; + @override + String files({required Object files}) => 'Tiedostot: ${files}'; + @override + String size({required Object size}) => 'Koko: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$fi extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get file => 'Tiedosto'; + @override + String get folder => 'Kansio'; + @override + String get media => 'Media'; + @override + String get text => 'Teksti'; + @override + String get app => 'Sovellus'; + @override + String get clipboard => 'Liitä'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$fi extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get single => 'Yksi vastaanottaja'; + @override + String get multiple => 'Monta vastaanottajaa'; + @override + String get link => 'Jaa linkillä'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$fi extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Yleinen'; + @override + String get brightness => 'Teema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$fi brightnessOptions = _Translations$settingsTab$general$brightnessOptions$fi._( + _root, + ); + @override + String get color => 'Väri'; + @override + late final _Translations$settingsTab$general$colorOptions$fi colorOptions = _Translations$settingsTab$general$colorOptions$fi._(_root); + @override + String get language => 'Kieli'; + @override + late final _Translations$settingsTab$general$languageOptions$fi languageOptions = _Translations$settingsTab$general$languageOptions$fi._(_root); + @override + String get saveWindowPlacement => 'Poistu: Tallenna ikkunan sijainti'; + @override + String get saveWindowPlacementWindows => 'Tallenna ikkunan sijainti poistumisen jälkeen'; + @override + String get minimizeToTray => 'Poistu: Minimoi ilmoitusalueelle'; + @override + String get launchAtStartup => 'Automaattinen käynnistys'; + @override + String get launchMinimized => 'Automaattinen käynnistys: Käynnistä piiilotettuna'; + @override + String get showInContextMenu => 'Näytä LocalSend kontekstivalikossa'; + @override + String get animations => 'Animaatiot'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$fi extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Vastaanotto'; + @override + String get quickSave => 'Automaattinen tallennus'; + @override + String get autoFinish => 'Automaattinen lopetus'; + @override + String get destination => 'Kohde'; + @override + String get downloads => '(Lataukset)'; + @override + String get saveToGallery => 'Tallenna media galleriaan'; + @override + String get saveToHistory => 'Tallenna historiaan'; + @override + String get quickSaveFromFavorites => 'Automaattinen tallennus suosikeista'; + @override + String get requirePin => 'Kiinnitä'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$fi extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lähetys'; + @override + String get shareViaLinkAutoAccept => 'Jaa linkki: Hyväksy automaattisesti'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$fi extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Verkko'; + @override + String get needRestart => 'Käynnistä LocalSend uudelleen saadaksesi muutokset käyttöön!'; + @override + String get server => 'Palvelin'; + @override + String get alias => 'Laitteen nimi'; + @override + String get deviceType => 'Laitteen tyyppi'; + @override + String get deviceModel => 'Laitteen malli'; + @override + String get port => 'Portti'; + @override + String get discoveryTimeout => 'Laitteiden etsintäaika'; + @override + String get useSystemName => 'Käytä järjestelmän nimeä'; + @override + String get generateRandomAlias => 'Luo satunnainen alias'; + @override + String portWarning({required Object defaultPort}) => + 'Sinua ei ehkä havaita muiden laitteiden toimesta, koska käytät mukautettua porttia. (oletus: ${defaultPort})'; + @override + String get encryption => 'Salaus'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Sinua ei ehkä havaita muiden laitteiden toimesta, koska käytät mukautettua multicast-osoitetta. (oletus: ${defaultMulticast})'; + @override + late final _Translations$settingsTab$network$networkOptions$fi networkOptions = _Translations$settingsTab$network$networkOptions$fi._(_root); + @override + String get network => 'Verkko'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$fi extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Muut'; + @override + String get support => 'Tue LocalSendia'; + @override + String get donate => 'Lahjoita'; + @override + String get privacyPolicy => 'Tietosuojakäytäntö'; + @override + String get termsOfUse => 'Käyttöehdot'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$fi extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get symptom => + 'Tämä sovellus voi lähettää tiedostoja muihin laitteisiin, mutta muut laitteet eivät voi lähettää tiedostoja tähän laitteeseen.'; + @override + String solution({required Object port}) => + 'Tämä on todennäköisesti palomuuriongelma. Voit ratkaista tämän sallimalla saapuvat yhteydet (UDP ja TCP) porttiin ${port}.'; + @override + String get openFirewall => 'Avaa palomuuri'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$fi extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Tämä laite ei pysty löytämään muita laitteita.'; + @override + String get solution => + 'Varmista, että kaikki laitteet ovat samassa Wi-Fi-verkossa ja jakavat saman kokoonpanon (portti, monilähetysosoite, salaus). Voit yrittää kirjoittaa kohdelaitteen IP-osoitteen manuaalisesti. Jos tämä toimii, harkitse tämän laitteen lisäämistä suosikkeihin, jotta se voidaan löytää automaattisesti tulevaisuudessa.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$fi extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Molemmat laitteet eivät voi löytää toisiaan eivätkä jakaa tiedostoja.'; + @override + String get solution => + 'Onko ongelma olemassa molemmin puolin? Jos on, sinun on varmistettava, että molemmat laitteet ovat samassa Wi-Fi-verkossa ja jakavat saman kokoonpanon (portti, multicast-osoite, salaus). Verkko ei ehkä salli viestintää osallistujien välillä. Tässä tapauksessa tämä vaihtoehto on otettava käyttöön reitittimessä.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$fi extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get open => 'Avaa tiedosto'; + @override + String get showInFolder => 'Näytä kansiossa'; + @override + String get info => 'Tiedot'; + @override + String get deleteFromHistory => 'Poista historiasta'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$fi extends Translations$progressPage$total$en { + _Translations$progressPage$total$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$fi title = _Translations$progressPage$total$title$fi._(_root); + @override + String count({required Object curr, required Object n}) => 'Tiedostot: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Koko: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Nopeus: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$fi extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Käytä 'h' tuntien lyhenteenä ja 'm' minuuttien + @override + String hours({required Object h, required Object m}) => '${h}t ${m}m'; + + /// Käytä 'pv' päiville, 'h' tunneille ja 'm' minuuteille + @override + String days({required Object d, required Object h, required Object m}) => '${d}pv ${h}t ${m}m'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$fi extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lisää valintaan'; + @override + String get content => 'Mitä haluat lisätä?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$fi extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Avaa tiedosto'; + @override + String get content => 'Haluatko avata vastaanotetun tiedoston?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$fi extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Anna osoite'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP-osoite'; + @override + String get recentlyUsed => 'Äskettäin käytetty: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$fi extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Peruuta tiedostonsiirto'; + @override + String get content => 'Haluatko varmasti peruuttaa tiedostonsiirron?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$fi extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tiedostoa ei voi avata'; + @override + String content({required Object file}) => 'Tiedostoa "${file}" ei voitu avata. Onko tämä tiedosto siirretty, nimetty uudelleen tai poistettu?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$fi extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Salaus poistettu käytöstä'; + @override + String get content => 'Viestintä tapahtuu nyt salaamattoman HTTP-protokollan kautta. Jos haluat käyttää HTTPS:ää, ota salaus uudelleen käyttöön.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$fi extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$fi extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Suosikit'; + @override + String get noFavorites => 'Ei suosikkilaitteita vielä.'; + @override + String get addFavorite => 'Lisää'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$fi extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Poista suosikeista'; + @override + String content({required Object name}) => 'Haluatko varmasti poistaa suosikeista "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$fi extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Lisää suosikkeihin'; + @override + String get titleEdit => 'Asetukset'; + @override + String get name => 'Laitteen nimi'; + @override + String get auto => '(automaattinen)'; + @override + String get ip => 'IP-osoite'; + @override + String get port => 'Portti'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$fi extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tiedoston tiedot'; + @override + String get fileName => 'Tiedoston nimi:'; + @override + String get path => 'Polku:'; + @override + String get size => 'Koko:'; + @override + String get sender => 'Lähettäjä:'; + @override + String get time => 'Aika:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$fi extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Anna tiedoston nimi'; + @override + String original({required Object original}) => 'Alkuperäinen: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$fi extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tyhjennä historia'; + @override + String get content => 'Haluatko varmasti poistaa koko historian?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$fi extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => 'LocalSend ei löydä muita laitteita ilman lupaa skannata paikallisverkkoa. Anna tämä lupa asetuksissa.'; + @override + String get gotoSettings => 'Asetukset'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$fi extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kirjoita viesti'; + @override + String get multiline => 'Monirivinen'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$fi extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ei tiedostoa valittuna'; + @override + String get content => 'Valitse vähintään yksi tiedosto.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$fi extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ei oikeuksia'; + @override + String get content => 'Et ole myöntänyt tarvittavia oikeuksia. Myönnä ne asetuksissa.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$fi extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ei saatavilla'; + @override + String get content => 'Tämä ominaisuus on saatavilla vain:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$fi extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR-koodi'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$fi extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Pikatoiminnot'; + @override + String get counter => 'Laskuri'; + @override + String get prefix => 'Etuliite'; + @override + String get padZero => 'Täytä nollilla'; + @override + String get sortBeforeCount => 'Lajittele aakkosjärjestykseen ennen laskentaa'; + @override + String get random => 'Satunnainen'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$fi extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Pikatallennus'; + @override + String get content => 'Tiedostopyynnöt hyväksytään automaattisesti. Huomaa, että kuka tahansa paikallisverkossa voi lähettää sinulle tiedostoja.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$fi extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + List get content => [ + 'Tiedostopyynnöt hyväksytään nyt automaattisesti suosikkiluettelossasi olevilta laitteilta.', + 'Varoitus! Tällä hetkellä tämä ei ole täysin turvallista, koska hakkeri, jolla on minkä tahansa suosikkiluettelosi laitteen sormenjälki, voi lähettää sinulle tiedostoja ilman rajoituksia.', + 'Tämä vaihtoehto on kuitenkin turvallisempi kuin sallia kaikkien paikallisverkon käyttäjien lähettää sinulle tiedostoja ilman rajoituksia.', + ]; + @override + String get title => _root.general.quickSaveFromFavorites; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$fi extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Syötä PIN-koodi'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$fi extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lähetystilat'; + @override + String get single => 'Lähettää tiedostoja yhdelle vastaanottajalle. Valinta tyhjennetään tiedostonsiirron päätyttyä.'; + @override + String get multiple => 'Lähettää tiedostoja useille vastaanottajille. Valinta ei tyhjene.'; + @override + String get link => 'Vastaanottajat, joilla ei ole LocalSendia asennettuna, voivat ladata valitut tiedostot avaamalla linkin selaimessaan.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$fi extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$fi extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get system => 'Järjestelmä'; + @override + String get dark => 'Tumma'; + @override + String get light => 'Vaalea'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$fi extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get system => 'Järjestelmä'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$fi extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get system => 'Järjestelmä'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$fi extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String get all => 'Kaikki'; + @override + String get filtered => 'Suodatettu'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$fi extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$fi._(TranslationsFi root) : this._root = root, super.internal(root); + + final TranslationsFi _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Lähetysprosessi (${time})'; + @override + String get finishedError => 'Päättynyt virheellä'; + @override + String get canceledSender => 'Lähettäjä peruutti'; + @override + String get canceledReceiver => 'Vastaanottaja peruutti'; +} diff --git a/app/lib/gen/strings_fil_PH.g.dart b/app/lib/gen/strings_fil_PH.g.dart new file mode 100644 index 0000000..0a8e88d --- /dev/null +++ b/app/lib/gen/strings_fil_PH.g.dart @@ -0,0 +1,1510 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsFilPh extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsFilPh({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.filPh, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsFilPh _root = this; // ignore: unused_field + + @override + TranslationsFilPh $copyWith({TranslationMetadata? meta}) => TranslationsFilPh(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Filipino'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$fil_PH general = _Translations$general$fil_PH._(_root); + @override + late final _Translations$receiveTab$fil_PH receiveTab = _Translations$receiveTab$fil_PH._(_root); + @override + late final _Translations$sendTab$fil_PH sendTab = _Translations$sendTab$fil_PH._(_root); + @override + late final _Translations$settingsTab$fil_PH settingsTab = _Translations$settingsTab$fil_PH._(_root); + @override + late final _Translations$troubleshootPage$fil_PH troubleshootPage = _Translations$troubleshootPage$fil_PH._(_root); + @override + late final _Translations$networkInterfacesPage$fil_PH networkInterfacesPage = _Translations$networkInterfacesPage$fil_PH._(_root); + @override + late final _Translations$receiveHistoryPage$fil_PH receiveHistoryPage = _Translations$receiveHistoryPage$fil_PH._(_root); + @override + late final _Translations$apkPickerPage$fil_PH apkPickerPage = _Translations$apkPickerPage$fil_PH._(_root); + @override + late final _Translations$selectedFilesPage$fil_PH selectedFilesPage = _Translations$selectedFilesPage$fil_PH._(_root); + @override + late final _Translations$receivePage$fil_PH receivePage = _Translations$receivePage$fil_PH._(_root); + @override + late final _Translations$receiveOptionsPage$fil_PH receiveOptionsPage = _Translations$receiveOptionsPage$fil_PH._(_root); + @override + late final _Translations$sendPage$fil_PH sendPage = _Translations$sendPage$fil_PH._(_root); + @override + late final _Translations$progressPage$fil_PH progressPage = _Translations$progressPage$fil_PH._(_root); + @override + late final _Translations$webSharePage$fil_PH webSharePage = _Translations$webSharePage$fil_PH._(_root); + @override + late final _Translations$aboutPage$fil_PH aboutPage = _Translations$aboutPage$fil_PH._(_root); + @override + late final _Translations$donationPage$fil_PH donationPage = _Translations$donationPage$fil_PH._(_root); + @override + late final _Translations$changelogPage$fil_PH changelogPage = _Translations$changelogPage$fil_PH._(_root); + @override + late final _Translations$aliasGenerator$fil_PH aliasGenerator = _Translations$aliasGenerator$fil_PH._(_root); + @override + late final _Translations$dialogs$fil_PH dialogs = _Translations$dialogs$fil_PH._(_root); + @override + late final _Translations$sanitization$fil_PH sanitization = _Translations$sanitization$fil_PH._(_root); + @override + late final _Translations$tray$fil_PH tray = _Translations$tray$fil_PH._(_root); + @override + late final _Translations$web$fil_PH web = _Translations$web$fil_PH._(_root); + @override + late final _Translations$assetPicker$fil_PH assetPicker = _Translations$assetPicker$fil_PH._(_root); +} + +// Path: general +class _Translations$general$fil_PH extends Translations$general$en { + _Translations$general$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Tanggapin'; + @override + String get accepted => 'Tinanggap'; + @override + String get add => 'Magdagdag'; + @override + String get advanced => 'Advanced'; + @override + String get cancel => 'Kanselahin'; + @override + String get close => 'Isara'; + @override + String get confirm => 'Kumpirmahin'; + @override + String get continueStr => 'Magpatuloy'; + @override + String get copy => 'Kopyahin'; + @override + String get copiedToClipboard => 'Kopyahin sa Clipboard'; + @override + String get decline => 'Tanggihan'; + @override + String get done => 'Tapos Na'; + @override + String get delete => 'Tanggalin'; + @override + String get edit => 'Baguhin'; + @override + String get error => 'Error'; + @override + String get example => 'Halimbawa'; + @override + String get files => 'Files'; + @override + String get finished => 'Tapos Na'; + @override + String get hide => 'Itago'; + @override + String get off => 'Sarado'; + @override + String get offline => 'Offline'; + @override + String get on => 'Bukas'; + @override + String get online => 'Online'; + @override + String get open => 'Buksan'; + @override + String get queue => 'Pila'; + @override + String get quickSave => 'Quick Save'; + @override + String get quickSaveFromFavorites => 'I-save agad kapag galing sa "Favorites"'; + @override + String get renamed => 'Pinangalanan'; + @override + String get reset => 'Reset'; + @override + String get restart => 'Restart'; + @override + String get settings => 'Settings'; + @override + String get skipped => 'Nilaktawan'; + @override + String get start => 'Simulan'; + @override + String get stop => 'Ihinto'; + @override + String get save => 'Save'; + @override + String get unchanged => 'Walang Pagbabago'; + @override + String get unknown => 'Hindi Kilala'; + @override + String get noItemInClipboard => 'Walang Item sa Clipboard'; +} + +// Path: receiveTab +class _Translations$receiveTab$fil_PH extends Translations$receiveTab$en { + _Translations$receiveTab$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tumanggap'; + @override + late final _Translations$receiveTab$infoBox$fil_PH infoBox = _Translations$receiveTab$infoBox$fil_PH._(_root); + @override + late final _Translations$receiveTab$quickSave$fil_PH quickSave = _Translations$receiveTab$quickSave$fil_PH._(_root); +} + +// Path: sendTab +class _Translations$sendTab$fil_PH extends Translations$sendTab$en { + _Translations$sendTab$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Magpadala'; + @override + late final _Translations$sendTab$selection$fil_PH selection = _Translations$sendTab$selection$fil_PH._(_root); + @override + late final _Translations$sendTab$picker$fil_PH picker = _Translations$sendTab$picker$fil_PH._(_root); + @override + String get shareIntentInfo => 'Maaaring gamitin ang "Share" feature sa iyong mobile device para sa mas madaling pagpili ng mga file.'; + @override + String get nearbyDevices => 'Malalapit na mga device'; + @override + String get thisDevice => 'Ang Device na Ito'; + @override + String get scan => 'Maghanap ng mga device'; + @override + String get manualSending => 'Mano-manong pagpapadala'; + @override + String get sendMode => 'Send mode'; + @override + late final _Translations$sendTab$sendModes$fil_PH sendModes = _Translations$sendTab$sendModes$fil_PH._(_root); + @override + String get sendModeHelp => 'Paliwanag'; + @override + String get help => 'Mangyaring siguraduhin na ang target ay nasa parehas na wifi network.'; + @override + String get placeItems => 'Maglagay ng mga bagay na i-share.'; +} + +// Path: settingsTab +class _Translations$settingsTab$fil_PH extends Translations$settingsTab$en { + _Translations$settingsTab$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Settings'; + @override + late final _Translations$settingsTab$general$fil_PH general = _Translations$settingsTab$general$fil_PH._(_root); + @override + late final _Translations$settingsTab$receive$fil_PH receive = _Translations$settingsTab$receive$fil_PH._(_root); + @override + late final _Translations$settingsTab$send$fil_PH send = _Translations$settingsTab$send$fil_PH._(_root); + @override + late final _Translations$settingsTab$network$fil_PH network = _Translations$settingsTab$network$fil_PH._(_root); + @override + late final _Translations$settingsTab$other$fil_PH other = _Translations$settingsTab$other$fil_PH._(_root); + @override + String get advancedSettings => 'Advanced settings'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$fil_PH extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Troubleshoot'; + @override + String get subTitle => 'Hindi gumagana ang app na ito gaya nang inaasahan? Narito ang mga madalas na solusyon.'; + @override + String get solution => 'Solusyon:'; + @override + String get fixButton => 'Awtomatikong ayusin'; + @override + late final _Translations$troubleshootPage$firewall$fil_PH firewall = _Translations$troubleshootPage$firewall$fil_PH._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$fil_PH noDiscovery = _Translations$troubleshootPage$noDiscovery$fil_PH._(_root); + @override + late final _Translations$troubleshootPage$noConnection$fil_PH noConnection = _Translations$troubleshootPage$noConnection$fil_PH._(_root); +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$fil_PH extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mga Interface ng Network'; + @override + String get info => + 'Bilang default, ang LocalSend ay gumagamit ng lahat ng mga available na network interface. Maaari mong ibukod ang mga hindi mo gustong network dito. Kinakailangang i-restart ang server upang mai-apply ang mga pagbabago'; + @override + String get preview => 'Silipin'; + @override + String get whitelist => 'Whitelist'; + @override + String get blacklist => 'Blacklist'; +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$fil_PH extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'History'; + @override + String get openFolder => 'Buksan ang folder'; + @override + String get deleteHistory => 'Burahin ang history'; + @override + String get empty => 'Walang laman ang history.'; + @override + late final _Translations$receiveHistoryPage$entryActions$fil_PH entryActions = _Translations$receiveHistoryPage$entryActions$fil_PH._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$fil_PH extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Apps (APK)'; + @override + String get excludeSystemApps => 'Ibukod ang mga system app'; + @override + String get excludeAppsWithoutLaunchIntent => 'Ibukod and mga non-launchable app'; + @override + String apps({required Object n}) => '${n} Apps'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$fil_PH extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Burahin lahat'; +} + +// Path: receivePage +class _Translations$receivePage$fil_PH extends Translations$receivePage$en { + _Translations$receivePage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fil'))( + n, + one: 'ay gustong magpadala sa iyo ng file', + other: 'ay gustong magpadala sa iyo ng ${n} na mga file', + ); + @override + String get subTitleMessage => 'ay nagpadala sa iyo ng mensahe:'; + @override + String get subTitleLink => 'ay nagpadala sa iyo ng link:'; + @override + String get canceled => 'Ang sender ay nagkansela ng request.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$fil_PH extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Options'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend folder)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Awtomatikong pinatay dahil mayroong mga directories.'; +} + +// Path: sendPage +class _Translations$sendPage$fil_PH extends Translations$sendPage$en { + _Translations$sendPage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Naghihintay ng response...'; + @override + String get rejected => 'Tinanggihan ng recipient ang request.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Ang recipient ay abala pa sa ibang request.'; +} + +// Path: progressPage +class _Translations$progressPage$fil_PH extends Translations$progressPage$en { + _Translations$progressPage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Nagpapadala ng mga file'; + @override + String get titleReceiving => 'Tumatanggap ng mga file'; + @override + String get savedToGallery => 'Naka-save sa Photos'; + @override + late final _Translations$progressPage$total$fil_PH total = _Translations$progressPage$total$fil_PH._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$fil_PH extends Translations$webSharePage$en { + _Translations$webSharePage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'I-share gamit ang link'; + @override + String get loading => 'Binubuksan ang server...'; + @override + String get stopping => 'Ihinihinto ang server...'; + @override + String get error => 'May nangyaring error habang binubuksan ang server.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fil'))( + n, + one: 'Buksan ang link na ito sa browser:', + other: 'Buksan ang isa sa mga link na ito sa browser:', + ); + @override + String get requests => 'Requests'; + @override + String get noRequests => 'Wala pang mga request.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Kusang I-accept ang request'; + @override + String get requirePin => 'I-require ang Pin'; + @override + String pinHint({required Object pin}) => 'Ang Pin ay "${pin}"'; + @override + String get encryptionHint => 'Ang LocalSend ay gumagamit ng self-signed certificate. Kailangan mo itong i-accept sa browser.'; + @override + String pendingRequests({required Object n}) => 'Mga naka-pending na request: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$fil_PH extends Translations$aboutPage$en { + _Translations$aboutPage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tungkol sa LocalSend'; + @override + List get description => [ + 'Ang LocalSend ay isang libre at open-source na app na nagbibigay-daan sa secure na pagbabahagi ng mga file at mga message sa mga kalapit na device sa iyong local network nang hindi nangangailangan ng koneksyon sa internet.', + 'Available ang app na ito sa Android, iOS, macOS, Windows, at Linux. Maaari mong mahanap ang lahat ng mga pagpipilian sa pag-download sa opisyal na homepage.', + ]; + @override + String get author => 'Author'; + @override + String get contributors => 'Mga Contributor'; + @override + String get packagers => 'Mga Packagers'; + @override + String get translators => 'Mga Translator'; +} + +// Path: donationPage +class _Translations$donationPage$fil_PH extends Translations$donationPage$en { + _Translations$donationPage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mag-donate'; + @override + String get info => + 'Ang LocalSend ay libre, open-source, at walang anumang mga ad. Kung iyong nagustuhan ang app, maaari mong suportahan ang development sa pamamagitan ng donasyon.'; + @override + String donate({required Object amount}) => 'Mag-donate ng ${amount}'; + @override + String get thanks => 'Maraming salamat!'; + @override + String get restore => 'Restore purchase'; +} + +// Path: changelogPage +class _Translations$changelogPage$fil_PH extends Translations$changelogPage$en { + _Translations$changelogPage$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Changelog'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$fil_PH extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Adorable', + 'Beautiful', + 'Big', + 'Bright', + 'Clean', + 'Clever', + 'Cool', + 'Cute', + 'Cunning', + 'Determined', + 'Energetic', + 'Efficient', + 'Fantastic', + 'Fast', + 'Fine', + 'Fresh', + 'Good', + 'Gorgeous', + 'Great', + 'Handsome', + 'Hot', + 'Kind', + 'Lovely', + 'Mystic', + 'Neat', + 'Nice', + 'Patient', + 'Pretty', + 'Powerful', + 'Rich', + 'Secret', + 'Smart', + 'Solid', + 'Special', + 'Strategic', + 'Strong', + 'Tidy', + 'Wise', + ]; + @override + List get fruits => [ + 'Apple', + 'Avocado', + 'Banana', + 'Blackberry', + 'Blueberry', + 'Broccoli', + 'Carrot', + 'Cherry', + 'Coconut', + 'Grape', + 'Lemon', + 'Lettuce', + 'Mango', + 'Melon', + 'Mushroom', + 'Onion', + 'Orange', + 'Papaya', + 'Peach', + 'Pear', + 'Pineapple', + 'Potato', + 'Pumpkin', + 'Raspberry', + 'Strawberry', + 'Tomato', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$fil_PH extends Translations$dialogs$en { + _Translations$dialogs$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$fil_PH addFile = _Translations$dialogs$addFile$fil_PH._(_root); + @override + late final _Translations$dialogs$openFile$fil_PH openFile = _Translations$dialogs$openFile$fil_PH._(_root); + @override + late final _Translations$dialogs$addressInput$fil_PH addressInput = _Translations$dialogs$addressInput$fil_PH._(_root); + @override + late final _Translations$dialogs$cancelSession$fil_PH cancelSession = _Translations$dialogs$cancelSession$fil_PH._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$fil_PH cannotOpenFile = _Translations$dialogs$cannotOpenFile$fil_PH._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$fil_PH encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$fil_PH._( + _root, + ); + @override + late final _Translations$dialogs$errorDialog$fil_PH errorDialog = _Translations$dialogs$errorDialog$fil_PH._(_root); + @override + late final _Translations$dialogs$favoriteDialog$fil_PH favoriteDialog = _Translations$dialogs$favoriteDialog$fil_PH._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$fil_PH favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$fil_PH._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$fil_PH favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$fil_PH._(_root); + @override + late final _Translations$dialogs$fileInfo$fil_PH fileInfo = _Translations$dialogs$fileInfo$fil_PH._(_root); + @override + late final _Translations$dialogs$fileNameInput$fil_PH fileNameInput = _Translations$dialogs$fileNameInput$fil_PH._(_root); + @override + late final _Translations$dialogs$historyClearDialog$fil_PH historyClearDialog = _Translations$dialogs$historyClearDialog$fil_PH._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$fil_PH localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$fil_PH._( + _root, + ); + @override + late final _Translations$dialogs$messageInput$fil_PH messageInput = _Translations$dialogs$messageInput$fil_PH._(_root); + @override + late final _Translations$dialogs$noFiles$fil_PH noFiles = _Translations$dialogs$noFiles$fil_PH._(_root); + @override + late final _Translations$dialogs$noPermission$fil_PH noPermission = _Translations$dialogs$noPermission$fil_PH._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$fil_PH notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$fil_PH._( + _root, + ); + @override + late final _Translations$dialogs$qr$fil_PH qr = _Translations$dialogs$qr$fil_PH._(_root); + @override + late final _Translations$dialogs$quickActions$fil_PH quickActions = _Translations$dialogs$quickActions$fil_PH._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$fil_PH quickSaveNotice = _Translations$dialogs$quickSaveNotice$fil_PH._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$fil_PH quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$fil_PH._(_root); + @override + late final _Translations$dialogs$pin$fil_PH pin = _Translations$dialogs$pin$fil_PH._(_root); + @override + late final _Translations$dialogs$sendModeHelp$fil_PH sendModeHelp = _Translations$dialogs$sendModeHelp$fil_PH._(_root); + @override + late final _Translations$dialogs$zoom$fil_PH zoom = _Translations$dialogs$zoom$fil_PH._(_root); +} + +// Path: sanitization +class _Translations$sanitization$fil_PH extends Translations$sanitization$en { + _Translations$sanitization$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Ang Filename ay hindi maaaring walang laman'; + @override + String get invalid => 'Ang Filename ay naglalaman ng hindi suportado na characters'; +} + +// Path: tray +class _Translations$tray$fil_PH extends Translations$tray$en { + _Translations$tray$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Isara ang LocalSend'; + @override + String get closeWindows => 'Isara'; +} + +// Path: web +class _Translations$web$fil_PH extends Translations$web$en { + _Translations$web$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Ilagay ang PIN'; + @override + String get invalidPin => 'Ang PIN ay invalid'; + @override + String get tooManyAttempts => 'Marami nang pagsubok'; + @override + String get rejected => 'Hindi Tinanggap'; + @override + String get files => 'Files'; + @override + String get fileName => 'Pangalan ng file'; + @override + String get size => 'Size'; +} + +// Path: assetPicker +class _Translations$assetPicker$fil_PH extends Translations$assetPicker$en { + _Translations$assetPicker$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Kumpirmahin'; + @override + String get cancel => 'Kanselahin'; + @override + String get edit => 'Baguhin'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Load failed'; + @override + String get original => 'Pinagmulan'; + @override + String get preview => 'Silipin'; + @override + String get select => 'Piliin'; + @override + String get emptyList => 'Walang lamang listahan'; + @override + String get unSupportedAssetType => 'Hindi suportadong file type.'; + @override + String get unableToAccessAll => 'Hindi ma-access ang lahat ng mga file sa device'; + @override + String get viewingLimitedAssetsTip => 'Makikita lamang ang mga file at mga album na accessible sa app'; + @override + String get changeAccessibleLimitedAssets => 'I-click para i-update ang accessible na mga file'; + @override + String get accessAllTip => + 'Ang app na ito ay kaya lamang mag-access ng iilang mga file sa device. Magtungo sa system settings at i-allow ang app para ma-access ang lahat ng media sa device.'; + @override + String get goToSystemSettings => 'Magpunta sa system settings'; + @override + String get accessLimitedAssets => 'Ituloy nang limitadong access'; + @override + String get accessiblePathName => 'Accessible na mga file'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Image'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Iba pang media'; + @override + String get sActionPlayHint => 'play'; + @override + String get sActionPreviewHint => 'silipin'; + @override + String get sActionSelectHint => 'piliin'; + @override + String get sActionSwitchPathLabel => 'baguhin ang lokasyon'; + @override + String get sActionUseCameraHint => 'gamiting ang camera'; + @override + String get sNameDurationLabel => 'duration'; + @override + String get sUnitAssetCountLabel => 'count'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$fil_PH extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Alias:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$fil_PH extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Mga Paborito'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$fil_PH extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Pagpipilian'; + @override + String files({required Object files}) => 'Mga File: ${files}'; + @override + String size({required Object size}) => 'Size: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$fil_PH extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get file => 'File'; + @override + String get folder => 'Folder'; + @override + String get media => 'Media'; + @override + String get text => 'Text'; + @override + String get app => 'App'; + @override + String get clipboard => 'Paste'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$fil_PH extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get single => 'Isang tatanggap'; + @override + String get multiple => 'Maramihang tatanggap'; + @override + String get link => 'I-share gamit ang link'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$fil_PH extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'General'; + @override + String get brightness => 'Tema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$fil_PH brightnessOptions = + _Translations$settingsTab$general$brightnessOptions$fil_PH._(_root); + @override + String get color => 'Kulay'; + @override + late final _Translations$settingsTab$general$colorOptions$fil_PH colorOptions = _Translations$settingsTab$general$colorOptions$fil_PH._(_root); + @override + String get language => 'Wika'; + @override + late final _Translations$settingsTab$general$languageOptions$fil_PH languageOptions = _Translations$settingsTab$general$languageOptions$fil_PH._( + _root, + ); + @override + String get saveWindowPlacement => 'Quit: I-save ang window placement'; + @override + String get saveWindowPlacementWindows => 'I-save ang posisyon ng window pagkasara'; + @override + String get minimizeToTray => 'Quit: Paliitin sa Tray/Menu Bar'; + @override + String get launchAtStartup => 'I-autostart pagkatapos mag-login'; + @override + String get launchMinimized => 'Autostart: I-start nang nakatago'; + @override + String get showInContextMenu => 'Ipakita ang LocalSend sa context menu'; + @override + String get animations => 'Animations'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$fil_PH extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tumanggap'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Auto Finish'; + @override + String get destination => 'Patutunguhan'; + @override + String get downloads => '(Downloads)'; + @override + String get saveToGallery => 'I-save ang media sa gallery'; + @override + String get saveToHistory => 'I-save sa history'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$fil_PH extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ipasa'; + @override + String get shareViaLinkAutoAccept => 'Kusang tanggapin ang request sa "Share via link" mode'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$fil_PH extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Network'; + @override + String get needRestart => 'I-restart ang server para ma-apply ang settings!'; + @override + String get server => 'Server'; + @override + String get alias => 'Alias'; + @override + String get deviceType => 'Device type'; + @override + String get deviceModel => 'Device model'; + @override + String get port => 'Port'; + @override + String get network => 'Network'; + @override + late final _Translations$settingsTab$network$networkOptions$fil_PH networkOptions = _Translations$settingsTab$network$networkOptions$fil_PH._( + _root, + ); + @override + String get discoveryTimeout => 'Nag Timeout ang Discovery'; + @override + String get useSystemName => 'Gamitin ang pangalan ng system'; + @override + String get generateRandomAlias => 'Mag-generate ng random na alias'; + @override + String portWarning({required Object defaultPort}) => + 'Maaaring hindi ka ma-detect ng ibang devices dahil ikaw ay gumagamit ng ibang port. (default: ${defaultPort})'; + @override + String get encryption => 'Encryption'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Maaaring hindi ka ma-detect ng ibang devices dahil ikaw ay gumagamit ng ibang multicast address. (default: ${defaultMulticast})'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$fil_PH extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Iba Pa'; + @override + String get support => 'Suportahan ang LocalSend'; + @override + String get donate => 'Mag-donate'; + @override + String get privacyPolicy => 'Patakaran sa Privacy'; + @override + String get termsOfUse => 'Mga Tuntunin sa Paggamit'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$fil_PH extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get symptom => + 'Ang app na ito ay nakakapagpadala ng mga file sa ibang mga device ngunit ang ibang mga device ay hindi makapagpadala sa device na ito.'; + @override + String solution({required Object port}) => + 'Ito ay kadalasang isyu sa firewall. Maaari mong maayos ito sa pamamagitan nang pag-allow ng mga incoming connections (UDP at TCP) sa port ${port}.'; + @override + String get openFirewall => 'Buksan ang Firewall'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$fil_PH extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ang device na\'to ay hindi maka-discover ng ibang devices.'; + @override + String get solution => + 'Siguraduhing lahat ng device ay nasa same WI-FI network at i-share ang parehong configuration (port, multicast address, encryption). Pwedeng i-type manually ang IP address ng target device. Kung gumana, i-consider na i-dagdag ang device sa favorites upang automatic na ma discover sa susunod na paggamit.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$fil_PH extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ang dalawa o higit pang device ay hindi ma-discover ang isa\'t isa o hindi makapag-share ng mga file.'; + @override + String get solution => + 'Ang problema ay nangyayari sa dalawang device? Mangyaring siguraduhin na ang dalawang device ay nasa parehas na wifi network at mayroong parehas na configuration (port, multicast address, encryption). Maaaring ang wifi ay hindi pinahihintulutan and komunikasyon sa pagitan nang mga participants. Sa ganitong pangyayari, ang option na ito ay dapat i-enable sa router.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$fil_PH extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get open => 'Buksan ang file'; + @override + String get showInFolder => 'Buksan sa folder'; + @override + String get info => 'Impormasyon'; + @override + String get deleteFromHistory => 'Burahin sa history'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$fil_PH extends Translations$progressPage$total$en { + _Translations$progressPage$total$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$fil_PH title = _Translations$progressPage$total$title$fil_PH._(_root); + @override + String count({required Object curr, required Object n}) => 'Files: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Size: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Speed: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$fil_PH extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Idagdag sa selection'; + @override + String get content => 'Ano ang gusto mong idagdag?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$fil_PH extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Buksan ang file'; + @override + String get content => 'Gusto mo bang buksan ang natanggap na file?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$fil_PH extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ilagay ang address'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP Address'; + @override + String get recentlyUsed => 'Recently used: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$fil_PH extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kanselahin ang pagpapadala ng file'; + @override + String get content => 'Gusto mo ba talagang kanselahin ang pagpapadala ng file?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$fil_PH extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hindi mabuksan ang file'; + @override + String content({required Object file}) => 'Hindi mabuksan ang "${file}". Ito ba ay nalipat, pinangalanan, o nabura?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$fil_PH extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ang encryption ay naka-disable'; + @override + String get content => + 'Ang communication ngayon ay nangyayari gamit ang unencrypted HTTP protocol. Para gamitin ang HTTPS, muling i-enable ang encryption.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$fil_PH extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$fil_PH extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favorites'; + @override + String get noFavorites => 'Wala pang favorites sa mga device.'; + @override + String get addFavorite => 'Magdagdag'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$fil_PH extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Burahin sa favorites'; + @override + String content({required Object name}) => 'Gusto mo ba talagang burahin ang favorites "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$fil_PH extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Idagdag sa favorites'; + @override + String get titleEdit => 'Adjust'; + @override + String get name => 'Alias'; + @override + String get auto => '(auto)'; + @override + String get ip => 'IP Address'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$fil_PH extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Impormasyon sa file'; + @override + String get fileName => 'Pangalan ng file:'; + @override + String get path => 'Lokasyon:'; + @override + String get size => 'Size:'; + @override + String get sender => 'Sender:'; + @override + String get time => 'Time:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$fil_PH extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ilagay ang pangalan ng file'; + @override + String original({required Object original}) => 'Orihinal: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$fil_PH extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Burahin ang history'; + @override + String get content => 'Gusto mo ba talagang burahin ang buong history?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$fil_PH extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'Hindi makikita ng LocalSend ang ibang devices hangga\'t hindi nabibigyan ng permission para mag-scan sa lokal na network. Mangyaring bigyan ito ng permission sa settings.'; + @override + String get gotoSettings => 'Settings'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$fil_PH extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'I-type ang message'; + @override + String get multiline => 'Multiline'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$fil_PH extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Walang file na pinli'; + @override + String get content => 'Mangyaring pumili nang kahit isang file.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$fil_PH extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Walang permission'; + @override + String get content => 'Hindi nabigyan ng mga kinakailangang permissions. Mangyaring bigyan ito ng permission sa settings.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$fil_PH extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hindi available'; + @override + String get content => 'Ang feature na ito ay available lamang sa:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$fil_PH extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR Code'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$fil_PH extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Quick Actions'; + @override + String get counter => 'Counter'; + @override + String get prefix => 'Prefix'; + @override + String get padZero => 'Pad with zeros'; + @override + String get sortBeforeCount => 'Pagsunud-sunurin ayon sa alpabeto'; + @override + String get random => 'Random'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$fil_PH extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Ang mga file request ay awtomatikong tinatanggap. Mabatid lamang na ang lahat ng nasa lokal na network ay maaaring magpadala sa iyo ng mga file.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$fil_PH extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Ang mga file request ngayon ay awtomatikong tinatanggap sa mga device sa iyong listahan ng mga paborito.', + 'Babala: Ito ay kasalukuyang hindi ganap na secure dahil ang isang hacker na alam ang fingerprint ng iyong mga paboritong device ay maaari pa ring magpadala sa iyo ng mga file.', + 'Gayunpaman, ang opsyon na ito ay mas secure kaysa sa pag-allow sa anumang device.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$fil_PH extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ilagay ang PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$fil_PH extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'Send modes'; + @override + String get single => 'Magpadala ng mga file sa iisang recipient o tatanggap. Ang mga pagpipilian ay maaalis pagkatapos ipadala ang file.'; + @override + String get multiple => 'Magpadala ng mga file sa maraming recipient o tatanggap. Ang mga pagpipilian ay hindi maaalis.'; + @override + String get link => + 'Ang mga recipient o tatanggap na walang nakainstall na LocalSend ay maaaring mag download nang mga napiling file sa pamamagitan ng pagbukas ng link sa kanilang browser.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$fil_PH extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$fil_PH extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; + @override + String get dark => 'Madilim'; + @override + String get light => 'Maliwanag'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$fil_PH extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$fil_PH extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$fil_PH extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String get all => 'Lahat'; + @override + String get filtered => 'Na-filter'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$fil_PH extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$fil_PH._(TranslationsFilPh root) : this._root = root, super.internal(root); + + final TranslationsFilPh _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Kabuuang progreso (${time})'; + @override + String get finishedError => 'Natapos nang may error'; + @override + String get canceledSender => 'Kinansela ng sender'; + @override + String get canceledReceiver => 'Kinansela ng receiver'; +} diff --git a/app/lib/gen/strings_fr.g.dart b/app/lib/gen/strings_fr.g.dart new file mode 100644 index 0000000..890aaf0 --- /dev/null +++ b/app/lib/gen/strings_fr.g.dart @@ -0,0 +1,1438 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsFr extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsFr({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.fr, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsFr _root = this; // ignore: unused_field + + @override + TranslationsFr $copyWith({TranslationMetadata? meta}) => TranslationsFr(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Français'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$fr general = _Translations$general$fr._(_root); + @override + late final _Translations$receiveTab$fr receiveTab = _Translations$receiveTab$fr._(_root); + @override + late final _Translations$sendTab$fr sendTab = _Translations$sendTab$fr._(_root); + @override + late final _Translations$settingsTab$fr settingsTab = _Translations$settingsTab$fr._(_root); + @override + late final _Translations$troubleshootPage$fr troubleshootPage = _Translations$troubleshootPage$fr._(_root); + @override + late final _Translations$receiveHistoryPage$fr receiveHistoryPage = _Translations$receiveHistoryPage$fr._(_root); + @override + late final _Translations$apkPickerPage$fr apkPickerPage = _Translations$apkPickerPage$fr._(_root); + @override + late final _Translations$selectedFilesPage$fr selectedFilesPage = _Translations$selectedFilesPage$fr._(_root); + @override + late final _Translations$receivePage$fr receivePage = _Translations$receivePage$fr._(_root); + @override + late final _Translations$receiveOptionsPage$fr receiveOptionsPage = _Translations$receiveOptionsPage$fr._(_root); + @override + late final _Translations$sendPage$fr sendPage = _Translations$sendPage$fr._(_root); + @override + late final _Translations$progressPage$fr progressPage = _Translations$progressPage$fr._(_root); + @override + late final _Translations$webSharePage$fr webSharePage = _Translations$webSharePage$fr._(_root); + @override + late final _Translations$aboutPage$fr aboutPage = _Translations$aboutPage$fr._(_root); + @override + late final _Translations$donationPage$fr donationPage = _Translations$donationPage$fr._(_root); + @override + late final _Translations$changelogPage$fr changelogPage = _Translations$changelogPage$fr._(_root); + @override + late final _Translations$dialogs$fr dialogs = _Translations$dialogs$fr._(_root); + @override + late final _Translations$sanitization$fr sanitization = _Translations$sanitization$fr._(_root); + @override + late final _Translations$tray$fr tray = _Translations$tray$fr._(_root); + @override + late final _Translations$web$fr web = _Translations$web$fr._(_root); + @override + late final _Translations$assetPicker$fr assetPicker = _Translations$assetPicker$fr._(_root); + @override + late final _Translations$networkInterfacesPage$fr networkInterfacesPage = _Translations$networkInterfacesPage$fr._(_root); +} + +// Path: general +class _Translations$general$fr extends Translations$general$en { + _Translations$general$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Accepter'; + @override + String get accepted => 'Accepté'; + @override + String get add => 'Ajouter'; + @override + String get advanced => 'Avancé'; + @override + String get cancel => 'Annuler'; + @override + String get close => 'Fermer'; + @override + String get confirm => 'Confirmer'; + @override + String get continueStr => 'Continuer'; + @override + String get copy => 'Copier'; + @override + String get copiedToClipboard => 'Copié dans le presse-papiers'; + @override + String get decline => 'Refuser'; + @override + String get done => 'Terminé'; + @override + String get delete => 'Supprimer'; + @override + String get edit => 'Modifier'; + @override + String get error => 'Erreur'; + @override + String get example => 'Exemple'; + @override + String get files => 'Fichiers'; + @override + String get finished => 'Terminé'; + @override + String get hide => 'Masquer'; + @override + String get off => 'Désactivé'; + @override + String get offline => 'Hors ligne'; + @override + String get on => 'Activé'; + @override + String get online => 'En ligne'; + @override + String get open => 'Ouvrir'; + @override + String get queue => 'File d\'attente'; + @override + String get quickSave => 'Sauvegarde rapide'; + @override + String get quickSaveFromFavorites => 'Sauvegarde rapide des favoris'; + @override + String get renamed => 'Renommé'; + @override + String get reset => 'Annuler les changements'; + @override + String get restart => 'Redémarrer'; + @override + String get settings => 'Paramètres'; + @override + String get skipped => 'Ignoré'; + @override + String get start => 'Démarrer'; + @override + String get stop => 'Arrêter'; + @override + String get save => 'Sauvegarder'; + @override + String get unchanged => 'Inchangé'; + @override + String get unknown => 'Inconnu'; + @override + String get noItemInClipboard => 'Aucun élément dans le presse-papiers.'; +} + +// Path: receiveTab +class _Translations$receiveTab$fr extends Translations$receiveTab$en { + _Translations$receiveTab$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Recevoir'; + @override + late final _Translations$receiveTab$infoBox$fr infoBox = _Translations$receiveTab$infoBox$fr._(_root); + @override + late final _Translations$receiveTab$quickSave$fr quickSave = _Translations$receiveTab$quickSave$fr._(_root); +} + +// Path: sendTab +class _Translations$sendTab$fr extends Translations$sendTab$en { + _Translations$sendTab$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Envoyer'; + @override + late final _Translations$sendTab$selection$fr selection = _Translations$sendTab$selection$fr._(_root); + @override + late final _Translations$sendTab$picker$fr picker = _Translations$sendTab$picker$fr._(_root); + @override + String get shareIntentInfo => + 'Vous pouvez également utiliser la fonction "Partager" de votre appareil pour sélectionner des fichiers plus facilement.'; + @override + String get nearbyDevices => 'Appareils à proximité'; + @override + String get thisDevice => 'Cet Appareil'; + @override + String get scan => 'Recherche automatique'; + @override + String get manualSending => 'Recherche manuelle'; + @override + String get sendMode => 'Mode d\'envoi'; + @override + late final _Translations$sendTab$sendModes$fr sendModes = _Translations$sendTab$sendModes$fr._(_root); + @override + String get sendModeHelp => 'Explication'; + @override + String get help => 'Veuillez vous assurer que l\'appareil cible se trouve sur le même réseau Wi-Fi.'; + @override + String get placeItems => 'Placez des éléments à partager.'; +} + +// Path: settingsTab +class _Translations$settingsTab$fr extends Translations$settingsTab$en { + _Translations$settingsTab$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Paramètres'; + @override + late final _Translations$settingsTab$general$fr general = _Translations$settingsTab$general$fr._(_root); + @override + late final _Translations$settingsTab$receive$fr receive = _Translations$settingsTab$receive$fr._(_root); + @override + late final _Translations$settingsTab$send$fr send = _Translations$settingsTab$send$fr._(_root); + @override + late final _Translations$settingsTab$network$fr network = _Translations$settingsTab$network$fr._(_root); + @override + late final _Translations$settingsTab$other$fr other = _Translations$settingsTab$other$fr._(_root); + @override + String get advancedSettings => 'Paramètres avancés'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$fr extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dépannage'; + @override + String get subTitle => 'Cette application ne fonctionne pas comme vous l\'espérez ? Vous trouverez ici des solutions aux problèmes communs.'; + @override + String get solution => 'Solution :'; + @override + String get fixButton => 'Corriger automatiquement'; + @override + late final _Translations$troubleshootPage$firewall$fr firewall = _Translations$troubleshootPage$firewall$fr._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$fr noDiscovery = _Translations$troubleshootPage$noDiscovery$fr._(_root); + @override + late final _Translations$troubleshootPage$noConnection$fr noConnection = _Translations$troubleshootPage$noConnection$fr._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$fr extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Historique'; + @override + String get openFolder => 'Ouvrir le dossier'; + @override + String get deleteHistory => 'Supprimer l\'historique'; + @override + String get empty => 'L\'historique est vide.'; + @override + late final _Translations$receiveHistoryPage$entryActions$fr entryActions = _Translations$receiveHistoryPage$entryActions$fr._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$fr extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Application (APK)'; + @override + String get excludeSystemApps => 'Exclure les applications système'; + @override + String get excludeAppsWithoutLaunchIntent => 'Exclure les applications non-lançables'; + @override + String apps({required Object n}) => '${n} Applications'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$fr extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Tout supprimer'; +} + +// Path: receivePage +class _Translations$receivePage$fr extends Translations$receivePage$en { + _Translations$receivePage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fr'))( + n, + one: 'veut vous envoyer un fichier', + other: 'veut vous envoyer ${n} fichiers', + ); + @override + String get subTitleMessage => 'vous a envoyé un message :'; + @override + String get subTitleLink => 'vous a envoyé un lien :'; + @override + String get canceled => 'L\'expéditeur a annulé la demande.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$fr extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Options'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(dossier LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Désactivé automatiquement car des dossiers sont présents.'; +} + +// Path: sendPage +class _Translations$sendPage$fr extends Translations$sendPage$en { + _Translations$sendPage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'En attente d\'une réponse …'; + @override + String get rejected => 'Le destinataire a rejeté la demande.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Le destinataire ne peut pas traiter la requête actuelle. Veuillez réessayer ultérieument.'; +} + +// Path: progressPage +class _Translations$progressPage$fr extends Translations$progressPage$en { + _Translations$progressPage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Envoi de fichiers'; + @override + String get titleReceiving => 'Réception des fichiers'; + @override + String get savedToGallery => 'Sauvegardé dans la Galerie'; + @override + late final _Translations$progressPage$total$fr total = _Translations$progressPage$total$fr._(_root); + @override + late final _Translations$progressPage$remainingTime$fr remainingTime = _Translations$progressPage$remainingTime$fr._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$fr extends Translations$webSharePage$en { + _Translations$webSharePage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Partager via un lien'; + @override + String get loading => 'Démarrage du serveur …'; + @override + String get stopping => 'Arrêt du serveur …'; + @override + String get error => 'Une erreur est survenue lors du démarrage du serveur.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fr'))( + n, + one: 'Ouvrir ce lien dans le navigateur :', + other: 'Ouvrir un des liens suivants dans le navigateur :', + ); + @override + String get requests => 'Requêtes'; + @override + String get noRequests => 'Aucune requête en attente.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Accepter automatiquement les requêtes'; + @override + String get requirePin => 'Code PIN requis'; + @override + String pinHint({required Object pin}) => 'Le code PIN est "${pin}"'; + @override + String get encryptionHint => 'LocalSend utilise un certificat auto-signé. Vous devez l\'accepter dans le navigateur.'; + @override + String pendingRequests({required Object n}) => 'Requêtes en attente : ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$fr extends Translations$aboutPage$en { + _Translations$aboutPage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'À propos de LocalSend'; + @override + List get description => [ + 'Localsend est un logiciel gratuit et open-source qui vous permet de partager de manière sécurisée des fichiers et des messages avec d\'autres appareils connectés à votre réseau local. Une connexion à internet n\'est pas requise.', + 'Localsend est disponible sur Android, iOS, macOS, Windows et Linux. Vous pouvez accéder à ces téléchargements depuis la page officielle.', + ]; + @override + String get author => 'Auteur'; + @override + String get contributors => 'Contributeurs'; + @override + String get packagers => 'Distributeurs'; + @override + String get translators => 'Traducteurs'; +} + +// Path: donationPage +class _Translations$donationPage$fr extends Translations$donationPage$en { + _Translations$donationPage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Faire une donation'; + @override + String get info => + 'LocalSend est gratuit, open-source et sans aucune pub. Si vous aimez ce logiciel, vous pouvez faire un don pour soutenir son développement.'; + @override + String donate({required Object amount}) => 'Donner ${amount}'; + @override + String get thanks => 'Merci beaucoup !'; + @override + String get restore => 'Restaurer les achats'; +} + +// Path: changelogPage +class _Translations$changelogPage$fr extends Translations$changelogPage$en { + _Translations$changelogPage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Historique des mises à jour'; +} + +// Path: dialogs +class _Translations$dialogs$fr extends Translations$dialogs$en { + _Translations$dialogs$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$fr addFile = _Translations$dialogs$addFile$fr._(_root); + @override + late final _Translations$dialogs$openFile$fr openFile = _Translations$dialogs$openFile$fr._(_root); + @override + late final _Translations$dialogs$addressInput$fr addressInput = _Translations$dialogs$addressInput$fr._(_root); + @override + late final _Translations$dialogs$cancelSession$fr cancelSession = _Translations$dialogs$cancelSession$fr._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$fr cannotOpenFile = _Translations$dialogs$cannotOpenFile$fr._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$fr encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$fr._(_root); + @override + late final _Translations$dialogs$errorDialog$fr errorDialog = _Translations$dialogs$errorDialog$fr._(_root); + @override + late final _Translations$dialogs$favoriteDialog$fr favoriteDialog = _Translations$dialogs$favoriteDialog$fr._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$fr favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$fr._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$fr favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$fr._(_root); + @override + late final _Translations$dialogs$fileInfo$fr fileInfo = _Translations$dialogs$fileInfo$fr._(_root); + @override + late final _Translations$dialogs$fileNameInput$fr fileNameInput = _Translations$dialogs$fileNameInput$fr._(_root); + @override + late final _Translations$dialogs$historyClearDialog$fr historyClearDialog = _Translations$dialogs$historyClearDialog$fr._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$fr localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$fr._(_root); + @override + late final _Translations$dialogs$messageInput$fr messageInput = _Translations$dialogs$messageInput$fr._(_root); + @override + late final _Translations$dialogs$noFiles$fr noFiles = _Translations$dialogs$noFiles$fr._(_root); + @override + late final _Translations$dialogs$noPermission$fr noPermission = _Translations$dialogs$noPermission$fr._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$fr notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$fr._(_root); + @override + late final _Translations$dialogs$qr$fr qr = _Translations$dialogs$qr$fr._(_root); + @override + late final _Translations$dialogs$quickActions$fr quickActions = _Translations$dialogs$quickActions$fr._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$fr quickSaveNotice = _Translations$dialogs$quickSaveNotice$fr._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$fr quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$fr._(_root); + @override + late final _Translations$dialogs$pin$fr pin = _Translations$dialogs$pin$fr._(_root); + @override + late final _Translations$dialogs$sendModeHelp$fr sendModeHelp = _Translations$dialogs$sendModeHelp$fr._(_root); + @override + late final _Translations$dialogs$zoom$fr zoom = _Translations$dialogs$zoom$fr._(_root); +} + +// Path: sanitization +class _Translations$sanitization$fr extends Translations$sanitization$en { + _Translations$sanitization$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Le nom du fichier ne peut pas être vide'; + @override + String get invalid => 'Le nom du fichier contient des caractères non valides'; +} + +// Path: tray +class _Translations$tray$fr extends Translations$tray$en { + _Translations$tray$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Quitter LocalSend'; + @override + String get closeWindows => 'Fermer'; +} + +// Path: web +class _Translations$web$fr extends Translations$web$en { + _Translations$web$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Entrez le code PIN'; + @override + String get invalidPin => 'Code PIN invalide'; + @override + String get tooManyAttempts => 'Trop d\'essais infructueux'; + @override + String get rejected => 'Rejeté'; + @override + String get files => 'Fichiers'; + @override + String get fileName => 'Nom du fichier'; + @override + String get size => 'Taille'; +} + +// Path: assetPicker +class _Translations$assetPicker$fr extends Translations$assetPicker$en { + _Translations$assetPicker$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'OK'; + @override + String get cancel => 'Annuler'; + @override + String get edit => 'Modifier'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Echec du chargement'; + @override + String get original => 'Original'; + @override + String get preview => 'Aperçu'; + @override + String get select => 'Choisir'; + @override + String get emptyList => 'Liste vide'; + @override + String get unSupportedAssetType => 'Type de fichier non supporté.'; + @override + String get unableToAccessAll => 'Impossible d\'accéder aux médias de votre appareil'; + @override + String get viewingLimitedAssetsTip => 'Affichage limité des médias et des albums.'; + @override + String get changeAccessibleLimitedAssets => 'Modifier l\'accès limité aux médias'; + @override + String get accessAllTip => + 'L\'application ne peut accéder qu\'à certains medias. Allez dans les paramètres système et autorisez l\'application à accéder à tous les medias sur l\'appareil.'; + @override + String get goToSystemSettings => 'Allez dans les paramètres système'; + @override + String get accessLimitedAssets => 'Continuer avec un accès limité'; + @override + String get accessiblePathName => 'Medias accessible'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Image'; + @override + String get sTypeVideoLabel => 'Vidéo'; + @override + String get sTypeOtherLabel => 'Autre'; + @override + String get sActionPlayHint => 'lire'; + @override + String get sActionPreviewHint => 'aperçu'; + @override + String get sActionSelectHint => 'choisir'; + @override + String get sActionSwitchPathLabel => 'changer le dossier'; + @override + String get sActionUseCameraHint => 'Utiliser la Caméra'; + @override + String get sNameDurationLabel => 'durée'; + @override + String get sUnitAssetCountLabel => 'quantité'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$fr extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Interfaces réseau'; + @override + String get info => + 'Par défaut, LocalSend utilise toutes les interfaces réseau disponibles. Vous pouvez exclure les réseaux indésirables ici. Vous aurez besoin de redémarrer le serveur pour appliquer les changements.'; + @override + String get preview => 'Aperçu'; + @override + String get whitelist => 'Liste blanche'; + @override + String get blacklist => 'Liste noire'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$fr extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP :'; + @override + String get port => 'Port :'; + @override + String get alias => 'Nom du périphérique :'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$fr extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Favoris'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$fr extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sélection'; + @override + String files({required Object files}) => 'Fichiers : ${files}'; + @override + String size({required Object size}) => 'Taille : ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$fr extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get file => 'Fichier'; + @override + String get folder => 'Dossier'; + @override + String get media => 'Média'; + @override + String get text => 'Texte'; + @override + String get app => 'Application'; + @override + String get clipboard => 'Presse-papiers'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$fr extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get single => 'Destinataire unique'; + @override + String get multiple => 'Destinataires multiples'; + @override + String get link => 'Partager via un lien'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$fr extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Général'; + @override + String get brightness => 'Thème'; + @override + late final _Translations$settingsTab$general$brightnessOptions$fr brightnessOptions = _Translations$settingsTab$general$brightnessOptions$fr._( + _root, + ); + @override + String get color => 'Couleur'; + @override + late final _Translations$settingsTab$general$colorOptions$fr colorOptions = _Translations$settingsTab$general$colorOptions$fr._(_root); + @override + String get language => 'Langue'; + @override + late final _Translations$settingsTab$general$languageOptions$fr languageOptions = _Translations$settingsTab$general$languageOptions$fr._(_root); + @override + String get saveWindowPlacement => 'Sauvegarder l\'emplacement de la fenêtre à la fermeture'; + @override + String get saveWindowPlacementWindows => 'Sauvegarder la position de la fenêtre en quittant'; + @override + String get minimizeToTray => 'Réduire dans la barre des tâches à la fermeture'; + @override + String get launchAtStartup => 'Lancer LocalSend à la connexion de l\'utilisateur'; + @override + String get launchMinimized => 'Minimiser LocalSend lors du lancement'; + @override + String get showInContextMenu => 'Afficher LocalSend dans le menu contextuel'; + @override + String get animations => 'Animations'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$fr extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Réception'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Fermer la page du transfert lorqu\'il est terminé'; + @override + String get destination => 'Destination'; + @override + String get downloads => '(Téléchargements)'; + @override + String get saveToGallery => 'Sauvegarder les médias dans la galerie'; + @override + String get saveToHistory => 'Activer l\'historique'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$fr extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Envoyer'; + @override + String get shareViaLinkAutoAccept => 'Accepter automatiquement les demandes de téléchargement d\'un partage par lien'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$fr extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Réseau'; + @override + String get needRestart => 'Redémarrez le serveur pour appliquer les paramètres !'; + @override + String get server => 'Serveur'; + @override + String get alias => 'Alias'; + @override + String get deviceType => 'Type d\'appareil'; + @override + String get deviceModel => 'Modèle d\'appareil'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Délai d\'expiration de la recherche'; + @override + String get useSystemName => 'Utiliser le nom du système'; + @override + String get generateRandomAlias => 'Générer un alias aléatoire'; + @override + String portWarning({required Object defaultPort}) => + 'Il se peut que vous ne soyez pas détecté par d\'autres appareils car vous utilisez un port personnalisé. (par défaut : ${defaultPort})'; + @override + String get encryption => 'Chiffrement'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Il est possible que vous ne soyez pas détecté par d\'autres appareils car vous utilisez une adresse multicast différente de celle par défaut. (par défaut : ${defaultMulticast})'; + @override + String get network => 'Réseau'; + @override + late final _Translations$settingsTab$network$networkOptions$fr networkOptions = _Translations$settingsTab$network$networkOptions$fr._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$fr extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Autre'; + @override + String get support => 'Soutenir LocalSend'; + @override + String get donate => 'Faire une donation'; + @override + String get privacyPolicy => 'Politique de confidentialité'; + @override + String get termsOfUse => 'Conditions d\'utilisation'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$fr extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Cet appareil peut envoyer des fichiers mais pas en recevoir.'; + @override + String solution({required Object port}) => + 'Il se peut que votre pare-feu bloque la réception de fichiers. Pour corriger ce problème, il est nécessaire d\'autoriser les connections entrantes (UDP et TCP) sur le port ${port}.'; + @override + String get openFirewall => 'Ouvrir le pare-feu'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$fr extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Cet appareil ne peut pas trouver d\'autres appareils.'; + @override + String get solution => + 'Assurez-vous que tous les appareils soient sur le même réseau Wi-Fi et qu\'ils partagent la même configuration (port, adresse multicast, chiffrement). Vous pouvez également rechercher manuellement d\'autres appareils en utilisant leur addresse IP. Pensez à ajouter l\'appareil à vos favoris pour faciliter les prochains transferts de fichiers.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$fr extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Les deux appareils ne peuvent ni se trouver, ni partager des fichiers.'; + @override + String get solution => + 'Le problème existe-il des deux côtés ? Si oui, vérifiez que les deux appareils soient connectés au même réseau Wi-Fi et qu\'ils partagent la même configuration (port, adresse multicast, chiffrement). Il se peut que les appareils soient isolés les uns des autres, empêchant toutes communications entre eux. Cet isolement peut être désactivé dans votre routeur/box internet via l\'option "Isolement du point d\'accès" ou "AP Isolation".'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$fr extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get open => 'Ouvrir le fichier'; + @override + String get showInFolder => 'Ouvrir le dossier'; + @override + String get info => 'Information'; + @override + String get deleteFromHistory => 'Supprimer de l\'historique'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$fr extends Translations$progressPage$total$en { + _Translations$progressPage$total$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$fr title = _Translations$progressPage$total$title$fr._(_root); + @override + String count({required Object curr, required Object n}) => 'Fichiers : ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Taille : ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Vitesse : ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$fr extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n} :${ss}'; + + /// Utilisez « h » pour l'abréviation des heures et « m » pour les minutes + @override + String hours({required Object h, required Object m}) => '${h}h ${m}min'; + + /// Utilisez « j » pour les jours, « h » pour les heures et « m » pour les minutes + @override + String days({required Object d, required Object h, required Object m}) => '${d}j ${h}h ${m}min'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$fr extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ajouter à la sélection'; + @override + String get content => 'Que voulez-vous ajouter ?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$fr extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ouvrir le fichier'; + @override + String get content => 'Voulez-vous ouvrir le fichier reçu ?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$fr extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Entrez l\'adresse IP'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'Adresse IP'; + @override + String get recentlyUsed => 'Récemment utilisé : '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$fr extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Annuler le transfert de fichiers'; + @override + String get content => 'Voulez-vous vraiment annuler le transfert de fichiers ?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$fr extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ne peut pas ouvrir le fichier'; + @override + String content({required Object file}) => 'Ne peut pas ouvrir "${file}". Ce fichier a-t-il été déplacé, renommé ou supprimé ?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$fr extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Chiffrement désactivé'; + @override + String get content => 'La communication s\'effectue désormais via le protocole non chiffré HTTP. Pour utiliser HTTPS, réactivez le chiffrement.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$fr extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$fr extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favoris'; + @override + String get noFavorites => 'Aucun appareil favori pour le moment.'; + @override + String get addFavorite => 'Ajouter'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$fr extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Supprimer des favoris'; + @override + String content({required Object name}) => 'Voulez-vous vraiment supprimer "${name}" des favoris ?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$fr extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Ajouter aux favoris'; + @override + String get titleEdit => 'Modifier le favori'; + @override + String get name => 'Alias'; + @override + String get auto => '(automatique)'; + @override + String get ip => 'Adresse IP'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$fr extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informations sur le fichier'; + @override + String get fileName => 'Nom du fichier :'; + @override + String get path => 'Chemin :'; + @override + String get size => 'Taille :'; + @override + String get sender => 'Expéditeur :'; + @override + String get time => 'Date :'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$fr extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Entrez le nom du fichier'; + @override + String original({required Object original}) => 'Original : ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$fr extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Effacer l\'historique'; + @override + String get content => 'Voulez-vous vraiment effacer l\'historique ?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$fr extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend ne peut pas trouver d\'autres appareils sans la permission de scanner votre réseau local. Veuillez donner cette permission à LocalSend dans les paramètres système.'; + @override + String get gotoSettings => 'Paramètres'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$fr extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tapez un message'; + @override + String get multiline => 'Multiligne'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$fr extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aucun fichier sélectionné'; + @override + String get content => 'Veuillez sélectionner au moins un fichier.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$fr extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'LocalSend n\'a pas la permission'; + @override + String get content => 'Vous n\'avez pas accordé les autorisations nécessaires. Veuillez les accorder dans les paramètres systèmes.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$fr extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Non disponible'; + @override + String get content => 'Cette fonctionnalité est disponible uniquement sur :'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$fr extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR Code'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$fr extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Actions Rapides'; + @override + String get counter => 'Compteur'; + @override + String get prefix => 'Préfixe'; + @override + String get padZero => 'Remplir de zéros'; + @override + String get sortBeforeCount => 'Trier préalablement par ordre alphabétique'; + @override + String get random => 'Aléatoire'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$fr extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Les demandes d\'envoi de fichiers sont désormais automatiquement acceptées. Veuillez noter que tous les appareils connectés au réseau local pourront vous envoyer des fichiers.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$fr extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Les demandes de fichiers provenant de vos appareils favoris sont désormais automatiquement acceptées.', + 'Attention : Cette option n\'est pas sûre car un hackeur qui connaîtrait l\'empreinte numérique de vos appareils favoris pourrait quand même vous envoyer des fichiers.', + 'Cette option reste néanmoins plus sûre que d\'autoriser tous les appareils.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$fr extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Entrez le code PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$fr extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Modes d\'envoi'; + @override + String get single => 'Envoyer des fichiers à un destinataire. La sélection sera effacée une fois l\'envoi du fichier terminé.'; + @override + String get multiple => 'Envoyer des fichiers à plusieurs destinataires. La sélection ne sera pas effacée.'; + @override + String get link => + 'Les destinataires n\'ayant pas LocalSend installé peuvent télécharger les fichiers sélectionnés en ouvrant le lien dans leur navigateur.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$fr extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$fr extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get system => 'Système'; + @override + String get dark => 'Sombre'; + @override + String get light => 'Clair'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$fr extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get system => 'Système'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$fr extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get system => 'Système'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$fr extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String get filtered => 'Filtré'; + @override + String get all => 'Tout'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$fr extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$fr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Progression totale (${time})'; + @override + String get finishedError => 'Terminé avec une erreur'; + @override + String get canceledSender => 'Annulé par l\'expéditeur'; + @override + String get canceledReceiver => 'Annulé par le destinataire'; +} diff --git a/app/lib/gen/strings_gl.g.dart b/app/lib/gen/strings_gl.g.dart new file mode 100644 index 0000000..ee6efc8 --- /dev/null +++ b/app/lib/gen/strings_gl.g.dart @@ -0,0 +1,1438 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsGl extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsGl({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.gl, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsGl _root = this; // ignore: unused_field + + @override + TranslationsGl $copyWith({TranslationMetadata? meta}) => TranslationsGl(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Galego'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$gl general = _Translations$general$gl._(_root); + @override + late final _Translations$receiveTab$gl receiveTab = _Translations$receiveTab$gl._(_root); + @override + late final _Translations$sendTab$gl sendTab = _Translations$sendTab$gl._(_root); + @override + late final _Translations$settingsTab$gl settingsTab = _Translations$settingsTab$gl._(_root); + @override + late final _Translations$troubleshootPage$gl troubleshootPage = _Translations$troubleshootPage$gl._(_root); + @override + late final _Translations$apkPickerPage$gl apkPickerPage = _Translations$apkPickerPage$gl._(_root); + @override + late final _Translations$networkInterfacesPage$gl networkInterfacesPage = _Translations$networkInterfacesPage$gl._(_root); + @override + late final _Translations$receiveHistoryPage$gl receiveHistoryPage = _Translations$receiveHistoryPage$gl._(_root); + @override + late final _Translations$selectedFilesPage$gl selectedFilesPage = _Translations$selectedFilesPage$gl._(_root); + @override + late final _Translations$receivePage$gl receivePage = _Translations$receivePage$gl._(_root); + @override + late final _Translations$receiveOptionsPage$gl receiveOptionsPage = _Translations$receiveOptionsPage$gl._(_root); + @override + late final _Translations$dialogs$gl dialogs = _Translations$dialogs$gl._(_root); + @override + late final _Translations$webSharePage$gl webSharePage = _Translations$webSharePage$gl._(_root); + @override + late final _Translations$progressPage$gl progressPage = _Translations$progressPage$gl._(_root); + @override + late final _Translations$aboutPage$gl aboutPage = _Translations$aboutPage$gl._(_root); + @override + late final _Translations$sendPage$gl sendPage = _Translations$sendPage$gl._(_root); + @override + late final _Translations$donationPage$gl donationPage = _Translations$donationPage$gl._(_root); + @override + late final _Translations$changelogPage$gl changelogPage = _Translations$changelogPage$gl._(_root); + @override + late final _Translations$tray$gl tray = _Translations$tray$gl._(_root); + @override + late final _Translations$sanitization$gl sanitization = _Translations$sanitization$gl._(_root); + @override + late final _Translations$web$gl web = _Translations$web$gl._(_root); + @override + late final _Translations$assetPicker$gl assetPicker = _Translations$assetPicker$gl._(_root); +} + +// Path: general +class _Translations$general$gl extends Translations$general$en { + _Translations$general$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Aceptar'; + @override + String get accepted => 'Aceptado'; + @override + String get add => 'Engadir'; + @override + String get advanced => 'Avanzado'; + @override + String get cancel => 'Cancelar'; + @override + String get close => 'Pechar'; + @override + String get confirm => 'Confirmar'; + @override + String get continueStr => 'Continuar'; + @override + String get copy => 'Copiar'; + @override + String get copiedToClipboard => 'Copiouse no Portapapeis'; + @override + String get decline => 'Declinar'; + @override + String get done => 'Feito'; + @override + String get delete => 'Eliminar'; + @override + String get edit => 'Editar'; + @override + String get error => 'Erro'; + @override + String get example => 'Exemplo'; + @override + String get files => 'Arquivos'; + @override + String get finished => 'Rematou'; + @override + String get hide => 'Ocultar'; + @override + String get off => 'Apagado'; + @override + String get offline => 'Sen Conexión'; + @override + String get on => 'Activado'; + @override + String get online => 'En Liña'; + @override + String get open => 'Aberto'; + @override + String get queue => 'Fila'; + @override + String get quickSave => 'Gardar Rápido'; + @override + String get quickSaveFromFavorites => 'Gardar rápido para "Favoritos"'; + @override + String get renamed => 'Renomeado'; + @override + String get reset => 'Desfacer os cambios'; + @override + String get restart => 'Reiniciar'; + @override + String get settings => 'Configuración'; + @override + String get skipped => 'Omitido'; + @override + String get start => 'Comeza'; + @override + String get stop => 'Parar'; + @override + String get save => 'Gardar'; + @override + String get unchanged => 'Sen Cambios'; + @override + String get unknown => 'Descoñecido'; + @override + String get noItemInClipboard => 'Non hai elementos no Portapapeis.'; +} + +// Path: receiveTab +class _Translations$receiveTab$gl extends Translations$receiveTab$en { + _Translations$receiveTab$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Recibir'; + @override + late final _Translations$receiveTab$infoBox$gl infoBox = _Translations$receiveTab$infoBox$gl._(_root); + @override + late final _Translations$receiveTab$quickSave$gl quickSave = _Translations$receiveTab$quickSave$gl._(_root); +} + +// Path: sendTab +class _Translations$sendTab$gl extends Translations$sendTab$en { + _Translations$sendTab$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Enviar'; + @override + late final _Translations$sendTab$selection$gl selection = _Translations$sendTab$selection$gl._(_root); + @override + late final _Translations$sendTab$picker$gl picker = _Translations$sendTab$picker$gl._(_root); + @override + String get shareIntentInfo => 'Tamén podes usar a función "Compartir" do teu dispositivo móbil para seleccionar ficheiros máis facilmente.'; + @override + String get nearbyDevices => 'Dispositivos Próximos'; + @override + String get thisDevice => 'Este Dispositivo'; + @override + String get scan => 'Busca Dispositivos'; + @override + String get manualSending => 'Envío Manual'; + @override + String get sendMode => 'Modo de Envío'; + @override + late final _Translations$sendTab$sendModes$gl sendModes = _Translations$sendTab$sendModes$gl._(_root); + @override + String get sendModeHelp => 'Explicación'; + @override + String get help => 'Asegúrate de que o obxectivo desexado tamén estea na mesma rede wifi.'; + @override + String get placeItems => 'Coloca elementos para compartir.'; +} + +// Path: settingsTab +class _Translations$settingsTab$gl extends Translations$settingsTab$en { + _Translations$settingsTab$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Configuración'; + @override + late final _Translations$settingsTab$general$gl general = _Translations$settingsTab$general$gl._(_root); + @override + late final _Translations$settingsTab$receive$gl receive = _Translations$settingsTab$receive$gl._(_root); + @override + late final _Translations$settingsTab$network$gl network = _Translations$settingsTab$network$gl._(_root); + @override + late final _Translations$settingsTab$send$gl send = _Translations$settingsTab$send$gl._(_root); + @override + late final _Translations$settingsTab$other$gl other = _Translations$settingsTab$other$gl._(_root); + @override + String get advancedSettings => 'Configuración avanzada'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$gl extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$troubleshootPage$noDiscovery$gl noDiscovery = _Translations$troubleshootPage$noDiscovery$gl._(_root); + @override + late final _Translations$troubleshootPage$firewall$gl firewall = _Translations$troubleshootPage$firewall$gl._(_root); + @override + late final _Translations$troubleshootPage$noConnection$gl noConnection = _Translations$troubleshootPage$noConnection$gl._(_root); + @override + String get title => 'Solucionar problemas'; + @override + String get subTitle => 'A aplicación non funciona segundo o esperado? Aquó podes atopar algunhas solucións comúns aos problemas.'; + @override + String get solution => 'Solución:'; + @override + String get fixButton => 'Corrixir automáticamente'; +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$gl extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplicacións (APK)'; + @override + String get excludeSystemApps => 'Excluír aplicacións do sistema'; + @override + String get excludeAppsWithoutLaunchIntent => 'Excluír aplicacións non executábels'; + @override + String apps({required Object n}) => '${n} Aplicacións'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$gl extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get preview => 'Vista previa'; + @override + String get title => 'Interfaces de rede'; + @override + String get whitelist => 'Lista de permitidos'; + @override + String get blacklist => 'Lista negra'; + @override + String get info => + 'Por defecto, LocalSend emprega todas as interfaces de rede dispoñíbeis. Eiquí podes desactivar as redes non desexadas. Tes que reiniciar o servidor para aplicar os cambios.'; +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$gl extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Historial'; + @override + String get empty => 'O historial está vacío.'; + @override + String get openFolder => 'Abrir cartafol'; + @override + String get deleteHistory => 'Borrar historial'; + @override + late final _Translations$receiveHistoryPage$entryActions$gl entryActions = _Translations$receiveHistoryPage$entryActions$gl._(_root); +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$gl extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Eliminar todo'; +} + +// Path: receivePage +class _Translations$receivePage$gl extends Translations$receivePage$en { + _Translations$receivePage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('gl'))( + n, + one: 'quere enviarte un ficheiro', + other: 'quere enviarte ${n} ficheiros', + ); + @override + String get subTitleMessage => 'envioute unha mensaxe:'; + @override + String get subTitleLink => 'envioute unha ligazón:'; + @override + String get canceled => 'O remitente cancelou a petición.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$gl extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Opcións'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(Cartafol Localsend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Desactivado automáticamente porque hai cartafois.'; +} + +// Path: dialogs +class _Translations$dialogs$gl extends Translations$dialogs$en { + _Translations$dialogs$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$encryptionDisabledNotice$gl encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$gl._(_root); + @override + late final _Translations$dialogs$openFile$gl openFile = _Translations$dialogs$openFile$gl._(_root); + @override + late final _Translations$dialogs$addressInput$gl addressInput = _Translations$dialogs$addressInput$gl._(_root); + @override + late final _Translations$dialogs$addFile$gl addFile = _Translations$dialogs$addFile$gl._(_root); + @override + late final _Translations$dialogs$cancelSession$gl cancelSession = _Translations$dialogs$cancelSession$gl._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$gl cannotOpenFile = _Translations$dialogs$cannotOpenFile$gl._(_root); + @override + late final _Translations$dialogs$favoriteDialog$gl favoriteDialog = _Translations$dialogs$favoriteDialog$gl._(_root); + @override + late final _Translations$dialogs$errorDialog$gl errorDialog = _Translations$dialogs$errorDialog$gl._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$gl favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$gl._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$gl favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$gl._(_root); + @override + late final _Translations$dialogs$fileInfo$gl fileInfo = _Translations$dialogs$fileInfo$gl._(_root); + @override + late final _Translations$dialogs$fileNameInput$gl fileNameInput = _Translations$dialogs$fileNameInput$gl._(_root); + @override + late final _Translations$dialogs$historyClearDialog$gl historyClearDialog = _Translations$dialogs$historyClearDialog$gl._(_root); + @override + late final _Translations$dialogs$noPermission$gl noPermission = _Translations$dialogs$noPermission$gl._(_root); + @override + late final _Translations$dialogs$noFiles$gl noFiles = _Translations$dialogs$noFiles$gl._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$gl localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$gl._(_root); + @override + late final _Translations$dialogs$messageInput$gl messageInput = _Translations$dialogs$messageInput$gl._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$gl notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$gl._(_root); + @override + late final _Translations$dialogs$qr$gl qr = _Translations$dialogs$qr$gl._(_root); + @override + late final _Translations$dialogs$quickActions$gl quickActions = _Translations$dialogs$quickActions$gl._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$gl quickSaveNotice = _Translations$dialogs$quickSaveNotice$gl._(_root); + @override + late final _Translations$dialogs$zoom$gl zoom = _Translations$dialogs$zoom$gl._(_root); + @override + late final _Translations$dialogs$pin$gl pin = _Translations$dialogs$pin$gl._(_root); + @override + late final _Translations$dialogs$sendModeHelp$gl sendModeHelp = _Translations$dialogs$sendModeHelp$gl._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$gl quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$gl._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$gl extends Translations$webSharePage$en { + _Translations$webSharePage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get encryptionHint => 'LocalSend precisa un certificado autoasinado. Tes que aceptalo no teu navegador.'; + @override + String get title => 'Compartir mediante ligazón'; + @override + String get stopping => 'Parando o servidor…'; + @override + String get loading => 'Iniciando servidor…'; + @override + String get error => 'Produciuse un erro ao iniciar o servidor.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('gl'))( + n, + one: 'Abre esta ligazón no teu navegador:', + other: 'Abre unha destas ligazóns no teu navegador:', + ); + @override + String get requests => 'Solicitudes'; + @override + String get noRequests => 'Aínda non hai solicitudes.'; + @override + String get autoAccept => 'Aceptar solicitudes automaticamente'; + @override + String get requirePin => 'Requerir PIN'; + @override + String pinHint({required Object pin}) => 'O PIN é "${pin}"'; + @override + String pendingRequests({required Object n}) => 'Solicitudes pendentes: ${n}'; +} + +// Path: progressPage +class _Translations$progressPage$gl extends Translations$progressPage$en { + _Translations$progressPage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$gl total = _Translations$progressPage$total$gl._(_root); + @override + String get titleReceiving => 'Recibindo ficheiros'; + @override + String get savedToGallery => 'Gardado en Fotos'; + @override + String get titleSending => 'Enviando ficheiros'; + @override + late final _Translations$progressPage$remainingTime$gl remainingTime = _Translations$progressPage$remainingTime$gl._(_root); +} + +// Path: aboutPage +class _Translations$aboutPage$gl extends Translations$aboutPage$en { + _Translations$aboutPage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + List get description => [ + 'LocalSend é unha aplicación gratuita, de código aberto, que che permite compartir ficheiros e mensaxes de xeito seguro con dispositivos cercanos a través da túa rede local sen necesidade dunha conexión a internet.', + 'Esta aplicación está dispoñíbel en Android, iOS, macOS, Windows e Linux. Podes atopar todas as opcións de descarga na páxina web oficial.', + ]; + @override + String get contributors => 'Colaboradores'; + @override + String get author => 'Autor'; + @override + String get translators => 'Tradutores'; + @override + String get packagers => 'Empaquetadores'; + @override + String get title => 'Acerca de LocalSend'; +} + +// Path: sendPage +class _Translations$sendPage$gl extends Translations$sendPage$en { + _Translations$sendPage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Agardando pola resposta…'; + @override + String get rejected => 'O destinatario rexeitou a solicitude.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'O destinatario está ocupado con outra petición.'; +} + +// Path: donationPage +class _Translations$donationPage$gl extends Translations$donationPage$en { + _Translations$donationPage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Doar'; + @override + String get info => + 'LocalSen é gratuita, de código aberto e non ten anuncios. Se che gusta a aplicación, podes apoiar o desenvolvemento cunha doazón.'; + @override + String donate({required Object amount}) => 'Doar ${amount}'; + @override + String get thanks => 'Moitas grazas!'; + @override + String get restore => 'Restaurar a compra'; +} + +// Path: changelogPage +class _Translations$changelogPage$gl extends Translations$changelogPage$en { + _Translations$changelogPage$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rexistro de cambios'; +} + +// Path: tray +class _Translations$tray$gl extends Translations$tray$en { + _Translations$tray$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Saír de LocalSend'; + @override + String get closeWindows => 'Saír'; +} + +// Path: sanitization +class _Translations$sanitization$gl extends Translations$sanitization$en { + _Translations$sanitization$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get empty => 'O nome do ficheiro non pode estar valeiro'; + @override + String get invalid => 'O nome do ficheiro contén caracteres inválidos'; +} + +// Path: web +class _Translations$web$gl extends Translations$web$en { + _Translations$web$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Insira o PIN'; + @override + String get invalidPin => 'PIN non válido'; + @override + String get tooManyAttempts => 'Demasiados intentos'; + @override + String get rejected => 'Rexeitado'; + @override + String get files => 'Ficheiros'; + @override + String get fileName => 'Nome do ficheiro'; + @override + String get size => 'Tamaño'; +} + +// Path: assetPicker +class _Translations$assetPicker$gl extends Translations$assetPicker$en { + _Translations$assetPicker$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Confirmar'; + @override + String get cancel => 'Cancelar'; + @override + String get edit => 'Editar'; + @override + String get loadFailed => 'Carga fallida'; + @override + String get gifIndicator => 'GIF'; + @override + String get original => 'Orixe'; + @override + String get preview => 'Previsualizar'; + @override + String get select => 'Seleccionar'; + @override + String get emptyList => 'Lista baleira'; + @override + String get unSupportedAssetType => 'Tipo de ficheiro non soportado.'; + @override + String get unableToAccessAll => 'Non se puido acceder a todos os ficheiros do dispositivo'; + @override + String get sTypeOtherLabel => 'Outros contidos multimedia'; + @override + String get sActionPlayHint => 'reproducir'; + @override + String get sActionPreviewHint => 'vista previa'; + @override + String get sTypeImageLabel => 'Imaxe'; + @override + String get sActionSelectHint => 'seleccionar'; + @override + String get sTypeVideoLabel => 'Vídeo'; + @override + String get sActionSwitchPathLabel => 'cambiar ruta'; + @override + String get changeAccessibleLimitedAssets => 'Preme para actualizar os ficheiros accesíbeis'; + @override + String get goToSystemSettings => 'Vaia á configuración do sistema'; + @override + String get accessLimitedAssets => 'Continuar con acceso limitado'; + @override + String get sActionUseCameraHint => 'usar cámara'; + @override + String get sUnitAssetCountLabel => 'cantidade'; + @override + String get viewingLimitedAssetsTip => 'Ver só ficheiros e álbums accesíbeis para a aplicación.'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sNameDurationLabel => 'duración'; + @override + String get accessAllTip => + 'A aplicación só pode acceder a algúns ficheiros do dispositivo. Vaia á configuración do sistema e permite que a aplicación acceda a todos os elementos do dispositivo.'; + @override + String get accessiblePathName => 'Ficheiros accesíbeis'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$gl extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Porto:'; + @override + String get alias => 'Nome do Dispositivo:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$gl extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Favoritos'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$gl extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Selección'; + @override + String files({required Object files}) => 'Ficheiros: ${files}'; + @override + String size({required Object size}) => 'Tamaño: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$gl extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get file => 'Arquivo'; + @override + String get folder => 'Cartafol'; + @override + String get media => 'Medios'; + @override + String get text => 'Texto'; + @override + String get app => 'App'; + @override + String get clipboard => 'Pegar'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$gl extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get single => 'Destinatario Único'; + @override + String get multiple => 'Múltiples Destinatarios'; + @override + String get link => 'Comparte via ligazón'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$gl extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Xeral'; + @override + String get brightness => 'Tema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$gl brightnessOptions = _Translations$settingsTab$general$brightnessOptions$gl._( + _root, + ); + @override + String get color => 'Cor'; + @override + late final _Translations$settingsTab$general$colorOptions$gl colorOptions = _Translations$settingsTab$general$colorOptions$gl._(_root); + @override + String get language => 'Linguaxe'; + @override + late final _Translations$settingsTab$general$languageOptions$gl languageOptions = _Translations$settingsTab$general$languageOptions$gl._(_root); + @override + String get saveWindowPlacement => 'Garda a posición da xanela despois de saír'; + @override + String get saveWindowPlacementWindows => 'Garda a posición da xanela despois da saída'; + @override + String get minimizeToTray => 'Minimizar á Bandexa do Sistema/Barra de Menú ao Pechar'; + @override + String get launchAtStartup => 'Arrancar automáticamente despois do inicio de sesión'; + @override + String get launchMinimized => 'Arranque automático: Iniciar minimizada'; + @override + String get showInContextMenu => 'Amosar LocalSend no menú contextual'; + @override + String get animations => 'Animacións'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$gl extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Recibir'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Finalizar automáticamente'; + @override + String get destination => 'Gardar no cartafol'; + @override + String get downloads => '(Descargas)'; + @override + String get saveToGallery => 'Gardar multimedia na galería'; + @override + String get saveToHistory => 'Gardar no historial'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$gl extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get deviceType => 'Tipo de dispositivo'; + @override + String get title => 'Rede'; + @override + String get needRestart => 'Reinicia o servidor para aplicar os axustes!'; + @override + String get server => 'Servidor'; + @override + String get alias => 'Nome do dispositivo'; + @override + String get deviceModel => 'Modelo de dispositivo'; + @override + String get port => 'Porto'; + @override + String get discoveryTimeout => 'Tempo límite de Descubrimento'; + @override + String get multicastGroup => 'Enderezo multicast'; + @override + String get network => 'Rede'; + @override + late final _Translations$settingsTab$network$networkOptions$gl networkOptions = _Translations$settingsTab$network$networkOptions$gl._(_root); + @override + String get encryption => 'Cifrado'; + @override + String get useSystemName => 'Usar o nome do sistema'; + @override + String get generateRandomAlias => 'Xerar alias aleatorio'; + @override + String portWarning({required Object defaultPort}) => + 'Pode que non sexas detectado por outros dispositivos porque estás a empregar un porto personalizado. (Porto por defecto: ${defaultPort})'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Pode que non sexas detectado por outros dispositivos porque estás a empregar un enderezo multicast personalizada. (Por defecto: ${defaultMulticast})'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$gl extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Enviar'; + @override + String get shareViaLinkAutoAccept => 'Aceptar automáticamente peticións no modo "Compartir mediante ligazón"'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$gl extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Outros'; + @override + String get support => 'Apoia a LocalSend'; + @override + String get donate => 'Doar'; + @override + String get privacyPolicy => 'Política de privacidade'; + @override + String get termsOfUse => 'Condicións de uso'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$gl extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get solution => + 'Por favor asegúrese de que todos os dispositivos están na mesma rede Wi-Fi e que co partan a mesma configuración (porto, enderezo multicast, cifrado). Podes tentar escribir o enderezo IP do dispositivo de destino manualmente. Se funciona, considera agregar o dispositivo a favoritos para poder descubrilo automaticamente no futuro.'; + @override + String get symptom => 'Este dispositivo non pode descubrir outros dispositivos.'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$gl extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String solution({required Object port}) => + 'O máis probábel é que se trate dun problema do firewall. Podes resolver este problema permitindo conexións entrantes (UDP e TCP) no porto ${port}.'; + @override + String get openFirewall => 'Abrir Firewall'; + @override + String get symptom => 'Este dispositivo pode enviar ficheiros a outros dispositivos, pero outros dispositivos non lle poden enviar ficheiros.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$gl extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ambos dispositivos non poden descubrirse nin enviarse ficheiros.'; + @override + String get solution => + 'O problema existe nos dous lados? Se é así, cómpre asegurarse de que ambos os dispositivos están na mesma rede Wi-Fi e comparten a mesma configuración (porto, enderezo de multidifusión, cifrado). É posíbel que a rede wifi non permita a comunicación entre os participantes debido ao illamento do punto de acceso (AP). Neste caso, esta opción debe estar desactivada no router.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$gl extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get info => 'Información'; + @override + String get open => 'Abrir ficheiro'; + @override + String get showInFolder => 'Amosar no cartafol'; + @override + String get deleteFromHistory => 'Borrar do historial'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$gl extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Cifrado deshabilitado'; + @override + String get content => + 'A comunicación ten lugar agora mediante o protocolo sen cifrado HTTP. Para usar o protocolo HTTPS, habilite novamente o cifrado.'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$gl extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Abrir ficheiro'; + @override + String get content => 'Queres abrir o ficheiro recibido?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$gl extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Introduce enderezo'; + @override + String get ip => 'Enderezo IP'; + @override + String get recentlyUsed => 'Empregados recentemente: '; + @override + String get hashtag => 'Etiqueta'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$gl extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get content => 'Que queres engadir?'; + @override + String get title => 'Engadir á selección'; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$gl extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Cancelar a transferencia de ficheiros'; + @override + String get content => 'Realmente queres cancelar a transferencia de ficheiros?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$gl extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String content({required Object file}) => 'Non se puido abrir "${file}". Moveuse, renomeouse ou eliminouse este ficheiro?'; + @override + String get title => 'Non se pode abrir o ficheiro'; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$gl extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favoritos'; + @override + String get noFavorites => 'Aínda non hai ningún dispositivo favorito.'; + @override + String get addFavorite => 'Engadir'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$gl extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$gl extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Eliminar de favoritos'; + @override + String content({required Object name}) => 'Realmente queres eliminar dos favoritos "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$gl extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Engadir a favoritos'; + @override + String get titleEdit => 'Axustes'; + @override + String get name => 'Nome do dispositivo'; + @override + String get auto => '(auto)'; + @override + String get ip => 'Enderezo IP'; + @override + String get port => 'Porto'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$gl extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get time => 'Hora:'; + @override + String get title => 'Información do ficheiro'; + @override + String get fileName => 'Nome do ficheiro:'; + @override + String get path => 'Ruta:'; + @override + String get size => 'Tamaño:'; + @override + String get sender => 'Remitente:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$gl extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Introduce o nome do ficheiro'; + @override + String original({required Object original}) => 'Orixinal: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$gl extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Limpar historial'; + @override + String get content => 'Realmente queres eliminar todo o historial?'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$gl extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get content => 'Non concedeches os permisos necesarios. Por favor, concédeos na configuración.'; + @override + String get title => 'Sen permiso'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$gl extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get content => 'Por favor selecciona polo menos un ficheiro.'; + @override + String get title => 'Non se seleccionaron ficheiros'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$gl extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend non pode atopar outros dispositivos sen ter permiso para escanear a rede local. Por favor, concede este permiso na configuración.'; + @override + String get gotoSettings => 'Axustes'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$gl extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Escribir mensaxe'; + @override + String get multiline => 'Multiliña'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$gl extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Non dispoñíbel'; + @override + String get content => 'Esta característica só está dispoñíbel en:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$gl extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Código QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$gl extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Accións rápidas'; + @override + String get counter => 'Contador'; + @override + String get prefix => 'Prefixo'; + @override + String get padZero => 'Encher con ceros'; + @override + String get sortBeforeCount => 'Ordenar alfabéticamente de antemán (A-Z)'; + @override + String get random => 'Aleatorio'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$gl extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Agora as solicitudes de ficheiros acéptanse automaticamente. Teña en conta que todos os usuarios da rede local poden enviarche ficheiros.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$gl extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$gl extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Insira o PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$gl extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Modos de envío'; + @override + String get single => 'Envia ficheiros a un receptor. A selección borrarase unha vez rematada a transferencia de ficheiros.'; + @override + String get multiple => 'Envia ficheiros a múltiples receptores. A selección non se borrará unha vez rematada a transferencia de ficheiros.'; + @override + String get link => + 'Os destinatarios que non teñan instalado LocalSend poden descargar os ficheiros seleccionados abrindo a ligazón no seu navegador.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$gl extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Agora as solicitudes de ficheiros da túa lista de dispositivos favoritos acéptanse automaticamente.', + 'Aviso! Actualmente isto non é completamente seguro, xa que un hacker que teña a pegada dixital de calquera dos dispositivos da túa lista de favoritos pode enviarte ficheiros sen restriccións.', + 'Porén, esta opción aínda é máis segura que permitir que todos os usuarios da rede local te envíen ficheiros sen restricións.', + ]; +} + +// Path: progressPage.total +class _Translations$progressPage$total$gl extends Translations$progressPage$total$en { + _Translations$progressPage$total$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$gl title = _Translations$progressPage$total$title$gl._(_root); + @override + String count({required Object curr, required Object n}) => 'Ficheiros: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Tamaño: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Velocidade: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$gl extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Usa «h» para abreviatura de horas e «m» para minutos + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Usa «d» para días, «h» para horas e «m» para minutos + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$gl extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get dark => 'Escuro'; + @override + String get light => 'Luz'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$gl extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$gl extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$gl extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get all => 'Todo'; + @override + String get filtered => 'Filtrado'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$gl extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$gl._(TranslationsGl root) : this._root = root, super.internal(root); + + final TranslationsGl _root; // ignore: unused_field + + // Translations + @override + String get canceledReceiver => 'Cancelado polo receptor'; + @override + String sending({required Object time}) => 'Progreso total (${time})'; + @override + String get finishedError => 'Rematado con erro'; + @override + String get canceledSender => 'Cancelado polo remitente'; +} diff --git a/app/lib/gen/strings_gu.g.dart b/app/lib/gen/strings_gu.g.dart new file mode 100644 index 0000000..04551bd --- /dev/null +++ b/app/lib/gen/strings_gu.g.dart @@ -0,0 +1,1518 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsGu extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsGu({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.gu, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsGu _root = this; // ignore: unused_field + + @override + TranslationsGu $copyWith({TranslationMetadata? meta}) => TranslationsGu(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'અંગ્રેજી'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$gu general = _Translations$general$gu._(_root); + @override + late final _Translations$receiveTab$gu receiveTab = _Translations$receiveTab$gu._(_root); + @override + late final _Translations$sendTab$gu sendTab = _Translations$sendTab$gu._(_root); + @override + late final _Translations$settingsTab$gu settingsTab = _Translations$settingsTab$gu._(_root); + @override + late final _Translations$troubleshootPage$gu troubleshootPage = _Translations$troubleshootPage$gu._(_root); + @override + late final _Translations$receiveHistoryPage$gu receiveHistoryPage = _Translations$receiveHistoryPage$gu._(_root); + @override + late final _Translations$apkPickerPage$gu apkPickerPage = _Translations$apkPickerPage$gu._(_root); + @override + late final _Translations$selectedFilesPage$gu selectedFilesPage = _Translations$selectedFilesPage$gu._(_root); + @override + late final _Translations$receivePage$gu receivePage = _Translations$receivePage$gu._(_root); + @override + late final _Translations$receiveOptionsPage$gu receiveOptionsPage = _Translations$receiveOptionsPage$gu._(_root); + @override + late final _Translations$sendPage$gu sendPage = _Translations$sendPage$gu._(_root); + @override + late final _Translations$progressPage$gu progressPage = _Translations$progressPage$gu._(_root); + @override + late final _Translations$webSharePage$gu webSharePage = _Translations$webSharePage$gu._(_root); + @override + late final _Translations$aboutPage$gu aboutPage = _Translations$aboutPage$gu._(_root); + @override + late final _Translations$donationPage$gu donationPage = _Translations$donationPage$gu._(_root); + @override + late final _Translations$changelogPage$gu changelogPage = _Translations$changelogPage$gu._(_root); + @override + late final _Translations$aliasGenerator$gu aliasGenerator = _Translations$aliasGenerator$gu._(_root); + @override + late final _Translations$dialogs$gu dialogs = _Translations$dialogs$gu._(_root); + @override + late final _Translations$sanitization$gu sanitization = _Translations$sanitization$gu._(_root); + @override + late final _Translations$tray$gu tray = _Translations$tray$gu._(_root); + @override + late final _Translations$web$gu web = _Translations$web$gu._(_root); + @override + late final _Translations$assetPicker$gu assetPicker = _Translations$assetPicker$gu._(_root); + @override + late final _Translations$networkInterfacesPage$gu networkInterfacesPage = _Translations$networkInterfacesPage$gu._(_root); +} + +// Path: general +class _Translations$general$gu extends Translations$general$en { + _Translations$general$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get accept => 'સ્વીકારો'; + @override + String get accepted => 'સ્વીકાર્યો'; + @override + String get add => 'ઉમેરો'; + @override + String get advanced => 'અદ્યતન'; + @override + String get cancel => 'રદ કરો'; + @override + String get close => 'બંધ કરો'; + @override + String get confirm => 'પુષ્ટિ કરો'; + @override + String get continueStr => 'આગળ વધો'; + @override + String get copy => 'કૉપિ કરો'; + @override + String get copiedToClipboard => 'ક્લિપબોર્ડ પર કૉપિ થયું'; + @override + String get decline => 'અસ્વીકારો'; + @override + String get done => 'પૂર્ણ'; + @override + String get delete => 'કાઢી નાખો'; + @override + String get edit => 'ફેરફાર કરો'; + @override + String get error => 'ભૂલ'; + @override + String get example => 'ઉદાહરણ'; + @override + String get files => 'ફાઇલો'; + @override + String get finished => 'સમાપ્ત'; + @override + String get hide => 'છૂપાવો'; + @override + String get off => 'બંધ'; + @override + String get offline => 'ઓફલાઇન'; + @override + String get on => 'ચાલુ'; + @override + String get online => 'ઓનલાઇન'; + @override + String get open => 'ખોલો'; + @override + String get queue => 'કતાર'; + @override + String get quickSave => 'ઝડપથી સેવ કરો'; + @override + String get renamed => 'નામ બદલ્યું'; + @override + String get reset => 'રીસેટ કરો'; + @override + String get restart => 'ફરીથી શરૂ કરો'; + @override + String get settings => 'સેટિંગ્સ'; + @override + String get skipped => 'છોડી દીધું'; + @override + String get start => 'શરૂ કરો'; + @override + String get stop => 'બંધ કરો'; + @override + String get save => 'સેવ કરો'; + @override + String get unchanged => 'બદલાયું નથી'; + @override + String get unknown => 'અજ્ઞાત'; + @override + String get noItemInClipboard => 'ક્લિપબોર્ડમાં કોઈ વસ્તુ નથી'; + @override + String get quickSaveFromFavorites => '"મનપસંદ" માટે ક્વિક સેવ કરો'; +} + +// Path: receiveTab +class _Translations$receiveTab$gu extends Translations$receiveTab$en { + _Translations$receiveTab$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'પ્રાપ્ત કરો'; + @override + late final _Translations$receiveTab$infoBox$gu infoBox = _Translations$receiveTab$infoBox$gu._(_root); + @override + late final _Translations$receiveTab$quickSave$gu quickSave = _Translations$receiveTab$quickSave$gu._(_root); +} + +// Path: sendTab +class _Translations$sendTab$gu extends Translations$sendTab$en { + _Translations$sendTab$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'મોકલો'; + @override + late final _Translations$sendTab$selection$gu selection = _Translations$sendTab$selection$gu._(_root); + @override + late final _Translations$sendTab$picker$gu picker = _Translations$sendTab$picker$gu._(_root); + @override + String get shareIntentInfo => 'તમારા મોબાઇલ ડિવાઇસના "શેર" ફીચરને પણ વાપરીને ફાઇલોને વધુ સરળતાથી પસંદ કરી શકો છો.'; + @override + String get nearbyDevices => 'નજીકના ઉપકરણો'; + @override + String get thisDevice => 'આ ઉપકરણ'; + @override + String get scan => 'ઉપકરણો શોધો'; + @override + String get sendMode => 'મોડ મોકલો'; + @override + late final _Translations$sendTab$sendModes$gu sendModes = _Translations$sendTab$sendModes$gu._(_root); + @override + String get sendModeHelp => 'સમજાણ'; + @override + String get help => 'મહેરબાની કરીને ખાતરી કરો કે ઇચ્છિત લક્ષ્ય પણ તે જ Wi-Fi નેટવર્ક પર છે.'; + @override + String get placeItems => 'શેર કરવા માટે વસ્તુઓ મૂકો.'; + @override + String get manualSending => 'મૈન્યુલ મોકલવું'; +} + +// Path: settingsTab +class _Translations$settingsTab$gu extends Translations$settingsTab$en { + _Translations$settingsTab$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'સેટિંગ્સ'; + @override + late final _Translations$settingsTab$general$gu general = _Translations$settingsTab$general$gu._(_root); + @override + late final _Translations$settingsTab$receive$gu receive = _Translations$settingsTab$receive$gu._(_root); + @override + late final _Translations$settingsTab$send$gu send = _Translations$settingsTab$send$gu._(_root); + @override + late final _Translations$settingsTab$network$gu network = _Translations$settingsTab$network$gu._(_root); + @override + late final _Translations$settingsTab$other$gu other = _Translations$settingsTab$other$gu._(_root); + @override + String get advancedSettings => 'અદ્યતન સેટિંગ્સ'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$gu extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'ટ્રબલશૂટ'; + @override + String get subTitle => 'એપ્લિકેશન અપેક્ષિત રીતે કાર્ય કરતી નથી? અહીં તમે કેટલાક સામાન્ય ઉકેલો મેળવી શકો છો.'; + @override + String get solution => 'ઉકેલ:'; + @override + String get fixButton => 'સ્વયંચાલિત રીતે ઉકેલો'; + @override + late final _Translations$troubleshootPage$firewall$gu firewall = _Translations$troubleshootPage$firewall$gu._(_root); + @override + late final _Translations$troubleshootPage$noConnection$gu noConnection = _Translations$troubleshootPage$noConnection$gu._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$gu noDiscovery = _Translations$troubleshootPage$noDiscovery$gu._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$gu extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'ઇતિહાસ'; + @override + String get openFolder => 'ફોલ્ડર ખોલો'; + @override + String get deleteHistory => 'ઇતિહાસ ડિલીટ કરો'; + @override + String get empty => 'ઇતિહાસ ખાલી છે.'; + @override + late final _Translations$receiveHistoryPage$entryActions$gu entryActions = _Translations$receiveHistoryPage$entryActions$gu._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$gu extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'એપ્સ (APK)'; + @override + String get excludeSystemApps => 'સિસ્ટમ એપ્સનો સમાવેશ ન કરો'; + @override + String get excludeAppsWithoutLaunchIntent => 'લૉન્ચ નહીં કરી શકાય તેવા એપ્સનો સમાવેશ ન કરો'; + @override + String apps({required Object n}) => '${n} એપ્સ'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$gu extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'બધા ડિલીટ કરો'; +} + +// Path: receivePage +class _Translations$receivePage$gu extends Translations$receivePage$en { + _Translations$receivePage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('gu'))( + n, + one: 'તમે ફાઇલ મોકલવા માંગે છે', + other: 'તમે ${n} ફાઇલો મોકલવા માંગે છે', + ); + @override + String get subTitleMessage => 'તમે સંદેશો મોકલ્યો:'; + @override + String get subTitleLink => 'તમે લિંક મોકલી:'; + @override + String get canceled => 'પ્રેષક એ વિનંતી રદ કરી છે.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$gu extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'વિકલ્પો'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(લોકલસેન્ડ ફોલ્ડર)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'સ્વયંચાલિત રીતે બંધ કરી દેવામાં આવ્યું છે કારણ કે ડિરેક્ટરીઓ છે.'; +} + +// Path: sendPage +class _Translations$sendPage$gu extends Translations$sendPage$en { + _Translations$sendPage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'પ્રતિસાદની રાહ જોવામાં આવી રહી છે...'; + @override + String get rejected => 'પ્રાપ્તકર્તાએ વિનંતી અસ્વીકાર કરી છે.'; + @override + String get busy => 'પ્રાપ્તકર્તા બીજી વિનંતી સાથે વ્યસ્ત છે.'; + @override + String get tooManyAttempts => '@:વેબ.બહુ_બધા_પ્રયાસ'; +} + +// Path: progressPage +class _Translations$progressPage$gu extends Translations$progressPage$en { + _Translations$progressPage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'ફાઈલો મોકલી રહ્યા છે'; + @override + String get titleReceiving => 'ફાઈલો મેળવી રહ્યા છે'; + @override + String get savedToGallery => 'ફોટોઝ માં સાચવ્યું'; + @override + late final _Translations$progressPage$total$gu total = _Translations$progressPage$total$gu._(_root); + @override + late final _Translations$progressPage$remainingTime$gu remainingTime = _Translations$progressPage$remainingTime$gu._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$gu extends Translations$webSharePage$en { + _Translations$webSharePage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'લિંક દ્વારા શેર કરો'; + @override + String get loading => 'સર્વર શરૂ કરી રહ્યો છે...'; + @override + String get stopping => 'સર્વર બંધ કરી રહ્યો છે...'; + @override + String get error => 'સર્વર શરૂ કરતી વખતે એક ભૂલ થઈ.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('gu'))( + n, + one: 'તમારા બ્રાઉઝરમાં આ લિંક ખોલો:', + other: 'તમારા બ્રાઉઝરમાં આમાંથી કોઈ એક લિંક ખોલો:', + ); + @override + String get requests => 'વિનંતિઓ'; + @override + String get noRequests => 'હજી સુધી કોઈ વિનંતિ નથી.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'સ્વયંસંચાલિત રીતે વિનંતિઓ સ્વીકારો'; + @override + String get encryptionHint => 'લોકલસેન્ડ એ સ્વ-સાઇન્ડ સર્ટિફિકેટનો ઉપયોગ કરે છે. તમારે તેને તમારા બ્રાઉઝરમાં સ્વીકારવું પડશે.'; + @override + String pendingRequests({required Object n}) => 'બાકી વિનંતિઓ: ${n}'; + @override + String get requirePin => 'પિન જોયશે'; + @override + String pinHint({required Object pin}) => 'પિન "${pin}" છે'; +} + +// Path: aboutPage +class _Translations$aboutPage$gu extends Translations$aboutPage$en { + _Translations$aboutPage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'લોકલસેન્ડ વિશે'; + @override + List get description => [ + 'લોકલસેન્ડ એક મફત, ઓપન-સોર્સ એપ છે જે તમને તમારા સ્થાનિક નેટવર્ક પર નજીકના ઉપકરણો સાથે સુરક્ષિત રીતે ફાઈલો અને સંદેશાઓ શેર કરવાની મંજૂરી આપે છે અને તે માટે ઈન્ટરનેટ કનેક્શનની જરૂર નથી.', + 'આ એપ એન્ડ્રોઇડ, ios, મેકઓએસ, વિન્ડોઝ અને લિનક્સ પર ઉપલબ્ધ છે. તમે તમામ ડાઉનલોડ વિકલ્પો આધિકારીક હોમપેજ પર શોધી શકો છો.', + ]; + @override + String get author => 'લેખક'; + @override + String get contributors => 'યોગદાનકર્તાઓ'; + @override + String get translators => 'અનુવાદકો'; + @override + String get packagers => 'પૅકેજકરતાં'; +} + +// Path: donationPage +class _Translations$donationPage$gu extends Translations$donationPage$en { + _Translations$donationPage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'દાન આપો'; + @override + String get info => 'લોકલસેન્ડ મફત, ઓપન-સોર્સ છે અને તેમાં કોઈ જ જાહેરાતો નથી. જો તમને એપ ગમે, તો તમે દાન દ્વારા વિકાસને સપોર્ટ કરી શકો છો.'; + @override + String donate({required Object amount}) => 'દાન આપો ${amount}'; + @override + String get thanks => 'તમારો ખુબ ખુબ આભાર!'; + @override + String get restore => 'ખરીદી પુનઃસ્થાપિત કરો'; +} + +// Path: changelogPage +class _Translations$changelogPage$gu extends Translations$changelogPage$en { + _Translations$changelogPage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'ચેન્જલોગ'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$gu extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Adorable', + 'Beautiful', + 'Big', + 'Bright', + 'Clean', + 'Clever', + 'Cool', + 'Cute', + 'Cunning', + 'Determined', + 'Energetic', + 'Efficient', + 'Fantastic', + 'Fast', + 'Fine', + 'Fresh', + 'Good', + 'Gorgeous', + 'Great', + 'Handsome', + 'Hot', + 'Kind', + 'Lovely', + 'Mystic', + 'Neat', + 'Nice', + 'Patient', + 'Pretty', + 'Powerful', + 'Rich', + 'Secret', + 'Smart', + 'Solid', + 'Special', + 'Strategic', + 'Strong', + 'Tidy', + 'Wise', + ]; + @override + List get fruits => [ + 'Apple', + 'Avocado', + 'Banana', + 'Blackberry', + 'Blueberry', + 'Broccoli', + 'Carrot', + 'Cherry', + 'Coconut', + 'Grape', + 'Lemon', + 'Lettuce', + 'Mango', + 'Melon', + 'Mushroom', + 'Onion', + 'Orange', + 'Papaya', + 'Peach', + 'Pear', + 'Pineapple', + 'Potato', + 'Pumpkin', + 'Raspberry', + 'Strawberry', + 'Tomato', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$gu extends Translations$dialogs$en { + _Translations$dialogs$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$gu addFile = _Translations$dialogs$addFile$gu._(_root); + @override + late final _Translations$dialogs$addressInput$gu addressInput = _Translations$dialogs$addressInput$gu._(_root); + @override + late final _Translations$dialogs$cancelSession$gu cancelSession = _Translations$dialogs$cancelSession$gu._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$gu cannotOpenFile = _Translations$dialogs$cannotOpenFile$gu._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$gu encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$gu._(_root); + @override + late final _Translations$dialogs$errorDialog$gu errorDialog = _Translations$dialogs$errorDialog$gu._(_root); + @override + late final _Translations$dialogs$favoriteDialog$gu favoriteDialog = _Translations$dialogs$favoriteDialog$gu._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$gu favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$gu._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$gu favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$gu._(_root); + @override + late final _Translations$dialogs$fileInfo$gu fileInfo = _Translations$dialogs$fileInfo$gu._(_root); + @override + late final _Translations$dialogs$fileNameInput$gu fileNameInput = _Translations$dialogs$fileNameInput$gu._(_root); + @override + late final _Translations$dialogs$historyClearDialog$gu historyClearDialog = _Translations$dialogs$historyClearDialog$gu._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$gu localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$gu._(_root); + @override + late final _Translations$dialogs$messageInput$gu messageInput = _Translations$dialogs$messageInput$gu._(_root); + @override + late final _Translations$dialogs$noFiles$gu noFiles = _Translations$dialogs$noFiles$gu._(_root); + @override + late final _Translations$dialogs$noPermission$gu noPermission = _Translations$dialogs$noPermission$gu._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$gu notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$gu._(_root); + @override + late final _Translations$dialogs$qr$gu qr = _Translations$dialogs$qr$gu._(_root); + @override + late final _Translations$dialogs$quickActions$gu quickActions = _Translations$dialogs$quickActions$gu._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$gu quickSaveNotice = _Translations$dialogs$quickSaveNotice$gu._(_root); + @override + late final _Translations$dialogs$sendModeHelp$gu sendModeHelp = _Translations$dialogs$sendModeHelp$gu._(_root); + @override + late final _Translations$dialogs$zoom$gu zoom = _Translations$dialogs$zoom$gu._(_root); + @override + late final _Translations$dialogs$openFile$gu openFile = _Translations$dialogs$openFile$gu._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$gu quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$gu._(_root); + @override + late final _Translations$dialogs$pin$gu pin = _Translations$dialogs$pin$gu._(_root); +} + +// Path: sanitization +class _Translations$sanitization$gu extends Translations$sanitization$en { + _Translations$sanitization$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get empty => 'ફાઈલનામ ખાલી ન હોઈ શકે'; + @override + String get invalid => 'ફાઈલનામમાં અમાન્ય અક્ષરો છે'; +} + +// Path: tray +class _Translations$tray$gu extends Translations$tray$en { + _Translations$tray$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'LocalSend બંધ કરો'; + @override + String get closeWindows => 'બહાર નિકડો'; +} + +// Path: web +class _Translations$web$gu extends Translations$web$en { + _Translations$web$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get rejected => 'નકારી કાઢ્યું'; + @override + String get files => 'ફાઈલો'; + @override + String get fileName => 'ફાઈલનું નામ'; + @override + String get size => 'માપ'; + @override + String get enterPin => 'પિન નાખો'; + @override + String get invalidPin => 'પિન ગલત છે'; + @override + String get tooManyAttempts => 'બહુ બધા પ્રયાસ કરી દીધા'; +} + +// Path: assetPicker +class _Translations$assetPicker$gu extends Translations$assetPicker$en { + _Translations$assetPicker$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'ખાતરી કરો'; + @override + String get cancel => 'રદ કરો'; + @override + String get edit => 'સંપાદિત કરો'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'લોડ નિષ્ફળ'; + @override + String get original => 'મૂળ'; + @override + String get preview => 'પૂર્વદર્શન'; + @override + String get select => 'પસંદ કરો'; + @override + String get emptyList => 'ખાલી યાદી'; + @override + String get unSupportedAssetType => 'અમાન્ય ફાઈલ પ્રકાર.'; + @override + String get unableToAccessAll => 'ડિવાઇસ પરની તમામ ફાઇલોનેઍક્સેસ કરી શકાતી નથી'; + @override + String get viewingLimitedAssetsTip => 'એપને ઉપલબ્ધ ફાઈલો અને આલ્બમ્સ જુઓ.'; + @override + String get changeAccessibleLimitedAssets => 'પ્રાપ્ય ફાઈલો અપડેટ કરવા માટે ક્લિક કરો'; + @override + String get accessAllTip => 'અમુક ફાઇલો જોવા એપને પરવાનગી નથી. સેટિંગ્સમાં જઈને બધી મીડિયા ફાઇલોની પરવાનગી આપો.'; + @override + String get goToSystemSettings => 'સિસ્ટમ સેટિંગ્સ પર જાઓ'; + @override + String get accessLimitedAssets => 'મર્યાદિત ઍક્સેસ સાથે ચાલુ રાખો'; + @override + String get accessiblePathName => 'પ્રાપ્ય ફાઈલો'; + @override + String get sTypeAudioLabel => 'ઑડિઓ'; + @override + String get sTypeImageLabel => 'છબી'; + @override + String get sTypeVideoLabel => 'વિડિયો'; + @override + String get sTypeOtherLabel => 'અન્ય મીડિયા'; + @override + String get sActionPlayHint => 'વગાડો'; + @override + String get sActionPreviewHint => 'પૂર્વદર્શન'; + @override + String get sActionSelectHint => 'પસંદ કરો'; + @override + String get sActionSwitchPathLabel => 'માર્ગ બદલો'; + @override + String get sActionUseCameraHint => 'કૅમેરા વાપરો'; + @override + String get sNameDurationLabel => 'અવધિ'; + @override + String get sUnitAssetCountLabel => 'ગણતરી'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$gu extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get preview => 'પ્રીવ્યૂ'; + @override + String get whitelist => 'જોયતીસૂચી'; + @override + String get blacklist => 'નજોયતીસૂચી'; + @override + String get title => 'નેટવર્ક ઇન્ટરફેસ'; + @override + String get info => + 'ડિફૌલ્ટ રૂપે, LocalSend બધા ઉપલબ્ધ નેટવર્ક ઇન્ટરફેસ વાપરશે. તમે અહી નજોયતા નેટવર્ક ને કાઢી શકો છો. બદલાવ જોયા માટે તમને સર્વર ને ફરી ચાલુ કરવું પડસે.'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$gu extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'પોર્ટ:'; + @override + String get alias => 'ડિવાઇસનું નામ:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$gu extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get favorites => 'મનપસંદ'; + @override + String get off => _root.general.off; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$gu extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'પસંદગી'; + @override + String files({required Object files}) => 'ફાઇલો: ${files}'; + @override + String size({required Object size}) => 'કદ: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$gu extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get file => 'ફાઇલ'; + @override + String get folder => 'ફોલ્ડર'; + @override + String get media => 'મીડિયા'; + @override + String get text => 'ટેક્સ્ટ'; + @override + String get app => 'એપ'; + @override + String get clipboard => 'પેસ્ટ કરો'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$gu extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get single => 'એકમાત્ર પ્રાપ્તકર્તા'; + @override + String get multiple => 'એકથી વધારે પ્રાપ્તકર્તાઓ'; + @override + String get link => 'લિંક દ્વારા શેર કરો'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$gu extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'સામાન્ય'; + @override + String get brightness => 'વિષય'; + @override + late final _Translations$settingsTab$general$brightnessOptions$gu brightnessOptions = _Translations$settingsTab$general$brightnessOptions$gu._( + _root, + ); + @override + String get color => 'રંગ'; + @override + late final _Translations$settingsTab$general$colorOptions$gu colorOptions = _Translations$settingsTab$general$colorOptions$gu._(_root); + @override + String get language => 'ભાષા'; + @override + late final _Translations$settingsTab$general$languageOptions$gu languageOptions = _Translations$settingsTab$general$languageOptions$gu._(_root); + @override + String get saveWindowPlacement => 'બંધ કરો: વિન્ડો પ્લેસમેન્ટ સેવ કરો'; + @override + String get minimizeToTray => 'બંધ કરો: ટ્રે/મેનુ બારમાં મિનિમાઇઝ'; + @override + String get launchAtStartup => 'લૉગિન પછી સ્વયંચાલિત શરૂઆત'; + @override + String get launchMinimized => 'સ્વયંચાલિત શરૂઆત: છુપાવેલી સ્થિતિમાં શરૂ કરો'; + @override + String get animations => 'એનિમેશન'; + @override + String get saveWindowPlacementWindows => 'બહાર નીકળ્યા પછી વિન્ડો ની જગ્યા સાચવો'; + @override + String get showInContextMenu => 'કૉટેક્સ્ટ મેન્યુ માં LocalSend દેખાડો'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$gu extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'સ્વીકારો'; + @override + String get quickSave => _root.general.quickSave; + @override + String get autoFinish => 'સ્વયંચાલિત પૂરણ'; + @override + String get destination => 'સ્થળ'; + @override + String get downloads => '(ડાઉનલોડ્સ)'; + @override + String get saveToGallery => 'મીડિયા ગેલેરીમાં સેવ કરો'; + @override + String get saveToHistory => 'ઇતિહાસમાં સેવ કરો'; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$gu extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'મોકલો'; + @override + String get shareViaLinkAutoAccept => 'લિંક દ્વારા શેર કરો: સ્વયંચાલિત સ્વીકારો'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$gu extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'નેટવર્ક'; + @override + String get needRestart => 'સેટિંગ્સ લાગુ કરવા સર્વરને પુનઃપ્રારંભ કરો!'; + @override + String get server => 'સર્વર'; + @override + String get alias => 'ડિવાઇસ નામ'; + @override + String get deviceType => 'ડિવાઇસ પ્રકાર'; + @override + String get deviceModel => 'ડિવાઇસ મોડલ'; + @override + String get port => 'પોર્ટ'; + @override + String get discoveryTimeout => 'ડિસ્કવરી ટાઈમઆઉટ'; + @override + String portWarning({required Object defaultPort}) => + 'તમે કસ્ટમ પોર્ટનો ઉપયોગ કરી રહ્યા છો તેથી તમે અન્ય ડિવાઇસ દ્વારા શોધી શકાય નહીં. (મૂળભૂત: ${defaultPort})'; + @override + String get encryption => 'એન્ક્રિપ્શન'; + @override + String get multicastGroup => 'મલ્ટીકાસ્ટ'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'તમે કસ્ટમ મલ્ટીકાસ્ટ સરનામાનો ઉપયોગ કરી રહ્યા છો તેથી તમે અન્ય ડિવાઇસ દ્વારા શોધી શકાય નહીં. (મૂળભૂત: ${defaultMulticast})'; + @override + String get network => 'નૅટવર્ક'; + @override + late final _Translations$settingsTab$network$networkOptions$gu networkOptions = _Translations$settingsTab$network$networkOptions$gu._(_root); + @override + String get useSystemName => 'સિસ્ટમ નામ વાપરો'; + @override + String get generateRandomAlias => 'રેનડમ ઉપનામ બનાવો'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$gu extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'અન્ય'; + @override + String get support => 'લોકલસેન્ડને સપોર્ટ કરો'; + @override + String get donate => 'દાન આપો'; + @override + String get privacyPolicy => 'ગોપનીયતા નીતિ'; + @override + String get termsOfUse => 'વાપરવા માટેની શરતો'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$gu extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'આ એપ્લિકેશન અન્ય ડિવાઇસને ફાઈલો મોકલી શકે છે; પરંતુ અન્ય ડિવાઇસ આ ડિવાઇસને ફાઈલો મોકલી શકતા નથી.'; + @override + String solution({required Object port}) => + 'આ મોટાભાગે ફાયરવોલનો પ્રશ્ન છે. તમે ${port} પોર્ટ પર આવનારી કનેક્શન્સ (UDP અને TCP) ને મંજૂરી આપીને આ ઉકેલી શકો છો.'; + @override + String get openFirewall => 'ફાયરવોલ ખોલો'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$gu extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'બંને ડિવાઇસ એકબીજાને શોધી શકતા નથી કે ફાઈલો શેર કરી શકતા નથી.'; + @override + String get solution => + 'શું સમસ્યા બંને બાજુ છે? જો આવું હોય, તો તમને ખાતરી કરવી જોઈએ કે બંને ડિવાઇસ એ જ Wi-Fi નેટવર્ક પર છે અને એ જ રૂપરેખા (પોર્ટ, મલ્ટીકાસ્ટ સરનામું, એન્ક્રિપ્શન) શેર કરે છે. નેટવર્ક ભાગ લેનારા વચ્ચે સંવાદિતા મંજૂરી ન આપી શકે. આ કિસ્સામાં, આ વિકલ્પને રાઉટરમાં સક્રિય કરવો પડશે.'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$gu extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'આ ડિવાઇસ બીજા ડિવાઇસ ને શોધી નથી શકતો.'; + @override + String get solution => + 'પક્કું કરો કે તમારા બધા ડિવાઇસ એજ વાઈફાઈ પર છે એંડ એજ કૉંફઈગુરેશન (પોર્ટ, મલ્ટીકાષ્ટ એડ્રેસ, એનક્રિપશન) છે. તમે જોયતા ડિવાઇસ નું આઇપી એડ્રેસ લખવનો પ્રયાસ કરી શકો છો. અગર આ કામ કયરૂ તોહ તમે આ ડિવાઇસ ને તમારા મનપસંદ માં જોડી શકો છો જેનાથી, ભવિષ્ય માં એ એની મેતે શોધી લેસે.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$gu extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get open => 'ફાઇલ ખોલો'; + @override + String get info => 'માહિતી'; + @override + String get deleteFromHistory => 'ઇતિહાસમાંથી ડિલીટ કરો'; + @override + String get showInFolder => 'ફોલ્ડર માં બતાવો'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$gu extends Translations$progressPage$total$en { + _Translations$progressPage$total$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$gu title = _Translations$progressPage$total$title$gu._(_root); + @override + String count({required Object curr, required Object n}) => 'ફાઈલો: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'કદ: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'ગતિ: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$gu extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + + /// નાનું કરી ને 'દિ' દિવસ માટે, 'ક' કલાક માટે અને 'મિ' મિનિટ માટે વાપરો + @override + String days({required Object d, required Object h, required Object m}) => '${d}દિ ${h}ક ${m}મિ'; + + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// નાનું કરી ને 'ક' કલાક માટે અને 'મિ' મિનિટ માટે વાપરો + @override + String hours({required Object h, required Object m}) => '${h}ક ${m}મિ'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$gu extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'પસંદગીમાં ઉમેરો'; + @override + String get content => 'તમે શું ઉમેરવા માંગો છો?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$gu extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'સરનામું દાખલ કરો'; + @override + String get hashtag => 'હૅશટૅગ'; + @override + String get ip => 'IP સરનામું'; + @override + String get recentlyUsed => 'હાલમાં ઉપયોગમાં લીધેલું: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$gu extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'ફાઇલ ટ્રાન્સફર રદ કરો'; + @override + String get content => 'શું તમે ખરેખર ફાઇલ ટ્રાન્સફર રદ કરવા માંગો છો?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$gu extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'ફાઇલ ખોલી શકતા નથી'; + @override + String content({required Object file}) => '"${file}" ખોલી શક્યા નહીં. શું આ ફાઇલ ખસેડવામાં આવી છે, નામ બદલવામાં આવ્યું છે કે દૂર કરવામાં આવી છે?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$gu extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'એન્ક્રિપ્શન નિષ્ક્રિય'; + @override + String get content => 'આંકડાશાસ્ત્ર હવે કોડ ન કરાયેલા HTTP પ્રોટોકોલ દ્વારા થાય છે. HTTPS નો ઉપયોગ કરવા માટે, ફરીથી એન્ક્રિપ્શન સક્રિય કરો.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$gu extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$gu extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'મનપસંદ'; + @override + String get noFavorites => 'હજી સુધી કોઈ મનપસંદ ઉપકરણ નથી.'; + @override + String get addFavorite => 'ઉમેરો'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$gu extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'મનપસંદમાંથી કાઢો'; + @override + String content({required Object name}) => 'શું તમે ખરેખર "${name}" ને મનપસંદમાંથી કાઢવા માંગો છો?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$gu extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'મનપસંદમાં ઉમેરો'; + @override + String get titleEdit => 'સેટિંગ્સ'; + @override + String get name => 'ઉપકરણનું નામ'; + @override + String get auto => '(આપમેળે)'; + @override + String get ip => 'IP સરનામું'; + @override + String get port => 'પોર્ટ'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$gu extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'ફાઇલ માહિતી'; + @override + String get fileName => 'ફાઇલનું નામ:'; + @override + String get path => 'માર્ગ:'; + @override + String get size => 'કદ:'; + @override + String get sender => 'મોકલનાર:'; + @override + String get time => 'સમય:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$gu extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'ફાઇલનું નામ દાખલ કરો'; + @override + String original({required Object original}) => 'મૂળ: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$gu extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'ઈતિહાસ સાફ કરો'; + @override + String get content => 'શું તમે ખરેખર સંપૂર્ણ ઈતિહાસ કાઢવા માંગો છો?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$gu extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => 'લોકલસેન્ડને સ્થાનિક નેટવર્ક સ્કેન કરવાની પરવાનગી વિના અન્ય ઉપકરણો શોધી શકતા નથી. કૃપા કરીને સેટિંગ્સમાં આ પરવાનગી આપો.'; + @override + String get gotoSettings => 'સેટિંગ્સ'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$gu extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'સંદેશ લખો'; + @override + String get multiline => 'મલ્ટિલાઇન'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$gu extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'કોઈ ફાઇલ પસંદ કરેલી નથી'; + @override + String get content => 'કૃપા કરીને ઓછામાં ઓછી એક ફાઇલ પસંદ કરો.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$gu extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'પરવાનગી નથી'; + @override + String get content => 'તમે જરૂરી પરવાનગીઓ આપી નથી. કૃપા કરીને સેટિંગ્સમાં તે આપો.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$gu extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'ઉપલબ્ધ નથી'; + @override + String get content => 'આ સુવિધા ફક્ત આ પર ઉપલબ્ધ છે:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$gu extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR કોડ'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$gu extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'ઝડપી કાર્યવાહી'; + @override + String get counter => 'કાઉન્ટર'; + @override + String get prefix => 'પ્રેફિક્સ'; + @override + String get padZero => 'શૂન્ય સાથે ભરવો'; + @override + String get sortBeforeCount => 'ગણતરી પહેલાં આલ્ફાબેટિક ક્રમમાં ગોઠવો'; + @override + String get random => 'રેન્ડમ'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$gu extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'ફાઈલ વિનંતીઓ આપમેળે સ્વીકારવામાં આવે છે. ધ્યાન રાખો કે સ્થાનિક નેટવર્ક પરના દરેક વ્યક્તિ તમને ફાઈલો મોકલી શકે છે.'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$gu extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'મોડ મોકલો'; + @override + String get single => 'ફાઈલોને એક પ્રાપ્તકર્તાને મોકલવામાં આવે છે. ફાઈલ ટ્રાન્સફર પૂરી થયા પછી પસંદગી સાફ કરવામાં આવશે.'; + @override + String get multiple => 'ફાઈલોને ઘણા પ્રાપ્તકર્તાઓને મોકલવામાં આવે છે. પસંદગી સાફ કરવામાં આવશે નહીં.'; + @override + String get link => 'જે પ્રાપ્તકર્તાઓ પાસે LocalSend સ્થાપિત નથી તેઓ તેમના બ્રાઉઝરમાં લિંક ખોલીને પસંદ કરેલી ફાઈલો ડાઉનલોડ કરી શકે છે.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$gu extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$gu extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'ફાઇલ ખોલો'; + @override + String get content => 'પ્રાપ્ત થઈલી ફાઇલ ખોલવી છે?'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$gu extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'તમારા મનપસંદ સૂચી માં હોય એ ડિવાઇસ ના ફાઇલ અનુરોધ એની મેતે સ્વીકાર કરી લેશે.', + 'ચેતવણી! હમણાં, આ પૂર્ણ રૂપ થઈ સુરક્ષિત નથી, કારણ કે તમારા મનપસંદ સૂચી માંથી કોઈ ભી ડિવાઇસ નું ફિંગરપ્રિન્ટ કોઈ હેકર પાસે હસે તો એ તમને ફાઇલ બીના તમારા મંજૂરી મોકલી સકશે.', + 'જોકે, બીના મંજૂરી બધા જે લોકલ નેટવર્ક પર હોય એના પાસ થી ફાઇલ લેવા કરતા આ વિકલ્પ વધારે સુરક્ષિત છે.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$gu extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get title => 'પિન નાખો'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$gu extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get system => 'સિસ્ટમ'; + @override + String get dark => 'ડાર્ક'; + @override + String get light => 'લાઇટ'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$gu extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get system => 'સિસ્ટમ'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$gu extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get system => 'સિસ્ટમ'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$gu extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String get all => 'બધા'; + @override + String get filtered => 'છાણેલા'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$gu extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$gu._(TranslationsGu root) : this._root = root, super.internal(root); + + final TranslationsGu _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'કુલ પ્રગતિ (${time})'; + @override + String get finishedError => 'ભૂલ સાથે પૂર્ણ થયું'; + @override + String get canceledSender => 'મોકલનાર દ્વારા રદ કરવામાં આવ્યું'; + @override + String get canceledReceiver => 'પ્રાપ્તકર્તા દ્વારા રદ કરવામાં આવ્યું'; +} diff --git a/app/lib/gen/strings_he.g.dart b/app/lib/gen/strings_he.g.dart new file mode 100644 index 0000000..92af99e --- /dev/null +++ b/app/lib/gen/strings_he.g.dart @@ -0,0 +1,1409 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsHe extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsHe({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.he, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsHe _root = this; // ignore: unused_field + + @override + TranslationsHe $copyWith({TranslationMetadata? meta}) => TranslationsHe(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'עברית'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$he general = _Translations$general$he._(_root); + @override + late final _Translations$receiveTab$he receiveTab = _Translations$receiveTab$he._(_root); + @override + late final _Translations$sendTab$he sendTab = _Translations$sendTab$he._(_root); + @override + late final _Translations$settingsTab$he settingsTab = _Translations$settingsTab$he._(_root); + @override + late final _Translations$troubleshootPage$he troubleshootPage = _Translations$troubleshootPage$he._(_root); + @override + late final _Translations$receiveHistoryPage$he receiveHistoryPage = _Translations$receiveHistoryPage$he._(_root); + @override + late final _Translations$apkPickerPage$he apkPickerPage = _Translations$apkPickerPage$he._(_root); + @override + late final _Translations$selectedFilesPage$he selectedFilesPage = _Translations$selectedFilesPage$he._(_root); + @override + late final _Translations$receivePage$he receivePage = _Translations$receivePage$he._(_root); + @override + late final _Translations$receiveOptionsPage$he receiveOptionsPage = _Translations$receiveOptionsPage$he._(_root); + @override + late final _Translations$sendPage$he sendPage = _Translations$sendPage$he._(_root); + @override + late final _Translations$progressPage$he progressPage = _Translations$progressPage$he._(_root); + @override + late final _Translations$webSharePage$he webSharePage = _Translations$webSharePage$he._(_root); + @override + late final _Translations$aboutPage$he aboutPage = _Translations$aboutPage$he._(_root); + @override + late final _Translations$donationPage$he donationPage = _Translations$donationPage$he._(_root); + @override + late final _Translations$changelogPage$he changelogPage = _Translations$changelogPage$he._(_root); + @override + late final _Translations$dialogs$he dialogs = _Translations$dialogs$he._(_root); + @override + late final _Translations$sanitization$he sanitization = _Translations$sanitization$he._(_root); + @override + late final _Translations$tray$he tray = _Translations$tray$he._(_root); + @override + late final _Translations$web$he web = _Translations$web$he._(_root); + @override + late final _Translations$assetPicker$he assetPicker = _Translations$assetPicker$he._(_root); + @override + late final _Translations$networkInterfacesPage$he networkInterfacesPage = _Translations$networkInterfacesPage$he._(_root); +} + +// Path: general +class _Translations$general$he extends Translations$general$en { + _Translations$general$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get accept => 'אישור'; + @override + String get accepted => 'התקבל'; + @override + String get add => 'הוספה'; + @override + String get advanced => 'מידע נוסף'; + @override + String get cancel => 'ביטול'; + @override + String get close => 'סגור'; + @override + String get confirm => 'אישור'; + @override + String get continueStr => 'המשך'; + @override + String get copy => 'העתקה'; + @override + String get copiedToClipboard => 'הועתק ללוח'; + @override + String get decline => 'דחיה'; + @override + String get done => 'אישור'; + @override + String get delete => 'מחיקה'; + @override + String get edit => 'עריכה'; + @override + String get error => 'שגיאה'; + @override + String get example => 'דוגמא'; + @override + String get files => 'קבצים'; + @override + String get finished => 'הסתיים'; + @override + String get hide => 'הסתרה'; + @override + String get off => 'כבויה'; + @override + String get offline => 'כבוי'; + @override + String get on => 'פעילה'; + @override + String get online => 'מקוון'; + @override + String get open => 'פתח'; + @override + String get queue => 'תור'; + @override + String get quickSave => 'שמירה מהירה'; + @override + String get quickSaveFromFavorites => 'שמירה מהירה מהמועדפים'; + @override + String get renamed => 'שונה שם'; + @override + String get reset => 'איפוס'; + @override + String get restart => 'הפעל מחדש'; + @override + String get settings => 'הגדרות'; + @override + String get skipped => 'דילג'; + @override + String get start => 'התחל'; + @override + String get stop => 'עצור'; + @override + String get save => 'שמור'; + @override + String get unchanged => 'ללא שינוי'; + @override + String get unknown => 'לא ידוע'; + @override + String get noItemInClipboard => 'לוח ההעתקה ריק.'; +} + +// Path: receiveTab +class _Translations$receiveTab$he extends Translations$receiveTab$en { + _Translations$receiveTab$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'קבלה'; + @override + late final _Translations$receiveTab$infoBox$he infoBox = _Translations$receiveTab$infoBox$he._(_root); + @override + late final _Translations$receiveTab$quickSave$he quickSave = _Translations$receiveTab$quickSave$he._(_root); +} + +// Path: sendTab +class _Translations$sendTab$he extends Translations$sendTab$en { + _Translations$sendTab$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'שליחה'; + @override + late final _Translations$sendTab$selection$he selection = _Translations$sendTab$selection$he._(_root); + @override + late final _Translations$sendTab$picker$he picker = _Translations$sendTab$picker$he._(_root); + @override + String get shareIntentInfo => 'תוכל גם להשתמש בתכונת "שתף" של המכשיר הנייד שלך כדי לבחור קבצים בקלות.'; + @override + String get nearbyDevices => 'מכשירים בקרבת מקום'; + @override + String get thisDevice => 'המכשיר הזה'; + @override + String get scan => 'חפש מכשירים'; + @override + String get manualSending => 'שליחה ידנית'; + @override + String get sendMode => 'מצב שליחה'; + @override + late final _Translations$sendTab$sendModes$he sendModes = _Translations$sendTab$sendModes$he._(_root); + @override + String get sendModeHelp => 'עזרה'; + @override + String get help => 'אנא ודא שאתה ומכשיר היעד נמצאים באותה רשת WiFi.'; + @override + String get placeItems => 'הצב פריטים לשיתוף.'; +} + +// Path: settingsTab +class _Translations$settingsTab$he extends Translations$settingsTab$en { + _Translations$settingsTab$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'הגדרות'; + @override + late final _Translations$settingsTab$general$he general = _Translations$settingsTab$general$he._(_root); + @override + late final _Translations$settingsTab$receive$he receive = _Translations$settingsTab$receive$he._(_root); + @override + late final _Translations$settingsTab$send$he send = _Translations$settingsTab$send$he._(_root); + @override + late final _Translations$settingsTab$network$he network = _Translations$settingsTab$network$he._(_root); + @override + late final _Translations$settingsTab$other$he other = _Translations$settingsTab$other$he._(_root); + @override + String get advancedSettings => 'הגדרות מתקדמות'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$he extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'פתרון תקלות'; + @override + String get subTitle => 'האפליקציה לא פועלת כראוי? כאן תוכל למצוא פתרונות לבעיות נפוצות.'; + @override + String get solution => 'פתרון:'; + @override + String get fixButton => 'תקן אוטומטית'; + @override + late final _Translations$troubleshootPage$firewall$he firewall = _Translations$troubleshootPage$firewall$he._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$he noDiscovery = _Translations$troubleshootPage$noDiscovery$he._(_root); + @override + late final _Translations$troubleshootPage$noConnection$he noConnection = _Translations$troubleshootPage$noConnection$he._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$he extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'היסטוריה'; + @override + String get openFolder => 'פתח תיקייה'; + @override + String get deleteHistory => 'מחק היסטוריה'; + @override + String get empty => 'ההיסטוריה ריקה.'; + @override + late final _Translations$receiveHistoryPage$entryActions$he entryActions = _Translations$receiveHistoryPage$entryActions$he._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$he extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'אפליקציות (APK)'; + @override + String get excludeSystemApps => 'אל תכלול אפליקציות מערכת'; + @override + String get excludeAppsWithoutLaunchIntent => 'אל תכלול אפליקציות שאינן ניתנות להפעלה'; + @override + String apps({required Object n}) => '${n} אפליקציות'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$he extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'מחק הכל'; +} + +// Path: receivePage +class _Translations$receivePage$he extends Translations$receivePage$en { + _Translations$receivePage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('he'))( + n, + one: 'רוצה לשלוח לך קובץ', + other: 'רוצה לשלוח לך ${n} קבצים', + ); + @override + String get subTitleMessage => 'שלח לך הודעה:'; + @override + String get subTitleLink => 'שלח לך קישור:'; + @override + String get canceled => 'השולח ביטל את הבקשה.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$he extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'אפשרויות'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(תיקיית LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'כבוי באופן אוטומטי בשל קיום ספריות.'; +} + +// Path: sendPage +class _Translations$sendPage$he extends Translations$sendPage$en { + _Translations$sendPage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'ממתין לתגובה…'; + @override + String get rejected => 'הנמען דחה את הבקשה.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'הנמען תפוס בבקשה אחרת.'; +} + +// Path: progressPage +class _Translations$progressPage$he extends Translations$progressPage$en { + _Translations$progressPage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'שולח קבצים'; + @override + String get titleReceiving => 'מקבל קבצים'; + @override + String get savedToGallery => 'נשמר בתמונות'; + @override + late final _Translations$progressPage$total$he total = _Translations$progressPage$total$he._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$he extends Translations$webSharePage$en { + _Translations$webSharePage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'שיתוף באמצעות קישור'; + @override + String get loading => 'מפעיל את השרת…'; + @override + String get stopping => 'עוצר את השרת…'; + @override + String get error => 'אירעה שגיאה בזמן הפעלת השרת.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('he'))( + n, + one: 'פתח את הקישור בדפדפן:', + other: 'פתח את אחד מהקישורים האלו בדפדפן:', + ); + @override + String get requests => 'בקשות'; + @override + String get noRequests => 'אין כרגע בקשות.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'אישור בקשות באופן אוטומטי'; + @override + String get requirePin => 'דרוש סיסמה'; + @override + String pinHint({required Object pin}) => 'הסיסמה היא "${pin}"'; + @override + String get encryptionHint => 'LocalSend משתמש בתעודה עצמית. עליך לאשר אותה בדפדפן.'; + @override + String pendingRequests({required Object n}) => 'בקשות בהמתנה: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$he extends Translations$aboutPage$en { + _Translations$aboutPage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'אודות LocalSend'; + @override + List get description => [ + 'LocalSend היא אפליקציית קוד פתוח חינמית המאפשרת לשתף קבצים והודעות בצורה מאובטחת עם מכשירים קרובים דרך הרשת המקומית מבלי להזדקק לחיבור לאינטרנט.', + 'אפליקציה זו זמינה באנדרואיד, iOS, macOS, Windows ו-Linux. אתה יכול למצוא את כל אפשרויות ההורדה בדף הבית הרשמי.', + ]; + @override + String get author => 'יוצר'; + @override + String get contributors => 'תורמים'; + @override + String get packagers => 'אורזים'; + @override + String get translators => 'מתרגמים'; +} + +// Path: donationPage +class _Translations$donationPage$he extends Translations$donationPage$en { + _Translations$donationPage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'תרומה'; + @override + String get info => 'אפליקציית LocalSend היא חינמית, קוד פתוח וללא פרסומות. אם אתה אוהב את האפליקציה, אתה יכול לתמוך בפיתוח באמצעות תרומה.'; + @override + String donate({required Object amount}) => 'תרומת ${amount}'; + @override + String get thanks => 'תודה רבה!'; + @override + String get restore => 'שחזור רכישה'; +} + +// Path: changelogPage +class _Translations$changelogPage$he extends Translations$changelogPage$en { + _Translations$changelogPage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'יומן שינויים'; +} + +// Path: dialogs +class _Translations$dialogs$he extends Translations$dialogs$en { + _Translations$dialogs$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$he addFile = _Translations$dialogs$addFile$he._(_root); + @override + late final _Translations$dialogs$openFile$he openFile = _Translations$dialogs$openFile$he._(_root); + @override + late final _Translations$dialogs$addressInput$he addressInput = _Translations$dialogs$addressInput$he._(_root); + @override + late final _Translations$dialogs$cancelSession$he cancelSession = _Translations$dialogs$cancelSession$he._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$he cannotOpenFile = _Translations$dialogs$cannotOpenFile$he._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$he encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$he._(_root); + @override + late final _Translations$dialogs$errorDialog$he errorDialog = _Translations$dialogs$errorDialog$he._(_root); + @override + late final _Translations$dialogs$favoriteDialog$he favoriteDialog = _Translations$dialogs$favoriteDialog$he._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$he favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$he._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$he favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$he._(_root); + @override + late final _Translations$dialogs$fileInfo$he fileInfo = _Translations$dialogs$fileInfo$he._(_root); + @override + late final _Translations$dialogs$fileNameInput$he fileNameInput = _Translations$dialogs$fileNameInput$he._(_root); + @override + late final _Translations$dialogs$historyClearDialog$he historyClearDialog = _Translations$dialogs$historyClearDialog$he._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$he localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$he._(_root); + @override + late final _Translations$dialogs$messageInput$he messageInput = _Translations$dialogs$messageInput$he._(_root); + @override + late final _Translations$dialogs$noFiles$he noFiles = _Translations$dialogs$noFiles$he._(_root); + @override + late final _Translations$dialogs$noPermission$he noPermission = _Translations$dialogs$noPermission$he._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$he notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$he._(_root); + @override + late final _Translations$dialogs$qr$he qr = _Translations$dialogs$qr$he._(_root); + @override + late final _Translations$dialogs$quickActions$he quickActions = _Translations$dialogs$quickActions$he._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$he quickSaveNotice = _Translations$dialogs$quickSaveNotice$he._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$he quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$he._(_root); + @override + late final _Translations$dialogs$pin$he pin = _Translations$dialogs$pin$he._(_root); + @override + late final _Translations$dialogs$sendModeHelp$he sendModeHelp = _Translations$dialogs$sendModeHelp$he._(_root); + @override + late final _Translations$dialogs$zoom$he zoom = _Translations$dialogs$zoom$he._(_root); +} + +// Path: sanitization +class _Translations$sanitization$he extends Translations$sanitization$en { + _Translations$sanitization$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get empty => 'שם הקובץ לא יכול להיות ריק'; + @override + String get invalid => 'שם הקובץ מכיל תווים לא חוקיים'; +} + +// Path: tray +class _Translations$tray$he extends Translations$tray$en { + _Translations$tray$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'צא מ-LocalSend'; + @override + String get closeWindows => 'יציאה'; +} + +// Path: web +class _Translations$web$he extends Translations$web$en { + _Translations$web$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'הזן סיסמה'; + @override + String get invalidPin => 'סיסמה לא חוקית'; + @override + String get tooManyAttempts => 'בוצעו יותר מידי ניסיונות כושלים'; + @override + String get rejected => 'נדחה'; + @override + String get files => 'קבצים'; + @override + String get fileName => 'שם קובץ'; + @override + String get size => 'גודל'; +} + +// Path: assetPicker +class _Translations$assetPicker$he extends Translations$assetPicker$en { + _Translations$assetPicker$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'אישור'; + @override + String get cancel => 'ביטול'; + @override + String get edit => 'עריכה'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'טעינת הקובץ נכשלה'; + @override + String get original => 'מקור'; + @override + String get preview => 'תצוגה מקדימה'; + @override + String get select => 'בחירה'; + @override + String get emptyList => 'רשימה ריקה'; + @override + String get unSupportedAssetType => 'סוג קובץ לא נתמך.'; + @override + String get unableToAccessAll => 'לא ניתן לגשת לכל הקבצים במכשיר'; + @override + String get viewingLimitedAssetsTip => 'ניתן להציג רק קבצים ואלבומים שנגישים לאפליקציה.'; + @override + String get changeAccessibleLimitedAssets => 'לחץ כדי לעדכן את הקבצים הנגישים'; + @override + String get accessAllTip => 'האפליקציה יכולה לגשת רק לקבצים מסוימים במכשיר. עבור להגדרות המערכת ואפשר לאפליקציה לגשת לכל הקבצים שבמכשיר.'; + @override + String get goToSystemSettings => 'מעבר להגדרות המערכת'; + @override + String get accessLimitedAssets => 'המשך עם גישה מוגבלת'; + @override + String get accessiblePathName => 'קבצים שנגישים'; + @override + String get sTypeAudioLabel => 'שמע'; + @override + String get sTypeImageLabel => 'תמונה'; + @override + String get sTypeVideoLabel => 'סרטון'; + @override + String get sTypeOtherLabel => 'סוגים אחרים'; + @override + String get sActionPlayHint => 'הפעלה'; + @override + String get sActionPreviewHint => 'תצוגה מקדימה'; + @override + String get sActionSelectHint => 'בחירה'; + @override + String get sActionSwitchPathLabel => 'שינוי נתיב'; + @override + String get sActionUseCameraHint => 'שימוש במצלמה'; + @override + String get sNameDurationLabel => 'אורך'; + @override + String get sUnitAssetCountLabel => 'מספר'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$he extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'ממשקי רשת'; + @override + String get info => + 'כברירת מחדל, LocalSend משתמש בכל ממשקי הרשת הזמינים. באפשרותך להסיר רשתות שאינן רצויות כאן. עליך להפעיל מחדש את השרת כדי להחיל את השינויים.'; + @override + String get preview => 'תצוגה מקדימה'; + @override + String get whitelist => 'רשימה לבנה'; + @override + String get blacklist => 'רשימה שחורה'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$he extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'יציאה:'; + @override + String get alias => 'כינוי:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$he extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'מועדפים'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$he extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'בחירה'; + @override + String files({required Object files}) => 'קבצים: ${files}'; + @override + String size({required Object size}) => 'גודל: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$he extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get file => 'קובץ'; + @override + String get folder => 'תיקייה'; + @override + String get media => 'מדיה'; + @override + String get text => 'טקסט'; + @override + String get app => 'אפליקציה'; + @override + String get clipboard => 'לוח ההעתקה'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$he extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get single => 'שליחה למקבל בודד'; + @override + String get multiple => 'שליחה למקבלים מרובים'; + @override + String get link => 'שיתוף באמצעות קישור'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$he extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'כללי'; + @override + String get brightness => 'ערכת נושא'; + @override + late final _Translations$settingsTab$general$brightnessOptions$he brightnessOptions = _Translations$settingsTab$general$brightnessOptions$he._( + _root, + ); + @override + String get color => 'צבע'; + @override + late final _Translations$settingsTab$general$colorOptions$he colorOptions = _Translations$settingsTab$general$colorOptions$he._(_root); + @override + String get language => 'שפה'; + @override + late final _Translations$settingsTab$general$languageOptions$he languageOptions = _Translations$settingsTab$general$languageOptions$he._(_root); + @override + String get saveWindowPlacement => 'יציאה: שמירת מיקום החלון'; + @override + String get saveWindowPlacementWindows => 'שמור את מיקום החלון בעת יציאה'; + @override + String get minimizeToTray => 'יציאה: מזעור למגש'; + @override + String get launchAtStartup => 'הפעלה אוטומטית לאחר הכניסה'; + @override + String get launchMinimized => 'הפעלה אוטומטית: התחל מוסתר'; + @override + String get showInContextMenu => 'הצג את LocalSend בתפריט ההקשר'; + @override + String get animations => 'אנימציות'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$he extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'קבלה'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'סיום אוטומטי'; + @override + String get destination => 'יעד'; + @override + String get downloads => '(הורדות)'; + @override + String get saveToGallery => 'שמור מדיה לגלריה'; + @override + String get saveToHistory => 'שמור בהיסטוריה'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$he extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'שליחה'; + @override + String get shareViaLinkAutoAccept => 'שיתוף באמצעות קישור: אישור אוטומטי'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$he extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'רשת'; + @override + String get needRestart => 'הפעל מחדש את השרת כדי להחיל את ההגדרות!'; + @override + String get server => 'שרת'; + @override + String get alias => 'כינוי'; + @override + String get deviceType => 'סוג המכשיר'; + @override + String get deviceModel => 'דגם המכשיר'; + @override + String get port => 'יציאה'; + @override + String get discoveryTimeout => 'זמן קצוב לגילוי'; + @override + String get useSystemName => 'השתמש בשם מערכת'; + @override + String get generateRandomAlias => 'צור כינוי אקראי'; + @override + String portWarning({required Object defaultPort}) => + 'יתכן שלא יזוהו מכשירים אחרים בגלל שאתה משתמש ביציאה מותאמת אישית. (ברירת־מחדל: ${defaultPort})'; + @override + String get encryption => 'הצפנה'; + @override + String get multicastGroup => 'מולטיקאסט'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'יתכן שלא יזוהו מכשירים אחרים בגלל שאתה משתמש בכתובת מולטיקאסט מותאמת אישית. (ברירת־מחדל: ${defaultMulticast})'; + @override + late final _Translations$settingsTab$network$networkOptions$he networkOptions = _Translations$settingsTab$network$networkOptions$he._(_root); + @override + String get network => 'רשת'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$he extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'אחר'; + @override + String get support => 'תמיכה ב-LocalSend'; + @override + String get donate => 'תרומה'; + @override + String get privacyPolicy => 'מדיניות פרטיות'; + @override + String get termsOfUse => 'תנאי השימוש'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$he extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'האפליקציה יכולה לשלוח קבצים למכשירים אחרים, אך מכשירים אחרים אינם יכולים לשלוח קבצים למכשיר זה.'; + @override + String solution({required Object port}) => + 'כנראה זו בעיה של חומת אש. באפשרותך לפתור את הבעיה על ידי אפשור חיבורים נכנסים (UDP ו-TCP) ביציאה ${port}.'; + @override + String get openFirewall => 'פתח את חומת האש'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$he extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'המכשיר הזה לא מצליח לגלות מכשירים אחרים.'; + @override + String get solution => + 'אנא ודא שכל המכשירים נמצאים באותה רשת Wi-Fi וחולקים את אותה תצורה (יציאה, כתובת ריבוי שידור, הצפנה). אתה יכול לנסות להקליד את כתובת ה-IP של מכשיר היעד באופן ידני. אם זה יעבוד, שקול להוסיף את המכשיר למועדפים כדי שניתן יהיה לגלות אותו אוטומטית בעתיד.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$he extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'שני המכשירים לא מצליחים לגלות אחד את השני כדי לשתף קבצים.'; + @override + String get solution => + 'הבעיה קיימת בשני הצדדים? עליך לוודא ששני המכשירים נמצאים באותה רשת WiFi וחולקים את אותה תצורה (יציאה, כתובת מולטיקאסט, הצפנה). רשת ה-WiFi עשויה שלא לאפשר תקשורת בין משתתפים. במקרה כזה, יש לאפשר אפשרות זו בראוטר.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$he extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get open => 'פתח קובץ'; + @override + String get showInFolder => 'הצג בתיקייה'; + @override + String get info => 'מידע'; + @override + String get deleteFromHistory => 'מחק מההיסטוריה'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$he extends Translations$progressPage$total$en { + _Translations$progressPage$total$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$he title = _Translations$progressPage$total$title$he._(_root); + @override + String count({required Object curr, required Object n}) => 'קבצים: ${curr}/${n}'; + @override + String size({required Object curr, required Object n}) => 'גודל: ${curr}/${n}'; + @override + String speed({required Object speed}) => 'מהירות: ${speed}/שניה'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$he extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'הוסף לבחירה'; + @override + String get content => 'מה אתה רוצה להוסיף?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$he extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'פתח קובץ'; + @override + String get content => 'האם ברצונך לפתוח את הקובץ שהתקבל?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$he extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'הכנס כתובת'; + @override + String get hashtag => 'סולמית'; + @override + String get ip => 'כתובת ה-IP'; + @override + String get recentlyUsed => 'בשימוש לאחרונה: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$he extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'בטל את העברת הקבצים'; + @override + String get content => 'האם אתה באמת רוצה לבטל את העברת הקבצים?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$he extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'לא ניתן לפתוח את הקובץ'; + @override + String content({required Object file}) => 'לא ניתן לפתוח את "${file}". האם הקובץ הועבר, הועתק או נמחק?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$he extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'ההצפנה מנוטרלת'; + @override + String get content => 'התקשורת כעת מתבצעת בפרוטוקול HTTP שאינו מוצפן. כדי להשתמש ב-HTTPS, יש להפעיל שוב את ההצפנה.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$he extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$he extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'מועדפים'; + @override + String get noFavorites => 'עדיין אין מכשירים מועדפים.'; + @override + String get addFavorite => 'הוספה'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$he extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'הסרה מהמועדפים'; + @override + String content({required Object name}) => 'האם אתה באמת רוצה להסיר מהמועדפים "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$he extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'הוסף למועדפים'; + @override + String get titleEdit => 'עריכה'; + @override + String get name => 'כינוי'; + @override + String get auto => '(אוטומטי)'; + @override + String get ip => 'כתובת IP'; + @override + String get port => 'יציאה'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$he extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'מידע על הקובץ'; + @override + String get fileName => 'שם הקובץ:'; + @override + String get path => 'נתיב:'; + @override + String get size => 'גודל:'; + @override + String get sender => 'שולח:'; + @override + String get time => 'זמן:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$he extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'הזן את שם הקובץ'; + @override + String original({required Object original}) => 'מקורי: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$he extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'ניקוי היסטוריה'; + @override + String get content => 'האם אתה באמת רוצה למחוק את כל ההיסטוריה?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$he extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => 'ל־LocalSend אין אפשרות למצוא מכשירים אחרים ללא הרשאה לסריקת הרשת המקומית. אנא הענק את ההרשאה הזו בהגדרות.'; + @override + String get gotoSettings => 'הגדרות'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$he extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'הקלד הודעה'; + @override + String get multiline => 'מרובה שורות'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$he extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'לא נבחר אף קובץ'; + @override + String get content => 'אנא בחר קובץ אחד לפחות.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$he extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'אין הרשאה'; + @override + String get content => 'לא הענקת את ההרשאות הנדרשות. אנא הענק את ההרשאות בהגדרות.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$he extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'לא זמין'; + @override + String get content => 'תכונה זו זמינה רק במערכות הבאות:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$he extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'קוד QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$he extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'פעולות מהירות'; + @override + String get counter => 'מונה'; + @override + String get prefix => 'קידומת'; + @override + String get padZero => 'ריפוד באפסים'; + @override + String get sortBeforeCount => 'מיין תחילה בסדר אלפביתי'; + @override + String get random => 'אקראי'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$he extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'בקשות שליחה מתקבלות אוטומטית. שים לב שכל אחד ברשת המקומית יוכל לשלוח לך קבצים.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$he extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'כעת בקשות לקבצים ייתקבלו אוטומטית ממכשירים ברשימת המועדפים שלך.', + 'אזהרה: כרגע זה לא לגמרי מאובטח מכיוון שהאקר שנמצא ברשת שלך ויודע את טביעת האצבע של המכשירים האהובים עליך עדיין יכול לשלוח לך קבצים ללא אישור.', + 'עם זאת, אפשרות זו עדיין מאובטחת יותר מאשר לאפשר קבלה אוטומטית מכל מכשיר.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$he extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'הזן סיסמה'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$he extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'מצבי שליחה'; + @override + String get single => 'שליחת קבצים למקבל בודד. בחירת הקבצים תתאפס לאחר השליחה.'; + @override + String get multiple => 'שליחת קבצים למקבלים מרובים. בחירת הקבצים לא תתאפס.'; + @override + String get link => 'מקבלים ש-LocalSend לא מותקן אצלם יוכלו להוריד את הקבצים שנבחרו על ידי פתיחת הקישור בדפדפן שלהם.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$he extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$he extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get system => 'מערכת'; + @override + String get dark => 'כהה'; + @override + String get light => 'בהירה'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$he extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get system => 'מערכת'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$he extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get system => 'מערכת'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$he extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String get filtered => 'מסונן'; + @override + String get all => 'הכל'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$he extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$he._(TranslationsHe root) : this._root = root, super.internal(root); + + final TranslationsHe _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'סה"כ התקדמות (${time})'; + @override + String get finishedError => 'הסתיים עם שגיאה'; + @override + String get canceledSender => 'בוטל על ידי השולח'; + @override + String get canceledReceiver => 'בוטל על ידי הצד המקבל'; +} diff --git a/app/lib/gen/strings_hi.g.dart b/app/lib/gen/strings_hi.g.dart new file mode 100644 index 0000000..f6ff7b8 --- /dev/null +++ b/app/lib/gen/strings_hi.g.dart @@ -0,0 +1,1497 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsHi extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsHi({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.hi, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsHi _root = this; // ignore: unused_field + + @override + TranslationsHi $copyWith({TranslationMetadata? meta}) => TranslationsHi(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'अंग्रेज़ी'; + @override + String get appName => 'स्थानीय भेजें (फाइल भेजो)'; + @override + late final _Translations$general$hi general = _Translations$general$hi._(_root); + @override + late final _Translations$receiveTab$hi receiveTab = _Translations$receiveTab$hi._(_root); + @override + late final _Translations$sendTab$hi sendTab = _Translations$sendTab$hi._(_root); + @override + late final _Translations$settingsTab$hi settingsTab = _Translations$settingsTab$hi._(_root); + @override + late final _Translations$troubleshootPage$hi troubleshootPage = _Translations$troubleshootPage$hi._(_root); + @override + late final _Translations$receiveHistoryPage$hi receiveHistoryPage = _Translations$receiveHistoryPage$hi._(_root); + @override + late final _Translations$apkPickerPage$hi apkPickerPage = _Translations$apkPickerPage$hi._(_root); + @override + late final _Translations$selectedFilesPage$hi selectedFilesPage = _Translations$selectedFilesPage$hi._(_root); + @override + late final _Translations$receivePage$hi receivePage = _Translations$receivePage$hi._(_root); + @override + late final _Translations$receiveOptionsPage$hi receiveOptionsPage = _Translations$receiveOptionsPage$hi._(_root); + @override + late final _Translations$sendPage$hi sendPage = _Translations$sendPage$hi._(_root); + @override + late final _Translations$progressPage$hi progressPage = _Translations$progressPage$hi._(_root); + @override + late final _Translations$webSharePage$hi webSharePage = _Translations$webSharePage$hi._(_root); + @override + late final _Translations$aboutPage$hi aboutPage = _Translations$aboutPage$hi._(_root); + @override + late final _Translations$donationPage$hi donationPage = _Translations$donationPage$hi._(_root); + @override + late final _Translations$changelogPage$hi changelogPage = _Translations$changelogPage$hi._(_root); + @override + late final _Translations$aliasGenerator$hi aliasGenerator = _Translations$aliasGenerator$hi._(_root); + @override + late final _Translations$dialogs$hi dialogs = _Translations$dialogs$hi._(_root); + @override + late final _Translations$sanitization$hi sanitization = _Translations$sanitization$hi._(_root); + @override + late final _Translations$tray$hi tray = _Translations$tray$hi._(_root); + @override + late final _Translations$web$hi web = _Translations$web$hi._(_root); + @override + late final _Translations$assetPicker$hi assetPicker = _Translations$assetPicker$hi._(_root); + @override + late final _Translations$networkInterfacesPage$hi networkInterfacesPage = _Translations$networkInterfacesPage$hi._(_root); +} + +// Path: general +class _Translations$general$hi extends Translations$general$en { + _Translations$general$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get accept => 'स्वीकार करें'; + @override + String get accepted => 'स्वीकृत'; + @override + String get add => 'जोड़ें'; + @override + String get advanced => 'उन्नत'; + @override + String get cancel => 'रद्द करें'; + @override + String get close => 'बंद करें'; + @override + String get confirm => 'पुष्टि करें'; + @override + String get continueStr => 'जारी रखें'; + @override + String get copy => 'नकल करें'; + @override + String get copiedToClipboard => 'क्लिपबोर्ड पर कॉपी किया गया'; + @override + String get decline => 'अस्वीकार करें'; + @override + String get done => 'हो गया'; + @override + String get delete => 'हटाएं'; + @override + String get edit => 'संपादित करें'; + @override + String get error => 'त्रुटि'; + @override + String get example => 'उदाहरण'; + @override + String get files => 'फाइलें'; + @override + String get finished => 'समाप्त'; + @override + String get hide => 'छुपाएं'; + @override + String get off => 'बंद'; + @override + String get offline => 'ऑफ़लाइन'; + @override + String get on => 'चालू'; + @override + String get online => 'ऑनलाइन'; + @override + String get open => 'खोलें'; + @override + String get queue => 'कतार'; + @override + String get quickSave => 'त्वरित सहेजें'; + @override + String get quickSaveFromFavorites => '"पसंदीदा" के लिए त्वरित सहेजें'; + @override + String get renamed => 'नाम बदला गया'; + @override + String get reset => 'रीसेट करें'; + @override + String get restart => 'पुनः प्रारंभ करें'; + @override + String get settings => 'सेटिंग्स'; + @override + String get skipped => 'छोड़ा गया'; + @override + String get start => 'प्रारंभ करें'; + @override + String get stop => 'रोकें'; + @override + String get save => 'सहेजें'; + @override + String get unchanged => 'अपरिवर्तित'; + @override + String get unknown => 'अज्ञात'; + @override + String get noItemInClipboard => 'क्लिपबोर्ड में कोई आइटम नहीं है।'; +} + +// Path: receiveTab +class _Translations$receiveTab$hi extends Translations$receiveTab$en { + _Translations$receiveTab$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'प्राप्त करें'; + @override + late final _Translations$receiveTab$infoBox$hi infoBox = _Translations$receiveTab$infoBox$hi._(_root); + @override + late final _Translations$receiveTab$quickSave$hi quickSave = _Translations$receiveTab$quickSave$hi._(_root); +} + +// Path: sendTab +class _Translations$sendTab$hi extends Translations$sendTab$en { + _Translations$sendTab$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'भेजें'; + @override + late final _Translations$sendTab$selection$hi selection = _Translations$sendTab$selection$hi._(_root); + @override + late final _Translations$sendTab$picker$hi picker = _Translations$sendTab$picker$hi._(_root); + @override + String get shareIntentInfo => 'आप अपने मोबाइल डिवाइस की "शेयर" सुविधा का उपयोग करके फाइलें अधिक आसानी से चुन सकते हैं।'; + @override + String get nearbyDevices => 'निकटवर्ती उपकरण'; + @override + String get thisDevice => 'यह डिवाइस'; + @override + String get scan => 'उपकरणों को खोजें'; + @override + String get manualSending => 'मैन्युअल भेजना'; + @override + String get sendMode => 'भेजने का मोड'; + @override + late final _Translations$sendTab$sendModes$hi sendModes = _Translations$sendTab$sendModes$hi._(_root); + @override + String get sendModeHelp => 'व्याख्या'; + @override + String get help => 'कृपया सुनिश्चित करें कि वांछित लक्ष्य भी उसी वाई-फाई नेटवर्क पर हो।'; + @override + String get placeItems => 'साझा करने के लिए आइटम रखें।'; +} + +// Path: settingsTab +class _Translations$settingsTab$hi extends Translations$settingsTab$en { + _Translations$settingsTab$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'सेटिंग्स'; + @override + late final _Translations$settingsTab$general$hi general = _Translations$settingsTab$general$hi._(_root); + @override + late final _Translations$settingsTab$receive$hi receive = _Translations$settingsTab$receive$hi._(_root); + @override + late final _Translations$settingsTab$send$hi send = _Translations$settingsTab$send$hi._(_root); + @override + late final _Translations$settingsTab$network$hi network = _Translations$settingsTab$network$hi._(_root); + @override + late final _Translations$settingsTab$other$hi other = _Translations$settingsTab$other$hi._(_root); + @override + String get advancedSettings => 'उन्नत सेटिंग्स'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$hi extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'समस्या निवारण'; + @override + String get subTitle => 'क्या ऐप उम्मीद के मुताबिक काम नहीं कर रहा है? यहाँ आप कुछ सामान्य समाधान पा सकते हैं।'; + @override + String get solution => 'समाधान:'; + @override + String get fixButton => 'स्वतः ठीक करें'; + @override + late final _Translations$troubleshootPage$firewall$hi firewall = _Translations$troubleshootPage$firewall$hi._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$hi noDiscovery = _Translations$troubleshootPage$noDiscovery$hi._(_root); + @override + late final _Translations$troubleshootPage$noConnection$hi noConnection = _Translations$troubleshootPage$noConnection$hi._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$hi extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'इतिहास'; + @override + String get openFolder => 'फ़ोल्डर खोलें'; + @override + String get deleteHistory => 'इतिहास हटाएं'; + @override + String get empty => 'इतिहास खाली है।'; + @override + late final _Translations$receiveHistoryPage$entryActions$hi entryActions = _Translations$receiveHistoryPage$entryActions$hi._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$hi extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ऐप्स (APK)'; + @override + String get excludeSystemApps => 'सिस्टम ऐप्स को बाहर रखें'; + @override + String get excludeAppsWithoutLaunchIntent => 'लॉन्च न किए जा सकने वाले ऐप्स को बाहर रखें'; + @override + String apps({required Object n}) => '${n} ऐप्स'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$hi extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'सभी हटाएं'; +} + +// Path: receivePage +class _Translations$receivePage$hi extends Translations$receivePage$en { + _Translations$receivePage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('hi'))( + n, + one: 'आपको एक फाइल भेजना चाहता है', + other: 'आपको ${n} फाइलें भेजना चाहता है', + ); + @override + String get subTitleMessage => 'ने आपको एक संदेश भेजा:'; + @override + String get subTitleLink => 'ने आपको एक लिंक भेजा:'; + @override + String get canceled => 'प्रेषक ने अनुरोध रद्द कर दिया है।'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$hi extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'विकल्प'; + @override + String get destination => '@ : सेटिंग्सटैब.रिसीव.डेस्टिनेशन'; + @override + String get appDirectory => '(LocalSend फ़ोल्डर)'; + @override + String get saveToGallery => '@ : सेटिंग्सटैब.रिसीव.सेव टू गैलरी'; + @override + String get saveToGalleryOff => 'स्वचालित रूप से बंद कर दिया गया क्योंकि वहाँ निर्देशिकाएँ हैं।'; +} + +// Path: sendPage +class _Translations$sendPage$hi extends Translations$sendPage$en { + _Translations$sendPage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'प्रतिक्रिया का इंतजार कर रहे हैं ||'; + @override + String get rejected => 'प्राप्तकर्ता ने अनुरोध अस्वीकार कर दिया।'; + @override + String get tooManyAttempts => '@ : वेब. बहुत अधिक प्रयास'; + @override + String get busy => 'प्राप्तकर्ता किसी अन्य अनुरोध में व्यस्त है।'; +} + +// Path: progressPage +class _Translations$progressPage$hi extends Translations$progressPage$en { + _Translations$progressPage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'फ़ाइलें भेजी जा रही'; + @override + String get titleReceiving => 'फ़ाइलें प्राप्त की जा रही'; + @override + String get savedToGallery => 'गैलरी में सहेजा गया'; + @override + late final _Translations$progressPage$total$hi total = _Translations$progressPage$total$hi._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$hi extends Translations$webSharePage$en { + _Translations$webSharePage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'लिंक के माध्यम से साझा करें'; + @override + String get loading => 'सर्वर प्रारंभ हो रहा है ||'; + @override + String get stopping => 'सर्वर बंद हो रहा है ||'; + @override + String get error => 'सर्वर शुरू करते समय एक त्रुटि हुई।'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('hi'))( + n, + one: 'अपने ब्राउज़र में इस लिंक को खोलें:', + other: 'अपने ब्राउज़र में इन लिंक में से एक को खोलें:', + ); + @override + String get requests => 'अनुरोध'; + @override + String get noRequests => 'अभी तक कोई अनुरोध नहीं।'; + @override + String get encryption => '@ : सेटिंग्स टैब . नेटवर्क . एन्क्रिप्शन'; + @override + String get autoAccept => 'अनुरोधों को स्वचालित रूप से स्वीकार करें'; + @override + String get requirePin => 'पिन आवश्यक है'; + @override + String pinHint({required Object pin}) => 'पिन "${pin}" है'; + @override + String get encryptionHint => 'LocalSend एक स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग करता है। आपको इसे अपने ब्राउज़र में स्वीकार करना होगा।'; + @override + String pendingRequests({required Object n}) => 'लंबित अनुरोध: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$hi extends Translations$aboutPage$en { + _Translations$aboutPage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'LocalSend के बारे में'; + @override + List get description => [ + 'LocalSend एक मुफ्त, ओपन-सोर्स ऐप है जो आपको अपने स्थानीय नेटवर्क पर पास के डिवाइसों के साथ इंटरनेट कनेक्शन की आवश्यकता के बिना सुरक्षित रूप से फाइलें और संदेश साझा करने की अनुमति देता है।', + 'यह ऐप Android, iOS, macOS, Windows और Linux पर उपलब्ध है। आप सभी डाउनलोड विकल्पों को आधिकारिक होमपेज पर पा सकते हैं।', + ]; + @override + String get author => 'लेखक'; + @override + String get contributors => 'योगदानकर्ताओं'; + @override + String get packagers => 'पैकेजर्स'; + @override + String get translators => 'अनुवादकों'; +} + +// Path: donationPage +class _Translations$donationPage$hi extends Translations$donationPage$en { + _Translations$donationPage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'दान करें'; + @override + String get info => 'LocalSend मुफ्त, ओपन-सोर्स और बिना किसी विज्ञापन के है। यदि आपको ऐप पसंद है, तो आप विकास का समर्थन दान करके कर सकते हैं।'; + @override + String donate({required Object amount}) => 'दान करें ${amount}'; + @override + String get thanks => 'आपका हार्दिक धन्यवाद!'; + @override + String get restore => 'खरीदारी पुनर्स्थापित करें'; +} + +// Path: changelogPage +class _Translations$changelogPage$hi extends Translations$changelogPage$en { + _Translations$changelogPage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'परिवर्तन सूची'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$hi extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'प्यारा', + 'सुंदर', + 'बड़ा', + 'उज्ज्वल', + 'स्वच्छ', + 'चतुर', + 'शांत', + 'प्यारा', + 'चालाक', + 'दृढ़निश्चयी', + 'ऊर्जावान', + 'कुशल', + 'शानदार', + 'तेज', + 'अच्छा', + 'ताजा', + 'अच्छा', + 'गजब का', + 'महान', + 'सुडौल', + 'गर्म', + 'दयालु', + 'सुंदर', + 'रहस्यमय', + 'साफ-सुथरा', + 'अच्छा', + 'धैर्यवान', + 'सुंदर', + 'शक्तिशाली', + 'धनी', + 'गुप्त', + 'स्मार्ट', + 'ठोस', + 'विशेष', + 'रणनीतिक', + 'मजबूत', + 'साफ-सुथरा', + 'बुद्धिमान', + ]; + @override + List get fruits => [ + 'सेब', + 'एवोकाडो', + 'केला', + 'ब्लैकबेरी', + 'ब्लूबेरी', + 'ब्रोकली', + 'गाजर', + 'चेरी', + 'नारियल', + 'अंगूर', + 'नींबू', + 'सलाद पत्ता', + 'आम', + 'खरबूजा', + 'मशरूम', + 'प्याज', + 'संतरा', + 'पपीता', + 'आड़ू', + 'नाशपाती', + 'अनानास', + 'आलू', + 'कद्दू', + 'रसभरी', + 'स्ट्रॉबेरी', + 'टमाटर', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$hi extends Translations$dialogs$en { + _Translations$dialogs$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$hi addFile = _Translations$dialogs$addFile$hi._(_root); + @override + late final _Translations$dialogs$openFile$hi openFile = _Translations$dialogs$openFile$hi._(_root); + @override + late final _Translations$dialogs$addressInput$hi addressInput = _Translations$dialogs$addressInput$hi._(_root); + @override + late final _Translations$dialogs$cancelSession$hi cancelSession = _Translations$dialogs$cancelSession$hi._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$hi cannotOpenFile = _Translations$dialogs$cannotOpenFile$hi._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$hi encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$hi._(_root); + @override + late final _Translations$dialogs$errorDialog$hi errorDialog = _Translations$dialogs$errorDialog$hi._(_root); + @override + late final _Translations$dialogs$favoriteDialog$hi favoriteDialog = _Translations$dialogs$favoriteDialog$hi._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$hi favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$hi._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$hi favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$hi._(_root); + @override + late final _Translations$dialogs$fileInfo$hi fileInfo = _Translations$dialogs$fileInfo$hi._(_root); + @override + late final _Translations$dialogs$fileNameInput$hi fileNameInput = _Translations$dialogs$fileNameInput$hi._(_root); + @override + late final _Translations$dialogs$historyClearDialog$hi historyClearDialog = _Translations$dialogs$historyClearDialog$hi._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$hi localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$hi._(_root); + @override + late final _Translations$dialogs$messageInput$hi messageInput = _Translations$dialogs$messageInput$hi._(_root); + @override + late final _Translations$dialogs$noFiles$hi noFiles = _Translations$dialogs$noFiles$hi._(_root); + @override + late final _Translations$dialogs$noPermission$hi noPermission = _Translations$dialogs$noPermission$hi._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$hi notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$hi._(_root); + @override + late final _Translations$dialogs$qr$hi qr = _Translations$dialogs$qr$hi._(_root); + @override + late final _Translations$dialogs$quickActions$hi quickActions = _Translations$dialogs$quickActions$hi._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$hi quickSaveNotice = _Translations$dialogs$quickSaveNotice$hi._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$hi quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$hi._(_root); + @override + late final _Translations$dialogs$pin$hi pin = _Translations$dialogs$pin$hi._(_root); + @override + late final _Translations$dialogs$sendModeHelp$hi sendModeHelp = _Translations$dialogs$sendModeHelp$hi._(_root); + @override + late final _Translations$dialogs$zoom$hi zoom = _Translations$dialogs$zoom$hi._(_root); +} + +// Path: sanitization +class _Translations$sanitization$hi extends Translations$sanitization$en { + _Translations$sanitization$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get empty => 'फ़ाइल नाम खाली नहीं हो सकता'; + @override + String get invalid => 'फ़ाइल नाम में अमान्य वर्ण हैं'; +} + +// Path: tray +class _Translations$tray$hi extends Translations$tray$en { + _Translations$tray$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'LocalSend बंद करें'; + @override + String get closeWindows => 'बाहर जाएं।'; +} + +// Path: web +class _Translations$web$hi extends Translations$web$en { + _Translations$web$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'PIN दर्ज करें'; + @override + String get invalidPin => 'अमान्य PIN'; + @override + String get tooManyAttempts => 'बहुत अधिक प्रयास'; + @override + String get rejected => 'अस्वीकृत'; + @override + String get files => 'फ़ाइलें'; + @override + String get fileName => 'फ़ाइल नाम'; + @override + String get size => 'आकार'; +} + +// Path: assetPicker +class _Translations$assetPicker$hi extends Translations$assetPicker$en { + _Translations$assetPicker$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'पुष्ट करें'; + @override + String get cancel => 'रद्द करें'; + @override + String get edit => 'संपादित करें'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'लोड विफल'; + @override + String get original => 'मूल'; + @override + String get preview => 'पूर्वावलोकन'; + @override + String get select => 'चुनें'; + @override + String get emptyList => 'खाली सूची'; + @override + String get unSupportedAssetType => 'असमर्थित फ़ाइल प्रकार।'; + @override + String get unableToAccessAll => 'डिवाइस पर सभी फ़ाइलों तक पहुंच असमर्थ'; + @override + String get viewingLimitedAssetsTip => 'केवल उन फ़ाइलों और एलबमों को देखें जो ऐप तक पहुंच योग्य हैं।'; + @override + String get changeAccessibleLimitedAssets => 'पहुंच योग्य फ़ाइलों को अपडेट करने के लिए क्लिक करें'; + @override + String get accessAllTip => + 'ऐप डिवाइस पर केवल कुछ फ़ाइलों तक पहुंच सकता है। सिस्टम सेटिंग्स पर जाएं और ऐप को डिवाइस पर सभी मीडिया तक पहुंच की अनुमति दें।'; + @override + String get goToSystemSettings => 'सिस्टम सेटिंग्स पर जाएं'; + @override + String get accessLimitedAssets => 'सीमित पहुंच के साथ जारी रखें'; + @override + String get accessiblePathName => 'पहुंच योग्य फ़ाइलें'; + @override + String get sTypeAudioLabel => 'ऑडियो'; + @override + String get sTypeImageLabel => 'फोटो'; + @override + String get sTypeVideoLabel => 'वीडियो'; + @override + String get sTypeOtherLabel => 'अन्य मीडिया'; + @override + String get sActionPlayHint => 'चलाएँ'; + @override + String get sActionPreviewHint => 'पूर्वावलोकन'; + @override + String get sActionSelectHint => 'चुनें'; + @override + String get sActionSwitchPathLabel => 'मार्ग बदलें'; + @override + String get sActionUseCameraHint => 'कैमरा का उपयोग करें'; + @override + String get sNameDurationLabel => 'अवधि'; + @override + String get sUnitAssetCountLabel => 'गणना'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$hi extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'नेटवर्क इंटरफेस'; + @override + String get info => + 'डिफ़ॉल्ट रूप से, LocalSend सभी उपलब्ध नेटवर्क इंटरफेस का उपयोग करता है। आप यहां अवांछित नेटवर्क को बाहर कर सकते हैं। परिवर्तनों को लागू करने के लिए आपको सर्वर को पुनः आरंभ करना होगा।'; + @override + String get preview => 'पूर्वावलोकन'; + @override + String get whitelist => 'श्वेतसूची'; + @override + String get blacklist => 'काले सूची'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$hi extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'पोर्ट:'; + @override + String get alias => 'डिवाइस का नाम:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$hi extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'पसंदीदा'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$hi extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'चयन'; + @override + String files({required Object files}) => 'फाइलें: ${files}'; + @override + String size({required Object size}) => 'साइज़: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$hi extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get file => 'फाइल'; + @override + String get folder => 'फ़ोल्डर'; + @override + String get media => 'मीडिया'; + @override + String get text => 'पाठ'; + @override + String get app => 'एप'; + @override + String get clipboard => 'पेस्ट'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$hi extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get single => 'एकल प्राप्तकर्ता'; + @override + String get multiple => 'एकाधिक प्राप्तकर्ता'; + @override + String get link => 'लिंक के माध्यम से साझा करें'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$hi extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'सामान्य'; + @override + String get brightness => 'थीम'; + @override + late final _Translations$settingsTab$general$brightnessOptions$hi brightnessOptions = _Translations$settingsTab$general$brightnessOptions$hi._( + _root, + ); + @override + String get color => 'रंग'; + @override + late final _Translations$settingsTab$general$colorOptions$hi colorOptions = _Translations$settingsTab$general$colorOptions$hi._(_root); + @override + String get language => 'भाषा'; + @override + late final _Translations$settingsTab$general$languageOptions$hi languageOptions = _Translations$settingsTab$general$languageOptions$hi._(_root); + @override + String get saveWindowPlacement => 'बंद करें: विंडो प्लेसमेंट सहेजें'; + @override + String get saveWindowPlacementWindows => 'बाहर निकलने के बाद विंडो की स्थिति सहेजें'; + @override + String get minimizeToTray => 'बंद करें: ट्रे/मेनू बार में मिनिमाइज करें'; + @override + String get launchAtStartup => 'लॉगिन के बाद ऑटोस्टार्ट'; + @override + String get launchMinimized => 'ऑटोस्टार्ट: छुपा हुआ प्रारंभ करें'; + @override + String get showInContextMenu => 'कॉन्टेक्स्ट मेनू में LocalSend दिखाएं'; + @override + String get animations => 'एनिमेशन'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$hi extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'प्राप्त करें'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'स्वतः समाप्त'; + @override + String get destination => 'गंतव्य'; + @override + String get downloads => '(डाउनलोड्स)'; + @override + String get saveToGallery => 'मीडिया को गैलरी में सहेजें'; + @override + String get saveToHistory => 'इतिहास में सहेजें'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$hi extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'भेजें'; + @override + String get shareViaLinkAutoAccept => 'लिंक के माध्यम से साझा करें: स्वतः स्वीकार'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$hi extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'नेटवर्क'; + @override + String get needRestart => 'सेटिंग्स लागू करने के लिए सर्वर को पुनः प्रारंभ करें!'; + @override + String get server => 'सर्वर'; + @override + String get alias => 'डिवाइस का नाम'; + @override + String get deviceType => 'डिवाइस का प्रकार'; + @override + String get deviceModel => 'डिवाइस का मॉडल'; + @override + String get port => 'पोर्ट'; + @override + String get discoveryTimeout => 'खोज का समय समाप्त'; + @override + String get useSystemName => 'सिस्टम नाम का उपयोग करें'; + @override + String get generateRandomAlias => 'रैंडम उपनाम जनरेट करें'; + @override + String portWarning({required Object defaultPort}) => + 'आप कस्टम पोर्ट का उपयोग कर रहे हैं इसलिए अन्य डिवाइस आपको पहचान नहीं सकते हैं। (डिफ़ॉल्ट: ${defaultPort})'; + @override + String get encryption => 'एन्क्रिप्शन'; + @override + String get multicastGroup => 'मल्टीकास्ट'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'आप कस्टम मल्टीकास्ट पते का उपयोग कर रहे हैं इसलिए अन्य डिवाइस आपको पहचान नहीं सकते हैं। (डिफ़ॉल्ट: ${defaultMulticast})'; + @override + String get network => 'नेटवर्क'; + @override + late final _Translations$settingsTab$network$networkOptions$hi networkOptions = _Translations$settingsTab$network$networkOptions$hi._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$hi extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'अन्य'; + @override + String get support => 'LocalSend का समर्थन करें'; + @override + String get donate => 'दान करें'; + @override + String get privacyPolicy => 'गोपनीयता नीति'; + @override + String get termsOfUse => 'उपयोग की शर्तें'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$hi extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'यह ऐप अन्य उपकरणों को फाइल भेज सकता है; लेकिन अन्य उपकरण इस डिवाइस को फाइल नहीं भेज सकते।'; + @override + String solution({required Object port}) => + 'यह संभवतः फ़ायरवॉल समस्या है। आप इसे पोर्ट ${port} पर आने वाले कनेक्शनों (UDP और TCP) को अनुमति देकर हल कर सकते हैं।'; + @override + String get openFirewall => 'फायरवॉल खोलें'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$hi extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'यह डिवाइस अन्य डिवाइसों को ढूंढ नहीं सकता।'; + @override + String get solution => + 'सुनिश्चित करें कि सभी डिवाइस एक ही वाई-फाई नेटवर्क से जुड़े हों। पोर्ट, मल्टीकास्ट पता और एन्क्रिप्शन की सेटिंग्स समान होनी चाहिए। यदि डिवाइस नहीं मिलता है, तो लक्ष्य डिवाइस का आईपी पता स्वयं दर्ज करें। अगर यह काम करता है, तो डिवाइस को पसंदीदा में सहेजें ताकि भविष्य में स्वचालित रूप से मिल सके।'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$hi extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'दोनों उपकरण एक दूसरे को खोज नहीं सकते और न ही वे फाइल साझा कर सकते हैं।'; + @override + String get solution => + 'क्या समस्या दोनों तरफ मौजूद है? अगर हाँ, तो आपको यह सुनिश्चित करना होगा कि दोनों डिवाइस एक ही वाई-फ़ाई नेटवर्क पर हैं और एक ही कॉन्फ़िगरेशन (पोर्ट, मल्टीकास्ट पता, एन्क्रिप्शन) साझा करते हैं। नेटवर्क प्रतिभागियों के बीच संचार की अनुमति नहीं दे सकता है। इस मामले में, यह विकल्प राउटर पर सक्षम होना चाहिए।'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$hi extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get open => 'फाइल खोलें'; + @override + String get showInFolder => 'फ़ोल्डर में दिखाएं'; + @override + String get info => 'जानकारी'; + @override + String get deleteFromHistory => 'इतिहास से हटाएं'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$hi extends Translations$progressPage$total$en { + _Translations$progressPage$total$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$hi title = _Translations$progressPage$total$title$hi._(_root); + @override + String count({required Object curr, required Object n}) => 'फाइलें: ${curr}/${n}'; + @override + String size({required Object curr, required Object n}) => 'आकार: ${curr}/${n}'; + @override + String speed({required Object speed}) => 'गति: ${speed}/सेकंड'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$hi extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'फाइल जोड़ें'; + @override + String get content => 'आप क्या जोड़ना चाहते हैं?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$hi extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'फ़ाइल खोलें'; + @override + String get content => 'क्या आप प्राप्त फ़ाइल खोलना चाहते हैं?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$hi extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'पता दर्ज करें'; + @override + String get hashtag => 'हैशटैग'; + @override + String get ip => 'IP पता'; + @override + String get recentlyUsed => 'हाल ही में उपयोग किया गया: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$hi extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'फ़ाइल स्थानांतरण रद्द करें'; + @override + String get content => 'क्या आप वास्तव में फ़ाइल स्थानांतरण रद्द करना चाहते हैं?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$hi extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'फ़ाइल नहीं खोल सकते'; + @override + String content({required Object file}) => '"${file}" खोल नहीं सके। क्या यह फ़ाइल स्थानांतरित कर दी गई या नाम बदला या हटा दिया गया है?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$hi extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'एन्क्रिप्शन अक्षम'; + @override + String get content => + 'अब संचार बिना एन्क्रिप्ट किए हुए HTTP प्रोटोकॉल के माध्यम से होता है। HTTPS का उपयोग करने के लिए, एन्क्रिप्शन को फिर से सक्षम करें।'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$hi extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$hi extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'पसंदीदा'; + @override + String get noFavorites => 'अभी तक कोई पसंदीदा डिवाइस नहीं है।'; + @override + String get addFavorite => 'जोड़ें'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$hi extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'पसंदीदा से हटाएँ'; + @override + String content({required Object name}) => 'क्या आप वास्तव में "${name}" को पसंदीदा से हटाना चाहते हैं?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$hi extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'पसंदीदा में जोड़ें'; + @override + String get titleEdit => 'सेटिंग्स'; + @override + String get name => 'डिवाइस नाम'; + @override + String get auto => '(auto)'; + @override + String get ip => 'IP पता'; + @override + String get port => 'पोर्ट'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$hi extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'फ़ाइल की जानकारी'; + @override + String get fileName => 'फ़ाइल का नाम:'; + @override + String get path => 'पथ:'; + @override + String get size => 'आकार:'; + @override + String get sender => 'प्रेषक:'; + @override + String get time => 'समय:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$hi extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'फ़ाइल का नाम दर्ज करें'; + @override + String original({required Object original}) => 'मूल: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$hi extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'इतिहास साफ करें'; + @override + String get content => 'क्या आप वास्तव में पूरे इतिहास को हटाना चाहते हैं?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$hi extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend स्थानीय नेटवर्क को स्कैन करने की अनुमति के बिना अन्य डिवाइसों को नहीं ढूंढ सकता। कृपया सेटिंग्स में यह अनुमति दें।'; + @override + String get gotoSettings => 'सेटिंग्स'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$hi extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'संदेश टाइप करें'; + @override + String get multiline => 'मल्टीलाइन'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$hi extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'कोई फ़ाइल चयनित नहीं'; + @override + String get content => 'कृपया कम से कम एक फ़ाइल का चयन करें।'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$hi extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'अनुमति नहीं'; + @override + String get content => 'आपने आवश्यक अनुमतियाँ नहीं दी हैं। कृपया सेटिंग्स में उन्हें अनुमति दें।'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$hi extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'उपलब्ध नहीं'; + @override + String get content => 'यह सुविधा केवल यहां उपलब्ध है:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$hi extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR कोड'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$hi extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'त्वरित क्रियाएँ'; + @override + String get counter => 'काउंटर'; + @override + String get prefix => 'प्रिफिक्स'; + @override + String get padZero => 'शून्य के साथ पैड करें'; + @override + String get sortBeforeCount => 'पहले वर्णानुक्रम में क्रमबद्ध करें'; + @override + String get random => 'यादृच्छिक'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$hi extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => '@:सामान्य.जल्दी सहेजें'; + @override + String get content => 'फ़ाइल अनुरोध स्वचालित रूप से स्वीकार कर लिए जाते हैं। ध्यान दें कि स्थानीय नेटवर्क पर सभी लोग आपको फ़ाइलें भेज सकते हैं।'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$hi extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => '@ : सामान्य .जल्दी पसंदीदा से सहेजें'; + @override + List get content => [ + 'अब आपके पसंदीदा सूची में शामिल डिवाइसों से फ़ाइल अनुरोध स्वतः स्वीकार किए जाएंगे।', + 'चेतावनी! वर्तमान में, यह पूरी तरह से सुरक्षित नहीं है, क्योंकि कोई हैकर जो आपकी पसंदीदा सूची में शामिल किसी भी डिवाइस का फ़िंगरप्रिंट प्राप्त कर लेता है, वह बिना किसी प्रतिबंध के आपको फ़ाइलें भेज सकता है।', + 'हालांकि, यह विकल्प अभी भी उन सभी उपयोगकर्ताओं को बिना प्रतिबंध फ़ाइलें भेजने की अनुमति देने की तुलना में सुरक्षित है, जो स्थानीय नेटवर्क पर हैं।', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$hi extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'PIN दर्ज करें'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$hi extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'भेजने के मोड'; + @override + String get single => 'एक प्राप्तकर्ता को फ़ाइलें भेजता है। फ़ाइल ट्रांसफर समाप्त होने के बाद चयन हटा दिया जाएगा।'; + @override + String get multiple => 'कई प्राप्तकर्ताओं को फ़ाइलें भेजता है। चयन हटाया नहीं जाएगा।'; + @override + String get link => 'जिन प्राप्तकर्ताओं के पास LocalSend इंस्टॉल नहीं है, वे अपने ब्राउज़र में लिंक खोलकर चयनित फ़ाइलें डाउनलोड कर सकते हैं।'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$hi extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$hi extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get system => 'सिस्टम'; + @override + String get dark => 'डार्क'; + @override + String get light => 'लाइट'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$hi extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get system => 'सिस्टम'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$hi extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get system => 'सिस्टम'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$hi extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String get all => 'सब'; + @override + String get filtered => 'परिष्कृत'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$hi extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$hi._(TranslationsHi root) : this._root = root, super.internal(root); + + final TranslationsHi _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'कुल प्रगति (${time})'; + @override + String get finishedError => 'त्रुटि के साथ समाप्त हुआ'; + @override + String get canceledSender => 'प्रेषक द्वारा रद्द किया गया'; + @override + String get canceledReceiver => 'प्राप्तकर्ता द्वारा रद्द किया गया'; +} diff --git a/app/lib/gen/strings_hu.g.dart b/app/lib/gen/strings_hu.g.dart new file mode 100644 index 0000000..7129f07 --- /dev/null +++ b/app/lib/gen/strings_hu.g.dart @@ -0,0 +1,1437 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsHu extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsHu({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.hu, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsHu _root = this; // ignore: unused_field + + @override + TranslationsHu $copyWith({TranslationMetadata? meta}) => TranslationsHu(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Magyar'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$hu general = _Translations$general$hu._(_root); + @override + late final _Translations$receiveTab$hu receiveTab = _Translations$receiveTab$hu._(_root); + @override + late final _Translations$sendTab$hu sendTab = _Translations$sendTab$hu._(_root); + @override + late final _Translations$settingsTab$hu settingsTab = _Translations$settingsTab$hu._(_root); + @override + late final _Translations$troubleshootPage$hu troubleshootPage = _Translations$troubleshootPage$hu._(_root); + @override + late final _Translations$receiveHistoryPage$hu receiveHistoryPage = _Translations$receiveHistoryPage$hu._(_root); + @override + late final _Translations$apkPickerPage$hu apkPickerPage = _Translations$apkPickerPage$hu._(_root); + @override + late final _Translations$selectedFilesPage$hu selectedFilesPage = _Translations$selectedFilesPage$hu._(_root); + @override + late final _Translations$receivePage$hu receivePage = _Translations$receivePage$hu._(_root); + @override + late final _Translations$receiveOptionsPage$hu receiveOptionsPage = _Translations$receiveOptionsPage$hu._(_root); + @override + late final _Translations$sendPage$hu sendPage = _Translations$sendPage$hu._(_root); + @override + late final _Translations$progressPage$hu progressPage = _Translations$progressPage$hu._(_root); + @override + late final _Translations$webSharePage$hu webSharePage = _Translations$webSharePage$hu._(_root); + @override + late final _Translations$aboutPage$hu aboutPage = _Translations$aboutPage$hu._(_root); + @override + late final _Translations$donationPage$hu donationPage = _Translations$donationPage$hu._(_root); + @override + late final _Translations$changelogPage$hu changelogPage = _Translations$changelogPage$hu._(_root); + @override + late final _Translations$dialogs$hu dialogs = _Translations$dialogs$hu._(_root); + @override + late final _Translations$sanitization$hu sanitization = _Translations$sanitization$hu._(_root); + @override + late final _Translations$tray$hu tray = _Translations$tray$hu._(_root); + @override + late final _Translations$web$hu web = _Translations$web$hu._(_root); + @override + late final _Translations$assetPicker$hu assetPicker = _Translations$assetPicker$hu._(_root); + @override + late final _Translations$networkInterfacesPage$hu networkInterfacesPage = _Translations$networkInterfacesPage$hu._(_root); +} + +// Path: general +class _Translations$general$hu extends Translations$general$en { + _Translations$general$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Elfogad'; + @override + String get accepted => 'Elfogadva'; + @override + String get add => 'Hozzáad'; + @override + String get advanced => 'Haladó'; + @override + String get cancel => 'Mégse'; + @override + String get close => 'Bezár'; + @override + String get confirm => 'Megerősít'; + @override + String get continueStr => 'Folytat'; + @override + String get copy => 'Másol'; + @override + String get copiedToClipboard => 'Másolva a vágólapra'; + @override + String get decline => 'Elutasít'; + @override + String get done => 'Kész'; + @override + String get delete => 'Töröl'; + @override + String get edit => 'Szerkeszt'; + @override + String get error => 'Hiba'; + @override + String get example => 'Példa'; + @override + String get files => 'Fájlok'; + @override + String get finished => 'Befejezve'; + @override + String get hide => 'Elrejt'; + @override + String get off => 'Ki'; + @override + String get offline => 'Offline'; + @override + String get on => 'Be'; + @override + String get online => 'Online'; + @override + String get open => 'Megnyit'; + @override + String get queue => 'Várósor'; + @override + String get quickSave => 'Autom. mentés'; + @override + String get quickSaveFromFavorites => 'Gyors mentés a "Kedvencek"-hez'; + @override + String get renamed => 'Átnevezve'; + @override + String get reset => 'Reset'; + @override + String get restart => 'Újraindít'; + @override + String get settings => 'Beállítások'; + @override + String get skipped => 'Kihagyva'; + @override + String get start => 'Start'; + @override + String get stop => 'Stop'; + @override + String get save => 'Ment'; + @override + String get unchanged => 'Változatlan'; + @override + String get unknown => 'Ismeretlen'; + @override + String get noItemInClipboard => 'Nincs semmi a vágólapon.'; +} + +// Path: receiveTab +class _Translations$receiveTab$hu extends Translations$receiveTab$en { + _Translations$receiveTab$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Fogadás'; + @override + late final _Translations$receiveTab$infoBox$hu infoBox = _Translations$receiveTab$infoBox$hu._(_root); + @override + late final _Translations$receiveTab$quickSave$hu quickSave = _Translations$receiveTab$quickSave$hu._(_root); +} + +// Path: sendTab +class _Translations$sendTab$hu extends Translations$sendTab$en { + _Translations$sendTab$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Küldés'; + @override + late final _Translations$sendTab$selection$hu selection = _Translations$sendTab$selection$hu._(_root); + @override + late final _Translations$sendTab$picker$hu picker = _Translations$sendTab$picker$hu._(_root); + @override + String get shareIntentInfo => 'A fájlok könnyebb kiválasztásához használhatja mobileszköze "Megosztás" funkcióját is.'; + @override + String get nearbyDevices => 'Közeli eszközök'; + @override + String get thisDevice => 'Ez az eszköz'; + @override + String get scan => 'Keressen eszközöket'; + @override + String get manualSending => 'Manuális küldés'; + @override + String get sendMode => 'Küldési mód'; + @override + late final _Translations$sendTab$sendModes$hu sendModes = _Translations$sendTab$sendModes$hu._(_root); + @override + String get sendModeHelp => 'Magyarázat'; + @override + String get help => 'Győződjön meg arról, hogy a kívánt eszköz is ugyanazon a wifi hálózaton van.'; + @override + String get placeItems => 'Helyezze el a megosztandó elemeket.'; +} + +// Path: settingsTab +class _Translations$settingsTab$hu extends Translations$settingsTab$en { + _Translations$settingsTab$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Beállítások'; + @override + late final _Translations$settingsTab$general$hu general = _Translations$settingsTab$general$hu._(_root); + @override + late final _Translations$settingsTab$receive$hu receive = _Translations$settingsTab$receive$hu._(_root); + @override + late final _Translations$settingsTab$send$hu send = _Translations$settingsTab$send$hu._(_root); + @override + late final _Translations$settingsTab$network$hu network = _Translations$settingsTab$network$hu._(_root); + @override + late final _Translations$settingsTab$other$hu other = _Translations$settingsTab$other$hu._(_root); + @override + String get advancedSettings => 'Haladó beállítások'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$hu extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hibaelhárítás'; + @override + String get subTitle => 'Az alkalmazás nem a várt módon működik? Itt találhat általános megoldásokat.'; + @override + String get solution => 'Megoldás:'; + @override + String get fixButton => 'Autom. javítás'; + @override + late final _Translations$troubleshootPage$firewall$hu firewall = _Translations$troubleshootPage$firewall$hu._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$hu noDiscovery = _Translations$troubleshootPage$noDiscovery$hu._(_root); + @override + late final _Translations$troubleshootPage$noConnection$hu noConnection = _Translations$troubleshootPage$noConnection$hu._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$hu extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Előzmény'; + @override + String get openFolder => 'Mappa megnyitása'; + @override + String get deleteHistory => 'Előzmény törlése'; + @override + String get empty => 'Még nincs előzmény.'; + @override + late final _Translations$receiveHistoryPage$entryActions$hu entryActions = _Translations$receiveHistoryPage$entryActions$hu._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$hu extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Appok (APK)'; + @override + String get excludeSystemApps => 'Rendszeralkalmazások kizárása'; + @override + String get excludeAppsWithoutLaunchIntent => 'A nem indítható alkalmazások kizárása'; + @override + String apps({required Object n}) => '${n} app'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$hu extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Összes törlése'; +} + +// Path: receivePage +class _Translations$receivePage$hu extends Translations$receivePage$en { + _Translations$receivePage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('hu'))( + n, + one: 'fájlt szeretne küldeni', + other: '${n} fájlt szeretne küldeni', + ); + @override + String get subTitleMessage => 'üzenetet küldött:'; + @override + String get subTitleLink => 'Linket küldött:'; + @override + String get canceled => 'A küldő visszavonta a kérést.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$hu extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Opciók'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend mappa)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Automatikusan kikapcsol, mert vannak könyvtárak.'; +} + +// Path: sendPage +class _Translations$sendPage$hu extends Translations$sendPage$en { + _Translations$sendPage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Válaszra várva…'; + @override + String get rejected => 'A fogadó elutasította a kérelmet.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'A fogadó más kéréssel van elfoglalva.'; +} + +// Path: progressPage +class _Translations$progressPage$hu extends Translations$progressPage$en { + _Translations$progressPage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Fájlok küldése'; + @override + String get titleReceiving => 'Fájlok fogadása'; + @override + String get savedToGallery => 'Mentve a Galériába'; + @override + late final _Translations$progressPage$total$hu total = _Translations$progressPage$total$hu._(_root); + @override + late final _Translations$progressPage$remainingTime$hu remainingTime = _Translations$progressPage$remainingTime$hu._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$hu extends Translations$webSharePage$en { + _Translations$webSharePage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Megosztás linkben'; + @override + String get loading => 'Szerver indítása…'; + @override + String get stopping => 'Szerver leállítása…'; + @override + String get error => 'Hiba történt a szerver indításakor.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('hu'))( + n, + one: 'Nyissa meg ezt a hivatkozást böngészőben:', + other: 'Nyissa meg a linkek egyikét a böngészőben:', + ); + @override + String get requests => 'Kérések'; + @override + String get noRequests => 'Még nincsenek kérések.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Kérések automatikus elfogadása'; + @override + String get requirePin => 'PIN kód megkövetelése'; + @override + String pinHint({required Object pin}) => 'A PIN kód "${pin}"'; + @override + String get encryptionHint => 'A LocalSend a saját aláírt tanúsítványt használja. A böngészőben kell elfogadnod.'; + @override + String pendingRequests({required Object n}) => 'Függőben lévő kérések: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$hu extends Translations$aboutPage$en { + _Translations$aboutPage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'A LocalSend'; + @override + List get description => [ + 'A LocalSend egy ingyenes, nyílt forráskódú alkalmazás, amely lehetővé teszi a fájlok és üzenetek biztonságos megosztását a közeli eszközökkel a helyi hálózaton keresztül, internet kapcsolat nélkül.', + 'Ez az alkalmazás Android, iOS, macOS, Windows és Linux rendszereken érhető el. Az összes letöltési lehetőséget megtalálja a hivatalos honlapon.', + ]; + @override + String get author => 'Szerző'; + @override + String get contributors => 'Közreműködők'; + @override + String get packagers => 'Csomagolók'; + @override + String get translators => 'Fordítók'; +} + +// Path: donationPage +class _Translations$donationPage$hu extends Translations$donationPage$en { + _Translations$donationPage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Adomány'; + @override + String get info => + 'A LocalSend ingyenes, nyílt forráskódú és hirdetések nélküli. Ha megtetszett az alkalmazás, adományával támogathatja a fejlesztést.'; + @override + String donate({required Object amount}) => 'Adomány ${amount}'; + @override + String get thanks => 'Köszönöm szépen!'; + @override + String get restore => 'Vásárlás visszaállítása'; +} + +// Path: changelogPage +class _Translations$changelogPage$hu extends Translations$changelogPage$en { + _Translations$changelogPage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Változásnapló'; +} + +// Path: dialogs +class _Translations$dialogs$hu extends Translations$dialogs$en { + _Translations$dialogs$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$hu addFile = _Translations$dialogs$addFile$hu._(_root); + @override + late final _Translations$dialogs$openFile$hu openFile = _Translations$dialogs$openFile$hu._(_root); + @override + late final _Translations$dialogs$addressInput$hu addressInput = _Translations$dialogs$addressInput$hu._(_root); + @override + late final _Translations$dialogs$cancelSession$hu cancelSession = _Translations$dialogs$cancelSession$hu._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$hu cannotOpenFile = _Translations$dialogs$cannotOpenFile$hu._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$hu encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$hu._(_root); + @override + late final _Translations$dialogs$errorDialog$hu errorDialog = _Translations$dialogs$errorDialog$hu._(_root); + @override + late final _Translations$dialogs$favoriteDialog$hu favoriteDialog = _Translations$dialogs$favoriteDialog$hu._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$hu favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$hu._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$hu favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$hu._(_root); + @override + late final _Translations$dialogs$fileInfo$hu fileInfo = _Translations$dialogs$fileInfo$hu._(_root); + @override + late final _Translations$dialogs$fileNameInput$hu fileNameInput = _Translations$dialogs$fileNameInput$hu._(_root); + @override + late final _Translations$dialogs$historyClearDialog$hu historyClearDialog = _Translations$dialogs$historyClearDialog$hu._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$hu localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$hu._(_root); + @override + late final _Translations$dialogs$messageInput$hu messageInput = _Translations$dialogs$messageInput$hu._(_root); + @override + late final _Translations$dialogs$noFiles$hu noFiles = _Translations$dialogs$noFiles$hu._(_root); + @override + late final _Translations$dialogs$noPermission$hu noPermission = _Translations$dialogs$noPermission$hu._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$hu notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$hu._(_root); + @override + late final _Translations$dialogs$qr$hu qr = _Translations$dialogs$qr$hu._(_root); + @override + late final _Translations$dialogs$quickActions$hu quickActions = _Translations$dialogs$quickActions$hu._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$hu quickSaveNotice = _Translations$dialogs$quickSaveNotice$hu._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$hu quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$hu._(_root); + @override + late final _Translations$dialogs$pin$hu pin = _Translations$dialogs$pin$hu._(_root); + @override + late final _Translations$dialogs$sendModeHelp$hu sendModeHelp = _Translations$dialogs$sendModeHelp$hu._(_root); + @override + late final _Translations$dialogs$zoom$hu zoom = _Translations$dialogs$zoom$hu._(_root); +} + +// Path: sanitization +class _Translations$sanitization$hu extends Translations$sanitization$en { + _Translations$sanitization$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get empty => 'A fájlnév nem lehet üres'; + @override + String get invalid => 'A fájlnév érvénytelen karaktereket tartalmaz'; +} + +// Path: tray +class _Translations$tray$hu extends Translations$tray$en { + _Translations$tray$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Kilépés'; + @override + String get closeWindows => 'Kilépés'; +} + +// Path: web +class _Translations$web$hu extends Translations$web$en { + _Translations$web$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'PIN kód megadása'; + @override + String get invalidPin => 'Érvénytelen a PIN'; + @override + String get tooManyAttempts => 'Túl sok kísérlet'; + @override + String get rejected => 'Elutasítva'; + @override + String get files => 'Fájl'; + @override + String get fileName => 'Fájlnév'; + @override + String get size => 'Méret'; +} + +// Path: assetPicker +class _Translations$assetPicker$hu extends Translations$assetPicker$en { + _Translations$assetPicker$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Megerősít'; + @override + String get cancel => 'Mégse'; + @override + String get edit => 'Szerkeszt'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'A betöltés sikertelen'; + @override + String get original => 'Eredeti'; + @override + String get preview => 'Előnézet'; + @override + String get select => 'Válasszon'; + @override + String get emptyList => 'Üres lista'; + @override + String get unSupportedAssetType => 'Nem támogatott fájl típus.'; + @override + String get unableToAccessAll => 'Nem lehet hozzáférni az eszközön lévő összes fájlhoz'; + @override + String get viewingLimitedAssetsTip => 'Csak az app által elérhető fájlok és albumok megtekintése.'; + @override + String get changeAccessibleLimitedAssets => 'Koppintson az elérhető fájlok frissítéséhez'; + @override + String get accessAllTip => + 'Az alkalmazás csak néhány fájlhoz férhet hozzá az eszközön. Nyissa meg a rendszerbeállításokat és engedélyezze az alkalmazás számára, hogy hozzáférjen az eszközön lévő összes médiafájlhoz.'; + @override + String get goToSystemSettings => 'Lépjen a rendszer beállításaihoz'; + @override + String get accessLimitedAssets => 'Folytassa korlátozott hozzáféréssel'; + @override + String get accessiblePathName => 'Elérhető fájlok'; + @override + String get sTypeAudioLabel => 'Audió'; + @override + String get sTypeImageLabel => 'Kép'; + @override + String get sTypeVideoLabel => 'Videó'; + @override + String get sTypeOtherLabel => 'Egyéb média'; + @override + String get sActionPlayHint => 'lejátszás'; + @override + String get sActionPreviewHint => 'előnézet'; + @override + String get sActionSelectHint => 'választás'; + @override + String get sActionSwitchPathLabel => 'útvonal módosítás'; + @override + String get sActionUseCameraHint => 'használjon kamerát'; + @override + String get sNameDurationLabel => 'időtartam'; + @override + String get sUnitAssetCountLabel => 'számol'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$hu extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hálózati interfészek'; + @override + String get info => + 'Alapértelmezésként a LocalSend az összes rendelkezésre álló hálózati interfészt használja. Itt kizárhatja a nem kívánt hálózatokat. A módosítások alkalmazásához újra kell indítania a kiszolgálót.'; + @override + String get preview => 'Előnézet'; + @override + String get whitelist => 'Fehérlista'; + @override + String get blacklist => 'Tiltólista'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$hu extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Álnév:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$hu extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Kedvencek'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$hu extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kiválasztás'; + @override + String files({required Object files}) => 'Fájl(ok): ${files}'; + @override + String size({required Object size}) => 'Méret: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$hu extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get file => 'Fájl'; + @override + String get folder => 'Mappa'; + @override + String get media => 'Média'; + @override + String get text => 'Szöveg'; + @override + String get app => 'App'; + @override + String get clipboard => 'Beillesztés'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$hu extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get single => 'Egyetlen címzett'; + @override + String get multiple => 'Több címzett'; + @override + String get link => 'Megosztás linkben'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$hu extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Általános'; + @override + String get brightness => 'Fényerő'; + @override + late final _Translations$settingsTab$general$brightnessOptions$hu brightnessOptions = _Translations$settingsTab$general$brightnessOptions$hu._( + _root, + ); + @override + String get color => 'Színek'; + @override + late final _Translations$settingsTab$general$colorOptions$hu colorOptions = _Translations$settingsTab$general$colorOptions$hu._(_root); + @override + String get language => 'Nyelv'; + @override + late final _Translations$settingsTab$general$languageOptions$hu languageOptions = _Translations$settingsTab$general$languageOptions$hu._(_root); + @override + String get saveWindowPlacement => 'Kilépés: Ablak pozíció mentése'; + @override + String get saveWindowPlacementWindows => 'Az ablak pozíciójának mentése kilépés után'; + @override + String get minimizeToTray => 'Kilépés: Minimalizálja a tálcára'; + @override + String get launchAtStartup => 'Auto. indítás bejelentkezés után'; + @override + String get launchMinimized => 'Auto. indítás: Kis méretben'; + @override + String get showInContextMenu => 'A LocalSend megjelenítése a helyi menüben'; + @override + String get animations => 'Animációk'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$hu extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Fogadás'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Autom. befejezés'; + @override + String get destination => 'Mentés helye'; + @override + String get downloads => '(Letöltések)'; + @override + String get saveToGallery => 'Média mentése a galériába'; + @override + String get saveToHistory => 'Mentés az előzmények közé'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$hu extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Küld'; + @override + String get shareViaLinkAutoAccept => 'Megosztás linken keresztül: Auto. elfogadás'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$hu extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hálózat'; + @override + String get needRestart => 'A beállítások alkalmazásához indítsa újra a szervert!'; + @override + String get server => 'Szerver'; + @override + String get alias => 'Álnév'; + @override + String get deviceType => 'Eszköz típusa'; + @override + String get deviceModel => 'Eszköz modell'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Felfedezési időtúllépés'; + @override + String get useSystemName => 'Rendszernév használata'; + @override + String get generateRandomAlias => 'Véletlenszerű álnév generálás'; + @override + String portWarning({required Object defaultPort}) => + 'Előfordulhat, hogy más eszközök nem észlelik eszközét, mert egyéni portot használ. (alapértelmezett: ${defaultPort})'; + @override + String get encryption => 'Titkosítás'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Előfordulhat, hogy más eszközök nem észlelik eszközét, mert egyéni multicast címet használ. (alapérték: ${defaultMulticast})'; + @override + String get network => 'Hálózat'; + @override + late final _Translations$settingsTab$network$networkOptions$hu networkOptions = _Translations$settingsTab$network$networkOptions$hu._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$hu extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Egyéb'; + @override + String get support => 'LocalSend támogatás'; + @override + String get donate => 'Adomány'; + @override + String get privacyPolicy => 'Adatvédelmi irányelvek'; + @override + String get termsOfUse => 'Használati feltételek'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$hu extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ez az alkalmazás képes fájlokat küldeni más eszközökre, de más eszközök nem küldhetnek fájlokat erre az eszközre.'; + @override + String solution({required Object port}) => + 'Ez valószínűleg tűzfal probléma. Ezt úgy oldhatja meg, hogy engedélyezi a bejövő kapcsolatokat (UDP és TCP) a ${port} porton.'; + @override + String get openFirewall => 'Tűzfal megnyitás'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$hu extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ez az eszköz nem tud más eszközöket felismerni.'; + @override + String get solution => + 'Győződjön meg róla, hogy minden eszköz ugyanabban a Wi-Fi hálózatban van, és ugyanaz a konfiguráció (port, multicast cím, titkosítás). Megpróbálhatja manuálisan beírni a céleszköz IP-címét. Ha ez működik, fontolja meg az eszköz hozzáadását a kedvencekhez, hogy a jövőben automatikusan fel lehessen fedezni.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$hu extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'A két eszköz nem tudja felismerni egymást, és nem tud fájlokat megosztani.'; + @override + String get solution => + 'A probléma mindkét oldalon létezik? Akkor meg kell győződnie arról, hogy mindkét eszköz ugyanabban a wifi hálózatban van, és ugyanazt a konfigurációt használja (port, multicast cím, titkosítás). Előfordulhat, hogy a Wifi nem teszi lehetővé a résztvevők közötti kommunikációt. Ebben az esetben ezt az opciót engedélyezni kell a routeren..'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$hu extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get open => 'Fájl megnyitás'; + @override + String get showInFolder => 'Megjelenítés a mappában'; + @override + String get info => 'Információ'; + @override + String get deleteFromHistory => 'Törlés az előzményből'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$hu extends Translations$progressPage$total$en { + _Translations$progressPage$total$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$hu title = _Translations$progressPage$total$title$hu._(_root); + @override + String count({required Object curr, required Object n}) => 'Fájl: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Méret: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Sebesség: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$hu extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Az órák rövidítéséhez használja a 'h' betűt, a percekhez pedig az 'm' betűt + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// A naphoz a 'd', az órához a 'h', a percekhez az 'm' betűt használja + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$hu extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hozzáadás a kijelöléshez'; + @override + String get content => 'Mit szeretne hozzáfűzni?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$hu extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Fájl megnyitás'; + @override + String get content => 'Meg akarja nyitni a fogadott fájlt?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$hu extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Adja meg a címet'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP cím'; + @override + String get recentlyUsed => 'Nemrég használt: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$hu extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Fájlátvitel megszakítása'; + @override + String get content => 'Valóban meg akarja szakítani a fájlátvitelt?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$hu extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'A fájl nem nyitható meg'; + @override + String content({required Object file}) => 'Nem sikerült megnyitni a(z) "${file}" fájlt. A fájlt áthelyezték, átnevezték vagy törölték?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$hu extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'A titkosítás letiltva'; + @override + String get content => + 'A kommunikáció most a titkosítatlan HTTP protokollon keresztül történik. A HTTPS használatához engedélyezze újra a titkosítást.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$hu extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$hu extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kedvencek'; + @override + String get noFavorites => 'Nincsenek még kedvenc eszközök.'; + @override + String get addFavorite => 'Hozzáadás'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$hu extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Törlés a kedvencek közül'; + @override + String content({required Object name}) => 'Tényleg törölni szeretnéd a "${name}" a kedvencek közül?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$hu extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Hozzáadás a kedvencekhez'; + @override + String get titleEdit => 'Beállítás'; + @override + String get name => 'Álnév'; + @override + String get auto => '(auto)'; + @override + String get ip => 'IP cím'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$hu extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Fájl információ'; + @override + String get fileName => 'Fájl neve:'; + @override + String get path => 'Útvonal:'; + @override + String get size => 'Méret:'; + @override + String get sender => 'Küldő:'; + @override + String get time => 'Idő:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$hu extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Írja be a fájl nevét'; + @override + String original({required Object original}) => 'Eredeti: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$hu extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Törölje az előzményt'; + @override + String get content => 'Biztosan törölni szeretné a teljes előzményt?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$hu extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'A LocalSend nem találhat más eszközöket a helyi hálózat vizsgálatára vonatkozó engedély nélkül. Adja meg ezt az engedélyt a beállításokban.'; + @override + String get gotoSettings => 'Beállítások'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$hu extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Írja be az üzenetét'; + @override + String get multiline => 'Több soros'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$hu extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nincs fájl kiválasztva'; + @override + String get content => 'Kérjük válasszon legalább egy fájlt.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$hu extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nem engedélyezett'; + @override + String get content => 'Nem adtál megfelelő engedélyeket. Kérlek engedélyezd őket a beállításokban.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$hu extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nem érhető el'; + @override + String get content => 'Ez a funkció csak itt érhető el:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$hu extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR-kód'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$hu extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Gyors műveletek'; + @override + String get counter => 'Számláló'; + @override + String get prefix => 'Előtag'; + @override + String get padZero => 'Kitöltés nullákkal'; + @override + String get sortBeforeCount => 'Előzetesen rendezze ábécé sorrendbe'; + @override + String get random => 'Véletlen'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$hu extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'A fájlkérések autom. elfogadásra kerülnek. Ügyeljen arra, hogy a helyi hálózaton mindenki küldhet Önnek fájlokat.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$hu extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'A fájlkérések auto. elfogadása mostantól a kedvencek listáján szereplő eszközökről.', + 'Figyelmeztetés: Ez jelenleg nem teljesen biztonságos, mert egy hacker, aki ismeri a kedvenc eszközeinek ujjlenyomatát, még mindig küldhet fájlokat.', + 'Ez a lehetőség azonban még mindig biztonságosabb, mint bármely eszköz engedélyezése.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$hu extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'PIN kód megadása'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$hu extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Küldési módok'; + @override + String get single => 'Fájlokat küld egy címzettnek. Az átvitel befejezése után a kijelölés törlődik.'; + @override + String get multiple => 'Fájlokat küld több címzettnek. A kijelölés nem törlődik.'; + @override + String get link => + 'Azok a címzettek, akiknél nincs telepítve a LocalSend, letölthetik a kiválasztott fájlokat a hivatkozás megnyitásával a böngészőjükben.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$hu extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$hu extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get system => 'Rendszer'; + @override + String get dark => 'Sötét'; + @override + String get light => 'Világos'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$hu extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get system => 'Rendszer'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$hu extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get system => 'Rendszer'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$hu extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String get all => 'Mindegyik'; + @override + String get filtered => 'Szűrt'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$hu extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$hu._(TranslationsHu root) : this._root = root, super.internal(root); + + final TranslationsHu _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Teljes folyamat (${time})'; + @override + String get finishedError => 'Hibával befejezve'; + @override + String get canceledSender => 'A küldő törölte'; + @override + String get canceledReceiver => 'A fogadó törölte'; +} diff --git a/app/lib/gen/strings_id.g.dart b/app/lib/gen/strings_id.g.dart new file mode 100644 index 0000000..cd98180 --- /dev/null +++ b/app/lib/gen/strings_id.g.dart @@ -0,0 +1,1408 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsId extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsId({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.id, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsId _root = this; // ignore: unused_field + + @override + TranslationsId $copyWith({TranslationMetadata? meta}) => TranslationsId(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Indonesian'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$id general = _Translations$general$id._(_root); + @override + late final _Translations$receiveTab$id receiveTab = _Translations$receiveTab$id._(_root); + @override + late final _Translations$sendTab$id sendTab = _Translations$sendTab$id._(_root); + @override + late final _Translations$settingsTab$id settingsTab = _Translations$settingsTab$id._(_root); + @override + late final _Translations$troubleshootPage$id troubleshootPage = _Translations$troubleshootPage$id._(_root); + @override + late final _Translations$receiveHistoryPage$id receiveHistoryPage = _Translations$receiveHistoryPage$id._(_root); + @override + late final _Translations$apkPickerPage$id apkPickerPage = _Translations$apkPickerPage$id._(_root); + @override + late final _Translations$selectedFilesPage$id selectedFilesPage = _Translations$selectedFilesPage$id._(_root); + @override + late final _Translations$receivePage$id receivePage = _Translations$receivePage$id._(_root); + @override + late final _Translations$receiveOptionsPage$id receiveOptionsPage = _Translations$receiveOptionsPage$id._(_root); + @override + late final _Translations$sendPage$id sendPage = _Translations$sendPage$id._(_root); + @override + late final _Translations$progressPage$id progressPage = _Translations$progressPage$id._(_root); + @override + late final _Translations$webSharePage$id webSharePage = _Translations$webSharePage$id._(_root); + @override + late final _Translations$aboutPage$id aboutPage = _Translations$aboutPage$id._(_root); + @override + late final _Translations$donationPage$id donationPage = _Translations$donationPage$id._(_root); + @override + late final _Translations$changelogPage$id changelogPage = _Translations$changelogPage$id._(_root); + @override + late final _Translations$dialogs$id dialogs = _Translations$dialogs$id._(_root); + @override + late final _Translations$sanitization$id sanitization = _Translations$sanitization$id._(_root); + @override + late final _Translations$tray$id tray = _Translations$tray$id._(_root); + @override + late final _Translations$web$id web = _Translations$web$id._(_root); + @override + late final _Translations$assetPicker$id assetPicker = _Translations$assetPicker$id._(_root); + @override + late final _Translations$networkInterfacesPage$id networkInterfacesPage = _Translations$networkInterfacesPage$id._(_root); +} + +// Path: general +class _Translations$general$id extends Translations$general$en { + _Translations$general$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Terima'; + @override + String get accepted => 'Diterima'; + @override + String get add => 'Tambah'; + @override + String get advanced => 'Lanjutan'; + @override + String get cancel => 'Batal'; + @override + String get close => 'Tutup'; + @override + String get confirm => 'Konfirmasi'; + @override + String get continueStr => 'Lanjut'; + @override + String get copy => 'Salin'; + @override + String get copiedToClipboard => 'Disalin ke Papan Klip'; + @override + String get decline => 'Tolak'; + @override + String get done => 'Selesai'; + @override + String get delete => 'Hapus'; + @override + String get edit => 'Sunting'; + @override + String get error => 'Galat'; + @override + String get example => 'Contoh'; + @override + String get files => 'Berkas'; + @override + String get finished => 'Selesai'; + @override + String get hide => 'Sembunyikan'; + @override + String get off => 'Mati'; + @override + String get offline => 'Luring'; + @override + String get on => 'Hidup'; + @override + String get online => 'Daring'; + @override + String get open => 'Buka'; + @override + String get queue => 'Antrean'; + @override + String get quickSave => 'Penyimpanan Cepat'; + @override + String get quickSaveFromFavorites => 'Simpan Cepat di “Favorit”'; + @override + String get renamed => 'Ganti nama'; + @override + String get reset => 'Batalkan perubahan'; + @override + String get restart => 'Mengulang Kembali'; + @override + String get settings => 'Pengaturan'; + @override + String get skipped => 'Dilewati'; + @override + String get start => 'Mulai'; + @override + String get stop => 'Berhenti'; + @override + String get save => 'Simpan'; + @override + String get unchanged => 'Takberubah'; + @override + String get unknown => 'Takdikenal'; + @override + String get noItemInClipboard => 'Tidak ada item di Papan Klip.'; +} + +// Path: receiveTab +class _Translations$receiveTab$id extends Translations$receiveTab$en { + _Translations$receiveTab$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Terima'; + @override + late final _Translations$receiveTab$infoBox$id infoBox = _Translations$receiveTab$infoBox$id._(_root); + @override + late final _Translations$receiveTab$quickSave$id quickSave = _Translations$receiveTab$quickSave$id._(_root); +} + +// Path: sendTab +class _Translations$sendTab$id extends Translations$sendTab$en { + _Translations$sendTab$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kirim'; + @override + late final _Translations$sendTab$selection$id selection = _Translations$sendTab$selection$id._(_root); + @override + late final _Translations$sendTab$picker$id picker = _Translations$sendTab$picker$id._(_root); + @override + String get shareIntentInfo => 'Anda juga dapat menggunakan fitur "Berbagi" agar dapat memilih berkas dengan lebih mudah.'; + @override + String get nearbyDevices => 'Perangkat Terdekat'; + @override + String get thisDevice => 'Perangkat Ini'; + @override + String get scan => 'Cari perangkat'; + @override + String get manualSending => 'Kirim secara manual'; + @override + String get sendMode => 'Mode Pengiriman'; + @override + late final _Translations$sendTab$sendModes$id sendModes = _Translations$sendTab$sendModes$id._(_root); + @override + String get sendModeHelp => 'Penjelasan'; + @override + String get help => 'Pastikan perangkat tujuan juga terkoneksi pada jaringan Wi-Fi yang sama.'; + @override + String get placeItems => 'Letakkan item untuk dibagikan.'; +} + +// Path: settingsTab +class _Translations$settingsTab$id extends Translations$settingsTab$en { + _Translations$settingsTab$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Pengaturan'; + @override + late final _Translations$settingsTab$general$id general = _Translations$settingsTab$general$id._(_root); + @override + late final _Translations$settingsTab$receive$id receive = _Translations$settingsTab$receive$id._(_root); + @override + late final _Translations$settingsTab$send$id send = _Translations$settingsTab$send$id._(_root); + @override + late final _Translations$settingsTab$network$id network = _Translations$settingsTab$network$id._(_root); + @override + late final _Translations$settingsTab$other$id other = _Translations$settingsTab$other$id._(_root); + @override + String get advancedSettings => 'Pengaturan Lanjutan'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$id extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Perbaikan Masalah'; + @override + String get subTitle => 'Aplikasi ini tidak berfungsi seperti yang diharapkan? Temukan penyelesaian masalah umum di sini.'; + @override + String get solution => 'Penyelesaian:'; + @override + String get fixButton => 'Perbaiki secara otomatis'; + @override + late final _Translations$troubleshootPage$firewall$id firewall = _Translations$troubleshootPage$firewall$id._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$id noDiscovery = _Translations$troubleshootPage$noDiscovery$id._(_root); + @override + late final _Translations$troubleshootPage$noConnection$id noConnection = _Translations$troubleshootPage$noConnection$id._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$id extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Riwayat'; + @override + String get openFolder => 'Buka folder'; + @override + String get deleteHistory => 'Hapus riwayat'; + @override + String get empty => 'Riwayat kosong.'; + @override + late final _Translations$receiveHistoryPage$entryActions$id entryActions = _Translations$receiveHistoryPage$entryActions$id._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$id extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplikasi (APK)'; + @override + String get excludeSystemApps => 'Kecualikan aplikasi sistem'; + @override + String get excludeAppsWithoutLaunchIntent => 'Kecualikan aplikasi yang tidak dapat diluncurkan'; + @override + String apps({required Object n}) => '${n} Aplikasi'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$id extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Hapus semua'; +} + +// Path: receivePage +class _Translations$receivePage$id extends Translations$receivePage$en { + _Translations$receivePage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('id'))( + n, + one: 'ingin mengirimi Anda sebuah berkas', + other: 'ingin mengirimi Anda ${n} berkas', + ); + @override + String get subTitleMessage => 'mengirimi Anda pesan sbb.:'; + @override + String get subTitleLink => 'mengirimi Anda tautan sbb.:'; + @override + String get canceled => 'Pengirim membatalkan permintaan.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$id extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Pilihan'; + @override + String get appDirectory => '(folder LocalSend)'; + @override + String get saveToGalleryOff => 'Dimatikan secara otomatis karena ada direktori.'; +} + +// Path: sendPage +class _Translations$sendPage$id extends Translations$sendPage$en { + _Translations$sendPage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Menunggu tanggapan…'; + @override + String get rejected => 'Penerima menolak permintaan.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Penerima sedang sibuk dengan permintaan lain.'; +} + +// Path: progressPage +class _Translations$progressPage$id extends Translations$progressPage$en { + _Translations$progressPage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Mengirim Berkas'; + @override + String get titleReceiving => 'Menerima Berkas'; + @override + String get savedToGallery => 'Simpan di galeri'; + @override + late final _Translations$progressPage$total$id total = _Translations$progressPage$total$id._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$id extends Translations$webSharePage$en { + _Translations$webSharePage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Bagikan melalui Tautan'; + @override + String get loading => 'Memulai peladen…'; + @override + String get stopping => 'Menghentikan peladen…'; + @override + String get error => 'Ada galat saat menjalankan peladen.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('id'))( + n, + one: 'Buka tautan ini di peramban:', + other: 'Buka salah satu tautan ini di peramban:', + ); + @override + String get requests => 'Permintaan'; + @override + String get noRequests => 'Belum ada permintaan.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Terima permintaan secara otomatis'; + @override + String get requirePin => 'Memerlukan PIN'; + @override + String pinHint({required Object pin}) => 'PIN-nya adalah "${pin}"'; + @override + String get encryptionHint => 'LocalSend menggunakan sertifikat self-signed. Anda perlu menerimanya di peramban.'; + @override + String pendingRequests({required Object n}) => 'Banyaknya permintaan yang tertunda: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$id extends Translations$aboutPage$en { + _Translations$aboutPage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tentang LocalSend'; + @override + List get description => [ + 'LocalSend adalah aplikasi gratis dan bersumber terbuka yang memungkinkan Anda untuk membagikan berkas dan pesan secara aman dengan perangkat lain yang terhubung pada jaringan lokal tanpa memerlukan koneksi internet atau paket data.', + 'Aplikasi ini tersedia untuk platform Android, iOS, macOS, Windows, dan Linux. Semua pilihan pengunduhan dapat ditemukan di laman situs resmi kami.', + ]; + @override + String get author => 'Pembuat'; + @override + String get contributors => 'Daftar Kontributor'; + @override + String get packagers => 'Pengemas'; + @override + String get translators => 'Daftar Penerjemah'; +} + +// Path: donationPage +class _Translations$donationPage$id extends Translations$donationPage$en { + _Translations$donationPage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Donasi'; + @override + String get info => + 'LocalSend adalah aplikasi gratis, bersumber terbuka, dan bebas iklan. Jika Anda menyukai aplikasi ini, mohon berikan kami dukungan dengan cara memberikan donasi.'; + @override + String donate({required Object amount}) => 'Donasi ${amount}'; + @override + String get thanks => 'Terima kasih banyak!'; + @override + String get restore => 'Kembalikan dana'; +} + +// Path: changelogPage +class _Translations$changelogPage$id extends Translations$changelogPage$en { + _Translations$changelogPage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Catatan Perubahan'; +} + +// Path: dialogs +class _Translations$dialogs$id extends Translations$dialogs$en { + _Translations$dialogs$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$id addFile = _Translations$dialogs$addFile$id._(_root); + @override + late final _Translations$dialogs$openFile$id openFile = _Translations$dialogs$openFile$id._(_root); + @override + late final _Translations$dialogs$addressInput$id addressInput = _Translations$dialogs$addressInput$id._(_root); + @override + late final _Translations$dialogs$cancelSession$id cancelSession = _Translations$dialogs$cancelSession$id._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$id cannotOpenFile = _Translations$dialogs$cannotOpenFile$id._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$id encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$id._(_root); + @override + late final _Translations$dialogs$errorDialog$id errorDialog = _Translations$dialogs$errorDialog$id._(_root); + @override + late final _Translations$dialogs$favoriteDialog$id favoriteDialog = _Translations$dialogs$favoriteDialog$id._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$id favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$id._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$id favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$id._(_root); + @override + late final _Translations$dialogs$fileInfo$id fileInfo = _Translations$dialogs$fileInfo$id._(_root); + @override + late final _Translations$dialogs$fileNameInput$id fileNameInput = _Translations$dialogs$fileNameInput$id._(_root); + @override + late final _Translations$dialogs$historyClearDialog$id historyClearDialog = _Translations$dialogs$historyClearDialog$id._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$id localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$id._(_root); + @override + late final _Translations$dialogs$messageInput$id messageInput = _Translations$dialogs$messageInput$id._(_root); + @override + late final _Translations$dialogs$noFiles$id noFiles = _Translations$dialogs$noFiles$id._(_root); + @override + late final _Translations$dialogs$noPermission$id noPermission = _Translations$dialogs$noPermission$id._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$id notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$id._(_root); + @override + late final _Translations$dialogs$qr$id qr = _Translations$dialogs$qr$id._(_root); + @override + late final _Translations$dialogs$quickActions$id quickActions = _Translations$dialogs$quickActions$id._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$id quickSaveNotice = _Translations$dialogs$quickSaveNotice$id._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$id quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$id._(_root); + @override + late final _Translations$dialogs$pin$id pin = _Translations$dialogs$pin$id._(_root); + @override + late final _Translations$dialogs$sendModeHelp$id sendModeHelp = _Translations$dialogs$sendModeHelp$id._(_root); + @override + late final _Translations$dialogs$zoom$id zoom = _Translations$dialogs$zoom$id._(_root); +} + +// Path: sanitization +class _Translations$sanitization$id extends Translations$sanitization$en { + _Translations$sanitization$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Nama berkas tidak boleh kosong'; + @override + String get invalid => 'Nama berkas mengandung karakter yang takvalid'; +} + +// Path: tray +class _Translations$tray$id extends Translations$tray$en { + _Translations$tray$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Tutup LocalSend'; + @override + String get closeWindows => 'Keluar'; +} + +// Path: web +class _Translations$web$id extends Translations$web$en { + _Translations$web$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Masukkan PIN'; + @override + String get invalidPin => 'PIN Salah'; + @override + String get tooManyAttempts => 'Terlalu banyak percobaan'; + @override + String get rejected => 'Ditolak'; + @override + String get files => 'Berkas'; + @override + String get fileName => 'Nama Berkas'; + @override + String get size => 'Ukuran'; +} + +// Path: assetPicker +class _Translations$assetPicker$id extends Translations$assetPicker$en { + _Translations$assetPicker$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Konfirmasikan'; + @override + String get cancel => 'Batalkan'; + @override + String get edit => 'Sunting'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Gagal memuat'; + @override + String get original => 'Asli'; + @override + String get preview => 'Pratinjau'; + @override + String get select => 'Pilih'; + @override + String get emptyList => 'Daftar kosong'; + @override + String get unSupportedAssetType => 'Jenis berkas tidak didukung.'; + @override + String get unableToAccessAll => 'Tidak dapat mengakses semua berkas di perangkat'; + @override + String get viewingLimitedAssetsTip => 'Hanya melihat berkas dan album yang dapat diakses oleh aplikasi.'; + @override + String get changeAccessibleLimitedAssets => 'Klik untuk memutakhirkan berkas yang dapat diakses'; + @override + String get accessAllTip => + 'Aplikasi hanya dapat mengakses beberapa berkas di perangkat. Pergi ke pengaturan sistem dan izinkan aplikasi untuk mengakses semua media di perangkat.'; + @override + String get goToSystemSettings => 'Ke pengaturan sistem'; + @override + String get accessLimitedAssets => 'Lanjutkan dengan akses terbatas'; + @override + String get accessiblePathName => 'Berkas yang dapat diakses'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Gambar'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Media lainnya'; + @override + String get sActionPlayHint => 'Putar'; + @override + String get sActionPreviewHint => 'Pratinjau'; + @override + String get sActionSelectHint => 'Pilih'; + @override + String get sActionSwitchPathLabel => 'Ubah jalur'; + @override + String get sActionUseCameraHint => 'Gunakan kamera'; + @override + String get sNameDurationLabel => 'Durasi'; + @override + String get sUnitAssetCountLabel => 'Jumlah'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$id extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Antarmuka Jaringan'; + @override + String get preview => 'Pratinjau'; + @override + String get whitelist => 'Daftar putih'; + @override + String get blacklist => 'Daftar hitam'; + @override + String get info => + 'Secara default, LocalSend menggunakan semua antarmuka jaringan yang tersedia. Anda dapat mengecualikan jaringan yang tidak diinginkan di sini. Anda perlu memulai ulang server untuk menerapkan perubahan.'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$id extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Porta:'; + @override + String get alias => 'Nama perangkat:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$id extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Favorit'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$id extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Pilihan'; + @override + String files({required Object files}) => 'Berkas: ${files}'; + @override + String size({required Object size}) => 'Ukuran: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$id extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get file => 'Berkas'; + @override + String get folder => 'Direktori'; + @override + String get media => 'Media'; + @override + String get text => 'Teks'; + @override + String get app => 'Aplikasi'; + @override + String get clipboard => 'Tempel'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$id extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get single => 'Penerima tunggal'; + @override + String get multiple => 'Banyak penerima'; + @override + String get link => 'Bagikan melalui tautan'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$id extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Umum'; + @override + String get brightness => 'Tema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$id brightnessOptions = _Translations$settingsTab$general$brightnessOptions$id._( + _root, + ); + @override + String get color => 'Warna'; + @override + late final _Translations$settingsTab$general$colorOptions$id colorOptions = _Translations$settingsTab$general$colorOptions$id._(_root); + @override + String get language => 'Bahasa'; + @override + late final _Translations$settingsTab$general$languageOptions$id languageOptions = _Translations$settingsTab$general$languageOptions$id._(_root); + @override + String get saveWindowPlacement => 'Keluar: Simpan posisi jendela'; + @override + String get saveWindowPlacementWindows => 'Simpan posisi jendela setelah keluar'; + @override + String get minimizeToTray => 'Keluar: Perkecil ke pojok bawah'; + @override + String get launchAtStartup => 'Mulai otomatis setelah masuk'; + @override + String get launchMinimized => 'Mulai otomatis: Berjalan di latar'; + @override + String get showInContextMenu => 'Tampilkan LocalSend di menu konteks'; + @override + String get animations => 'Animasi'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$id extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Menerima'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Selesai Otomatis'; + @override + String get destination => 'Tujuan'; + @override + String get downloads => '(Unduhan)'; + @override + String get saveToGallery => 'Simpan media ke galeri'; + @override + String get saveToHistory => 'Simpan ke riwayat'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$id extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kirim'; + @override + String get shareViaLinkAutoAccept => 'Bagikan melalui tautan: Terima otomatis'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$id extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Jaringan'; + @override + String get needRestart => 'Mulai ulang agar dapat menerapkan pengaturan!'; + @override + String get server => 'Peladen'; + @override + String get alias => 'Alias'; + @override + String get deviceType => 'Tipe Perangkat'; + @override + String get deviceModel => 'Model Perangkat'; + @override + String get port => 'Porta'; + @override + String get discoveryTimeout => 'Waktu penemuan habis'; + @override + String get useSystemName => 'Gunakan nama sistem'; + @override + String get generateRandomAlias => 'Hasilkan alias acak'; + @override + String portWarning({required Object defaultPort}) => + 'Anda mungkin tidak terdeteksi oleh perangkat lain karena menggunakan porta kustom. (bawaan: ${defaultPort})'; + @override + String get encryption => 'Enkripsi'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Anda mungkin tidak terdeteksi oleh perangkat lain karena menggunakan alamat multicast khusus. (bawaan: ${defaultMulticast})'; + @override + String get network => 'Jaringan'; + @override + late final _Translations$settingsTab$network$networkOptions$id networkOptions = _Translations$settingsTab$network$networkOptions$id._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$id extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lainnya'; + @override + String get support => 'Dukung LocalSend'; + @override + String get donate => 'Donasi'; + @override + String get privacyPolicy => 'Kebijakan Privasi'; + @override + String get termsOfUse => 'Syarat dan Ketentuan Penggunaan'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$id extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Aplikasi ini dapat mengirim berkas ke perangkat lain, tetapi tidak sebaliknya.'; + @override + String solution({required Object port}) => + 'Hal ini kemungkinan merupakan masalah tembok api (firewall). Anda dapat memperbaiki masalah ini dengan memperbolehkan koneksi masuk (UDP dan TCP) pada porta ${port}.'; + @override + String get openFirewall => 'Buka Tembok Api'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$id extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Perangkat ini tidak dapat menemukan perangkat lain.'; + @override + String get solution => + 'Pastikan semua perangkat berada pada jaringan Wi-Fi yang sama dan menggunakan konfigurasi yang sama (porta, alamat multicast, dan enkripsi). Anda dapat mencoba mengetik alamat IP perangkat target secara manual. Jika cara ini berhasil, pertimbangkan menambahkan perangkat ini ke daftar favorit sehingga perangkat dapat ditemukan secara otomatis pada lain waktu.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$id extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Kedua perangkat tidak dapat saling menemukan dan berbagi berkas.'; + @override + String get solution => + 'Pastikan kedua perangkat berada pada jaringan Wi-Fi yang sama dan berbagi konfigurasi yang sama (porta, alamat multicast, enkripsi). Jika Wi-Fi tidak mengizinkan komunikasi, aktifkan pilihan ini pada ruter.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$id extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get open => 'Buka berkas'; + @override + String get showInFolder => 'Tampilkan di folder'; + @override + String get info => 'Informasi'; + @override + String get deleteFromHistory => 'Hapus dari riwayat'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$id extends Translations$progressPage$total$en { + _Translations$progressPage$total$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$id title = _Translations$progressPage$total$title$id._(_root); + @override + String count({required Object curr, required Object n}) => 'Berkas: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Ukuran: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Kecepatan: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$id extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tambahkan dalam pilihan'; + @override + String get content => 'Apa yang ingin Anda tambahkan?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$id extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Buka berkas'; + @override + String get content => 'Anda ingin membuka berkas yang diterima?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$id extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Masukkan Alamat'; + @override + String get hashtag => 'Tagar'; + @override + String get ip => 'Alamat IP'; + @override + String get recentlyUsed => 'Baru saja digunakan: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$id extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Batalkan pentransferan berkas'; + @override + String get content => 'Anda yakin ingin membatalkan pengiriman berkas?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$id extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tidak dapat membuka berkas'; + @override + String content({required Object file}) => 'Tidak dapat membuka "${file}". Apakah berkas ini telah dipindahkan, berganti nama, atau dihapus?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$id extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Enkripsi dinonaktifkan'; + @override + String get content => 'Komunikasi sekarang terjadi melalui protokol HTTP yang takterenkripsi. Untuk menggunakan HTTPS, aktifkan kembali enkripsi.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$id extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$id extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favorit'; + @override + String get noFavorites => 'Tidak ada perangkat favorit.'; + @override + String get addFavorite => 'Tambah'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$id extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hapus dari daftar favorit'; + @override + String content({required Object name}) => 'Anda yakin ingin menghapus ini dari daftar favorit? "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$id extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Tambah ke daftar favorit'; + @override + String get titleEdit => 'Pengaturan'; + @override + String get name => 'Nama perangkat'; + @override + String get auto => '(otomatis)'; + @override + String get ip => 'Alamat IP'; + @override + String get port => 'Porta'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$id extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informasi Berkas'; + @override + String get fileName => 'Nama Berkas:'; + @override + String get path => 'Lokasi:'; + @override + String get size => 'Ukuran:'; + @override + String get sender => 'Pengirim:'; + @override + String get time => 'Waktu:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$id extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Masukkan nama berkas'; + @override + String original({required Object original}) => 'Asli: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$id extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hapus Riwayat'; + @override + String get content => 'Anda yakin ingin menghapus seluruh riwayat?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$id extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend tidak dapat menemukan perangkat lain tanpa izin untuk memindai jaringan lokal. Mohon berikan izin ini di pengaturan.'; + @override + String get gotoSettings => 'Pengaturan'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$id extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ketik pesan'; + @override + String get multiline => 'Baris Ganda'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$id extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tidak ada berkas yang dipilih'; + @override + String get content => 'Pilih setidaknya satu berkas.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$id extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tidak ada izin'; + @override + String get content => 'Anda belum memberikan izin yang diperlukan. Harap berikan izin tersebut di pengaturan.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$id extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tidak tersedia'; + @override + String get content => 'Fitur ini hanya tersedia di:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$id extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kode QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$id extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aksi Cepat'; + @override + String get counter => 'Penghitung'; + @override + String get prefix => 'Awalan'; + @override + String get padZero => 'Isi dengan nol'; + @override + String get sortBeforeCount => 'Urutkan berdasarkan abjad sebelumnya'; + @override + String get random => 'Acak'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$id extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Semua permintaan akan langsung diterima. Harap berhati-hati bahwa semua orang di jaringan lokal dapat mengirim berkas.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$id extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Permintaan berkas sekarang diterima secara otomatis dari perangkat di daftar favorit Anda.', + 'Peringatan! Saat ini, pilihan ini tidak sepenuhnya aman karena peretas yang memiliki sidik jari perangkat apa pun dari daftar favorit Anda dapat mengirimi Anda berkas tanpa pembatasan.', + 'Akan tetapi, pilihan ini masih lebih aman daripada mengizinkan semua pengguna di jaringan lokal mengirimkan berkas kepada Anda tanpa pembatasan.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$id extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Masukkan PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$id extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mode Pengiriman'; + @override + String get single => 'Mengirim berkas ke satu penerima. Pilihan penerima akan dihapus setelah selesai membagikan berkas.'; + @override + String get multiple => 'Mengirim berkas ke beberapa penerima. Pilihan penerima tidak akan dihapus.'; + @override + String get link => 'Penerima yang tidak memiliki LocalSend dapat mengunduh berkas yang dipilih dengan membuka tautan di peramban.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$id extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$id extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; + @override + String get dark => 'Gelap'; + @override + String get light => 'Terang'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$id extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$id extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$id extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String get all => 'Semua'; + @override + String get filtered => 'Tersaring'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$id extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$id._(TranslationsId root) : this._root = root, super.internal(root); + + final TranslationsId _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Total proses (${time})'; + @override + String get finishedError => 'Selesai, tetapi ada galat'; + @override + String get canceledSender => 'Dibatalkan pengirim'; + @override + String get canceledReceiver => 'Dibatalkan penerima'; +} diff --git a/app/lib/gen/strings_it.g.dart b/app/lib/gen/strings_it.g.dart new file mode 100644 index 0000000..04eeecf --- /dev/null +++ b/app/lib/gen/strings_it.g.dart @@ -0,0 +1,1438 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsIt extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsIt({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.it, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsIt _root = this; // ignore: unused_field + + @override + TranslationsIt $copyWith({TranslationMetadata? meta}) => TranslationsIt(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Italiano'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$it general = _Translations$general$it._(_root); + @override + late final _Translations$receiveTab$it receiveTab = _Translations$receiveTab$it._(_root); + @override + late final _Translations$sendTab$it sendTab = _Translations$sendTab$it._(_root); + @override + late final _Translations$settingsTab$it settingsTab = _Translations$settingsTab$it._(_root); + @override + late final _Translations$troubleshootPage$it troubleshootPage = _Translations$troubleshootPage$it._(_root); + @override + late final _Translations$receiveHistoryPage$it receiveHistoryPage = _Translations$receiveHistoryPage$it._(_root); + @override + late final _Translations$apkPickerPage$it apkPickerPage = _Translations$apkPickerPage$it._(_root); + @override + late final _Translations$selectedFilesPage$it selectedFilesPage = _Translations$selectedFilesPage$it._(_root); + @override + late final _Translations$receivePage$it receivePage = _Translations$receivePage$it._(_root); + @override + late final _Translations$receiveOptionsPage$it receiveOptionsPage = _Translations$receiveOptionsPage$it._(_root); + @override + late final _Translations$sendPage$it sendPage = _Translations$sendPage$it._(_root); + @override + late final _Translations$progressPage$it progressPage = _Translations$progressPage$it._(_root); + @override + late final _Translations$webSharePage$it webSharePage = _Translations$webSharePage$it._(_root); + @override + late final _Translations$aboutPage$it aboutPage = _Translations$aboutPage$it._(_root); + @override + late final _Translations$donationPage$it donationPage = _Translations$donationPage$it._(_root); + @override + late final _Translations$changelogPage$it changelogPage = _Translations$changelogPage$it._(_root); + @override + late final _Translations$dialogs$it dialogs = _Translations$dialogs$it._(_root); + @override + late final _Translations$sanitization$it sanitization = _Translations$sanitization$it._(_root); + @override + late final _Translations$tray$it tray = _Translations$tray$it._(_root); + @override + late final _Translations$web$it web = _Translations$web$it._(_root); + @override + late final _Translations$assetPicker$it assetPicker = _Translations$assetPicker$it._(_root); + @override + late final _Translations$networkInterfacesPage$it networkInterfacesPage = _Translations$networkInterfacesPage$it._(_root); +} + +// Path: general +class _Translations$general$it extends Translations$general$en { + _Translations$general$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Accetta'; + @override + String get accepted => 'Accettato'; + @override + String get add => 'Aggiungi'; + @override + String get advanced => 'Avanzate'; + @override + String get cancel => 'Annulla'; + @override + String get close => 'Chiudi'; + @override + String get confirm => 'Conferma'; + @override + String get continueStr => 'Continua'; + @override + String get copy => 'Copia'; + @override + String get copiedToClipboard => 'Copiato negli Appunti'; + @override + String get decline => 'Rifiuta'; + @override + String get done => 'Fatto'; + @override + String get delete => 'Cancella'; + @override + String get edit => 'Modifica'; + @override + String get error => 'Errore'; + @override + String get example => 'Esempio'; + @override + String get files => 'File'; + @override + String get finished => 'Completato'; + @override + String get hide => 'Nascondi'; + @override + String get off => 'Disattivato'; + @override + String get offline => 'Offline'; + @override + String get on => 'Attivato'; + @override + String get online => 'Online'; + @override + String get open => 'Apri'; + @override + String get queue => 'Coda'; + @override + String get quickSave => 'Salvataggio rapido'; + @override + String get quickSaveFromFavorites => 'Salvataggio rapido per "Preferiti"'; + @override + String get renamed => 'Rinominato'; + @override + String get reset => 'Reset'; + @override + String get restart => 'Riavvia'; + @override + String get settings => 'Impostazioni'; + @override + String get skipped => 'Saltato'; + @override + String get start => 'Inizia'; + @override + String get stop => 'Arresta'; + @override + String get save => 'Salva'; + @override + String get unchanged => 'Invariato'; + @override + String get unknown => 'Sconosciuto'; + @override + String get noItemInClipboard => 'Nessun elemento negli Appunti.'; +} + +// Path: receiveTab +class _Translations$receiveTab$it extends Translations$receiveTab$en { + _Translations$receiveTab$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ricevi'; + @override + late final _Translations$receiveTab$infoBox$it infoBox = _Translations$receiveTab$infoBox$it._(_root); + @override + late final _Translations$receiveTab$quickSave$it quickSave = _Translations$receiveTab$quickSave$it._(_root); +} + +// Path: sendTab +class _Translations$sendTab$it extends Translations$sendTab$en { + _Translations$sendTab$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Invia'; + @override + late final _Translations$sendTab$selection$it selection = _Translations$sendTab$selection$it._(_root); + @override + late final _Translations$sendTab$picker$it picker = _Translations$sendTab$picker$it._(_root); + @override + String get shareIntentInfo => 'Puoi anche usare la funzione "Condividi" del dispositivo mobile per selezionare più facilmente i file.'; + @override + String get nearbyDevices => 'Dispositivi vicini'; + @override + String get thisDevice => 'Questo dispositivo'; + @override + String get scan => 'Cerca dispositivi'; + @override + String get manualSending => 'Invio manuale'; + @override + String get sendMode => 'Modalità di invio'; + @override + late final _Translations$sendTab$sendModes$it sendModes = _Translations$sendTab$sendModes$it._(_root); + @override + String get sendModeHelp => 'Spiegazione'; + @override + String get help => 'Assicurati che il destinatario desiderato si trovi sulla stessa rete Wi-Fi.'; + @override + String get placeItems => 'Rilascia qui gli elementi da condividere.'; +} + +// Path: settingsTab +class _Translations$settingsTab$it extends Translations$settingsTab$en { + _Translations$settingsTab$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Impostazioni'; + @override + late final _Translations$settingsTab$general$it general = _Translations$settingsTab$general$it._(_root); + @override + late final _Translations$settingsTab$receive$it receive = _Translations$settingsTab$receive$it._(_root); + @override + late final _Translations$settingsTab$send$it send = _Translations$settingsTab$send$it._(_root); + @override + late final _Translations$settingsTab$network$it network = _Translations$settingsTab$network$it._(_root); + @override + late final _Translations$settingsTab$other$it other = _Translations$settingsTab$other$it._(_root); + @override + String get advancedSettings => 'Impostazioni avanzate'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$it extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Risoluzione dei problemi'; + @override + String get subTitle => 'L\'app non funziona come previsto? Qui puoi trovare le soluzioni più comuni.'; + @override + String get solution => 'Soluzione:'; + @override + String get fixButton => 'Risolvi automaticamente'; + @override + late final _Translations$troubleshootPage$firewall$it firewall = _Translations$troubleshootPage$firewall$it._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$it noDiscovery = _Translations$troubleshootPage$noDiscovery$it._(_root); + @override + late final _Translations$troubleshootPage$noConnection$it noConnection = _Translations$troubleshootPage$noConnection$it._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$it extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Cronologia'; + @override + String get openFolder => 'Apri cartella'; + @override + String get deleteHistory => 'Elimina cronologia'; + @override + String get empty => 'La cronologia è vuota.'; + @override + late final _Translations$receiveHistoryPage$entryActions$it entryActions = _Translations$receiveHistoryPage$entryActions$it._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$it extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'App (APK)'; + @override + String get excludeSystemApps => 'Escludi app di sistema'; + @override + String get excludeAppsWithoutLaunchIntent => 'Escludi app non avviabili'; + @override + String apps({required Object n}) => '${n} App'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$it extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Rimuovi tutti'; +} + +// Path: receivePage +class _Translations$receivePage$it extends Translations$receivePage$en { + _Translations$receivePage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('it'))( + n, + one: 'vuole inviarti un file', + other: 'vuole inviarti ${n} file', + ); + @override + String get subTitleMessage => 'ti ha inviato un messaggio:'; + @override + String get subTitleLink => 'ti ha inviato un link:'; + @override + String get canceled => 'Il mittente ha annullato la richiesta.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$it extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Opzioni'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(cartella LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Disattivato automaticamente in presenza di cartelle.'; +} + +// Path: sendPage +class _Translations$sendPage$it extends Translations$sendPage$en { + _Translations$sendPage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'In attesa di risposta…'; + @override + String get rejected => 'Il destinatario ha rifiutato la richiesta.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Il destinatario è occupato con un\'altra richiesta.'; +} + +// Path: progressPage +class _Translations$progressPage$it extends Translations$progressPage$en { + _Translations$progressPage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Invio di file in corso'; + @override + String get titleReceiving => 'Ricezione di file in corso'; + @override + String get savedToGallery => 'Salvato in Galleria'; + @override + late final _Translations$progressPage$total$it total = _Translations$progressPage$total$it._(_root); + @override + late final _Translations$progressPage$remainingTime$it remainingTime = _Translations$progressPage$remainingTime$it._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$it extends Translations$webSharePage$en { + _Translations$webSharePage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Condividi tramite link'; + @override + String get loading => 'Avvio del server…'; + @override + String get stopping => 'Arresto del server…'; + @override + String get error => 'Si è verificato un errore durante l\'avvio del server.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('it'))( + n, + one: 'Apri questo link nel browser:', + other: 'Apri uno di questi link nel browser:', + ); + @override + String get requests => 'Richieste'; + @override + String get noRequests => 'Ancora nessuna richiesta.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Accetta automaticamente le richieste'; + @override + String get requirePin => 'Richiedi PIN'; + @override + String pinHint({required Object pin}) => 'Il PIN è "${pin}"'; + @override + String get encryptionHint => 'LocalSend utilizza un certificato autofirmato. Devi accettarlo nel browser.'; + @override + String pendingRequests({required Object n}) => 'Richieste in sospeso: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$it extends Translations$aboutPage$en { + _Translations$aboutPage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informazioni su LocalSend'; + @override + List get description => [ + 'LocalSend è un\'app gratuita e open-source che consente di condividere file e messaggi in modo sicuro con dispositivi vicini sulla tua rete locale, senza bisogno di una connessione internet.', + 'Quest\'app è disponibile su Android, iOS, macOS, Windows e Linux. Puoi trovare tutte le opzioni di download sulla homepage ufficiale.', + ]; + @override + String get author => 'Autore'; + @override + String get contributors => 'Contributori'; + @override + String get packagers => 'Packager'; + @override + String get translators => 'Traduttori'; +} + +// Path: donationPage +class _Translations$donationPage$it extends Translations$donationPage$en { + _Translations$donationPage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dona'; + @override + String get info => + 'LocalSend è gratuito, open-source e privo di pubblicità. Se ti piace l\'applicazione, puoi supportarne lo sviluppo con una donazione.'; + @override + String donate({required Object amount}) => 'Dona ${amount}'; + @override + String get thanks => 'Grazie per il tuo supporto!'; + @override + String get restore => 'Ripristina acquisti'; +} + +// Path: changelogPage +class _Translations$changelogPage$it extends Translations$changelogPage$en { + _Translations$changelogPage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Changelog'; +} + +// Path: dialogs +class _Translations$dialogs$it extends Translations$dialogs$en { + _Translations$dialogs$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$it addFile = _Translations$dialogs$addFile$it._(_root); + @override + late final _Translations$dialogs$openFile$it openFile = _Translations$dialogs$openFile$it._(_root); + @override + late final _Translations$dialogs$addressInput$it addressInput = _Translations$dialogs$addressInput$it._(_root); + @override + late final _Translations$dialogs$cancelSession$it cancelSession = _Translations$dialogs$cancelSession$it._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$it cannotOpenFile = _Translations$dialogs$cannotOpenFile$it._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$it encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$it._(_root); + @override + late final _Translations$dialogs$errorDialog$it errorDialog = _Translations$dialogs$errorDialog$it._(_root); + @override + late final _Translations$dialogs$favoriteDialog$it favoriteDialog = _Translations$dialogs$favoriteDialog$it._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$it favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$it._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$it favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$it._(_root); + @override + late final _Translations$dialogs$fileInfo$it fileInfo = _Translations$dialogs$fileInfo$it._(_root); + @override + late final _Translations$dialogs$fileNameInput$it fileNameInput = _Translations$dialogs$fileNameInput$it._(_root); + @override + late final _Translations$dialogs$historyClearDialog$it historyClearDialog = _Translations$dialogs$historyClearDialog$it._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$it localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$it._(_root); + @override + late final _Translations$dialogs$messageInput$it messageInput = _Translations$dialogs$messageInput$it._(_root); + @override + late final _Translations$dialogs$noFiles$it noFiles = _Translations$dialogs$noFiles$it._(_root); + @override + late final _Translations$dialogs$noPermission$it noPermission = _Translations$dialogs$noPermission$it._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$it notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$it._(_root); + @override + late final _Translations$dialogs$qr$it qr = _Translations$dialogs$qr$it._(_root); + @override + late final _Translations$dialogs$quickActions$it quickActions = _Translations$dialogs$quickActions$it._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$it quickSaveNotice = _Translations$dialogs$quickSaveNotice$it._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$it quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$it._(_root); + @override + late final _Translations$dialogs$pin$it pin = _Translations$dialogs$pin$it._(_root); + @override + late final _Translations$dialogs$sendModeHelp$it sendModeHelp = _Translations$dialogs$sendModeHelp$it._(_root); + @override + late final _Translations$dialogs$zoom$it zoom = _Translations$dialogs$zoom$it._(_root); +} + +// Path: sanitization +class _Translations$sanitization$it extends Translations$sanitization$en { + _Translations$sanitization$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Il nome del file non può essere vuoto'; + @override + String get invalid => 'Il nome del file contiene dei caratteri non validi'; +} + +// Path: tray +class _Translations$tray$it extends Translations$tray$en { + _Translations$tray$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Esci da LocalSend'; + @override + String get closeWindows => 'Uscita'; +} + +// Path: web +class _Translations$web$it extends Translations$web$en { + _Translations$web$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Inserisci il PIN'; + @override + String get invalidPin => 'PIN non valido'; + @override + String get tooManyAttempts => 'Troppi tentativi'; + @override + String get rejected => 'Rifiutato'; + @override + String get files => 'File'; + @override + String get fileName => 'Nome del file'; + @override + String get size => 'Dimensione'; +} + +// Path: assetPicker +class _Translations$assetPicker$it extends Translations$assetPicker$en { + _Translations$assetPicker$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Conferma'; + @override + String get cancel => 'Annulla'; + @override + String get edit => 'Modifica'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Caricamento fallito'; + @override + String get original => 'Origine'; + @override + String get preview => 'Anteprima'; + @override + String get select => 'Seleziona'; + @override + String get emptyList => 'Lista vuota'; + @override + String get unSupportedAssetType => 'Tipo di file non supportato.'; + @override + String get unableToAccessAll => 'Impossibile accedere a tutti i file sul dispositivo'; + @override + String get viewingLimitedAssetsTip => 'Visualizza solo file e album accessibili dall\'app.'; + @override + String get changeAccessibleLimitedAssets => 'Clicca per aggiornare i file accessibili'; + @override + String get accessAllTip => + 'L\'app può accedere solo ad alcuni file sul dispositivo. Vai alle impostazioni di sistema e consenti all\'app di accedere a tutti i file multimediali sul dispositivo.'; + @override + String get goToSystemSettings => 'Vai alle impostazioni di sistema'; + @override + String get accessLimitedAssets => 'Continua con accesso limitato'; + @override + String get accessiblePathName => 'File accessibili'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Immagine'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Altri media'; + @override + String get sActionPlayHint => 'riproduci'; + @override + String get sActionPreviewHint => 'anteprima'; + @override + String get sActionSelectHint => 'seleziona'; + @override + String get sActionSwitchPathLabel => 'cambia percorso'; + @override + String get sActionUseCameraHint => 'usa fotocamera'; + @override + String get sNameDurationLabel => 'durata'; + @override + String get sUnitAssetCountLabel => 'conteggio'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$it extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Interfacce di rete'; + @override + String get info => + 'Per impostazione predefinita, LocalSend utilizza tutte le interfacce di rete disponibili. È possibile escludere le reti indesiderate. È necessario riavviare il server per applicare le modifiche.'; + @override + String get preview => 'Anteprima'; + @override + String get whitelist => 'Whitelist'; + @override + String get blacklist => 'Blacklist'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$it extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Porta:'; + @override + String get alias => 'Alias:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$it extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Preferiti'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$it extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Selezione'; + @override + String files({required Object files}) => 'File: ${files}'; + @override + String size({required Object size}) => 'Dimensione: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$it extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get file => 'File'; + @override + String get folder => 'Cartella'; + @override + String get media => 'Media'; + @override + String get text => 'Testo'; + @override + String get app => 'App'; + @override + String get clipboard => 'Incolla'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$it extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get single => 'Destinatario singolo'; + @override + String get multiple => 'Destinatari multipli'; + @override + String get link => 'Condividi tramite link'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$it extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Generale'; + @override + String get brightness => 'Tema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$it brightnessOptions = _Translations$settingsTab$general$brightnessOptions$it._( + _root, + ); + @override + String get color => 'Colore'; + @override + late final _Translations$settingsTab$general$colorOptions$it colorOptions = _Translations$settingsTab$general$colorOptions$it._(_root); + @override + String get language => 'Lingua'; + @override + late final _Translations$settingsTab$general$languageOptions$it languageOptions = _Translations$settingsTab$general$languageOptions$it._(_root); + @override + String get saveWindowPlacement => 'Salva la posizione della finestra all\'uscita'; + @override + String get saveWindowPlacementWindows => 'Salva la posizione della finestra alla chiusura'; + @override + String get minimizeToTray => 'Riduci a icona anziché chiudere'; + @override + String get launchAtStartup => 'Avvio automatico all\'accesso'; + @override + String get launchMinimized => 'Avvio automatico: ridotto a icona'; + @override + String get showInContextMenu => 'Mostra LocalSend nel menù contestuale'; + @override + String get animations => 'Animazioni'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$it extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ricevi'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Termina automaticamente'; + @override + String get destination => 'Destinazione'; + @override + String get downloads => '(Download)'; + @override + String get saveToGallery => 'Salva i media nella galleria'; + @override + String get saveToHistory => 'Salva nella cronologia'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$it extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Invia'; + @override + String get shareViaLinkAutoAccept => 'Accetta automaticamente le richieste in modalità "Condividi tramite link"'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$it extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rete'; + @override + String get needRestart => 'Riavvia il server per applicare le modifiche!'; + @override + String get server => 'Server'; + @override + String get alias => 'Nome del dispositivo'; + @override + String get deviceType => 'Tipo di dispositivo'; + @override + String get deviceModel => 'Modello del dispositivo'; + @override + String get port => 'Porta'; + @override + String get discoveryTimeout => 'Timeout di rilevamento'; + @override + String get useSystemName => 'Usa il nome di sistema'; + @override + String get generateRandomAlias => 'Genera un alias casuale'; + @override + String portWarning({required Object defaultPort}) => + 'Potresti non essere rilevato da altri dispositivi perché stai utilizzando una porta personalizzata. (predefinita: ${defaultPort})'; + @override + String get encryption => 'Crittografia'; + @override + String get multicastGroup => 'Indirizzo Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Potresti non essere rilevato dagli altri dispositivi perché stai utilizzando un indirizzo multicast personalizzato. (predefinito: ${defaultMulticast})'; + @override + String get network => 'Rete'; + @override + late final _Translations$settingsTab$network$networkOptions$it networkOptions = _Translations$settingsTab$network$networkOptions$it._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$it extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Altro'; + @override + String get support => 'Supporta LocalSend'; + @override + String get donate => 'Dona'; + @override + String get privacyPolicy => 'Informativa sulla privacy'; + @override + String get termsOfUse => 'Termini di utilizzo'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$it extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Questa app può inviare file ad altri dispositivi, ma altri dispositivi non possono inviare file a questo dispositivo.'; + @override + String solution({required Object port}) => + 'È molto probabile che si tratti di un problema di firewall. Puoi risolverlo consentendo connessioni in entrata (UDP e TCP) sulla porta ${port}.'; + @override + String get openFirewall => 'Apri Firewall'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$it extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Questo dispositivo non riesce a rilevare altri dispositivi.'; + @override + String get solution => + 'Assicurati che tutti i dispositivi siano sulla stessa rete Wi-Fi e condividano la stessa configurazione (porta, indirizzo multicast, crittografia). Puoi provare a digitare manualmente l\'indirizzo IP del dispositivo di destinazione. Se funziona, considera di aggiungere questo dispositivo ai preferiti in modo che possa essere scoperto automaticamente in futuro.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$it extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Entrambi i dispositivi non sono in grado di riconoscersi a vicenda né di condividere file.'; + @override + String get solution => + 'Il problema si presenta da entrambi le parti? In tal caso, assicurati che i dispositivi siano sulla stessa rete Wi-Fi e condividano la stessa configurazione (porta, indirizzo multicast, crittografia). La rete Wi-Fi potrebbe non consentire la comunicazione tra i partecipanti (isolamento dell\'Access Point). In questo caso, l\'opzione deve essere abilitata sul router.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$it extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get open => 'Apri file'; + @override + String get showInFolder => 'Mostra nella cartella'; + @override + String get info => 'Informazioni'; + @override + String get deleteFromHistory => 'Elimina dalla cronologia'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$it extends Translations$progressPage$total$en { + _Translations$progressPage$total$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$it title = _Translations$progressPage$total$title$it._(_root); + @override + String count({required Object curr, required Object n}) => 'File: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Dimensione: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Velocità: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$it extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + + /// Usa 'h' come abbreviazione per ore e 'm' per minuti + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Usa 'd' per giorni, 'h' per ore, e 'm' per minuti + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; + + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$it extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aggiungi alla selezione'; + @override + String get content => 'Cosa vuoi aggiungere?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$it extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Apri file'; + @override + String get content => 'Vuoi aprire il file ricevuto?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$it extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Inserisci l\'indirizzo'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'Indirizzo IP'; + @override + String get recentlyUsed => 'Usato di recente: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$it extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Interrompi trasferimento'; + @override + String get content => 'Sei sicuro di voler interrompere il trasferimento?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$it extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Impossibile aprire il file'; + @override + String content({required Object file}) => 'Impossibile aprire "${file}". Hai spostato, rinominato o eliminato il file?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$it extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Crittografia disabilitata'; + @override + String get content => + 'La comunicazione ora avviene tramite il protocollo HTTP non crittografato. Per usare il protocollo crittografato HTTPS, abilita la crittografia.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$it extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$it extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Preferiti'; + @override + String get noFavorites => 'Non ci sono ancora dispositivi preferiti.'; + @override + String get addFavorite => 'Aggiungi'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$it extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rimuovi dai preferiti'; + @override + String content({required Object name}) => 'Sei davvero sicuro di voler rimuovere "${name}" dai preferiti?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$it extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Aggiungi ai preferiti'; + @override + String get titleEdit => 'Modifica'; + @override + String get name => 'Nome del dispositivo'; + @override + String get auto => '(automatico)'; + @override + String get ip => 'Indirizzo IP'; + @override + String get port => 'Porta'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$it extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informazioni sul file'; + @override + String get fileName => 'Nome del file:'; + @override + String get path => 'Percorso:'; + @override + String get size => 'Dimensione:'; + @override + String get sender => 'Mittente:'; + @override + String get time => 'Ora:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$it extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Inserisci nome file'; + @override + String original({required Object original}) => 'Originale: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$it extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Cancella cronologia'; + @override + String get content => 'Vuoi davvero eliminare l\'intera cronologia?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$it extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend non può trovare altri dispositivi senza il permesso per la scansione della rete locale. Puoi concedere questo permesso nelle impostazioni.'; + @override + String get gotoSettings => 'Impostazioni'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$it extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Scrivi un messaggio'; + @override + String get multiline => 'Multilinea'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$it extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nessun file selezionato'; + @override + String get content => 'Seleziona almeno un file.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$it extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nessun permesso'; + @override + String get content => 'Non hai concesso le autorizzazioni necessarie. Si prega di concederle nelle impostazioni.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$it extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Non disponibile'; + @override + String get content => 'Questa funzione è disponibile solo su:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$it extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Codice QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$it extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Azioni rapide'; + @override + String get counter => 'Contatore'; + @override + String get prefix => 'Prefisso'; + @override + String get padZero => 'Riempi con zero'; + @override + String get sortBeforeCount => 'Preordina alfabeticamente (A-Z)'; + @override + String get random => 'Casuale'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$it extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Le richieste di file ora vengono accettate automaticamente. Tieni presente che chiunque abbia accesso alla tua rete locale può inviarti file.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$it extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Ora le richieste di file vengono accettate automaticamente dai dispositivi presenti nell\'elenco dei preferiti.', + 'Attenzione! Al momento, questa soluzione non è del tutto sicura, poiché un hacker che possiede l\'impronta digitale di un qualsiasi dispositivo presente nella tua lista dei preferiti può inviarti file senza restrizioni.', + 'Tuttavia, questa opzione è comunque più sicura rispetto al consentire a tutti gli utenti della rete locale di inviarti file senza restrizioni.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$it extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Inserisci il PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$it extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Modalità di invio'; + @override + String get single => 'Invia file a un destinatario. Gli elementi saranno deselezionati dopo il trasferimento dei file.'; + @override + String get multiple => 'Invia file a più destinatari. Gli elementi non saranno deselezionati dopo il trasferimento dei file.'; + @override + String get link => 'I destinatari che non hanno installato LocalSend possono scaricare i file selezionati aprendo il link nel loro browser.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$it extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$it extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get dark => 'Scuro'; + @override + String get light => 'Chiaro'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$it extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$it extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$it extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String get all => 'Tutto'; + @override + String get filtered => 'Filtrato'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$it extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$it._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Progresso complessivo (${time})'; + @override + String get finishedError => 'Terminato con errore'; + @override + String get canceledSender => 'Annullato dal mittente'; + @override + String get canceledReceiver => 'Annullato dal destinatario'; +} diff --git a/app/lib/gen/strings_ja.g.dart b/app/lib/gen/strings_ja.g.dart new file mode 100644 index 0000000..ea992cf --- /dev/null +++ b/app/lib/gen/strings_ja.g.dart @@ -0,0 +1,1405 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsJa extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsJa({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ja, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsJa _root = this; // ignore: unused_field + + @override + TranslationsJa $copyWith({TranslationMetadata? meta}) => TranslationsJa(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => '日本語'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$ja general = _Translations$general$ja._(_root); + @override + late final _Translations$receiveTab$ja receiveTab = _Translations$receiveTab$ja._(_root); + @override + late final _Translations$sendTab$ja sendTab = _Translations$sendTab$ja._(_root); + @override + late final _Translations$settingsTab$ja settingsTab = _Translations$settingsTab$ja._(_root); + @override + late final _Translations$troubleshootPage$ja troubleshootPage = _Translations$troubleshootPage$ja._(_root); + @override + late final _Translations$receiveHistoryPage$ja receiveHistoryPage = _Translations$receiveHistoryPage$ja._(_root); + @override + late final _Translations$apkPickerPage$ja apkPickerPage = _Translations$apkPickerPage$ja._(_root); + @override + late final _Translations$selectedFilesPage$ja selectedFilesPage = _Translations$selectedFilesPage$ja._(_root); + @override + late final _Translations$receivePage$ja receivePage = _Translations$receivePage$ja._(_root); + @override + late final _Translations$receiveOptionsPage$ja receiveOptionsPage = _Translations$receiveOptionsPage$ja._(_root); + @override + late final _Translations$sendPage$ja sendPage = _Translations$sendPage$ja._(_root); + @override + late final _Translations$progressPage$ja progressPage = _Translations$progressPage$ja._(_root); + @override + late final _Translations$webSharePage$ja webSharePage = _Translations$webSharePage$ja._(_root); + @override + late final _Translations$aboutPage$ja aboutPage = _Translations$aboutPage$ja._(_root); + @override + late final _Translations$donationPage$ja donationPage = _Translations$donationPage$ja._(_root); + @override + late final _Translations$changelogPage$ja changelogPage = _Translations$changelogPage$ja._(_root); + @override + late final _Translations$dialogs$ja dialogs = _Translations$dialogs$ja._(_root); + @override + late final _Translations$sanitization$ja sanitization = _Translations$sanitization$ja._(_root); + @override + late final _Translations$tray$ja tray = _Translations$tray$ja._(_root); + @override + late final _Translations$web$ja web = _Translations$web$ja._(_root); + @override + late final _Translations$assetPicker$ja assetPicker = _Translations$assetPicker$ja._(_root); + @override + late final _Translations$networkInterfacesPage$ja networkInterfacesPage = _Translations$networkInterfacesPage$ja._(_root); +} + +// Path: general +class _Translations$general$ja extends Translations$general$en { + _Translations$general$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get accept => '承諾'; + @override + String get accepted => '承諾済み'; + @override + String get add => '追加'; + @override + String get advanced => '詳細'; + @override + String get cancel => 'キャンセル'; + @override + String get close => '閉じる'; + @override + String get confirm => '確認'; + @override + String get continueStr => '続行'; + @override + String get copy => 'コピー'; + @override + String get copiedToClipboard => 'クリップボードにコピーしました'; + @override + String get decline => '拒否'; + @override + String get done => '完了'; + @override + String get delete => '削除'; + @override + String get edit => '編集'; + @override + String get error => 'エラー'; + @override + String get example => '例'; + @override + String get files => 'ファイル'; + @override + String get finished => '完了しました'; + @override + String get hide => '隠す'; + @override + String get off => 'オフ'; + @override + String get offline => 'オフライン'; + @override + String get on => 'オン'; + @override + String get online => 'オンライン'; + @override + String get open => '開く'; + @override + String get queue => '順番待ち'; + @override + String get quickSave => 'クイックセーブ'; + @override + String get quickSaveFromFavorites => '「お気に入り」からクイックセーブ'; + @override + String get renamed => '改名済み'; + @override + String get reset => 'リセット'; + @override + String get restart => '再起動'; + @override + String get settings => '設定'; + @override + String get skipped => 'スキップ済み'; + @override + String get start => '開始'; + @override + String get stop => '停止'; + @override + String get save => '保存'; + @override + String get unchanged => '変更なし'; + @override + String get unknown => '不明'; + @override + String get noItemInClipboard => 'クリップボードにアイテムがありません'; +} + +// Path: receiveTab +class _Translations$receiveTab$ja extends Translations$receiveTab$en { + _Translations$receiveTab$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '受信'; + @override + late final _Translations$receiveTab$infoBox$ja infoBox = _Translations$receiveTab$infoBox$ja._(_root); + @override + late final _Translations$receiveTab$quickSave$ja quickSave = _Translations$receiveTab$quickSave$ja._(_root); +} + +// Path: sendTab +class _Translations$sendTab$ja extends Translations$sendTab$en { + _Translations$sendTab$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '送信'; + @override + late final _Translations$sendTab$selection$ja selection = _Translations$sendTab$selection$ja._(_root); + @override + late final _Translations$sendTab$picker$ja picker = _Translations$sendTab$picker$ja._(_root); + @override + String get shareIntentInfo => 'モバイルデバイスの「共有」機能を使うと、より簡単にファイルを選択できます。'; + @override + String get nearbyDevices => '近くのデバイス'; + @override + String get thisDevice => 'このデバイス'; + @override + String get scan => 'デバイスを検索'; + @override + String get manualSending => '手動送信'; + @override + String get sendMode => '送信モード'; + @override + late final _Translations$sendTab$sendModes$ja sendModes = _Translations$sendTab$sendModes$ja._(_root); + @override + String get sendModeHelp => '説明'; + @override + String get help => '目標のデバイスが同じWi-Fiネットワーク内にあることを確認してください。'; + @override + String get placeItems => '共有するアイテムを配置してください。'; +} + +// Path: settingsTab +class _Translations$settingsTab$ja extends Translations$settingsTab$en { + _Translations$settingsTab$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '設定'; + @override + late final _Translations$settingsTab$general$ja general = _Translations$settingsTab$general$ja._(_root); + @override + late final _Translations$settingsTab$receive$ja receive = _Translations$settingsTab$receive$ja._(_root); + @override + late final _Translations$settingsTab$send$ja send = _Translations$settingsTab$send$ja._(_root); + @override + late final _Translations$settingsTab$network$ja network = _Translations$settingsTab$network$ja._(_root); + @override + late final _Translations$settingsTab$other$ja other = _Translations$settingsTab$other$ja._(_root); + @override + String get advancedSettings => '詳細設定'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$ja extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'トラブルシューティング'; + @override + String get subTitle => 'アプリが期待通りに動作しませんか?ここでは一般的な解決策を紹介します。'; + @override + String get solution => '解決策:'; + @override + String get fixButton => '自動で修正する'; + @override + late final _Translations$troubleshootPage$firewall$ja firewall = _Translations$troubleshootPage$firewall$ja._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$ja noDiscovery = _Translations$troubleshootPage$noDiscovery$ja._(_root); + @override + late final _Translations$troubleshootPage$noConnection$ja noConnection = _Translations$troubleshootPage$noConnection$ja._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$ja extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '履歴'; + @override + String get openFolder => 'フォルダを開く'; + @override + String get deleteHistory => '履歴を消去'; + @override + String get empty => '履歴には何もありません。'; + @override + late final _Translations$receiveHistoryPage$entryActions$ja entryActions = _Translations$receiveHistoryPage$entryActions$ja._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$ja extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'アプリ (APK)'; + @override + String get excludeSystemApps => 'システムアプリを除外'; + @override + String get excludeAppsWithoutLaunchIntent => '起動できないアプリを除外'; + @override + String apps({required Object n}) => '${n} 個'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$ja extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'すべて削除'; +} + +// Path: receivePage +class _Translations$receivePage$ja extends Translations$receivePage$en { + _Translations$receivePage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ja'))( + n, + one: 'がファイルを送信しようとしています。', + other: 'が ${n} 件のファイルを送信しようとしています。', + ); + @override + String get subTitleMessage => 'がメッセージを送信しました:'; + @override + String get subTitleLink => 'がリンクを送信しました:'; + @override + String get canceled => '送信者がリクエストをキャンセルしました。'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$ja extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'オプション'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend フォルダー)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'ディレクトリーがあるため自動で無効になっています。'; +} + +// Path: sendPage +class _Translations$sendPage$ja extends Translations$sendPage$en { + _Translations$sendPage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get waiting => '返答を待っています...'; + @override + String get rejected => '受信者がリクエストを拒否しました。'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => '受信者は他のリクエストの処理中です。'; +} + +// Path: progressPage +class _Translations$progressPage$ja extends Translations$progressPage$en { + _Translations$progressPage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'ファイルを送信中'; + @override + String get titleReceiving => 'ファイルを受信中'; + @override + String get savedToGallery => '写真に保存しました'; + @override + late final _Translations$progressPage$total$ja total = _Translations$progressPage$total$ja._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$ja extends Translations$webSharePage$en { + _Translations$webSharePage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'リンク経由で共有'; + @override + String get loading => 'サーバーを起動中...'; + @override + String get stopping => 'サーバーを停止中...'; + @override + String get error => 'サーバーの起動中にエラーが発生しました。'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ja'))( + n, + one: 'このリンクをブラウザーで開いてください:', + other: 'これらのリンクのいずれかをブラウザーで開いてください:', + ); + @override + String get requests => 'リクエスト'; + @override + String get noRequests => 'リクエストはまだありません。'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => '自動でリクエストを承諾する'; + @override + String get requirePin => 'PINコードを要求'; + @override + String pinHint({required Object pin}) => 'PINコードは "${pin}" です'; + @override + String get encryptionHint => 'LocalSendは自己署名証明書を使用しているため、ブラウザーで証明書を許可する必要があります。'; + @override + String pendingRequests({required Object n}) => '保留中のリクエスト数: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$ja extends Translations$aboutPage$en { + _Translations$aboutPage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'LocalSendについて'; + @override + List get description => [ + 'LocalSendは無料のオープンソースアプリで、インターネットに接続することなく、ローカルネットワーク経由で近くにあるデバイスとファイルやメッセージを安全に共有することができます。', + '本アプリはAndroid、iOS、macOS、Windows、Linuxで利用でき、公式ホームページからダウンロードすることができます。', + ]; + @override + String get author => '制作者'; + @override + String get contributors => '貢献者'; + @override + String get packagers => 'パッケージ協力者'; + @override + String get translators => '翻訳者'; +} + +// Path: donationPage +class _Translations$donationPage$ja extends Translations$donationPage$en { + _Translations$donationPage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '寄付'; + @override + String get info => 'LocalSendは無料かつオープンソースで、広告を一切含みません。もしアプリを気に入っていただけたら、寄付で開発を支援することができます。'; + @override + String donate({required Object amount}) => '${amount} 寄付する'; + @override + String get thanks => 'ありがとうございます!'; + @override + String get restore => '購入を復元する'; +} + +// Path: changelogPage +class _Translations$changelogPage$ja extends Translations$changelogPage$en { + _Translations$changelogPage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '更新履歴'; +} + +// Path: dialogs +class _Translations$dialogs$ja extends Translations$dialogs$en { + _Translations$dialogs$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$ja addFile = _Translations$dialogs$addFile$ja._(_root); + @override + late final _Translations$dialogs$openFile$ja openFile = _Translations$dialogs$openFile$ja._(_root); + @override + late final _Translations$dialogs$addressInput$ja addressInput = _Translations$dialogs$addressInput$ja._(_root); + @override + late final _Translations$dialogs$cancelSession$ja cancelSession = _Translations$dialogs$cancelSession$ja._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$ja cannotOpenFile = _Translations$dialogs$cannotOpenFile$ja._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$ja encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$ja._(_root); + @override + late final _Translations$dialogs$errorDialog$ja errorDialog = _Translations$dialogs$errorDialog$ja._(_root); + @override + late final _Translations$dialogs$favoriteDialog$ja favoriteDialog = _Translations$dialogs$favoriteDialog$ja._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$ja favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$ja._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$ja favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$ja._(_root); + @override + late final _Translations$dialogs$fileInfo$ja fileInfo = _Translations$dialogs$fileInfo$ja._(_root); + @override + late final _Translations$dialogs$fileNameInput$ja fileNameInput = _Translations$dialogs$fileNameInput$ja._(_root); + @override + late final _Translations$dialogs$historyClearDialog$ja historyClearDialog = _Translations$dialogs$historyClearDialog$ja._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$ja localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$ja._(_root); + @override + late final _Translations$dialogs$messageInput$ja messageInput = _Translations$dialogs$messageInput$ja._(_root); + @override + late final _Translations$dialogs$noFiles$ja noFiles = _Translations$dialogs$noFiles$ja._(_root); + @override + late final _Translations$dialogs$noPermission$ja noPermission = _Translations$dialogs$noPermission$ja._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$ja notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$ja._(_root); + @override + late final _Translations$dialogs$qr$ja qr = _Translations$dialogs$qr$ja._(_root); + @override + late final _Translations$dialogs$quickActions$ja quickActions = _Translations$dialogs$quickActions$ja._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$ja quickSaveNotice = _Translations$dialogs$quickSaveNotice$ja._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$ja quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$ja._(_root); + @override + late final _Translations$dialogs$pin$ja pin = _Translations$dialogs$pin$ja._(_root); + @override + late final _Translations$dialogs$sendModeHelp$ja sendModeHelp = _Translations$dialogs$sendModeHelp$ja._(_root); + @override + late final _Translations$dialogs$zoom$ja zoom = _Translations$dialogs$zoom$ja._(_root); +} + +// Path: sanitization +class _Translations$sanitization$ja extends Translations$sanitization$en { + _Translations$sanitization$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get empty => 'ファイル名は空にできません'; + @override + String get invalid => 'ファイル名に無効な文字が含まれています'; +} + +// Path: tray +class _Translations$tray$ja extends Translations$tray$en { + _Translations$tray$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'LocalSendを終了'; + @override + String get closeWindows => '終了'; +} + +// Path: web +class _Translations$web$ja extends Translations$web$en { + _Translations$web$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'PINコードを入力'; + @override + String get invalidPin => 'PINコードが無効です'; + @override + String get tooManyAttempts => '試行回数が多すぎます'; + @override + String get rejected => '拒否済み'; + @override + String get files => 'ファイル'; + @override + String get fileName => 'ファイル名'; + @override + String get size => 'サイズ'; +} + +// Path: assetPicker +class _Translations$assetPicker$ja extends Translations$assetPicker$en { + _Translations$assetPicker$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get confirm => '確認'; + @override + String get cancel => 'キャンセル'; + @override + String get edit => '編集'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => '読み込みに失敗しました'; + @override + String get original => '元の画像'; + @override + String get preview => 'プレビュー'; + @override + String get select => '選択'; + @override + String get emptyList => 'リストが空です'; + @override + String get unSupportedAssetType => '未対応のファイル形式です。'; + @override + String get unableToAccessAll => 'デバイス上のすべてのファイルにアクセスできません'; + @override + String get viewingLimitedAssetsTip => 'アプリからアクセス可能なファイルやアルバムのみを表示します。'; + @override + String get changeAccessibleLimitedAssets => 'クリックしてアクセス可能なファイルを設定する'; + @override + String get accessAllTip => 'アプリが端末の一部のファイルにしかアクセスできません。システム設定を開き、アプリがデバイス上のすべてのメディアにアクセスすることを許可してください。'; + @override + String get goToSystemSettings => 'システム設定に移動'; + @override + String get accessLimitedAssets => '限定されたアクセスで続ける'; + @override + String get accessiblePathName => 'アクセス可能なファイル'; + @override + String get sTypeAudioLabel => '音声'; + @override + String get sTypeImageLabel => '画像'; + @override + String get sTypeVideoLabel => '動画'; + @override + String get sTypeOtherLabel => 'その他のメディア'; + @override + String get sActionPlayHint => '再生'; + @override + String get sActionPreviewHint => 'プレビュー'; + @override + String get sActionSelectHint => '選択'; + @override + String get sActionSwitchPathLabel => 'パスを切り替え'; + @override + String get sActionUseCameraHint => 'カメラを使う'; + @override + String get sNameDurationLabel => '長さ'; + @override + String get sUnitAssetCountLabel => '個数'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$ja extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get preview => 'プレビュー'; + @override + String get blacklist => 'ブラックリスト'; + @override + String get whitelist => 'ホワイトリスト'; + @override + String get title => 'ネットワークインターフェース'; + @override + String get info => 'デフォルトでは、LocalSend は利用可能なすべてのネットワークインターフェースを使用します。不要なネットワークを除外するには、ここで設定できます。変更を適用するには、サーバーを再起動する必要があります。'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$ja extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'ポート:'; + @override + String get alias => '別名:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$ja extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'お気に入り'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$ja extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '選択'; + @override + String files({required Object files}) => 'ファイル数: ${files}'; + @override + String size({required Object size}) => 'サイズ: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$ja extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get file => 'ファイル'; + @override + String get folder => 'フォルダー'; + @override + String get media => 'メディア'; + @override + String get text => 'テキスト'; + @override + String get app => 'アプリ'; + @override + String get clipboard => 'ペースト'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$ja extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get single => '一対一送信'; + @override + String get multiple => '一対多送信'; + @override + String get link => 'リンク経由で共有'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$ja extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '一般'; + @override + String get brightness => '明るさ'; + @override + late final _Translations$settingsTab$general$brightnessOptions$ja brightnessOptions = _Translations$settingsTab$general$brightnessOptions$ja._( + _root, + ); + @override + String get color => 'カラー'; + @override + late final _Translations$settingsTab$general$colorOptions$ja colorOptions = _Translations$settingsTab$general$colorOptions$ja._(_root); + @override + String get language => '言語'; + @override + late final _Translations$settingsTab$general$languageOptions$ja languageOptions = _Translations$settingsTab$general$languageOptions$ja._(_root); + @override + String get saveWindowPlacement => '終了時: ウィンドウ配置を記憶'; + @override + String get saveWindowPlacementWindows => '終了時にウィンドウ配置を記憶'; + @override + String get minimizeToTray => '終了時: トレイに最小化'; + @override + String get launchAtStartup => 'ログイン時に自動で起動'; + @override + String get launchMinimized => '自動起動時: 隠れた状態で開始'; + @override + String get showInContextMenu => 'コンテキストメニューにLocalSendを表示'; + @override + String get animations => 'アニメーション'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$ja extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '受信'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => '自動で完了'; + @override + String get destination => '保存先'; + @override + String get downloads => '(ダウンロード)'; + @override + String get saveToGallery => 'メディアをギャラリーに保存'; + @override + String get saveToHistory => '履歴に保存'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$ja extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '送信'; + @override + String get shareViaLinkAutoAccept => 'リンク経由で共有時: 自動で承諾'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$ja extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'ネットワーク'; + @override + String get needRestart => '設定を反映するにはサーバーを再起動してください!'; + @override + String get server => 'サーバー'; + @override + String get alias => '別名'; + @override + String get deviceType => 'デバイスタイプ'; + @override + String get deviceModel => 'デバイスモデル'; + @override + String get port => 'ポート'; + @override + String get discoveryTimeout => '探索がタイムアウトしました'; + @override + String get useSystemName => 'システム名を使用'; + @override + String get generateRandomAlias => 'ランダムな別名を生成'; + @override + String portWarning({required Object defaultPort}) => 'ポートが変更されているため、このデバイスが他のデバイスから検出されなくなる場合があります。(デフォルト: ${defaultPort})'; + @override + String get encryption => '暗号化'; + @override + String get multicastGroup => 'マルチキャスト'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => 'マルチキャストアドレスが変更されているため、他のデバイスから検出されなくなる場合があります。(デフォルト: ${defaultMulticast})'; + @override + String get network => 'ネットワーク'; + @override + late final _Translations$settingsTab$network$networkOptions$ja networkOptions = _Translations$settingsTab$network$networkOptions$ja._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$ja extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'その他'; + @override + String get support => 'LocalSendを支援'; + @override + String get donate => '寄付'; + @override + String get privacyPolicy => 'プライバシーポリシー'; + @override + String get termsOfUse => '利用規約'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$ja extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'このアプリから他のデバイスへはファイルを送信できるのに、他のデバイスからこのデバイスへはファイルが送信できない。'; + @override + String solution({required Object port}) => 'ファイアウォールに問題があると思われます。ポート ${port} の受け入れ (UDPとTCP) を許可することでこの問題を解決できます。'; + @override + String get openFirewall => 'ファイアウォールを開く'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$ja extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'このデバイスで他のデバイスを見つけられない。'; + @override + String get solution => + 'すべてのデバイスが同じWi-Fiネットワーク上にあり、各種設定(ポート、マルチキャストアドレス、暗号化)が一致していることを確認してください。もしくは、送信先デバイスのIPアドレスを手動で入力することもできます。これでうまくいく場合は、そのデバイスをお気に入りに追加して、今後自動的に検出できるようにすることもご検討ください。'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$ja extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'どちらのデバイスも互いに表示されず、ファイルも共有できない。'; + @override + String get solution => + '双方で問題が発生している場合は、両方のデバイスが同じWi-Fiネットワーク上にあり、ポート・マルチキャストアドレス・暗号化の設定が一致していることを確認してください。Wi-Fiネットワークが接続者同士の通信を許可していない可能性もあります。その場合は、ルーターの設定でそれを許可する必要があります。'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$ja extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get open => 'ファイルを開く'; + @override + String get showInFolder => 'フォルダーに表示'; + @override + String get info => '情報'; + @override + String get deleteFromHistory => '履歴から削除'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$ja extends Translations$progressPage$total$en { + _Translations$progressPage$total$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$ja title = _Translations$progressPage$total$title$ja._(_root); + @override + String count({required Object curr, required Object n}) => 'ファイル: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'サイズ: ${curr} / ${n}'; + @override + String speed({required Object speed}) => '速度: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$ja extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '選択に追加'; + @override + String get content => '何を追加しますか?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$ja extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'ファイルを開く'; + @override + String get content => '受信したファイルを開きますか?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$ja extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'アドレスを入力'; + @override + String get hashtag => 'ハッシュタグ'; + @override + String get ip => 'IPアドレス'; + @override + String get recentlyUsed => '最近使用したアドレス: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$ja extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'ファイル転送をキャンセル'; + @override + String get content => '本当にファイル転送をキャンセルしますか?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$ja extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'ファイルを開けません'; + @override + String content({required Object file}) => '"${file}"を開けませんでした。ファイルが移動、改名、削除された可能性があります。'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$ja extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '暗号化は無効です'; + @override + String get content => 'これより、通信は暗号化されていないHTTPプロトコルで行われます。HTTPSを使用するには、暗号化を再度有効にしてください。'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$ja extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$ja extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'お気に入り'; + @override + String get noFavorites => 'お気に入りしたデバイスがありません。'; + @override + String get addFavorite => '追加'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$ja extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'お気に入りから削除'; + @override + String content({required Object name}) => '本当に"${name}"をお気に入りから削除しますか?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$ja extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'お気に入りに追加'; + @override + String get titleEdit => '編集'; + @override + String get name => '別名'; + @override + String get auto => '(自動)'; + @override + String get ip => 'IPアドレス'; + @override + String get port => 'ポート'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$ja extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'ファイルの情報'; + @override + String get fileName => 'ファイル名:'; + @override + String get path => 'ファイルパス:'; + @override + String get size => 'サイズ:'; + @override + String get sender => '送信者:'; + @override + String get time => '時間:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$ja extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'ファイル名を入力'; + @override + String original({required Object original}) => '元の名前: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$ja extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '履歴をクリア'; + @override + String get content => '本当にすべての履歴を削除しますか?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$ja extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => 'ローカルネットワークをスキャンする権限がないと、LocalSendは他のデバイスを見つけることができません。設定よりこの権限を付与してください。'; + @override + String get gotoSettings => '設定'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$ja extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'メッセージを入力'; + @override + String get multiline => '複数行'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$ja extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'ファイルが選択されていません'; + @override + String get content => '少なくとも1つのファイルを選択してください。'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$ja extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '権限がありません'; + @override + String get content => '必要な権限を許可していません。設定で許可してください。'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$ja extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '利用不可'; + @override + String get content => 'この機能は次のプラットフォームでのみ利用できます:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$ja extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'QRコード'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$ja extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'クイックアクション'; + @override + String get counter => 'カウンター'; + @override + String get prefix => '接頭辞'; + @override + String get padZero => '先頭をゼロで埋める'; + @override + String get sortBeforeCount => '事前にアルファベット順で並べる'; + @override + String get random => 'ランダム'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$ja extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'ファイルリクエストが自動で承諾されます。ローカルネットワーク内の全員がファイルを送信できるので注意してください。'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$ja extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'お気に入りリストにあるデバイスからのファイルリクエストを自動的に受け入れます。', + '警告 現時点では、お気に入りリストのデバイスと一致するフィンガープリントがあればハッカーが無制限にファイルを送信できてしまうため、この設定は完全に安全とは言えません。', + 'ですが、この設定はローカルネットワーク上のすべてのユーザーに無制限のファイル送信を許可するよりはまだ安全です。', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$ja extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'PINコードを入力'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$ja extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => '送信モード'; + @override + String get single => '単一の受信者にファイルを送信します。ファイルの転送完了後、選択は解除されます。'; + @override + String get multiple => '複数の受信者にファイルを送信します。ファイルの選択は解除されません。'; + @override + String get link => 'LocalSendをインストールしていない受信者でも、ブラウザでリンクを開くことで選択したファイルをダウンロードできます。'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$ja extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$ja extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get system => 'システム'; + @override + String get dark => 'ダーク'; + @override + String get light => 'ライト'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$ja extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get system => 'システム'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$ja extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get system => 'システム'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$ja extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String get all => 'すべて'; + @override + String get filtered => 'フィルター'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$ja extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$ja._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => '総進捗 (${time})'; + @override + String get finishedError => 'エラーで終了しました'; + @override + String get canceledSender => '送信者によりキャンセルされました'; + @override + String get canceledReceiver => '受信者よりキャンセルされました'; +} diff --git a/app/lib/gen/strings_km.g.dart b/app/lib/gen/strings_km.g.dart new file mode 100644 index 0000000..3a1e004 --- /dev/null +++ b/app/lib/gen/strings_km.g.dart @@ -0,0 +1,1477 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsKm extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsKm({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.km, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsKm _root = this; // ignore: unused_field + + @override + TranslationsKm $copyWith({TranslationMetadata? meta}) => TranslationsKm(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'ភាសាខ្មែរ'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$km general = _Translations$general$km._(_root); + @override + late final _Translations$receiveTab$km receiveTab = _Translations$receiveTab$km._(_root); + @override + late final _Translations$sendTab$km sendTab = _Translations$sendTab$km._(_root); + @override + late final _Translations$settingsTab$km settingsTab = _Translations$settingsTab$km._(_root); + @override + late final _Translations$troubleshootPage$km troubleshootPage = _Translations$troubleshootPage$km._(_root); + @override + late final _Translations$receiveHistoryPage$km receiveHistoryPage = _Translations$receiveHistoryPage$km._(_root); + @override + late final _Translations$apkPickerPage$km apkPickerPage = _Translations$apkPickerPage$km._(_root); + @override + late final _Translations$selectedFilesPage$km selectedFilesPage = _Translations$selectedFilesPage$km._(_root); + @override + late final _Translations$receivePage$km receivePage = _Translations$receivePage$km._(_root); + @override + late final _Translations$receiveOptionsPage$km receiveOptionsPage = _Translations$receiveOptionsPage$km._(_root); + @override + late final _Translations$sendPage$km sendPage = _Translations$sendPage$km._(_root); + @override + late final _Translations$progressPage$km progressPage = _Translations$progressPage$km._(_root); + @override + late final _Translations$webSharePage$km webSharePage = _Translations$webSharePage$km._(_root); + @override + late final _Translations$aboutPage$km aboutPage = _Translations$aboutPage$km._(_root); + @override + late final _Translations$donationPage$km donationPage = _Translations$donationPage$km._(_root); + @override + late final _Translations$changelogPage$km changelogPage = _Translations$changelogPage$km._(_root); + @override + late final _Translations$aliasGenerator$km aliasGenerator = _Translations$aliasGenerator$km._(_root); + @override + late final _Translations$dialogs$km dialogs = _Translations$dialogs$km._(_root); + @override + late final _Translations$sanitization$km sanitization = _Translations$sanitization$km._(_root); + @override + late final _Translations$tray$km tray = _Translations$tray$km._(_root); + @override + late final _Translations$web$km web = _Translations$web$km._(_root); + @override + late final _Translations$assetPicker$km assetPicker = _Translations$assetPicker$km._(_root); +} + +// Path: general +class _Translations$general$km extends Translations$general$en { + _Translations$general$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get accept => 'ទទួល'; + @override + String get accepted => 'បានទទួល'; + @override + String get add => 'បន្ថែម'; + @override + String get advanced => 'កម្រិតខ្ពស់'; + @override + String get cancel => 'បោះបង់'; + @override + String get close => 'បិទ'; + @override + String get confirm => 'បញ្ជាក់'; + @override + String get continueStr => 'បន្ត'; + @override + String get copy => 'ចម្លង'; + @override + String get copiedToClipboard => 'បានចម្លងទៅឃ្លីបប៊ត'; + @override + String get decline => 'បដិសេធ'; + @override + String get done => 'រួចរាល់'; + @override + String get delete => 'លុប'; + @override + String get edit => 'កែប្រែ'; + @override + String get error => 'មានបញ្ហា'; + @override + String get example => 'ឧទាហរណ៍'; + @override + String get files => 'ឯកសារ'; + @override + String get finished => 'រួចរាល់ហើយ'; + @override + String get hide => 'លាក់'; + @override + String get off => 'បិទ'; + @override + String get offline => 'អហ្វឡាញ'; + @override + String get on => 'បើក'; + @override + String get online => 'អនឡាញ'; + @override + String get open => 'បើក'; + @override + String get queue => 'តម្រៀបជួរ'; + @override + String get quickSave => 'រក្សាទុករហ័ស'; + @override + String get quickSaveFromFavorites => 'រក្សាទុករហ័សសម្រាប់ "ឧបករណ៍សំណព្វ"'; + @override + String get renamed => 'បានកែឈ្មោះ'; + @override + String get reset => 'អាន់ឌូផ្លាស់ប្ដូរ'; + @override + String get restart => 'ចាប់ផ្តើមឡើងវិញ'; + @override + String get settings => 'ការកំណត់'; + @override + String get skipped => 'រំលង'; + @override + String get start => 'ចាប់ផ្តើម'; + @override + String get stop => 'បញ្ឈប់'; + @override + String get save => 'រក្សាទុក'; + @override + String get unchanged => 'មិនបានផ្លាស់ប្តូរ'; + @override + String get unknown => 'មិនស្គាល់'; + @override + String get noItemInClipboard => 'មិនមានធាតុនៅក្នុងឃ្លីបប៊ត។'; +} + +// Path: receiveTab +class _Translations$receiveTab$km extends Translations$receiveTab$en { + _Translations$receiveTab$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ការទទួល'; + @override + late final _Translations$receiveTab$infoBox$km infoBox = _Translations$receiveTab$infoBox$km._(_root); + @override + late final _Translations$receiveTab$quickSave$km quickSave = _Translations$receiveTab$quickSave$km._(_root); +} + +// Path: sendTab +class _Translations$sendTab$km extends Translations$sendTab$en { + _Translations$sendTab$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ការផ្ញើ'; + @override + late final _Translations$sendTab$selection$km selection = _Translations$sendTab$selection$km._(_root); + @override + late final _Translations$sendTab$picker$km picker = _Translations$sendTab$picker$km._(_root); + @override + String get shareIntentInfo => 'អ្នកក៏អាចប្រើប្រាស់មុខងារ "ចែករំលេក" ក្នុងទូរសព្ទចល័តរបស់អ្នក ដើម្បីរើសឯកសារឱ្យកាន់តែងាយស្រួល។'; + @override + String get nearbyDevices => 'ឧបករណ៍ដែលនៅជិតនេះ'; + @override + String get thisDevice => 'ឧបករណ៍នេះ'; + @override + String get scan => 'កំពុងរកមើលឧបករណ៍'; + @override + String get manualSending => 'ផ្ញើដោយខ្លួនឯង'; + @override + String get sendMode => 'ប្រភេទនៃការផ្ញើ'; + @override + late final _Translations$sendTab$sendModes$km sendModes = _Translations$sendTab$sendModes$km._(_root); + @override + String get sendModeHelp => 'ការពន្យល់'; + @override + String get help => 'សូមប្រាកដថាទីតាំងដែលអ្នកចង់ផ្ញើគឺត្រូវតែភ្ជាប់បណ្តាញ Wi-Fi តែមួយដូចគ្នា។'; + @override + String get placeItems => 'ដាក់ធាតុដែលត្រូវចែករំលែក។'; +} + +// Path: settingsTab +class _Translations$settingsTab$km extends Translations$settingsTab$en { + _Translations$settingsTab$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ការកំណត់'; + @override + late final _Translations$settingsTab$general$km general = _Translations$settingsTab$general$km._(_root); + @override + late final _Translations$settingsTab$receive$km receive = _Translations$settingsTab$receive$km._(_root); + @override + late final _Translations$settingsTab$send$km send = _Translations$settingsTab$send$km._(_root); + @override + late final _Translations$settingsTab$network$km network = _Translations$settingsTab$network$km._(_root); + @override + late final _Translations$settingsTab$other$km other = _Translations$settingsTab$other$km._(_root); + @override + String get advancedSettings => 'ការកំណត់កម្រិតខ្ពស់'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$km extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ដោះស្រាយបញ្ហា'; + @override + String get subTitle => 'កម្មវិធីនេះមិនដំណើរការដូចការរំពឹងទុកមែនទេ? សូមមើលដំណោះស្រាយមួយចំនួននេះ។'; + @override + String get solution => 'ដំណោះស្រាយ:'; + @override + String get fixButton => 'ជួសជុលដោយស្វ័យប្រវត្តិ'; + @override + late final _Translations$troubleshootPage$firewall$km firewall = _Translations$troubleshootPage$firewall$km._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$km noDiscovery = _Translations$troubleshootPage$noDiscovery$km._(_root); + @override + late final _Translations$troubleshootPage$noConnection$km noConnection = _Translations$troubleshootPage$noConnection$km._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$km extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ប្រវត្តិ'; + @override + String get openFolder => 'បើកថតឯកសារ'; + @override + String get deleteHistory => 'លុបប្រវត្តិ'; + @override + String get empty => 'មិនមានប្រវត្តិទេ'; + @override + late final _Translations$receiveHistoryPage$entryActions$km entryActions = _Translations$receiveHistoryPage$entryActions$km._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$km extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'កម្មវិធី (APK)'; + @override + String get excludeSystemApps => 'ដកចេញកម្មវិធីរបស់ប្រព័ន្ធ'; + @override + String get excludeAppsWithoutLaunchIntent => 'ដកចេញកម្មវិធីដែលមិនអាចបើកបាន'; + @override + String apps({required Object n}) => '${n} កម្មវិធី'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$km extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'លុបទាំងអស់'; +} + +// Path: receivePage +class _Translations$receivePage$km extends Translations$receivePage$en { + _Translations$receivePage$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('km'))( + n, + one: 'ចង់ផ្ញើឯកសារមួយឲ្យមកអ្នក។', + other: 'ចង់ផ្ញើឯកសារ ${n} ឲ្យមកអ្នក។', + ); + @override + String get subTitleMessage => 'បានផ្ញើសារមួយមកអ្នក:'; + @override + String get subTitleLink => 'បានផ្ញើតំណភ្ជាប់មួយមកអ្នក:'; + @override + String get canceled => 'អ្នកផ្ញើបានបោះបង់សំណើរហើយ។'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$km extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ជម្រើស'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(ថតឯកសារ LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'បានបិទដោយស្វ័យប្រវត្តិ ដោយសារមានថតស្រាប់ហើយ។'; +} + +// Path: sendPage +class _Translations$sendPage$km extends Translations$sendPage$en { + _Translations$sendPage$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'កំពុងរង់ចាំការឆ្លើយតប...'; + @override + String get rejected => 'អ្នកទទួលបានបដិសេធសំណើនេះ។'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'អ្នកទទួលកំពុងជាប់រវល់ជាមួយសំណើផ្សេងទៀត។'; +} + +// Path: progressPage +class _Translations$progressPage$km extends Translations$progressPage$en { + _Translations$progressPage$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'កំពុងផ្ញើឯកសារ'; + @override + String get titleReceiving => 'កំពុងទទួលឯកសារ'; + @override + String get savedToGallery => 'បានរក្សាទុកក្នុងកម្មវិធីរូបថត'; + @override + late final _Translations$progressPage$total$km total = _Translations$progressPage$total$km._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$km extends Translations$webSharePage$en { + _Translations$webSharePage$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ចែករំលែកតាមតំណភ្ជាប់'; + @override + String get loading => 'កំពុងចាប់ផ្តើម server...'; + @override + String get stopping => 'កំពុងបញ្ឈប់ server...'; + @override + String get error => 'មានកំហុសមួយបានកើតឡើងអំឡុងពេលចាប់ផ្តើម server ។'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('km'))( + n, + one: 'បើកតំណនេះនៅក្នុងកម្មវិធី browser:', + other: 'បើកតំណមួយក្នុងចំណោមតំណភ្ជាប់ទាំងនេះក្នុងកម្មវិធី browser:', + ); + @override + String get requests => 'ការស្នើសុំ'; + @override + String get noRequests => 'មិនទាន់មានសំណើនៅឡើយ។'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'ទទួលយកការស្នើរដោយស្វ័យប្រវត្តិ'; + @override + String get requirePin => 'ត្រូវការលេខកូដ'; + @override + String pinHint({required Object pin}) => 'លេខកូដគឺ "${pin}"'; + @override + String get encryptionHint => 'LocalSend ប្រើវិញ្ញាបនបត្រដែលចុះហត្ថលេខាដោយខ្លួនឯង។ អ្នកត្រូវទទួលយកវានៅក្នុងកម្មវិធី​ browser ។'; + @override + String pendingRequests({required Object n}) => 'សំណើដែលកំពុងរង់ចាំ: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$km extends Translations$aboutPage$en { + _Translations$aboutPage$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'អំពី LocalSend'; + @override + List get description => [ + 'LocalSend គឺជាកម្មវិធីដែលប្រើដោយឥតគិតថ្លៃ និងបើកចំហនូវប្រភពកូដ ដែលអនុញ្ញាតឱ្យអ្នកអាចចែករំលែកឯកសារ និងសារដោយសុវត្ថិភាពជាមួយនឹងឧបករណ៍ដែលនៅជិតៗដែលនៅលើបណ្តាញមូលដ្ឋានរួមគ្នាដោយមិនចាំបាច់ភ្ជាប់អ៊ីនធឺណិត។', + 'កម្មវិធីនេះគឺអាចដំណើរការនៅលើគ្រប់ប្រព័ន្ធប្រតិបត្តិការទាំងអស់រួមមានដូចជា Android, iOS, macOS, Windows និង Linux ។ អ្នកអាចស្វែងរក និងទាញយកបានច្រើនវិធីសាស្ត្រតាមរយៈគេហទំព័រផ្លូវការរបស់ LocalSend ។', + ]; + @override + String get author => 'ម្ចាស់កម្មសិទ្ធ'; + @override + String get contributors => 'អ្នកចូលរួមចំណែក'; + @override + String get packagers => 'អ្នកបង្កើតកញ្ចប់កម្មវិធី Package'; + @override + String get translators => 'អ្នកបកប្រែ'; +} + +// Path: donationPage +class _Translations$donationPage$km extends Translations$donationPage$en { + _Translations$donationPage$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ការឧបត្ថម្ភ'; + @override + String get info => + 'LocalSend ជាកម្មវិធីដែលឥតគិតថ្លៃ, បើកបង្ហាញប្រភពកូដជាសាធារណៈ និងមិនមានការបង្ហាញនូវផ្ទាំងពាណិជ្ជកម្មរំខានឡើយ។ ប្រសិនបើអ្នកពេញចិត្តកម្មវិធីនេះ​ និងចង់ជួយពួកយើង, អ្នកអាចចូលរួមលើកស្ទួយការអភិវឌ្ឍន៍កម្មវិធីនេះជាមួយពួកយើងតាមរយៈការឧបត្ថម្ភជាថវិកា។'; + @override + String donate({required Object amount}) => 'ឧបត្ថម្ភចំនួន ${amount}'; + @override + String get thanks => 'អរគុណអ្នកខ្លាំងណាស់សម្រាប់ការឧបត្ថម្ភមកកាន់ពួកយើង!'; + @override + String get restore => 'ស្តារការទូទាត់ត្រឡប់មកវិញ'; +} + +// Path: changelogPage +class _Translations$changelogPage$km extends Translations$changelogPage$en { + _Translations$changelogPage$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'កំណត់ត្រាការផ្លាស់ប្តូរ'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$km extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'គួរអោយស្រលាញ់', + 'ស្រស់ស្អាត', + 'ធំ', + 'ភ្លឺចែកចាំង', + 'ស្អាត', + 'ពូកែ', + 'ឡូយ', + 'គួរអោយស្រលាញ់', + 'គួរអោយទាក់ទាញ', + 'ហ្មត់ចត់', + 'មានថាមពល', + 'សន្សំសំចៃ', + 'អស្ចារ្យ', + 'លឿន', + 'ល្អ', + 'ស្រស់ស្រាយ', + 'ល្អ', + 'ស្រស់ស្អាត', + 'ល្អណាស់', + 'សង្ហា', + 'ទាក់ទាញ', + 'រួសរាយ', + 'គួរអោយស្រលាញ់', + 'អាថ៌កំបាំង', + 'គួរអោយសរសើរ', + 'ល្អ', + 'អត់ធ្មត់', + 'ស្រស់ស្អាត', + 'មានអំណាច', + 'អ្នកមាន', + 'សម្ងាត់', + 'ឆ្លាតវៃ', + 'រឹងមាំ', + 'ពិសេស', + 'យុទ្ធសាស្ត្រ', + 'រឹងប៉ឹង', + 'ផ្ជិតផ្ចង់', + 'ប្រាជ្ញា', + ]; + @override + List get fruits => [ + 'ផ្លែប៉ោម', + 'ផ្លែបឺរ', + 'ផ្លែចេក', + 'ផ្លែ Blackberry', + 'ផ្លែ Blueberry', + 'ផ្កាខាត់ណាខៀវ', + 'ផ្លែការ៉ុត', + 'ផ្លែឆឺរី', + 'ផ្លែដូង', + 'ផ្លែទំពាំងបាយជូ', + 'ផ្លែក្រូចឆ្មា', + 'បន្លែ', + 'ផ្លែស្វាយ', + 'ផ្លែឪឡឹក', + 'ផ្សិត', + 'ខ្ទឹមបារាំង', + 'ផ្លែក្រូច', + 'ផ្លែល្ហុង', + 'ផ្លែប៉េស', + 'ផ្លែសឺរី', + 'ផ្លែម្នាស់', + 'ដំឡូង', + 'ផ្លែល្ពៅ', + 'ផ្លែ Raspberry', + 'ផ្លែស្ត្របឺរី', + 'ផ្លែប៉េងប៉ោះ', + ]; + + /// នៅក្នុងភាសាខ្លះ គុណនាមអាចនឹងនៅខាងក្រោយនាមវិញ។ + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$km extends Translations$dialogs$en { + _Translations$dialogs$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$km addFile = _Translations$dialogs$addFile$km._(_root); + @override + late final _Translations$dialogs$openFile$km openFile = _Translations$dialogs$openFile$km._(_root); + @override + late final _Translations$dialogs$addressInput$km addressInput = _Translations$dialogs$addressInput$km._(_root); + @override + late final _Translations$dialogs$cancelSession$km cancelSession = _Translations$dialogs$cancelSession$km._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$km cannotOpenFile = _Translations$dialogs$cannotOpenFile$km._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$km encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$km._(_root); + @override + late final _Translations$dialogs$errorDialog$km errorDialog = _Translations$dialogs$errorDialog$km._(_root); + @override + late final _Translations$dialogs$favoriteDialog$km favoriteDialog = _Translations$dialogs$favoriteDialog$km._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$km favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$km._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$km favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$km._(_root); + @override + late final _Translations$dialogs$fileInfo$km fileInfo = _Translations$dialogs$fileInfo$km._(_root); + @override + late final _Translations$dialogs$fileNameInput$km fileNameInput = _Translations$dialogs$fileNameInput$km._(_root); + @override + late final _Translations$dialogs$historyClearDialog$km historyClearDialog = _Translations$dialogs$historyClearDialog$km._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$km localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$km._(_root); + @override + late final _Translations$dialogs$messageInput$km messageInput = _Translations$dialogs$messageInput$km._(_root); + @override + late final _Translations$dialogs$noFiles$km noFiles = _Translations$dialogs$noFiles$km._(_root); + @override + late final _Translations$dialogs$noPermission$km noPermission = _Translations$dialogs$noPermission$km._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$km notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$km._(_root); + @override + late final _Translations$dialogs$qr$km qr = _Translations$dialogs$qr$km._(_root); + @override + late final _Translations$dialogs$quickActions$km quickActions = _Translations$dialogs$quickActions$km._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$km quickSaveNotice = _Translations$dialogs$quickSaveNotice$km._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$km quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$km._(_root); + @override + late final _Translations$dialogs$pin$km pin = _Translations$dialogs$pin$km._(_root); + @override + late final _Translations$dialogs$sendModeHelp$km sendModeHelp = _Translations$dialogs$sendModeHelp$km._(_root); + @override + late final _Translations$dialogs$zoom$km zoom = _Translations$dialogs$zoom$km._(_root); +} + +// Path: sanitization +class _Translations$sanitization$km extends Translations$sanitization$en { + _Translations$sanitization$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get empty => 'ឈ្មោះឯកសារមិនអាចទទេបានទេ'; + @override + String get invalid => 'ឈ្មោះឯកសារមានផ្ទុកនូវតួអក្សរដែលមិនត្រឹមត្រូវ'; +} + +// Path: tray +class _Translations$tray$km extends Translations$tray$en { + _Translations$tray$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'ចាកចេញពីកម្មវិធី LocalSend'; + @override + String get closeWindows => 'ចាកចេញ'; +} + +// Path: web +class _Translations$web$km extends Translations$web$en { + _Translations$web$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'សូមបញ្ចូលលេខកូដ'; + @override + String get invalidPin => 'លេខកូដមិនត្រឹមត្រូវ'; + @override + String get tooManyAttempts => 'ចំនួននៃការប៉ុនប៉ងបញ្ចូលច្រើនដងពេកហើយ'; + @override + String get rejected => 'បានបដិសេធ'; + @override + String get files => 'ឯកសារ'; + @override + String get fileName => 'ឈ្មោះឯកសារ'; + @override + String get size => 'ទំហំ'; +} + +// Path: assetPicker +class _Translations$assetPicker$km extends Translations$assetPicker$en { + _Translations$assetPicker$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'បញ្ជាក់'; + @override + String get cancel => 'បោះបង់'; + @override + String get edit => 'កែសម្រួល'; + @override + String get gifIndicator => 'រូបចលនា GIF'; + @override + String get loadFailed => 'ការផ្ទុកបរាជ័យ'; + @override + String get original => 'ប្រភពដើម'; + @override + String get preview => 'មើលលទ្ធផលទុកមុន'; + @override + String get select => 'ជ្រើសរើស'; + @override + String get emptyList => 'បញ្ជីទទេ'; + @override + String get unSupportedAssetType => 'ប្រភេទឯកសារដែលមិនគាំទ្រ។'; + @override + String get unableToAccessAll => 'មិនអាចចូលប្រើឯកសារទាំងអស់នៅលើឧបករណ៍បានទេ'; + @override + String get viewingLimitedAssetsTip => 'បានតែមើលឯកសារ និងអាល់ប៊ុមប៉ុណ្ណោះដែលអាចចូលដំណើរការបានក្នុងកម្មវិធី។'; + @override + String get changeAccessibleLimitedAssets => 'ចុចដើម្បីធ្វើបច្ចុប្បន្នភាពឯកសារដែលអាចចូលប្រើបាន។'; + @override + String get accessAllTip => + 'កម្មវិធីអាចចូលប្រើបានតែឯកសារមួយចំនួននៅលើឧបករណ៍ប៉ុណ្ណោះ។ ចូលទៅកាន់ការកំណត់ប្រព័ន្ធ ហើយអនុញ្ញាតឱ្យកម្មវិធីចូលប្រើមាតិកាទាំងអស់នៅលើឧបករណ៍។'; + @override + String get goToSystemSettings => 'ចូលទៅកាន់ការកំណត់របស់ប្រព័ន្ធ'; + @override + String get accessLimitedAssets => 'បន្តជាមួយនឹងការចូលប្រើមានកំណត់'; + @override + String get accessiblePathName => 'ឯកសារដែលអាចចូលប្រើបាន'; + @override + String get sTypeAudioLabel => 'សម្លេង'; + @override + String get sTypeImageLabel => 'រូបភាព'; + @override + String get sTypeVideoLabel => 'វីដេអូ'; + @override + String get sTypeOtherLabel => 'មាតិកាផ្សេងទៀត'; + @override + String get sActionPlayHint => 'ចាក់'; + @override + String get sActionPreviewHint => 'មើលលទ្ធផលទុកមុន'; + @override + String get sActionSelectHint => 'ជ្រើសរើស'; + @override + String get sActionSwitchPathLabel => 'ប្តូរទីតាំង'; + @override + String get sActionUseCameraHint => 'ប្រើកាមេរ៉ា'; + @override + String get sNameDurationLabel => 'ថេរវេលា'; + @override + String get sUnitAssetCountLabel => 'ចំនួន'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$km extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get ip => 'អាយភី៖'; + @override + String get port => 'ច្រក៖'; + @override + String get alias => 'ឈ្មោះឧបករណ៍៖'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$km extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'ឧបករណ៍សំណព្វ'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$km extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ការជ្រើសរើស'; + @override + String files({required Object files}) => 'ឯកសារ៖ ${files}'; + @override + String size({required Object size}) => 'ទំហំ៖ ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$km extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get file => 'ឯកសារ'; + @override + String get folder => 'ថតឯកសារ'; + @override + String get media => 'មាតិកា'; + @override + String get text => 'សំណេរ'; + @override + String get app => 'កម្មវិធី'; + @override + String get clipboard => 'បិទភ្ជាប់'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$km extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get single => 'អ្នកទទួលតែម្នាក់'; + @override + String get multiple => 'អ្នកទទួលច្រើននាក់'; + @override + String get link => 'ចែករំលែកតាមតំណភ្ជាប់'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$km extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ទិដ្ឋភាពទូទៅ'; + @override + String get brightness => 'ស្បែកកម្មវិធី'; + @override + late final _Translations$settingsTab$general$brightnessOptions$km brightnessOptions = _Translations$settingsTab$general$brightnessOptions$km._( + _root, + ); + @override + String get color => 'ពណ៌'; + @override + late final _Translations$settingsTab$general$colorOptions$km colorOptions = _Translations$settingsTab$general$colorOptions$km._(_root); + @override + String get language => 'ភាសា'; + @override + late final _Translations$settingsTab$general$languageOptions$km languageOptions = _Translations$settingsTab$general$languageOptions$km._(_root); + @override + String get saveWindowPlacement => 'រក្សាទុកផ្ទាំងវីនដូ ក្រោយពេលចាកចេញ'; + @override + String get saveWindowPlacementWindows => 'រក្សាទុកទីតាំងផ្ទាំងអេក្រង់នៅដដែលបន្ទាប់ពីចាកចេញ'; + @override + String get minimizeToTray => 'ចាកចេញ: បង្រួមអប្បបរមាទៅរបារម៉ឺនុយ'; + @override + String get launchAtStartup => 'ចាប់ផ្តើមដោយស្វ័យប្រវត្តិបន្ទាប់ពីចូលគណនី'; + @override + String get launchMinimized => 'ចាប់ផ្តើមដោយស្វ័យប្រវត្តិ: ការចាប់ផ្តើមត្រូវបានលាក់'; + @override + String get showInContextMenu => 'បង្ហាញ LocalSend in នៅលើរបារម៉ឺនុយ'; + @override + String get animations => 'ចលនារស់រវើក'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$km extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ការទទួល'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'បញ្ចប់ដោយស្វ័យប្រវត្តិ'; + @override + String get destination => 'រក្សាទុកនៅឯថត'; + @override + String get downloads => '(ទាញយក)'; + @override + String get saveToGallery => 'រក្សាទុកទៅកាន់កម្មវិធីវិចិត្រសាល'; + @override + String get saveToHistory => 'រក្សាទុកទៅកាន់ប្រវត្តិ'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$km extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ផ្ញើ'; + @override + String get shareViaLinkAutoAccept => 'ទទួលការស្នើដោយស្វ័យប្រវត្តិនៅក្នុងម៉ូដ"ចែករំលែកតាមរយៈតំណភ្ជាប់"'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$km extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'បណ្តាញ'; + @override + String get needRestart => 'ចាប់ផ្តើម server ឡើងវិញដើម្បីអនុវត្តការកំណត់នេះ!'; + @override + String get server => 'Server'; + @override + String get alias => 'ឈ្មោះផ្សេងទៀត'; + @override + String get deviceType => 'ប្រភេទឧបករណ៍'; + @override + String get deviceModel => 'ម៉ូឌែលរបស់ឧបករណ៍'; + @override + String get port => 'ច្រក'; + @override + String get discoveryTimeout => 'ថេរវេលាក្នុងការស្វែងរក'; + @override + String get useSystemName => 'ប្រើប្រាស់ឈ្មោះរបស់ប្រព័ន្ធ'; + @override + String get generateRandomAlias => 'បង្កើតឈ្មោះដទៃដោយដៃចៃដន្យ'; + @override + String portWarning({required Object defaultPort}) => + 'អ្នកប្រហែលជាមិនត្រូវបានរកឃើញដោយឧបករណ៍ផ្សេងទៀតទេ ដោយសារតែអ្នកកំពុងប្រើច្រកដែលបង្កើតផ្ទាល់ខ្លួន។ (ច្រកដើម: ${defaultPort})'; + @override + String get encryption => 'ការការពារទិន្នន័យ'; + @override + String get multicastGroup => 'អាសយដ្ឋានពហុផ្សាយ'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'អ្នកប្រហែលជាមិនត្រូវបានរកឃើញដោយឧបករណ៍ផ្សេងទៀតទេ ដោយសារតែអ្នកកំពុងប្រើអាសយដ្ឋានពហុផ្សាយដែលបង្កើតផ្ទាល់ខ្លួន។ (ច្រកដើម: ${defaultMulticast})'; + @override + String get network => 'បណ្តាញ'; + @override + late final _Translations$settingsTab$network$networkOptions$km networkOptions = _Translations$settingsTab$network$networkOptions$km._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$km extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ផ្សេងៗ'; + @override + String get support => 'ជួយគាំទ្រ LocalSend'; + @override + String get donate => 'ការឧបត្ថម្ភ'; + @override + String get privacyPolicy => 'ច្បាប់ស្តីអំពីឯកជនភាព'; + @override + String get termsOfUse => 'លក្ខខណ្ឌនៃការប្រើប្រាស់'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$km extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get symptom => '​កម្មវិធីនេះអាចផ្ញើឯកសារទៅឧបករណ៍ផ្សេងទៀត ប៉ុន្តែឧបករណ៍ផ្សេងទៀតមិនអាចផ្ញើឯកសារមកឧបករណ៍នេះបានទេ។'; + @override + String solution({required Object port}) => + 'នេះទំនងជាបញ្ហារបស់ Firewall ។ អ្នកអាចដោះស្រាយវាបានដោយអនុញ្ញាតឱ្យមានការតភ្ជាប់ចូល (UDP និង TCP) តាមរយៈច្រក ${port}។'; + @override + String get openFirewall => 'បើក Firewall'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$km extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'ឧបករណ៍នេះហាក់ដូចមិនអាចស្វែងរកឧបករណ៍ផ្សេងបានទេ។'; + @override + String get solution => + 'សូមប្រាកដថាគ្រប់ឧបករណ៍ទាំងអស់ត្រូវតែស្ថិតក្នុងបណ្តាញ Wi-Fi តែមួយរួមគ្នា និងត្រូវមានការកំណត់រួមមួយដូចគ្នា (ផត, អាសយដ្ឋាន multicast, កូដនីយកម្ម ជាដើម)។ អ្នកអាចធ្វើការសាកល្បងវាយបញ្ចូលអាសយដ្ឋាន IP របស់ឧបករណ៍គោលដៅមួយទៀតដោយខ្លួនឯង។ បើធ្វើបែបនេះទៅដំណើរការ, អ្នកគួរតែបន្ថែម ឬបញ្ចូលឧបករណ៍នោះទៅក្នុងបញ្ជីឧបករណ៍សំណព្វដើម្បីងាយស្រួលក្នុងការស្វែងរក និងធ្វើប្រតិបត្តិការនាពេលក្រោយទៀតដោយស្វ័យប្រវត្តិ និងងាយស្រួល។'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$km extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'ឧបករណ៍ទាំងពីរមិនអាចរកឃើញគ្នាទៅវិញទៅមក ហើយក៏មិនអាចចែករំលែកឯកសារបានដែរ។'; + @override + String get solution => + 'បញ្ហា​កើត​មាន​ទាំង​សង​ខាង? បន្ទាប់មកអ្នកត្រូវប្រាកដថាឧបករណ៍ទាំងពីរស្ថិតនៅក្នុងបណ្តាញ wifi ដូចគ្នា និងចែករំលែកការកំណត់ដូចគ្នា (ច្រក អាសយដ្ឋានពហុផ្សាយ ការអ៊ិនគ្រីបទិន្នន័យ)។ Wi-Fi ប្រហែលជាមិនអនុញ្ញាតឱ្យទំនាក់ទំនងរវាងអ្នកចូលរួមទេ។ ក្នុងករណីនេះជម្រើសត្រូវតែបើកនៅលើរ៉ោតទ័រ។'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$km extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get open => 'បើកឯកសារ'; + @override + String get showInFolder => 'បង្ហាញនៅក្នុងកម្មវិធីឯកសារ'; + @override + String get info => 'ព័ត៌មាននៃឯកសារ'; + @override + String get deleteFromHistory => 'លុបចោលពីប្រវត្តិ'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$km extends Translations$progressPage$total$en { + _Translations$progressPage$total$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$km title = _Translations$progressPage$total$title$km._(_root); + @override + String count({required Object curr, required Object n}) => 'ឯកសារ: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'ទំហំ: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'ល្បឿន: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$km extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'បន្ថែមទៅការជ្រើសរើស'; + @override + String get content => 'តើអ្នកចង់បន្ថែមអ្វី?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$km extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'បើកឯកសារ'; + @override + String get content => 'តើអ្នកចង់បើកឯកសារដែលទទួលបាននេះមែនទេ??'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$km extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'បញ្ចូលអាសយដ្ឋាន'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'អាស័យដ្ឋាន IP'; + @override + String get recentlyUsed => 'បានប្រើថ្មីៗនេះ: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$km extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'បោះបង់ការផ្ទេរឯកសារ'; + @override + String get content => 'តើអ្នកពិតជាចង់បោះបង់ការផ្ទេរឯកសារមែនទេ?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$km extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'មិនអាចបើកឯកសារបានទេ'; + @override + String content({required Object file}) => 'មិនអាចបើកបានទេ "${file}"។ តើឯកសារនេះត្រូវបានផ្លាស់ទី ប្តូរឈ្មោះ ឬលុបមែនទេ?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$km extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'បានបិទការអ៊ិនគ្រីបទិន្នន័យ'; + @override + String get content => + 'ឥឡូវនេះការទំនាក់ទំនងកើតឡើងតាមរយៈពិធីការ HTTP ដែលមិនបានអ៊ិនគ្រីបការពារទិន្នន័យ។ ដើម្បីប្រើ HTTPS សូមបើកការអ៊ិនគ្រីបទិន្នន័យម្តងទៀត។'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$km extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$km extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ឧបករណ៍សំណព្វ'; + @override + String get noFavorites => 'មិនទាន់មានឧបករណ៍សំណព្វនៅឡើយទេ'; + @override + String get addFavorite => 'បន្ថែម'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$km extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'លុបចេញពីឧបករណ៍សំណព្វ'; + @override + String content({required Object name}) => 'តើអ្នកប្រាកដដែរឬទេថាចង់ដក "${name}" ចេញពីឧបករណ៍សំណព្វ?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$km extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'បន្ថែមទៅកាន់ឧបករណ៍សំណព្វ'; + @override + String get titleEdit => 'ការកំណត់'; + @override + String get name => 'ឈ្មោះឧបករណ៍'; + @override + String get auto => '(auto)'; + @override + String get ip => 'អាសយដ្ឋាន IP'; + @override + String get port => 'ច្រក'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$km extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'ព័ត៌មាននៃឯកសារ'; + @override + String get fileName => 'ឈ្មោះ​ឯកសារ:'; + @override + String get path => 'ទីតាំង:'; + @override + String get size => 'ទំហំ:'; + @override + String get sender => 'អ្នកផ្ញើ:'; + @override + String get time => 'រយៈពេល:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$km extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'បញ្ចូលឈ្មោះឯកសារ'; + @override + String original({required Object original}) => 'ច្បាប់ដើម: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$km extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'លុបជម្រះប្រវត្តិ'; + @override + String get content => 'តើអ្នកប្រាកដទេថាចង់លុបនូវរាល់ប្រវត្តិនៃការប្រើប្រាស់ទាំងអស់នេះ?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$km extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend មិន​អាច​រក​ឃើញ​ឧបករណ៍​ផ្សេង​ទៀត​ដោយ​មិន​មាន​ការ​អនុញ្ញាត​ក្នុង​ការ​ស្កែន​បណ្តាញរួមគ្នា​ទេ។ សូមផ្តល់ការអនុញ្ញាតនេះនៅក្នុងការកំណត់។'; + @override + String get gotoSettings => 'ការកំណត់'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$km extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'សរសេរសារ'; + @override + String get multiline => 'ពហុជួរ'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$km extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'គ្មានឯកសារត្រូវបានជ្រើសរើសទេ។'; + @override + String get content => 'សូមជ្រើសរើសយ៉ាងហោចណាស់មួយឯកសារ។'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$km extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'គ្មានការអនុញ្ញាត'; + @override + String get content => 'អ្នកមិន​ទាន់ត្រូវបានផ្តល់ការអនុញ្ញាតទេ។ សូមផ្តល់ឱ្យពួកគេនៅក្នុងការកំណត់។'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$km extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'មិនដំណើរការ'; + @override + String get content => 'មុខងារនេះអាចប្រើបានតែនៅលើ:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$km extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'កូដ QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$km extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'សកម្មភាពរហ័ស'; + @override + String get counter => 'Counter'; + @override + String get prefix => 'បុព្វបទ'; + @override + String get padZero => 'Pad with zeros'; + @override + String get sortBeforeCount => 'តម្រៀបតាមអក្ខរក្រមជាមុន'; + @override + String get random => 'ចៃដន្យ'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$km extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'សំណើឯកសារត្រូវបានទទួលយកដោយស្វ័យប្រវត្តិ។ ត្រូវ​ចំណាំ​ថា​អ្នក​រាល់​គ្នា​នៅ​ក្នុង​បណ្ដាញ​មូលដ្ឋាន​រួមគ្នាអាច​ផ្ញើ​ឯកសារ​មក​អ្នកបាន។'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$km extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'ឥឡូវនេះសំណើឯកសារត្រូវបានទទួលយកដោយស្វ័យប្រវត្តិពីឧបករណ៍ទាំងឡាយដែលមាននៅក្នុងបញ្ជីឧបករណ៍សំណព្វរបស់អ្នក។', + 'ការព្រមាន៖ ពេលនេះជម្រើស ឬមុខងារមួយនេះមិនទាន់មានសុវត្ថិភាពទាំងស្រុងទេ និងណែនាំឲ្យប្រើប្រាស់នៅឡើយទេ ពីព្រោះជនអនាមិកដែលវាយប្រហារតាមប្រព័ន្ធបច្ចេកវិទ្យា ដែលស្គាល់ស្នាមដាននៃឧបករណ៍សំណព្វរបស់អ្នក អាចនឹងផ្ញើឯកសារផ្សេងៗមកអ្នកបាន។', + 'ទោះ​ជា​យ៉ាង​ណាក៏ដោយ ជម្រើស​នេះ​នៅ​តែ​មាន​សុវត្ថិភាព​ជាង​ការ​អនុញ្ញាត​ឱ្យ​ឧបករណ៍​ទាំងអស់អាចផ្ញើមកអ្នកដោយសេរី​។', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$km extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'វាយបញ្ចូលលេខកូដ'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$km extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'របៀបនៃការផ្ញើ'; + @override + String get single => 'ផ្ញើឯកសារទៅអ្នកទទួលម្នាក់។ ការជ្រើសរើសនឹងត្រូវបានសម្អាតបន្ទាប់ពីការផ្ទេរឯកសារបានបញ្ចប់។'; + @override + String get multiple => 'ផ្ញើឯកសារទៅអ្នកទទួលច្រើននាក់។ ការជ្រើសរើសនឹងមិនត្រូវបានសម្អាតទេ។'; + @override + String get link => 'អ្នកទទួលដែលមិនបានដំឡើង LocalSend អាចទាញយកឯកសារដែលបានជ្រើសរើសដោយបើកតំណនៅក្នុងកម្មវិធី browser របស់ពួកគេ។'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$km extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get title => 'តំណភ្ជាប់ URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$km extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get system => 'តាមប្រព័ន្ធ'; + @override + String get dark => 'ងងឹត'; + @override + String get light => 'ភ្លឺ'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$km extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get system => 'តាមប្រព័ន្ធ'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$km extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get system => 'តាមប្រព័ន្ធ'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$km extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String get all => 'ទាំងអស់'; + @override + String get filtered => 'បានតម្រង'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$km extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$km._(TranslationsKm root) : this._root = root, super.internal(root); + + final TranslationsKm _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'រយៈពេលប្រតិបត្តិការសរុប (${time})'; + @override + String get finishedError => 'បានបញ្ចប់ជាមួយនឹងបញ្ហា'; + @override + String get canceledSender => 'ត្រូវបានបោះបង់ដោយអ្នកផ្ញើ'; + @override + String get canceledReceiver => 'ត្រូវបានបោះបង់ដោយអ្នកទទួល'; +} diff --git a/app/lib/gen/strings_ko.g.dart b/app/lib/gen/strings_ko.g.dart new file mode 100644 index 0000000..0577992 --- /dev/null +++ b/app/lib/gen/strings_ko.g.dart @@ -0,0 +1,1405 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsKo extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsKo({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ko, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsKo _root = this; // ignore: unused_field + + @override + TranslationsKo $copyWith({TranslationMetadata? meta}) => TranslationsKo(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => '한국어'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$ko general = _Translations$general$ko._(_root); + @override + late final _Translations$receiveTab$ko receiveTab = _Translations$receiveTab$ko._(_root); + @override + late final _Translations$sendTab$ko sendTab = _Translations$sendTab$ko._(_root); + @override + late final _Translations$settingsTab$ko settingsTab = _Translations$settingsTab$ko._(_root); + @override + late final _Translations$troubleshootPage$ko troubleshootPage = _Translations$troubleshootPage$ko._(_root); + @override + late final _Translations$networkInterfacesPage$ko networkInterfacesPage = _Translations$networkInterfacesPage$ko._(_root); + @override + late final _Translations$receiveHistoryPage$ko receiveHistoryPage = _Translations$receiveHistoryPage$ko._(_root); + @override + late final _Translations$apkPickerPage$ko apkPickerPage = _Translations$apkPickerPage$ko._(_root); + @override + late final _Translations$selectedFilesPage$ko selectedFilesPage = _Translations$selectedFilesPage$ko._(_root); + @override + late final _Translations$receivePage$ko receivePage = _Translations$receivePage$ko._(_root); + @override + late final _Translations$receiveOptionsPage$ko receiveOptionsPage = _Translations$receiveOptionsPage$ko._(_root); + @override + late final _Translations$sendPage$ko sendPage = _Translations$sendPage$ko._(_root); + @override + late final _Translations$progressPage$ko progressPage = _Translations$progressPage$ko._(_root); + @override + late final _Translations$webSharePage$ko webSharePage = _Translations$webSharePage$ko._(_root); + @override + late final _Translations$aboutPage$ko aboutPage = _Translations$aboutPage$ko._(_root); + @override + late final _Translations$donationPage$ko donationPage = _Translations$donationPage$ko._(_root); + @override + late final _Translations$changelogPage$ko changelogPage = _Translations$changelogPage$ko._(_root); + @override + late final _Translations$dialogs$ko dialogs = _Translations$dialogs$ko._(_root); + @override + late final _Translations$sanitization$ko sanitization = _Translations$sanitization$ko._(_root); + @override + late final _Translations$tray$ko tray = _Translations$tray$ko._(_root); + @override + late final _Translations$web$ko web = _Translations$web$ko._(_root); + @override + late final _Translations$assetPicker$ko assetPicker = _Translations$assetPicker$ko._(_root); +} + +// Path: general +class _Translations$general$ko extends Translations$general$en { + _Translations$general$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get accept => '수락'; + @override + String get accepted => '수락됨'; + @override + String get add => '추가'; + @override + String get advanced => '상세'; + @override + String get cancel => '취소'; + @override + String get close => '닫기'; + @override + String get confirm => '확인'; + @override + String get continueStr => '계속'; + @override + String get copy => '복사'; + @override + String get copiedToClipboard => '클립보드에 복사했습니다'; + @override + String get decline => '거부'; + @override + String get done => '완료'; + @override + String get delete => '삭제'; + @override + String get edit => '편집'; + @override + String get error => '에러'; + @override + String get example => '예시'; + @override + String get files => '파일'; + @override + String get finished => '완료'; + @override + String get hide => '숨김'; + @override + String get off => '꺼짐'; + @override + String get offline => '오프라인'; + @override + String get on => '켜짐'; + @override + String get online => '온라인'; + @override + String get open => '열기'; + @override + String get queue => '대기 중'; + @override + String get quickSave => '빠른 저장'; + @override + String get quickSaveFromFavorites => '"즐겨찾기"를 위한 빠른 저장'; + @override + String get renamed => '이름 변경됨'; + @override + String get reset => '변경사항 되돌리기'; + @override + String get restart => '재시작'; + @override + String get settings => '설정'; + @override + String get skipped => '건너뜀'; + @override + String get start => '시작'; + @override + String get stop => '정지'; + @override + String get save => '저장'; + @override + String get unchanged => '변경사항 없음'; + @override + String get unknown => '알 수 없음'; + @override + String get noItemInClipboard => '클립보드가 비어있습니다.'; +} + +// Path: receiveTab +class _Translations$receiveTab$ko extends Translations$receiveTab$en { + _Translations$receiveTab$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '받기'; + @override + late final _Translations$receiveTab$infoBox$ko infoBox = _Translations$receiveTab$infoBox$ko._(_root); + @override + late final _Translations$receiveTab$quickSave$ko quickSave = _Translations$receiveTab$quickSave$ko._(_root); +} + +// Path: sendTab +class _Translations$sendTab$ko extends Translations$sendTab$en { + _Translations$sendTab$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '보내기'; + @override + late final _Translations$sendTab$selection$ko selection = _Translations$sendTab$selection$ko._(_root); + @override + late final _Translations$sendTab$picker$ko picker = _Translations$sendTab$picker$ko._(_root); + @override + String get shareIntentInfo => '휴대전화의 \'공유\' 기능을 사용하면 보다 편리하게 파일을 선택할 수 있습니다'; + @override + String get nearbyDevices => '근처 기기'; + @override + String get thisDevice => '이 기기'; + @override + String get scan => '기기 검색'; + @override + String get manualSending => '수동 전송'; + @override + String get sendMode => '전송 모드'; + @override + late final _Translations$sendTab$sendModes$ko sendModes = _Translations$sendTab$sendModes$ko._(_root); + @override + String get sendModeHelp => '설명'; + @override + String get help => '파일을 전송받을 기기도 동일한 Wi-Fi 네트워크에 연결되어 있어야 합니다.'; + @override + String get placeItems => '드롭하여 공유하기'; +} + +// Path: settingsTab +class _Translations$settingsTab$ko extends Translations$settingsTab$en { + _Translations$settingsTab$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '설정'; + @override + late final _Translations$settingsTab$general$ko general = _Translations$settingsTab$general$ko._(_root); + @override + late final _Translations$settingsTab$receive$ko receive = _Translations$settingsTab$receive$ko._(_root); + @override + late final _Translations$settingsTab$send$ko send = _Translations$settingsTab$send$ko._(_root); + @override + late final _Translations$settingsTab$network$ko network = _Translations$settingsTab$network$ko._(_root); + @override + late final _Translations$settingsTab$other$ko other = _Translations$settingsTab$other$ko._(_root); + @override + String get advancedSettings => '고급 설정'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$ko extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '문제 해결'; + @override + String get subTitle => '앱이 제대로 작동하지 않나요? 이 곳에서 자주 발생하는 문제들에 대한 도움말을 찾을 수 있습니다.'; + @override + String get solution => '도움말:'; + @override + String get fixButton => '자동으로 해결하기'; + @override + late final _Translations$troubleshootPage$firewall$ko firewall = _Translations$troubleshootPage$firewall$ko._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$ko noDiscovery = _Translations$troubleshootPage$noDiscovery$ko._(_root); + @override + late final _Translations$troubleshootPage$noConnection$ko noConnection = _Translations$troubleshootPage$noConnection$ko._(_root); +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$ko extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '네트워크 인터페이스'; + @override + String get info => '기본적으로 LocalSend는 활용할 수 있는 모든 네트워크 인터페이스를 사용하도록 되어 있습니다. 원하지 않는 네트워크가 있다면 이 곳에서 비활성화할 수 있습니다. 변경사항을 적용하려면 서버를 다시 시작해야 합니다.'; + @override + String get preview => '미리보기'; + @override + String get whitelist => '허용 목록'; + @override + String get blacklist => '거부 목록'; +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$ko extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '전송 기록'; + @override + String get openFolder => '폴더 열기'; + @override + String get deleteHistory => '기록 삭제'; + @override + String get empty => '전송 기록이 비어 있습니다.'; + @override + late final _Translations$receiveHistoryPage$entryActions$ko entryActions = _Translations$receiveHistoryPage$entryActions$ko._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$ko extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '앱 (APK)'; + @override + String get excludeSystemApps => '시스템 앱 제외'; + @override + String get excludeAppsWithoutLaunchIntent => '실행할 수 없는 앱 제외'; + @override + String apps({required Object n}) => '${n} 개의 앱'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$ko extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => '모두 삭제'; +} + +// Path: receivePage +class _Translations$receivePage$ko extends Translations$receivePage$en { + _Translations$receivePage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))( + n, + one: '에서 파일을 보내려고 합니다', + other: '에서 ${n}개의 파일을 보내려고 합니다', + ); + @override + String get subTitleMessage => '에서 메시지를 보냈습니다:'; + @override + String get subTitleLink => '에서 링크를 보냈습니다:'; + @override + String get canceled => '보내는 사람이 요청을 취소했습니다.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$ko extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '설정'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend 폴더)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => '폴더가 있어 자동으로 비활성화되었습니다.'; +} + +// Path: sendPage +class _Translations$sendPage$ko extends Translations$sendPage$en { + _Translations$sendPage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get waiting => '응답 대기 중…'; + @override + String get rejected => '받는 사람이 요청을 거부했습니다'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => '받는 사람이 다른 요청을 처리하는 중입니다.'; +} + +// Path: progressPage +class _Translations$progressPage$ko extends Translations$progressPage$en { + _Translations$progressPage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get titleSending => '파일 보내는 중'; + @override + String get titleReceiving => '파일 받는 중'; + @override + String get savedToGallery => '갤러리에 저장했습니다.'; + @override + late final _Translations$progressPage$total$ko total = _Translations$progressPage$total$ko._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$ko extends Translations$webSharePage$en { + _Translations$webSharePage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '링크로 공유하기'; + @override + String get loading => '서버 시작 중...'; + @override + String get stopping => '서버 중지 중...'; + @override + String get error => '서버를 시작하는 도중 오류가 발생했습니다.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))( + n, + one: '해당 링크를 브라우저에서 여세요:', + other: '해당 링크들 중 하나를 브라우저에서 여세요:', + ); + @override + String get requests => '요청'; + @override + String get noRequests => '아직 요청이 없습니다.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => '요청 자동 수락'; + @override + String get requirePin => 'PIN 번호 사용'; + @override + String pinHint({required Object pin}) => 'PIN 번호는 "${pin}" 입니다'; + @override + String get encryptionHint => 'LocalSend는 자체 서명된 인증서를 사용합니다. 브라우저에서 이를 허용해야 합니다.'; + @override + String pendingRequests({required Object n}) => '대기 중인 요청: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$ko extends Translations$aboutPage$en { + _Translations$aboutPage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => 'LocalSend 정보'; + @override + List get description => [ + 'LocalSend는 인터넷에 연결하지 않고도 로컬 네트워크를 통해 주변 기기들과 파일 및 메시지를 안전하게 공유할 수 있는 무료 오픈소스 애플리케이션입니다.', + '이 앱은 Android, iOS, macOS, Windows 및 Linux에서 사용할 수 있습니다. 모든 다운로드 옵션은 공식 홈페이지에서 확인할 수 있습니다.', + ]; + @override + String get author => '작성자'; + @override + String get contributors => '기여자'; + @override + String get packagers => '패키지 관리자'; + @override + String get translators => '번역가'; +} + +// Path: donationPage +class _Translations$donationPage$ko extends Translations$donationPage$en { + _Translations$donationPage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '기부'; + @override + String get info => 'LocalSend는 광고없이 무료로 제공되는 오픈소스 프로젝트입니다. 앱이 마음에 드신다면 후원을 통해 프로젝트 개발을 지원해주세요.'; + @override + String donate({required Object amount}) => '${amount} 기부하기'; + @override + String get thanks => '진심으로 감사드립니다!'; + @override + String get restore => '구매 복원'; +} + +// Path: changelogPage +class _Translations$changelogPage$ko extends Translations$changelogPage$en { + _Translations$changelogPage$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '변경사항'; +} + +// Path: dialogs +class _Translations$dialogs$ko extends Translations$dialogs$en { + _Translations$dialogs$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$ko addFile = _Translations$dialogs$addFile$ko._(_root); + @override + late final _Translations$dialogs$openFile$ko openFile = _Translations$dialogs$openFile$ko._(_root); + @override + late final _Translations$dialogs$addressInput$ko addressInput = _Translations$dialogs$addressInput$ko._(_root); + @override + late final _Translations$dialogs$cancelSession$ko cancelSession = _Translations$dialogs$cancelSession$ko._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$ko cannotOpenFile = _Translations$dialogs$cannotOpenFile$ko._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$ko encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$ko._(_root); + @override + late final _Translations$dialogs$errorDialog$ko errorDialog = _Translations$dialogs$errorDialog$ko._(_root); + @override + late final _Translations$dialogs$favoriteDialog$ko favoriteDialog = _Translations$dialogs$favoriteDialog$ko._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$ko favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$ko._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$ko favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$ko._(_root); + @override + late final _Translations$dialogs$fileInfo$ko fileInfo = _Translations$dialogs$fileInfo$ko._(_root); + @override + late final _Translations$dialogs$fileNameInput$ko fileNameInput = _Translations$dialogs$fileNameInput$ko._(_root); + @override + late final _Translations$dialogs$historyClearDialog$ko historyClearDialog = _Translations$dialogs$historyClearDialog$ko._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$ko localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$ko._(_root); + @override + late final _Translations$dialogs$messageInput$ko messageInput = _Translations$dialogs$messageInput$ko._(_root); + @override + late final _Translations$dialogs$noFiles$ko noFiles = _Translations$dialogs$noFiles$ko._(_root); + @override + late final _Translations$dialogs$noPermission$ko noPermission = _Translations$dialogs$noPermission$ko._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$ko notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$ko._(_root); + @override + late final _Translations$dialogs$qr$ko qr = _Translations$dialogs$qr$ko._(_root); + @override + late final _Translations$dialogs$quickActions$ko quickActions = _Translations$dialogs$quickActions$ko._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$ko quickSaveNotice = _Translations$dialogs$quickSaveNotice$ko._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$ko quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$ko._(_root); + @override + late final _Translations$dialogs$pin$ko pin = _Translations$dialogs$pin$ko._(_root); + @override + late final _Translations$dialogs$sendModeHelp$ko sendModeHelp = _Translations$dialogs$sendModeHelp$ko._(_root); + @override + late final _Translations$dialogs$zoom$ko zoom = _Translations$dialogs$zoom$ko._(_root); +} + +// Path: sanitization +class _Translations$sanitization$ko extends Translations$sanitization$en { + _Translations$sanitization$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get empty => '파일 이름은 비워 둘 수 없습니다'; + @override + String get invalid => '파일 이름에 잘못된 문자가 포함되어 있습니다'; +} + +// Path: tray +class _Translations$tray$ko extends Translations$tray$en { + _Translations$tray$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'LocalSend 종료하기'; + @override + String get closeWindows => '나가기'; +} + +// Path: web +class _Translations$web$ko extends Translations$web$en { + _Translations$web$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'PIN 번호 입력'; + @override + String get invalidPin => 'PIN 번호가 올바르지 않습니다'; + @override + String get tooManyAttempts => '시도 횟수를 초과했습니다'; + @override + String get rejected => '거부됨'; + @override + String get files => '파일'; + @override + String get fileName => '파일 이름'; + @override + String get size => '크기'; +} + +// Path: assetPicker +class _Translations$assetPicker$ko extends Translations$assetPicker$en { + _Translations$assetPicker$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get confirm => '확인'; + @override + String get cancel => '취소'; + @override + String get edit => '편집'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => '불러오기 실패'; + @override + String get original => '원본'; + @override + String get preview => '미리보기'; + @override + String get select => '선택'; + @override + String get emptyList => '목록이 비어있음'; + @override + String get unSupportedAssetType => '지원하지 않는 파일 유형입니다.'; + @override + String get unableToAccessAll => '기기의 모든 파일에 접근할 수 없습니다.'; + @override + String get viewingLimitedAssetsTip => '앱에서 접근할 수 있는 파일과 앨범만 볼 수 있습니다.'; + @override + String get changeAccessibleLimitedAssets => '접근이 허용된 파일 목록을 갱신하려면 클릭하세요.'; + @override + String get accessAllTip => '앱은 기기의 일부 파일에만 접근할 수 있습니다. 설정으로 이동하여 앱이 모든 미디어에 접근할 수 있도록 허용해주세요.'; + @override + String get goToSystemSettings => '설정으로 이동'; + @override + String get accessLimitedAssets => '제한된 접근으로 계속하기'; + @override + String get accessiblePathName => '접근 가능한 파일'; + @override + String get sTypeAudioLabel => '오디오'; + @override + String get sTypeImageLabel => '이미지'; + @override + String get sTypeVideoLabel => '비디오'; + @override + String get sTypeOtherLabel => '기타 미디어'; + @override + String get sActionPlayHint => '재생'; + @override + String get sActionPreviewHint => '미리보기'; + @override + String get sActionSelectHint => '선택'; + @override + String get sActionSwitchPathLabel => '경로 변경'; + @override + String get sActionUseCameraHint => '카메라 사용'; + @override + String get sNameDurationLabel => '길이'; + @override + String get sUnitAssetCountLabel => '개수'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$ko extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => '포트:'; + @override + String get alias => '별명:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$ko extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => '즐겨찾기'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$ko extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '선택'; + @override + String files({required Object files}) => '파일 수: ${files}'; + @override + String size({required Object size}) => '크기: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$ko extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get file => '파일'; + @override + String get folder => '폴더'; + @override + String get media => '미디어'; + @override + String get text => '텍스트'; + @override + String get app => '앱'; + @override + String get clipboard => '붙여넣기'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$ko extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get single => '하나의 기기에 보내기'; + @override + String get multiple => '여러 기기에 보내기'; + @override + String get link => '링크로 공유하기'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$ko extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '일반'; + @override + String get brightness => '테마'; + @override + late final _Translations$settingsTab$general$brightnessOptions$ko brightnessOptions = _Translations$settingsTab$general$brightnessOptions$ko._( + _root, + ); + @override + String get color => '색상'; + @override + late final _Translations$settingsTab$general$colorOptions$ko colorOptions = _Translations$settingsTab$general$colorOptions$ko._(_root); + @override + String get language => '언어'; + @override + late final _Translations$settingsTab$general$languageOptions$ko languageOptions = _Translations$settingsTab$general$languageOptions$ko._(_root); + @override + String get saveWindowPlacement => '종료 후 창 위치 기억'; + @override + String get saveWindowPlacementWindows => '종료 후 창 위치 기억'; + @override + String get minimizeToTray => '종료 시 시스템 트레이로 최소화'; + @override + String get launchAtStartup => '로그인 시 자동으로 시작'; + @override + String get launchMinimized => '최소화된 상태로 시작'; + @override + String get showInContextMenu => '컨텍스트 메뉴에 LocalSend 표시'; + @override + String get animations => '애니메이션'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$ko extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '받기'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => '자동 완료'; + @override + String get destination => '저장 위치'; + @override + String get downloads => '(다운로드 폴더)'; + @override + String get saveToGallery => '갤러리에 미디어 저장'; + @override + String get saveToHistory => '전송 기록 보관'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$ko extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '보내기'; + @override + String get shareViaLinkAutoAccept => '"링크로 공유하기" 요청 자동 수락'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$ko extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '네트워크'; + @override + String get needRestart => '변경 사항을 적용하려면 서버를 다시 시작하세요!'; + @override + String get server => '서버'; + @override + String get alias => '별명'; + @override + String get deviceType => '기기 유형'; + @override + String get deviceModel => '기기 모델'; + @override + String get port => '포트'; + @override + String get network => '네트워크'; + @override + late final _Translations$settingsTab$network$networkOptions$ko networkOptions = _Translations$settingsTab$network$networkOptions$ko._(_root); + @override + String get discoveryTimeout => '탐색 제한시간'; + @override + String get useSystemName => '시스템 이름 사용'; + @override + String get generateRandomAlias => '무작위 별명 생성'; + @override + String portWarning({required Object defaultPort}) => '사용자 지정 포트를 사용하면 다른 장치에서 기기가 감지되지 않을 수 있습니다. (기본값: ${defaultPort})'; + @override + String get encryption => '암호화'; + @override + String get multicastGroup => '멀티캐스트'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => '사용자 지정 멀티캐스트 주소를 사용하면 다른 장치에서 기기가 감지되지 않을 수 있습니다. (기본값: ${defaultMulticast})'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$ko extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '기타'; + @override + String get support => 'LocalSend 후원하기'; + @override + String get donate => '기부'; + @override + String get privacyPolicy => '개인정보 처리 방침'; + @override + String get termsOfUse => '이용 약관'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$ko extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get symptom => '파일을 다른 기기로 보내는 데에는 문제가 없으나, 다른 기기로부터 파일을 받을 수 없는 경우'; + @override + String solution({required Object port}) => '방화벽 설정으로 인한 문제일 가능성이 높습니다. ${port} 포트로 들어오는 연결(UDP 및 TCP)을 허용하여 이 문제를 해결할 수 있습니다.'; + @override + String get openFirewall => '방화벽 열기'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$ko extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get symptom => '현재 사용 중인 기기에서 다른 기기들이 감지되지 않는 경우'; + @override + String get solution => + '사용하려는 모든 기기가 동일한 Wi-Fi 네트워크에 연결되어 있고, 동일한 설정(포트, 멀티캐스트 주소, 암호화)이 적용되어 있는지 확인해보세요. 직접 상대의 IP 주소를 입력하여 기기를 추가할 수도 있습니다. 즐겨찾기에 등록하면 다음부터 자동으로 감지될 수 있습니다.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$ko extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get symptom => '양쪽 기기 모두 서로를 감지하지 못하거나, 파일을 전송할 수 없는 경우'; + @override + String get solution => + '양쪽 모두에 문제가 있는 경우, 두 기기가 동일한 Wi-Fi 네트워크에 연결되어 있고 동일한 설정(포트, 멀티캐스트 주소, 암호화)이 적용되어 있는지 확인해야 합니다. Wi-Fi 네트워크가 기기 간 통신을 허용하지 않는 경우일 수도 있습니다. 이 경우 라우터에서 관련 옵션을 수정해야 합니다.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$ko extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get open => '파일 열기'; + @override + String get showInFolder => '폴더에서 보기'; + @override + String get info => '정보'; + @override + String get deleteFromHistory => '기록에서 삭제'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$ko extends Translations$progressPage$total$en { + _Translations$progressPage$total$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$ko title = _Translations$progressPage$total$title$ko._(_root); + @override + String count({required Object curr, required Object n}) => '파일: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => '크기: ${curr} / ${n}'; + @override + String speed({required Object speed}) => '속도: ${speed}/초'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$ko extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '선택 파일 추가'; + @override + String get content => '어떤 파일을 추가할까요?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$ko extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '파일 열기'; + @override + String get content => '전송받은 파일을 여시겠습니까?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$ko extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '주소 입력'; + @override + String get hashtag => '해시태그'; + @override + String get ip => 'IP 주소'; + @override + String get recentlyUsed => '최근 사용된 주소: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$ko extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '파일 전송 취소'; + @override + String get content => '정말로 파일 전송을 취소할까요?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$ko extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '열 수 없는 파일'; + @override + String content({required Object file}) => '"${file}" 파일을 열 수 없습니다. 파일의 이름이 변경되었거나 이동 또는 삭제되었는지 확인해주세요.'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$ko extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '암호화 비활성화'; + @override + String get content => '이제부터 암호화되지 않은 HTTP 프로토콜을 사용해 파일을 주고 받습니다. HTTPS 프로토콜을 사용하려면 암호화를 다시 활성화해주세요.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$ko extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$ko extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '즐겨찾기'; + @override + String get noFavorites => '즐겨찾기한 기기가 없습니다.'; + @override + String get addFavorite => '추가'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$ko extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '즐겨찾기 삭제'; + @override + String content({required Object name}) => '정말로 "${name}" 기기를 즐겨찾기에서 삭제하시겠습니까?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$ko extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => '즐겨찾기 추가'; + @override + String get titleEdit => '편집'; + @override + String get name => '별명'; + @override + String get auto => '(자동)'; + @override + String get ip => 'IP 주소'; + @override + String get port => '포트'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$ko extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '파일 정보'; + @override + String get fileName => '파일 이름:'; + @override + String get path => '경로:'; + @override + String get size => '크기:'; + @override + String get sender => '보낸 사람:'; + @override + String get time => '시간:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$ko extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '파일 이름 입력'; + @override + String original({required Object original}) => '기존 이름: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$ko extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '기록 삭제'; + @override + String get content => '정말 모든 기록을 삭제하시겠습니까?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$ko extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => 'LocalSend가 다른 기기를 감지하려면 로컬 네트워크 탐색을 위한 권한이 필요합니다. 설정에서 권한을 허용해주세요.'; + @override + String get gotoSettings => '설정'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$ko extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '메시지 입력'; + @override + String get multiline => '여러 줄'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$ko extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '선택된 파일 없음'; + @override + String get content => '적어도 하나 이상의 파일을 선택해주세요.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$ko extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '권한 없음'; + @override + String get content => '필요한 권한이 부여되지 않았습니다. 설정에서 권한을 허용해주세요.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$ko extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '사용 불가'; + @override + String get content => '해당 기능은 다음 플랫폼에서만 사용할 수 있습니다:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$ko extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR 코드'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$ko extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '퀵 액션'; + @override + String get counter => '카운터'; + @override + String get prefix => '접두어'; + @override + String get padZero => '0으로 채우기'; + @override + String get sortBeforeCount => '미리 알파벳순으로 정렬'; + @override + String get random => '무작위'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$ko extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => '이제부터 파일 전송 요청이 자동으로 승인됩니다. 로컬 네트워크 상에 존재하는 모두가 당신에게 파일을 보낼 수 있다는 점을 명심하세요.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$ko extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + '이제부터 즐겨찾기 목록에 있는 기기에서 보내는 파일 전송 요청이 자동으로 승인됩니다.', + '다만, 이 기능은 아직 보안이 완벽하지 않으므로 주의가 필요합니다. 만약 해커가 즐겨찾기 기기의 식별 정보를 알아낸다면, 별다른 제한 없이 파일을 전송할 수도 있습니다.', + '그럼에도 불구하고, 로컬 네트워크 상에 존재하는 모든 기기로부터 파일 전송을 허용하는 것보다는 더 안전한 방법입니다.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$ko extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => 'PIN 번호 입력'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$ko extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => '전송 모드'; + @override + String get single => '파일을 하나의 기기에 보냅니다. 파일 전송이 완료된 후 선택 항목이 초기화됩니다.'; + @override + String get multiple => '파일을 여러 기기에 보냅니다. 파일 전송이 완료된 뒤에도 선택 항목이 유지됩니다.'; + @override + String get link => 'LocalSend가 설치되지 않은 기기에서도 브라우저를 통해 링크에 접속하여 파일을 다운로드 받을 수 있습니다.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$ko extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$ko extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get system => '시스템'; + @override + String get dark => '다크'; + @override + String get light => '라이트'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$ko extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get system => '시스템'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$ko extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get system => '시스템'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$ko extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String get all => '전체 허용'; + @override + String get filtered => '일부 허용'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$ko extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$ko._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => '진행 시간 (${time})'; + @override + String get finishedError => '에러와 함께 종료되었습니다'; + @override + String get canceledSender => '보내는 사람에 의해 취소되었습니다'; + @override + String get canceledReceiver => '받는 사람에 의해 취소되었습니다'; +} diff --git a/app/lib/gen/strings_ml.g.dart b/app/lib/gen/strings_ml.g.dart new file mode 100644 index 0000000..885e81a --- /dev/null +++ b/app/lib/gen/strings_ml.g.dart @@ -0,0 +1,1379 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsMl extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsMl({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ml, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsMl _root = this; // ignore: unused_field + + @override + TranslationsMl $copyWith({TranslationMetadata? meta}) => TranslationsMl(meta: meta ?? this.$meta); + + // Translations + @override + late final _Translations$general$ml general = _Translations$general$ml._(_root); + @override + String get appName => 'ലോക്കൽസെൻഡ്‌'; + @override + String get locale => 'മലയാളം'; + @override + late final _Translations$sendTab$ml sendTab = _Translations$sendTab$ml._(_root); + @override + late final _Translations$receiveTab$ml receiveTab = _Translations$receiveTab$ml._(_root); + @override + late final _Translations$settingsTab$ml settingsTab = _Translations$settingsTab$ml._(_root); + @override + late final _Translations$assetPicker$ml assetPicker = _Translations$assetPicker$ml._(_root); + @override + late final _Translations$web$ml web = _Translations$web$ml._(_root); + @override + late final _Translations$dialogs$ml dialogs = _Translations$dialogs$ml._(_root); + @override + late final _Translations$tray$ml tray = _Translations$tray$ml._(_root); + @override + late final _Translations$networkInterfacesPage$ml networkInterfacesPage = _Translations$networkInterfacesPage$ml._(_root); + @override + late final _Translations$sanitization$ml sanitization = _Translations$sanitization$ml._(_root); + @override + late final _Translations$receivePage$ml receivePage = _Translations$receivePage$ml._(_root); + @override + late final _Translations$receiveHistoryPage$ml receiveHistoryPage = _Translations$receiveHistoryPage$ml._(_root); + @override + late final _Translations$receiveOptionsPage$ml receiveOptionsPage = _Translations$receiveOptionsPage$ml._(_root); + @override + late final _Translations$apkPickerPage$ml apkPickerPage = _Translations$apkPickerPage$ml._(_root); + @override + late final _Translations$troubleshootPage$ml troubleshootPage = _Translations$troubleshootPage$ml._(_root); + @override + late final _Translations$selectedFilesPage$ml selectedFilesPage = _Translations$selectedFilesPage$ml._(_root); + @override + late final _Translations$sendPage$ml sendPage = _Translations$sendPage$ml._(_root); + @override + late final _Translations$progressPage$ml progressPage = _Translations$progressPage$ml._(_root); + @override + late final _Translations$webSharePage$ml webSharePage = _Translations$webSharePage$ml._(_root); + @override + late final _Translations$donationPage$ml donationPage = _Translations$donationPage$ml._(_root); + @override + late final _Translations$aboutPage$ml aboutPage = _Translations$aboutPage$ml._(_root); + @override + late final _Translations$changelogPage$ml changelogPage = _Translations$changelogPage$ml._(_root); +} + +// Path: general +class _Translations$general$ml extends Translations$general$en { + _Translations$general$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get edit => 'തിരുത്തുക'; + @override + String get accept => 'സ്വീകരിക്കുക'; + @override + String get accepted => 'അംഗീകരിച്ചു'; + @override + String get add => 'ചേർക്കുക'; + @override + String get advanced => 'അഡ്വാൻസ്ഡ്'; + @override + String get cancel => 'വേണ്ടെന്നു വയ്ക്കുക'; + @override + String get confirm => 'സ്ഥിരീകരിക്കുക'; + @override + String get continueStr => 'തുടരുക'; + @override + String get copy => 'പകർത്തുക'; + @override + String get decline => 'നിരസിക്കുക'; + @override + String get delete => 'നീക്കം ചെയ്യുക'; + @override + String get error => 'തകരാറ്'; + @override + String get example => 'ഉദാഹരണം'; + @override + String get files => 'ഫയലുകൾ'; + @override + String get finished => 'പൂർത്തിയാക്കി'; + @override + String get hide => 'മറയ്ക്കുക'; + @override + String get save => 'സേവ്'; + @override + String get close => 'അവസാനിപ്പിക്കുക'; + @override + String get copiedToClipboard => 'ക്ലിപ്പ്ബോർഡിലേക്ക് കോപ്പി ചെയ്തു'; + @override + String get done => 'ചെയ്തു കഴിഞ്ഞു'; + @override + String get off => 'നിർത്തുക'; + @override + String get offline => 'പ്രവർത്തനക്ഷമമല്ല'; + @override + String get on => 'തുടങ്ങുക'; + @override + String get online => 'പ്രവർത്തനക്ഷമമായി'; + @override + String get open => 'തുറക്കുക'; + @override + String get queue => 'കാത്തുനിൽക്കുക'; + @override + String get quickSave => 'വേഗത്തിൽ സേവ് ചെയ്യുക'; + @override + String get quickSaveFromFavorites => 'വേഗത്തിൽ ഫേവറിറ്റ് ആയി സേവ് ചെയ്യുക'; + @override + String get renamed => 'പേര് മാറ്റി'; + @override + String get reset => 'മാറ്റങ്ങൾ ഇല്ലാതാക്കുക'; + @override + String get restart => 'വീണ്ടും തുടങ്ങുക'; + @override + String get settings => 'സജ്ജീകരണങ്ങൾ'; + @override + String get skipped => 'വിട്ടു കളഞ്ഞു'; + @override + String get start => 'ആരംഭിക്കുക'; + @override + String get stop => 'നിർത്തുക'; + @override + String get unchanged => 'മാറ്റമില്ലാത്ത'; + @override + String get unknown => 'അജ്ഞാതമായ'; + @override + String get noItemInClipboard => 'ക്ലിപ്ബോർഡിൽ ഒന്നും ഇല്ല.'; +} + +// Path: sendTab +class _Translations$sendTab$ml extends Translations$sendTab$en { + _Translations$sendTab$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get shareIntentInfo => 'താങ്കൾക്ക് മൊബൈലിലെ ഷെയർ ഫീച്ചർ ഉപയോഗിച്ചു എളുപ്പത്തിൽ ഫയൽസ് സെലക്ട് ചെയ്യാം.'; + @override + String get title => 'അയക്കുക'; + @override + late final _Translations$sendTab$selection$ml selection = _Translations$sendTab$selection$ml._(_root); + @override + late final _Translations$sendTab$picker$ml picker = _Translations$sendTab$picker$ml._(_root); + @override + String get nearbyDevices => 'അടുത്തുള്ള ഉപകരണങ്ങൾ'; + @override + String get thisDevice => 'ഈ ഉപകരണം'; + @override + String get scan => 'സെർച്ച് ഡിവൈസസ്'; + @override + String get manualSending => 'മാന്വലായി അയക്കുക'; + @override + String get sendMode => 'അയക്കുന്ന രീതി'; + @override + late final _Translations$sendTab$sendModes$ml sendModes = _Translations$sendTab$sendModes$ml._(_root); + @override + String get sendModeHelp => 'വിശദീകരണം'; + @override + String get help => 'ലഭിക്കേണ്ടയാളും ഒരേ WIFI യിൽ കണക്റ്റഡ് ആണെന്ന് ഉറപ്പു വരുത്തുക.'; + @override + String get placeItems => 'ഷെയർ ചെയ്യേണ്ട ഐറ്റംസ് ഇടുക.'; +} + +// Path: receiveTab +class _Translations$receiveTab$ml extends Translations$receiveTab$en { + _Translations$receiveTab$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'സ്വീകരിക്കുക'; + @override + late final _Translations$receiveTab$infoBox$ml infoBox = _Translations$receiveTab$infoBox$ml._(_root); + @override + late final _Translations$receiveTab$quickSave$ml quickSave = _Translations$receiveTab$quickSave$ml._(_root); +} + +// Path: settingsTab +class _Translations$settingsTab$ml extends Translations$settingsTab$en { + _Translations$settingsTab$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$settingsTab$general$ml general = _Translations$settingsTab$general$ml._(_root); + @override + late final _Translations$settingsTab$network$ml network = _Translations$settingsTab$network$ml._(_root); + @override + late final _Translations$settingsTab$receive$ml receive = _Translations$settingsTab$receive$ml._(_root); + @override + late final _Translations$settingsTab$send$ml send = _Translations$settingsTab$send$ml._(_root); + @override + String get title => 'ക്രമീകരണങ്ങൾ'; + @override + late final _Translations$settingsTab$other$ml other = _Translations$settingsTab$other$ml._(_root); + @override + String get advancedSettings => 'അഡ്വാൻസ്‌ഡ് ക്രമീകരണങ്ങൾ'; +} + +// Path: assetPicker +class _Translations$assetPicker$ml extends Translations$assetPicker$en { + _Translations$assetPicker$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get accessLimitedAssets => 'മുഴുവൻ ആക്സസ് ഇല്ലാതെ തന്നെ മുന്നോട് പോവുക'; + @override + String get accessAllTip => 'ഈ ഡിവൈസ്സിലെ കുറച്ച ഫയൽസ് മാത്രമേ അക്സസ്സ് ചെയ്യാൻ പറ്റുന്നുള്ളു . സിസ്റ്റം സെറ്റിങ്‌സിൽ നിന്നും അനുവദിക്കുക.'; + @override + String get sNameDurationLabel => 'ദൈർഖ്യം'; + @override + String get confirm => 'ഉറപ്പാക്കുക'; + @override + String get cancel => 'വേണ്ടെന്നു വയ്ക്കുക'; + @override + String get edit => 'മാറ്റം വരുത്തുക'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'ലോഡ് ചെയ്യാൻ പരാജയപെട്ടു'; + @override + String get original => 'ഉത്ഭവം'; + @override + String get preview => 'സ്വകാര്യപ്രദർശനം'; + @override + String get select => 'തിരഞ്ഞെടുക്കുക'; + @override + String get emptyList => 'ഒഴിഞ്ഞ ലിസ്റ്റ്'; + @override + String get unSupportedAssetType => 'ഫയൽ ടൈപ് സപ്പോർട്ട് ചെയ്യുന്നില്ല.'; + @override + String get unableToAccessAll => 'ഈ ഡിവൈസ്സിലെ മുഴുവൻ ഫയൽസും അക്സസ്സ് ചെയ്യാൻ പറ്റുന്നില്ല'; + @override + String get viewingLimitedAssetsTip => 'വ്യൂ ഫയൽസും കൂടെ ആൽബവും മാത്രമേ അക്സസ്സ് ചെയ്യാൻ പറ്റുന്നുള്ളു.'; + @override + String get changeAccessibleLimitedAssets => 'ആക്സിസിബിൾ ആയിട്ടുള്ള ഫയൽസ് അപ്ഡേറ്റ് ചെയ്യാൻ ക്ലിക്ക് ചെയ്യുക'; + @override + String get goToSystemSettings => 'സിസ്റ്റം സെറ്റിങ്‌സിലേക്കു പോവുക'; + @override + String get accessiblePathName => 'അക്സസ്സ് ചെയ്യാൻ പറ്റുന്ന ഫയലുകൾ'; + @override + String get sTypeAudioLabel => 'ഓഡിയോ'; + @override + String get sTypeImageLabel => 'ഇമേജ്'; + @override + String get sTypeVideoLabel => 'വീഡിയോ'; + @override + String get sTypeOtherLabel => 'മറ്റു തരത്തിലുള്ളവ'; + @override + String get sActionPlayHint => 'പ്രവർത്തനം തുടങ്ങുക'; + @override + String get sActionPreviewHint => 'സ്വകാര്യപ്രദർശനം'; + @override + String get sActionSelectHint => 'തിരഞ്ഞെടുക്കുക'; + @override + String get sActionSwitchPathLabel => 'Path മാറ്റുക'; + @override + String get sActionUseCameraHint => 'ക്യാമറ ഉപയോഗിക്കുക'; + @override + String get sUnitAssetCountLabel => 'എണ്ണം'; +} + +// Path: web +class _Translations$web$ml extends Translations$web$en { + _Translations$web$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get tooManyAttempts => 'ഒരുപാട് തവണ തെറ്റായി ട്രൈ ചെയ്തു'; + @override + String get fileName => 'ഫയലിന്റെ പേര്'; + @override + String get size => 'സൈസ്'; + @override + String get enterPin => 'PIN എന്റർ ചെയ്യുക'; + @override + String get invalidPin => 'PIN തെറ്റാണു'; + @override + String get rejected => 'തള്ളിക്കളയപെട്ടു'; + @override + String get files => 'ഫയലുകൾ'; +} + +// Path: dialogs +class _Translations$dialogs$ml extends Translations$dialogs$en { + _Translations$dialogs$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$ml quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$ml._(_root); + @override + late final _Translations$dialogs$sendModeHelp$ml sendModeHelp = _Translations$dialogs$sendModeHelp$ml._(_root); + @override + late final _Translations$dialogs$pin$ml pin = _Translations$dialogs$pin$ml._(_root); + @override + late final _Translations$dialogs$zoom$ml zoom = _Translations$dialogs$zoom$ml._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$ml encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$ml._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$ml localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$ml._(_root); + @override + late final _Translations$dialogs$addFile$ml addFile = _Translations$dialogs$addFile$ml._(_root); + @override + late final _Translations$dialogs$openFile$ml openFile = _Translations$dialogs$openFile$ml._(_root); + @override + late final _Translations$dialogs$addressInput$ml addressInput = _Translations$dialogs$addressInput$ml._(_root); + @override + late final _Translations$dialogs$cancelSession$ml cancelSession = _Translations$dialogs$cancelSession$ml._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$ml cannotOpenFile = _Translations$dialogs$cannotOpenFile$ml._(_root); + @override + late final _Translations$dialogs$favoriteDialog$ml favoriteDialog = _Translations$dialogs$favoriteDialog$ml._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$ml favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$ml._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$ml favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$ml._(_root); + @override + late final _Translations$dialogs$fileInfo$ml fileInfo = _Translations$dialogs$fileInfo$ml._(_root); + @override + late final _Translations$dialogs$fileNameInput$ml fileNameInput = _Translations$dialogs$fileNameInput$ml._(_root); + @override + late final _Translations$dialogs$historyClearDialog$ml historyClearDialog = _Translations$dialogs$historyClearDialog$ml._(_root); + @override + late final _Translations$dialogs$messageInput$ml messageInput = _Translations$dialogs$messageInput$ml._(_root); + @override + late final _Translations$dialogs$noFiles$ml noFiles = _Translations$dialogs$noFiles$ml._(_root); + @override + late final _Translations$dialogs$noPermission$ml noPermission = _Translations$dialogs$noPermission$ml._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$ml notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$ml._(_root); + @override + late final _Translations$dialogs$qr$ml qr = _Translations$dialogs$qr$ml._(_root); + @override + late final _Translations$dialogs$quickActions$ml quickActions = _Translations$dialogs$quickActions$ml._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$ml quickSaveNotice = _Translations$dialogs$quickSaveNotice$ml._(_root); +} + +// Path: tray +class _Translations$tray$ml extends Translations$tray$en { + _Translations$tray$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get close => 'ഈ അപ്പ്ലിക്കേഷനിൽ നിന്നും പുറത്തു കടക്കുക'; + @override + String get closeWindows => 'എക്സിറ്'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$ml extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get preview => 'സ്വകാര്യപ്രദർശനം'; + @override + String get info => + 'ഡിഫോൾട്ടായി, ലോക്കൽസെൻഡ് ലഭ്യമായ എല്ലാ നെറ്റ്‌വർക്ക് ഇന്റർഫേസുകളും ഉപയോഗിക്കുന്നു. നിങ്ങൾക്ക് ഇവിടെ ആവശ്യമില്ലാത്ത നെറ്റ്‌വർക്കുകൾ ഒഴിവാക്കാം. മാറ്റങ്ങൾ പ്രയോഗിക്കാൻ നിങ്ങൾ സെർവർ പുനരാരംഭിക്കേണ്ടതുണ്ട്.'; + @override + String get title => 'നെറ്റ്‌വർക്ക് ഇന്റർഫേസുകൾ'; + @override + String get whitelist => 'വൈറ്റ്‌ലിസ്റ്റ്'; + @override + String get blacklist => 'ബ്ലാക്ക്‌ലിസ്റ്റ്'; +} + +// Path: sanitization +class _Translations$sanitization$ml extends Translations$sanitization$en { + _Translations$sanitization$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get empty => 'ഫയലിന്റെ പേര് ആവശ്യമാണ്'; + @override + String get invalid => 'ഫയലിന്റെ പേരിൽ അംഗീകാരമില്ലാത്ത അക്ഷരങ്ങൾ ഉണ്ട്'; +} + +// Path: receivePage +class _Translations$receivePage$ml extends Translations$receivePage$en { + _Translations$receivePage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ml'))( + n, + one: 'നിങ്ങൾക്ക് ഒരു ഫയൽ അയയ്‌ക്കാൻ താൽപ്പര്യപ്പെടുന്നു', + other: 'നിങ്ങൾക്ക് ${n} ഫയലുകൾ അയയ്‌ക്കാൻ താൽപ്പര്യപ്പെടുന്നു', + ); + @override + String get subTitleLink => 'നിങ്ങൾക്ക് ഒരു ലിങ്ക് അയച്ചു:'; + @override + String get subTitleMessage => 'നിങ്ങൾക്ക് ഒരു സന്ദേശം അയച്ചു:'; + @override + String get canceled => 'അയച്ചയാൾ റിക്വസ്റ്റ് റദ്ദാക്കിയിരിക്കുന്നു.'; +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$ml extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$receiveHistoryPage$entryActions$ml entryActions = _Translations$receiveHistoryPage$entryActions$ml._(_root); + @override + String get title => 'ഹിസ്റ്ററി'; + @override + String get openFolder => 'ഫോൾഡർ തുറക്കുക'; + @override + String get deleteHistory => 'ഹിസ്റ്ററി ഡിലീറ്റ് ചെയ്യുക'; + @override + String get empty => 'ഹിസ്റ്ററി ശൂന്യമാണ്.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$ml extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get saveToGalleryOff => 'ഫോൾഡറുകൾ ഉള്ളതിനാൽ ഓട്ടോമാറ്റിക്കായി ഓഫാക്കി.'; + @override + String get title => 'ഓപ്ഷനുകൾ'; + @override + String get appDirectory => '(ലോക്കൽസെൻഡ് ഫോൾഡർ)'; +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$ml extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get excludeSystemApps => 'സിസ്റ്റം ആപ്പുകൾ ഒഴിവാക്കുക'; + @override + String get title => 'ആപ്പുകൾ (APK)'; + @override + String get excludeAppsWithoutLaunchIntent => 'ലോഞ്ച് ചെയ്യാൻ കഴിയാത്ത ആപ്പുകൾ ഒഴിവാക്കുക'; + @override + String apps({required Object n}) => '${n} ആപ്പുകൾ'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$ml extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$troubleshootPage$firewall$ml firewall = _Translations$troubleshootPage$firewall$ml._(_root); + @override + String get title => 'ട്രബിൾഷൂട്ട് ചെയ്യുക'; + @override + String get subTitle => 'ആപ്പ് പ്രതീക്ഷിച്ചതുപോലെ പ്രവർത്തിക്കുന്നില്ലേ? പ്രശ്‌നങ്ങൾക്കുള്ള പൊതുവായ ചില പരിഹാരങ്ങൾ ഇവിടെ കാണാം.'; + @override + String get solution => 'പരിഹാരം:'; + @override + late final _Translations$troubleshootPage$noDiscovery$ml noDiscovery = _Translations$troubleshootPage$noDiscovery$ml._(_root); + @override + String get fixButton => 'ഓട്ടോമാറ്റിക്കായി ശരിയാക്കുക'; + @override + late final _Translations$troubleshootPage$noConnection$ml noConnection = _Translations$troubleshootPage$noConnection$ml._(_root); +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$ml extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'എല്ലാം ഡിലീറ്റ് ചെയ്യുക'; +} + +// Path: sendPage +class _Translations$sendPage$ml extends Translations$sendPage$en { + _Translations$sendPage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'പ്രതികരണത്തിനായി കാത്തിരിക്കുന്നു…'; + @override + String get rejected => 'സ്വീകർത്താവ് അപേക്ഷ നിരസിച്ചിരിക്കുന്നു.'; + @override + String get busy => 'സ്വീകർത്താവ് മറ്റൊരു അപേക്ഷ മൂലം തിരക്കിലാണ്.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; +} + +// Path: progressPage +class _Translations$progressPage$ml extends Translations$progressPage$en { + _Translations$progressPage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'ഫയലുകൾ അയയ്ക്കുന്നു'; + @override + String get titleReceiving => 'ഫയലുകൾ സ്വീകരിക്കുന്നു'; + @override + String get savedToGallery => 'ഫോട്ടോസിൽ സേവ് ചെയ്തു'; + @override + late final _Translations$progressPage$total$ml total = _Translations$progressPage$total$ml._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$ml extends Translations$webSharePage$en { + _Translations$webSharePage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String pinHint({required Object pin}) => 'പിൻ ഇതാണ് "${pin}"'; + @override + String get encryptionHint => 'ലോക്കൽസെൻഡ്‌ ഉപയോഗിക്കുന്നത് സ്വയം ഒപ്പു വച്ച സാക്ഷ്യപത്രം ആണ്. നിങ്ങളുടെ ബ്രൗസറിൽ ഇത് നിങ്ങൾ അംഗീകരിക്കണം.'; + @override + String get title => 'ലിങ്ക് വഴി ഷെയർ ചെയ്യുക'; + @override + String get loading => 'സെർവർ ആരംഭിക്കുന്നു…'; + @override + String get stopping => 'സെർവർ നിർത്തുന്നു…'; + @override + String get error => 'സെർവർ ആരംഭിക്കുന്നതിൽ തടസ്സം നേരിട്ടു.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ml'))( + n, + one: 'ഈ ലിങ്ക് നിങ്ങളുടെ ബ്രൗസറിൽ തുറക്കുക:', + other: 'ഏതെങ്കിലും ഒരു ലിങ്ക് നിങ്ങളുടെ ബ്രൗസറിൽ തുറക്കുക:', + ); + @override + String get requests => 'അപേക്ഷകൾ'; + @override + String get noRequests => 'അപേക്ഷകളൊന്നും ഇതുവരെ ഇല്ല.'; + @override + String get autoAccept => 'ആട്ടോമാറ്റിക് ആയി അപേക്ഷകൾ സ്വീകരിക്കുക'; + @override + String get requirePin => 'പിൻ ആവശ്യമാണ്'; + @override + String pendingRequests({required Object n}) => 'തീരുമാനിക്കപ്പെടാത്ത അപേക്ഷകൾ: ${n}'; +} + +// Path: donationPage +class _Translations$donationPage$ml extends Translations$donationPage$en { + _Translations$donationPage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get info => + 'ലോക്കൽസെൻഡ്‌ സൗജന്യവും ഓപ്പൺ-സോഴ്സും പരസ്യങ്ങൾ ഇല്ലാത്തതും ആണ്. നിങ്ങൾക്കു ആപ്പ് ഇഷ്ടമായെങ്കിൽ ചെറിയ സംഭാവന നൽകി വികസനത്തിന് സഹായിക്കാവുന്നതാണ്.'; + @override + String get title => 'സംഭാവന ചെയ്യുക'; + @override + String donate({required Object amount}) => 'സംഭാവന ${amount}'; + @override + String get thanks => 'ഒരുപാട് നന്ദിയുണ്ട്!'; + @override + String get restore => 'വാങ്ങിയത് വീണ്ടെടുക്കുക'; +} + +// Path: aboutPage +class _Translations$aboutPage$ml extends Translations$aboutPage$en { + _Translations$aboutPage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + List get description => [ + 'ഇന്റർനെറ്റ് കണക്ഷന്റെ ആവശ്യമില്ലാതെ ലോക്കൽ നെറ്റ്വർക്കിലൂടെ അടുത്തുള്ള ഡിവൈസുകളിലേക്ക് സുരക്ഷിതമായി ഫയലുകളും മെസ്സേജുകളും അയക്കാൻ അനുവദിക്കുന്ന ഒരു സൗജന്യ ഓപ്പൺ സോഴ്സ് ആപ്പ് ആണ് ലോക്കൽസെൻഡ്‌.', + 'ഈ ആപ്പ് ആൻഡ്രോയിഡ്, ഐഒഎസ്, മാക് ഒഎസ്, വിൻഡോസ് , ലിനക്സ് എന്നീ പ്ലാറ്റുഫോമുകളിൽ ലഭ്യമാണ് . എല്ലാവിധ ഡൌൺലോഡ് ഓപ്ഷൻസും ഔദ്യോഗിക ഹോം പേജിൽ കാണാവുന്നതാണ്.', + ]; + @override + String get title => 'ലോക്കൽസെൻഡിനെ കുറിച്ച്'; + @override + String get author => 'ലേഖകൻ'; + @override + String get contributors => 'സംഭാവന ചെയ്യുന്നവർ'; + @override + String get packagers => 'സംയോജിപ്പിക്കുന്നവർ'; + @override + String get translators => 'പരിഭാഷകർ'; +} + +// Path: changelogPage +class _Translations$changelogPage$ml extends Translations$changelogPage$en { + _Translations$changelogPage$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'മാറ്റവിവരപട്ടിക'; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$ml extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'തിരഞ്ഞെടുക്കപ്പെട്ടത്'; + @override + String files({required Object files}) => 'ഫയലുകൾ:${files}'; + @override + String size({required Object size}) => 'വലുപ്പം : ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$ml extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get file => 'ഫയൽ'; + @override + String get folder => 'ഫോൾഡർ'; + @override + String get media => 'മീഡിയ'; + @override + String get text => 'ടെക്സ്റ്റ്'; + @override + String get app => 'ആപ്പ്'; + @override + String get clipboard => 'പേസ്റ്റ്'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$ml extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get single => 'സ്വീകരിക്കുന്നയാൾ'; + @override + String get multiple => 'സ്വീകരിക്കുന്നവർ'; + @override + String get link => 'ലിങ്ക് ഉപയോഗിച് ഷെയർ ചെയ്യുക'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$ml extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'port:'; + @override + String get alias => 'പേര് :'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$ml extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'പ്രിയപ്പെട്ട'; + @override + String get on => _root.general.on; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$ml extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get saveWindowPlacementWindows => 'എക്സിറ് ആയ ശേഷം ഇപ്പോൾ ഉള്ള വിൻഡോ പൊസിഷൻ സേവ് ചെയ്യുക'; + @override + String get showInContextMenu => 'കണ്ടെക്സ്റ് മെനുവിൽ ഈ അപ്ലിക്കേഷൻ കാണിക്കുക'; + @override + String get title => 'പൊതുവായത്'; + @override + String get brightness => 'തീം'; + @override + late final _Translations$settingsTab$general$brightnessOptions$ml brightnessOptions = _Translations$settingsTab$general$brightnessOptions$ml._( + _root, + ); + @override + String get color => 'നിറം'; + @override + late final _Translations$settingsTab$general$colorOptions$ml colorOptions = _Translations$settingsTab$general$colorOptions$ml._(_root); + @override + String get language => 'ഭാഷ'; + @override + late final _Translations$settingsTab$general$languageOptions$ml languageOptions = _Translations$settingsTab$general$languageOptions$ml._(_root); + @override + String get saveWindowPlacement => 'എക്സിറ് ആയ ശേഷം ഇപ്പോൾ ഉള്ള വിന്ഡോ പൊസിഷൻ സേവ് ചെയ്യുക'; + @override + String get minimizeToTray => 'ക്ലോസ് ചെയ്യുന്ന സമയത്തു മെനുബാറിലേക്കോ/സിസ്റ്റം ട്രയിലേക്കോ മിനിമൈസ് ചെയ്യുക'; + @override + String get launchAtStartup => 'ലോഗിൻ ആയ ശേഷം താനേ പ്രവർത്തിക്കുക'; + @override + String get launchMinimized => 'താനെ പ്രവർത്തിക്കുക: തുടങ്ങുമ്പോൾ ഹൈഡ് ആയി തുടങ്ങുക'; + @override + String get animations => 'അനിമേഷനുകൾ'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$ml extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get needRestart => 'പതിയ മാറ്റങ്ങൾ അപ്ലൈ ചെയ്യാൻ സെർവർ റീസ്റ്റാർട്ട് ചെയ്യുക!'; + @override + String get title => 'നെറ്റ്‌വർക്ക്'; + @override + String get server => 'സെർവർ'; + @override + String get deviceType => 'ഡിവൈസിന്റെ തരം'; + @override + String get alias => 'ഡിവൈസിന്റെ പേര്'; + @override + String get deviceModel => 'ഡിവൈസിന്റെ മോഡൽ'; + @override + String get port => 'Port'; + @override + String get network => 'നെറ്റ്‌വർക്ക്'; + @override + late final _Translations$settingsTab$network$networkOptions$ml networkOptions = _Translations$settingsTab$network$networkOptions$ml._(_root); + @override + String get discoveryTimeout => 'ഡിസ്കവർ ചെയ്യാനുള്ള സമയം കഴിഞ്ഞു'; + @override + String get useSystemName => 'ഈ സിസ്റ്റത്തിന്റെ പേര് ഉപയോഗിക്കുക'; + @override + String get generateRandomAlias => 'ഒരു ആകസ്മികമായ മറുപേർ ഉണ്ടാക്കുക'; + @override + String portWarning({required Object defaultPort}) => + 'നിങ്ങൾ ഒരു ഇഷ്ടാനുസൃത പോർട്ട് ഉപയോഗിക്കുന്നതിനാൽ മറ്റ് ഉപകരണങ്ങൾക്ക് നിങ്ങളെ കണ്ടെത്താൻ കഴിഞ്ഞേക്കില്ല. (default: ${defaultPort})'; + @override + String get encryption => 'എൻക്രിപ്ഷൻ'; + @override + String get multicastGroup => 'മൾട്ടികാസ്റ്റ് അഡ്രസ്സ്'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'നിങ്ങൾ ഒരു ഇഷ്ടാനുസൃത മൾട്ടികാസ്റ്റ് വിലാസം ഉപയോഗിക്കുന്നതിനാൽ മറ്റ് ഡിവൈസുകൾ നിങ്ങളെ കണ്ടെത്തിയേക്കില്ല. (default : ${defaultMulticast})'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$ml extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get saveToGallery => 'മീഡിയ ഫയൽസ് ഗാലറിയിലേക്ക് സേവ് ചെയ്യുക'; + @override + String get title => 'സ്വീകരിക്കുന്ന'; + @override + String get autoFinish => 'ഓട്ടോമാറ്റിക് ആയി ഫിനിഷ് ചെയ്യുക'; + @override + String get destination => 'ഫോൾഡറിലേക്കു സേവ് ചെയ്യുക'; + @override + String get downloads => '(ഡൗൻലോഡ്)'; + @override + String get saveToHistory => 'ഹിസ്റ്ററിയിലേക്കു സേവ് ചെയ്യുക'; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$ml extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get shareViaLinkAutoAccept => '"ലിങ്ക് വഴി ഷെയർ" ചെയ്യുമ്പോൾ ഓട്ടോമാറ്റിക് ആയി സ്വീകരിക്കുക'; + @override + String get title => 'അയക്കുക'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$ml extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get privacyPolicy => 'സ്വകാര്യത നയം'; + @override + String get support => 'ലോക്കൽ സെൻഡ് പിന്തുണ നൽകുക'; + @override + String get donate => 'സംഭാവന ചെയ്യുക'; + @override + String get termsOfUse => 'ഉപയോഗ നിബന്ധനകൾ'; + @override + String get title => 'മറ്റുള്ളവ'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$ml extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + List get content => [ + 'നിങ്ങളുടെ ഫേവറൈറ്സ് ഉള്ള ഡിവൈസുകളിൽ നിന്നും ഓട്ടോമാറ്റിക് ആയി റിക്വസ്റ്റ് അക്സെപ്റ് ചെയ്യും.', + 'മുന്നറിയിപ്പ് ! നിങ്ങളുടെ ഡിവൈസിനെ കുറിച്ച ഡീറ്റൈൽ ആയി അറിയാവുന്ന ഒരു ഹാക്കർക്ക് ,നേരിട്ട് ഫയൽ നിങ്ങള്ക്ക് അയക്കാൻ പറ്റും.', + 'എന്നിരുന്നാലും , ഈ ഓപ്ഷൻ ലോക്കൽ നെറ്റ്‌വർക്കലെ എല്ലാവരെയും ഫയൽ സെൻറ് ചെയ്യാൻ അനുവദിക്കുന്നതിനേക്കാളും സേഫ് ആണ്.', + ]; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$ml extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get link => 'ലോക്കൽസെൻഡ്‌ ഇൻസ്റ്റാൾ ചെയ്തവർക് ഈ ലിങ്ക് ബ്രൗസറിൽ ഓപ്പൺ ചെയ്ത ഫയൽ ഡൌൺലോഡ് ചെയ്യാം.'; + @override + String get title => 'അയക്കാൻ പറ്റുന്ന രീതികൾ'; + @override + String get single => 'ഫയൽസ് എല്ലാം ഒരാൾക്ക് അയക്കുക, അയച്ചു കഴിഞ്ഞ ശേഷം സെക്ഷൻ ക്ലീൻ ചെയ്യപ്പെടും.'; + @override + String get multiple => 'ഫയൽസ് കുറേപേർക്കു അയക്കുക, അയച്ചു കഴിഞ്ഞ ശേഷം സെക്ഷൻ ക്ലീൻ ചെയ്യപ്പെടില്ല .'; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$ml extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'PIN എന്റർ ചെയ്യുക'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$ml extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$ml extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get content => + 'എൻക്രിപ്ട് ചെയ്യാത്ത HTTP പ്രോട്ടോകോൾ വഴിയാണ് ഇപ്പോൾ ആശയ വിനിമയം നടക്കുന്നത്. HTTPS പ്രോട്ടോകോൾ ഉപയോഗിക്കാൻ എൻക്രിപ്ഷൻ ഓൺ ചെയ്യുക.'; + @override + String get title => 'എൻക്രിപ്ഷൻ ഓഫ് ചെയ്തു'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$ml extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get description => + 'അനുവാദം ഇല്ലാതെ ലോക്കൽ നെറ്റ്‌വർക്ക് സ്കാൻ ചെയ്തു മറ്റു ഡിവൈസുകൾ കണ്ടുപിടിക്കാൻ ലോക്കൽസെന്റിന്‌ കഴിയില്ല. ദയവായി സെറ്റിങ്സിൽ ഇതിനുള്ള അനുവാദം നൽകുക.'; + @override + String get gotoSettings => 'സജ്ജീകരണങ്ങൾ'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$ml extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'തിരഞ്ഞെടുത്തതിലേക്കു ചേർക്കുക'; + @override + String get content => 'എന്താണ് നിങ്ങൾക്കു ചേർക്കേണ്ടത്?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$ml extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'ഫയൽ തുറക്കുക'; + @override + String get content => 'ലഭിച്ച ഫയൽ നിങ്ങൾക്കു തുറക്കണമോ?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$ml extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'വിലാസം എഴുതുക'; + @override + String get hashtag => 'ഹാഷ്ടാഗ്'; + @override + String get ip => 'ഐ പി അഡ്രസ്'; + @override + String get recentlyUsed => 'ഈയ്യിടെ ഉപയോഗിച്ചത്: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$ml extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'ഫയൽ കൈമാറ്റം റദ്ദാക്കുക'; + @override + String get content => 'നിങ്ങൾക്കു തീർച്ചയായും ഫയലുകളുടെ കൈമാറ്റം റദ്ദാക്കണമോ?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$ml extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'ഫയൽ തുറക്കാൻ കഴിയുന്നില്ല'; + @override + String content({required Object file}) => + '"${file}" തുറക്കാൻ കഴിയുന്നില്ല. ഈ ഫയൽ ഡിലീറ്റ് ചെയ്യുകയോ പേര് മാറ്റുകയോ മറ്റൊരിടത്തേക്ക് നീക്കുകയോ ചെയ്തിരിക്കുന്നുവോ?'; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$ml extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'ഫേവറിറ്റ്സ്'; + @override + String get noFavorites => 'ഫേവറിറ്റ് ഡിവൈസുകൾ ഇതുവരെ ഇല്ല.'; + @override + String get addFavorite => 'ചേർക്കുക'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$ml extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'ഫേവറിറ്റ്സിൽ നിന്ന് ഒഴിവാക്കുക'; + @override + String content({required Object name}) => 'നിങ്ങൾക്കു തീർച്ചയായും "${name}" ഫേവറിറ്റ്സിൽ നിന്ന് ഒഴിവാക്കണമോ?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$ml extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'ഫേവറിറ്റ്സിൽ ചേർക്കുക'; + @override + String get titleEdit => 'സജ്ജീകരണങ്ങൾ'; + @override + String get name => 'ഡിവൈസ് നാമം'; + @override + String get ip => 'ഐ പി അഡ്രസ്'; + @override + String get port => 'പോർട്ട്'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$ml extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'ഫയൽ വിവരങ്ങൾ'; + @override + String get fileName => 'ഫയൽ നാമം:'; + @override + String get path => 'പാത:'; + @override + String get size => 'സൈസ്:'; + @override + String get sender => 'അയക്കുന്നവൻ:'; + @override + String get time => 'സമയം:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$ml extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'ഫയൽ നാമം എഴുതുക'; + @override + String original({required Object original}) => 'ഒറിജിനൽ: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$ml extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'ഹിസ്റ്ററി ക്ലിയർ ചെയ്യുക'; + @override + String get content => 'നിങ്ങൾക്കു തീർച്ചയായും മുഴുവൻ ഹിസ്റ്ററി ഡിലീറ്റ് ചെയ്യണമോ?'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$ml extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'സന്ദേശം ടൈപ്പ് ചെയ്യുക'; + @override + String get multiline => 'ബഹുരേഖ'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$ml extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'ഫയലുകളൊന്നും തിരഞ്ഞെടുത്തില്ല'; + @override + String get content => 'ദയവായി ഒരു ഫയൽ എങ്കിലും തിരഞ്ഞെടുക്കുക.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$ml extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'അനുവാദമില്ല'; + @override + String get content => 'ആവശ്യമായ അനുമതികൾ നിങ്ങൾ അനുവദിച്ചിട്ടില്ല. ദയവായി സജ്ജീകരണങ്ങളിൽ അവ അനുവദിക്കുക.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$ml extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'ലഭ്യമല്ല'; + @override + String get content => 'ഈ ഫീച്ചർ ലഭ്യമായത് ഇവിടെ മാത്രം:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$ml extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'ക്യു ആർ കോഡ്'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$ml extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get title => 'ചടുല പ്രവർത്തികൾ'; + @override + String get counter => 'കൗണ്ടർ'; + @override + String get sortBeforeCount => 'മുൻകൂട്ടി അകാരാദിക്രമത്തിൽ ഒത്തിരിക്കുക (A-Z)'; + @override + String get random => 'ക്രമമില്ലാത്തത്'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$ml extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get content => + 'ഫയൽ അപേക്ഷകൾ ഇപ്പോൾ ഓട്ടോമാറ്റിക് ആയി അനുവദിക്കുന്നു. ലോക്കൽ നെറ്റ്‌വർക്കിലുള്ള എല്ലാവര്ക്കും നിങ്ങൾക്കു ഫയൽ അയക്കാൻ കഴിയും എന്ന ബോധ്യമുണ്ടായിരിക്കുക.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$ml extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get info => 'വിവരങ്ങൾ'; + @override + String get open => 'ഫയൽ തുറക്കുക'; + @override + String get showInFolder => 'ഫോൾഡറിൽ കാണിക്കുക'; + @override + String get deleteFromHistory => 'ഹിസ്റ്ററിയിൽ നിന്ന് ഡിലീറ്റ് ചെയ്യുക'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$ml extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String solution({required Object port}) => + 'ഇത് മിക്കവാറും ഒരു ഫയർവാൾ പ്രശ്നമാണ്. പോർട്ട് ${port}-ൽ ഇൻകമിംഗ് കണക്ഷനുകൾ (UDP, TCP) അനുവദിച്ചുകൊണ്ട് നിങ്ങൾക്ക് ഇത് പരിഹരിക്കാൻ കഴിയും.'; + @override + String get symptom => 'ഈ ഡിവൈസിന് മറ്റ് ഡിവൈസുകളിലേക് ഫയലുകൾ അയയ്ക്കാൻ കഴിയും, എന്നാൽ മറ്റ് ഡിവൈസുകൾക്ക് ഈ ഡിവൈസിലേക്ക് ഫയലുകൾ അയയ്ക്കാൻ കഴിയില്ല.'; + @override + String get openFirewall => 'ഫയർവാൾ തുറക്കുക'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$ml extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'ഈ ഡിവൈസിനു മറ്റ് ഡിവൈസുകൾ കണ്ടെത്താൻ കഴിയില്ല.'; + @override + String get solution => + 'ദയവായി എല്ലാ ഡിവൈസുകളും ഒരേ വൈഫൈ നെറ്റ്‌വർക്കിൽ ആണെന്നും ഒരേ കോൺഫിഗറേഷൻ(പോർട്ട്, മൾട്ടി കാസ്റ്റ് അഡ്രസ്സ്, എൻക്രിപ്ഷൻ) ആണെന്നും ഉറപ്പു വരുത്തുക. നിങ്ങൾ കണക്ട് ചെയ്യാൻ ശ്രമിക്കുന്ന ഡിവൈസിന്റെ ഐപി അഡ്രസ്സ് ടൈപ്പ് ചെയ്തു നോക്കാവുന്നതാണ്. ഇത് ഫലിക്കുക ആണെങ്കിൽ ഈ ഡിവൈസ് ഫേവറിറ്റ് ആയി സേവ് ചെയ്തു പിന്നീട് ഓട്ടോമാറ്റിക് ആയി കണക്ട് ചെയ്തു ഉപയോഗിക്കാവുന്നതാണ്.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$ml extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'ഇരു ഡിവൈസുകൾക്കും പരസ്പരം കണ്ടെത്താനോ ഫയലുകൾ അയക്കാനോ കഴിയില്ല.'; + @override + String get solution => + 'ഇരു ഭാഗങ്ങളിലും പ്രശ്നം ഉണ്ടോ? ഉണ്ടെങ്കിൽ, ദയവായി എല്ലാ ഡിവൈസുകളും ഒരേ വൈഫൈ നെറ്റ്‌വർക്കിൽ ആണെന്നും ഒരേ കോൺഫിഗറേഷൻ(പോർട്ട്, മൾട്ടി കാസ്റ്റ് അഡ്രസ്സ്, എൻക്രിപ്ഷൻ) ആണെന്നും ഉറപ്പു വരുത്തുക. അക്സസ്സ് പോയിന്റ്(എ.പി) ഐസൊലേഷൻ മൂലം പരസ്പരം ഉള്ള ആശയ വിനിമയം വൈഫൈ നെറ്റ്‌വർക്ക് അനുവദിക്കാതെ ഇരിക്കാൻ സാധ്യത ഉണ്ട്. അങ്ങനെ എങ്കിൽ ആ ഓപ്ഷൻ റൗട്ടറിൽ ഓഫ് ചെയ്തു വക്കേണ്ടതാണ്.'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$ml extends Translations$progressPage$total$en { + _Translations$progressPage$total$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$ml title = _Translations$progressPage$total$title$ml._(_root); + @override + String count({required Object curr, required Object n}) => 'ഫയലുകൾ: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'വലിപ്പം: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'വേഗത: ${speed}/s'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$ml extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get system => 'സിസ്റ്റം'; + @override + String get dark => 'ഇരുണ്ട'; + @override + String get light => 'വെളിച്ചമുള്ള'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$ml extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get system => 'സിസ്റ്റം'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$ml extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get system => 'സിസ്റ്റം'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$ml extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String get all => 'മുഴുവൻ'; + @override + String get filtered => 'ഫിൽറ്റർ ചെയ്യപ്പെട്ട'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$ml extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$ml._(TranslationsMl root) : this._root = root, super.internal(root); + + final TranslationsMl _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'മുഴുവൻ പുരോഗതി (${time})'; + @override + String get finishedError => 'തെറ്റുകളോടെ പൂർത്തിയാക്കി'; + @override + String get canceledSender => 'അയക്കുന്നവൻ റദ്ധാക്കി'; + @override + String get canceledReceiver => 'സ്വീകർത്താവ് റദ്ധാക്കി'; +} diff --git a/app/lib/gen/strings_mn.g.dart b/app/lib/gen/strings_mn.g.dart new file mode 100644 index 0000000..1ea3591 --- /dev/null +++ b/app/lib/gen/strings_mn.g.dart @@ -0,0 +1,810 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsMn extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsMn({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.mn, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsMn _root = this; // ignore: unused_field + + @override + TranslationsMn $copyWith({TranslationMetadata? meta}) => TranslationsMn(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Mongolian'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$mn general = _Translations$general$mn._(_root); + @override + late final _Translations$receiveTab$mn receiveTab = _Translations$receiveTab$mn._(_root); + @override + late final _Translations$sendTab$mn sendTab = _Translations$sendTab$mn._(_root); + @override + late final _Translations$settingsTab$mn settingsTab = _Translations$settingsTab$mn._(_root); + @override + late final _Translations$troubleshootPage$mn troubleshootPage = _Translations$troubleshootPage$mn._(_root); + @override + late final _Translations$receiveHistoryPage$mn receiveHistoryPage = _Translations$receiveHistoryPage$mn._(_root); + @override + late final _Translations$apkPickerPage$mn apkPickerPage = _Translations$apkPickerPage$mn._(_root); + @override + late final _Translations$selectedFilesPage$mn selectedFilesPage = _Translations$selectedFilesPage$mn._(_root); + @override + late final _Translations$receivePage$mn receivePage = _Translations$receivePage$mn._(_root); + @override + late final _Translations$receiveOptionsPage$mn receiveOptionsPage = _Translations$receiveOptionsPage$mn._(_root); + @override + late final _Translations$sendPage$mn sendPage = _Translations$sendPage$mn._(_root); + @override + late final _Translations$progressPage$mn progressPage = _Translations$progressPage$mn._(_root); + @override + late final _Translations$webSharePage$mn webSharePage = _Translations$webSharePage$mn._(_root); + @override + late final _Translations$aboutPage$mn aboutPage = _Translations$aboutPage$mn._(_root); + @override + late final _Translations$donationPage$mn donationPage = _Translations$donationPage$mn._(_root); + @override + late final _Translations$changelogPage$mn changelogPage = _Translations$changelogPage$mn._(_root); +} + +// Path: general +class _Translations$general$mn extends Translations$general$en { + _Translations$general$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Зөвшөөрөх'; + @override + String get accepted => 'Зөвшөөрсөн'; + @override + String get add => 'Нэмэх'; + @override + String get advanced => 'Нэмэлт үйлчилгээ'; + @override + String get cancel => 'Цуцлах'; + @override + String get close => 'Хаах'; + @override + String get confirm => 'Баталгаажуулах'; + @override + String get continueStr => 'Үргэлжлүүлэх'; + @override + String get copy => 'Хуулах'; + @override + String get copiedToClipboard => 'Амжилттай хууллаа'; + @override + String get decline => 'Татгалзах'; + @override + String get done => 'Болсон'; + @override + String get delete => 'Устгах'; + @override + String get edit => 'Өөрчлөх'; + @override + String get error => 'Алдаа'; + @override + String get example => 'Жишээ'; + @override + String get files => 'Файлууд'; + @override + String get finished => 'Дууссан'; + @override + String get hide => 'Нуух'; + @override + String get off => 'Унтраах'; + @override + String get offline => 'Оффлайн'; + @override + String get on => 'Асаах'; + @override + String get online => 'Онлайн'; + @override + String get open => 'Нээх'; + @override + String get queue => 'Хүлээгдэж байгаа'; + @override + String get quickSave => 'Шууд хадгалах'; + @override + String get renamed => 'Дахин нэрлэсэн'; + @override + String get reset => 'Өөрчлөлтүүдийг буцаах'; + @override + String get restart => 'Дахин ачаалах'; + @override + String get settings => 'Тохиргоо'; + @override + String get skipped => 'Алгассан'; + @override + String get start => 'Эхлэх'; + @override + String get stop => 'Зогсоох'; + @override + String get save => 'Хадгалах'; + @override + String get unchanged => 'Өөрчлөгдөөгүй'; + @override + String get unknown => 'Үл мэдэгдэх'; + @override + String get noItemInClipboard => 'Санах ой хоосон байна.'; +} + +// Path: receiveTab +class _Translations$receiveTab$mn extends Translations$receiveTab$en { + _Translations$receiveTab$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Авах'; + @override + late final _Translations$receiveTab$infoBox$mn infoBox = _Translations$receiveTab$infoBox$mn._(_root); + @override + late final _Translations$receiveTab$quickSave$mn quickSave = _Translations$receiveTab$quickSave$mn._(_root); +} + +// Path: sendTab +class _Translations$sendTab$mn extends Translations$sendTab$en { + _Translations$sendTab$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Илгээх'; + @override + late final _Translations$sendTab$selection$mn selection = _Translations$sendTab$selection$mn._(_root); + @override + late final _Translations$sendTab$picker$mn picker = _Translations$sendTab$picker$mn._(_root); + @override + String get shareIntentInfo => 'Та өөрийн төхөөрөмжийн "Хуваалцах" цэсийг ашиглан файлуудаа хялбар сонгох боломжтой.'; + @override + String get nearbyDevices => 'Ойролцоо төхөөрөмжүүд'; + @override + String get thisDevice => 'Энэ төхөөрөмж'; + @override + String get scan => 'Төхөөрөмжүүд хайх'; + @override + String get manualSending => 'Гар аргаар хайх'; + @override + String get sendMode => 'Илгээх горим'; + @override + late final _Translations$sendTab$sendModes$mn sendModes = _Translations$sendTab$sendModes$mn._(_root); + @override + String get sendModeHelp => 'Тайлбар'; + @override + String get help => 'Хүлээн авах төхөөрөмжийг адилхан Wi-Fi сүлжээнд байгаа эсэхийг шалгана уу.'; + @override + String get placeItems => 'Хуваалцах зүйлсээ орулна уу.'; +} + +// Path: settingsTab +class _Translations$settingsTab$mn extends Translations$settingsTab$en { + _Translations$settingsTab$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Тохиргоо'; + @override + late final _Translations$settingsTab$general$mn general = _Translations$settingsTab$general$mn._(_root); + @override + late final _Translations$settingsTab$receive$mn receive = _Translations$settingsTab$receive$mn._(_root); + @override + late final _Translations$settingsTab$send$mn send = _Translations$settingsTab$send$mn._(_root); + @override + late final _Translations$settingsTab$network$mn network = _Translations$settingsTab$network$mn._(_root); + @override + late final _Translations$settingsTab$other$mn other = _Translations$settingsTab$other$mn._(_root); + @override + String get advancedSettings => 'Нэмэлт тохиргоо'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$mn extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Асуудал илрүүлэх'; + @override + String get subTitle => 'Апп нь санаснаар ажиллахгүй байна уу? Эндээс асуудлыг нийтлэг асуудалуудыг олох боломжтой.'; + @override + String get solution => 'Шийдэл:'; + @override + String get fixButton => 'Автоматаар засварлах'; + @override + late final _Translations$troubleshootPage$firewall$mn firewall = _Translations$troubleshootPage$firewall$mn._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$mn noDiscovery = _Translations$troubleshootPage$noDiscovery$mn._(_root); + @override + late final _Translations$troubleshootPage$noConnection$mn noConnection = _Translations$troubleshootPage$noConnection$mn._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$mn extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Түүх'; + @override + String get openFolder => 'Хавтас нээх'; + @override + String get deleteHistory => 'Түүх устгах'; + @override + String get empty => 'Түүх хоосон байна.'; + @override + late final _Translations$receiveHistoryPage$entryActions$mn entryActions = _Translations$receiveHistoryPage$entryActions$mn._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$mn extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Аппууд (APK)'; + @override + String get excludeSystemApps => 'Системийн аппуудыг хасах'; + @override + String get excludeAppsWithoutLaunchIntent => 'Нээх боломжгүй аппуудыг хасах'; + @override + String apps({required Object n}) => '${n} апп'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$mn extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Бүгдийг устгах'; +} + +// Path: receivePage +class _Translations$receivePage$mn extends Translations$receivePage$en { + _Translations$receivePage$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('mn'))( + n, + one: 'танруу файл явуулахыг хүсэж байна', + other: 'танруу ${n} файл явуулахыг хүсэж байна', + ); + @override + String get subTitleMessage => 'танруу зурвас илгээлээ:'; + @override + String get subTitleLink => 'танруу холбоос илгээлээ:'; + @override + String get canceled => 'Илгээгч хүсэлтийг цуцалсан байна.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$mn extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Сонголтын тохиргоо'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend-н хавтас)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Хавтсууд байгаа учир автоматаар унтраалаа.'; +} + +// Path: sendPage +class _Translations$sendPage$mn extends Translations$sendPage$en { + _Translations$sendPage$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Хариу хүлээж байна…'; + @override + String get rejected => 'Хүлээн авагч хүсэлтйиг татгалзлаа.'; + @override + String get busy => 'Хүлээн авагч өөр хүсэлт авсан тул завгүй байна.'; +} + +// Path: progressPage +class _Translations$progressPage$mn extends Translations$progressPage$en { + _Translations$progressPage$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Файлууд илгээж байна'; + @override + String get titleReceiving => 'Файлыг татаж байна'; + @override + String get savedToGallery => 'Photos дээр амжилттай хадгаллаа'; + @override + late final _Translations$progressPage$total$mn total = _Translations$progressPage$total$mn._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$mn extends Translations$webSharePage$en { + _Translations$webSharePage$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Линкээр хуваалцах'; + @override + String get error => 'Сервер асаахад алдаа гарлаа.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('mn'))( + n, + one: 'Энэ холбоосыг browser дээрээ нээнэ үү:', + other: 'Уг линкийн аль нэгрүү орно уу:', + ); + @override + String get requests => 'Хүсэлтүүд'; + @override + String get noRequests => 'Одоогоор хүсэлт байхгүй байна.'; + @override + String get autoAccept => 'Хүсэлтийг автоматаар авах'; + @override + String get requirePin => 'PIN код ашиглах'; + @override + String pinHint({required Object pin}) => 'PIN код: "${pin}"'; + @override + String get encryptionHint => 'LocalSend нь өөрийн гарын үсэг ашигладаг тул үүнийг browser дээрээ хүлээн зөвшөөрнө үү.'; + @override + String pendingRequests({required Object n}) => 'Хүлээгдэж буй хүсэлт: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$mn extends Translations$aboutPage$en { + _Translations$aboutPage$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'LocalSend танилцуулга'; + @override + List get description => [ + 'LocalSend нь үнэгүй, нээлттэй эхийн програм бөгөөд танд интернет холболт шаардлагагүйгээр өөрийн дотоод сүлжээгээр ойролцоох төхөөрөмжүүдтэй файл, мессежийг аюулгүйгээр хуваалцах боломтой.', + 'Энэ програмыг Android, iOS, macOS, Windows болон Linux дээр ашиглах боломжтой. Та албан ёсны веб сайтнаас татах боломжтой.', + ]; + @override + String get author => 'Эзэмшигч'; + @override + String get contributors => 'Хамт тусалсан'; + @override + String get translators => 'Орчуулагч нар'; +} + +// Path: donationPage +class _Translations$donationPage$mn extends Translations$donationPage$en { + _Translations$donationPage$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Хандив'; + @override + String get info => + 'LocalSend нь үнэ төлбөргүй, нээлттэй эх сурвалжтай бөгөөд ямар ч зар сурталчилгаагүй. Хэрэв энэ програм таалагдсан бол хандивын мөнгөөр хөгжлийг дэмжих боломжтой.'; + @override + String donate({required Object amount}) => '${amount} аар хандивлах'; + @override + String get thanks => 'Маш их баярлалаа!'; + @override + String get restore => 'Буцаах'; +} + +// Path: changelogPage +class _Translations$changelogPage$mn extends Translations$changelogPage$en { + _Translations$changelogPage$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Шинэчлэлт'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$mn extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP хаяг:'; + @override + String get port => 'Порт:'; + @override + String get alias => 'Төхөөрөмжийн нэр:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$mn extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Хадгалсан'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$mn extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Сонголт'; + @override + String files({required Object files}) => 'Файлууд: ${files}'; + @override + String size({required Object size}) => 'Хэмжээ: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$mn extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get file => 'Файл'; + @override + String get folder => 'Хавтас'; + @override + String get media => 'Медиа'; + @override + String get text => 'Бичвэр'; + @override + String get app => 'Апп'; + @override + String get clipboard => 'Санах ойгоос буулгах'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$mn extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get single => 'Ганц хүлээн авагч'; + @override + String get multiple => 'Олон хүлээн авагч'; + @override + String get link => 'Холбоосоор хуваалцах'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$mn extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ерөнхий'; + @override + String get brightness => 'Үзэмж'; + @override + late final _Translations$settingsTab$general$brightnessOptions$mn brightnessOptions = _Translations$settingsTab$general$brightnessOptions$mn._( + _root, + ); + @override + String get color => 'Өнгө'; + @override + late final _Translations$settingsTab$general$colorOptions$mn colorOptions = _Translations$settingsTab$general$colorOptions$mn._(_root); + @override + String get language => 'Хэл'; + @override + late final _Translations$settingsTab$general$languageOptions$mn languageOptions = _Translations$settingsTab$general$languageOptions$mn._(_root); + @override + String get saveWindowPlacement => 'Гарсаны дараа цонхны байрлал хадгалах'; + @override + String get saveWindowPlacementWindows => 'Гарсаны дараа цонхны байрлал хадгалах'; + @override + String get minimizeToTray => 'Цонх хаах үед програмыг нуух'; + @override + String get launchAtStartup => 'Нэвтрэх үед хамт нээх'; + @override + String get launchMinimized => 'Авто эхлүүлэх: Нуугдсан эхлэх'; + @override + String get showInContextMenu => 'Системийн цэсэнд LocalSend-д харуулах'; + @override + String get animations => 'Анимэйшн'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$mn extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Авах'; + @override + String get quickSave => _root.general.quickSave; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Авто-дуусгах'; + @override + String get destination => 'Хавтаст хадгалах'; + @override + String get downloads => '(Татсан файлууд)'; + @override + String get saveToGallery => 'Зургийн санд хадгалах'; + @override + String get saveToHistory => 'Түүхэнд хадгалах'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$mn extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Илгээх'; + @override + String get shareViaLinkAutoAccept => '"Холбоосоор илгээх" горимын хүсэлтүүдийн шууд зөвшөөрөх'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$mn extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Сүлжээ'; + @override + String get needRestart => 'Серверийг дахин ачаалж тохиргоог идэвхжүүлнэ үү!'; + @override + String get server => 'Сервер'; + @override + String get alias => 'Төхөөрөмжийн нэр'; + @override + String get deviceType => 'Төхөөрөмжийн төрөл'; + @override + String get deviceModel => 'Төхөөрөмжийг модел'; + @override + String get port => 'Порт'; + @override + String get discoveryTimeout => 'Хайх хүчинтэй хугацаа'; + @override + String get useSystemName => 'Системийн нэр ашиглах'; + @override + String portWarning({required Object defaultPort}) => + 'Та өөр порт ашиглаж байгаа тул бусад төхөөрөмжинд олдохгүй байж магадгүй . (өгөгдмөл: ${defaultPort})'; + @override + String get encryption => 'Нууцлал'; + @override + String get multicastGroup => 'Мультикаст хаяг'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Хувийн multicast хаяг ашиглаж үед бусад төхөөрөмжид илрэхгүй байх магадлалтай. (default: ${defaultMulticast})'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$mn extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get title => 'Бусад'; + @override + String get support => 'LocalSend-г дэмжих'; + @override + String get donate => 'Хандив өгөх'; + @override + String get privacyPolicy => 'Нууцлалын бодлого'; + @override + String get termsOfUse => 'Ашиглах нөхцөл'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$mn extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Энэ төрөөрөмж бусадруу файл илгээж чадаж байгаа ч бусад төхөөрөмж энэ төхөөрөмжрүү илгээж чадахгүй байна.'; + @override + String solution({required Object port}) => + 'Энэ нь ихэвчлэн firewall-н асуудл байдаг. Та ${port} дээр ирж буй холболтыг (UDP ба TCP) зөвшөөрч шийдвэрлэх боломжтой.'; + @override + String get openFirewall => 'Firewall-г нээх'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$mn extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Энэ төхөөрөмж бусад төхөөрөмжийг илрүүлж чадахгүй байна.'; + @override + String get solution => + 'Бүх төхөөрөмж адилхан Wi-Fi сүлжээнд орсон, адилхан тохиргоотой (порт, мультикаст хаяг, нууцлал) эсэхийг шалгана уу. Мөн төхөөрөмжийн IP хаягийг гараар оруулж үзнэ үү. Хэрэв болж байвал тухайн төхөөрөмжийг "Хадгалсан" хэсэгт нэмж дараа нь автоматаар таниулаарай.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$mn extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Төхөөрөмжүүд бие биенийгээ танихгүй, файл хуваалцаж чадахгүй байна.'; + @override + String get solution => + 'Хоёр талдаа ажиллахгүй байна уу? Хэрэв тийм бол хоёр төхөөрөмж ижил Wi-Fi сүлжээнд байгаа эсэхийг эсвэл ижил тохиргоотой (порт, multicast хаяг, шифрлэлт) байгаа эсэхийг шалгана уу. Wi-Fi сүлжээ эсвэл Acess Point (AP) төхөөрөмж хоорондын харилцааг хаасан байж магадгүй. Энэ тохиолдолд Wi-Fi төхөөрөмжийн тохиргоог өөрчлөнө үү.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$mn extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get open => 'Файл нээх'; + @override + String get showInFolder => 'Хавтаст харуулах'; + @override + String get info => 'Мэдээлэл'; + @override + String get deleteFromHistory => 'Түүхээс устгах'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$mn extends Translations$progressPage$total$en { + _Translations$progressPage$total$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$mn title = _Translations$progressPage$total$title$mn._(_root); + @override + String count({required Object curr, required Object n}) => 'Файл: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Хэмжээ: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Хурд: ${speed}/s'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$mn extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get system => 'Систем'; + @override + String get dark => 'Харанхуй'; + @override + String get light => 'Гэгээлэг'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$mn extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get system => 'Систем'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$mn extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String get system => 'Систем'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$mn extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$mn._(TranslationsMn root) : this._root = root, super.internal(root); + + final TranslationsMn _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Нийт хугацаа (${time})'; + @override + String get finishedError => 'Амжилтгүй болсон'; + @override + String get canceledSender => 'Явуулж байгаа хүн цуцаллаа'; + @override + String get canceledReceiver => 'Хүлээн авагчийн хүсэлтээр цуцалсан'; +} diff --git a/app/lib/gen/strings_ms.g.dart b/app/lib/gen/strings_ms.g.dart new file mode 100644 index 0000000..44ca802 --- /dev/null +++ b/app/lib/gen/strings_ms.g.dart @@ -0,0 +1,1497 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsMs extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsMs({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ms, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsMs _root = this; // ignore: unused_field + + @override + TranslationsMs $copyWith({TranslationMetadata? meta}) => TranslationsMs(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Bahasa Inggeris'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$ms general = _Translations$general$ms._(_root); + @override + late final _Translations$receiveTab$ms receiveTab = _Translations$receiveTab$ms._(_root); + @override + late final _Translations$sendTab$ms sendTab = _Translations$sendTab$ms._(_root); + @override + late final _Translations$settingsTab$ms settingsTab = _Translations$settingsTab$ms._(_root); + @override + late final _Translations$troubleshootPage$ms troubleshootPage = _Translations$troubleshootPage$ms._(_root); + @override + late final _Translations$receiveHistoryPage$ms receiveHistoryPage = _Translations$receiveHistoryPage$ms._(_root); + @override + late final _Translations$apkPickerPage$ms apkPickerPage = _Translations$apkPickerPage$ms._(_root); + @override + late final _Translations$selectedFilesPage$ms selectedFilesPage = _Translations$selectedFilesPage$ms._(_root); + @override + late final _Translations$receivePage$ms receivePage = _Translations$receivePage$ms._(_root); + @override + late final _Translations$receiveOptionsPage$ms receiveOptionsPage = _Translations$receiveOptionsPage$ms._(_root); + @override + late final _Translations$sendPage$ms sendPage = _Translations$sendPage$ms._(_root); + @override + late final _Translations$progressPage$ms progressPage = _Translations$progressPage$ms._(_root); + @override + late final _Translations$webSharePage$ms webSharePage = _Translations$webSharePage$ms._(_root); + @override + late final _Translations$aboutPage$ms aboutPage = _Translations$aboutPage$ms._(_root); + @override + late final _Translations$donationPage$ms donationPage = _Translations$donationPage$ms._(_root); + @override + late final _Translations$changelogPage$ms changelogPage = _Translations$changelogPage$ms._(_root); + @override + late final _Translations$aliasGenerator$ms aliasGenerator = _Translations$aliasGenerator$ms._(_root); + @override + late final _Translations$dialogs$ms dialogs = _Translations$dialogs$ms._(_root); + @override + late final _Translations$sanitization$ms sanitization = _Translations$sanitization$ms._(_root); + @override + late final _Translations$tray$ms tray = _Translations$tray$ms._(_root); + @override + late final _Translations$web$ms web = _Translations$web$ms._(_root); + @override + late final _Translations$assetPicker$ms assetPicker = _Translations$assetPicker$ms._(_root); + @override + late final _Translations$networkInterfacesPage$ms networkInterfacesPage = _Translations$networkInterfacesPage$ms._(_root); +} + +// Path: general +class _Translations$general$ms extends Translations$general$en { + _Translations$general$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Terima'; + @override + String get accepted => 'Diterima'; + @override + String get add => 'Tambah'; + @override + String get advanced => 'Lanjutan'; + @override + String get cancel => 'Batal'; + @override + String get close => 'Tutup'; + @override + String get confirm => 'Sahkan'; + @override + String get continueStr => 'Teruskan'; + @override + String get copy => 'Salin'; + @override + String get copiedToClipboard => 'Disalin ke Papan Keratan'; + @override + String get decline => 'Tolak'; + @override + String get done => 'Selesai'; + @override + String get delete => 'Padam'; + @override + String get edit => 'Sunting'; + @override + String get error => 'Ralat'; + @override + String get example => 'Contoh'; + @override + String get files => 'Fail-fail'; + @override + String get finished => 'Telah selesai'; + @override + String get hide => 'Sembunyi'; + @override + String get off => 'Tutup'; + @override + String get offline => 'Luar talian'; + @override + String get on => 'Buka'; + @override + String get online => 'Dalam talian'; + @override + String get open => 'Buka'; + @override + String get queue => 'Baris gilir'; + @override + String get quickSave => 'Simpan Pantas'; + @override + String get quickSaveFromFavorites => 'Simpan Pantas untuk "Kegemaran"'; + @override + String get renamed => 'Dinamakan semula'; + @override + String get reset => 'Buat asal perubahan'; + @override + String get restart => 'Mula semula'; + @override + String get settings => 'Tetapan'; + @override + String get skipped => 'Dilangkau'; + @override + String get start => 'Mula'; + @override + String get stop => 'Henti'; + @override + String get save => 'Simpan'; + @override + String get unchanged => 'Tidak berubah'; + @override + String get unknown => 'Tidak diketahui'; + @override + String get noItemInClipboard => 'Tiada item dalam papan keratan.'; +} + +// Path: receiveTab +class _Translations$receiveTab$ms extends Translations$receiveTab$en { + _Translations$receiveTab$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Terima'; + @override + late final _Translations$receiveTab$infoBox$ms infoBox = _Translations$receiveTab$infoBox$ms._(_root); + @override + late final _Translations$receiveTab$quickSave$ms quickSave = _Translations$receiveTab$quickSave$ms._(_root); +} + +// Path: sendTab +class _Translations$sendTab$ms extends Translations$sendTab$en { + _Translations$sendTab$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hantar'; + @override + late final _Translations$sendTab$selection$ms selection = _Translations$sendTab$selection$ms._(_root); + @override + late final _Translations$sendTab$picker$ms picker = _Translations$sendTab$picker$ms._(_root); + @override + String get shareIntentInfo => 'Anda juga boleh menggunakan ciri "Kongsi" peranti mudah alih anda untuk memilih fail dengan lebih mudah.'; + @override + String get nearbyDevices => 'Peranti berdekatan'; + @override + String get thisDevice => 'Peranti Ini'; + @override + String get scan => 'Cari peranti'; + @override + String get manualSending => 'Penghantaran manual'; + @override + String get sendMode => 'Mod penghantaran'; + @override + late final _Translations$sendTab$sendModes$ms sendModes = _Translations$sendTab$sendModes$ms._(_root); + @override + String get sendModeHelp => 'Penerangan'; + @override + String get help => 'Sila pastikan sasaran yang diingini juga berada dalam rangkaian Wi-Fi yang sama.'; + @override + String get placeItems => 'Letakkan item untuk dikongsi.'; +} + +// Path: settingsTab +class _Translations$settingsTab$ms extends Translations$settingsTab$en { + _Translations$settingsTab$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tetapan'; + @override + late final _Translations$settingsTab$general$ms general = _Translations$settingsTab$general$ms._(_root); + @override + late final _Translations$settingsTab$receive$ms receive = _Translations$settingsTab$receive$ms._(_root); + @override + late final _Translations$settingsTab$send$ms send = _Translations$settingsTab$send$ms._(_root); + @override + late final _Translations$settingsTab$network$ms network = _Translations$settingsTab$network$ms._(_root); + @override + late final _Translations$settingsTab$other$ms other = _Translations$settingsTab$other$ms._(_root); + @override + String get advancedSettings => 'Tetapan lanjutan'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$ms extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Penyelesaian masalah'; + @override + String get subTitle => 'Aplikasi ini tidak berfungsi seperti yang diharapkan? Di sini anda boleh mencari penyelesaian umum.'; + @override + String get solution => 'Penyelesaian:'; + @override + String get fixButton => 'Baiki secara automatik'; + @override + late final _Translations$troubleshootPage$firewall$ms firewall = _Translations$troubleshootPage$firewall$ms._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$ms noDiscovery = _Translations$troubleshootPage$noDiscovery$ms._(_root); + @override + late final _Translations$troubleshootPage$noConnection$ms noConnection = _Translations$troubleshootPage$noConnection$ms._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$ms extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sejarah'; + @override + String get openFolder => 'Buka folder'; + @override + String get deleteHistory => 'Padam sejarah'; + @override + String get empty => 'Sejarah kosong.'; + @override + late final _Translations$receiveHistoryPage$entryActions$ms entryActions = _Translations$receiveHistoryPage$entryActions$ms._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$ms extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplikasi (APK)'; + @override + String get excludeSystemApps => 'Kecualikan aplikasi sistem'; + @override + String get excludeAppsWithoutLaunchIntent => 'Kecualikan aplikasi yang tidak boleh dilancarkan'; + @override + String apps({required Object n}) => '${n} Aplikasi'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$ms extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Padam semua'; +} + +// Path: receivePage +class _Translations$receivePage$ms extends Translations$receivePage$en { + _Translations$receivePage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ms'))( + n, + one: 'ingin menghantar fail kepada anda', + other: 'ingin menghantar ${n} fail kepada anda', + ); + @override + String get subTitleMessage => 'menghantar mesej kepada anda:'; + @override + String get subTitleLink => 'menghantar pautan kepada anda:'; + @override + String get canceled => 'Penghantar telah membatalkan permintaan.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$ms extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Pilihan'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(folder LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Dimatikan secara automatik kerana terdapat folder.'; +} + +// Path: sendPage +class _Translations$sendPage$ms extends Translations$sendPage$en { + _Translations$sendPage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Menunggu respons…'; + @override + String get rejected => 'Penerima telah menolak permintaan.'; + @override + String get busy => 'Penerima sibuk dengan permintaan lain.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; +} + +// Path: progressPage +class _Translations$progressPage$ms extends Translations$progressPage$en { + _Translations$progressPage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Menghantar fail'; + @override + String get titleReceiving => 'Menerima fail'; + @override + String get savedToGallery => 'Disimpan dalam Foto'; + @override + late final _Translations$progressPage$total$ms total = _Translations$progressPage$total$ms._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$ms extends Translations$webSharePage$en { + _Translations$webSharePage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kongsi melalui pautan'; + @override + String get loading => 'Memulakan pelayan…'; + @override + String get stopping => 'Menghentikan pelayan…'; + @override + String get error => 'Ralat telah berlaku ketika memulakan pelayan.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ms'))( + n, + one: 'Buka pautan ini dalam pelayar anda:', + other: 'Buka salah satu daripada pautan ini dalam pelayar anda:', + ); + @override + String get requests => 'Permintaan'; + @override + String get noRequests => 'Tiada permintaan lagi.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Terima permintaan secara automatik'; + @override + String get requirePin => 'Memerlukan PIN'; + @override + String pinHint({required Object pin}) => 'PIN ialah "${pin}"'; + @override + String pendingRequests({required Object n}) => 'Permintaan yang masih belum selesai: ${n}'; + @override + String get encryptionHint => 'LocalSend menggunakan sijil yang ditandatangani sendiri. Anda perlu menerimanya di pelayar anda.'; +} + +// Path: aboutPage +class _Translations$aboutPage$ms extends Translations$aboutPage$en { + _Translations$aboutPage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tentang LocalSend'; + @override + List get description => [ + 'LocalSend adalah aplikasi percuma dan sumber terbuka yang membolehkan anda berkongsi fail dan mesej secara selamat dan terjamin dengan peranti berdekatan yang berada dalam rangkaian tempatan anda tanpa memerlukan sebarang sambungan internet.', + 'Aplikasi ini tersedia di Android, iOS, macOS, Windows dan Linux. Anda boleh mencari semua pilihan untuk memuat turun di laman web rasmi.', + ]; + @override + String get author => 'Pengarang'; + @override + String get contributors => 'Penyumbang'; + @override + String get translators => 'Penterjemah'; + @override + String get packagers => 'Pembungkus'; +} + +// Path: donationPage +class _Translations$donationPage$ms extends Translations$donationPage$en { + _Translations$donationPage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Derma'; + @override + String get info => + 'LocalSend adalah percuma, sumber terbuka dan tanpa iklan. Jika anda menyukai aplikasi ini, anda boleh menyokong pembangunannya dengan derma.'; + @override + String donate({required Object amount}) => 'Derma ${amount}'; + @override + String get thanks => 'Terima kasih banyak!'; + @override + String get restore => 'Pulihkan pembelian'; +} + +// Path: changelogPage +class _Translations$changelogPage$ms extends Translations$changelogPage$en { + _Translations$changelogPage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Log perubahan'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$ms extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Comel', + 'Cantik', + 'Besar', + 'Terang', + 'Bersih', + 'Bijak', + 'Keren', + 'Menarik', + 'Licik', + 'Bersemangat', + 'Cekap', + 'Hebat', + 'Pantas', + 'Baik', + 'Segar', + 'Bagus', + 'Menakjubkan', + 'Hebat', + 'Tampan', + 'Panas', + 'Baik hati', + 'Misteri', + 'Kemas', + 'Sabar', + 'Cantik', + 'Berkuasa', + 'Kaya', + 'Rahsia', + 'Pintar', + 'Kukuh', + 'Istimewa', + 'Strategik', + 'Kuat', + 'Kemas', + 'Bijaksana', + ]; + @override + List get fruits => [ + 'Epal', + 'Avokado', + 'Pisang', + 'Blackberi', + 'Bluberi', + 'Brokoli', + 'Lobak merah', + 'Ceri', + 'Kelapa', + 'Anggur', + 'Lemon', + 'Salad', + 'Mangga', + 'Tembikai', + 'Cendawan', + 'Bawang', + 'Oren', + 'Betik', + 'Pic', + 'Pir', + 'Nanas', + 'Kentang', + 'Labu', + 'Rasberi', + 'Strawberi', + 'Tomato', + ]; + + /// Dalam bahasa Melayu, kata sifat biasanya diletakkan selepas kata nama. + @override + String combination({required Object fruit, required Object adjective}) => '${fruit} yang ${adjective}'; +} + +// Path: dialogs +class _Translations$dialogs$ms extends Translations$dialogs$en { + _Translations$dialogs$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$ms addFile = _Translations$dialogs$addFile$ms._(_root); + @override + late final _Translations$dialogs$addressInput$ms addressInput = _Translations$dialogs$addressInput$ms._(_root); + @override + late final _Translations$dialogs$cancelSession$ms cancelSession = _Translations$dialogs$cancelSession$ms._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$ms cannotOpenFile = _Translations$dialogs$cannotOpenFile$ms._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$ms encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$ms._(_root); + @override + late final _Translations$dialogs$errorDialog$ms errorDialog = _Translations$dialogs$errorDialog$ms._(_root); + @override + late final _Translations$dialogs$favoriteDialog$ms favoriteDialog = _Translations$dialogs$favoriteDialog$ms._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$ms favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$ms._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$ms favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$ms._(_root); + @override + late final _Translations$dialogs$fileInfo$ms fileInfo = _Translations$dialogs$fileInfo$ms._(_root); + @override + late final _Translations$dialogs$fileNameInput$ms fileNameInput = _Translations$dialogs$fileNameInput$ms._(_root); + @override + late final _Translations$dialogs$historyClearDialog$ms historyClearDialog = _Translations$dialogs$historyClearDialog$ms._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$ms localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$ms._(_root); + @override + late final _Translations$dialogs$messageInput$ms messageInput = _Translations$dialogs$messageInput$ms._(_root); + @override + late final _Translations$dialogs$noFiles$ms noFiles = _Translations$dialogs$noFiles$ms._(_root); + @override + late final _Translations$dialogs$noPermission$ms noPermission = _Translations$dialogs$noPermission$ms._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$ms notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$ms._(_root); + @override + late final _Translations$dialogs$qr$ms qr = _Translations$dialogs$qr$ms._(_root); + @override + late final _Translations$dialogs$quickActions$ms quickActions = _Translations$dialogs$quickActions$ms._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$ms quickSaveNotice = _Translations$dialogs$quickSaveNotice$ms._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$ms quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$ms._(_root); + @override + late final _Translations$dialogs$pin$ms pin = _Translations$dialogs$pin$ms._(_root); + @override + late final _Translations$dialogs$sendModeHelp$ms sendModeHelp = _Translations$dialogs$sendModeHelp$ms._(_root); + @override + late final _Translations$dialogs$zoom$ms zoom = _Translations$dialogs$zoom$ms._(_root); + @override + late final _Translations$dialogs$openFile$ms openFile = _Translations$dialogs$openFile$ms._(_root); +} + +// Path: sanitization +class _Translations$sanitization$ms extends Translations$sanitization$en { + _Translations$sanitization$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Nama fail tidak boleh kosong'; + @override + String get invalid => 'Nama fail mengandungi aksara yang tidak sah'; +} + +// Path: tray +class _Translations$tray$ms extends Translations$tray$en { + _Translations$tray$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Keluar LocalSend'; + @override + String get closeWindows => 'Keluar'; +} + +// Path: web +class _Translations$web$ms extends Translations$web$en { + _Translations$web$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get rejected => 'Ditolak'; + @override + String get files => 'Fail'; + @override + String get fileName => 'Nama fail'; + @override + String get size => 'Saiz'; + @override + String get enterPin => 'Masukkan PIN'; + @override + String get invalidPin => 'PIN Tidak Sah'; + @override + String get tooManyAttempts => 'Terlalu banyak percubaan'; +} + +// Path: assetPicker +class _Translations$assetPicker$ms extends Translations$assetPicker$en { + _Translations$assetPicker$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Sahkan'; + @override + String get cancel => 'Batal'; + @override + String get edit => 'Sunting'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Gagal dimuat'; + @override + String get original => 'Asal'; + @override + String get preview => 'Pratonton'; + @override + String get select => 'Pilih'; + @override + String get emptyList => 'Senarai kosong'; + @override + String get unSupportedAssetType => 'Jenis fail tidak disokong.'; + @override + String get unableToAccessAll => 'Tidak dapat mengakses semua fail pada peranti'; + @override + String get viewingLimitedAssetsTip => 'Hanya lihat fail dan album yang boleh diakses oleh aplikasi.'; + @override + String get changeAccessibleLimitedAssets => 'Klik untuk mengemas kini fail yang boleh diakses'; + @override + String get accessAllTip => + 'Aplikasi hanya dapat mengakses beberapa fail pada peranti. Pergi ke tetapan sistem dan benarkan aplikasi mengakses semua media pada peranti.'; + @override + String get goToSystemSettings => 'Pergi ke tetapan sistem'; + @override + String get accessLimitedAssets => 'Teruskan dengan akses terhad'; + @override + String get accessiblePathName => 'Fail yang boleh diakses'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Imej'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Media lain'; + @override + String get sActionPlayHint => 'main'; + @override + String get sActionPreviewHint => 'pratonton'; + @override + String get sActionSelectHint => 'pilih'; + @override + String get sActionSwitchPathLabel => 'tukar laluan'; + @override + String get sActionUseCameraHint => 'guna kamera'; + @override + String get sNameDurationLabel => 'tempoh'; + @override + String get sUnitAssetCountLabel => 'kiraan'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$ms extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get info => + 'Secara lalai, LocalSend menggunakan semua antara muka rangkaian tersedia. Anda boleh memulaukan rangkaian yang tidak diingini. Anda perlu mula semula pelayan untuk mengenakan perubahan.'; + @override + String get title => 'Antara Muka Rangkaian'; + @override + String get preview => 'Pratonton'; + @override + String get whitelist => 'Senarai Putih'; + @override + String get blacklist => 'Senarai Hitam'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$ms extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Nama peranti:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$ms extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get favorites => 'Kegemaran'; + @override + String get off => _root.general.off; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$ms extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Pilihan'; + @override + String files({required Object files}) => 'Fail: ${files}'; + @override + String size({required Object size}) => 'Saiz: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$ms extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get file => 'Fail'; + @override + String get folder => 'Folder'; + @override + String get media => 'Media'; + @override + String get text => 'Teks'; + @override + String get app => 'Aplikasi'; + @override + String get clipboard => 'Tampal'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$ms extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get single => 'Satu penerima'; + @override + String get multiple => 'Pelbagai penerima'; + @override + String get link => 'Kongsi melalui pautan'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$ms extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Umum'; + @override + String get brightness => 'Tema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$ms brightnessOptions = _Translations$settingsTab$general$brightnessOptions$ms._( + _root, + ); + @override + String get color => 'Warna'; + @override + late final _Translations$settingsTab$general$colorOptions$ms colorOptions = _Translations$settingsTab$general$colorOptions$ms._(_root); + @override + String get language => 'Bahasa'; + @override + late final _Translations$settingsTab$general$languageOptions$ms languageOptions = _Translations$settingsTab$general$languageOptions$ms._(_root); + @override + String get saveWindowPlacement => 'Simpan kedudukan tetingkap selepas keluar'; + @override + String get minimizeToTray => 'Minimumkan ke dulang sistem/menu bar apabila menutup'; + @override + String get launchAtStartup => 'Mula automatik selepas log masuk'; + @override + String get launchMinimized => 'Mula automatik: Mula tersembunyi'; + @override + String get showInContextMenu => 'Tunjukkan LocalSend dalam menu konteks'; + @override + String get animations => 'Animasi'; + @override + String get saveWindowPlacementWindows => 'Simpan kedudukan tetingkap selepas keluar'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$ms extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Terima'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => 'Memerlukan PIN'; + @override + String get autoFinish => 'Selesai Automatik'; + @override + String get destination => 'Simpan ke folder'; + @override + String get downloads => '(Muat turun)'; + @override + String get saveToGallery => 'Simpan media ke galeri'; + @override + String get saveToHistory => 'Simpan ke sejarah'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$ms extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hantar'; + @override + String get shareViaLinkAutoAccept => 'Terima permintaan secara automatik dalam mod "Kongsi melalui pautan"'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$ms extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rangkaian'; + @override + String get needRestart => 'Mulakan semula pelayan untuk menggunakan tetapan!'; + @override + String get server => 'Pelayan'; + @override + String get alias => 'Nama peranti'; + @override + String get deviceType => 'Jenis peranti'; + @override + String get deviceModel => 'Model peranti'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Tamat Masa Penemuan'; + @override + String get useSystemName => 'Gunakan nama sistem'; + @override + String get generateRandomAlias => 'Jana alias rawak'; + @override + String portWarning({required Object defaultPort}) => + 'Anda mungkin tidak dapat dikesan oleh peranti lain kerana anda menggunakan port tersuai. (lalai: ${defaultPort})'; + @override + String get encryption => 'Penyulitan'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Anda mungkin tidak dapat dikesan oleh peranti lain kerana anda menggunakan alamat multicast tersuai. (lalai: ${defaultMulticast})'; + @override + String get network => 'Rangkaian'; + @override + late final _Translations$settingsTab$network$networkOptions$ms networkOptions = _Translations$settingsTab$network$networkOptions$ms._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$ms extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lain-lain'; + @override + String get support => 'Sokong LocalSend'; + @override + String get donate => 'Derma'; + @override + String get privacyPolicy => 'Dasar Privasi'; + @override + String get termsOfUse => 'Syarat Penggunaan'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$ms extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Peranti ini boleh menghantar fail ke peranti lain tetapi peranti lain tidak boleh menghantar fail ke peranti ini.'; + @override + String solution({required Object port}) => + 'Ini kemungkinan besar adalah masalah firewall. Anda boleh menyelesaikannya dengan membenarkan sambungan masuk (UDP dan TCP) pada port ${port}.'; + @override + String get openFirewall => 'Buka Firewall'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$ms extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Peranti ini tidak dapat menemui peranti lain.'; + @override + String get solution => + 'Sila pastikan semua peranti berada dalam rangkaian Wi-Fi yang sama dan berkongsi konfigurasi yang sama (port, alamat multicast, penyulitan). Anda boleh cuba menaip alamat IP peranti sasaran secara manual. Jika ini berhasil, pertimbangkan untuk menambahkan peranti ini ke kegemaran agar ia dapat ditemui secara automatik pada masa hadapan.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$ms extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Kedua-dua peranti tidak dapat menemui satu sama lain atau tidak dapat berkongsi fail.'; + @override + String get solution => + 'Adakah masalah wujud di kedua-dua belah pihak? Jika ya, anda perlu memastikan bahawa kedua-dua peranti berada dalam rangkaian Wi-Fi yang sama dan berkongsi konfigurasi yang sama (port, alamat multicast, penyulitan). Rangkaian Wi-Fi mungkin tidak membenarkan komunikasi antara peserta (pengasingan AP). Dalam kes ini, pilihan ini mesti diaktifkan pada penghala.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$ms extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get open => 'Buka fail'; + @override + String get showInFolder => 'Tunjukkan dalam folder'; + @override + String get info => 'Maklumat'; + @override + String get deleteFromHistory => 'Padam dari sejarah'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$ms extends Translations$progressPage$total$en { + _Translations$progressPage$total$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$ms title = _Translations$progressPage$total$title$ms._(_root); + @override + String count({required Object curr, required Object n}) => 'Fail: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Saiz: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Kelajuan: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$ms extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tambah ke pilihan'; + @override + String get content => 'Apa yang anda ingin tambah?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$ms extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Masukkan alamat'; + @override + String get hashtag => 'Tanda pagar'; + @override + String get ip => 'Alamat IP'; + @override + String get recentlyUsed => 'Digunakan baru-baru ini: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$ms extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Batalkan pemindahan fail'; + @override + String get content => 'Adakah anda benar-benar mahu membatalkan pemindahan fail?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$ms extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tidak dapat membuka fail'; + @override + String content({required Object file}) => 'Tidak dapat membuka "${file}". Adakah fail ini telah dipindahkan, dinamakan semula atau dipadamkan?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$ms extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Penyulitan dimatikan'; + @override + String get content => + 'Komunikasi kini berlaku melalui protokol HTTP yang tidak disulitkan. Untuk menggunakan protokol HTTPS, aktifkan penyulitan semula.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$ms extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$ms extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kegemaran'; + @override + String get noFavorites => 'Tiada peranti kegemaran lagi.'; + @override + String get addFavorite => 'Tambah'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$ms extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Padam dari kegemaran'; + @override + String content({required Object name}) => 'Adakah anda benar-benar mahu memadam "${name}" dari kegemaran?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$ms extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Tambah ke kegemaran'; + @override + String get titleEdit => 'Tetapan'; + @override + String get name => 'Nama peranti'; + @override + String get auto => '(auto)'; + @override + String get ip => 'Alamat IP'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$ms extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Maklumat fail'; + @override + String get fileName => 'Nama fail:'; + @override + String get path => 'Laluan:'; + @override + String get size => 'Saiz:'; + @override + String get sender => 'Penghantar:'; + @override + String get time => 'Masa:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$ms extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Masukkan nama fail'; + @override + String original({required Object original}) => 'Asal: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$ms extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kosongkan sejarah'; + @override + String get content => 'Adakah anda benar-benar mahu memadamkan keseluruhan sejarah?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$ms extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend tidak dapat mencari peranti lain tanpa mempunyai kebenaran untuk mengimbas rangkaian tempatan. Sila berikan kebenaran ini dalam tetapan.'; + @override + String get gotoSettings => 'Tetapan'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$ms extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Taip mesej'; + @override + String get multiline => 'Pelbagai baris'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$ms extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tiada fail dipilih'; + @override + String get content => 'Sila pilih sekurang-kurangnya satu fail.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$ms extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tiada kebenaran'; + @override + String get content => 'Anda belum memberikan kebenaran yang diperlukan. Sila berikan kebenaran dalam tetapan.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$ms extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tidak tersedia'; + @override + String get content => 'Ciri ini hanya tersedia di:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$ms extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kod QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$ms extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tindakan Pantas'; + @override + String get counter => 'Kaunter'; + @override + String get prefix => 'Awalan'; + @override + String get padZero => 'Isi dengan sifar'; + @override + String get sortBeforeCount => 'Susun mengikut abjad terlebih dahulu'; + @override + String get random => 'Rawak'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$ms extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Permintaan fail kini diterima secara automatik. Sila ambil perhatian bahawa semua orang dalam rangkaian tempatan boleh menghantar fail kepada anda.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$ms extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Permintaan fail kini diterima secara automatik daripada peranti-peranti yang dalam senarai kegemaran anda.', + 'Amaran! Pada waktu sekarang, ini tidak terjamin sepenuhnya, kerana penggodam yang mempunyai cap jari mana-mana peranti daripada senarai kegemaran anda boleh menghantar fail kepada anda tanpa sekatan.', + 'Walau bagaimanapun, pilihan ini tetap lebih selamat daripada membenarkan semua pengguna dalam rangkaian tempatan menghantar fail kepada anda tanpa sekatan.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$ms extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Masukkan PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$ms extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mod penghantaran'; + @override + String get single => 'Menghantar fail kepada satu penerima. Pilihan akan dibersihkan selepas pemindahan fail selesai.'; + @override + String get multiple => 'Menghantar fail kepada beberapa penerima. Pilihan tidak akan dibersihkan.'; + @override + String get link => + 'Penerima yang tidak mempunyai LocalSend dipasang boleh memuat turun fail yang dipilih dengan membuka pautan dalam pelayar mereka.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$ms extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$ms extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get title => 'Buka fail'; + @override + String get content => 'Adakah anda mahu untuk membuka fail yang diterima?'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$ms extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; + @override + String get dark => 'Gelap'; + @override + String get light => 'Cerah'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$ms extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$ms extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$ms extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String get all => 'Semua'; + @override + String get filtered => 'Ditapis'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$ms extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$ms._(TranslationsMs root) : this._root = root, super.internal(root); + + final TranslationsMs _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Kemajuan keseluruhan (${time})'; + @override + String get finishedError => 'Selesai dengan ralat'; + @override + String get canceledSender => 'Dibatalkan oleh penghantar'; + @override + String get canceledReceiver => 'Dibatalkan oleh penerima'; +} diff --git a/app/lib/gen/strings_ne.g.dart b/app/lib/gen/strings_ne.g.dart new file mode 100644 index 0000000..439c932 --- /dev/null +++ b/app/lib/gen/strings_ne.g.dart @@ -0,0 +1,1496 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsNe extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsNe({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ne, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsNe _root = this; // ignore: unused_field + + @override + TranslationsNe $copyWith({TranslationMetadata? meta}) => TranslationsNe(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'नेपाली'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$ne general = _Translations$general$ne._(_root); + @override + late final _Translations$receiveTab$ne receiveTab = _Translations$receiveTab$ne._(_root); + @override + late final _Translations$sendTab$ne sendTab = _Translations$sendTab$ne._(_root); + @override + late final _Translations$settingsTab$ne settingsTab = _Translations$settingsTab$ne._(_root); + @override + late final _Translations$troubleshootPage$ne troubleshootPage = _Translations$troubleshootPage$ne._(_root); + @override + late final _Translations$receiveHistoryPage$ne receiveHistoryPage = _Translations$receiveHistoryPage$ne._(_root); + @override + late final _Translations$apkPickerPage$ne apkPickerPage = _Translations$apkPickerPage$ne._(_root); + @override + late final _Translations$selectedFilesPage$ne selectedFilesPage = _Translations$selectedFilesPage$ne._(_root); + @override + late final _Translations$receivePage$ne receivePage = _Translations$receivePage$ne._(_root); + @override + late final _Translations$receiveOptionsPage$ne receiveOptionsPage = _Translations$receiveOptionsPage$ne._(_root); + @override + late final _Translations$sendPage$ne sendPage = _Translations$sendPage$ne._(_root); + @override + late final _Translations$progressPage$ne progressPage = _Translations$progressPage$ne._(_root); + @override + late final _Translations$webSharePage$ne webSharePage = _Translations$webSharePage$ne._(_root); + @override + late final _Translations$aboutPage$ne aboutPage = _Translations$aboutPage$ne._(_root); + @override + late final _Translations$changelogPage$ne changelogPage = _Translations$changelogPage$ne._(_root); + @override + late final _Translations$aliasGenerator$ne aliasGenerator = _Translations$aliasGenerator$ne._(_root); + @override + late final _Translations$dialogs$ne dialogs = _Translations$dialogs$ne._(_root); + @override + late final _Translations$tray$ne tray = _Translations$tray$ne._(_root); + @override + late final _Translations$web$ne web = _Translations$web$ne._(_root); + @override + late final _Translations$assetPicker$ne assetPicker = _Translations$assetPicker$ne._(_root); + @override + late final _Translations$networkInterfacesPage$ne networkInterfacesPage = _Translations$networkInterfacesPage$ne._(_root); + @override + late final _Translations$donationPage$ne donationPage = _Translations$donationPage$ne._(_root); + @override + late final _Translations$sanitization$ne sanitization = _Translations$sanitization$ne._(_root); +} + +// Path: general +class _Translations$general$ne extends Translations$general$en { + _Translations$general$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get accept => 'स्वीकार गर्नुहोस्'; + @override + String get accepted => 'स्वीकृत'; + @override + String get add => 'थप्नुहोस्'; + @override + String get advanced => 'उन्नत'; + @override + String get cancel => 'रद्द गर्नुहोस्'; + @override + String get close => 'बन्द गर्नुहोस्'; + @override + String get confirm => 'पुष्टि गर्नुहोस्'; + @override + String get continueStr => 'जारी राख्नुहोस्'; + @override + String get copy => 'कपी'; + @override + String get copiedToClipboard => 'क्लिपबोर्डमा प्रतिलिपि गरियो'; + @override + String get decline => 'अस्वीकार गर्नुहोस्'; + @override + String get done => 'सकियो'; + @override + String get edit => 'सम्पादन गर्नुहोस्'; + @override + String get error => 'त्रुटि'; + @override + String get example => 'उदाहरण'; + @override + String get files => 'फाइलहरू'; + @override + String get finished => 'समाप्त भयो'; + @override + String get hide => 'लुकाउनुहोस्'; + @override + String get off => 'बन्द'; + @override + String get offline => 'अफलाइन'; + @override + String get on => 'अन'; + @override + String get online => 'अनलाइन'; + @override + String get open => 'खोल्नुहोस्'; + @override + String get queue => 'लाम'; + @override + String get quickSave => 'छिटो सेव गर्नुहोस्'; + @override + String get renamed => 'नामाकरण गरियो'; + @override + String get reset => 'फिर्ता लिनुहोस्'; + @override + String get restart => 'पुनः सुरु'; + @override + String get settings => 'सेटिङहरू'; + @override + String get skipped => 'छोडियो'; + @override + String get start => 'सुरु'; + @override + String get stop => 'रोक'; + @override + String get save => 'सेव गर्नुहोस्'; + @override + String get unchanged => 'अपरिवर्तित'; + @override + String get unknown => 'अज्ञात'; + @override + String get delete => 'मेट्नुहोस्'; + @override + String get noItemInClipboard => 'क्लिपबोर्ड खाली छ।'; + @override + String get quickSaveFromFavorites => 'छिटो मनपर्नेमा राख्नुहोस्'; +} + +// Path: receiveTab +class _Translations$receiveTab$ne extends Translations$receiveTab$en { + _Translations$receiveTab$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'प्राप्त गर्नुहोस्'; + @override + late final _Translations$receiveTab$infoBox$ne infoBox = _Translations$receiveTab$infoBox$ne._(_root); + @override + late final _Translations$receiveTab$quickSave$ne quickSave = _Translations$receiveTab$quickSave$ne._(_root); +} + +// Path: sendTab +class _Translations$sendTab$ne extends Translations$sendTab$en { + _Translations$sendTab$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'पठाउनुहोस्'; + @override + late final _Translations$sendTab$selection$ne selection = _Translations$sendTab$selection$ne._(_root); + @override + late final _Translations$sendTab$picker$ne picker = _Translations$sendTab$picker$ne._(_root); + @override + String get shareIntentInfo => 'तपाईले आफ्नो मोबाइल उपकरणको "साझेदारी" सुविधा पनि प्रयोग गर्न सक्नुहुन्छ फाइलहरू थप सजिलै चयन गर्न।'; + @override + String get nearbyDevices => 'नजिकैका उपकरणहरू'; + @override + String get thisDevice => 'यो उपकरण'; + @override + String get scan => 'उपकरणहरू खोज्नुहोस्'; + @override + String get sendMode => 'पठाउने मोड'; + @override + late final _Translations$sendTab$sendModes$ne sendModes = _Translations$sendTab$sendModes$ne._(_root); + @override + String get sendModeHelp => 'स्पष्टीकरण'; + @override + String get help => 'कृपया सुनिश्चित गर्नुहोस् कि इच्छित लक्ष्य पनि उही वाइफाइ नेटवर्कमा छ।'; + @override + String get placeItems => 'साझेदारी गर्न वस्तुहरू राख्नुहोस्।'; + @override + String get manualSending => 'म्यानुअल पठाउने'; +} + +// Path: settingsTab +class _Translations$settingsTab$ne extends Translations$settingsTab$en { + _Translations$settingsTab$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'सेटिङहरू'; + @override + late final _Translations$settingsTab$general$ne general = _Translations$settingsTab$general$ne._(_root); + @override + late final _Translations$settingsTab$receive$ne receive = _Translations$settingsTab$receive$ne._(_root); + @override + late final _Translations$settingsTab$network$ne network = _Translations$settingsTab$network$ne._(_root); + @override + String get advancedSettings => 'उन्नत सेटिङहरू'; + @override + late final _Translations$settingsTab$send$ne send = _Translations$settingsTab$send$ne._(_root); + @override + late final _Translations$settingsTab$other$ne other = _Translations$settingsTab$other$ne._(_root); +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$ne extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'समस्या निवारण गर्नुहोस्'; + @override + String get subTitle => 'के एपले अपेक्षा गरेअनुसार काम गर्दैन? यहाँ तपाईंले समस्याहरूको केही सामान्य समाधानहरू फेला पार्न सक्नुहुन्छ।'; + @override + String get solution => 'समाधान:'; + @override + String get fixButton => 'स्वतः समाधान गर्नुहोस्'; + @override + late final _Translations$troubleshootPage$firewall$ne firewall = _Translations$troubleshootPage$firewall$ne._(_root); + @override + late final _Translations$troubleshootPage$noConnection$ne noConnection = _Translations$troubleshootPage$noConnection$ne._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$ne noDiscovery = _Translations$troubleshootPage$noDiscovery$ne._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$ne extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'इतिहास'; + @override + String get openFolder => 'फोल्डर खोल्नुहोस्'; + @override + String get deleteHistory => 'इतिहास मेटाउनुहोस्'; + @override + String get empty => 'इतिहास खाली छ।'; + @override + late final _Translations$receiveHistoryPage$entryActions$ne entryActions = _Translations$receiveHistoryPage$entryActions$ne._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$ne extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'अनुप्रयोग (APK)'; + @override + String get excludeSystemApps => 'प्रणाली एपहरू समावेश नगर्नुहोस्'; + @override + String get excludeAppsWithoutLaunchIntent => 'सुरु गर्न नसकिने एपहरू बहिष्कार गर्नुहोस्'; + @override + String apps({required Object n}) => '${n} अनुप्रयोग'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$ne extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'सबै मेटाउनुहोस्'; +} + +// Path: receivePage +class _Translations$receivePage$ne extends Translations$receivePage$en { + _Translations$receivePage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ne'))( + n, + one: 'तपाईंलाई एउटा फाइल पठाउन चाहन्छ', + other: 'तपाईलाई ${n} फाइलहरू पठाउन चाहन्छ', + ); + @override + String get subTitleMessage => 'तपाईलाई सन्देश पठाइयो:'; + @override + String get subTitleLink => 'तपाईंलाई लिङ्क पठाइयो:'; + @override + String get canceled => 'प्रेषकले अनुरोध रद्द गरेको छ।'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$ne extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'विकल्पहरू'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend फोल्डर)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'फोल्डरहरू भएकाले स्वतः बन्द भयो।'; +} + +// Path: sendPage +class _Translations$sendPage$ne extends Translations$sendPage$en { + _Translations$sendPage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'प्रतिक्रियाको प्रतीक्षा गर्दै…'; + @override + String get rejected => 'प्राप्तकर्ताले अनुरोध अस्वीकार गरेको छ।'; + @override + String get busy => 'प्राप्तकर्ता अर्को अनुरोधमा व्यस्त छ।'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; +} + +// Path: progressPage +class _Translations$progressPage$ne extends Translations$progressPage$en { + _Translations$progressPage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'फाइलहरू पठाउँदै'; + @override + String get titleReceiving => 'फाइलहरू प्राप्त गर्दै'; + @override + String get savedToGallery => 'फोटोहरूमा सुरक्षित गरियो'; + @override + late final _Translations$progressPage$total$ne total = _Translations$progressPage$total$ne._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$ne extends Translations$webSharePage$en { + _Translations$webSharePage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'लिङ्क मार्फत सेयर गर्नुहोस्'; + @override + String get loading => 'सर्भर सुरु गर्दै…'; + @override + String get stopping => 'सर्भर रोकिँदै…'; + @override + String get error => 'सर्भर सुरु गर्दा एउटा त्रुटि भयो।'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ne'))( + n, + one: 'यो लिङ्क आफ्नो ब्राउजरमा खोल्नुहोस्:', + other: 'आफ्नो ब्राउजरमा यी मध्ये एउटा लिङ्क खोल्नुहोस्:', + ); + @override + String get requests => 'अनुरोध'; + @override + String get noRequests => 'अहिलेसम्म कुनै अनुरोध छैन।'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get encryptionHint => 'LocalSend एक स्वयंसिग्ध प्रमाणपत्र प्रयोग गर्दछ। तपाईंले ब्राउजरमा यसलाई स्वीकार्नु पर्दछ।'; + @override + String pendingRequests({required Object n}) => 'लंबित अनुरोध: ${n}'; + @override + String pinHint({required Object pin}) => 'पिन "${pin}" हो'; + @override + String get autoAccept => 'स्वचालित रूपमा अनुरोधहरू स्वीकार गर्नुहोस्'; + @override + String get requirePin => 'पिन आवश्यक छ'; +} + +// Path: aboutPage +class _Translations$aboutPage$ne extends Translations$aboutPage$en { + _Translations$aboutPage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'LocalSend को बारेमा'; + @override + List get description => [ + 'LocalSend एउटा नि:शुल्क, खुला स्रोत एप हो जसले तपाईंलाई इन्टरनेट जडानको आवश्यकता बिना नै आफ्नो स्थानीय नेटवर्कमा नजिकैका उपकरणहरूसँग फाइलहरू र सन्देशहरू सुरक्षित रूपमा साझेदारी गर्न अनुमति दिन्छ।', + 'यो एप एन्ड्रोइड, आईओएस, म्याकओएस, विन्डोज र लिनक्समा उपलब्ध छ। तपाईंले आधिकारिक होमपेजमा सबै डाउनलोड विकल्पहरू फेला पार्न सक्नुहुन्छ।', + ]; + @override + String get author => 'लेखक'; + @override + String get contributors => 'योगदानकर्ताहरू'; + @override + String get packagers => 'प्याकेजरहरू'; + @override + String get translators => 'अनुवादकहरू'; +} + +// Path: changelogPage +class _Translations$changelogPage$ne extends Translations$changelogPage$en { + _Translations$changelogPage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'परिवर्तन लग'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$ne extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'मनमोहक', + 'सुन्दर', + 'ठूलो', + 'उज्यालो', + 'सफा', + 'चलाख', + 'कूल', + 'प्यारो', + 'चतुर', + 'निर्धारित', + 'ऊर्जावान', + 'कुशल', + 'शानदार', + 'छिटो', + 'राम्रो', + 'ताजा', + 'राम्रो', + 'भव्य', + 'महान', + 'सुन्दर', + 'तातो', + 'दयालु', + 'प्यारो', + 'रहस्यवादी', + 'सफा', + 'राम्रो', + 'बिरामी', + 'सुन्दर', + 'शक्तिशाली', + 'धनी', + 'गोप्य', + 'स्मार्ट', + 'ठोस', + 'विशेष', + 'रणनीतिक', + 'बलियो', + 'व्यवस्थित', + 'बुद्धिमान्', + ]; + @override + List get fruits => [ + 'स्याऊ', + 'एभोकाडो', + 'केरा', + 'ब्ल्याकबेरी', + 'ब्लूबेरी', + 'ब्रोकाउली', + 'गाजर', + 'चेरी', + 'नरिवल', + 'अंगूर', + 'कागती', + 'सलाद', + 'आँप', + 'खरबुजा', + 'च्याउ', + 'प्याज', + 'सुन्तला', + 'पपीता', + 'पीच', + 'नाशपाती', + 'अनानास', + 'आलु', + 'कद्दू', + 'रास्पबेरी', + 'स्ट्रबेरी', + 'टमाटर', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$ne extends Translations$dialogs$en { + _Translations$dialogs$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$ne addFile = _Translations$dialogs$addFile$ne._(_root); + @override + late final _Translations$dialogs$addressInput$ne addressInput = _Translations$dialogs$addressInput$ne._(_root); + @override + late final _Translations$dialogs$cancelSession$ne cancelSession = _Translations$dialogs$cancelSession$ne._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$ne cannotOpenFile = _Translations$dialogs$cannotOpenFile$ne._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$ne encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$ne._(_root); + @override + late final _Translations$dialogs$errorDialog$ne errorDialog = _Translations$dialogs$errorDialog$ne._(_root); + @override + late final _Translations$dialogs$fileInfo$ne fileInfo = _Translations$dialogs$fileInfo$ne._(_root); + @override + late final _Translations$dialogs$fileNameInput$ne fileNameInput = _Translations$dialogs$fileNameInput$ne._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$ne localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$ne._(_root); + @override + late final _Translations$dialogs$messageInput$ne messageInput = _Translations$dialogs$messageInput$ne._(_root); + @override + late final _Translations$dialogs$noFiles$ne noFiles = _Translations$dialogs$noFiles$ne._(_root); + @override + late final _Translations$dialogs$noPermission$ne noPermission = _Translations$dialogs$noPermission$ne._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$ne notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$ne._(_root); + @override + late final _Translations$dialogs$qr$ne qr = _Translations$dialogs$qr$ne._(_root); + @override + late final _Translations$dialogs$quickActions$ne quickActions = _Translations$dialogs$quickActions$ne._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$ne quickSaveNotice = _Translations$dialogs$quickSaveNotice$ne._(_root); + @override + late final _Translations$dialogs$sendModeHelp$ne sendModeHelp = _Translations$dialogs$sendModeHelp$ne._(_root); + @override + late final _Translations$dialogs$openFile$ne openFile = _Translations$dialogs$openFile$ne._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$ne favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$ne._(_root); + @override + late final _Translations$dialogs$favoriteDialog$ne favoriteDialog = _Translations$dialogs$favoriteDialog$ne._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$ne favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$ne._(_root); + @override + late final _Translations$dialogs$historyClearDialog$ne historyClearDialog = _Translations$dialogs$historyClearDialog$ne._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$ne quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$ne._(_root); + @override + late final _Translations$dialogs$pin$ne pin = _Translations$dialogs$pin$ne._(_root); + @override + late final _Translations$dialogs$zoom$ne zoom = _Translations$dialogs$zoom$ne._(_root); +} + +// Path: tray +class _Translations$tray$ne extends Translations$tray$en { + _Translations$tray$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'LocalSend बन्द गर्नुहोस्'; + @override + String get closeWindows => 'बाहिर निस्कनुहोस्'; +} + +// Path: web +class _Translations$web$ne extends Translations$web$en { + _Translations$web$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get rejected => 'अस्वीकृत'; + @override + String get files => 'फाइलहरू'; + @override + String get fileName => 'फाइलको नाम'; + @override + String get size => 'आकार'; + @override + String get enterPin => 'पिन प्रविष्ट गर्नुहोस्'; + @override + String get invalidPin => 'अमान्य पिन'; + @override + String get tooManyAttempts => 'धेरै प्रयासहरू'; +} + +// Path: assetPicker +class _Translations$assetPicker$ne extends Translations$assetPicker$en { + _Translations$assetPicker$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'पुष्टि गर्नुहोस्'; + @override + String get cancel => 'रद्द गर्नुहोस्'; + @override + String get edit => 'सम्पादन गर्नुहोस्'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'लोड गर्न मिलेन'; + @override + String get original => 'मूल'; + @override + String get preview => 'पूर्वावलोकन गर्नुहोस्'; + @override + String get select => 'छान्नुहोस्'; + @override + String get emptyList => 'खाली सूची'; + @override + String get unSupportedAssetType => 'असमर्थित फाईल प्रकार।'; + @override + String get unableToAccessAll => 'यस उपकरणमा सबै फाईलहरूमा पहुँच प्राप्त गर्न सकिएन'; + @override + String get viewingLimitedAssetsTip => 'केवल फाईलहरू र एल्बमहरूलाई अनुप्रयोगको लागि पहुँचयोग्य हेर्नुहोस्।'; + @override + String get changeAccessibleLimitedAssets => 'पहुँचयोग्य फाईलहरू अद्यावधिक गर्न क्लिक गर्नुहोस्'; + @override + String get accessAllTip => + 'अनुप्रयोगमा केहि फाईलहरूलाई मात्र पहुँच गर्न सक्दछ। प्रणाली सेटिङ्समा जानुहोस् र उपकरणमा सबै मिडिया मा अनुप्रयोगलाई पहुँच दिनुहोस्।'; + @override + String get goToSystemSettings => 'प्रणाली सेटिंग्समा जानुहोस्'; + @override + String get accessLimitedAssets => 'सीमित पहुँचको साथ जारी राख्नुहोस्'; + @override + String get accessiblePathName => 'पहुँचीने फाईलहरू'; + @override + String get sTypeAudioLabel => 'अडियो'; + @override + String get sTypeImageLabel => 'तस्वीर'; + @override + String get sTypeVideoLabel => 'भिडियो'; + @override + String get sTypeOtherLabel => 'अन्य मिडिया'; + @override + String get sActionPlayHint => 'प्ले गर्नुहोस्'; + @override + String get sActionPreviewHint => 'अग्रिम पूर्वावलोकन गर्नुहोस्'; + @override + String get sActionSelectHint => 'छान्नुहोस्'; + @override + String get sActionSwitchPathLabel => 'पथ परिवर्तन गर्नुहोस्'; + @override + String get sActionUseCameraHint => 'क्यामेरा प्रयोग गर्नुहोस्'; + @override + String get sNameDurationLabel => 'समय अवधि'; + @override + String get sUnitAssetCountLabel => 'गणना'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$ne extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'नेटवर्क इन्टरफेसहरू'; + @override + String get preview => 'पूर्वावलोकन'; + @override + String get blacklist => 'कालोसूची'; + @override + String get whitelist => 'श्वेतसूची'; + @override + String get info => + 'पूर्वनिर्धारित रूपमा, LocalSend ले सबै उपलब्ध नेटवर्क इन्टरफेसहरू प्रयोग गर्दछ। तपाईं यहाँ अनावश्यक नेटवर्कहरू बहिष्कार गर्न सक्नुहुन्छ। परिवर्तनहरू लागू गर्न तपाईंले सर्भर पुन: सुरु गर्न आवश्यक छ।'; +} + +// Path: donationPage +class _Translations$donationPage$ne extends Translations$donationPage$en { + _Translations$donationPage$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'दान गर्नुहोस्'; + @override + String get info => + 'LocalSend नि:शुल्क, खुला स्रोत र कुनै पनि विज्ञापन बिनाको एप हो। यदि तपाईंलाई एप मनपर्छ भने, तपाईंले दान दिएर विकासलाई समर्थन गर्न सक्नुहुन्छ।'; + @override + String donate({required Object amount}) => '${amount} दान गर्नुहोस्'; + @override + String get thanks => 'धेरै धन्यवाद!'; + @override + String get restore => 'खरिद पुनर्स्थापित गर्नुहोस्'; +} + +// Path: sanitization +class _Translations$sanitization$ne extends Translations$sanitization$en { + _Translations$sanitization$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get empty => 'फाइलको नाम खाली हुन सक्दैन'; + @override + String get invalid => 'फाइलको नाममा अवैध वर्णहरू छन्'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$ne extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get ip => 'आईपी :'; + @override + String get port => 'पोर्ट:'; + @override + String get alias => 'उपकरणको नाम:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$ne extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get favorites => 'मनपर्नेहरू'; + @override + String get on => _root.general.on; + @override + String get off => _root.general.off; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$ne extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'चयन'; + @override + String files({required Object files}) => 'फाइलहरू: ${files}'; + @override + String size({required Object size}) => 'आकार: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$ne extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get file => 'फाइल'; + @override + String get folder => 'फोल्डर'; + @override + String get media => 'मिडिया'; + @override + String get text => 'पाठ'; + @override + String get app => 'अनुप्रयोग'; + @override + String get clipboard => 'पेस्ट गर्नुहोस्'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$ne extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get single => 'एकल प्राप्तकर्ता'; + @override + String get multiple => 'एकाधिक प्राप्तकर्ता'; + @override + String get link => 'लिङ्क मार्फत सेयर गर्नुहोस्'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$ne extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'सामान्य'; + @override + String get brightness => 'थीम'; + @override + late final _Translations$settingsTab$general$brightnessOptions$ne brightnessOptions = _Translations$settingsTab$general$brightnessOptions$ne._( + _root, + ); + @override + String get color => 'रंग'; + @override + late final _Translations$settingsTab$general$colorOptions$ne colorOptions = _Translations$settingsTab$general$colorOptions$ne._(_root); + @override + String get language => 'भाषा'; + @override + late final _Translations$settingsTab$general$languageOptions$ne languageOptions = _Translations$settingsTab$general$languageOptions$ne._(_root); + @override + String get saveWindowPlacement => 'बन्द गरेपछि विन्डोको स्थिति सुरक्षित गर्नुहोस्'; + @override + String get minimizeToTray => 'छोड्नुहोस्: ट्रेमा न्यूनतम गर्नुहोस्'; + @override + String get launchAtStartup => 'लगइन पछि स्वत: सुरु गर्नुहोस्'; + @override + String get launchMinimized => 'स्वतः सुरु गर्नुहोस्: लुकेको सुरु गर्नुहोस्'; + @override + String get animations => 'एनिमेसनहरू'; + @override + String get saveWindowPlacementWindows => 'बाहिर निस्किएपछि विन्डोको स्थिति सुरक्षित गर्नुहोस्'; + @override + String get showInContextMenu => 'कन्टेक्स्ट मेनुमा LocalSend देखाउनुहोस्'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$ne extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'प्राप्त गर्नुहोस्'; + @override + String get quickSave => _root.general.quickSave; + @override + String get destination => 'गन्तव्य'; + @override + String get downloads => '(डाउनलोड)'; + @override + String get saveToGallery => 'मिडियालाई ग्यालरीमा सेभ गर्नुहोस्'; + @override + String get saveToHistory => 'इतिहासमा संचय गर्नुहोस्'; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'स्वतः समाप्त'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$ne extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'नेटवर्क'; + @override + String get needRestart => 'सेटिङ्हरू लागू गर्न सर्भर पुन: सुरु गर्नुहोस्!'; + @override + String get server => 'सर्भर'; + @override + String get alias => 'उपकरणको नाम'; + @override + String get deviceType => 'उपकरणको प्रकार'; + @override + String get deviceModel => 'उपकरण मोडेल'; + @override + String get port => 'पोर्ट'; + @override + String portWarning({required Object defaultPort}) => + 'आपको अन्य उपकर्णों द्वारा पहचाना नहीं जा सकता है क्योंकि आप कस्टम पोर्ट का उपयोग कर रहे हैं। (डिफ़ॉल्ट: ${defaultPort})'; + @override + String get encryption => 'एनक्रिप्शन'; + @override + String get multicastGroup => 'मल्टीकास्ट'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'आप अन्य उपकर्णों द्वारा पहचाना नहीं जा सकता है क्योंकि आप कस्टम मल्टीकास्ट पता का उपयोग कर रहे हैं। (डिफ़ॉल्ट: ${defaultMulticast})'; + @override + String get generateRandomAlias => 'अनियमित उपनाम उत्पन्न गर्नुहोस्'; + @override + String get useSystemName => 'प्रणालीको नाम प्रयोग गर्नुहोस्'; + @override + String get discoveryTimeout => 'डिस्कभरी टाइमआउट'; + @override + String get network => 'नेटवर्क'; + @override + late final _Translations$settingsTab$network$networkOptions$ne networkOptions = _Translations$settingsTab$network$networkOptions$ne._(_root); +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$ne extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'पठाउनुहोस्'; + @override + String get shareViaLinkAutoAccept => '"लिङ्क मार्फत साझेदारी" मोडमा स्वचालित रूपमा अनुरोधहरू स्वीकार गर्नुहोस्'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$ne extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get donate => 'दान गर्नुहोस्'; + @override + String get title => 'अन्य'; + @override + String get privacyPolicy => 'गोपनीयता नीति'; + @override + String get termsOfUse => 'प्रयोगका सर्तहरू'; + @override + String get support => 'LocalSend लाई समर्थन गर्नुहोस्'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$ne extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'यो यन्त्रले अन्य यन्त्रहरूमा फाइलहरू पठाउन सक्छ तर अन्य यन्त्रहरूले यस यन्त्रमा फाइलहरू पठाउन सक्दैनन्।'; + @override + String solution({required Object port}) => + 'यो सम्भवतः फायरवाल समस्या हो। तपाईंले पोर्ट ${port} मा आगमन जडानहरू (UDP र TCP) लाई अनुमति दिएर यो समाधान गर्न सक्नुहुन्छ।'; + @override + String get openFirewall => 'फायरवाल खोल्नुहोस्'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$ne extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'दुबै उपकरणहरूले एकअर्कालाई पत्ता लगाउन सक्दैनन् न त फाइलहरू साझेदारी गर्न सक्छन्।'; + @override + String get solution => + 'के समस्या दुवै तर्फ छ? यदि त्यसो हो भने, तपाईंले दुवै यन्त्रहरू एउटै Wi-Fi नेटवर्कमा छन् र एउटै कन्फिगरेसन (पोर्ट, मल्टिकास्ट ठेगाना, इन्क्रिप्शन) साझा गर्छन् भनी सुनिश्चित गर्नुपर्छ। पहुँच बिन्दु (AP) आइसोलेसनको कारणले Wi-Fi नेटवर्कले सहभागीहरू बीच सञ्चारलाई अनुमति नदिन सक्छ। यस अवस्थामा, यो विकल्प राउटरमा असक्षम पारिएको हुनुपर्छ।'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$ne extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'यो उपकरणले अन्य उपकरणहरू पत्ता लगाउन सक्दैन।'; + @override + String get solution => + 'कृपया सबै उपकरणहरू एउटै Wi-Fi नेटवर्कमा छन् र एउटै कन्फिगरेसन (पोर्ट, मल्टिकास्ट ठेगाना, इन्क्रिप्शन) साझा गर्छन् भनी सुनिश्चित गर्नुहोस्। तपाईं लक्षित उपकरणको IP ठेगाना म्यानुअल रूपमा टाइप गर्ने प्रयास गर्न सक्नुहुन्छ। यदि यसले काम गर्छ भने, यो उपकरणलाई मनपर्नेहरूमा थप्ने विचार गर्नुहोस् ताकि भविष्यमा यसलाई स्वचालित रूपमा पत्ता लगाउन सकियोस्।'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$ne extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get open => 'फाइल खोल्नुहोस्'; + @override + String get info => 'सूचना'; + @override + String get deleteFromHistory => 'इतिहासबाट मेटाउनुहोस्'; + @override + String get showInFolder => 'फोल्डरमा हर्नुहोस'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$ne extends Translations$progressPage$total$en { + _Translations$progressPage$total$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$ne title = _Translations$progressPage$total$title$ne._(_root); + @override + String count({required Object curr, required Object n}) => 'फाइलहरू: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'आकार: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'गति: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$ne extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'चयनमा थप्नुहोस्'; + @override + String get content => 'तपाईं के थप्न चाहनुहुन्छ?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$ne extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'ठेगाना प्रविष्ट गर्नुहोस्'; + @override + String get hashtag => 'ह्यासट्याग'; + @override + String get ip => 'IP ठेगाना'; + @override + String get recentlyUsed => 'हालसालै प्रयोग गरिएको: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$ne extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'फाइल स्थानान्तरण रद्द गर्नुहोस्'; + @override + String get content => 'के तपाइँ साँच्चै फाइल स्थानान्तरण रद्द गर्न चाहनुहुन्छ?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$ne extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'फ़ाइल नहीं खोल सकते'; + @override + String content({required Object file}) => + '"${file}" फ़ाइल नहीं खोल सकती। क्या इस फ़ाइल को हटा दिया गया है, नाम बदल दिया गया है या मिटा दिया गया है?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$ne extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'एन्क्रिप्शन अक्षम है'; + @override + String get content => + 'अब संचरण बिना एनक्रिप्टों एचटीटीपी प्रोटोकॉल के माध्यम से होता है। एचटीटीपीएस का उपयोग करने के लिए, कृपया फिर से एन्क्रिप्शन सक्षम करें।'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$ne extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$ne extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'फ़ाइल की जानकारी'; + @override + String get fileName => 'फ़ाइल का नाम:'; + @override + String get path => 'पथ:'; + @override + String get size => 'आकार:'; + @override + String get sender => 'भेजने वाला:'; + @override + String get time => 'समय:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$ne extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'फाइल नाम प्रविष्ट गर्नुहोस्'; + @override + String original({required Object original}) => 'मूल: ${original}'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$ne extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend ले स्थानीय नेटवर्क स्क्यान गर्ने अनुमति बिना अन्य उपकरणहरू फेला पार्न सक्दैन। कृपया सेटिङहरूमा यो अनुमति दिनुहोस्।'; + @override + String get gotoSettings => 'सेटिंग्स'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$ne extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'सन्देश टाइप गर्नुहोस्'; + @override + String get multiline => 'बहुरेखा'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$ne extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'कुनै फाइल चयन गरिएको छैन'; + @override + String get content => 'कृपया कम्तिमा एउटा फाइल चयन गर्नुहोस्।'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$ne extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'अनुमति नहीं है'; + @override + String get content => 'तपाईंले आवश्यक अनुमतिहरूको प्रदान गर्न दिएको छैन। कृपया सेटिङहरूमा तिनीहरूलाई प्रदान गर्नुहोस्।'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$ne extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'उपलब्ध छैन'; + @override + String get content => 'यो सुविधा निम्नमा मात्र उपलब्ध छ:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$ne extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR कोड'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$ne extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'द्रुत कार्यहरू'; + @override + String get counter => 'काउन्टर'; + @override + String get prefix => 'उपसर्ग'; + @override + String get padZero => 'शून्य संग प्याड'; + @override + String get sortBeforeCount => 'पहिले वर्णमाला क्रमबद्ध गर्नुहोस्'; + @override + String get random => 'अनियमित'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$ne extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'फाइल अनुरोधहरू अब स्वचालित रूपमा स्वीकार गरिन्छन्। स्थानीय नेटवर्कमा भएका सबैले तपाईंलाई फाइलहरू पठाउन सक्छन् भन्ने कुरामा सचेत रहनुहोस्।'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$ne extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'पठाउने मोडहरू'; + @override + String get single => 'एउटा प्राप्तकर्तालाई फाइलहरू पठाउँछ। फाइलहरू स्थानान्तरण सम्पन्न भएपछि चयन खाली गरिनेछ।'; + @override + String get multiple => 'धेरै प्राप्तकर्ताहरूलाई फाइलहरू पठाउँछ। फाइलहरू स्थानान्तरण समाप्त भएपछि चयन खाली गरिने छैन।'; + @override + String get link => 'LocalSend इन्स्टल नगरेका प्राप्तकर्ताहरूले आफ्नो ब्राउजरमा लिङ्क खोलेर चयन गरिएका फाइलहरू डाउनलोड गर्न सक्छन्।'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$ne extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'फाइल खोल्नुहोस्'; + @override + String get content => 'के तपाईं प्राप्त फाइल खोल्न चाहनुहुन्छ?'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$ne extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String content({required Object name}) => 'के तपाईं साँच्चै मनपर्ने "${name}" बाट मेटाउन चाहनुहुन्छ?'; + @override + String get title => 'मनपर्नेहरूबाट हटाउनुहोस्'; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$ne extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get addFavorite => 'थप्नुहोस्'; + @override + String get title => 'मनपर्नेहरू'; + @override + String get noFavorites => 'अहिलेसम्म कुनै पनि मनपर्ने उपकरणहरू छैनन्।'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$ne extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'मनपर्नेमा थप्नुहोस्'; + @override + String get titleEdit => 'सेटिङहरू'; + @override + String get name => 'उपकरणको नाम'; + @override + String get auto => '(स्वचालित)'; + @override + String get ip => 'IP ठेगाना'; + @override + String get port => 'पोर्ट'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$ne extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'इतिहास खाली गर्नुहोस्'; + @override + String get content => 'के तपाईं साँच्चै सम्पूर्ण इतिहास मेटाउन चाहनुहुन्छ?'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$ne extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + List get content => [ + 'फाइल अनुरोधहरू अब तपाईंको मनपर्ने सूचीमा रहेका उपकरणहरूबाट स्वचालित रूपमा स्वीकार गरिन्छन्।', + 'चेतावनी! हाल, यो पूर्ण रूपमा सुरक्षित छैन, किनकि तपाईंको मनपर्ने सूचीबाट कुनै पनि उपकरणको फिंगरप्रिन्ट भएको ह्याकरले तपाईंलाई बिना प्रतिबन्ध फाइलहरू पठाउन सक्छ।', + 'यद्यपि, यो विकल्प स्थानीय नेटवर्कमा रहेका सबै प्रयोगकर्ताहरूलाई तपाईंलाई कुनै प्रतिबन्ध बिना फाइलहरू पठाउन अनुमति दिनु भन्दा अझै सुरक्षित छ।', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$ne extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'पिन प्रविष्ट गर्नुहोस्'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$ne extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$ne extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get system => 'सिस्टम'; + @override + String get dark => 'अँध्यारो'; + @override + String get light => 'उज्यालो'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$ne extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get system => 'सिस्टम'; + @override + String get oled => 'ओ एल ई डी'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$ne extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get system => 'सिस्टम'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$ne extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String get all => 'सबै'; + @override + String get filtered => 'फिल्टर गरिएको'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$ne extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$ne._(TranslationsNe root) : this._root = root, super.internal(root); + + final TranslationsNe _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'कुल प्रगति (${time})'; + @override + String get finishedError => 'त्रुटि संग समाप्त भयो'; + @override + String get canceledSender => 'प्रेषकद्वारा रद्द गरियो'; + @override + String get canceledReceiver => 'प्राप्तकर्ता द्वारा रद्द गरियो'; +} diff --git a/app/lib/gen/strings_nl.g.dart b/app/lib/gen/strings_nl.g.dart new file mode 100644 index 0000000..09a0c31 --- /dev/null +++ b/app/lib/gen/strings_nl.g.dart @@ -0,0 +1,1438 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsNl extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsNl({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.nl, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsNl _root = this; // ignore: unused_field + + @override + TranslationsNl $copyWith({TranslationMetadata? meta}) => TranslationsNl(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Nederlands'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$nl general = _Translations$general$nl._(_root); + @override + late final _Translations$receiveTab$nl receiveTab = _Translations$receiveTab$nl._(_root); + @override + late final _Translations$sendTab$nl sendTab = _Translations$sendTab$nl._(_root); + @override + late final _Translations$settingsTab$nl settingsTab = _Translations$settingsTab$nl._(_root); + @override + late final _Translations$troubleshootPage$nl troubleshootPage = _Translations$troubleshootPage$nl._(_root); + @override + late final _Translations$receiveHistoryPage$nl receiveHistoryPage = _Translations$receiveHistoryPage$nl._(_root); + @override + late final _Translations$apkPickerPage$nl apkPickerPage = _Translations$apkPickerPage$nl._(_root); + @override + late final _Translations$selectedFilesPage$nl selectedFilesPage = _Translations$selectedFilesPage$nl._(_root); + @override + late final _Translations$receivePage$nl receivePage = _Translations$receivePage$nl._(_root); + @override + late final _Translations$receiveOptionsPage$nl receiveOptionsPage = _Translations$receiveOptionsPage$nl._(_root); + @override + late final _Translations$sendPage$nl sendPage = _Translations$sendPage$nl._(_root); + @override + late final _Translations$progressPage$nl progressPage = _Translations$progressPage$nl._(_root); + @override + late final _Translations$webSharePage$nl webSharePage = _Translations$webSharePage$nl._(_root); + @override + late final _Translations$aboutPage$nl aboutPage = _Translations$aboutPage$nl._(_root); + @override + late final _Translations$donationPage$nl donationPage = _Translations$donationPage$nl._(_root); + @override + late final _Translations$changelogPage$nl changelogPage = _Translations$changelogPage$nl._(_root); + @override + late final _Translations$dialogs$nl dialogs = _Translations$dialogs$nl._(_root); + @override + late final _Translations$sanitization$nl sanitization = _Translations$sanitization$nl._(_root); + @override + late final _Translations$tray$nl tray = _Translations$tray$nl._(_root); + @override + late final _Translations$web$nl web = _Translations$web$nl._(_root); + @override + late final _Translations$assetPicker$nl assetPicker = _Translations$assetPicker$nl._(_root); + @override + late final _Translations$networkInterfacesPage$nl networkInterfacesPage = _Translations$networkInterfacesPage$nl._(_root); +} + +// Path: general +class _Translations$general$nl extends Translations$general$en { + _Translations$general$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Accepteren'; + @override + String get accepted => 'Geaccepteerd'; + @override + String get add => 'Toevoegen'; + @override + String get advanced => 'Geavanceerd'; + @override + String get cancel => 'Annuleren'; + @override + String get close => 'Sluiten'; + @override + String get confirm => 'Bevestigen'; + @override + String get continueStr => 'Doorgaan'; + @override + String get copy => 'Kopiëren'; + @override + String get copiedToClipboard => 'Gekopieerd naar klembord'; + @override + String get decline => 'Weigeren'; + @override + String get done => 'Gereed'; + @override + String get delete => 'Verwijderen'; + @override + String get edit => 'Bewerken'; + @override + String get error => 'Fout'; + @override + String get example => 'Voorbeeld'; + @override + String get files => 'Bestanden'; + @override + String get finished => 'Voltooid'; + @override + String get hide => 'Verbergen'; + @override + String get off => 'Uit'; + @override + String get offline => 'Offline'; + @override + String get on => 'Aan'; + @override + String get online => 'Online'; + @override + String get open => 'Openen'; + @override + String get queue => 'Wachtrij'; + @override + String get quickSave => 'Snel opslaan'; + @override + String get quickSaveFromFavorites => 'Snel opslaan voor \'Favorieten\''; + @override + String get renamed => 'Hernoemd'; + @override + String get reset => 'Herstellen'; + @override + String get restart => 'Opnieuw starten'; + @override + String get settings => 'Instellingen'; + @override + String get skipped => 'Overgeslagen'; + @override + String get start => 'Starten'; + @override + String get stop => 'Stoppen'; + @override + String get save => 'Opslaan'; + @override + String get unchanged => 'Ongewijzigd'; + @override + String get unknown => 'Onbekend'; + @override + String get noItemInClipboard => 'Het klembord is leeg.'; +} + +// Path: receiveTab +class _Translations$receiveTab$nl extends Translations$receiveTab$en { + _Translations$receiveTab$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ontvangen'; + @override + late final _Translations$receiveTab$infoBox$nl infoBox = _Translations$receiveTab$infoBox$nl._(_root); + @override + late final _Translations$receiveTab$quickSave$nl quickSave = _Translations$receiveTab$quickSave$nl._(_root); +} + +// Path: sendTab +class _Translations$sendTab$nl extends Translations$sendTab$en { + _Translations$sendTab$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Verzenden'; + @override + late final _Translations$sendTab$selection$nl selection = _Translations$sendTab$selection$nl._(_root); + @override + late final _Translations$sendTab$picker$nl picker = _Translations$sendTab$picker$nl._(_root); + @override + String get shareIntentInfo => 'Je kunt ook de functie \'Delen\' van je mobiele apparaat gebruiken om gemakkelijker bestanden te selecteren.'; + @override + String get nearbyDevices => 'Apparaten in de buurt'; + @override + String get thisDevice => 'Dit apparaat'; + @override + String get scan => 'Apparaten zoeken'; + @override + String get manualSending => 'Handmatig verzenden'; + @override + String get sendMode => 'Verzendmodus'; + @override + late final _Translations$sendTab$sendModes$nl sendModes = _Translations$sendTab$sendModes$nl._(_root); + @override + String get sendModeHelp => 'Informatie'; + @override + String get help => 'Zorg ervoor dat de ontvanger is verbonden met hetzelfde wifi-netwerk.'; + @override + String get placeItems => 'Zet items neer om te delen.'; +} + +// Path: settingsTab +class _Translations$settingsTab$nl extends Translations$settingsTab$en { + _Translations$settingsTab$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Instellingen'; + @override + late final _Translations$settingsTab$general$nl general = _Translations$settingsTab$general$nl._(_root); + @override + late final _Translations$settingsTab$receive$nl receive = _Translations$settingsTab$receive$nl._(_root); + @override + late final _Translations$settingsTab$send$nl send = _Translations$settingsTab$send$nl._(_root); + @override + late final _Translations$settingsTab$network$nl network = _Translations$settingsTab$network$nl._(_root); + @override + late final _Translations$settingsTab$other$nl other = _Translations$settingsTab$other$nl._(_root); + @override + String get advancedSettings => 'Geavanceerde instellingen'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$nl extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Problemen oplossen'; + @override + String get subTitle => 'Werkt de app niet zoals verwacht? Op deze pagina vind je oplossingen voor veelvoorkomende problemen.'; + @override + String get solution => 'Oplossing:'; + @override + String get fixButton => 'Automatisch oplossen'; + @override + late final _Translations$troubleshootPage$firewall$nl firewall = _Translations$troubleshootPage$firewall$nl._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$nl noDiscovery = _Translations$troubleshootPage$noDiscovery$nl._(_root); + @override + late final _Translations$troubleshootPage$noConnection$nl noConnection = _Translations$troubleshootPage$noConnection$nl._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$nl extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Geschiedenis'; + @override + String get openFolder => 'Map openen'; + @override + String get deleteHistory => 'Geschiedenis verwijderen'; + @override + String get empty => 'De geschiedenis is leeg.'; + @override + late final _Translations$receiveHistoryPage$entryActions$nl entryActions = _Translations$receiveHistoryPage$entryActions$nl._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$nl extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Apps (APK)'; + @override + String get excludeSystemApps => 'Systeemapps uitsluiten'; + @override + String get excludeAppsWithoutLaunchIntent => 'Niet-startbare apps uitsluiten'; + @override + String apps({required Object n}) => '${n} apps'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$nl extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Alles verwijderen'; +} + +// Path: receivePage +class _Translations$receivePage$nl extends Translations$receivePage$en { + _Translations$receivePage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nl'))( + n, + one: 'wil een bestand naar je verzenden', + other: 'wil ${n} bestanden naar je verzenden', + ); + @override + String get subTitleMessage => 'heeft een bericht naar je verzonden:'; + @override + String get subTitleLink => 'heeft een link naar je verzonden:'; + @override + String get canceled => 'De verzender heeft het verzoek geannuleerd.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$nl extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Opties'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend-map)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Automatisch uitgezet omdat er mappen bij zitten.'; +} + +// Path: sendPage +class _Translations$sendPage$nl extends Translations$sendPage$en { + _Translations$sendPage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Wachten op antwoord…'; + @override + String get rejected => 'De ontvanger heeft het verzoek geweigerd.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'De ontvanger is bezig met een ander verzoek.'; +} + +// Path: progressPage +class _Translations$progressPage$nl extends Translations$progressPage$en { + _Translations$progressPage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Bestanden verzenden'; + @override + String get titleReceiving => 'Bestanden ontvangen'; + @override + String get savedToGallery => 'Opgeslagen in galerij'; + @override + late final _Translations$progressPage$total$nl total = _Translations$progressPage$total$nl._(_root); + @override + late final _Translations$progressPage$remainingTime$nl remainingTime = _Translations$progressPage$remainingTime$nl._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$nl extends Translations$webSharePage$en { + _Translations$webSharePage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Delen via link'; + @override + String get loading => 'Server starten…'; + @override + String get stopping => 'Server stoppen…'; + @override + String get error => 'Er is een fout opgetreden bij het starten van de server.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nl'))( + n, + one: 'Open deze link in je browser:', + other: 'Open een van deze links in je browser:', + ); + @override + String get requests => 'Verzoeken'; + @override + String get noRequests => 'Nog geen verzoeken.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Verzoeken automatisch accepteren'; + @override + String get requirePin => 'Code vereisen'; + @override + String pinHint({required Object pin}) => 'De PINcode is "${pin}"'; + @override + String get encryptionHint => 'LocalSend maakt gebruik van een zelfondertekend certificaat. Je moet dit accepteren in je browser.'; + @override + String pendingRequests({required Object n}) => 'Openstaande verzoeken: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$nl extends Translations$aboutPage$en { + _Translations$aboutPage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Over LocalSend'; + @override + List get description => [ + 'LocalSend is een gratis en opensource app waarmee je veilig bestanden en berichten met apparaten op je lokale netwerk kunt delen, zonder internetverbinding.', + 'De app is beschikbaar voor Android, iOS, macOS, Windows en Linux. Je vindt alle downloadopties op de officiële website.', + ]; + @override + String get author => 'Auteur'; + @override + String get contributors => 'Bijdragers'; + @override + String get packagers => 'Distributeurs'; + @override + String get translators => 'Vertalers'; +} + +// Path: donationPage +class _Translations$donationPage$nl extends Translations$donationPage$en { + _Translations$donationPage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Doneren'; + @override + String get info => + 'LocalSend is gratis, opensource en advertentievrij. Als je de app graag gebruikt, kun je de ontwikkeling steunen middels een donatie.'; + @override + String donate({required Object amount}) => '${amount} doneren'; + @override + String get thanks => 'Ontzettend bedankt!'; + @override + String get restore => 'Aankoop herstellen'; +} + +// Path: changelogPage +class _Translations$changelogPage$nl extends Translations$changelogPage$en { + _Translations$changelogPage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Wijzigingenoverzicht'; +} + +// Path: dialogs +class _Translations$dialogs$nl extends Translations$dialogs$en { + _Translations$dialogs$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$nl addFile = _Translations$dialogs$addFile$nl._(_root); + @override + late final _Translations$dialogs$openFile$nl openFile = _Translations$dialogs$openFile$nl._(_root); + @override + late final _Translations$dialogs$addressInput$nl addressInput = _Translations$dialogs$addressInput$nl._(_root); + @override + late final _Translations$dialogs$cancelSession$nl cancelSession = _Translations$dialogs$cancelSession$nl._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$nl cannotOpenFile = _Translations$dialogs$cannotOpenFile$nl._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$nl encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$nl._(_root); + @override + late final _Translations$dialogs$errorDialog$nl errorDialog = _Translations$dialogs$errorDialog$nl._(_root); + @override + late final _Translations$dialogs$favoriteDialog$nl favoriteDialog = _Translations$dialogs$favoriteDialog$nl._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$nl favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$nl._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$nl favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$nl._(_root); + @override + late final _Translations$dialogs$fileInfo$nl fileInfo = _Translations$dialogs$fileInfo$nl._(_root); + @override + late final _Translations$dialogs$fileNameInput$nl fileNameInput = _Translations$dialogs$fileNameInput$nl._(_root); + @override + late final _Translations$dialogs$historyClearDialog$nl historyClearDialog = _Translations$dialogs$historyClearDialog$nl._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$nl localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$nl._(_root); + @override + late final _Translations$dialogs$messageInput$nl messageInput = _Translations$dialogs$messageInput$nl._(_root); + @override + late final _Translations$dialogs$noFiles$nl noFiles = _Translations$dialogs$noFiles$nl._(_root); + @override + late final _Translations$dialogs$noPermission$nl noPermission = _Translations$dialogs$noPermission$nl._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$nl notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$nl._(_root); + @override + late final _Translations$dialogs$qr$nl qr = _Translations$dialogs$qr$nl._(_root); + @override + late final _Translations$dialogs$quickActions$nl quickActions = _Translations$dialogs$quickActions$nl._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$nl quickSaveNotice = _Translations$dialogs$quickSaveNotice$nl._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$nl quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$nl._(_root); + @override + late final _Translations$dialogs$pin$nl pin = _Translations$dialogs$pin$nl._(_root); + @override + late final _Translations$dialogs$sendModeHelp$nl sendModeHelp = _Translations$dialogs$sendModeHelp$nl._(_root); + @override + late final _Translations$dialogs$zoom$nl zoom = _Translations$dialogs$zoom$nl._(_root); +} + +// Path: sanitization +class _Translations$sanitization$nl extends Translations$sanitization$en { + _Translations$sanitization$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Bestandsnaam mag niet leeg zijn'; + @override + String get invalid => 'Bestandsnaam bevat ongeldige tekens'; +} + +// Path: tray +class _Translations$tray$nl extends Translations$tray$en { + _Translations$tray$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'LocalSend afsluiten'; + @override + String get closeWindows => 'Sluiten'; +} + +// Path: web +class _Translations$web$nl extends Translations$web$en { + _Translations$web$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Vul de code in'; + @override + String get invalidPin => 'Ongeldige code'; + @override + String get tooManyAttempts => 'Te veel pogingen'; + @override + String get rejected => 'Geweigerd'; + @override + String get files => 'Bestanden'; + @override + String get fileName => 'Bestandsnaam'; + @override + String get size => 'Grootte'; +} + +// Path: assetPicker +class _Translations$assetPicker$nl extends Translations$assetPicker$en { + _Translations$assetPicker$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Bevestigen'; + @override + String get cancel => 'Annuleren'; + @override + String get edit => 'Bewerken'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Laden mislukt'; + @override + String get original => 'Herkomst'; + @override + String get preview => 'Voorbeeld'; + @override + String get select => 'Selecteren'; + @override + String get emptyList => 'Lege lijst'; + @override + String get unSupportedAssetType => 'Niet-ondersteund bestandstype.'; + @override + String get unableToAccessAll => 'Geen toegang tot alle bestanden op het apparaat'; + @override + String get viewingLimitedAssetsTip => 'De app heeft beperkte toegang tot bestanden.'; + @override + String get changeAccessibleLimitedAssets => 'Toegankelijke bestanden aanpassen'; + @override + String get accessAllTip => + 'De app heeft slechts beperkte toegang tot je bestanden. Ga naar de systeeminstellingen om de toegangsrechten aan te passen.'; + @override + String get goToSystemSettings => 'Naar systeeminstellingen'; + @override + String get accessLimitedAssets => 'Doorgaan met beperkte toegang'; + @override + String get accessiblePathName => 'Toegankelijke bestanden'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Foto\'s'; + @override + String get sTypeVideoLabel => 'Video\'s'; + @override + String get sTypeOtherLabel => 'Andere media'; + @override + String get sActionPlayHint => 'afspelen'; + @override + String get sActionPreviewHint => 'voorbeeld'; + @override + String get sActionSelectHint => 'selecteren'; + @override + String get sActionSwitchPathLabel => 'pad wijzigen'; + @override + String get sActionUseCameraHint => 'camera gebruiken'; + @override + String get sNameDurationLabel => 'duur'; + @override + String get sUnitAssetCountLabel => 'aantal'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$nl extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get preview => 'Voorvertoning'; + @override + String get title => 'Netwerkinterfaces'; + @override + String get info => + 'Standaard gebruikt LocalSend alle beschikbare netwerkinterfaces. U kunt hier ongewenste netwerken uitsluiten. U moet de server opnieuw opstarten om de wijzigingen toe te passen.'; + @override + String get whitelist => 'Whitelist'; + @override + String get blacklist => 'Blacklist'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$nl extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP-adres:'; + @override + String get port => 'Poort:'; + @override + String get alias => 'Apparaatnaam:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$nl extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Favorieten'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$nl extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Selectie'; + @override + String files({required Object files}) => 'Bestanden: ${files}'; + @override + String size({required Object size}) => 'Grootte: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$nl extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get file => 'Bestand'; + @override + String get folder => 'Map'; + @override + String get media => 'Media'; + @override + String get text => 'Tekst'; + @override + String get app => 'App'; + @override + String get clipboard => 'Plakken'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$nl extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get single => 'Eén ontvanger'; + @override + String get multiple => 'Meerdere ontvangers'; + @override + String get link => 'Delen via link'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$nl extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Algemeen'; + @override + String get brightness => 'Thema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$nl brightnessOptions = _Translations$settingsTab$general$brightnessOptions$nl._( + _root, + ); + @override + String get color => 'Kleur'; + @override + late final _Translations$settingsTab$general$colorOptions$nl colorOptions = _Translations$settingsTab$general$colorOptions$nl._(_root); + @override + String get language => 'Taal'; + @override + late final _Translations$settingsTab$general$languageOptions$nl languageOptions = _Translations$settingsTab$general$languageOptions$nl._(_root); + @override + String get saveWindowPlacement => 'Vensterpositie na beëindigen opslaan'; + @override + String get saveWindowPlacementWindows => 'Vensterpositie na afsluiten opslaan'; + @override + String get minimizeToTray => 'Sluiten: minimaliseren naar systeemvak/menubalk'; + @override + String get launchAtStartup => 'Automatisch starten na aanmelden'; + @override + String get launchMinimized => 'Automatisch starten: verborgen'; + @override + String get showInContextMenu => 'LocalSend weergeven in contextmenu'; + @override + String get animations => 'Animaties'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$nl extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ontvangen'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Automatisch voltooien'; + @override + String get destination => 'Opslaan in map'; + @override + String get downloads => '(Downloads)'; + @override + String get saveToGallery => 'Media opslaan in galerij'; + @override + String get saveToHistory => 'Opslaan in geschiedenis'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$nl extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Verzenden'; + @override + String get shareViaLinkAutoAccept => 'Automatisch verzoeken goedkeuren in modus \'Delen via link\''; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$nl extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Netwerk'; + @override + String get needRestart => 'Start de server opnieuw op om de instellingen toe te passen!'; + @override + String get server => 'Server'; + @override + String get alias => 'Apparaatnaam'; + @override + String get deviceType => 'Apparaattype'; + @override + String get deviceModel => 'Apparaatmodel'; + @override + String get port => 'Poort'; + @override + String get discoveryTimeout => 'Time-out voor scannen'; + @override + String get useSystemName => 'Systeemnaam gebruiken'; + @override + String get generateRandomAlias => 'Willekeurige naam genereren'; + @override + String portWarning({required Object defaultPort}) => + 'Je apparaat kan mogelijk niet worden gevonden omdat je een aangepaste poort gebruikt. (Standaard: ${defaultPort})'; + @override + String get encryption => 'Versleuteling'; + @override + String get multicastGroup => 'Multicast-adres'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Je apparaat kan mogelijk niet worden gevonden omdat je een aangepast multicast-adres gebruikt. (Standaard: ${defaultMulticast})'; + @override + String get network => 'Netwerk'; + @override + late final _Translations$settingsTab$network$networkOptions$nl networkOptions = _Translations$settingsTab$network$networkOptions$nl._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$nl extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Overig'; + @override + String get support => 'LocalSend steunen'; + @override + String get donate => 'Doneren'; + @override + String get privacyPolicy => 'Privacybeleid'; + @override + String get termsOfUse => 'Gebruiksvoorwaarden'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$nl extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get symptom => + 'Dit apparaat kan bestanden naar andere apparaten verzenden, maar andere apparaten kunnen geen bestanden naar dit apparaat verzenden.'; + @override + String solution({required Object port}) => + 'Dit is hoogstwaarschijnlijk een firewallprobleem. Je kunt dit oplossen door inkomende verbindingen (UDP en TCP) op poort ${port} toe te staan.'; + @override + String get openFirewall => 'Firewall openen'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$nl extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Dit apparaat vindt geen andere apparaten.'; + @override + String get solution => + 'Zorg ervoor dat alle apparaten met hetzelfde wifi-netwerk zijn verbonden en dat ze dezelfde configuratie hebben (poort, multicast-adres, versleuteling). Je kunt proberen het IP-adres van het apparaat handmatig in te vullen. Als dat werkt, kun je het apparaat toevoegen aan je favorieten, zodat het voortaan automatisch kan worden gevonden.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$nl extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Beide apparaten kunnen elkaar niet vinden en kunnen ook geen bestanden delen.'; + @override + String get solution => + 'Doet het probleem zich aan beide kanten voor? Zorg er dan voor dat beide apparaten met hetzelfde wifi-netwerk zijn verbonden en dat ze dezelfde configuratie hebben (poort, multicast-address, versleuteling). Mogelijk is onderlinge communicatie tussen apparaten op het wifi-netwerk geblokkeerd (AP-isolatie). Dit moet je dan toestaan in de instellingen van je router.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$nl extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get open => 'Bestand openen'; + @override + String get showInFolder => 'Weergeven in map'; + @override + String get info => 'Informatie'; + @override + String get deleteFromHistory => 'Verwijderen uit geschiedenis'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$nl extends Translations$progressPage$total$en { + _Translations$progressPage$total$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$nl title = _Translations$progressPage$total$title$nl._(_root); + @override + String count({required Object curr, required Object n}) => 'Bestanden: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Grootte: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Snelheid: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$nl extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Gebruik 'h' als afkorting voor uren en 'm' voor minuten + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Gebruik 'd' voor dagen, 'h' voor uren en 'm' voor minuten + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$nl extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Toevoegen aan selectie'; + @override + String get content => 'Wat wil je toevoegen?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$nl extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Bestand openen'; + @override + String get content => 'Wil je het ontvangen bestand openen?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$nl extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Vul een adres in'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP-adres'; + @override + String get recentlyUsed => 'Onlangs gebruikt: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$nl extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Bestandsoverdracht annuleren'; + @override + String get content => 'Wil je de bestandsoverdracht annuleren?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$nl extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kan bestand niet openen'; + @override + String content({required Object file}) => 'Het bestand "${file}" kan niet worden geopend. Is het mogelijk verplaatst, hernoemd of verwijderd?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$nl extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Versleuteling uitgeschakeld'; + @override + String get content => + 'Communicatie verloopt nu via het onversleutelde HTTP-protocol. Schakel versleuteling weer in om het HTTPS-protocol te gebruiken.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$nl extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$nl extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favorieten'; + @override + String get noFavorites => 'Nog geen favoriete apparaten.'; + @override + String get addFavorite => 'Toevoegen'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$nl extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Verwijderen uit favorieten'; + @override + String content({required Object name}) => 'Wil je \'${name}\' uit je favorieten verwijderen?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$nl extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Toevoegen aan favorieten'; + @override + String get titleEdit => 'Instellingen'; + @override + String get name => 'Apparaatnaam'; + @override + String get auto => '(automatisch)'; + @override + String get ip => 'IP-adres'; + @override + String get port => 'Poort'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$nl extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Bestandsinformatie'; + @override + String get fileName => 'Bestandsnaam:'; + @override + String get path => 'Locatie:'; + @override + String get size => 'Grootte:'; + @override + String get sender => 'Afzender:'; + @override + String get time => 'Tijd:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$nl extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Vul een bestandsnaam in'; + @override + String original({required Object original}) => 'Origineel: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$nl extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Geschiedenis wissen'; + @override + String get content => 'Wil je de volledige geschiedenis verwijderen?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$nl extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend heeft rechten nodig om op het lokale netwerk naar andere apparaten te kunnen zoeken. Verleen deze rechten in de instellingen.'; + @override + String get gotoSettings => 'Instellingen'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$nl extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Typ een bericht'; + @override + String get multiline => 'Meerdere regels'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$nl extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Geen bestanden geselecteerd'; + @override + String get content => 'Selecteer ten minste één bestand.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$nl extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Geen rechten'; + @override + String get content => 'Je hebt de benodigde rechten niet verleend. Verleen deze in de instellingen.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$nl extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Niet beschikbaar'; + @override + String get content => 'Deze functie is alleen beschikbaar op:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$nl extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR-code'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$nl extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Snelle acties'; + @override + String get counter => 'Teller'; + @override + String get prefix => 'Voorvoegsel'; + @override + String get padZero => 'Aanvullen met nullen'; + @override + String get sortBeforeCount => 'Vooraf alfabetisch sorteren (A-Z)'; + @override + String get random => 'Willekeurig'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$nl extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Bestandsverzoeken worden nu automatisch geaccepteerd. Iedereen op het lokale netwerk kan nu dus bestanden naar je verzenden.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$nl extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Bestandsverzoeken van apparaten op je favorietenlijst worden nu automatisch geaccepteerd.', + 'Waarschuwing! Dit is momenteel niet volkomen veilig. Een hacker die beschikt over de digitale vingerafdruk van een apparaat op je favorietenlijst zou zonder enige beperking bestanden naar je kunnen verzenden.', + 'Desalniettemin is deze optie alsnog veiliger dan wanneer je zou toestaan dat alle gebruikers op het lokale netwerk bestanden naar je kunnen verzenden.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$nl extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Vul de code in'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$nl extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Verzendmodi'; + @override + String get single => 'Bestanden naar één ontvanger verzenden. De selectie wordt na de bestandsoverdracht gewist.'; + @override + String get multiple => 'Bestanden naar meerdere ontvangers verzenden. De selectie blijft na de bestandsoverdracht behouden.'; + @override + String get link => 'Ontvangers die LocalSend niet hebben geïnstalleerd kunnen de bestanden downloaden door de link in hun browser te openen.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$nl extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$nl extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Systeem'; + @override + String get dark => 'Donker'; + @override + String get light => 'Licht'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$nl extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Systeem'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$nl extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Systeem'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$nl extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String get all => 'Alle'; + @override + String get filtered => 'Gefilterd'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$nl extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$nl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Totale voortgang (${time})'; + @override + String get finishedError => 'Voltooid met fouten'; + @override + String get canceledSender => 'Geannuleerd door verzender'; + @override + String get canceledReceiver => 'Geannuleerd door ontvanger'; +} diff --git a/app/lib/gen/strings_pl.g.dart b/app/lib/gen/strings_pl.g.dart new file mode 100644 index 0000000..4c0a49c --- /dev/null +++ b/app/lib/gen/strings_pl.g.dart @@ -0,0 +1,1435 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsPl extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsPl({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.pl, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsPl _root = this; // ignore: unused_field + + @override + TranslationsPl $copyWith({TranslationMetadata? meta}) => TranslationsPl(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Polski'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$pl general = _Translations$general$pl._(_root); + @override + late final _Translations$receiveTab$pl receiveTab = _Translations$receiveTab$pl._(_root); + @override + late final _Translations$sendTab$pl sendTab = _Translations$sendTab$pl._(_root); + @override + late final _Translations$settingsTab$pl settingsTab = _Translations$settingsTab$pl._(_root); + @override + late final _Translations$troubleshootPage$pl troubleshootPage = _Translations$troubleshootPage$pl._(_root); + @override + late final _Translations$receiveHistoryPage$pl receiveHistoryPage = _Translations$receiveHistoryPage$pl._(_root); + @override + late final _Translations$apkPickerPage$pl apkPickerPage = _Translations$apkPickerPage$pl._(_root); + @override + late final _Translations$selectedFilesPage$pl selectedFilesPage = _Translations$selectedFilesPage$pl._(_root); + @override + late final _Translations$receivePage$pl receivePage = _Translations$receivePage$pl._(_root); + @override + late final _Translations$receiveOptionsPage$pl receiveOptionsPage = _Translations$receiveOptionsPage$pl._(_root); + @override + late final _Translations$sendPage$pl sendPage = _Translations$sendPage$pl._(_root); + @override + late final _Translations$progressPage$pl progressPage = _Translations$progressPage$pl._(_root); + @override + late final _Translations$webSharePage$pl webSharePage = _Translations$webSharePage$pl._(_root); + @override + late final _Translations$aboutPage$pl aboutPage = _Translations$aboutPage$pl._(_root); + @override + late final _Translations$donationPage$pl donationPage = _Translations$donationPage$pl._(_root); + @override + late final _Translations$changelogPage$pl changelogPage = _Translations$changelogPage$pl._(_root); + @override + late final _Translations$dialogs$pl dialogs = _Translations$dialogs$pl._(_root); + @override + late final _Translations$sanitization$pl sanitization = _Translations$sanitization$pl._(_root); + @override + late final _Translations$tray$pl tray = _Translations$tray$pl._(_root); + @override + late final _Translations$web$pl web = _Translations$web$pl._(_root); + @override + late final _Translations$assetPicker$pl assetPicker = _Translations$assetPicker$pl._(_root); + @override + late final _Translations$networkInterfacesPage$pl networkInterfacesPage = _Translations$networkInterfacesPage$pl._(_root); +} + +// Path: general +class _Translations$general$pl extends Translations$general$en { + _Translations$general$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Akceptuj'; + @override + String get accepted => 'Zaakceptowane'; + @override + String get add => 'Dodaj'; + @override + String get advanced => 'Zaawansowane'; + @override + String get cancel => 'Anuluj'; + @override + String get close => 'Zamknij'; + @override + String get confirm => 'Potwierdź'; + @override + String get continueStr => 'Dalej'; + @override + String get copy => 'Kopiuj'; + @override + String get copiedToClipboard => 'Skopiowane do schowka'; + @override + String get decline => 'Odrzuć'; + @override + String get done => 'Gotowe'; + @override + String get delete => 'Usuń'; + @override + String get edit => 'Edytuj'; + @override + String get error => 'Błąd'; + @override + String get example => 'Przykład'; + @override + String get files => 'Pliki'; + @override + String get finished => 'Skończone'; + @override + String get hide => 'Schowaj'; + @override + String get off => 'Wyłączony'; + @override + String get offline => 'Offline'; + @override + String get on => 'Włączony'; + @override + String get online => 'Online'; + @override + String get open => 'Otwórz'; + @override + String get queue => 'Kolejka'; + @override + String get quickSave => 'Szybki zapis'; + @override + String get quickSaveFromFavorites => 'Szybki zapis dla „Ulubionych”'; + @override + String get renamed => 'Przemianowany'; + @override + String get reset => 'Resetowanie'; + @override + String get restart => 'Restartuj'; + @override + String get settings => 'Ustawienia'; + @override + String get skipped => 'Pominięty'; + @override + String get start => 'Zacznij'; + @override + String get stop => 'Zatrzymaj'; + @override + String get save => 'Zapisz'; + @override + String get unchanged => 'Bez zmian'; + @override + String get unknown => 'Nieznany'; + @override + String get noItemInClipboard => 'Schowek jest pusty'; +} + +// Path: receiveTab +class _Translations$receiveTab$pl extends Translations$receiveTab$en { + _Translations$receiveTab$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Odbierz'; + @override + late final _Translations$receiveTab$infoBox$pl infoBox = _Translations$receiveTab$infoBox$pl._(_root); + @override + late final _Translations$receiveTab$quickSave$pl quickSave = _Translations$receiveTab$quickSave$pl._(_root); +} + +// Path: sendTab +class _Translations$sendTab$pl extends Translations$sendTab$en { + _Translations$sendTab$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Wyślij'; + @override + late final _Translations$sendTab$selection$pl selection = _Translations$sendTab$selection$pl._(_root); + @override + late final _Translations$sendTab$picker$pl picker = _Translations$sendTab$picker$pl._(_root); + @override + String get shareIntentInfo => 'Możesz także skorzystać z funkcji „Udostępnij” swojego urządzenia mobilnego, aby łatwiej wybierać pliki.'; + @override + String get nearbyDevices => 'Urządzenia w pobliżu'; + @override + String get thisDevice => 'To urządzenie'; + @override + String get scan => 'Szukaj urządzeń'; + @override + String get manualSending => 'Wysyłanie ręczne'; + @override + String get sendMode => 'Tryb wysyłania'; + @override + late final _Translations$sendTab$sendModes$pl sendModes = _Translations$sendTab$sendModes$pl._(_root); + @override + String get sendModeHelp => 'Wyjaśnienie'; + @override + String get help => 'Upewnij się, że żądany cel również znajduje się w tej samej sieci Wi-Fi.'; + @override + String get placeItems => 'Umieść elementy do udostępnienia.'; +} + +// Path: settingsTab +class _Translations$settingsTab$pl extends Translations$settingsTab$en { + _Translations$settingsTab$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ustawienia'; + @override + late final _Translations$settingsTab$general$pl general = _Translations$settingsTab$general$pl._(_root); + @override + late final _Translations$settingsTab$receive$pl receive = _Translations$settingsTab$receive$pl._(_root); + @override + late final _Translations$settingsTab$send$pl send = _Translations$settingsTab$send$pl._(_root); + @override + late final _Translations$settingsTab$network$pl network = _Translations$settingsTab$network$pl._(_root); + @override + late final _Translations$settingsTab$other$pl other = _Translations$settingsTab$other$pl._(_root); + @override + String get advancedSettings => 'Zaawansowane ustawienia'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$pl extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rozwiązywanie problemów'; + @override + String get subTitle => 'Aplikacja nie działa zgodnie z oczekiwaniami? Tutaj znajdziesz powszechne rozwiązania.'; + @override + String get solution => 'Rozwiązanie:'; + @override + String get fixButton => 'Napraw automatycznie'; + @override + late final _Translations$troubleshootPage$firewall$pl firewall = _Translations$troubleshootPage$firewall$pl._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$pl noDiscovery = _Translations$troubleshootPage$noDiscovery$pl._(_root); + @override + late final _Translations$troubleshootPage$noConnection$pl noConnection = _Translations$troubleshootPage$noConnection$pl._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$pl extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Historia'; + @override + String get openFolder => 'Otwórz folder'; + @override + String get deleteHistory => 'Usuń historię'; + @override + String get empty => 'Historia jest pusta.'; + @override + late final _Translations$receiveHistoryPage$entryActions$pl entryActions = _Translations$receiveHistoryPage$entryActions$pl._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$pl extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplikacje (APK)'; + @override + String get excludeSystemApps => 'Wyklucz aplikacje systemowe'; + @override + String get excludeAppsWithoutLaunchIntent => 'Wyklucz aplikacje niewystartowalne'; + @override + String apps({required Object n}) => '${n} aplikacje'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$pl extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Usuń wszystko'; +} + +// Path: receivePage +class _Translations$receivePage$pl extends Translations$receivePage$en { + _Translations$receivePage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pl'))( + n, + one: 'chce wysłać Ci plik', + other: 'chce wysłać Ci ${n} plików', + ); + @override + String get subTitleMessage => 'wysłał Ci wiadomość:'; + @override + String get subTitleLink => 'wysłał Ci link:'; + @override + String get canceled => 'Nadawca anulował żądanie.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$pl extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Opcje'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(Folder LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Wyłączono automatycznie, ponieważ istnieją katalogi.'; +} + +// Path: sendPage +class _Translations$sendPage$pl extends Translations$sendPage$en { + _Translations$sendPage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Czekanie na odpowiedź…'; + @override + String get rejected => 'Odbiorca odrzucił żądanie.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Odbiorca jest zajęty innym żądaniem.'; +} + +// Path: progressPage +class _Translations$progressPage$pl extends Translations$progressPage$en { + _Translations$progressPage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Wysyłanie plików'; + @override + String get titleReceiving => 'Odbieranie plików'; + @override + String get savedToGallery => 'Zapisane w galerii'; + @override + late final _Translations$progressPage$total$pl total = _Translations$progressPage$total$pl._(_root); + @override + late final _Translations$progressPage$remainingTime$pl remainingTime = _Translations$progressPage$remainingTime$pl._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$pl extends Translations$webSharePage$en { + _Translations$webSharePage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Udostępnij przez link'; + @override + String get loading => 'Uruchamianie serwera…'; + @override + String get stopping => 'Zatrzymywanie serwera…'; + @override + String get error => 'Wystąpił błąd podczas uruchamiania serwera.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pl'))( + n, + one: 'Otwórz ten link w przeglądarce:', + other: 'Otwórz jeden z tych linków w przeglądarce:', + ); + @override + String get requests => 'Żądania'; + @override + String get noRequests => 'Brak żądań.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Automatycznie akceptuj żądania'; + @override + String get requirePin => 'Wymagaj kodu PIN'; + @override + String pinHint({required Object pin}) => 'Kod PIN to „${pin}”'; + @override + String get encryptionHint => 'LocalSend używa samopodpisanego certyfikatu. Musisz go zaakceptować w przeglądarce.'; + @override + String pendingRequests({required Object n}) => 'Oczekujące żądania: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$pl extends Translations$aboutPage$en { + _Translations$aboutPage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'O LocalSend'; + @override + List get description => [ + 'LocalSend jest darmową, otwartoźródłową aplikacją, która pozwala na bezpieczne udostępnianie plików i wiadomości urządzeniom w pobliżu poprzez Twoją sieć lokalną, bez konieczności połączenia z internetem.', + 'Ta aplikacja jest dostępna na systemach Android, iOS, macOS, Windows i Linux. Możesz znaleźć wszystkie opcje pobierania na oficjalnej stronie głównej.', + ]; + @override + String get author => 'Autor'; + @override + String get contributors => 'Współautorzy'; + @override + String get packagers => 'Pakujący'; + @override + String get translators => 'Tłumacze'; +} + +// Path: donationPage +class _Translations$donationPage$pl extends Translations$donationPage$en { + _Translations$donationPage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Przekaż darowiznę'; + @override + String get info => + 'LocalSend jest darmową, otwartoźródłową aplikacją bez żadnych reklam. Jeśli podoba Ci się aplikacja, możesz wesprzeć jej rozwój darowizną.'; + @override + String donate({required Object amount}) => 'Przekaż ${amount}'; + @override + String get thanks => 'Bardzo Ci dziękuję!'; + @override + String get restore => 'Przywróć zakup'; +} + +// Path: changelogPage +class _Translations$changelogPage$pl extends Translations$changelogPage$en { + _Translations$changelogPage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dziennik zmian'; +} + +// Path: dialogs +class _Translations$dialogs$pl extends Translations$dialogs$en { + _Translations$dialogs$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$pl addFile = _Translations$dialogs$addFile$pl._(_root); + @override + late final _Translations$dialogs$openFile$pl openFile = _Translations$dialogs$openFile$pl._(_root); + @override + late final _Translations$dialogs$addressInput$pl addressInput = _Translations$dialogs$addressInput$pl._(_root); + @override + late final _Translations$dialogs$cancelSession$pl cancelSession = _Translations$dialogs$cancelSession$pl._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$pl cannotOpenFile = _Translations$dialogs$cannotOpenFile$pl._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$pl encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$pl._(_root); + @override + late final _Translations$dialogs$errorDialog$pl errorDialog = _Translations$dialogs$errorDialog$pl._(_root); + @override + late final _Translations$dialogs$favoriteDialog$pl favoriteDialog = _Translations$dialogs$favoriteDialog$pl._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$pl favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$pl._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$pl favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$pl._(_root); + @override + late final _Translations$dialogs$fileInfo$pl fileInfo = _Translations$dialogs$fileInfo$pl._(_root); + @override + late final _Translations$dialogs$fileNameInput$pl fileNameInput = _Translations$dialogs$fileNameInput$pl._(_root); + @override + late final _Translations$dialogs$historyClearDialog$pl historyClearDialog = _Translations$dialogs$historyClearDialog$pl._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$pl localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$pl._(_root); + @override + late final _Translations$dialogs$messageInput$pl messageInput = _Translations$dialogs$messageInput$pl._(_root); + @override + late final _Translations$dialogs$noFiles$pl noFiles = _Translations$dialogs$noFiles$pl._(_root); + @override + late final _Translations$dialogs$noPermission$pl noPermission = _Translations$dialogs$noPermission$pl._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$pl notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$pl._(_root); + @override + late final _Translations$dialogs$qr$pl qr = _Translations$dialogs$qr$pl._(_root); + @override + late final _Translations$dialogs$quickActions$pl quickActions = _Translations$dialogs$quickActions$pl._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$pl quickSaveNotice = _Translations$dialogs$quickSaveNotice$pl._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$pl quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$pl._(_root); + @override + late final _Translations$dialogs$pin$pl pin = _Translations$dialogs$pin$pl._(_root); + @override + late final _Translations$dialogs$sendModeHelp$pl sendModeHelp = _Translations$dialogs$sendModeHelp$pl._(_root); + @override + late final _Translations$dialogs$zoom$pl zoom = _Translations$dialogs$zoom$pl._(_root); +} + +// Path: sanitization +class _Translations$sanitization$pl extends Translations$sanitization$en { + _Translations$sanitization$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Nazwa pliku nie może być pusta'; + @override + String get invalid => 'Nazwa pliku zawiera nieprawidłowe znaki'; +} + +// Path: tray +class _Translations$tray$pl extends Translations$tray$en { + _Translations$tray$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Zakończ LocalSend'; + @override + String get closeWindows => 'Zamknij'; +} + +// Path: web +class _Translations$web$pl extends Translations$web$en { + _Translations$web$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Wpisz kod PIN'; + @override + String get invalidPin => 'Nieprawidłowy kod PIN'; + @override + String get tooManyAttempts => 'Zbyt wiele prób'; + @override + String get rejected => 'Odrzucone'; + @override + String get files => 'Pliki'; + @override + String get fileName => 'Nazwa pliku'; + @override + String get size => 'Rozmiar'; +} + +// Path: assetPicker +class _Translations$assetPicker$pl extends Translations$assetPicker$en { + _Translations$assetPicker$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Potwierdź'; + @override + String get cancel => 'Anuluj'; + @override + String get edit => 'Edytuj'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Nie udało się załadować'; + @override + String get original => 'Oryginał'; + @override + String get preview => 'Podgląd'; + @override + String get select => 'Wybierz'; + @override + String get emptyList => 'Pusta lista'; + @override + String get unSupportedAssetType => 'Nieobsługiwany typ pliku.'; + @override + String get unableToAccessAll => 'Nie można uzyskać dostępu do wszystkich plików na urządzeniu'; + @override + String get viewingLimitedAssetsTip => 'Przeglądaj tylko pliki i albumy dostępne dla aplikacji.'; + @override + String get changeAccessibleLimitedAssets => 'Kliknij, aby zaktualizować dostępne pliki'; + @override + String get accessAllTip => + 'Aplikacja może uzyskać dostęp tylko do niektórych plików na urządzeniu. Przejdź do ustawień systemowych i zezwól aplikacji na dostęp do wszystkich mediów na urządzeniu.'; + @override + String get goToSystemSettings => 'Przejdź do ustawień systemowych'; + @override + String get accessLimitedAssets => 'Kontynuuj z ograniczonym dostępem'; + @override + String get accessiblePathName => 'Dostępne pliki'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Obraz'; + @override + String get sTypeVideoLabel => 'Wideo'; + @override + String get sTypeOtherLabel => 'Inne media'; + @override + String get sActionPlayHint => 'odtwarzaj'; + @override + String get sActionPreviewHint => 'podgląd'; + @override + String get sActionSelectHint => 'wybierz'; + @override + String get sActionSwitchPathLabel => 'zmień ścieżkę'; + @override + String get sActionUseCameraHint => 'użyj kamery'; + @override + String get sNameDurationLabel => 'czas trwania'; + @override + String get sUnitAssetCountLabel => 'liczba'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$pl extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get preview => 'Podgląd'; + @override + String get whitelist => 'Biała lista'; + @override + String get blacklist => 'Czarna lista'; + @override + String get title => 'Interfejsy sieciowe'; + @override + String get info => + 'Domyślnie LocalSend używa wszystkich dostępnych interfejsów sieciowych. Możesz tutaj wykluczyć niechciane sieci. Musisz ponownie uruchomić serwer, aby zastosować zmiany.'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$pl extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Alias:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$pl extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Ulubione'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$pl extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Wybór'; + @override + String files({required Object files}) => 'Pliki: ${files}'; + @override + String size({required Object size}) => 'Wielkość: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$pl extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get file => 'Plik'; + @override + String get folder => 'Folder'; + @override + String get media => 'Media'; + @override + String get text => 'Tekst'; + @override + String get app => 'Aplikacja'; + @override + String get clipboard => 'Wklej'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$pl extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get single => 'Pojedynczy odbiorca'; + @override + String get multiple => 'Wielu odbiorców'; + @override + String get link => 'Udostępnij przez link'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$pl extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ogólne'; + @override + String get brightness => 'Motyw'; + @override + late final _Translations$settingsTab$general$brightnessOptions$pl brightnessOptions = _Translations$settingsTab$general$brightnessOptions$pl._( + _root, + ); + @override + String get color => 'Kolor'; + @override + late final _Translations$settingsTab$general$colorOptions$pl colorOptions = _Translations$settingsTab$general$colorOptions$pl._(_root); + @override + String get language => 'Język'; + @override + late final _Translations$settingsTab$general$languageOptions$pl languageOptions = _Translations$settingsTab$general$languageOptions$pl._(_root); + @override + String get saveWindowPlacement => 'Zapisz pozycję okna po zakończeniu'; + @override + String get saveWindowPlacementWindows => 'Zapisz pozycję okna po zamknięciu'; + @override + String get minimizeToTray => 'Zminimalizuj do menu ukrytych ikon przy zamykaniu'; + @override + String get launchAtStartup => 'Autostart po zalogowaniu'; + @override + String get launchMinimized => 'Autostart: start ukryty'; + @override + String get showInContextMenu => 'Pokaż LocalSend w menu kontekstowym'; + @override + String get animations => 'Animacje'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$pl extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Odbierz'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Zakończ automatycznie'; + @override + String get destination => 'Miejsce docelowe'; + @override + String get downloads => '(Pobrane)'; + @override + String get saveToGallery => 'Zapisz media w galerii'; + @override + String get saveToHistory => 'Zapisz w historii'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$pl extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Wyślij'; + @override + String get shareViaLinkAutoAccept => 'Udostępnij przez link: akceptuj automatycznie'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$pl extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sieć'; + @override + String get needRestart => 'Uruchom ponownie serwer, aby zastosować ustawienia!'; + @override + String get server => 'Serwer'; + @override + String get alias => 'Alias'; + @override + String get deviceType => 'Typ urządzenia'; + @override + String get deviceModel => 'Model urządzenia'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Limit czasu wykrywania'; + @override + String get useSystemName => 'Użyj nazwy systemu'; + @override + String get generateRandomAlias => 'Wygeneruj losowy alias'; + @override + String portWarning({required Object defaultPort}) => + 'Inne urządzenia mogą nie wykryć Twojego urządzenia, ponieważ używasz niestandardowego portu. (domyślnie: ${defaultPort})'; + @override + String get encryption => 'Szyfrowanie'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Inne urządzenia mogą nie wykryć Twojego urządzenia, ponieważ używasz niestandardowego adresu multicast. (domyślnie: ${defaultMulticast})'; + @override + late final _Translations$settingsTab$network$networkOptions$pl networkOptions = _Translations$settingsTab$network$networkOptions$pl._(_root); + @override + String get network => 'Sieć'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$pl extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Inne'; + @override + String get support => 'Wesprzyj LocalSend'; + @override + String get donate => 'Przekaż darowiznę'; + @override + String get privacyPolicy => 'Polityka prywatności'; + @override + String get termsOfUse => 'Warunki korzystania'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$pl extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Aplikacja może wysyłać pliki do innych urządzeń, ale inne urządzenia nie mogą wysyłać plików do tego urządzenia.'; + @override + String solution({required Object port}) => + 'Prawdopodobnie jest to problem z zaporą. Możesz go rozwiązać, zezwalając na przychodzące połączenia (UDP i TCP) na porcie ${port}.'; + @override + String get openFirewall => 'Otwórz zaporę'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$pl extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'To urządzenie nie może wykryć innych urządzeń.'; + @override + String get solution => + 'Upewnij się, że wszystkie urządzenia są w tej samej sieci Wi-Fi i mają tę samą konfigurację (port, adres multiemisji, szyfrowanie). Możesz spróbować wpisać adres IP urządzenia docelowego ręcznie. Jeśli to zadziała, rozważ dodanie tego urządzenia do ulubionych, aby mogło zostać automatycznie wykryte w przyszłości.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$pl extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Oba urządzenia nie mogą się nawzajem wykryć ani dzielić się plikami.'; + @override + String get solution => + 'Problem istnieje po obu stronach? Upewnij się, że oba urządzenia są w tej samej sieci Wi-Fi i mają takie same ustawienia (port, adres multicast, szyfrowanie). Wi-Fi może nie zezwalać na komunikację między uczestnikami z powodu izolacji punktu dostępu (AP). W takim przypadku tę opcję należy wyłączyć w routerze.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$pl extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get open => 'Otwórz plik'; + @override + String get showInFolder => 'Pokaż w folderze'; + @override + String get info => 'Informacje'; + @override + String get deleteFromHistory => 'Usuń z historii'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$pl extends Translations$progressPage$total$en { + _Translations$progressPage$total$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$pl title = _Translations$progressPage$total$title$pl._(_root); + @override + String count({required Object curr, required Object n}) => 'Pliki: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Wielkość: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Prędkość: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$pl extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Użyj „h” w przypadku skrótu godzin i „m” w przypadku minut + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Uży „d” w przypadku dni, „h” w przypadku godzin i „m” w przypadku minut + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$pl extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dodaj do wyboru'; + @override + String get content => 'Co chcesz dodać?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$pl extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Otwórz plik'; + @override + String get content => 'Czy chcesz otworzyć odebrany plik?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$pl extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Wpisz adres'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'Adres IP'; + @override + String get recentlyUsed => 'Ostatnio używane: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$pl extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Anuluj transfer plików'; + @override + String get content => 'Czy na pewno chcesz anulować transfer plików?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$pl extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nie można otworzyć pliku'; + @override + String content({required Object file}) => 'Nie można otworzyć „${file}”. Czy ten plik został przeniesiony, zmieniono mu nazwę lub usunięto?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$pl extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Szyfrowanie wyłączone'; + @override + String get content => 'Komunikacja odbywa się teraz za pomocą niezaszyfrowanego protokołu HTTP. Aby korzystać z HTTPS, włącz ponownie szyfrowanie.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$pl extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$pl extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ulubione'; + @override + String get noFavorites => 'Brak ulubionych urządzeń.'; + @override + String get addFavorite => 'Dodaj'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$pl extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Usuń z ulubionych'; + @override + String content({required Object name}) => 'Czy na pewno chcesz usunąć z ulubionych „${name}”?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$pl extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Dodaj do ulubionych'; + @override + String get titleEdit => 'Dostosuj'; + @override + String get name => 'Alias'; + @override + String get auto => '(auto)'; + @override + String get ip => 'Adres IP'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$pl extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informacje o pliku'; + @override + String get fileName => 'Nazwa pliku:'; + @override + String get path => 'Ścieżka:'; + @override + String get size => 'Rozmiar:'; + @override + String get sender => 'Nadawca:'; + @override + String get time => 'Czas:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$pl extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Wpisz nazwę pliku'; + @override + String original({required Object original}) => 'Oryginalny: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$pl extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Wyczyść historię'; + @override + String get content => 'Czy na pewno chcesz usunąć całą historię?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$pl extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend nie może znaleźć innych urządzeń bez uprawnienia do skanowania sieci lokalnej. Udziel tego uprawnienia w ustawieniach.'; + @override + String get gotoSettings => 'Ustawienia'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$pl extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Wpisz wiadomość'; + @override + String get multiline => 'Wieloliniowy'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$pl extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nie wybrano pliku'; + @override + String get content => 'Wybierz jeden plik.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$pl extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Brak uprawnień'; + @override + String get content => 'Nie udzielono wymaganych uprawnień. Udziel ich w ustawieniach.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$pl extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Niedostępne'; + @override + String get content => 'Ta funkcja jest dostępna tylko na:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$pl extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kod QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$pl extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Szybkie akcje'; + @override + String get counter => 'Licznik'; + @override + String get prefix => 'Prefiks'; + @override + String get padZero => 'Wypchnij zerami'; + @override + String get sortBeforeCount => 'Wcześniej posortuj alfabetycznie'; + @override + String get random => 'Losowy'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$pl extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Żądania plików są akceptowane automatycznie. Pamiętaj, że każdy w sieci lokalnej może przesyłać Ci pliki.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$pl extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Żądania plików są teraz akceptowane automatycznie z urządzeń na liście ulubionych.', + 'Uwaga! Obecnie nie jest to całkowicie bezpieczne, ponieważ haker, który ma odcisk palca dowolnego urządzenia z listy ulubionych, może wysyłać Ci pliki bez ograniczeń.', + 'Jednak ta opcja jest nadal bezpieczniejsza niż umożliwienie wszystkim użytkownikom w sieci lokalnej wysyłanie plików bez ograniczeń.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$pl extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Wpisz kod PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$pl extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tryby wysyłania'; + @override + String get single => 'Wysyła pliki do jednego odbiorcy. Wybór zostanie wyczyszczony po zakończonym transferze pliku.'; + @override + String get multiple => 'Wysyła pliki do wielu odbiorców. Wybór nie zostanie wyczyszczony.'; + @override + String get link => 'Odbiorcy, którzy nie mają zainstalowanego LocalSend, mogą pobrać wybrane pliki, otwierając link w swojej przeglądarce.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$pl extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Adres URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$pl extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Systemowy'; + @override + String get dark => 'Ciemny'; + @override + String get light => 'Jasny'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$pl extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Systemowy'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$pl extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Systemowy'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$pl extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String get all => 'Wszystkie'; + @override + String get filtered => 'Przefiltrowane'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$pl extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$pl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Całkowity postęp (${time})'; + @override + String get finishedError => 'Zakończono z błędem'; + @override + String get canceledSender => 'Anulowane przez nadawcę'; + @override + String get canceledReceiver => 'Anulowane przez odbiorcę'; +} diff --git a/app/lib/gen/strings_pt_BR.g.dart b/app/lib/gen/strings_pt_BR.g.dart new file mode 100644 index 0000000..a7d4c2a --- /dev/null +++ b/app/lib/gen/strings_pt_BR.g.dart @@ -0,0 +1,1521 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsPtBr extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsPtBr({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ptBr, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsPtBr _root = this; // ignore: unused_field + + @override + TranslationsPtBr $copyWith({TranslationMetadata? meta}) => TranslationsPtBr(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Português (Brasil)'; + @override + String get appName => 'LocalSend'; + @override + late final Translations$general$pt_BR general = Translations$general$pt_BR.internal(_root); + @override + late final Translations$receiveTab$pt_BR receiveTab = Translations$receiveTab$pt_BR.internal(_root); + @override + late final Translations$sendTab$pt_BR sendTab = Translations$sendTab$pt_BR.internal(_root); + @override + late final Translations$settingsTab$pt_BR settingsTab = Translations$settingsTab$pt_BR.internal(_root); + @override + late final Translations$troubleshootPage$pt_BR troubleshootPage = Translations$troubleshootPage$pt_BR.internal(_root); + @override + late final Translations$receiveHistoryPage$pt_BR receiveHistoryPage = Translations$receiveHistoryPage$pt_BR.internal(_root); + @override + late final Translations$apkPickerPage$pt_BR apkPickerPage = Translations$apkPickerPage$pt_BR.internal(_root); + @override + late final Translations$selectedFilesPage$pt_BR selectedFilesPage = Translations$selectedFilesPage$pt_BR.internal(_root); + @override + late final Translations$receivePage$pt_BR receivePage = Translations$receivePage$pt_BR.internal(_root); + @override + late final Translations$receiveOptionsPage$pt_BR receiveOptionsPage = Translations$receiveOptionsPage$pt_BR.internal(_root); + @override + late final Translations$sendPage$pt_BR sendPage = Translations$sendPage$pt_BR.internal(_root); + @override + late final Translations$progressPage$pt_BR progressPage = Translations$progressPage$pt_BR.internal(_root); + @override + late final Translations$webSharePage$pt_BR webSharePage = Translations$webSharePage$pt_BR.internal(_root); + @override + late final Translations$aboutPage$pt_BR aboutPage = Translations$aboutPage$pt_BR.internal(_root); + @override + late final Translations$donationPage$pt_BR donationPage = Translations$donationPage$pt_BR.internal(_root); + @override + late final Translations$changelogPage$pt_BR changelogPage = Translations$changelogPage$pt_BR.internal(_root); + @override + late final Translations$aliasGenerator$pt_BR aliasGenerator = Translations$aliasGenerator$pt_BR.internal(_root); + @override + late final Translations$dialogs$pt_BR dialogs = Translations$dialogs$pt_BR.internal(_root); + @override + late final Translations$sanitization$pt_BR sanitization = Translations$sanitization$pt_BR.internal(_root); + @override + late final Translations$tray$pt_BR tray = Translations$tray$pt_BR.internal(_root); + @override + late final Translations$web$pt_BR web = Translations$web$pt_BR.internal(_root); + @override + late final Translations$assetPicker$pt_BR assetPicker = Translations$assetPicker$pt_BR.internal(_root); + @override + late final Translations$networkInterfacesPage$pt_BR networkInterfacesPage = Translations$networkInterfacesPage$pt_BR.internal(_root); +} + +// Path: general +class Translations$general$pt_BR extends Translations$general$en { + Translations$general$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Aceitar'; + @override + String get accepted => 'Aceito'; + @override + String get add => 'Adicionar'; + @override + String get advanced => 'Avançado'; + @override + String get cancel => 'Cancelar'; + @override + String get close => 'Fechar'; + @override + String get confirm => 'Confirmar'; + @override + String get continueStr => 'Continuar'; + @override + String get copy => 'Copiar'; + @override + String get copiedToClipboard => 'Copiado pra área de transferência'; + @override + String get decline => 'Recusar'; + @override + String get done => 'Pronto'; + @override + String get delete => 'Apagar'; + @override + String get edit => 'Editar'; + @override + String get error => 'Erro'; + @override + String get example => 'Exemplo'; + @override + String get files => 'Arquivos'; + @override + String get finished => 'Concluído'; + @override + String get hide => 'Ocultar'; + @override + String get off => 'Desativado'; + @override + String get offline => 'Off-line'; + @override + String get on => 'Ativado'; + @override + String get online => 'On-line'; + @override + String get open => 'Abrir'; + @override + String get queue => 'Fila'; + @override + String get quickSave => 'Salvar rápido'; + @override + String get quickSaveFromFavorites => 'Salvar rápido para "Favoritos"'; + @override + String get renamed => 'Renomeado'; + @override + String get reset => 'Desfazer alterações'; + @override + String get restart => 'Reiniciar'; + @override + String get settings => 'Configurações'; + @override + String get skipped => 'Pulado'; + @override + String get start => 'Iniciar'; + @override + String get stop => 'Parar'; + @override + String get save => 'Salvar'; + @override + String get unchanged => 'Inalterado'; + @override + String get unknown => 'Desconhecido'; + @override + String get noItemInClipboard => 'Não há nada na área de transferência.'; +} + +// Path: receiveTab +class Translations$receiveTab$pt_BR extends Translations$receiveTab$en { + Translations$receiveTab$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Receber'; + @override + late final Translations$receiveTab$infoBox$pt_BR infoBox = Translations$receiveTab$infoBox$pt_BR.internal(_root); + @override + late final Translations$receiveTab$quickSave$pt_BR quickSave = Translations$receiveTab$quickSave$pt_BR.internal(_root); +} + +// Path: sendTab +class Translations$sendTab$pt_BR extends Translations$sendTab$en { + Translations$sendTab$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Enviar'; + @override + late final Translations$sendTab$selection$pt_BR selection = Translations$sendTab$selection$pt_BR.internal(_root); + @override + late final Translations$sendTab$picker$pt_BR picker = Translations$sendTab$picker$pt_BR.internal(_root); + @override + String get shareIntentInfo => + 'Você também pode usar o recurso "Compartilhar" do seu dispositivo móvel para selecionar arquivos com mais facilidade.'; + @override + String get nearbyDevices => 'Dispositivos por perto'; + @override + String get thisDevice => 'Este dispositivo'; + @override + String get scan => 'Procurar dispositivos'; + @override + String get manualSending => 'Envio manual'; + @override + String get sendMode => 'Modo de envio'; + @override + late final Translations$sendTab$sendModes$pt_BR sendModes = Translations$sendTab$sendModes$pt_BR.internal(_root); + @override + String get sendModeHelp => 'Explicação'; + @override + String get help => 'Certifique-se de que ambos os dispositivos estão na mesma rede Wi-Fi.'; + @override + String get placeItems => 'Insira os itens que quer compartilhar.'; +} + +// Path: settingsTab +class Translations$settingsTab$pt_BR extends Translations$settingsTab$en { + Translations$settingsTab$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Configurações'; + @override + late final Translations$settingsTab$general$pt_BR general = Translations$settingsTab$general$pt_BR.internal(_root); + @override + late final Translations$settingsTab$receive$pt_BR receive = Translations$settingsTab$receive$pt_BR.internal(_root); + @override + late final Translations$settingsTab$send$pt_BR send = Translations$settingsTab$send$pt_BR.internal(_root); + @override + late final Translations$settingsTab$network$pt_BR network = Translations$settingsTab$network$pt_BR.internal(_root); + @override + late final Translations$settingsTab$other$pt_BR other = Translations$settingsTab$other$pt_BR.internal(_root); + @override + String get advancedSettings => 'Configurações avançadas'; +} + +// Path: troubleshootPage +class Translations$troubleshootPage$pt_BR extends Translations$troubleshootPage$en { + Translations$troubleshootPage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Resolução de problemas'; + @override + String get subTitle => 'Este aplicativo não está funcionando como esperado? Aqui você pode encontrar soluções para problemas comuns.'; + @override + String get solution => 'Solução:'; + @override + String get fixButton => 'Consertar automaticamente'; + @override + late final Translations$troubleshootPage$firewall$pt_BR firewall = Translations$troubleshootPage$firewall$pt_BR.internal(_root); + @override + late final Translations$troubleshootPage$noDiscovery$pt_BR noDiscovery = Translations$troubleshootPage$noDiscovery$pt_BR.internal(_root); + @override + late final Translations$troubleshootPage$noConnection$pt_BR noConnection = Translations$troubleshootPage$noConnection$pt_BR.internal(_root); +} + +// Path: receiveHistoryPage +class Translations$receiveHistoryPage$pt_BR extends Translations$receiveHistoryPage$en { + Translations$receiveHistoryPage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Histórico'; + @override + String get openFolder => 'Abrir pasta'; + @override + String get deleteHistory => 'Apagar histórico'; + @override + String get empty => 'O histórico está vazio.'; + @override + late final Translations$receiveHistoryPage$entryActions$pt_BR entryActions = Translations$receiveHistoryPage$entryActions$pt_BR.internal(_root); +} + +// Path: apkPickerPage +class Translations$apkPickerPage$pt_BR extends Translations$apkPickerPage$en { + Translations$apkPickerPage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplicativos (APK)'; + @override + String get excludeSystemApps => 'Excluir aplicativos do sistema'; + @override + String get excludeAppsWithoutLaunchIntent => 'Excluir aplicativos não executáveis'; + @override + String apps({required Object n}) => '${n} aplicativos'; +} + +// Path: selectedFilesPage +class Translations$selectedFilesPage$pt_BR extends Translations$selectedFilesPage$en { + Translations$selectedFilesPage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Apagar tudo'; +} + +// Path: receivePage +class Translations$receivePage$pt_BR extends Translations$receivePage$en { + Translations$receivePage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pt'))( + n, + one: 'quer te enviar um arquivo', + other: 'quer te enviar ${n} arquivos', + ); + @override + String get subTitleMessage => 'te enviou uma mensagem:'; + @override + String get subTitleLink => 'te enviou um link:'; + @override + String get canceled => 'O remetente cancelou a solicitação.'; +} + +// Path: receiveOptionsPage +class Translations$receiveOptionsPage$pt_BR extends Translations$receiveOptionsPage$en { + Translations$receiveOptionsPage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Opções'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(pasta do LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Desativada automaticamente pois há pastas.'; +} + +// Path: sendPage +class Translations$sendPage$pt_BR extends Translations$sendPage$en { + Translations$sendPage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Aguardando resposta…'; + @override + String get rejected => 'O destinatário rejeitou a solicitação.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'O destinatário está ocupado com outra solicitação.'; +} + +// Path: progressPage +class Translations$progressPage$pt_BR extends Translations$progressPage$en { + Translations$progressPage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Enviando arquivos'; + @override + String get titleReceiving => 'Recebendo arquivos'; + @override + String get savedToGallery => 'Salvo na Galeria'; + @override + late final Translations$progressPage$total$pt_BR total = Translations$progressPage$total$pt_BR.internal(_root); + @override + late final Translations$progressPage$remainingTime$pt_BR remainingTime = Translations$progressPage$remainingTime$pt_BR.internal(_root); +} + +// Path: webSharePage +class Translations$webSharePage$pt_BR extends Translations$webSharePage$en { + Translations$webSharePage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Compartilhar via link'; + @override + String get loading => 'Iniciando o servidor…'; + @override + String get stopping => 'Parando o servidor…'; + @override + String get error => 'Ocorreu um erro ao iniciar o servidor.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pt'))( + n, + one: 'Abra este link no seu navegador:', + other: 'Abra um destes links no seu navegador:', + ); + @override + String get requests => 'Solicitações'; + @override + String get noRequests => 'Nenhuma solicitação ainda.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Aceitar solicitações automaticamente'; + @override + String get requirePin => 'Solicitar PIN'; + @override + String pinHint({required Object pin}) => 'O PIN é "${pin}"'; + @override + String get encryptionHint => 'O LocalSend utiliza um certificado autoassinado. Você precisa aceitá-lo no seu navegador.'; + @override + String pendingRequests({required Object n}) => 'Solicitações pendentes: ${n}'; +} + +// Path: aboutPage +class Translations$aboutPage$pt_BR extends Translations$aboutPage$en { + Translations$aboutPage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sobre o LocalSend'; + @override + List get description => [ + 'O LocalSend é um aplicativo gratuito, de código aberto, que permite compartilhar arquivos e mensagens com dispositivos próximos através da sua rede local, sem a necessidade de uma conexão à internet.', + 'Este aplicativo está disponível para Android, iOS, macOS, Windows e Linux. Você pode encontrar todas as opções de download na página oficial.', + ]; + @override + String get author => 'Autor'; + @override + String get contributors => 'Contribuidores'; + @override + String get packagers => 'Empacotadores'; + @override + String get translators => 'Tradutores'; +} + +// Path: donationPage +class Translations$donationPage$pt_BR extends Translations$donationPage$en { + Translations$donationPage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Doe'; + @override + String get info => + 'O LocalSend é gratuito, de código aberto e não tem anúncios. Se tu curte o app, então pense em apoiar o desenvolvimento com uma doação.'; + @override + String donate({required Object amount}) => 'Doar ${amount}'; + @override + String get thanks => 'Muito obrigado!'; + @override + String get restore => 'Restaurar compra'; +} + +// Path: changelogPage +class Translations$changelogPage$pt_BR extends Translations$changelogPage$en { + Translations$changelogPage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Registro de alterações'; +} + +// Path: aliasGenerator +class Translations$aliasGenerator$pt_BR extends Translations$aliasGenerator$en { + Translations$aliasGenerator$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Adorável', + 'Elegante', + 'Grande', + 'Brilhante', + 'Legal', + 'Inteligente', + 'Eficiente', + 'Quente', + 'Gentil', + 'Paciente', + 'Forte', + 'Especial', + 'Carente', + 'Cativante', + 'Deslumbrante', + 'Doce', + 'Experiente', + 'Exigente', + 'Fascinante', + 'Fiel', + 'Genial', + 'Formidável', + 'Humilde', + 'Incrível', + 'Interessante', + 'Perspicaz', + 'Reluzente', + 'Vigilante', + ]; + @override + List get fruits => [ + 'Maçã', + 'Abacate', + 'Banana', + 'Maracujá', + 'Ameixa', + 'Brócolis', + 'Cenoura', + 'Cereja', + 'Jaca', + 'Uva', + 'Limão', + 'Alface', + 'Manga', + 'Melão', + 'Cogumelo', + 'Cebola', + 'Laranja', + 'Mamão', + 'Pêssego', + 'Pera', + 'Abacaxi', + 'Batata', + 'Abóbora', + 'Pitanga', + 'Morango', + 'Tomate', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object fruit, required Object adjective}) => '${fruit} ${adjective}'; +} + +// Path: dialogs +class Translations$dialogs$pt_BR extends Translations$dialogs$en { + Translations$dialogs$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + late final Translations$dialogs$addFile$pt_BR addFile = Translations$dialogs$addFile$pt_BR.internal(_root); + @override + late final Translations$dialogs$openFile$pt_BR openFile = Translations$dialogs$openFile$pt_BR.internal(_root); + @override + late final Translations$dialogs$addressInput$pt_BR addressInput = Translations$dialogs$addressInput$pt_BR.internal(_root); + @override + late final Translations$dialogs$cancelSession$pt_BR cancelSession = Translations$dialogs$cancelSession$pt_BR.internal(_root); + @override + late final Translations$dialogs$cannotOpenFile$pt_BR cannotOpenFile = Translations$dialogs$cannotOpenFile$pt_BR.internal(_root); + @override + late final Translations$dialogs$encryptionDisabledNotice$pt_BR encryptionDisabledNotice = + Translations$dialogs$encryptionDisabledNotice$pt_BR.internal(_root); + @override + late final Translations$dialogs$errorDialog$pt_BR errorDialog = Translations$dialogs$errorDialog$pt_BR.internal(_root); + @override + late final Translations$dialogs$favoriteDialog$pt_BR favoriteDialog = Translations$dialogs$favoriteDialog$pt_BR.internal(_root); + @override + late final Translations$dialogs$favoriteDeleteDialog$pt_BR favoriteDeleteDialog = Translations$dialogs$favoriteDeleteDialog$pt_BR.internal(_root); + @override + late final Translations$dialogs$favoriteEditDialog$pt_BR favoriteEditDialog = Translations$dialogs$favoriteEditDialog$pt_BR.internal(_root); + @override + late final Translations$dialogs$fileInfo$pt_BR fileInfo = Translations$dialogs$fileInfo$pt_BR.internal(_root); + @override + late final Translations$dialogs$fileNameInput$pt_BR fileNameInput = Translations$dialogs$fileNameInput$pt_BR.internal(_root); + @override + late final Translations$dialogs$historyClearDialog$pt_BR historyClearDialog = Translations$dialogs$historyClearDialog$pt_BR.internal(_root); + @override + late final Translations$dialogs$localNetworkUnauthorized$pt_BR localNetworkUnauthorized = + Translations$dialogs$localNetworkUnauthorized$pt_BR.internal(_root); + @override + late final Translations$dialogs$messageInput$pt_BR messageInput = Translations$dialogs$messageInput$pt_BR.internal(_root); + @override + late final Translations$dialogs$noFiles$pt_BR noFiles = Translations$dialogs$noFiles$pt_BR.internal(_root); + @override + late final Translations$dialogs$noPermission$pt_BR noPermission = Translations$dialogs$noPermission$pt_BR.internal(_root); + @override + late final Translations$dialogs$notAvailableOnPlatform$pt_BR notAvailableOnPlatform = Translations$dialogs$notAvailableOnPlatform$pt_BR.internal( + _root, + ); + @override + late final Translations$dialogs$qr$pt_BR qr = Translations$dialogs$qr$pt_BR.internal(_root); + @override + late final Translations$dialogs$quickActions$pt_BR quickActions = Translations$dialogs$quickActions$pt_BR.internal(_root); + @override + late final Translations$dialogs$quickSaveNotice$pt_BR quickSaveNotice = Translations$dialogs$quickSaveNotice$pt_BR.internal(_root); + @override + late final Translations$dialogs$quickSaveFromFavoritesNotice$pt_BR quickSaveFromFavoritesNotice = + Translations$dialogs$quickSaveFromFavoritesNotice$pt_BR.internal(_root); + @override + late final Translations$dialogs$pin$pt_BR pin = Translations$dialogs$pin$pt_BR.internal(_root); + @override + late final Translations$dialogs$sendModeHelp$pt_BR sendModeHelp = Translations$dialogs$sendModeHelp$pt_BR.internal(_root); + @override + late final Translations$dialogs$zoom$pt_BR zoom = Translations$dialogs$zoom$pt_BR.internal(_root); +} + +// Path: sanitization +class Translations$sanitization$pt_BR extends Translations$sanitization$en { + Translations$sanitization$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get empty => 'O nome do arquivo não pode estar vazio'; + @override + String get invalid => 'O nome do arquivo contém caracteres inválidos'; +} + +// Path: tray +class Translations$tray$pt_BR extends Translations$tray$en { + Translations$tray$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Sair do LocalSend'; + @override + String get closeWindows => 'Sair'; +} + +// Path: web +class Translations$web$pt_BR extends Translations$web$en { + Translations$web$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Digite o PIN'; + @override + String get invalidPin => 'PIN inválido'; + @override + String get tooManyAttempts => 'Muitas tentativas'; + @override + String get rejected => 'Recusado'; + @override + String get files => 'Arquivos'; + @override + String get fileName => 'Nome do arquivo'; + @override + String get size => 'Tamanho'; +} + +// Path: assetPicker +class Translations$assetPicker$pt_BR extends Translations$assetPicker$en { + Translations$assetPicker$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Confirmar'; + @override + String get cancel => 'Cancelar'; + @override + String get edit => 'Editar'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Falha ao carregar'; + @override + String get original => 'Origem'; + @override + String get preview => 'Pré-visualização'; + @override + String get select => 'Selecionar'; + @override + String get emptyList => 'Lista vazia'; + @override + String get unSupportedAssetType => 'Não há suporte para o tipo de arquivo.'; + @override + String get unableToAccessAll => 'Não é possível acessar todos os arquivos do dispositivo'; + @override + String get viewingLimitedAssetsTip => 'Somente visualizar arquivos e álbuns acessíveis ao aplicativo.'; + @override + String get changeAccessibleLimitedAssets => 'Clique para atualizar os arquivos acessíveis'; + @override + String get accessAllTip => + 'O aplicativo só pode acessar alguns arquivos no dispositivo. Vá às configurações do sistema e permita que o aplicativo acesse todas as mídias do dispositivo.'; + @override + String get goToSystemSettings => 'Ir pras configurações do sistema'; + @override + String get accessLimitedAssets => 'Continuar com acesso limitado'; + @override + String get accessiblePathName => 'Arquivos acessíveis'; + @override + String get sTypeAudioLabel => 'Áudio'; + @override + String get sTypeImageLabel => 'Imagem'; + @override + String get sTypeVideoLabel => 'Vídeo'; + @override + String get sTypeOtherLabel => 'Outras mídias'; + @override + String get sActionPlayHint => 'reproduzir'; + @override + String get sActionPreviewHint => 'pré-visualizar'; + @override + String get sActionSelectHint => 'selecionar'; + @override + String get sActionSwitchPathLabel => 'mudar o caminho'; + @override + String get sActionUseCameraHint => 'usar a câmera'; + @override + String get sNameDurationLabel => 'duração'; + @override + String get sUnitAssetCountLabel => 'contagem'; +} + +// Path: networkInterfacesPage +class Translations$networkInterfacesPage$pt_BR extends Translations$networkInterfacesPage$en { + Translations$networkInterfacesPage$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get whitelist => 'Lista de permissão'; + @override + String get blacklist => 'Lista de bloqueio'; + @override + String get info => + 'Por padrão, o LocalSend utiliza todas as interfaces de rede disponíveis. Você pode excluir as redes indesejadas aqui. É necessário reiniciar o servidor para aplicar as alterações.'; + @override + String get preview => 'Pré-visualização'; + @override + String get title => 'Interfaces de rede'; +} + +// Path: receiveTab.infoBox +class Translations$receiveTab$infoBox$pt_BR extends Translations$receiveTab$infoBox$en { + Translations$receiveTab$infoBox$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Porta:'; + @override + String get alias => 'Nome do dispositivo:'; +} + +// Path: receiveTab.quickSave +class Translations$receiveTab$quickSave$pt_BR extends Translations$receiveTab$quickSave$en { + Translations$receiveTab$quickSave$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Favoritos'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class Translations$sendTab$selection$pt_BR extends Translations$sendTab$selection$en { + Translations$sendTab$selection$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Seleção'; + @override + String files({required Object files}) => 'Arquivos: ${files}'; + @override + String size({required Object size}) => 'Tamanho: ${size}'; +} + +// Path: sendTab.picker +class Translations$sendTab$picker$pt_BR extends Translations$sendTab$picker$en { + Translations$sendTab$picker$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get file => 'Arquivo'; + @override + String get folder => 'Pasta'; + @override + String get media => 'Mídia'; + @override + String get text => 'Texto'; + @override + String get app => 'Aplicativo'; + @override + String get clipboard => 'Colar'; +} + +// Path: sendTab.sendModes +class Translations$sendTab$sendModes$pt_BR extends Translations$sendTab$sendModes$en { + Translations$sendTab$sendModes$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get single => 'Único destinatário'; + @override + String get multiple => 'Vários destinatários'; + @override + String get link => 'Compartilhar via link'; +} + +// Path: settingsTab.general +class Translations$settingsTab$general$pt_BR extends Translations$settingsTab$general$en { + Translations$settingsTab$general$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Geral'; + @override + String get brightness => 'Tema'; + @override + late final Translations$settingsTab$general$brightnessOptions$pt_BR brightnessOptions = + Translations$settingsTab$general$brightnessOptions$pt_BR.internal(_root); + @override + String get color => 'Cores'; + @override + late final Translations$settingsTab$general$colorOptions$pt_BR colorOptions = Translations$settingsTab$general$colorOptions$pt_BR.internal(_root); + @override + String get language => 'Idioma'; + @override + late final Translations$settingsTab$general$languageOptions$pt_BR languageOptions = Translations$settingsTab$general$languageOptions$pt_BR.internal( + _root, + ); + @override + String get saveWindowPlacement => 'Salvar a posição da janela ao fechar'; + @override + String get saveWindowPlacementWindows => 'Salvar posição da janela ao sair'; + @override + String get minimizeToTray => 'Minimizar para a bandeja ao fechar'; + @override + String get launchAtStartup => 'Abrir junto com o usuário'; + @override + String get launchMinimized => 'Início automático: Abrir minimizado'; + @override + String get showInContextMenu => 'Mostrar LocalSend no menu de contexto'; + @override + String get animations => 'Animações'; +} + +// Path: settingsTab.receive +class Translations$settingsTab$receive$pt_BR extends Translations$settingsTab$receive$en { + Translations$settingsTab$receive$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Recepção'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Concluir automaticamente'; + @override + String get destination => 'Pasta de destino'; + @override + String get downloads => '(Downloads)'; + @override + String get saveToGallery => 'Salvar mídia na galeria'; + @override + String get saveToHistory => 'Salvar no histórico'; +} + +// Path: settingsTab.send +class Translations$settingsTab$send$pt_BR extends Translations$settingsTab$send$en { + Translations$settingsTab$send$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Envio'; + @override + String get shareViaLinkAutoAccept => 'Aceitar solicitações por link automaticamente'; +} + +// Path: settingsTab.network +class Translations$settingsTab$network$pt_BR extends Translations$settingsTab$network$en { + Translations$settingsTab$network$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rede'; + @override + String get needRestart => 'Reinicie o servidor para aplicar as configurações!'; + @override + String get server => 'Servidor'; + @override + String get alias => 'Nome do dispositivo'; + @override + String get deviceType => 'Tipo do dispositivo'; + @override + String get deviceModel => 'Modelo do dispositivo'; + @override + String get port => 'Porta'; + @override + String get discoveryTimeout => 'Tempo limite de descoberta'; + @override + String get useSystemName => 'Usar nome do sistema'; + @override + String get generateRandomAlias => 'Gerar apelido aleatório'; + @override + String portWarning({required Object defaultPort}) => + 'Você pode estar indetectável para outros dispositivos por estar usando uma porta customizada. (Padrão: ${defaultPort})'; + @override + String get encryption => 'Criptografia'; + @override + String get multicastGroup => 'Endereço de multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Você pode estar indetectável para outros dispositivos por estar usando um endereço de multicast customizado. (Padrão: ${defaultMulticast})'; + @override + String get network => 'Rede'; + @override + late final Translations$settingsTab$network$networkOptions$pt_BR networkOptions = Translations$settingsTab$network$networkOptions$pt_BR.internal( + _root, + ); +} + +// Path: settingsTab.other +class Translations$settingsTab$other$pt_BR extends Translations$settingsTab$other$en { + Translations$settingsTab$other$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Outras'; + @override + String get support => 'Apoiar o LocalSend'; + @override + String get donate => 'Doar'; + @override + String get privacyPolicy => 'Política de privacidade'; + @override + String get termsOfUse => 'Termos de uso'; +} + +// Path: troubleshootPage.firewall +class Translations$troubleshootPage$firewall$pt_BR extends Translations$troubleshootPage$firewall$en { + Translations$troubleshootPage$firewall$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get symptom => + 'Este aplicativo pode enviar arquivos para outros dispositivos, mas outros dispositivos não podem enviar arquivos para este dispositivo.'; + @override + String solution({required Object port}) => + 'Provavelmente isto se trata de um problema de firewall. Você pode resolver esse problema permitindo conexões (UDP e TCP) recebidas na porta ${port}.'; + @override + String get openFirewall => 'Abrir Firewall'; +} + +// Path: troubleshootPage.noDiscovery +class Translations$troubleshootPage$noDiscovery$pt_BR extends Translations$troubleshootPage$noDiscovery$en { + Translations$troubleshootPage$noDiscovery$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Este dispositivo não consegue encontrar outros dispositivos.'; + @override + String get solution => + 'Certifique-se de que todos os dispositivos estão na mesma rede Wi-Fi e utilizam as mesmas configurações (porta, endereço de multicast, criptografia). Você pode tentar digitar o endereço IP do outro dispositivo manualmente. Se isto funcionar, considere adicionar este dispositivo aos favoritos, assim ele será descoberto automaticamente no futuro.'; +} + +// Path: troubleshootPage.noConnection +class Translations$troubleshootPage$noConnection$pt_BR extends Translations$troubleshootPage$noConnection$en { + Translations$troubleshootPage$noConnection$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ambos os dispositivos não se encontram nem podem compartilhar arquivos entre si.'; + @override + String get solution => + 'O problema acontece em ambos? Então você precisa ter certeza de que os dispositivos estão na mesma rede Wi-Fi e utilizam as mesmas configurações (porta, endereço de multicast, criptografia). A rede Wi-Fi pode não permitir a comunicação entre os participantes devido à isolação de ponto de acesso (AP). Neste caso, esta opção deve ser desativada no roteador.'; +} + +// Path: receiveHistoryPage.entryActions +class Translations$receiveHistoryPage$entryActions$pt_BR extends Translations$receiveHistoryPage$entryActions$en { + Translations$receiveHistoryPage$entryActions$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get open => 'Abrir arquivo'; + @override + String get showInFolder => 'Mostrar na pasta'; + @override + String get info => 'Informações'; + @override + String get deleteFromHistory => 'Apagar do histórico'; +} + +// Path: progressPage.total +class Translations$progressPage$total$pt_BR extends Translations$progressPage$total$en { + Translations$progressPage$total$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + late final Translations$progressPage$total$title$pt_BR title = Translations$progressPage$total$title$pt_BR.internal(_root); + @override + String count({required Object curr, required Object n}) => 'Arquivos: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Tamanho: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Velocidade: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class Translations$progressPage$remainingTime$pt_BR extends Translations$progressPage$remainingTime$en { + Translations$progressPage$remainingTime$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Use 'h' para abreviar horas e 'm' para minutos + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Use 'd' para dias, 'h' para horas e 'm' para minutos + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: dialogs.addFile +class Translations$dialogs$addFile$pt_BR extends Translations$dialogs$addFile$en { + Translations$dialogs$addFile$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Adicionar à seleção'; + @override + String get content => 'O que você quer adicionar?'; +} + +// Path: dialogs.openFile +class Translations$dialogs$openFile$pt_BR extends Translations$dialogs$openFile$en { + Translations$dialogs$openFile$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Abrir arquivo'; + @override + String get content => 'Você quer abrir o arquivo recebido?'; +} + +// Path: dialogs.addressInput +class Translations$dialogs$addressInput$pt_BR extends Translations$dialogs$addressInput$en { + Translations$dialogs$addressInput$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Digite o endereço'; + @override + String get hashtag => 'Jogo da velha'; + @override + String get ip => 'Endereço de IP'; + @override + String get recentlyUsed => 'Usado recentemente: '; +} + +// Path: dialogs.cancelSession +class Translations$dialogs$cancelSession$pt_BR extends Translations$dialogs$cancelSession$en { + Translations$dialogs$cancelSession$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Cancelar transferência de arquivos'; + @override + String get content => 'Você quer mesmo cancelar a transferência de arquivos?'; +} + +// Path: dialogs.cannotOpenFile +class Translations$dialogs$cannotOpenFile$pt_BR extends Translations$dialogs$cannotOpenFile$en { + Translations$dialogs$cannotOpenFile$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Não foi possível abrir o arquivo'; + @override + String content({required Object file}) => 'Não foi possível abrir "${file}". Por acaso, o arquivo foi movido, renomeado ou excluído?'; +} + +// Path: dialogs.encryptionDisabledNotice +class Translations$dialogs$encryptionDisabledNotice$pt_BR extends Translations$dialogs$encryptionDisabledNotice$en { + Translations$dialogs$encryptionDisabledNotice$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Criptografia desativada'; + @override + String get content => 'A comunicação agora ocorre via protocolo HTTP sem criptografia. Para usar o HTTPS, ative a criptografia novamente.'; +} + +// Path: dialogs.errorDialog +class Translations$dialogs$errorDialog$pt_BR extends Translations$dialogs$errorDialog$en { + Translations$dialogs$errorDialog$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class Translations$dialogs$favoriteDialog$pt_BR extends Translations$dialogs$favoriteDialog$en { + Translations$dialogs$favoriteDialog$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favoritos'; + @override + String get noFavorites => 'Nenhum dispositivo favorito ainda.'; + @override + String get addFavorite => 'Adicionar'; +} + +// Path: dialogs.favoriteDeleteDialog +class Translations$dialogs$favoriteDeleteDialog$pt_BR extends Translations$dialogs$favoriteDeleteDialog$en { + Translations$dialogs$favoriteDeleteDialog$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Apagar dos favoritos'; + @override + String content({required Object name}) => 'Você quer mesmo apagar "${name}" dos favoritos?'; +} + +// Path: dialogs.favoriteEditDialog +class Translations$dialogs$favoriteEditDialog$pt_BR extends Translations$dialogs$favoriteEditDialog$en { + Translations$dialogs$favoriteEditDialog$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Adicionar aos favoritos'; + @override + String get titleEdit => 'Configurações'; + @override + String get name => 'Nome do dispositivo'; + @override + String get auto => '(auto.)'; + @override + String get ip => 'Endereço de IP'; + @override + String get port => 'Porta'; +} + +// Path: dialogs.fileInfo +class Translations$dialogs$fileInfo$pt_BR extends Translations$dialogs$fileInfo$en { + Translations$dialogs$fileInfo$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informação do arquivo'; + @override + String get fileName => 'Nome do arquivo:'; + @override + String get path => 'Caminho:'; + @override + String get size => 'Tamanho:'; + @override + String get sender => 'Remetente:'; + @override + String get time => 'Horário:'; +} + +// Path: dialogs.fileNameInput +class Translations$dialogs$fileNameInput$pt_BR extends Translations$dialogs$fileNameInput$en { + Translations$dialogs$fileNameInput$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Digite o nome do arquivo'; + @override + String original({required Object original}) => 'Original: ${original}'; +} + +// Path: dialogs.historyClearDialog +class Translations$dialogs$historyClearDialog$pt_BR extends Translations$dialogs$historyClearDialog$en { + Translations$dialogs$historyClearDialog$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Limpar histórico'; + @override + String get content => 'Você quer mesmo apagar todo o histórico?'; +} + +// Path: dialogs.localNetworkUnauthorized +class Translations$dialogs$localNetworkUnauthorized$pt_BR extends Translations$dialogs$localNetworkUnauthorized$en { + Translations$dialogs$localNetworkUnauthorized$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'O LocalSend não consegue encontrar outros dispositivos sem ter a permissão para escanear a rede local. Conceda esta permissão nas configurações.'; + @override + String get gotoSettings => 'Configurações'; +} + +// Path: dialogs.messageInput +class Translations$dialogs$messageInput$pt_BR extends Translations$dialogs$messageInput$en { + Translations$dialogs$messageInput$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Digite a mensagem'; + @override + String get multiline => 'Várias linhas'; +} + +// Path: dialogs.noFiles +class Translations$dialogs$noFiles$pt_BR extends Translations$dialogs$noFiles$en { + Translations$dialogs$noFiles$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nenhum arquivo selecionado'; + @override + String get content => 'Selecione pelo menos um arquivo.'; +} + +// Path: dialogs.noPermission +class Translations$dialogs$noPermission$pt_BR extends Translations$dialogs$noPermission$en { + Translations$dialogs$noPermission$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sem permissão'; + @override + String get content => 'Você não concedeu as permissões necessárias. Por favor, conceda-as nas configurações.'; +} + +// Path: dialogs.notAvailableOnPlatform +class Translations$dialogs$notAvailableOnPlatform$pt_BR extends Translations$dialogs$notAvailableOnPlatform$en { + Translations$dialogs$notAvailableOnPlatform$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Não disponível'; + @override + String get content => 'Este recurso só está disponível no:'; +} + +// Path: dialogs.qr +class Translations$dialogs$qr$pt_BR extends Translations$dialogs$qr$en { + Translations$dialogs$qr$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Código QR'; +} + +// Path: dialogs.quickActions +class Translations$dialogs$quickActions$pt_BR extends Translations$dialogs$quickActions$en { + Translations$dialogs$quickActions$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ações rápidas'; + @override + String get counter => 'Contador'; + @override + String get prefix => 'Prefixo'; + @override + String get padZero => 'Preencher com zeros'; + @override + String get sortBeforeCount => 'Ordenar alfabeticamente antes'; + @override + String get random => 'Aleatório'; +} + +// Path: dialogs.quickSaveNotice +class Translations$dialogs$quickSaveNotice$pt_BR extends Translations$dialogs$quickSaveNotice$en { + Translations$dialogs$quickSaveNotice$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Agora, as solicitações de arquivos são aceitas automaticamente. Tenha em mente que qualquer pessoa na rede local pode enviar arquivos para você.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class Translations$dialogs$quickSaveFromFavoritesNotice$pt_BR extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + Translations$dialogs$quickSaveFromFavoritesNotice$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Salvar rapidamento dos "Favoritos"'; + @override + List get content => [ + 'Agora, as solicitações de arquivos vindas de dispositivos na sua lista de favoritos são aceitas automaticamente.', + 'Atenção! Atualmente, esta opção não é totalmente segura pois um hacker que saiba a identificação dos seus dispositivos favoritos pode te enviar arquivos sem restrições.', + 'De qualquer forma, esta opção ainda é mais segura que permitir qualquer dispositivo na sua rede local envie arquivos sem restrições.', + ]; +} + +// Path: dialogs.pin +class Translations$dialogs$pin$pt_BR extends Translations$dialogs$pin$en { + Translations$dialogs$pin$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Digite o PIN'; +} + +// Path: dialogs.sendModeHelp +class Translations$dialogs$sendModeHelp$pt_BR extends Translations$dialogs$sendModeHelp$en { + Translations$dialogs$sendModeHelp$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Modos de envio'; + @override + String get single => 'Envia arquivos para um destinatário. A seleção será apagada após a conclusão da transferência dos arquivos.'; + @override + String get multiple => 'Envia arquivos para vários destinatários. A seleção não será apagada.'; + @override + String get link => + 'Os destinatários que não têm o LocalSend instalado podem baixar os arquivos selecionados abrindo o link fornecido no navegador.'; +} + +// Path: dialogs.zoom +class Translations$dialogs$zoom$pt_BR extends Translations$dialogs$zoom$en { + Translations$dialogs$zoom$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class Translations$settingsTab$general$brightnessOptions$pt_BR extends Translations$settingsTab$general$brightnessOptions$en { + Translations$settingsTab$general$brightnessOptions$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get dark => 'Escuro'; + @override + String get light => 'Claro'; +} + +// Path: settingsTab.general.colorOptions +class Translations$settingsTab$general$colorOptions$pt_BR extends Translations$settingsTab$general$colorOptions$en { + Translations$settingsTab$general$colorOptions$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class Translations$settingsTab$general$languageOptions$pt_BR extends Translations$settingsTab$general$languageOptions$en { + Translations$settingsTab$general$languageOptions$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; +} + +// Path: settingsTab.network.networkOptions +class Translations$settingsTab$network$networkOptions$pt_BR extends Translations$settingsTab$network$networkOptions$en { + Translations$settingsTab$network$networkOptions$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String get all => 'Todas'; + @override + String get filtered => 'Filtradas'; +} + +// Path: progressPage.total.title +class Translations$progressPage$total$title$pt_BR extends Translations$progressPage$total$title$en { + Translations$progressPage$total$title$pt_BR.internal(TranslationsPtBr root) : this._root = root, super.internal(root); + + final TranslationsPtBr _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Progresso total (${time})'; + @override + String get finishedError => 'Concluiu com erro'; + @override + String get canceledSender => 'Cancelado pelo remetente'; + @override + String get canceledReceiver => 'Cancelado pelo destinatário'; +} diff --git a/app/lib/gen/strings_pt_PT.g.dart b/app/lib/gen/strings_pt_PT.g.dart new file mode 100644 index 0000000..a39ae70 --- /dev/null +++ b/app/lib/gen/strings_pt_PT.g.dart @@ -0,0 +1,1533 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsPtPt extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsPtPt({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ptPt, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsPtPt _root = this; // ignore: unused_field + + @override + TranslationsPtPt $copyWith({TranslationMetadata? meta}) => TranslationsPtPt(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Português (Portugal)'; + @override + String get appName => 'LocalSend'; + @override + late final Translations$general$pt_PT general = Translations$general$pt_PT.internal(_root); + @override + late final Translations$receiveTab$pt_PT receiveTab = Translations$receiveTab$pt_PT.internal(_root); + @override + late final Translations$sendTab$pt_PT sendTab = Translations$sendTab$pt_PT.internal(_root); + @override + late final Translations$settingsTab$pt_PT settingsTab = Translations$settingsTab$pt_PT.internal(_root); + @override + late final Translations$troubleshootPage$pt_PT troubleshootPage = Translations$troubleshootPage$pt_PT.internal(_root); + @override + late final Translations$receiveHistoryPage$pt_PT receiveHistoryPage = Translations$receiveHistoryPage$pt_PT.internal(_root); + @override + late final Translations$apkPickerPage$pt_PT apkPickerPage = Translations$apkPickerPage$pt_PT.internal(_root); + @override + late final Translations$selectedFilesPage$pt_PT selectedFilesPage = Translations$selectedFilesPage$pt_PT.internal(_root); + @override + late final Translations$receivePage$pt_PT receivePage = Translations$receivePage$pt_PT.internal(_root); + @override + late final Translations$receiveOptionsPage$pt_PT receiveOptionsPage = Translations$receiveOptionsPage$pt_PT.internal(_root); + @override + late final Translations$sendPage$pt_PT sendPage = Translations$sendPage$pt_PT.internal(_root); + @override + late final Translations$progressPage$pt_PT progressPage = Translations$progressPage$pt_PT.internal(_root); + @override + late final Translations$webSharePage$pt_PT webSharePage = Translations$webSharePage$pt_PT.internal(_root); + @override + late final Translations$aboutPage$pt_PT aboutPage = Translations$aboutPage$pt_PT.internal(_root); + @override + late final Translations$donationPage$pt_PT donationPage = Translations$donationPage$pt_PT.internal(_root); + @override + late final Translations$changelogPage$pt_PT changelogPage = Translations$changelogPage$pt_PT.internal(_root); + @override + late final Translations$aliasGenerator$pt_PT aliasGenerator = Translations$aliasGenerator$pt_PT.internal(_root); + @override + late final Translations$dialogs$pt_PT dialogs = Translations$dialogs$pt_PT.internal(_root); + @override + late final Translations$sanitization$pt_PT sanitization = Translations$sanitization$pt_PT.internal(_root); + @override + late final Translations$tray$pt_PT tray = Translations$tray$pt_PT.internal(_root); + @override + late final Translations$web$pt_PT web = Translations$web$pt_PT.internal(_root); + @override + late final Translations$assetPicker$pt_PT assetPicker = Translations$assetPicker$pt_PT.internal(_root); + @override + late final Translations$networkInterfacesPage$pt_PT networkInterfacesPage = Translations$networkInterfacesPage$pt_PT.internal(_root); +} + +// Path: general +class Translations$general$pt_PT extends Translations$general$en { + Translations$general$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Aceitar'; + @override + String get accepted => 'Aceito'; + @override + String get add => 'Adicionar'; + @override + String get advanced => 'Avançado'; + @override + String get cancel => 'Cancelar'; + @override + String get close => 'Fechar'; + @override + String get confirm => 'Confirmar'; + @override + String get continueStr => 'Continuar'; + @override + String get copy => 'Copiar'; + @override + String get copiedToClipboard => 'Copiado para a Área de transferência'; + @override + String get decline => 'Rejeitar'; + @override + String get done => 'Concluído'; + @override + String get delete => 'Eliminar'; + @override + String get edit => 'Editar'; + @override + String get error => 'Erro'; + @override + String get example => 'Exemplo'; + @override + String get files => 'Ficheiros'; + @override + String get finished => 'Terminado'; + @override + String get hide => 'Ocultar'; + @override + String get off => 'Desativado'; + @override + String get offline => 'Offline'; + @override + String get on => 'Ativado'; + @override + String get online => 'Online'; + @override + String get open => 'Abrir'; + @override + String get queue => 'Fila'; + @override + String get quickSave => 'Guardar rápido'; + @override + String get renamed => 'Renomeado'; + @override + String get reset => 'Repor'; + @override + String get restart => 'Reiniciar'; + @override + String get settings => 'Definições'; + @override + String get skipped => 'Ignorado'; + @override + String get start => 'Iniciar'; + @override + String get stop => 'Parar'; + @override + String get save => 'Guardar'; + @override + String get unchanged => 'Inalterado'; + @override + String get unknown => 'Desconhecido'; + @override + String get noItemInClipboard => 'Nenhum item na área de transferência.'; + @override + String get quickSaveFromFavorites => 'Gravar rapidamente dos "Favoritos"'; +} + +// Path: receiveTab +class Translations$receiveTab$pt_PT extends Translations$receiveTab$en { + Translations$receiveTab$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Receber'; + @override + late final Translations$receiveTab$infoBox$pt_PT infoBox = Translations$receiveTab$infoBox$pt_PT.internal(_root); + @override + late final Translations$receiveTab$quickSave$pt_PT quickSave = Translations$receiveTab$quickSave$pt_PT.internal(_root); +} + +// Path: sendTab +class Translations$sendTab$pt_PT extends Translations$sendTab$en { + Translations$sendTab$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Enviar'; + @override + late final Translations$sendTab$selection$pt_PT selection = Translations$sendTab$selection$pt_PT.internal(_root); + @override + late final Translations$sendTab$picker$pt_PT picker = Translations$sendTab$picker$pt_PT.internal(_root); + @override + String get shareIntentInfo => 'Também pode usar o recurso "Partilhar" do seu dispositivo móvel para selecionar ficheiros com mais facilidade.'; + @override + String get nearbyDevices => 'Dispositivos próximos'; + @override + String get thisDevice => 'Este dispositivo'; + @override + String get scan => 'Procurar dispositivos'; + @override + String get sendMode => 'Modo de envio'; + @override + late final Translations$sendTab$sendModes$pt_PT sendModes = Translations$sendTab$sendModes$pt_PT.internal(_root); + @override + String get sendModeHelp => 'Explicação'; + @override + String get help => 'Certifique-se de que ambos os dispositivos estejam na mesma rede Wi-Fi.'; + @override + String get placeItems => 'Coloque os itens para partilhar.'; + @override + String get manualSending => 'Envio manual'; +} + +// Path: settingsTab +class Translations$settingsTab$pt_PT extends Translations$settingsTab$en { + Translations$settingsTab$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Definições'; + @override + late final Translations$settingsTab$general$pt_PT general = Translations$settingsTab$general$pt_PT.internal(_root); + @override + late final Translations$settingsTab$receive$pt_PT receive = Translations$settingsTab$receive$pt_PT.internal(_root); + @override + late final Translations$settingsTab$send$pt_PT send = Translations$settingsTab$send$pt_PT.internal(_root); + @override + late final Translations$settingsTab$network$pt_PT network = Translations$settingsTab$network$pt_PT.internal(_root); + @override + late final Translations$settingsTab$other$pt_PT other = Translations$settingsTab$other$pt_PT.internal(_root); + @override + String get advancedSettings => 'Definições avançadas'; +} + +// Path: troubleshootPage +class Translations$troubleshootPage$pt_PT extends Translations$troubleshootPage$en { + Translations$troubleshootPage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Diagnosticar problemas'; + @override + String get subTitle => 'Esta aplicação não está a funcionar como esperado? Aqui pode encontrar soluções comuns.'; + @override + String get solution => 'Solução:'; + @override + String get fixButton => 'Corrigir automaticamente'; + @override + late final Translations$troubleshootPage$firewall$pt_PT firewall = Translations$troubleshootPage$firewall$pt_PT.internal(_root); + @override + late final Translations$troubleshootPage$noConnection$pt_PT noConnection = Translations$troubleshootPage$noConnection$pt_PT.internal(_root); + @override + late final Translations$troubleshootPage$noDiscovery$pt_PT noDiscovery = Translations$troubleshootPage$noDiscovery$pt_PT.internal(_root); +} + +// Path: receiveHistoryPage +class Translations$receiveHistoryPage$pt_PT extends Translations$receiveHistoryPage$en { + Translations$receiveHistoryPage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Histórico'; + @override + String get openFolder => 'Abrir pasta'; + @override + String get deleteHistory => 'Eliminar histórico'; + @override + String get empty => 'O histórico está vazio.'; + @override + late final Translations$receiveHistoryPage$entryActions$pt_PT entryActions = Translations$receiveHistoryPage$entryActions$pt_PT.internal(_root); +} + +// Path: apkPickerPage +class Translations$apkPickerPage$pt_PT extends Translations$apkPickerPage$en { + Translations$apkPickerPage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplicações (APK)'; + @override + String get excludeSystemApps => 'Ocultar aplicações do sistema'; + @override + String get excludeAppsWithoutLaunchIntent => 'Ocultar aplicações não executáveis'; + @override + String apps({required Object n}) => '${n} Aplicações'; +} + +// Path: selectedFilesPage +class Translations$selectedFilesPage$pt_PT extends Translations$selectedFilesPage$en { + Translations$selectedFilesPage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Remover tudo'; +} + +// Path: receivePage +class Translations$receivePage$pt_PT extends Translations$receivePage$en { + Translations$receivePage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pt'))( + n, + one: 'quer enviar um ficheiro', + other: 'quer enviar ${n} ficheiros', + ); + @override + String get subTitleMessage => 'enviou-lhe uma mensagem:'; + @override + String get subTitleLink => 'enviou-lhe um link:'; + @override + String get canceled => 'O remetente cancelou o pedido.'; +} + +// Path: receiveOptionsPage +class Translations$receiveOptionsPage$pt_PT extends Translations$receiveOptionsPage$en { + Translations$receiveOptionsPage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Opções'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(pasta LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Opção desligada automaticamente pois uma pasta está a ser transferida.'; +} + +// Path: sendPage +class Translations$sendPage$pt_PT extends Translations$sendPage$en { + Translations$sendPage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'A aguardar resposta…'; + @override + String get rejected => 'O destinatário rejeitou o pedido.'; + @override + String get busy => 'O destinatário está ocupado com outro pedido de transferência.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; +} + +// Path: progressPage +class Translations$progressPage$pt_PT extends Translations$progressPage$en { + Translations$progressPage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'A enviar ficheiros'; + @override + String get titleReceiving => 'A receber ficheiros'; + @override + String get savedToGallery => 'Guardado na Galeria'; + @override + late final Translations$progressPage$total$pt_PT total = Translations$progressPage$total$pt_PT.internal(_root); + @override + late final Translations$progressPage$remainingTime$pt_PT remainingTime = Translations$progressPage$remainingTime$pt_PT.internal(_root); +} + +// Path: webSharePage +class Translations$webSharePage$pt_PT extends Translations$webSharePage$en { + Translations$webSharePage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Partilhe via link'; + @override + String get loading => 'A iniciar o servidor…'; + @override + String get stopping => 'A parar o servidor…'; + @override + String get error => 'Ocorreu um erro enquanto o servidor tentava iniciar.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pt'))( + n, + one: 'Abrir este link no navegador:', + other: 'Abrir um destes links no navegador:', + ); + @override + String get requests => 'Pedidos'; + @override + String get noRequests => 'Nenhum pedido ainda.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Aceitar pedidos automaticamente'; + @override + String get encryptionHint => 'O LocalSend utiliza um certificado assinado automaticamente. Precisa de aceitá-lo no navegador.'; + @override + String pendingRequests({required Object n}) => 'Pedidos pendentes: ${n}'; + @override + String get requirePin => 'Solicitar PIN'; + @override + String pinHint({required Object pin}) => 'O PIN é "${pin}"'; +} + +// Path: aboutPage +class Translations$aboutPage$pt_PT extends Translations$aboutPage$en { + Translations$aboutPage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Acerca do LocalSend'; + @override + List get description => [ + 'O LocalSend é uma aplicação gratuita e de código aberto que permite partilhar ficheiros e mensagens de forma segura com dispositivos próximos através da sua rede local, sem a necessidade de uma ligação à Internet.', + 'Esta aplicação está disponível para Android, iOS, macOS, Windows e Linux. Pode encontrar todas as opções para descarregar na página oficial.', + ]; + @override + String get author => 'Autor'; + @override + String get contributors => 'Contribuidores'; + @override + String get translators => 'Tradutores'; + @override + String get packagers => 'Empacotadores'; +} + +// Path: donationPage +class Translations$donationPage$pt_PT extends Translations$donationPage$en { + Translations$donationPage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Doar'; + @override + String get info => + 'O LocalSend é um software gratuito, de código aberto e sem qualquer anúncio. Se gosta da aplicação, considere apoiar o desenvolvimento com um donativo.'; + @override + String donate({required Object amount}) => 'Doar ${amount}'; + @override + String get thanks => 'Muito obrigado!'; + @override + String get restore => 'Restaurar compra'; +} + +// Path: changelogPage +class Translations$changelogPage$pt_PT extends Translations$changelogPage$en { + Translations$changelogPage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Histórico de alterações'; +} + +// Path: aliasGenerator +class Translations$aliasGenerator$pt_PT extends Translations$aliasGenerator$en { + Translations$aliasGenerator$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Adorável', + 'Lindo', + 'Grande', + 'Brilhante', + 'Limpo', + 'Inteligente', + 'Fixe', + 'Giro', + 'Astuto', + 'Determinado', + 'Enérgico', + 'Eficiente', + 'Fantástico', + 'Rápido', + 'Ótimo', + 'Fresco', + 'Bom', + 'Deslumbrante', + 'Bonito', + 'Gentil', + 'Adorável', + 'Místico', + 'Simpático', + 'Paciente', + 'Poderoso', + 'Rico', + 'Secreto', + 'Inteligente', + 'Sólido', + 'Especial', + 'Estratégico', + 'Forte', + 'Interessante', + 'Perspicaz', + 'Reluzente', + 'Vigilante', + 'Arrumado', + 'Sábio', + ]; + @override + List get fruits => [ + 'Maçã', + 'Abacate', + 'Banana', + 'Mirtilo', + 'Maracujá', + 'Ameixa', + 'Amora', + 'Brócolos', + 'Cenoura', + 'Cereja', + 'Côco', + 'Uva', + 'Limão', + 'Alface', + 'Manga', + 'Melão', + 'Cogumelo', + 'Cebola', + 'Laranja', + 'Papaia', + 'Mamão', + 'Pêssego', + 'Pêra', + 'Ananás', + 'Abacaxi', + 'Batata', + 'Abóbora', + 'Morango', + 'Tomate', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object fruit, required Object adjective}) => '${fruit} ${adjective}'; +} + +// Path: dialogs +class Translations$dialogs$pt_PT extends Translations$dialogs$en { + Translations$dialogs$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + late final Translations$dialogs$addFile$pt_PT addFile = Translations$dialogs$addFile$pt_PT.internal(_root); + @override + late final Translations$dialogs$addressInput$pt_PT addressInput = Translations$dialogs$addressInput$pt_PT.internal(_root); + @override + late final Translations$dialogs$cancelSession$pt_PT cancelSession = Translations$dialogs$cancelSession$pt_PT.internal(_root); + @override + late final Translations$dialogs$cannotOpenFile$pt_PT cannotOpenFile = Translations$dialogs$cannotOpenFile$pt_PT.internal(_root); + @override + late final Translations$dialogs$encryptionDisabledNotice$pt_PT encryptionDisabledNotice = + Translations$dialogs$encryptionDisabledNotice$pt_PT.internal(_root); + @override + late final Translations$dialogs$errorDialog$pt_PT errorDialog = Translations$dialogs$errorDialog$pt_PT.internal(_root); + @override + late final Translations$dialogs$favoriteDialog$pt_PT favoriteDialog = Translations$dialogs$favoriteDialog$pt_PT.internal(_root); + @override + late final Translations$dialogs$favoriteDeleteDialog$pt_PT favoriteDeleteDialog = Translations$dialogs$favoriteDeleteDialog$pt_PT.internal(_root); + @override + late final Translations$dialogs$favoriteEditDialog$pt_PT favoriteEditDialog = Translations$dialogs$favoriteEditDialog$pt_PT.internal(_root); + @override + late final Translations$dialogs$fileInfo$pt_PT fileInfo = Translations$dialogs$fileInfo$pt_PT.internal(_root); + @override + late final Translations$dialogs$fileNameInput$pt_PT fileNameInput = Translations$dialogs$fileNameInput$pt_PT.internal(_root); + @override + late final Translations$dialogs$historyClearDialog$pt_PT historyClearDialog = Translations$dialogs$historyClearDialog$pt_PT.internal(_root); + @override + late final Translations$dialogs$localNetworkUnauthorized$pt_PT localNetworkUnauthorized = + Translations$dialogs$localNetworkUnauthorized$pt_PT.internal(_root); + @override + late final Translations$dialogs$messageInput$pt_PT messageInput = Translations$dialogs$messageInput$pt_PT.internal(_root); + @override + late final Translations$dialogs$noFiles$pt_PT noFiles = Translations$dialogs$noFiles$pt_PT.internal(_root); + @override + late final Translations$dialogs$noPermission$pt_PT noPermission = Translations$dialogs$noPermission$pt_PT.internal(_root); + @override + late final Translations$dialogs$notAvailableOnPlatform$pt_PT notAvailableOnPlatform = Translations$dialogs$notAvailableOnPlatform$pt_PT.internal( + _root, + ); + @override + late final Translations$dialogs$qr$pt_PT qr = Translations$dialogs$qr$pt_PT.internal(_root); + @override + late final Translations$dialogs$quickActions$pt_PT quickActions = Translations$dialogs$quickActions$pt_PT.internal(_root); + @override + late final Translations$dialogs$quickSaveNotice$pt_PT quickSaveNotice = Translations$dialogs$quickSaveNotice$pt_PT.internal(_root); + @override + late final Translations$dialogs$sendModeHelp$pt_PT sendModeHelp = Translations$dialogs$sendModeHelp$pt_PT.internal(_root); + @override + late final Translations$dialogs$zoom$pt_PT zoom = Translations$dialogs$zoom$pt_PT.internal(_root); + @override + late final Translations$dialogs$quickSaveFromFavoritesNotice$pt_PT quickSaveFromFavoritesNotice = + Translations$dialogs$quickSaveFromFavoritesNotice$pt_PT.internal(_root); + @override + late final Translations$dialogs$openFile$pt_PT openFile = Translations$dialogs$openFile$pt_PT.internal(_root); + @override + late final Translations$dialogs$pin$pt_PT pin = Translations$dialogs$pin$pt_PT.internal(_root); +} + +// Path: sanitization +class Translations$sanitization$pt_PT extends Translations$sanitization$en { + Translations$sanitization$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get empty => 'O nome do ficheiro não pode estar em branco'; + @override + String get invalid => 'O nome do ficheiro contém caracteres inválidos'; +} + +// Path: tray +class Translations$tray$pt_PT extends Translations$tray$en { + Translations$tray$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Fechar o LocalSend'; + @override + String get closeWindows => 'Sair'; +} + +// Path: web +class Translations$web$pt_PT extends Translations$web$en { + Translations$web$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get rejected => 'Ligação rejeitada'; + @override + String get files => 'Ficheiros'; + @override + String get fileName => 'Nome do ficheiro'; + @override + String get size => 'Tamanho'; + @override + String get enterPin => 'Digite o PIN'; + @override + String get invalidPin => 'PIN inválido'; + @override + String get tooManyAttempts => 'Muitas tentativas'; +} + +// Path: assetPicker +class Translations$assetPicker$pt_PT extends Translations$assetPicker$en { + Translations$assetPicker$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Confirmar'; + @override + String get cancel => 'Cancelar'; + @override + String get edit => 'Editar'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Falha ao carregar'; + @override + String get original => 'Original'; + @override + String get preview => 'Pré-visualização'; + @override + String get select => 'Selecionar'; + @override + String get emptyList => 'Lista vazia'; + @override + String get unSupportedAssetType => 'Este tipo de ficheiro não é suportado.'; + @override + String get unableToAccessAll => 'Incapaz de aceder todos os ficheiros do dispositivo'; + @override + String get viewingLimitedAssetsTip => 'Apenas visualizar ficheiros e álbuns acessíveis à aplicação.'; + @override + String get changeAccessibleLimitedAssets => 'Clique para atualizar os ficheiros acessíveis'; + @override + String get accessAllTip => + 'A aplicação só pode aceder a alguns ficheiros no dispositivo. Aceda às definições do sistema e permita que a aplicação aceda a todos os ficheiros no dispositivo.'; + @override + String get goToSystemSettings => 'Ir para definições do sistema'; + @override + String get accessLimitedAssets => 'Continuar com acesso limitado'; + @override + String get accessiblePathName => 'Ficheiros acessíveis'; + @override + String get sTypeAudioLabel => 'Áudio'; + @override + String get sTypeImageLabel => 'Imagem'; + @override + String get sTypeVideoLabel => 'Vídeo'; + @override + String get sTypeOtherLabel => 'Outros ficheiros'; + @override + String get sActionPlayHint => 'reproduzir'; + @override + String get sActionPreviewHint => 'pré-visualizar'; + @override + String get sActionSelectHint => 'selecionar'; + @override + String get sActionSwitchPathLabel => 'mudar a localização'; + @override + String get sActionUseCameraHint => 'use a câmara'; + @override + String get sNameDurationLabel => 'duração'; + @override + String get sUnitAssetCountLabel => 'total'; +} + +// Path: networkInterfacesPage +class Translations$networkInterfacesPage$pt_PT extends Translations$networkInterfacesPage$en { + Translations$networkInterfacesPage$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Interfaces de rede'; + @override + String get info => + 'Por padrão, o LocalSend utiliza todas as interfaces de rede disponíveis. Pode excluir as redes indesejadas aqui. É necessário reiniciar o servidor para aplicar as alterações.'; + @override + String get preview => 'Anterior'; + @override + String get whitelist => 'Lista branca'; + @override + String get blacklist => 'Lista negra'; +} + +// Path: receiveTab.infoBox +class Translations$receiveTab$infoBox$pt_PT extends Translations$receiveTab$infoBox$en { + Translations$receiveTab$infoBox$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Porta:'; + @override + String get alias => 'Nome do dispositivo:'; +} + +// Path: receiveTab.quickSave +class Translations$receiveTab$quickSave$pt_PT extends Translations$receiveTab$quickSave$en { + Translations$receiveTab$quickSave$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Favoritos'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class Translations$sendTab$selection$pt_PT extends Translations$sendTab$selection$en { + Translations$sendTab$selection$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Seleção'; + @override + String files({required Object files}) => 'Ficheiros: ${files}'; + @override + String size({required Object size}) => 'Tamanho: ${size}'; +} + +// Path: sendTab.picker +class Translations$sendTab$picker$pt_PT extends Translations$sendTab$picker$en { + Translations$sendTab$picker$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get file => 'Ficheiro'; + @override + String get folder => 'Pasta'; + @override + String get media => 'Media'; + @override + String get text => 'Texto'; + @override + String get app => 'Aplicação'; + @override + String get clipboard => 'Colar'; +} + +// Path: sendTab.sendModes +class Translations$sendTab$sendModes$pt_PT extends Translations$sendTab$sendModes$en { + Translations$sendTab$sendModes$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get single => 'Único destinatário'; + @override + String get multiple => 'Vários destinatários'; + @override + String get link => 'Partilhar via link'; +} + +// Path: settingsTab.general +class Translations$settingsTab$general$pt_PT extends Translations$settingsTab$general$en { + Translations$settingsTab$general$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Geral'; + @override + String get brightness => 'Tema'; + @override + late final Translations$settingsTab$general$brightnessOptions$pt_PT brightnessOptions = + Translations$settingsTab$general$brightnessOptions$pt_PT.internal(_root); + @override + String get color => 'Cores'; + @override + late final Translations$settingsTab$general$colorOptions$pt_PT colorOptions = Translations$settingsTab$general$colorOptions$pt_PT.internal(_root); + @override + String get language => 'Idioma'; + @override + late final Translations$settingsTab$general$languageOptions$pt_PT languageOptions = Translations$settingsTab$general$languageOptions$pt_PT.internal( + _root, + ); + @override + String get saveWindowPlacement => 'Guardar a posição da janela ao fechar'; + @override + String get minimizeToTray => 'Minimizar para a área de notificação ao fechar'; + @override + String get launchAtStartup => 'Abrir automaticamente após iniciar sessão'; + @override + String get launchMinimized => 'Início automático: Abrir minimizado'; + @override + String get animations => 'Animações'; + @override + String get saveWindowPlacementWindows => 'Gravar posição da janela ao sair'; + @override + String get showInContextMenu => 'Mostrar LocalSend no menu de contexto'; +} + +// Path: settingsTab.receive +class Translations$settingsTab$receive$pt_PT extends Translations$settingsTab$receive$en { + Translations$settingsTab$receive$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Recepção'; + @override + String get quickSave => _root.general.quickSave; + @override + String get autoFinish => 'Concluir automaticamente'; + @override + String get destination => 'Destino'; + @override + String get downloads => '(Descargas)'; + @override + String get saveToGallery => 'Guardar na galeria'; + @override + String get saveToHistory => 'Guardar no histórico'; + @override + String get quickSaveFromFavorites => 'Gravar rapidamente dos "Favoritos"'; + @override + String get requirePin => _root.webSharePage.requirePin; +} + +// Path: settingsTab.send +class Translations$settingsTab$send$pt_PT extends Translations$settingsTab$send$en { + Translations$settingsTab$send$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Enviar'; + @override + String get shareViaLinkAutoAccept => 'Partilhar via link: Aceitar automaticamente'; +} + +// Path: settingsTab.network +class Translations$settingsTab$network$pt_PT extends Translations$settingsTab$network$en { + Translations$settingsTab$network$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rede'; + @override + String get needRestart => 'Reinicie o servidor para aplicar as definições!'; + @override + String get server => 'Servidor'; + @override + String get alias => 'Nome do dispositivo'; + @override + String get deviceType => 'Tipo de dispositivo'; + @override + String get deviceModel => 'Modelo do dispositivo'; + @override + String get port => 'Porta'; + @override + String get discoveryTimeout => 'Tempo limite de deteção'; + @override + String portWarning({required Object defaultPort}) => + 'Pode estar indetectável para outros dispositivos por estar a usar uma porta personalizada. (Padrão: ${defaultPort})'; + @override + String get encryption => 'Encriptação'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Pode estar indetectável para outros dispositivos por estar a usar um endereço multicast personalizado. (Padrão: ${defaultMulticast})'; + @override + String get generateRandomAlias => 'Gerar apelido aleatório'; + @override + String get network => 'Rede'; + @override + late final Translations$settingsTab$network$networkOptions$pt_PT networkOptions = Translations$settingsTab$network$networkOptions$pt_PT.internal( + _root, + ); + @override + String get useSystemName => 'Usar nome do sistema'; +} + +// Path: settingsTab.other +class Translations$settingsTab$other$pt_PT extends Translations$settingsTab$other$en { + Translations$settingsTab$other$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Outros'; + @override + String get support => 'Suporte o LocalSend'; + @override + String get donate => 'Doar'; + @override + String get privacyPolicy => 'Política de Privacidade'; + @override + String get termsOfUse => 'Termos de Utilização'; +} + +// Path: troubleshootPage.firewall +class Translations$troubleshootPage$firewall$pt_PT extends Translations$troubleshootPage$firewall$en { + Translations$troubleshootPage$firewall$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get symptom => + 'Esta aplicação pode enviar ficheiros para outros dispositivos, mas outros dispositivos não podem enviar ficheiros para este dispositivo.'; + @override + String solution({required Object port}) => + 'Provavelmente isto trata-se de um problema da firewall. Pode resolver este problema ao permitir ligações recebidas (UDP e TCP) na porta ${port}.'; + @override + String get openFirewall => 'Abrir a Firewall'; +} + +// Path: troubleshootPage.noConnection +class Translations$troubleshootPage$noConnection$pt_PT extends Translations$troubleshootPage$noConnection$en { + Translations$troubleshootPage$noConnection$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ambos os dispositivos não se detectam nem podem partilhar ficheiros entre si.'; + @override + String get solution => + 'O problema existe em ambos os lados? Então precisa de ter a certeza de que os dispositivos estão na mesma rede Wi-Fi e possuem a mesma configuração (porta, endereço multicast, encriptação). A rede Wi-Fi pode não permitir a comunicação entre os participantes. Neste caso, esta opção deve ser ativada no router.'; +} + +// Path: troubleshootPage.noDiscovery +class Translations$troubleshootPage$noDiscovery$pt_PT extends Translations$troubleshootPage$noDiscovery$en { + Translations$troubleshootPage$noDiscovery$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Este dispositivo não consegue descobrir outros dispositivos.'; + @override + String get solution => + 'Certifique-se de que todos os dispositivos estão na mesma rede Wi-Fi e partilham as mesmas configurações (porta, endereço multicast, criptografia). Pode tentar digitar o endereço IP do dispositivo de destino manualmente. Se isto funcionar, considere adicionar este dispositivo aos favoritos, assim ele será descoberto automaticamente no futuro.'; +} + +// Path: receiveHistoryPage.entryActions +class Translations$receiveHistoryPage$entryActions$pt_PT extends Translations$receiveHistoryPage$entryActions$en { + Translations$receiveHistoryPage$entryActions$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get open => 'Abrir ficheiro'; + @override + String get info => 'Informação'; + @override + String get deleteFromHistory => 'Remover do histórico'; + @override + String get showInFolder => 'Mostrar na pasta'; +} + +// Path: progressPage.total +class Translations$progressPage$total$pt_PT extends Translations$progressPage$total$en { + Translations$progressPage$total$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + late final Translations$progressPage$total$title$pt_PT title = Translations$progressPage$total$title$pt_PT.internal(_root); + @override + String count({required Object curr, required Object n}) => 'Ficheiros: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Tamanho: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Velocidade: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class Translations$progressPage$remainingTime$pt_PT extends Translations$progressPage$remainingTime$en { + Translations$progressPage$remainingTime$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Usar 'h' e 'm' para abreviar as palavras horas e minutos + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Usar 'd' para dias, 'h' para horas e 'm' para minutos + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: dialogs.addFile +class Translations$dialogs$addFile$pt_PT extends Translations$dialogs$addFile$en { + Translations$dialogs$addFile$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Adicionar à seleção'; + @override + String get content => 'O que quer adicionar?'; +} + +// Path: dialogs.addressInput +class Translations$dialogs$addressInput$pt_PT extends Translations$dialogs$addressInput$en { + Translations$dialogs$addressInput$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Digite o endereço'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'Endereço IP'; + @override + String get recentlyUsed => 'Recém ligado: '; +} + +// Path: dialogs.cancelSession +class Translations$dialogs$cancelSession$pt_PT extends Translations$dialogs$cancelSession$en { + Translations$dialogs$cancelSession$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Cancelar transferência de ficheiros'; + @override + String get content => 'Cancelar a transferência de ficheiros?'; +} + +// Path: dialogs.cannotOpenFile +class Translations$dialogs$cannotOpenFile$pt_PT extends Translations$dialogs$cannotOpenFile$en { + Translations$dialogs$cannotOpenFile$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Não foi possível abrir o ficheiro'; + @override + String content({required Object file}) => 'Não foi possível abrir "${file}". O ficheiro foi movido, renomeado ou eliminado?'; +} + +// Path: dialogs.encryptionDisabledNotice +class Translations$dialogs$encryptionDisabledNotice$pt_PT extends Translations$dialogs$encryptionDisabledNotice$en { + Translations$dialogs$encryptionDisabledNotice$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Encriptação desativada'; + @override + String get content => 'A comunicação agora ocorre via protocolo HTTP não encriptado. Para usar HTTPS, ative a encriptação novamente.'; +} + +// Path: dialogs.errorDialog +class Translations$dialogs$errorDialog$pt_PT extends Translations$dialogs$errorDialog$en { + Translations$dialogs$errorDialog$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class Translations$dialogs$favoriteDialog$pt_PT extends Translations$dialogs$favoriteDialog$en { + Translations$dialogs$favoriteDialog$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favoritos'; + @override + String get noFavorites => 'Ainda não tem dispositivos favoritos.'; + @override + String get addFavorite => 'Adicionar'; +} + +// Path: dialogs.favoriteDeleteDialog +class Translations$dialogs$favoriteDeleteDialog$pt_PT extends Translations$dialogs$favoriteDeleteDialog$en { + Translations$dialogs$favoriteDeleteDialog$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Eliminar favorito'; + @override + String content({required Object name}) => 'Eliminar "${name}" dos favoritos?'; +} + +// Path: dialogs.favoriteEditDialog +class Translations$dialogs$favoriteEditDialog$pt_PT extends Translations$dialogs$favoriteEditDialog$en { + Translations$dialogs$favoriteEditDialog$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Adicionar aos favoritos'; + @override + String get titleEdit => 'Editar'; + @override + String get name => 'Nome do dispositivo'; + @override + String get auto => '(auto)'; + @override + String get ip => 'Endereço IP'; + @override + String get port => 'Porta'; +} + +// Path: dialogs.fileInfo +class Translations$dialogs$fileInfo$pt_PT extends Translations$dialogs$fileInfo$en { + Translations$dialogs$fileInfo$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informação do ficheiro'; + @override + String get fileName => 'Nome do ficheiro:'; + @override + String get path => 'Localização:'; + @override + String get size => 'Tamanho:'; + @override + String get sender => 'Remetente:'; + @override + String get time => 'Data:'; +} + +// Path: dialogs.fileNameInput +class Translations$dialogs$fileNameInput$pt_PT extends Translations$dialogs$fileNameInput$en { + Translations$dialogs$fileNameInput$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Digite o nome do ficheiro'; + @override + String original({required Object original}) => 'Original: ${original}'; +} + +// Path: dialogs.historyClearDialog +class Translations$dialogs$historyClearDialog$pt_PT extends Translations$dialogs$historyClearDialog$en { + Translations$dialogs$historyClearDialog$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Limpar histórico'; + @override + String get content => 'Eliminar todo o histórico?'; +} + +// Path: dialogs.localNetworkUnauthorized +class Translations$dialogs$localNetworkUnauthorized$pt_PT extends Translations$dialogs$localNetworkUnauthorized$en { + Translations$dialogs$localNetworkUnauthorized$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'O LocalSend não consegue encontrar outros dispositivos sem ter a permissão para analisar a rede local. Conceda esta permissão nas definições.'; + @override + String get gotoSettings => 'Definições'; +} + +// Path: dialogs.messageInput +class Translations$dialogs$messageInput$pt_PT extends Translations$dialogs$messageInput$en { + Translations$dialogs$messageInput$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Digite a mensagem'; + @override + String get multiline => 'Várias linhas'; +} + +// Path: dialogs.noFiles +class Translations$dialogs$noFiles$pt_PT extends Translations$dialogs$noFiles$en { + Translations$dialogs$noFiles$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nenhum ficheiro selecionado'; + @override + String get content => 'Selecione pelo menos um ficheiro.'; +} + +// Path: dialogs.noPermission +class Translations$dialogs$noPermission$pt_PT extends Translations$dialogs$noPermission$en { + Translations$dialogs$noPermission$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sem permissão'; + @override + String get content => 'Não concedeu as permissões necessárias. Conceda-as nas definições.'; +} + +// Path: dialogs.notAvailableOnPlatform +class Translations$dialogs$notAvailableOnPlatform$pt_PT extends Translations$dialogs$notAvailableOnPlatform$en { + Translations$dialogs$notAvailableOnPlatform$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Indisponível'; + @override + String get content => 'Esta funcionalidade só está disponível no:'; +} + +// Path: dialogs.qr +class Translations$dialogs$qr$pt_PT extends Translations$dialogs$qr$en { + Translations$dialogs$qr$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR Code'; +} + +// Path: dialogs.quickActions +class Translations$dialogs$quickActions$pt_PT extends Translations$dialogs$quickActions$en { + Translations$dialogs$quickActions$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ações rápidas'; + @override + String get counter => 'Contador'; + @override + String get prefix => 'Prefixo'; + @override + String get padZero => 'Preencher com zeros'; + @override + String get sortBeforeCount => 'Ordenar previamente por ordem alfabética'; + @override + String get random => 'Aleatório'; +} + +// Path: dialogs.quickSaveNotice +class Translations$dialogs$quickSaveNotice$pt_PT extends Translations$dialogs$quickSaveNotice$en { + Translations$dialogs$quickSaveNotice$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Pedidos de ficheiros são aceites automaticamente. Tenha em atenção que todas as pessoas na rede local podem enviar-lhe ficheiros.'; +} + +// Path: dialogs.sendModeHelp +class Translations$dialogs$sendModeHelp$pt_PT extends Translations$dialogs$sendModeHelp$en { + Translations$dialogs$sendModeHelp$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Modos de envio'; + @override + String get single => 'Envia ficheiros para um destinatário. A seleção será apagada após a conclusão da transferência dos ficheiros.'; + @override + String get multiple => 'Envia ficheiros para vários destinatários. A seleção não será apagada.'; + @override + String get link => + 'Os destinatários que não têm o LocalSend instalado podem descarregar os ficheiros selecionados abrindo o link fornecido no navegador.'; +} + +// Path: dialogs.zoom +class Translations$dialogs$zoom$pt_PT extends Translations$dialogs$zoom$en { + Translations$dialogs$zoom$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class Translations$dialogs$quickSaveFromFavoritesNotice$pt_PT extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + Translations$dialogs$quickSaveFromFavoritesNotice$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + List get content => [ + 'Requisições de ficheiro agora são aceitas automaticamente de dispositivos da sua lista de favoritos.', + 'Atenção! Atualmente, esta opção não é totalmente segura pois um hacker que saiba a identificação dos seus dispositivos favoritos ainda pode te enviar ficheiros sem restrições.', + 'De qualquer forma, esta opção ainda é mais segura que permitir qualquer dispositivo.', + ]; + @override + String get title => 'Gravar rapidamento dos "Favoritos"'; +} + +// Path: dialogs.openFile +class Translations$dialogs$openFile$pt_PT extends Translations$dialogs$openFile$en { + Translations$dialogs$openFile$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Abrir ficheiro'; + @override + String get content => 'Quer abrir o ficheiro recebido?'; +} + +// Path: dialogs.pin +class Translations$dialogs$pin$pt_PT extends Translations$dialogs$pin$en { + Translations$dialogs$pin$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get title => 'Digite o PIN'; +} + +// Path: settingsTab.general.brightnessOptions +class Translations$settingsTab$general$brightnessOptions$pt_PT extends Translations$settingsTab$general$brightnessOptions$en { + Translations$settingsTab$general$brightnessOptions$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get dark => 'Escuro'; + @override + String get light => 'Claro'; +} + +// Path: settingsTab.general.colorOptions +class Translations$settingsTab$general$colorOptions$pt_PT extends Translations$settingsTab$general$colorOptions$en { + Translations$settingsTab$general$colorOptions$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class Translations$settingsTab$general$languageOptions$pt_PT extends Translations$settingsTab$general$languageOptions$en { + Translations$settingsTab$general$languageOptions$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistema'; +} + +// Path: settingsTab.network.networkOptions +class Translations$settingsTab$network$networkOptions$pt_PT extends Translations$settingsTab$network$networkOptions$en { + Translations$settingsTab$network$networkOptions$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String get all => 'Todos'; + @override + String get filtered => 'Filtrado'; +} + +// Path: progressPage.total.title +class Translations$progressPage$total$title$pt_PT extends Translations$progressPage$total$title$en { + Translations$progressPage$total$title$pt_PT.internal(TranslationsPtPt root) : this._root = root, super.internal(root); + + final TranslationsPtPt _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Progresso total (${time})'; + @override + String get finishedError => 'Terminado com erro'; + @override + String get canceledSender => 'Cancelado pelo remetente'; + @override + String get canceledReceiver => 'Cancelado pelo destinatário'; +} diff --git a/app/lib/gen/strings_ro.g.dart b/app/lib/gen/strings_ro.g.dart new file mode 100644 index 0000000..5d0aeed --- /dev/null +++ b/app/lib/gen/strings_ro.g.dart @@ -0,0 +1,1495 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsRo extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsRo({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ro, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsRo _root = this; // ignore: unused_field + + @override + TranslationsRo $copyWith({TranslationMetadata? meta}) => TranslationsRo(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Română'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$ro general = _Translations$general$ro._(_root); + @override + late final _Translations$receiveTab$ro receiveTab = _Translations$receiveTab$ro._(_root); + @override + late final _Translations$sendTab$ro sendTab = _Translations$sendTab$ro._(_root); + @override + late final _Translations$settingsTab$ro settingsTab = _Translations$settingsTab$ro._(_root); + @override + late final _Translations$troubleshootPage$ro troubleshootPage = _Translations$troubleshootPage$ro._(_root); + @override + late final _Translations$receiveHistoryPage$ro receiveHistoryPage = _Translations$receiveHistoryPage$ro._(_root); + @override + late final _Translations$apkPickerPage$ro apkPickerPage = _Translations$apkPickerPage$ro._(_root); + @override + late final _Translations$selectedFilesPage$ro selectedFilesPage = _Translations$selectedFilesPage$ro._(_root); + @override + late final _Translations$receivePage$ro receivePage = _Translations$receivePage$ro._(_root); + @override + late final _Translations$receiveOptionsPage$ro receiveOptionsPage = _Translations$receiveOptionsPage$ro._(_root); + @override + late final _Translations$sendPage$ro sendPage = _Translations$sendPage$ro._(_root); + @override + late final _Translations$progressPage$ro progressPage = _Translations$progressPage$ro._(_root); + @override + late final _Translations$webSharePage$ro webSharePage = _Translations$webSharePage$ro._(_root); + @override + late final _Translations$aboutPage$ro aboutPage = _Translations$aboutPage$ro._(_root); + @override + late final _Translations$donationPage$ro donationPage = _Translations$donationPage$ro._(_root); + @override + late final _Translations$changelogPage$ro changelogPage = _Translations$changelogPage$ro._(_root); + @override + late final _Translations$aliasGenerator$ro aliasGenerator = _Translations$aliasGenerator$ro._(_root); + @override + late final _Translations$dialogs$ro dialogs = _Translations$dialogs$ro._(_root); + @override + late final _Translations$sanitization$ro sanitization = _Translations$sanitization$ro._(_root); + @override + late final _Translations$tray$ro tray = _Translations$tray$ro._(_root); + @override + late final _Translations$web$ro web = _Translations$web$ro._(_root); + @override + late final _Translations$assetPicker$ro assetPicker = _Translations$assetPicker$ro._(_root); + @override + late final _Translations$networkInterfacesPage$ro networkInterfacesPage = _Translations$networkInterfacesPage$ro._(_root); +} + +// Path: general +class _Translations$general$ro extends Translations$general$en { + _Translations$general$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Acceptă'; + @override + String get accepted => 'Acceptat'; + @override + String get add => 'Adaugă'; + @override + String get advanced => 'Avansat'; + @override + String get cancel => 'Anulare'; + @override + String get close => 'Închide'; + @override + String get confirm => 'Confirmă'; + @override + String get continueStr => 'Continuă'; + @override + String get copy => 'Copiază'; + @override + String get copiedToClipboard => 'Copiat în Clipboard'; + @override + String get decline => 'Respinge'; + @override + String get done => 'Finalizat'; + @override + String get delete => 'Șterge'; + @override + String get edit => 'Editează'; + @override + String get error => 'Eroare'; + @override + String get example => 'Exemplu'; + @override + String get files => 'Fișiere'; + @override + String get finished => 'Finalizat'; + @override + String get hide => 'Ascunde'; + @override + String get off => 'Oprit'; + @override + String get offline => 'Offline'; + @override + String get on => 'Pornit'; + @override + String get online => 'Online'; + @override + String get open => 'Deschide'; + @override + String get queue => 'Coadă'; + @override + String get quickSave => 'Salvare rapidă'; + @override + String get quickSaveFromFavorites => 'Salvare rapidă pentru "Favorite"'; + @override + String get renamed => 'Redenumit'; + @override + String get reset => 'Anulează modificările'; + @override + String get restart => 'Repornire'; + @override + String get settings => 'Setări'; + @override + String get skipped => 'Omis'; + @override + String get start => 'Pornește'; + @override + String get stop => 'Oprește'; + @override + String get save => 'Salvează'; + @override + String get unchanged => 'Neschimbat'; + @override + String get unknown => 'Necunoscut'; + @override + String get noItemInClipboard => 'Fără elemente în clipboard.'; +} + +// Path: receiveTab +class _Translations$receiveTab$ro extends Translations$receiveTab$en { + _Translations$receiveTab$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Primire'; + @override + late final _Translations$receiveTab$infoBox$ro infoBox = _Translations$receiveTab$infoBox$ro._(_root); + @override + late final _Translations$receiveTab$quickSave$ro quickSave = _Translations$receiveTab$quickSave$ro._(_root); +} + +// Path: sendTab +class _Translations$sendTab$ro extends Translations$sendTab$en { + _Translations$sendTab$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Trimite'; + @override + late final _Translations$sendTab$selection$ro selection = _Translations$sendTab$selection$ro._(_root); + @override + late final _Translations$sendTab$picker$ro picker = _Translations$sendTab$picker$ro._(_root); + @override + String get shareIntentInfo => 'Poți utiliza, de asemenea, funcția „Partajare” a dispozitivului pentru a selecta mai ușor fișierele.'; + @override + String get nearbyDevices => 'Dispozitive din apropiere'; + @override + String get thisDevice => 'Acest dispozitiv'; + @override + String get scan => 'Caută dispozitive'; + @override + String get manualSending => 'Trimitere manuală'; + @override + String get sendMode => 'Mod de trimitere'; + @override + late final _Translations$sendTab$sendModes$ro sendModes = _Translations$sendTab$sendModes$ro._(_root); + @override + String get sendModeHelp => 'Explicație'; + @override + String get help => 'Verifică dacă destinația se află în aceeași rețea Wi-Fi.'; + @override + String get placeItems => 'Adaugă elemente pentru a partaja.'; +} + +// Path: settingsTab +class _Translations$settingsTab$ro extends Translations$settingsTab$en { + _Translations$settingsTab$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Setări'; + @override + late final _Translations$settingsTab$general$ro general = _Translations$settingsTab$general$ro._(_root); + @override + late final _Translations$settingsTab$receive$ro receive = _Translations$settingsTab$receive$ro._(_root); + @override + late final _Translations$settingsTab$send$ro send = _Translations$settingsTab$send$ro._(_root); + @override + late final _Translations$settingsTab$network$ro network = _Translations$settingsTab$network$ro._(_root); + @override + late final _Translations$settingsTab$other$ro other = _Translations$settingsTab$other$ro._(_root); + @override + String get advancedSettings => 'Setări avansate'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$ro extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Depanare'; + @override + String get subTitle => 'Aplicația nu funcționează așa cum trebuie? Aici poți găsi câteva soluții comune.'; + @override + String get solution => 'Soluția:'; + @override + String get fixButton => 'Repară automat'; + @override + late final _Translations$troubleshootPage$firewall$ro firewall = _Translations$troubleshootPage$firewall$ro._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$ro noDiscovery = _Translations$troubleshootPage$noDiscovery$ro._(_root); + @override + late final _Translations$troubleshootPage$noConnection$ro noConnection = _Translations$troubleshootPage$noConnection$ro._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$ro extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Istoric'; + @override + String get openFolder => 'Deschide dosarul'; + @override + String get deleteHistory => 'Șterge istoricul'; + @override + String get empty => 'Istoricul este gol.'; + @override + late final _Translations$receiveHistoryPage$entryActions$ro entryActions = _Translations$receiveHistoryPage$entryActions$ro._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$ro extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplicații (APK)'; + @override + String get excludeSystemApps => 'Exclude aplicațiile de sistem'; + @override + String get excludeAppsWithoutLaunchIntent => 'Exclude aplicațiile nelansabile'; + @override + String apps({required Object n}) => '${n} Aplicații'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$ro extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Șterge tot'; +} + +// Path: receivePage +class _Translations$receivePage$ro extends Translations$receivePage$en { + _Translations$receivePage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ro'))( + n, + one: 'vrea să îți trimită un fișier', + other: 'vrea să îți trimită ${n} fișiere', + ); + @override + String get subTitleMessage => 'ți-a trimis un mesaj:'; + @override + String get subTitleLink => 'ți-a trimis un link:'; + @override + String get canceled => 'Expeditorul a anulat cererea.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$ro extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Opțiuni'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(Dosarul LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Dezactivat automat deoarece există foldere.'; +} + +// Path: sendPage +class _Translations$sendPage$ro extends Translations$sendPage$en { + _Translations$sendPage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Așteptare răspuns…'; + @override + String get rejected => 'Destinatarul a respins cererea.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Destinatarul este ocupat cu o altă cerere.'; +} + +// Path: progressPage +class _Translations$progressPage$ro extends Translations$progressPage$en { + _Translations$progressPage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Trimitere fișiere'; + @override + String get titleReceiving => 'Primire fișiere'; + @override + String get savedToGallery => 'Salvat în Galerie'; + @override + late final _Translations$progressPage$total$ro total = _Translations$progressPage$total$ro._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$ro extends Translations$webSharePage$en { + _Translations$webSharePage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Partajează prin link'; + @override + String get loading => 'Pornirea serverului…'; + @override + String get stopping => 'Oprirea serverului…'; + @override + String get error => 'A apărut o eroare la pornirea serverului.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ro'))( + n, + one: 'Deschide acest link în browserul tău:', + other: 'Deschide unul dintre aceste linkuri în browserul tău:', + ); + @override + String get requests => 'Cereri'; + @override + String get noRequests => 'Nicio cerere încă.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Acceptă automat cererile'; + @override + String get requirePin => 'Solicită PIN'; + @override + String pinHint({required Object pin}) => 'PIN-ul este "${pin}"'; + @override + String get encryptionHint => 'LocalSend folosește un certificat auto-semnat. Trebuie să-l accepți în browserul tău.'; + @override + String pendingRequests({required Object n}) => 'Cereri în așteptare: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$ro extends Translations$aboutPage$en { + _Translations$aboutPage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Despre LocalSend'; + @override + List get description => [ + 'LocalSend este o aplicație gratuită și open-source care îți permite să partajezi în siguranță fișiere și mesaje cu dispozitivele din apropiere prin rețeaua ta locală, fără a avea nevoie de o conexiune la internet.', + 'Această aplicație este disponibilă pe Android, iOS, macOS, Windows și Linux. Poți găsi toate opțiunile de descărcare pe pagina oficială.', + ]; + @override + String get author => 'Autor'; + @override + String get contributors => 'Contribuitori'; + @override + String get packagers => 'Pachetari'; + @override + String get translators => 'Traducători'; +} + +// Path: donationPage +class _Translations$donationPage$ro extends Translations$donationPage$en { + _Translations$donationPage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Donează'; + @override + String get info => 'LocalSend este gratuit, open-source și fără reclame. Dacă îți place aplicația, poți susține dezvoltarea cu o donație.'; + @override + String donate({required Object amount}) => 'Donează ${amount}'; + @override + String get thanks => 'Îți mulțumim foarte mult!'; + @override + String get restore => 'Restabilește achiziția'; +} + +// Path: changelogPage +class _Translations$changelogPage$ro extends Translations$changelogPage$en { + _Translations$changelogPage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Schimbări'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$ro extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Adorabilă', + 'Frumoasă', + 'Mare', + 'Strălucitoare', + 'Curată', + 'Deșteaptă', + 'Cool', + 'Drăguță', + 'Vicleană', + 'Determinantă', + 'Energică', + 'Eficientă', + 'Fantastică', + 'Repede', + 'Bine', + 'Sănătoasă', + 'Proaspătă', + 'Bună', + 'Superbă', + 'Grozavă', + 'Coaptă', + 'Fierbinte', + 'Amabilă', + 'Iubitoare', + 'Mistică', + 'îngrijită', + 'Plăcută', + 'Răbdătoare', + 'Frumușică', + 'Puternică', + 'Delicioasă', + 'Secretă', + 'Inteligentă', + 'Solidă', + 'Specială', + 'Strategică', + 'Aromată', + 'Înțeleaptă', + ]; + @override + List get fruits => [ + 'Caisă', + 'Gutuie', + 'Banană', + 'Mură', + 'Nucă', + 'Afină', + 'Vișină', + 'Cireașă', + 'Lămâie', + 'Salată', + 'Fasole', + 'Conopidă', + 'Ciupercă', + 'Ceapă', + 'Portocală', + 'Piersică', + 'Pară', + 'Varză', + 'Mazăre', + 'Prună', + 'Rodie', + 'Zmeură', + 'Căpșună', + 'Roșie', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object fruit, required Object adjective}) => '${fruit} ${adjective}'; +} + +// Path: dialogs +class _Translations$dialogs$ro extends Translations$dialogs$en { + _Translations$dialogs$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$ro addFile = _Translations$dialogs$addFile$ro._(_root); + @override + late final _Translations$dialogs$openFile$ro openFile = _Translations$dialogs$openFile$ro._(_root); + @override + late final _Translations$dialogs$addressInput$ro addressInput = _Translations$dialogs$addressInput$ro._(_root); + @override + late final _Translations$dialogs$cancelSession$ro cancelSession = _Translations$dialogs$cancelSession$ro._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$ro cannotOpenFile = _Translations$dialogs$cannotOpenFile$ro._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$ro encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$ro._(_root); + @override + late final _Translations$dialogs$errorDialog$ro errorDialog = _Translations$dialogs$errorDialog$ro._(_root); + @override + late final _Translations$dialogs$favoriteDialog$ro favoriteDialog = _Translations$dialogs$favoriteDialog$ro._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$ro favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$ro._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$ro favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$ro._(_root); + @override + late final _Translations$dialogs$fileInfo$ro fileInfo = _Translations$dialogs$fileInfo$ro._(_root); + @override + late final _Translations$dialogs$fileNameInput$ro fileNameInput = _Translations$dialogs$fileNameInput$ro._(_root); + @override + late final _Translations$dialogs$historyClearDialog$ro historyClearDialog = _Translations$dialogs$historyClearDialog$ro._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$ro localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$ro._(_root); + @override + late final _Translations$dialogs$messageInput$ro messageInput = _Translations$dialogs$messageInput$ro._(_root); + @override + late final _Translations$dialogs$noFiles$ro noFiles = _Translations$dialogs$noFiles$ro._(_root); + @override + late final _Translations$dialogs$noPermission$ro noPermission = _Translations$dialogs$noPermission$ro._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$ro notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$ro._(_root); + @override + late final _Translations$dialogs$qr$ro qr = _Translations$dialogs$qr$ro._(_root); + @override + late final _Translations$dialogs$quickActions$ro quickActions = _Translations$dialogs$quickActions$ro._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$ro quickSaveNotice = _Translations$dialogs$quickSaveNotice$ro._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$ro quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$ro._(_root); + @override + late final _Translations$dialogs$pin$ro pin = _Translations$dialogs$pin$ro._(_root); + @override + late final _Translations$dialogs$sendModeHelp$ro sendModeHelp = _Translations$dialogs$sendModeHelp$ro._(_root); + @override + late final _Translations$dialogs$zoom$ro zoom = _Translations$dialogs$zoom$ro._(_root); +} + +// Path: sanitization +class _Translations$sanitization$ro extends Translations$sanitization$en { + _Translations$sanitization$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Numele fișierului nu poate fi gol'; + @override + String get invalid => 'Numele fișierului conține caractere greșite'; +} + +// Path: tray +class _Translations$tray$ro extends Translations$tray$en { + _Translations$tray$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Închide LocalSend'; + @override + String get closeWindows => 'Ieșire'; +} + +// Path: web +class _Translations$web$ro extends Translations$web$en { + _Translations$web$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Introdu codul PIN'; + @override + String get invalidPin => 'Codul PIN introdus este greșit'; + @override + String get tooManyAttempts => 'Prea multe încercări'; + @override + String get rejected => 'Respins'; + @override + String get files => 'Fișiere'; + @override + String get fileName => 'Numele fișierului'; + @override + String get size => 'Dimensiune'; +} + +// Path: assetPicker +class _Translations$assetPicker$ro extends Translations$assetPicker$en { + _Translations$assetPicker$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Confirmă'; + @override + String get cancel => 'Anulează'; + @override + String get edit => 'Editează'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Eroare la încărcare'; + @override + String get original => 'Original'; + @override + String get preview => 'Previzualizare'; + @override + String get select => 'Selectează'; + @override + String get emptyList => 'Listă goală'; + @override + String get unSupportedAssetType => 'Tip de fișier neacceptat.'; + @override + String get unableToAccessAll => 'Nu se pot accesa toate fișierele de pe dispozitiv'; + @override + String get viewingLimitedAssetsTip => 'Aplicația poate vizualiza doar fișiere și albume la care are acces.'; + @override + String get changeAccessibleLimitedAssets => 'Apasă pentru a actualiza fișierele accesibile'; + @override + String get accessAllTip => + 'Aplicația are acces doar la unele fișiere de pe dispozitiv. Accesează setările de sistem și permite aplicației să acceseze toate fișierele media de pe dispozitiv.'; + @override + String get goToSystemSettings => 'Accesează setările sistemului'; + @override + String get accessLimitedAssets => 'Continuă cu acces limitat'; + @override + String get accessiblePathName => 'Fișiere accesibile'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Imagini'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Alte fișiere media'; + @override + String get sActionPlayHint => 'redare'; + @override + String get sActionPreviewHint => 'previzualizare'; + @override + String get sActionSelectHint => 'selectează'; + @override + String get sActionSwitchPathLabel => 'schimbă calea'; + @override + String get sActionUseCameraHint => 'folosește camera'; + @override + String get sNameDurationLabel => 'durată'; + @override + String get sUnitAssetCountLabel => 'cantitate'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$ro extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Interfețe de rețea'; + @override + String get info => + 'În mod implicit, LocalSend folosește toate interfețele de rețea disponibile. Poți exclude rețelele nedorite aici. Trebuie să repornești serverul pentru a aplica modificările.'; + @override + String get preview => 'Previzualizare'; + @override + String get whitelist => 'Lista albă'; + @override + String get blacklist => 'Lista neagră'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$ro extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Nume dispozitivului:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$ro extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Favorite'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$ro extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Selecție'; + @override + String files({required Object files}) => 'Fișiere: ${files}'; + @override + String size({required Object size}) => 'Dimensiune: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$ro extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get file => 'Fișier'; + @override + String get folder => 'Dosar'; + @override + String get media => 'Media'; + @override + String get text => 'Text'; + @override + String get app => 'Aplicație'; + @override + String get clipboard => 'Lipește'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$ro extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get single => 'Un singur destinatar'; + @override + String get multiple => 'Mai mulți destinatari'; + @override + String get link => 'Partajează prin link'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$ro extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'General'; + @override + String get brightness => 'Tema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$ro brightnessOptions = _Translations$settingsTab$general$brightnessOptions$ro._( + _root, + ); + @override + String get color => 'Culoare'; + @override + late final _Translations$settingsTab$general$colorOptions$ro colorOptions = _Translations$settingsTab$general$colorOptions$ro._(_root); + @override + String get language => 'Limba'; + @override + late final _Translations$settingsTab$general$languageOptions$ro languageOptions = _Translations$settingsTab$general$languageOptions$ro._(_root); + @override + String get saveWindowPlacement => 'Reține locația ferestrei după ieșire'; + @override + String get saveWindowPlacementWindows => 'Salvarea poziției ferestrei după închidere'; + @override + String get minimizeToTray => 'Minimizează în Bara de Meniuri/Tray la închidere'; + @override + String get launchAtStartup => 'Pornire automată după autentificare'; + @override + String get launchMinimized => 'Autopornire: Pornire ascunsă'; + @override + String get showInContextMenu => 'Afișează LocalSend în meniul contextual'; + @override + String get animations => 'Animații'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$ro extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Primire'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Finisare automată'; + @override + String get destination => 'Salvează în dosar'; + @override + String get downloads => '(Descărcări)'; + @override + String get saveToGallery => 'Salvează media în galerie'; + @override + String get saveToHistory => 'Salvează în istoric'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$ro extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Trimite'; + @override + String get shareViaLinkAutoAccept => 'Acceptă automat cererile în modul „Partajare prin link”'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$ro extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rețea'; + @override + String get needRestart => 'Repornește serverul pentru a aplica setările!'; + @override + String get server => 'Server'; + @override + String get alias => 'Nume dispozitiv'; + @override + String get deviceType => 'Tip dispozitiv'; + @override + String get deviceModel => 'Model dispozitiv'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Expirare descoperire'; + @override + String get useSystemName => 'Folosește numele sistemului'; + @override + String get generateRandomAlias => 'Generează alias aleatoriu'; + @override + String portWarning({required Object defaultPort}) => + 'Este posibil să nu fii detectat de alte dispozitive pentru că folosești un port personalizat. (implicit: ${defaultPort})'; + @override + String get encryption => 'Criptare'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Este posibil să nu fii detectat de alte dispozitive pentru că folosești o adresă multicast personalizată. (implicit: ${defaultMulticast})'; + @override + late final _Translations$settingsTab$network$networkOptions$ro networkOptions = _Translations$settingsTab$network$networkOptions$ro._(_root); + @override + String get network => 'Rețea'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$ro extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Altele'; + @override + String get support => 'Susține LocalSend'; + @override + String get donate => 'Donează'; + @override + String get privacyPolicy => 'Politica de confidențialitate'; + @override + String get termsOfUse => 'Termeni de utilizare'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$ro extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get symptom => + 'Această aplicație poate trimite fișiere la alte dispozitive, dar alte dispozitive nu pot trimite fișiere de pe acest dispozitiv.'; + @override + String solution({required Object port}) => + 'Cel mai probabil problema este de la firewall. Poți rezolva această problemă permițând conexiunile de intrare (UDP și TCP) pe portul ${port}.'; + @override + String get openFirewall => 'Deschide Firewall'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$ro extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Acest dispozitiv nu poate descoperi alte dispozitive.'; + @override + String get solution => + 'Asigură-te că toate dispozitivele sunt pe aceeași rețea Wi-Fi și au aceeași configurație (port, adresă de multicast, criptare). Poți încerca să scrii manual adresa IP pe dispozitivul ales. Dacă merge, consideră să adaugi dispozitivul la favorite ca să fie găsit automat în viitor.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$ro extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ambele dispozitive nu se pot descoperi și nu pot partaja fișiere.'; + @override + String get solution => + 'Problema există de ambele părți? Dacă da, trebuie să te asiguri că ambele dispozitive se află în aceeași rețea Wi-Fi și au aceeași configurație (port, adresă multicast, criptare). Este posibil ca rețeaua să nu permită comunicarea între participanți. În acest caz, această opțiune trebuie să fie activată pe router.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$ro extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get open => 'Deschide fișierul'; + @override + String get showInFolder => 'Afișează în dosar'; + @override + String get info => 'Informații'; + @override + String get deleteFromHistory => 'Șterge din istoric'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$ro extends Translations$progressPage$total$en { + _Translations$progressPage$total$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$ro title = _Translations$progressPage$total$title$ro._(_root); + @override + String count({required Object curr, required Object n}) => 'Fișiere: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Dimensiune: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Viteză: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$ro extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Adaugă la selecție'; + @override + String get content => 'Ce vrei să adaugi?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$ro extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Deschide fișierul'; + @override + String get content => 'Vrei să deschizi fișierul primit?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$ro extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Introdu adresa'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'Adresă IP'; + @override + String get recentlyUsed => 'Folosit recent: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$ro extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Anulează trimiterea fișierelor'; + @override + String get content => 'Chiar vrei să anulezi transferul fișierelor?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$ro extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nu se poate deschide fișierul'; + @override + String content({required Object file}) => 'Nu s-a putut deschide \"${file}\". A fost mutat, redenumit sau șters?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$ro extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Criptare dezactivată'; + @override + String get content => 'Comunicarea are loc acum prin protocolul HTTP necriptat. Pentru a folosi HTTPS, activează din nou criptarea.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$ro extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$ro extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favorite'; + @override + String get noFavorites => 'Încă nu sunt dispozitive favorite.'; + @override + String get addFavorite => 'Adaugă'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$ro extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Șterge din favorite'; + @override + String content({required Object name}) => 'Sigur vrei să ștergi din favorite "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$ro extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Adaugă la favorite'; + @override + String get titleEdit => 'Setări'; + @override + String get name => 'Numele dispozitivului'; + @override + String get auto => '(auto)'; + @override + String get ip => 'Adresă IP'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$ro extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informații despre fișier'; + @override + String get fileName => 'Numele fișierului:'; + @override + String get path => 'Calea:'; + @override + String get size => 'Dimensiune:'; + @override + String get sender => 'Expeditor:'; + @override + String get time => 'Timp:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$ro extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Introdu numele fișierului'; + @override + String original({required Object original}) => 'Original: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$ro extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Golește istoricul'; + @override + String get content => 'Sigur vrei să golești întregul istoric?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$ro extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend nu poate găsi alte dispozitive fără permisiunea de a scana rețeaua locală. Acordă această permisiune în setări.'; + @override + String get gotoSettings => 'Setări'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$ro extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Scrie un mesaj'; + @override + String get multiline => 'Multi-linie'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$ro extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Niciun fișier selectat'; + @override + String get content => 'Selectează cel puțin un fișier.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$ro extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Fără permisiune'; + @override + String get content => 'Nu ai acordat permisiunile necesare. Acordă-le în setări.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$ro extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nu este disponibil'; + @override + String get content => 'Această funcție este disponibilă doar pe:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$ro extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Cod QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$ro extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Acțiuni rapide'; + @override + String get counter => 'Contor'; + @override + String get prefix => 'Prefix'; + @override + String get padZero => 'Completează cu zerouri'; + @override + String get sortBeforeCount => 'Sortează alfabetic înainte'; + @override + String get random => 'Aleatoriu'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$ro extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Cererile de fișiere sunt acceptate automat. Fii atent oricine din rețeaua locală îți poate trimite fișiere.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$ro extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Cererile de fișiere sunt acum acceptate automat de la dispozitivele din lista dispozitivelor favorite.', + 'Atenție! În prezent, aceasta nu este complet securizată, deoarece un hacker care are amprente pe oricare dintre dispozitivele din lista ta de favorite poate trimite fișiere fără restricții.', + 'Oricum ar fi, această opțiune este mult mai sigură decât să permiți utilizatorilor din rețeaua locală să trimită fișiere fără restricții.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$ro extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Introdu codul PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$ro extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'Moduri de trimitere'; + @override + String get single => 'Trimite fișiere unui singur destinatar. Selecția va fi golită după ce transferul este finalizat.'; + @override + String get multiple => 'Trimite fișiere la mai mulți destinatari. Selecția nu va fi ștearsă după transferul de fișiere terminate.'; + @override + String get link => 'Destinatarii care nu au LocalSend instalat pot descărca fișierele selectate prin deschiderea linkului în browserul lor.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$ro extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$ro extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; + @override + String get dark => 'Întuneric'; + @override + String get light => 'Luminoasă'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$ro extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$ro extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$ro extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String get all => 'Toate'; + @override + String get filtered => 'Filtrat'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$ro extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$ro._(TranslationsRo root) : this._root = root, super.internal(root); + + final TranslationsRo _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Progres total (${time})'; + @override + String get finishedError => 'Finalizat cu eroare'; + @override + String get canceledSender => 'Anulat de expeditor'; + @override + String get canceledReceiver => 'Anulat de către destinatar'; +} diff --git a/app/lib/gen/strings_ru.g.dart b/app/lib/gen/strings_ru.g.dart new file mode 100644 index 0000000..c523b0e --- /dev/null +++ b/app/lib/gen/strings_ru.g.dart @@ -0,0 +1,1437 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsRu extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsRu({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ru, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsRu _root = this; // ignore: unused_field + + @override + TranslationsRu $copyWith({TranslationMetadata? meta}) => TranslationsRu(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Русский'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$ru general = _Translations$general$ru._(_root); + @override + late final _Translations$receiveTab$ru receiveTab = _Translations$receiveTab$ru._(_root); + @override + late final _Translations$sendTab$ru sendTab = _Translations$sendTab$ru._(_root); + @override + late final _Translations$settingsTab$ru settingsTab = _Translations$settingsTab$ru._(_root); + @override + late final _Translations$troubleshootPage$ru troubleshootPage = _Translations$troubleshootPage$ru._(_root); + @override + late final _Translations$receiveHistoryPage$ru receiveHistoryPage = _Translations$receiveHistoryPage$ru._(_root); + @override + late final _Translations$apkPickerPage$ru apkPickerPage = _Translations$apkPickerPage$ru._(_root); + @override + late final _Translations$selectedFilesPage$ru selectedFilesPage = _Translations$selectedFilesPage$ru._(_root); + @override + late final _Translations$receivePage$ru receivePage = _Translations$receivePage$ru._(_root); + @override + late final _Translations$receiveOptionsPage$ru receiveOptionsPage = _Translations$receiveOptionsPage$ru._(_root); + @override + late final _Translations$sendPage$ru sendPage = _Translations$sendPage$ru._(_root); + @override + late final _Translations$progressPage$ru progressPage = _Translations$progressPage$ru._(_root); + @override + late final _Translations$webSharePage$ru webSharePage = _Translations$webSharePage$ru._(_root); + @override + late final _Translations$aboutPage$ru aboutPage = _Translations$aboutPage$ru._(_root); + @override + late final _Translations$donationPage$ru donationPage = _Translations$donationPage$ru._(_root); + @override + late final _Translations$changelogPage$ru changelogPage = _Translations$changelogPage$ru._(_root); + @override + late final _Translations$dialogs$ru dialogs = _Translations$dialogs$ru._(_root); + @override + late final _Translations$sanitization$ru sanitization = _Translations$sanitization$ru._(_root); + @override + late final _Translations$tray$ru tray = _Translations$tray$ru._(_root); + @override + late final _Translations$web$ru web = _Translations$web$ru._(_root); + @override + late final _Translations$assetPicker$ru assetPicker = _Translations$assetPicker$ru._(_root); + @override + late final _Translations$networkInterfacesPage$ru networkInterfacesPage = _Translations$networkInterfacesPage$ru._(_root); +} + +// Path: general +class _Translations$general$ru extends Translations$general$en { + _Translations$general$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Принять'; + @override + String get accepted => 'Принято'; + @override + String get add => 'Добавить'; + @override + String get advanced => 'Подробнее'; + @override + String get cancel => 'Отменить'; + @override + String get close => 'Закрыть'; + @override + String get confirm => 'Подтвердить'; + @override + String get continueStr => 'Продолжить'; + @override + String get copy => 'Копировать'; + @override + String get copiedToClipboard => 'Скопировано в буфер обмена'; + @override + String get decline => 'Отклонить'; + @override + String get done => 'Готово'; + @override + String get delete => 'Удалить'; + @override + String get edit => 'Редактировать'; + @override + String get error => 'Ошибка'; + @override + String get example => 'Пример'; + @override + String get files => 'Файлы'; + @override + String get finished => 'Завершено'; + @override + String get hide => 'Скрыть'; + @override + String get off => 'Отключено'; + @override + String get offline => 'Не в сети'; + @override + String get on => 'Включено'; + @override + String get online => 'В сети'; + @override + String get open => 'Открыть'; + @override + String get queue => 'Очередь'; + @override + String get quickSave => 'Быстрое сохранение'; + @override + String get quickSaveFromFavorites => 'Быстрое сохранение для "Избранных"'; + @override + String get renamed => 'Переименовано'; + @override + String get reset => 'Отменить изменения'; + @override + String get restart => 'Перезапустить'; + @override + String get settings => 'Настройки'; + @override + String get skipped => 'Отклонено'; + @override + String get start => 'Запустить'; + @override + String get stop => 'Остановить'; + @override + String get save => 'Сохранить'; + @override + String get unchanged => 'Без изменений'; + @override + String get unknown => 'Неизвестно'; + @override + String get noItemInClipboard => 'Буфер обмена пуст.'; +} + +// Path: receiveTab +class _Translations$receiveTab$ru extends Translations$receiveTab$en { + _Translations$receiveTab$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Получить'; + @override + late final _Translations$receiveTab$infoBox$ru infoBox = _Translations$receiveTab$infoBox$ru._(_root); + @override + late final _Translations$receiveTab$quickSave$ru quickSave = _Translations$receiveTab$quickSave$ru._(_root); +} + +// Path: sendTab +class _Translations$sendTab$ru extends Translations$sendTab$en { + _Translations$sendTab$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Отправить'; + @override + late final _Translations$sendTab$selection$ru selection = _Translations$sendTab$selection$ru._(_root); + @override + late final _Translations$sendTab$picker$ru picker = _Translations$sendTab$picker$ru._(_root); + @override + String get shareIntentInfo => 'Вы также можете воспользоваться функцией "Поделиться" на своем мобильном устройстве, чтобы быстрее выбирать файлы.'; + @override + String get nearbyDevices => 'Устройства поблизости'; + @override + String get thisDevice => 'Это устройство'; + @override + String get scan => 'Поиск устройств'; + @override + String get manualSending => 'Ручная отправка'; + @override + String get sendMode => 'Режим отправки'; + @override + late final _Translations$sendTab$sendModes$ru sendModes = _Translations$sendTab$sendModes$ru._(_root); + @override + String get sendModeHelp => 'Справка'; + @override + String get help => 'Пожалуйста, убедитесь, что получатель находится в той же Wi-Fi сети, что и отправитель.'; + @override + String get placeItems => 'Добавьте файлы, чтобы поделиться.'; +} + +// Path: settingsTab +class _Translations$settingsTab$ru extends Translations$settingsTab$en { + _Translations$settingsTab$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Настройки'; + @override + late final _Translations$settingsTab$general$ru general = _Translations$settingsTab$general$ru._(_root); + @override + late final _Translations$settingsTab$receive$ru receive = _Translations$settingsTab$receive$ru._(_root); + @override + late final _Translations$settingsTab$send$ru send = _Translations$settingsTab$send$ru._(_root); + @override + late final _Translations$settingsTab$network$ru network = _Translations$settingsTab$network$ru._(_root); + @override + late final _Translations$settingsTab$other$ru other = _Translations$settingsTab$other$ru._(_root); + @override + String get advancedSettings => 'Расширенные настройки'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$ru extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Устранение неисправностей'; + @override + String get subTitle => 'Приложение не работает должным образом? Здесь вы можете найти некоторые распространенные решения проблем.'; + @override + String get solution => 'Решение:'; + @override + String get fixButton => 'Исправить автоматически'; + @override + late final _Translations$troubleshootPage$firewall$ru firewall = _Translations$troubleshootPage$firewall$ru._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$ru noDiscovery = _Translations$troubleshootPage$noDiscovery$ru._(_root); + @override + late final _Translations$troubleshootPage$noConnection$ru noConnection = _Translations$troubleshootPage$noConnection$ru._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$ru extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'История'; + @override + String get openFolder => 'Открыть папку'; + @override + String get deleteHistory => 'Очистить историю'; + @override + String get empty => 'История пуста.'; + @override + late final _Translations$receiveHistoryPage$entryActions$ru entryActions = _Translations$receiveHistoryPage$entryActions$ru._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$ru extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Приложения (APK)'; + @override + String get excludeSystemApps => 'Исключить системные приложения'; + @override + String get excludeAppsWithoutLaunchIntent => 'Исключить незапускаемые приложения'; + @override + String apps({required Object n}) => '${n} приложений'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$ru extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Удалить все'; +} + +// Path: receivePage +class _Translations$receivePage$ru extends Translations$receivePage$en { + _Translations$receivePage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ru'))( + n, + one: 'хочет отправить вам файл', + other: 'хочет отправить вам ${n} файлы (-ов)', + ); + @override + String get subTitleMessage => 'отправил вам сообщение:'; + @override + String get subTitleLink => 'отправил вам ссылку:'; + @override + String get canceled => 'Отправитель отменил запрос на передачу файлов.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$ru extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Параметры получения'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(Папка LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Отключено автоматически, поскольку есть папки.'; +} + +// Path: sendPage +class _Translations$sendPage$ru extends Translations$sendPage$en { + _Translations$sendPage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Ожидание ответа…'; + @override + String get rejected => 'Получатель отклонил запрос.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Получатель занят другим запросом.'; +} + +// Path: progressPage +class _Translations$progressPage$ru extends Translations$progressPage$en { + _Translations$progressPage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Отправка файлов'; + @override + String get titleReceiving => 'Получение файлов'; + @override + String get savedToGallery => 'Сохранено в галереи'; + @override + late final _Translations$progressPage$total$ru total = _Translations$progressPage$total$ru._(_root); + @override + late final _Translations$progressPage$remainingTime$ru remainingTime = _Translations$progressPage$remainingTime$ru._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$ru extends Translations$webSharePage$en { + _Translations$webSharePage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Поделиться по ссылке'; + @override + String get loading => 'Запуск сервера…'; + @override + String get stopping => 'Остановка сервера…'; + @override + String get error => 'При запуске сервера произошла ошибка.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ru'))( + n, + one: 'Откройте эту ссылку в браузере:', + other: 'Откройте одну из этих ссылок в браузере:', + ); + @override + String get requests => 'Запросы'; + @override + String get noRequests => 'Запросов пока нет.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Автоматически принимать запросы'; + @override + String get requirePin => 'Требовать PIN-код'; + @override + String pinHint({required Object pin}) => 'PIN-код: "${pin}"'; + @override + String get encryptionHint => 'LocalSend использует самоподписанный сертификат. Вам необходимо принять его в браузере.'; + @override + String pendingRequests({required Object n}) => 'Ожидающие запросы: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$ru extends Translations$aboutPage$en { + _Translations$aboutPage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'О LocalSend'; + @override + List get description => [ + 'LocalSend — это бесплатное приложение с открытым исходным кодом, которое позволяет вам безопасно обмениваться файлами и сообщениями с находящимися поблизости устройствами через локальную сеть, без необходимости подключения к Интернету.', + 'Это приложение доступно для Android, iOS, macOS, Windows и Linux. Вы можете найти все варианты загрузки на официальной домашней странице.', + ]; + @override + String get author => 'Автор'; + @override + String get contributors => 'Участники'; + @override + String get packagers => 'Сборщики'; + @override + String get translators => 'Переводчики'; +} + +// Path: donationPage +class _Translations$donationPage$ru extends Translations$donationPage$en { + _Translations$donationPage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Пожертвовать'; + @override + String get info => + 'LocalSend — это бесплатное приложение с открытым исходным кодом и без рекламы. Если оно вам нравится, вы можете поддержать его разработку пожертвованием.'; + @override + String donate({required Object amount}) => 'Пожертвовать ${amount}'; + @override + String get thanks => 'Большое спасибо!'; + @override + String get restore => 'Восстановить покупку'; +} + +// Path: changelogPage +class _Translations$changelogPage$ru extends Translations$changelogPage$en { + _Translations$changelogPage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'История изменений'; +} + +// Path: dialogs +class _Translations$dialogs$ru extends Translations$dialogs$en { + _Translations$dialogs$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$ru addFile = _Translations$dialogs$addFile$ru._(_root); + @override + late final _Translations$dialogs$openFile$ru openFile = _Translations$dialogs$openFile$ru._(_root); + @override + late final _Translations$dialogs$addressInput$ru addressInput = _Translations$dialogs$addressInput$ru._(_root); + @override + late final _Translations$dialogs$cancelSession$ru cancelSession = _Translations$dialogs$cancelSession$ru._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$ru cannotOpenFile = _Translations$dialogs$cannotOpenFile$ru._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$ru encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$ru._(_root); + @override + late final _Translations$dialogs$errorDialog$ru errorDialog = _Translations$dialogs$errorDialog$ru._(_root); + @override + late final _Translations$dialogs$favoriteDialog$ru favoriteDialog = _Translations$dialogs$favoriteDialog$ru._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$ru favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$ru._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$ru favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$ru._(_root); + @override + late final _Translations$dialogs$fileInfo$ru fileInfo = _Translations$dialogs$fileInfo$ru._(_root); + @override + late final _Translations$dialogs$fileNameInput$ru fileNameInput = _Translations$dialogs$fileNameInput$ru._(_root); + @override + late final _Translations$dialogs$historyClearDialog$ru historyClearDialog = _Translations$dialogs$historyClearDialog$ru._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$ru localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$ru._(_root); + @override + late final _Translations$dialogs$messageInput$ru messageInput = _Translations$dialogs$messageInput$ru._(_root); + @override + late final _Translations$dialogs$noFiles$ru noFiles = _Translations$dialogs$noFiles$ru._(_root); + @override + late final _Translations$dialogs$noPermission$ru noPermission = _Translations$dialogs$noPermission$ru._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$ru notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$ru._(_root); + @override + late final _Translations$dialogs$qr$ru qr = _Translations$dialogs$qr$ru._(_root); + @override + late final _Translations$dialogs$quickActions$ru quickActions = _Translations$dialogs$quickActions$ru._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$ru quickSaveNotice = _Translations$dialogs$quickSaveNotice$ru._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$ru quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$ru._(_root); + @override + late final _Translations$dialogs$pin$ru pin = _Translations$dialogs$pin$ru._(_root); + @override + late final _Translations$dialogs$sendModeHelp$ru sendModeHelp = _Translations$dialogs$sendModeHelp$ru._(_root); + @override + late final _Translations$dialogs$zoom$ru zoom = _Translations$dialogs$zoom$ru._(_root); +} + +// Path: sanitization +class _Translations$sanitization$ru extends Translations$sanitization$en { + _Translations$sanitization$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Имя файла не может быть пустым'; + @override + String get invalid => 'Имя файла содержит недопустимые символы'; +} + +// Path: tray +class _Translations$tray$ru extends Translations$tray$en { + _Translations$tray$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Выйти из LocalSend'; + @override + String get closeWindows => 'Выйти'; +} + +// Path: web +class _Translations$web$ru extends Translations$web$en { + _Translations$web$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Введите PIN-код'; + @override + String get invalidPin => 'Неверный PIN-код'; + @override + String get tooManyAttempts => 'Слишком много попыток'; + @override + String get rejected => 'Отклонено'; + @override + String get files => 'Файлов'; + @override + String get fileName => 'Имя файла'; + @override + String get size => 'Размер'; +} + +// Path: assetPicker +class _Translations$assetPicker$ru extends Translations$assetPicker$en { + _Translations$assetPicker$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Подтвердить'; + @override + String get cancel => 'Отменить'; + @override + String get edit => 'Редактировать'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Не удалось загрузить'; + @override + String get original => 'Оригинал'; + @override + String get preview => 'Предпросмотр'; + @override + String get select => 'Выбрать'; + @override + String get emptyList => 'Список пуст'; + @override + String get unSupportedAssetType => 'Неподдерживаемый тип файла.'; + @override + String get unableToAccessAll => 'Не удалось получить доступ ко всем файлам на устройстве'; + @override + String get viewingLimitedAssetsTip => 'Приложение может просматривать только файлы и альбомы, к которым у него есть доступ.'; + @override + String get changeAccessibleLimitedAssets => 'Разрешить доступ к дополнительным файлам'; + @override + String get accessAllTip => + 'Приложение имеет доступ только к некоторым файлам на устройстве. Перейдите к системным настройкам и разрешите приложению получить доступ ко всем медиафайлам на устройстве.'; + @override + String get goToSystemSettings => 'Перейти к системным настройкам'; + @override + String get accessLimitedAssets => 'Продолжить с ограниченным доступом'; + @override + String get accessiblePathName => 'Доступные файлы'; + @override + String get sTypeAudioLabel => 'Аудио'; + @override + String get sTypeImageLabel => 'Изображение'; + @override + String get sTypeVideoLabel => 'Видео'; + @override + String get sTypeOtherLabel => 'Другие медиафайлы'; + @override + String get sActionPlayHint => 'воспроизвести'; + @override + String get sActionPreviewHint => 'предпросмотр'; + @override + String get sActionSelectHint => 'выбрать'; + @override + String get sActionSwitchPathLabel => 'изменить путь'; + @override + String get sActionUseCameraHint => 'использовать камеру'; + @override + String get sNameDurationLabel => 'продолжительность'; + @override + String get sUnitAssetCountLabel => 'количество'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$ru extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Сетевые интерфейсы'; + @override + String get preview => 'Предосмотр'; + @override + String get whitelist => 'Белый список'; + @override + String get blacklist => 'Черный список'; + @override + String get info => + 'По умолчанию, LocalSend использует все доступные сетевые интерфейсы. Вы можете исключить нежелательные сети здесь. Необходимо перезапустить сервер для применения изменений.'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$ru extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Порт:'; + @override + String get alias => 'Имя устройства:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$ru extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Избранное'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$ru extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Выборка'; + @override + String files({required Object files}) => 'Файлов: ${files}'; + @override + String size({required Object size}) => 'Размер: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$ru extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get file => 'Файл'; + @override + String get folder => 'Папка'; + @override + String get media => 'Медиа'; + @override + String get text => 'Текст'; + @override + String get app => 'Приложение'; + @override + String get clipboard => 'Вставить'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$ru extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get single => 'Один получатель'; + @override + String get multiple => 'Несколько получателей'; + @override + String get link => 'Поделиться по ссылке'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$ru extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Общие'; + @override + String get brightness => 'Тема'; + @override + late final _Translations$settingsTab$general$brightnessOptions$ru brightnessOptions = _Translations$settingsTab$general$brightnessOptions$ru._( + _root, + ); + @override + String get color => 'Цвет'; + @override + late final _Translations$settingsTab$general$colorOptions$ru colorOptions = _Translations$settingsTab$general$colorOptions$ru._(_root); + @override + String get language => 'Язык'; + @override + late final _Translations$settingsTab$general$languageOptions$ru languageOptions = _Translations$settingsTab$general$languageOptions$ru._(_root); + @override + String get saveWindowPlacement => 'Сохранять расположение окна после выхода'; + @override + String get saveWindowPlacementWindows => 'Сохранять расположение окна после выхода'; + @override + String get minimizeToTray => 'Сворачивать в системный трей/строку меню при закрытии'; + @override + String get launchAtStartup => 'Автозагрузка'; + @override + String get launchMinimized => 'Скрытая автозагрузка'; + @override + String get showInContextMenu => 'Отображать LocalSend в контекстном меню'; + @override + String get animations => 'Анимации'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$ru extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Получение'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Автозавершение'; + @override + String get destination => 'Сохранять в папку'; + @override + String get downloads => '(Загрузки)'; + @override + String get saveToGallery => 'Сохранять медиафайлы в галерею'; + @override + String get saveToHistory => 'Сохранять историю'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$ru extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Отправка'; + @override + String get shareViaLinkAutoAccept => 'Автоматически принимать запросы в режиме "Поделиться по ссылке"'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$ru extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Сеть'; + @override + String get needRestart => 'Для применения изменений необходимо перезапустить сервер!'; + @override + String get server => 'Сервер'; + @override + String get alias => 'Имя устройства'; + @override + String get deviceType => 'Тип устройства'; + @override + String get deviceModel => 'Модель устройства'; + @override + String get port => 'Порт'; + @override + String get discoveryTimeout => 'Тайм-аут поиска'; + @override + String get useSystemName => 'Использовать системное имя'; + @override + String get generateRandomAlias => 'Сгенерировать случайный псевдоним'; + @override + String portWarning({required Object defaultPort}) => + 'Другие устройства могут вас не найти, поскольку вы используете другой, собственный порт. (default: ${defaultPort})'; + @override + String get encryption => 'Шифрование'; + @override + String get multicastGroup => 'Адрес мультивещание'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Другие устройства могут вас не найти, поскольку вы используете другой, собственный адрес мультивещания. (default: ${defaultMulticast})'; + @override + String get network => 'Сеть'; + @override + late final _Translations$settingsTab$network$networkOptions$ru networkOptions = _Translations$settingsTab$network$networkOptions$ru._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$ru extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Другое'; + @override + String get support => 'Поддержать LocalSend'; + @override + String get donate => 'Пожертвовать'; + @override + String get privacyPolicy => 'Политика конфиденциальности'; + @override + String get termsOfUse => 'Условия использования'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$ru extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get symptom => + 'Это устройство может отправлять файлы на другие устройства, но другие устройства не могут отправлять файлы на это устройство.'; + @override + String solution({required Object port}) => + 'Скорее всего, это проблема брандмауэра. Вы можете решить эту проблему, разрешив входящие соединения (UDP и TCP) для порта ${port}.'; + @override + String get openFirewall => 'Открыть брандмауэр'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$ru extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Это устройство не может найти другие устройства.'; + @override + String get solution => + 'Пожалуйста, убедитесь, что оба устройства находятся в одной Wi-Fi сети и имеют одинаковую конфигурацию (порт, адрес мультивещания, шифрование). Вы можете попробовать ввести IP-адрес целевого устройства вручную. Если это сработает, подумайте о том, чтобы добавить это устройство в избранное, чтобы его можно было автоматически находить в будущем.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$ru extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Оба устройства не могут найти друг друга и не могут обмениваться файлами.'; + @override + String get solution => + 'Проблема существует с обеих сторон? Итак, вам нужно убедиться, что оба устройства находятся в одной Wi-Fi сети и имеют одинаковую конфигурацию (порт, адрес мультивещания, шифрование). Сеть Wi-Fi может не разрешать обмен (передачу) между участниками. В этом случае, вам необходимо включить эту опцию на своем маршрутизаторе.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$ru extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get open => 'Открыть файл'; + @override + String get showInFolder => 'Показать в папке'; + @override + String get info => 'Информация'; + @override + String get deleteFromHistory => 'Удалить из истории'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$ru extends Translations$progressPage$total$en { + _Translations$progressPage$total$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$ru title = _Translations$progressPage$total$title$ru._(_root); + @override + String count({required Object curr, required Object n}) => 'Файлов: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Размер: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Скорость: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$ru extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Используйте "h" для обозначения часов, а "m" для минут + @override + String hours({required Object h, required Object m}) => '${h}ч ${m}мин'; + + /// Используйте "d" для дней, "h" для часов и "m" для минут + @override + String days({required Object d, required Object h, required Object m}) => '${d}д ${h}ч ${m}мин'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$ru extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Добавить в выборку'; + @override + String get content => 'Что вы хотите добавить?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$ru extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Открыть файл'; + @override + String get content => 'Хотите открыть полученный файл?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$ru extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Введите адрес'; + @override + String get hashtag => 'Хэштег'; + @override + String get ip => 'IP-адрес'; + @override + String get recentlyUsed => 'Недавно использованные: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$ru extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Отменить отправку файлов'; + @override + String get content => 'Вы действительно хотите отменить отправку файлов?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$ru extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Не удалось открыть файл'; + @override + String content({required Object file}) => 'Не удалось открыть "${file}". Возможно, этот файл был перемещен, переименован или удален?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$ru extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Шифрование отключено'; + @override + String get content => 'Связь теперь происходит по незашифрованному HTTP протоколу. Чтобы использовать протокол HTTPS, снова включите шифрование.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$ru extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$ru extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Избранное'; + @override + String get noFavorites => 'Избранных устройств пока нет.'; + @override + String get addFavorite => 'Добавить'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$ru extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Удалить из избранных'; + @override + String content({required Object name}) => 'Вы действительно хотите удалить из избранных "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$ru extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Добавить в избранное'; + @override + String get titleEdit => 'Настройки'; + @override + String get name => 'Имя устройства'; + @override + String get auto => '(автоматически)'; + @override + String get ip => 'IP-адрес'; + @override + String get port => 'Порт'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$ru extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'О файле'; + @override + String get fileName => 'Имя файла:'; + @override + String get path => 'Путь:'; + @override + String get size => 'Размер:'; + @override + String get sender => 'Отправитель:'; + @override + String get time => 'Время:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$ru extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Введите имя файла'; + @override + String original({required Object original}) => 'Оригинальное имя файла: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$ru extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Очистить историю'; + @override + String get content => 'Вы действительно хотите удалить всю историю?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$ru extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend не может найти другие устройства без разрешения на сканирование локальной сети. Пожалуйста, предоставьте это разрешение в настройках.'; + @override + String get gotoSettings => 'Настройки'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$ru extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Введите сообщение'; + @override + String get multiline => 'Многострочное'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$ru extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Не выбрано ни одного файла'; + @override + String get content => 'Пожалуйста, добавьте как минимум один файл.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$ru extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Нет разрешения'; + @override + String get content => 'Вы не предоставили необходимые разрешения. Пожалуйста, предоставьте их в настройках.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$ru extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Недоступно'; + @override + String get content => 'Эта функция доступна только на:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$ru extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR-код'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$ru extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Быстрые действия'; + @override + String get counter => 'Счетчик'; + @override + String get prefix => 'Префикс'; + @override + String get padZero => 'Добавить нули в начале'; + @override + String get sortBeforeCount => 'Отсортировать по алфавиту (А-Я)'; + @override + String get random => 'Случайно'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$ru extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Запросы на получение файлов теперь принимаются автоматически. Будьте осторожны, все пользователи этой локальной сети могут отправлять вам файлы.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$ru extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Запросы на получение файлов теперь принимаются автоматически от устройств из вашего списка избранных.', + 'Предупреждение! На данный момент, это не совсем безопасно, поскольку хакер, имеющий отпечаток пальца любого устройства из вашего списка избранных, может беспрепятственно отправлять вам файлы.', + 'Однако, этот вариант все равно безопаснее, чем разрешить всем пользователям локальной сети беспрепятственно отправлять вам файлы.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$ru extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Введите PIN-код'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$ru extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'Режимы отправки'; + @override + String get single => 'Отправляет файлы одному получателю. Выборка будет очищена после завершения передачи файлов.'; + @override + String get multiple => 'Отправляет файлы нескольким получателям. Выборка не будет очищена после завершения передачи файлов.'; + @override + String get link => 'Получатели, у которых не установлен LocalSend, могут загрузить выбранные файлы, открыв ссылку в своем браузере.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$ru extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL-адрес'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$ru extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get system => 'Системная'; + @override + String get dark => 'Темная'; + @override + String get light => 'Светлая'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$ru extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get system => 'Системный'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$ru extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get system => 'Системный'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$ru extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String get all => 'Все'; + @override + String get filtered => 'Фильтровано'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$ru extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$ru._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Общее время передачи (${time})'; + @override + String get finishedError => 'Завершено с ошибкой'; + @override + String get canceledSender => 'Отменено отправителем'; + @override + String get canceledReceiver => 'Отменено получателем'; +} diff --git a/app/lib/gen/strings_si.g.dart b/app/lib/gen/strings_si.g.dart new file mode 100644 index 0000000..4a44a3c --- /dev/null +++ b/app/lib/gen/strings_si.g.dart @@ -0,0 +1,1415 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsSi extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsSi({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.si, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsSi _root = this; // ignore: unused_field + + @override + TranslationsSi $copyWith({TranslationMetadata? meta}) => TranslationsSi(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'සිංහල'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$si general = _Translations$general$si._(_root); + @override + late final _Translations$receiveTab$si receiveTab = _Translations$receiveTab$si._(_root); + @override + late final _Translations$sendTab$si sendTab = _Translations$sendTab$si._(_root); + @override + late final _Translations$settingsTab$si settingsTab = _Translations$settingsTab$si._(_root); + @override + late final _Translations$troubleshootPage$si troubleshootPage = _Translations$troubleshootPage$si._(_root); + @override + late final _Translations$receiveHistoryPage$si receiveHistoryPage = _Translations$receiveHistoryPage$si._(_root); + @override + late final _Translations$apkPickerPage$si apkPickerPage = _Translations$apkPickerPage$si._(_root); + @override + late final _Translations$selectedFilesPage$si selectedFilesPage = _Translations$selectedFilesPage$si._(_root); + @override + late final _Translations$receivePage$si receivePage = _Translations$receivePage$si._(_root); + @override + late final _Translations$receiveOptionsPage$si receiveOptionsPage = _Translations$receiveOptionsPage$si._(_root); + @override + late final _Translations$sendPage$si sendPage = _Translations$sendPage$si._(_root); + @override + late final _Translations$progressPage$si progressPage = _Translations$progressPage$si._(_root); + @override + late final _Translations$webSharePage$si webSharePage = _Translations$webSharePage$si._(_root); + @override + late final _Translations$aboutPage$si aboutPage = _Translations$aboutPage$si._(_root); + @override + late final _Translations$donationPage$si donationPage = _Translations$donationPage$si._(_root); + @override + late final _Translations$changelogPage$si changelogPage = _Translations$changelogPage$si._(_root); + @override + late final _Translations$dialogs$si dialogs = _Translations$dialogs$si._(_root); + @override + late final _Translations$sanitization$si sanitization = _Translations$sanitization$si._(_root); + @override + late final _Translations$tray$si tray = _Translations$tray$si._(_root); + @override + late final _Translations$web$si web = _Translations$web$si._(_root); + @override + late final _Translations$assetPicker$si assetPicker = _Translations$assetPicker$si._(_root); + @override + late final _Translations$networkInterfacesPage$si networkInterfacesPage = _Translations$networkInterfacesPage$si._(_root); +} + +// Path: general +class _Translations$general$si extends Translations$general$en { + _Translations$general$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get accept => 'පිළිගන්න'; + @override + String get accepted => 'පිළිගත්'; + @override + String get add => 'ඇඩ් කරන්න'; + @override + String get advanced => 'ගැඹුරු'; + @override + String get cancel => 'අවලංගු කරන්න'; + @override + String get close => 'වසා දමන්න'; + @override + String get confirm => 'තහවුරු කරන්න'; + @override + String get continueStr => 'ඉදිරියට'; + @override + String get copy => 'කොපි කරන්න'; + @override + String get copiedToClipboard => 'Clipboard වෙත කොපි කරන ලදි'; + @override + String get decline => 'ප්‍රතික්ෂේප කරන්න'; + @override + String get done => 'සම්පූර්ණයි'; + @override + String get delete => 'මකන්න'; + @override + String get edit => 'සංස්කරණය'; + @override + String get error => 'දෝෂය'; + @override + String get example => 'උදාහරණය'; + @override + String get files => 'ගොනු'; + @override + String get finished => 'අවසන්'; + @override + String get hide => 'සඟවන්න'; + @override + String get off => 'ඕෆ් (Off)'; + @override + String get offline => 'ඕෆ්ලයින්'; + @override + String get on => 'ඔන් (On)'; + @override + String get online => 'ඔන්ලයින්'; + @override + String get open => 'විවෘත කරන්න'; + @override + String get queue => 'පෝලිම'; + @override + String get quickSave => 'Quick සේව්'; + @override + String get quickSaveFromFavorites => '"ප්‍රියතම" සඳහා Quick සේව් කරන්න'; + @override + String get renamed => 'නම වෙනස් කරන ලදි'; + @override + String get reset => 'වෙනස්කම් අහෝසි කරන්න'; + @override + String get restart => 'නැවත ආරම්භ කරන්න'; + @override + String get settings => 'සැකසුම්'; + @override + String get skipped => 'මග හරින ලදි'; + @override + String get start => 'ආරම්භ කරන්න'; + @override + String get stop => 'නවත්වන්න'; + @override + String get save => 'සේව් කරන්න'; + @override + String get unchanged => 'නොවෙනස්'; + @override + String get unknown => 'නොදන්නා'; + @override + String get noItemInClipboard => 'Clipboard හි අයිතම නැත.'; +} + +// Path: receiveTab +class _Translations$receiveTab$si extends Translations$receiveTab$en { + _Translations$receiveTab$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ලබාගන්න'; + @override + late final _Translations$receiveTab$infoBox$si infoBox = _Translations$receiveTab$infoBox$si._(_root); + @override + late final _Translations$receiveTab$quickSave$si quickSave = _Translations$receiveTab$quickSave$si._(_root); +} + +// Path: sendTab +class _Translations$sendTab$si extends Translations$sendTab$en { + _Translations$sendTab$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'යවන්න'; + @override + late final _Translations$sendTab$selection$si selection = _Translations$sendTab$selection$si._(_root); + @override + late final _Translations$sendTab$picker$si picker = _Translations$sendTab$picker$si._(_root); + @override + String get shareIntentInfo => 'ඔබට වඩාත් පහසුවෙන් ගොනු තේරීමට ඔබගේ ජංගම උපාංගයේ "Share" විශේෂාංගය භාවිතා කළ හැක.'; + @override + String get nearbyDevices => 'ආසන්න උපාංග'; + @override + String get thisDevice => 'මෙම උපාංගය'; + @override + String get scan => 'උපාංග සොයන්න'; + @override + String get manualSending => 'Manual යැවීම'; + @override + String get sendMode => 'යැවීමේ ක්‍රමය'; + @override + late final _Translations$sendTab$sendModes$si sendModes = _Translations$sendTab$sendModes$si._(_root); + @override + String get sendModeHelp => 'පැහැදිලි කිරීම'; + @override + String get help => 'කරුණාකර ලබන්නාගේ උපාංගය හා ඔබේ උපාංගය එකම Wi-Fi ජාලයේ ඇති බව සහතික කර ගන්න.'; + @override + String get placeItems => 'බෙදා (Share) ගැනීමට අවශ්‍ය දේ තබන්න.'; +} + +// Path: settingsTab +class _Translations$settingsTab$si extends Translations$settingsTab$en { + _Translations$settingsTab$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'සැකසුම්'; + @override + late final _Translations$settingsTab$general$si general = _Translations$settingsTab$general$si._(_root); + @override + late final _Translations$settingsTab$receive$si receive = _Translations$settingsTab$receive$si._(_root); + @override + late final _Translations$settingsTab$send$si send = _Translations$settingsTab$send$si._(_root); + @override + late final _Translations$settingsTab$network$si network = _Translations$settingsTab$network$si._(_root); + @override + late final _Translations$settingsTab$other$si other = _Translations$settingsTab$other$si._(_root); + @override + String get advancedSettings => 'ගැඹුරු සැකසුම්'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$si extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ගැටලු විසඳන්න'; + @override + String get subTitle => 'යෙදුම අපේක්ෂිත පරිදි ක්‍රියා නොකරන්නේද? මෙහි පොදු ගැටලු සඳහා විසඳුම් සොයා ගත හැක.'; + @override + String get solution => 'විසඳුම:'; + @override + String get fixButton => 'ස්වයංක්‍රීයව නිවැරදි කරන්න'; + @override + late final _Translations$troubleshootPage$firewall$si firewall = _Translations$troubleshootPage$firewall$si._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$si noDiscovery = _Translations$troubleshootPage$noDiscovery$si._(_root); + @override + late final _Translations$troubleshootPage$noConnection$si noConnection = _Translations$troubleshootPage$noConnection$si._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$si extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ඉතිහාසය'; + @override + String get openFolder => 'ෆෝල්ඩරය විවෘත කරන්න'; + @override + String get deleteHistory => 'ඉතිහාසය මකන්න'; + @override + String get empty => 'ඉතිහාසයේ කිසිවක් නැත.'; + @override + late final _Translations$receiveHistoryPage$entryActions$si entryActions = _Translations$receiveHistoryPage$entryActions$si._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$si extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ඇප් (APK)'; + @override + String get excludeSystemApps => 'පද්ධති යෙදුම් (System Apps) බැහැර කරන්න'; + @override + String get excludeAppsWithoutLaunchIntent => 'ක්‍රියාත්මක කිරීමට නොහැකි ඇප් බැහැර කරන්න'; + @override + String apps({required Object n}) => 'ඇප් ${n}'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$si extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'සියල්ල මකන්න'; +} + +// Path: receivePage +class _Translations$receivePage$si extends Translations$receivePage$en { + _Translations$receivePage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('si'))( + n, + one: 'ඔබට ගොනුවක් එවීමට කැමතියි', + other: 'ඔබට ගොනු ${n} එවීමට කැමතියි', + ); + @override + String get subTitleMessage => 'ඔබට පණිවිඩයක් එවා ඇත:'; + @override + String get subTitleLink => 'ඔබට ලින්ක් (Link) එකක් එවා ඇත:'; + @override + String get canceled => 'යවන්නා ඉල්ලීම අවලංගු කර ඇත.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$si extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'විකල්ප'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend ෆෝල්ඩරය)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'ෆෝල්ඩර් නොමැති බැවින් ස්වයංක්‍රීයව ක්‍රියා විරහිත කරන ලදි.'; +} + +// Path: sendPage +class _Translations$sendPage$si extends Translations$sendPage$en { + _Translations$sendPage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'ප්‍රතිචාරයක් බලාපොරොත්තු වෙමින්…'; + @override + String get rejected => 'ලැබුම්කරු ඉල්ලීම ප්‍රතික්ෂේප කර ඇත.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'ලැබුම්කරු වෙනත් ඉල්ලීමක් නිසා කාර්‍යබහුලව ඇත.'; +} + +// Path: progressPage +class _Translations$progressPage$si extends Translations$progressPage$en { + _Translations$progressPage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'ගොනු යවමින්'; + @override + String get titleReceiving => 'ගොනු ලබා ගනිමින්'; + @override + String get savedToGallery => 'Photos තුළ සේව් කරන ලදි'; + @override + late final _Translations$progressPage$total$si total = _Translations$progressPage$total$si._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$si extends Translations$webSharePage$en { + _Translations$webSharePage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ලින්ක් (Link) ඔස්සේ බෙදාගන්න (Share)'; + @override + String get loading => 'සේවාදායකය ආරම්භ කරමින්…'; + @override + String get stopping => 'සේවාදායකය නවතමින්…'; + @override + String get error => 'සේවාදායකය ආරම්භ කිරීමේදී දෝෂයක් සිදු විය.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('si'))( + n, + one: 'මෙම ලින්ක් (Link) එක ඔබේ බ්‍රවුසරය (Browser) මගින් විවෘත කරන්න:', + other: 'මෙම ලින්ක් (Link) වලින් එකක් ඔබේ බ්‍රවුසරය (Browser) මගින් විවෘත කරන්න:', + ); + @override + String get requests => 'ඉල්ලීම්'; + @override + String get noRequests => 'තවමත් කිසිදු ඉල්ලීමක් නැත.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'ඉල්ලීම් ස්වයංක්‍රීයව පිළිගන්න'; + @override + String get requirePin => 'PIN අවශ්‍යයි'; + @override + String pinHint({required Object pin}) => 'PIN එක "${pin}"'; + @override + String get encryptionHint => + 'LocalSend self-signed certificate එකක් භාවිතා කරයි. ඔබ විසින් එය බ්‍රවුසරය (browser) තුළ දි පිළිගැනීම (accept) අවශ්‍ය වේ.'; + @override + String pendingRequests({required Object n}) => 'Pending වන ඉල්ලීම්: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$si extends Translations$aboutPage$en { + _Translations$aboutPage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'LocalSend පිළිබඳව'; + @override + List get description => [ + 'LocalSend යනු ඔබට අන්තර්ජාල සම්බන්ධතාවයක අවශ්‍යතාවයකින් තොරව, local ජාලයක් තුළ, සමීප උපාංග සමඟ ගොනු සහ පණිවිඩ ආරක්ෂිතව බෙදා ගත හැකි නිදහස්, විවෘත-මූලාශ්‍රය (Free and open-source) ඇප් එකකි.', + 'මෙම ඇප් එක Android, iOS, macOS, Windows සහ Linux සඳහා පවතියි. එය ඩවුන්ලෝඩ් (Download) කරගත හැකි ආකාර අපේ අඩවියේ මුල් පිටුවෙන් සොයාගත හැක.', + ]; + @override + String get author => 'කතෲ'; + @override + String get contributors => 'සහය දැක්වූවන්'; + @override + String get packagers => 'පැකේජ්ර්ස්'; + @override + String get translators => 'පරිවර්තකයන්'; +} + +// Path: donationPage +class _Translations$donationPage$si extends Translations$donationPage$en { + _Translations$donationPage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ආධාර කරන්න'; + @override + String get info => + 'LocalSend නිදහස්, විවෘත-මූලාශ්‍ර වන අතර කිසිදු වෙළඳ දැන්වීමකින් තොර වේ. ඔබ මෙම ඇප් එකට කැමැති නම්, මෙහි සංවර්ධනය සඳහා මූල්‍යමය දායකත්වයක් ලබා දී සහය ලබා දීමට හැක.'; + @override + String donate({required Object amount}) => 'දායකත්වය ${amount}'; + @override + String get thanks => 'ඔබට බොහොම ස්තූතියි!'; + @override + String get restore => 'මිලදී ගැනීම ප්‍රතිස්ථාපනය (Restore) කරන්න'; +} + +// Path: changelogPage +class _Translations$changelogPage$si extends Translations$changelogPage$en { + _Translations$changelogPage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'වෙනස්කම් ලේඛනය'; +} + +// Path: dialogs +class _Translations$dialogs$si extends Translations$dialogs$en { + _Translations$dialogs$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$si addFile = _Translations$dialogs$addFile$si._(_root); + @override + late final _Translations$dialogs$openFile$si openFile = _Translations$dialogs$openFile$si._(_root); + @override + late final _Translations$dialogs$addressInput$si addressInput = _Translations$dialogs$addressInput$si._(_root); + @override + late final _Translations$dialogs$cancelSession$si cancelSession = _Translations$dialogs$cancelSession$si._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$si cannotOpenFile = _Translations$dialogs$cannotOpenFile$si._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$si encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$si._(_root); + @override + late final _Translations$dialogs$errorDialog$si errorDialog = _Translations$dialogs$errorDialog$si._(_root); + @override + late final _Translations$dialogs$favoriteDialog$si favoriteDialog = _Translations$dialogs$favoriteDialog$si._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$si favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$si._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$si favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$si._(_root); + @override + late final _Translations$dialogs$fileInfo$si fileInfo = _Translations$dialogs$fileInfo$si._(_root); + @override + late final _Translations$dialogs$fileNameInput$si fileNameInput = _Translations$dialogs$fileNameInput$si._(_root); + @override + late final _Translations$dialogs$historyClearDialog$si historyClearDialog = _Translations$dialogs$historyClearDialog$si._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$si localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$si._(_root); + @override + late final _Translations$dialogs$messageInput$si messageInput = _Translations$dialogs$messageInput$si._(_root); + @override + late final _Translations$dialogs$noFiles$si noFiles = _Translations$dialogs$noFiles$si._(_root); + @override + late final _Translations$dialogs$noPermission$si noPermission = _Translations$dialogs$noPermission$si._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$si notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$si._(_root); + @override + late final _Translations$dialogs$qr$si qr = _Translations$dialogs$qr$si._(_root); + @override + late final _Translations$dialogs$quickActions$si quickActions = _Translations$dialogs$quickActions$si._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$si quickSaveNotice = _Translations$dialogs$quickSaveNotice$si._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$si quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$si._(_root); + @override + late final _Translations$dialogs$pin$si pin = _Translations$dialogs$pin$si._(_root); + @override + late final _Translations$dialogs$sendModeHelp$si sendModeHelp = _Translations$dialogs$sendModeHelp$si._(_root); + @override + late final _Translations$dialogs$zoom$si zoom = _Translations$dialogs$zoom$si._(_root); +} + +// Path: sanitization +class _Translations$sanitization$si extends Translations$sanitization$en { + _Translations$sanitization$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get empty => 'ගොනුවේ නම හිස් විය නොහැක'; + @override + String get invalid => 'ගොනු නාමයේ වලංගු නොවන අක්ෂර අඩංගු වේ'; +} + +// Path: tray +class _Translations$tray$si extends Translations$tray$en { + _Translations$tray$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'LocalSend වෙතින් ඉවත් වෙන්න'; + @override + String get closeWindows => 'පිටවීම'; +} + +// Path: web +class _Translations$web$si extends Translations$web$en { + _Translations$web$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'PIN ඇතුල් කරන්න'; + @override + String get invalidPin => 'වැරදි PIN'; + @override + String get tooManyAttempts => 'මේ සඳහා පමණට වඩා උත්සාහ කර ඇත'; + @override + String get rejected => 'ප්‍රතික්ෂේප කරන ලදී'; + @override + String get files => 'ගොනු'; + @override + String get fileName => 'ගොනුවේ නම'; + @override + String get size => 'ප්‍රමාණය'; +} + +// Path: assetPicker +class _Translations$assetPicker$si extends Translations$assetPicker$en { + _Translations$assetPicker$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'තහවුරු කරන්න'; + @override + String get cancel => 'අවලංගු කරන්න'; + @override + String get edit => 'සංස්කරණය'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Load කිරීම අසාර්ථක විය'; + @override + String get original => 'මූලාශ්‍රය'; + @override + String get preview => 'පෙරදසුන'; + @override + String get select => 'තෝරන්න'; + @override + String get emptyList => 'හිස් ලැයිස්තුව'; + @override + String get unSupportedAssetType => 'සහය නොමැති ගොනු වර්ගයකි.'; + @override + String get unableToAccessAll => 'උපාංගයේ ඇති සියලුම ගොනු වෙත පිවිසීමට නොහැක'; + @override + String get viewingLimitedAssetsTip => 'ඇප් එකට ප්‍රවේශ විය හැකි ගොනු සහ ඇල්බම් පමණක් බලන්න.'; + @override + String get changeAccessibleLimitedAssets => 'ප්‍රවේශ කළ හැකි ගොනු යාවත්කාලීන (Update) කිරීමට ක්ලික් කරන්න'; + @override + String get accessAllTip => + 'ඇප් එකට ප්‍රවේශ විය හැක්කේ උපාංගයේ ඇති සමහර ගොනුවලට පමණි. පද්ධති සැකසීම් (Settings) වෙත ගොස් උපාංගයේ සියලුම මාධ්‍ය වෙත ප්‍රවේශ වීමට ඇප් එකට අවසර ලබා දෙන්න.'; + @override + String get goToSystemSettings => 'පද්ධති සැකසුම් වෙත යන්න'; + @override + String get accessLimitedAssets => 'සීමිත ප්‍රවේශය සමඟ කරගෙන යන්න'; + @override + String get accessiblePathName => 'ප්‍රවේශ කළ හැකි ගොනු'; + @override + String get sTypeAudioLabel => 'හඬ'; + @override + String get sTypeImageLabel => 'චායාරූප'; + @override + String get sTypeVideoLabel => 'වීඩියෝ'; + @override + String get sTypeOtherLabel => 'වෙනත් මාධ්‍ය'; + @override + String get sActionPlayHint => 'වාදනය කරන්න'; + @override + String get sActionPreviewHint => 'පෙරදසුන'; + @override + String get sActionSelectHint => 'තෝරන්න'; + @override + String get sActionSwitchPathLabel => 'පාත් (Path) එක වෙනස් කරන්න'; + @override + String get sActionUseCameraHint => 'කැමරාව භාවිතා කරන්න'; + @override + String get sNameDurationLabel => 'කාලසීමාව'; + @override + String get sUnitAssetCountLabel => 'ගණන'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$si extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get info => + 'සාමාන්‍යයෙන් LocalSend ඔබගේ පවතින සියලු ජාල මුහුණත් භාවිතා කරයි. ඔබට අනවශ්‍ය මුහුණතක් වේ නම් එය මෙතනින් ඉවත් කළ හැක. ඔබ සිදු කරන වෙනස්කම් ක්‍රියාත්මක වීමට නම් server එක restart කළ යුතුය.'; + @override + String get title => 'ජාල අතුරුමුහුණත්'; + @override + String get preview => 'පෙනෙන අයුරු'; + @override + String get whitelist => 'අවසර ලත් ලැයිස්තුව'; + @override + String get blacklist => 'අවහිර කල ලැයිස්තුව'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$si extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'උපාංගයේ නම:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$si extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'ප්‍රියතම'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$si extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'තේරීම'; + @override + String files({required Object files}) => 'ගොනු: ${files}'; + @override + String size({required Object size}) => 'ප්‍රමාණය: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$si extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get file => 'ගොනුව'; + @override + String get folder => 'ෆෝල්ඩරය'; + @override + String get media => 'මාධ්‍ය'; + @override + String get text => 'පේළි (Text)'; + @override + String get app => 'ඇප්'; + @override + String get clipboard => 'පේස්ට් කරන්න'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$si extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get single => 'තනි ලබන්නා'; + @override + String get multiple => 'බහු ලබන්නන්'; + @override + String get link => 'ලින්ක් (Link) ඔස්සේ බෙදාගන්න (Share)'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$si extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'සාමාන්‍ය'; + @override + String get brightness => 'තේමාව'; + @override + late final _Translations$settingsTab$general$brightnessOptions$si brightnessOptions = _Translations$settingsTab$general$brightnessOptions$si._( + _root, + ); + @override + String get color => 'පාට'; + @override + late final _Translations$settingsTab$general$colorOptions$si colorOptions = _Translations$settingsTab$general$colorOptions$si._(_root); + @override + String get language => 'භාෂාව'; + @override + late final _Translations$settingsTab$general$languageOptions$si languageOptions = _Translations$settingsTab$general$languageOptions$si._(_root); + @override + String get saveWindowPlacement => 'ඉවත් වූ පසු කවුළුවේ පිහිටීම සුරකින්න'; + @override + String get saveWindowPlacementWindows => 'පිටවීමෙන් පසු කවුළුවේ පිහිටීම සුරකින්න'; + @override + String get minimizeToTray => 'වසා දැමීමේදී System Tray/Menu Bar වෙත අවම කරන්න'; + @override + String get launchAtStartup => 'පුරනය වීමෙන් පසු ස්වයංක්‍රීයව ආරම්භ කරන්න'; + @override + String get launchMinimized => 'ස්වයංක්‍රීය ආරම්භය: සඟවා ආරම්භ කරන්න'; + @override + String get showInContextMenu => 'Context මෙනුව තුළ LocalSend පෙන්වන්න'; + @override + String get animations => 'ඇනිමේශන්'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$si extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ලබාගන්න'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'ස්වයංක්‍රීය අවසන් කිරීම'; + @override + String get destination => 'ෆෝල්ඩරය වෙත සුරකින්න'; + @override + String get downloads => '(බාගත කිරීම්)'; + @override + String get saveToGallery => 'මාධ්‍ය ගැලරියට සුරකින්න'; + @override + String get saveToHistory => 'ඉතිහාසයට සුරකින්න'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$si extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'යවන්න'; + @override + String get shareViaLinkAutoAccept => '"ලින්ක් (Link) ඔස්සේ බෙදාගන්න (Share)" මාදිලියේ ඉල්ලීම් ස්වයංක්‍රීයව පිළිගන්න'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$si extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ජාලය'; + @override + String get needRestart => 'සැකසුම් යෙදීමට සේවාදායකය නැවත අරඹන්න!'; + @override + String get server => 'සේවාදායකය'; + @override + String get alias => 'උපාංගයේ නම'; + @override + String get deviceType => 'උපාංගයේ වර් ගය'; + @override + String get deviceModel => 'උපාංගයේ ආකෘතිය'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'සොයා ගැනීමේ කාලසීමාව'; + @override + String get useSystemName => 'පද්ධති නම භාවිතා කරන්න'; + @override + String get generateRandomAlias => 'අහඹු නමක් ජනනය කරන්න'; + @override + String portWarning({required Object defaultPort}) => + 'ඔබ custom port එකක් භාවිතා කරන්නේ නම්, වෙනත් උපාංග වලට ඔබව හඳුනා ගත නොහැක. (default: ${defaultPort})'; + @override + String get encryption => 'කේතනය'; + @override + String get multicastGroup => 'Multicast ලිපිනය'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'ඔබ custom multicast ලිපිනයක් භාවිතා කරන්නේ නම්, වෙනත් උපාංග වලට ඔබව හඳුනා ගත නොහැක. (default: ${defaultMulticast})'; + @override + String get network => 'ජාලය'; + @override + late final _Translations$settingsTab$network$networkOptions$si networkOptions = _Translations$settingsTab$network$networkOptions$si._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$si extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'වෙනත්'; + @override + String get support => 'LocalSend සඳහා සහය දක්වන්න'; + @override + String get donate => 'ආධාර කරන්න'; + @override + String get privacyPolicy => 'පුද්ගලික තොරතුරු ප්‍රතිපත්තිය'; + @override + String get termsOfUse => 'භාවිතා කිරීමේ කොන්දේසි'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$si extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'මෙම උපාංගය මගින් වෙනත් උපාංගවලට ගොනු යැවිය හැක, නමුත් වෙනත් උපාංගවලින් මෙම උපාංගයට ගොනු යැවිය නොහැක.'; + @override + String solution({required Object port}) => + 'මෙය බොහෝවිට firewall සම්බන්ධ ගැටලුවක් විය හැක. විසඳීමට port ${port} එක සඳහා \'Allow Incoming Connections" (TCP සහ UDP) ලබා දෙන්න.'; + @override + String get openFirewall => 'Firewall විවෘත කරන්න'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$si extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'මෙම උපාංගයට වෙනත් උපාංග සොයාගත නොහැක.'; + @override + String get solution => + 'කරුණාකර සියලුම උපාංග එකම Wi-Fi ජාලයක ඇති බවත්, එකම configuration (port, multicast address, encryption) එකක් ඇති බවත් තහවුරු කරගන්න. ඔබට ඉලක්කගත උපාංගයේ IP ලිපිනය අතින් ටයිප් කිරීමට උත්සාහ කළ හැකිය. මෙය ක්‍රියාත්මක නම්, මෙම උපාංගය ප්‍රියතමයන් අතරට එක් කිරීමට සලකා බලන්න, එවිට අනාගතයේදී එය ස්වයංක්‍රීයව සොයාගත හැක.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$si extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'දෙපාර්ශ්වයටම එකිනෙකාගේ උපාංග හඳුනාගැනීම හෝ ගොනු බෙදාගැනීම කළ නොහැක.'; + @override + String get solution => + 'ගැටලුව දෙපාර්ශවයේම තිබේ ද? එසේ නම්, දෙපාර්ශවයේම උපාංග එකම Wi-Fi ජාලයක ඇති බවත්, එකම configuration (port, multicast address, encryption) එකක් ඇති බවත් තහවුරු කරගන්න. Access Point (AP) Isolation මඟින් Wi-Fi ජාලය තුළ සහභාගීවන්නන් අතර සන්නිවේදනය වාරණය විය හැක. එවැනි අවස්තාවක, මෙම විකල්පය (AP Isolation) රවුටරයේ අක්‍රීය කළ යුතුය.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$si extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get open => 'ගොනුව විවෘත කරන්න'; + @override + String get showInFolder => 'ෆෝල්ඩරය තුළ පෙන්වන්න'; + @override + String get info => 'තොරතුරු'; + @override + String get deleteFromHistory => 'ඉතිහාසයෙන් මකන්න'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$si extends Translations$progressPage$total$en { + _Translations$progressPage$total$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$si title = _Translations$progressPage$total$title$si._(_root); + @override + String count({required Object curr, required Object n}) => 'ගොනු: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'විශාලත්වය: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'වේගය: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$si extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'තේරීමට ඇඩ් කරන්න'; + @override + String get content => 'ඔබට ඇඩ් කිරීමට අවශ්‍ය මොනවා ද?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$si extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ගොනුව විවෘත කරන්න'; + @override + String get content => 'ලබාගත් ගොනුව විවෘත කිරීමට කැමතිද?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$si extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ලිපිනය ඇතුලත් කරන්න'; + @override + String get hashtag => 'හැශ්ටැග්'; + @override + String get ip => 'IP ලිපිනය'; + @override + String get recentlyUsed => 'පෙර භාවිතා කළ: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$si extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ගොනු මාරු අවලංගු කරන්න'; + @override + String get content => 'ඔබට ඇත්තටම ගොනු හුවමාරුව අවලංගු කිරීමට අවශ්‍යද?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$si extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ගොනුව විවෘත කළ නොහැක'; + @override + String content({required Object file}) => + '"${file}" විවෘත කිරීමට නොහැකි විය. මෙම ගොනුව වෙනත් තැනකට ගෙන ගොස් (moved) හෝ නැවත නම් කර (renamed) හෝ මකා දමා (deleted) තිබේද?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$si extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'කේතනය අක්‍රිය කර ඇත'; + @override + String get content => 'දැන් සන්නිවේදනය අනාරක්ශිත HTTP protocol හරහා සිදු වේ. HTTPS protocol භාවිතා කිරීමට, කේතනය නැවත සක්‍රීය කරන්න.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$si extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$si extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ප්‍රියතම'; + @override + String get noFavorites => 'තවමත් ප්‍රියතම උපාංග නැත.'; + @override + String get addFavorite => 'ඇඩ් කරන්න'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$si extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ප්‍රියතම වලින් මකන්න'; + @override + String content({required Object name}) => 'ඔබට ඇත්තටම "${name}" ප්‍රියතම වෙතින් මැකීමට අවශ්‍යද?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$si extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'ප්‍රියතම වෙත එක් කරන්න'; + @override + String get titleEdit => 'සැකසුම්'; + @override + String get name => 'උපාංගයේ නම'; + @override + String get auto => '(ස්වයංක්‍රීය)'; + @override + String get ip => 'IP ලිපිනය'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$si extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ගොනු විස්තර'; + @override + String get fileName => 'ගොනු විස්තර:'; + @override + String get path => 'පාත් (Path):'; + @override + String get size => 'ප්‍රමාණය:'; + @override + String get sender => 'යවන්නා:'; + @override + String get time => 'වේලාව:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$si extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ගොනුවේ නම ඇතුලත් කරන්න'; + @override + String original({required Object original}) => 'මුල්: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$si extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ඉතිහාසය ඉවත් කරන්න'; + @override + String get content => 'ඔබට ඇත්තටම ඉතිහාසය සම්පූර්ණයෙන් මකා දැමීමට අවශ්‍යද?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$si extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'ජාලය ස්කෑන් (Scan) කිරීමට අවසරයක් නොමැතිව, LocalSend හට අනෙකුත් උපාංග සොයාගත නොහැක. කාරුණිකව මෙම අවසරය සැකසුම් (Settings) තුළ ලබා දෙන්න.'; + @override + String get gotoSettings => 'සැකසුම්'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$si extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'පණිවිඩය ටයිප් කරන්න'; + @override + String get multiline => 'බහු පේලි'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$si extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'කිසිදු ගොනුවක් තෝරා නැත'; + @override + String get content => 'කරුණාකර අවම වශයෙන් එක් ගොනුවක්වත් තෝරන්න.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$si extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'අවසර නැත'; + @override + String get content => 'අවශ්‍ය අවසර ලබා නොදී ඇත. මෙම අවසර සැකසුම් (Settings) තුළ ලබා දෙන්න.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$si extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'ලබා ගත නොහැක'; + @override + String get content => 'මෙම විශේෂාංගය ලබා ගත හැක්කේ පහත ක්‍රමවේද තුල පමණි:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$si extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR කේතය'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$si extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Quick යෙදුම්'; + @override + String get counter => 'කවුන්ටරය'; + @override + String get prefix => 'Prefix'; + @override + String get padZero => 'Pad with zeros'; + @override + String get sortBeforeCount => 'අකාරාදී පිළිවෙලට සකසන්න (A-Z)'; + @override + String get random => 'අහඹු'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$si extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'ගොනු ඉල්ලීම් දැන් ස්වයංක්‍රීයව පිළිගනු ලැබේ. ජාලයේ සිටින සෑම කෙනෙකුටම ඔබට ගොනු එවිය හැකි බව මතක තබා ගන්න.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$si extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'ඔබගේ ප්‍රියතම ලැයිස්තුවේ ඇති උපාංගවලින් ලැබෙන ගොනු ඉල්ලීම් දැන් ස්වයංක්‍රීයව පිළිගනු ලැබේ.', + 'අවවාදයයි! දැනට, මෙය සම්පූර්ණයෙන්ම ආරක්ෂිත නැත, ඔබේ ප්‍රියතම ලැයිස්තුවේ ඇති ඕනෑම උපාංගයක ඇඟිලි සලකුණක් සහිත හැකර්වරයෙකුට (Hacker) කිසිඳු සීමාවකින් තොරව ඔබ වෙත ගොනු එවිය හැක.', + 'කෙසේ වෙතත්, මෙම විකල්පය ජාලයේ සියලුම පරිශීලකයින්ට කිසිඳු සීමාවකින් තොරව ගොනු එවීමට ඉඩ දීමට වඩා ආරක්ෂිත වේ.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$si extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'PIN ඇතුල් කරන්න'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$si extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'යැවීමේ ක්‍රම'; + @override + String get single => 'එක් ලබන්නෙකුට පමණක් ගොනු යැවීම කරයි. ගොනු හුවමාරු කිරීමෙන් පසුව, තේරීම මකා දමනු ලැබේ.'; + @override + String get multiple => 'ලබන්නන් කිහිපදෙනෙකු වෙත ගොනු යැවීම කරයි. ගොනු හුවමාරු කිරීමෙන් පසුව ද තේරීම මකා දමන්නේ නැත.'; + @override + String get link => + 'ලබන්නන් LocalSend ස්ථාපනය කර නොමැති නම්, ඔව්න්ගේ බ්‍රවුසර් (Browser) තුළ අදාල ලින්ක් (Link) එක විවෘත කර, ගොනු බාගත (Download) කළ හැක.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$si extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$si extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get system => 'පද්ධතිය'; + @override + String get dark => 'අඳුරු'; + @override + String get light => 'එළිය'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$si extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get system => 'පද්ධතිය'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$si extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get system => 'පද්ධතිය'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$si extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String get all => 'සියල්ල'; + @override + String get filtered => 'වර්ග කළ'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$si extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$si._(TranslationsSi root) : this._root = root, super.internal(root); + + final TranslationsSi _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'සම්පූර්ණ ප්‍රගතිය (${time})'; + @override + String get finishedError => 'දෝෂයක් සමඟ අවසන් විය'; + @override + String get canceledSender => 'යවන්නා විසින් අවලංගු කරන ලදී'; + @override + String get canceledReceiver => 'ලැබුම්කරු විසින් අවලංගු කරන ලදී'; +} diff --git a/app/lib/gen/strings_sk.g.dart b/app/lib/gen/strings_sk.g.dart new file mode 100644 index 0000000..497328a --- /dev/null +++ b/app/lib/gen/strings_sk.g.dart @@ -0,0 +1,1519 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsSk extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsSk({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.sk, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsSk _root = this; // ignore: unused_field + + @override + TranslationsSk $copyWith({TranslationMetadata? meta}) => TranslationsSk(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Slovenčina'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$sk general = _Translations$general$sk._(_root); + @override + late final _Translations$receiveTab$sk receiveTab = _Translations$receiveTab$sk._(_root); + @override + late final _Translations$sendTab$sk sendTab = _Translations$sendTab$sk._(_root); + @override + late final _Translations$settingsTab$sk settingsTab = _Translations$settingsTab$sk._(_root); + @override + late final _Translations$troubleshootPage$sk troubleshootPage = _Translations$troubleshootPage$sk._(_root); + @override + late final _Translations$receiveHistoryPage$sk receiveHistoryPage = _Translations$receiveHistoryPage$sk._(_root); + @override + late final _Translations$apkPickerPage$sk apkPickerPage = _Translations$apkPickerPage$sk._(_root); + @override + late final _Translations$selectedFilesPage$sk selectedFilesPage = _Translations$selectedFilesPage$sk._(_root); + @override + late final _Translations$receivePage$sk receivePage = _Translations$receivePage$sk._(_root); + @override + late final _Translations$receiveOptionsPage$sk receiveOptionsPage = _Translations$receiveOptionsPage$sk._(_root); + @override + late final _Translations$sendPage$sk sendPage = _Translations$sendPage$sk._(_root); + @override + late final _Translations$progressPage$sk progressPage = _Translations$progressPage$sk._(_root); + @override + late final _Translations$webSharePage$sk webSharePage = _Translations$webSharePage$sk._(_root); + @override + late final _Translations$aboutPage$sk aboutPage = _Translations$aboutPage$sk._(_root); + @override + late final _Translations$donationPage$sk donationPage = _Translations$donationPage$sk._(_root); + @override + late final _Translations$changelogPage$sk changelogPage = _Translations$changelogPage$sk._(_root); + @override + late final _Translations$aliasGenerator$sk aliasGenerator = _Translations$aliasGenerator$sk._(_root); + @override + late final _Translations$dialogs$sk dialogs = _Translations$dialogs$sk._(_root); + @override + late final _Translations$sanitization$sk sanitization = _Translations$sanitization$sk._(_root); + @override + late final _Translations$tray$sk tray = _Translations$tray$sk._(_root); + @override + late final _Translations$web$sk web = _Translations$web$sk._(_root); + @override + late final _Translations$assetPicker$sk assetPicker = _Translations$assetPicker$sk._(_root); + @override + late final _Translations$networkInterfacesPage$sk networkInterfacesPage = _Translations$networkInterfacesPage$sk._(_root); +} + +// Path: general +class _Translations$general$sk extends Translations$general$en { + _Translations$general$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Prijať'; + @override + String get accepted => 'Prijaté'; + @override + String get add => 'Pridať'; + @override + String get advanced => 'Pokročilé'; + @override + String get cancel => 'Zrušiť'; + @override + String get close => 'Zavrieť'; + @override + String get confirm => 'Potvrdiť'; + @override + String get continueStr => 'Pokračovať'; + @override + String get copy => 'Kopírovať'; + @override + String get copiedToClipboard => 'Skopírované do schránky'; + @override + String get decline => 'Odmietnuť'; + @override + String get done => 'Hotovo'; + @override + String get delete => 'Odstrániť'; + @override + String get edit => 'Upraviť'; + @override + String get error => 'Chyba'; + @override + String get example => 'Príklad'; + @override + String get files => 'Súbory'; + @override + String get finished => 'Dokončené'; + @override + String get hide => 'Skryť'; + @override + String get off => 'Vypnuté'; + @override + String get offline => 'Offline'; + @override + String get on => 'Zapnuté'; + @override + String get online => 'Online'; + @override + String get open => 'Otvoriť'; + @override + String get queue => 'Fronta'; + @override + String get quickSave => 'Rýchle uloženie'; + @override + String get quickSaveFromFavorites => 'Rýchle uloženie pre "Obľúbené"'; + @override + String get renamed => 'Premenovaný'; + @override + String get reset => 'Vrátiť späť zmeny'; + @override + String get restart => 'Reštartovať'; + @override + String get settings => 'Nastavenia'; + @override + String get skipped => 'Preskočené'; + @override + String get start => 'Spustiť'; + @override + String get stop => 'Zastaviť'; + @override + String get save => 'Uložiť'; + @override + String get unchanged => 'Nezmenené'; + @override + String get unknown => 'Neznáme'; + @override + String get noItemInClipboard => 'Žiadne položky v schránke.'; +} + +// Path: receiveTab +class _Translations$receiveTab$sk extends Translations$receiveTab$en { + _Translations$receiveTab$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Prijať'; + @override + late final _Translations$receiveTab$infoBox$sk infoBox = _Translations$receiveTab$infoBox$sk._(_root); + @override + late final _Translations$receiveTab$quickSave$sk quickSave = _Translations$receiveTab$quickSave$sk._(_root); +} + +// Path: sendTab +class _Translations$sendTab$sk extends Translations$sendTab$en { + _Translations$sendTab$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Odoslať'; + @override + late final _Translations$sendTab$selection$sk selection = _Translations$sendTab$selection$sk._(_root); + @override + late final _Translations$sendTab$picker$sk picker = _Translations$sendTab$picker$sk._(_root); + @override + String get shareIntentInfo => 'Na jednoduchší výber súborov môžete použiť aj funkciu "Zdieľať" vášho mobilného zariadenia.'; + @override + String get nearbyDevices => 'Zariadenia v blízkosti'; + @override + String get thisDevice => 'Toto zariadenie'; + @override + String get scan => 'Vyhľadať zariadenia'; + @override + String get manualSending => 'Manuálne odoslanie'; + @override + String get sendMode => 'Režim odosielania'; + @override + late final _Translations$sendTab$sendModes$sk sendModes = _Translations$sendTab$sendModes$sk._(_root); + @override + String get sendModeHelp => 'Vysvetlenie'; + @override + String get help => 'Uistite sa, že je požadované zariadenie v rovnakej Wi-Fi sieti.'; + @override + String get placeItems => 'Umiestnite položky na zdieľanie.'; +} + +// Path: settingsTab +class _Translations$settingsTab$sk extends Translations$settingsTab$en { + _Translations$settingsTab$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nastavenia'; + @override + late final _Translations$settingsTab$general$sk general = _Translations$settingsTab$general$sk._(_root); + @override + late final _Translations$settingsTab$receive$sk receive = _Translations$settingsTab$receive$sk._(_root); + @override + late final _Translations$settingsTab$send$sk send = _Translations$settingsTab$send$sk._(_root); + @override + late final _Translations$settingsTab$network$sk network = _Translations$settingsTab$network$sk._(_root); + @override + late final _Translations$settingsTab$other$sk other = _Translations$settingsTab$other$sk._(_root); + @override + String get advancedSettings => 'Pokročilé nastavenia'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$sk extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Riešenie problémov'; + @override + String get subTitle => 'Aplikácia nefunguje podľa očakávania? Tu nájdete niektoré bežné riešenia problémov.'; + @override + String get solution => 'Riešenie:'; + @override + String get fixButton => 'Opraviť automaticky'; + @override + late final _Translations$troubleshootPage$firewall$sk firewall = _Translations$troubleshootPage$firewall$sk._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$sk noDiscovery = _Translations$troubleshootPage$noDiscovery$sk._(_root); + @override + late final _Translations$troubleshootPage$noConnection$sk noConnection = _Translations$troubleshootPage$noConnection$sk._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$sk extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'História'; + @override + String get openFolder => 'Otvoriť priečinok'; + @override + String get deleteHistory => 'Odstrániť históriu'; + @override + String get empty => 'História je prázdna.'; + @override + late final _Translations$receiveHistoryPage$entryActions$sk entryActions = _Translations$receiveHistoryPage$entryActions$sk._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$sk extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplikácie (APK)'; + @override + String get excludeSystemApps => 'Vylúčiť systémové aplikácie'; + @override + String get excludeAppsWithoutLaunchIntent => 'Vylúčiť nespustiteľné aplikácie'; + @override + String apps({required Object n}) => '${n} Aplikácie'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$sk extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Vymazať všetky'; +} + +// Path: receivePage +class _Translations$receivePage$sk extends Translations$receivePage$en { + _Translations$receivePage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sk'))( + n, + one: 'vám chce poslať súbor', + other: 'vám chce poslať ${n} súborov', + ); + @override + String get subTitleMessage => 'vám poslal správu:'; + @override + String get subTitleLink => 'vám poslal odkaz:'; + @override + String get canceled => 'Odosielateľ zrušil žiadosť.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$sk extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Možnosti'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(Priečinok LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Automaticky vypnuté, pretože existujú priečinky.'; +} + +// Path: sendPage +class _Translations$sendPage$sk extends Translations$sendPage$en { + _Translations$sendPage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Čaká sa na odpoveď…'; + @override + String get rejected => 'Príjemca zamietol žiadosť.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Príjemca je zaneprázdnený inou žiadosťou.'; +} + +// Path: progressPage +class _Translations$progressPage$sk extends Translations$progressPage$en { + _Translations$progressPage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Odosielanie súborov'; + @override + String get titleReceiving => 'Prijímanie súborov'; + @override + String get savedToGallery => 'Uložené vo Fotkách'; + @override + late final _Translations$progressPage$total$sk total = _Translations$progressPage$total$sk._(_root); + @override + late final _Translations$progressPage$remainingTime$sk remainingTime = _Translations$progressPage$remainingTime$sk._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$sk extends Translations$webSharePage$en { + _Translations$webSharePage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Zdieľať cez odkaz'; + @override + String get loading => 'Spúšťa sa server…'; + @override + String get stopping => 'Zastavuje sa server…'; + @override + String get error => 'Pri spúšťaní servera sa vyskytla chyba.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sk'))( + n, + one: 'Otvorte tento odkaz vo svojom prehliadači:', + other: 'Otvorte jeden z týchto odkazov vo svojom prehliadači:', + ); + @override + String get requests => 'Žiadosti'; + @override + String get noRequests => 'Zatiaľ žiadne žiadosti.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Automaticky prijímať žiadosti'; + @override + String get requirePin => 'Vyžadovať PIN'; + @override + String pinHint({required Object pin}) => 'PIN je "${pin}"'; + @override + String get encryptionHint => 'LocalSend používa certifikát s vlastným podpisom. Musíte ho prijať vo svojom prehliadači.'; + @override + String pendingRequests({required Object n}) => 'Nespracované žiadosti: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$sk extends Translations$aboutPage$en { + _Translations$aboutPage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'O aplikácii LocalSend'; + @override + List get description => [ + 'LocalSend je bezplatná aplikácia s otvoreným zdrojovým kódom, ktorá vám umožňuje bezpečne zdieľať súbory a správy so zariadeniami v okolí cez vašu lokálnu sieť bez potreby pripojenia k internetu.', + 'Táto aplikácia je dostupná pre Android, iOS, macOS, Windows a Linux. Všetky možnosti stiahnutia nájdete na oficiálnej domovskej stránke.', + ]; + @override + String get author => 'Autor'; + @override + String get contributors => 'Prispievatelia'; + @override + String get packagers => 'Zostavovatelia balíkov'; + @override + String get translators => 'Prekladatelia'; +} + +// Path: donationPage +class _Translations$donationPage$sk extends Translations$donationPage$en { + _Translations$donationPage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Darovať'; + @override + String get info => 'LocalSend je bezplatný, s otvoreným kódom a bez reklám. Ak sa vám aplikácia páči, môžete jej vývoj podporiť darom.'; + @override + String donate({required Object amount}) => 'Darovať ${amount}'; + @override + String get thanks => 'Ďakujeme veľmi pekne!'; + @override + String get restore => 'Obnoviť nákup'; +} + +// Path: changelogPage +class _Translations$changelogPage$sk extends Translations$changelogPage$en { + _Translations$changelogPage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Zoznam zmien'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$sk extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Rozkošná', + 'Krásna', + 'Veľká', + 'Ľahká', + 'Okúzľujúca', + 'Šikovná', + 'Pohodová', + 'Roztomilá', + 'Prefíkaná', + 'Odhodlaná', + 'Energická', + 'Efektívna', + 'Fantastická', + 'Rýchla', + 'Fajná', + 'Čerstvá', + 'Dobrá', + 'Nádherná', + 'Skvelá', + 'Sympatická', + 'Horúca', + 'Milá', + 'Zvodná', + 'Mystická', + 'Čistá', + 'Úhľadná', + 'Trpezlivá', + 'Pekná', + 'Výkonná', + 'Bohatá', + 'Tajomná', + 'Inteligentná', + 'Pôvabná', + 'Špeciálna', + 'Strategická', + 'Silná', + 'Vášnivá', + 'Múdra', + ]; + @override + List get fruits => [ + 'hruška', + 'višňa', + 'čerešňa', + 'broskyňa', + 'slivka', + 'marhuľa', + 'ringlota', + 'čučoriedka', + 'brusnica', + 'ríbezľa', + 'malina', + 'jahoda', + 'moruša', + 'mandarínka', + 'marakuja', + 'datľa', + 'dula', + 'figa', + 'limetka', + 'papája', + 'tekvica', + 'akébia', + 'brokolica', + 'cibuľa', + 'kapusta', + 'paradajka', + ]; + + /// V niektorých jazykoch musí byť prídavné meno posledné. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$sk extends Translations$dialogs$en { + _Translations$dialogs$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$sk addFile = _Translations$dialogs$addFile$sk._(_root); + @override + late final _Translations$dialogs$openFile$sk openFile = _Translations$dialogs$openFile$sk._(_root); + @override + late final _Translations$dialogs$addressInput$sk addressInput = _Translations$dialogs$addressInput$sk._(_root); + @override + late final _Translations$dialogs$cancelSession$sk cancelSession = _Translations$dialogs$cancelSession$sk._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$sk cannotOpenFile = _Translations$dialogs$cannotOpenFile$sk._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$sk encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$sk._(_root); + @override + late final _Translations$dialogs$errorDialog$sk errorDialog = _Translations$dialogs$errorDialog$sk._(_root); + @override + late final _Translations$dialogs$favoriteDialog$sk favoriteDialog = _Translations$dialogs$favoriteDialog$sk._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$sk favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$sk._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$sk favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$sk._(_root); + @override + late final _Translations$dialogs$fileInfo$sk fileInfo = _Translations$dialogs$fileInfo$sk._(_root); + @override + late final _Translations$dialogs$fileNameInput$sk fileNameInput = _Translations$dialogs$fileNameInput$sk._(_root); + @override + late final _Translations$dialogs$historyClearDialog$sk historyClearDialog = _Translations$dialogs$historyClearDialog$sk._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$sk localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$sk._(_root); + @override + late final _Translations$dialogs$messageInput$sk messageInput = _Translations$dialogs$messageInput$sk._(_root); + @override + late final _Translations$dialogs$noFiles$sk noFiles = _Translations$dialogs$noFiles$sk._(_root); + @override + late final _Translations$dialogs$noPermission$sk noPermission = _Translations$dialogs$noPermission$sk._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$sk notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$sk._(_root); + @override + late final _Translations$dialogs$qr$sk qr = _Translations$dialogs$qr$sk._(_root); + @override + late final _Translations$dialogs$quickActions$sk quickActions = _Translations$dialogs$quickActions$sk._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$sk quickSaveNotice = _Translations$dialogs$quickSaveNotice$sk._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$sk quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$sk._(_root); + @override + late final _Translations$dialogs$pin$sk pin = _Translations$dialogs$pin$sk._(_root); + @override + late final _Translations$dialogs$sendModeHelp$sk sendModeHelp = _Translations$dialogs$sendModeHelp$sk._(_root); + @override + late final _Translations$dialogs$zoom$sk zoom = _Translations$dialogs$zoom$sk._(_root); +} + +// Path: sanitization +class _Translations$sanitization$sk extends Translations$sanitization$en { + _Translations$sanitization$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Názov súboru nemôže byť prázdny'; + @override + String get invalid => 'Názov súboru obsahuje neplatné znaky'; +} + +// Path: tray +class _Translations$tray$sk extends Translations$tray$en { + _Translations$tray$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Ukončiť LocalSend'; + @override + String get closeWindows => 'Ukončiť'; +} + +// Path: web +class _Translations$web$sk extends Translations$web$en { + _Translations$web$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Zadajte PIN'; + @override + String get invalidPin => 'Neplatný PIN kód'; + @override + String get tooManyAttempts => 'Príliš veľa pokusov'; + @override + String get rejected => 'Odmietnuté'; + @override + String get files => 'Súbory'; + @override + String get fileName => 'Názov súboru'; + @override + String get size => 'Veľkosť'; +} + +// Path: assetPicker +class _Translations$assetPicker$sk extends Translations$assetPicker$en { + _Translations$assetPicker$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Potvrdiť'; + @override + String get cancel => 'Zrušiť'; + @override + String get edit => 'Upraviť'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Načítanie zlyhalo'; + @override + String get original => 'Pôvod'; + @override + String get preview => 'Ukážka'; + @override + String get select => 'Vybrať'; + @override + String get emptyList => 'Prázdny zoznam'; + @override + String get unSupportedAssetType => 'Nepodporovaný typ súboru.'; + @override + String get unableToAccessAll => 'Nie je možné získať prístup ku všetkým súborom v zariadení'; + @override + String get viewingLimitedAssetsTip => 'Zobraziť iba súbory a albumy, ktoré má aplikácia prístupné.'; + @override + String get changeAccessibleLimitedAssets => 'Kliknutím aktualizujete prístupné súbory'; + @override + String get accessAllTip => + 'Aplikácia má prístup iba k niektorým súborom v zariadení. Prejdite do systémových nastavení a povoľte aplikácii prístup ku všetkým médiám v zariadení.'; + @override + String get goToSystemSettings => 'Prejdite do nastavení systému'; + @override + String get accessLimitedAssets => 'Pokračovať s obmedzeným prístupom'; + @override + String get accessiblePathName => 'Prístupné súbory'; + @override + String get sTypeAudioLabel => 'Zvuk'; + @override + String get sTypeImageLabel => 'Obrázok'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Iné médiá'; + @override + String get sActionPlayHint => 'prehrať'; + @override + String get sActionPreviewHint => 'náhľad'; + @override + String get sActionSelectHint => 'vyberať'; + @override + String get sActionSwitchPathLabel => 'zmeniť cestu'; + @override + String get sActionUseCameraHint => 'použiť fotoaparát'; + @override + String get sNameDurationLabel => 'trvanie'; + @override + String get sUnitAssetCountLabel => 'počet'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$sk extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get info => + 'V predvolenom nastavení LocalSend používa všetky dostupné sieťové rozhrania. Nežiaduce siete tu môžete vylúčiť. Na uplatnenie zmien je potrebné reštartovať server.'; + @override + String get preview => 'Náhľad'; + @override + String get blacklist => 'Zoznam zakázaných'; + @override + String get title => 'Sieťové rozhrania'; + @override + String get whitelist => 'Zoznam povolených'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$sk extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Názov zariadenia:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$sk extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Obľúbené'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$sk extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Výber'; + @override + String files({required Object files}) => 'Súbory: ${files}'; + @override + String size({required Object size}) => 'Veľkosť: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$sk extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get file => 'Súbor'; + @override + String get folder => 'Priečinok'; + @override + String get media => 'Médiá'; + @override + String get text => 'Text'; + @override + String get app => 'Aplikácia'; + @override + String get clipboard => 'Vložiť'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$sk extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get single => 'Jeden príjemca'; + @override + String get multiple => 'Viacerí príjemcovia'; + @override + String get link => 'Zdieľať cez odkaz'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$sk extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Všeobecné'; + @override + String get brightness => 'Téma'; + @override + late final _Translations$settingsTab$general$brightnessOptions$sk brightnessOptions = _Translations$settingsTab$general$brightnessOptions$sk._( + _root, + ); + @override + String get color => 'Farba'; + @override + late final _Translations$settingsTab$general$colorOptions$sk colorOptions = _Translations$settingsTab$general$colorOptions$sk._(_root); + @override + String get language => 'Jazyk'; + @override + late final _Translations$settingsTab$general$languageOptions$sk languageOptions = _Translations$settingsTab$general$languageOptions$sk._(_root); + @override + String get saveWindowPlacement => 'Uložiť polohu okna po ukončení'; + @override + String get saveWindowPlacementWindows => 'Uložiť polohu okna po ukončení'; + @override + String get minimizeToTray => 'Minimalizovať na systémový panel/panel ponuky pri zatvorení'; + @override + String get launchAtStartup => 'Autoštart po prihlásení'; + @override + String get launchMinimized => 'Autoštart: Spustiť skryté'; + @override + String get showInContextMenu => 'Zobraziť LocalSend v kontextovej ponuke'; + @override + String get animations => 'Animácie'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$sk extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Prijať'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Automatické dokončenie'; + @override + String get destination => 'Uložiť do priečinka'; + @override + String get downloads => '(Stiahnuté)'; + @override + String get saveToGallery => 'Uložiť médiá do galérie'; + @override + String get saveToHistory => 'Uložiť do histórie'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$sk extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Odoslať'; + @override + String get shareViaLinkAutoAccept => 'Automaticky prijímať žiadosti v režime "Zdieľať cez odkaz"'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$sk extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sieť'; + @override + String get needRestart => 'Ak chcete použiť nastavenia, reštartujte server!'; + @override + String get server => 'Server'; + @override + String get alias => 'Názov zariadenia'; + @override + String get deviceType => 'Typ zariadenia'; + @override + String get deviceModel => 'Model zariadenia'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Časový limit hľadania'; + @override + String get useSystemName => 'Použiť systémové meno'; + @override + String get generateRandomAlias => 'Generovať náhodnú prezývku'; + @override + String portWarning({required Object defaultPort}) => + 'Iné zariadenia vás nemusia rozpoznať, pretože používate vlastný port. (predvolené: ${defaultPort})'; + @override + String get encryption => 'Šifrovanie'; + @override + String get multicastGroup => 'Multicast adresa'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Iné zariadenia vás nemusia rozpoznať, pretože používate vlastnú multicast adresu. (predvolené: ${defaultMulticast})'; + @override + String get network => 'Sieť'; + @override + late final _Translations$settingsTab$network$networkOptions$sk networkOptions = _Translations$settingsTab$network$networkOptions$sk._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$sk extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Iné'; + @override + String get support => 'Podporte LocalSend'; + @override + String get donate => 'Darovať'; + @override + String get privacyPolicy => 'Zásady ochrany osobných údajov'; + @override + String get termsOfUse => 'Podmienky používania'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$sk extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Toto zariadenie môže odosielať súbory do iných zariadení, ale iné zariadenia nemôžu odosielať súbory do tohto zariadenia.'; + @override + String solution({required Object port}) => + 'S najväčšou pravdepodobnosťou ide o problém brány firewall. Môžete to vyriešiť povolením prichádzajúcich spojení (UDP a TCP) na porte ${port}.'; + @override + String get openFirewall => 'Otvoriť firewall'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$sk extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Toto zariadenie nemôže nájsť iné zariadenia.'; + @override + String get solution => + 'Uistite sa, že sú všetky zariadenia v rovnakej Wi-Fi sieti a zdieľajú rovnakú konfiguráciu (port, multicast adresa, šifrovanie). Môžete sa pokúsiť zadať IP adresu cieľového zariadenia ručne. Ak to funguje, zvážte pridanie tohto zariadenia do obľúbených položiek, aby mohlo byť v budúcnosti automaticky nájdené.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$sk extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Obe zariadenia sa nedokážu navzájom nájsť ani nemôžu zdieľať súbory.'; + @override + String get solution => + 'Existuje problém na oboch stranách? Ak áno, musíte sa uistiť, že sú obe zariadenia v rovnakej Wi-Fi sieti a majú rovnakú konfiguráciu (port, multicastovú adresu, šifrovanie). Sieť Wi-Fi nemusí umožňovať komunikáciu medzi účastníkmi (izolácia prístupového bodu). V takom prípade musí byť táto možnosť povolená na smerovači.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$sk extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get open => 'Otvoriť súbor'; + @override + String get showInFolder => 'Zobraziť v priečinku'; + @override + String get info => 'Informácie'; + @override + String get deleteFromHistory => 'Vymazať z histórie'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$sk extends Translations$progressPage$total$en { + _Translations$progressPage$total$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$sk title = _Translations$progressPage$total$title$sk._(_root); + @override + String count({required Object curr, required Object n}) => 'Súbory: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Veľkosť: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Rýchlosť: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$sk extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Použiť „h“ pre skratku hodín a „m“ pre minúty + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Použiť „d“ pre dni, „h“ pre hodiny a „m“ pre minúty + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$sk extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Pridať do výberu'; + @override + String get content => 'Čo chcete pridať?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$sk extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Otvoriť súbor'; + @override + String get content => 'Chcete otvoriť prijatý súbor?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$sk extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Zadajte adresu'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP adresa'; + @override + String get recentlyUsed => 'Nedávno použité: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$sk extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Zrušiť prenos súborov'; + @override + String get content => 'Naozaj chcete zrušiť prenos súborov?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$sk extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nie je možné otvoriť súbor'; + @override + String content({required Object file}) => 'Nepodarilo sa otvoriť súbor "${file}". Bol tento súbor presunutý, premenovaný alebo odstránený?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$sk extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Šifrovanie je vypnuté'; + @override + String get content => 'Komunikácia teraz prebieha cez nešifrovaný protokol HTTP. Ak chcete použiť protokol HTTPS, opäť povoľte šifrovanie.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$sk extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$sk extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Obľúbené'; + @override + String get noFavorites => 'Zatiaľ žiadne obľúbené zariadenia.'; + @override + String get addFavorite => 'Pridať'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$sk extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Odstrániť z obľúbených'; + @override + String content({required Object name}) => 'Naozaj chcete odstrániť "${name}" z obľúbených?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$sk extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Pridať k obľúbeným'; + @override + String get titleEdit => 'Nastavenia'; + @override + String get name => 'Názov zariadenia'; + @override + String get auto => '(automaticky)'; + @override + String get ip => 'IP adresa'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$sk extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informácie o súbore'; + @override + String get fileName => 'Názov súboru:'; + @override + String get path => 'Cesta:'; + @override + String get size => 'Veľkosť:'; + @override + String get sender => 'Odosielateľ:'; + @override + String get time => 'Čas:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$sk extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Zadajte názov súboru'; + @override + String original({required Object original}) => 'Originál: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$sk extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Vymazať históriu'; + @override + String get content => 'Naozaj chcete vymazať celú históriu?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$sk extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend nemôže nájsť iné zariadenia bez povolenia na prehľadanie lokálnej siete. Povoľte prosím toto povolenie v nastaveniach.'; + @override + String get gotoSettings => 'Nastavenia'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$sk extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Napíšte správu'; + @override + String get multiline => 'Viacriadková'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$sk extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nie sú vybraté žiadne súbory'; + @override + String get content => 'Vyberte prosím aspoň jeden súbor.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$sk extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Žiadne povolenie'; + @override + String get content => 'Neudelili ste potrebné povolenia. Udeľte ich prosím v nastaveniach.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$sk extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nie je k dispozícii'; + @override + String get content => 'Táto funkcia je dostupná iba na:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$sk extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR kód'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$sk extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rýchle akcie'; + @override + String get counter => 'Počítadlo'; + @override + String get prefix => 'Predpona'; + @override + String get padZero => 'Vyplniť s nulami'; + @override + String get sortBeforeCount => 'Vopred zoradiť podľa abecedy (A-Z)'; + @override + String get random => 'Náhodne'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$sk extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Žiadosti o súbor sú automaticky akceptované. Uvedomte si, že každý v miestnej sieti vám môže posielať súbory.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$sk extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Žiadosti o súbory sa teraz automaticky prijímajú zo zariadení vo vašom zozname obľúbených.', + 'Varovanie! V súčasnosti to nie je úplne bezpečné, pretože hacker, ktorý má odtlačok prsta akéhokoľvek zariadenia zo zoznamu obľúbených, vám môže posielať súbory bez obmedzenia.', + 'Táto možnosť je však stále bezpečnejšia ako povoliť všetkým používateľom v miestnej sieti posielať súbory bez obmedzenia.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$sk extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Zadajte PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$sk extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Režimy odosielania'; + @override + String get single => 'Odošle súbory jednému príjemcovi. Výber sa vymaže po dokončení prenosu súborov.'; + @override + String get multiple => 'Posiela súbory viacerým príjemcom. Výber sa vymaže po dokončení prenosu súborov.'; + @override + String get link => 'Príjemcovia, ktorí nemajú nainštalovaný LocalSend, si môžu stiahnuť vybrané súbory otvorením odkazu vo svojom prehliadači.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$sk extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$sk extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get system => 'Systémová'; + @override + String get dark => 'Tmavá'; + @override + String get light => 'Svetlá'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$sk extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get system => 'Systémová'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$sk extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get system => 'Systémový'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$sk extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String get all => 'Všetky'; + @override + String get filtered => 'Filtrované'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$sk extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$sk._(TranslationsSk root) : this._root = root, super.internal(root); + + final TranslationsSk _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Celkový priebeh (${time})'; + @override + String get finishedError => 'Dokončené s chybou'; + @override + String get canceledSender => 'Zrušené odosielateľom'; + @override + String get canceledReceiver => 'Zrušené príjemcom'; +} diff --git a/app/lib/gen/strings_sl.g.dart b/app/lib/gen/strings_sl.g.dart new file mode 100644 index 0000000..7e2a8e2 --- /dev/null +++ b/app/lib/gen/strings_sl.g.dart @@ -0,0 +1,1418 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsSl extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsSl({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.sl, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsSl _root = this; // ignore: unused_field + + @override + TranslationsSl $copyWith({TranslationMetadata? meta}) => TranslationsSl(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Slovenščina'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$sl general = _Translations$general$sl._(_root); + @override + late final _Translations$receiveTab$sl receiveTab = _Translations$receiveTab$sl._(_root); + @override + late final _Translations$sendTab$sl sendTab = _Translations$sendTab$sl._(_root); + @override + late final _Translations$settingsTab$sl settingsTab = _Translations$settingsTab$sl._(_root); + @override + late final _Translations$troubleshootPage$sl troubleshootPage = _Translations$troubleshootPage$sl._(_root); + @override + late final _Translations$receiveHistoryPage$sl receiveHistoryPage = _Translations$receiveHistoryPage$sl._(_root); + @override + late final _Translations$apkPickerPage$sl apkPickerPage = _Translations$apkPickerPage$sl._(_root); + @override + late final _Translations$selectedFilesPage$sl selectedFilesPage = _Translations$selectedFilesPage$sl._(_root); + @override + late final _Translations$receivePage$sl receivePage = _Translations$receivePage$sl._(_root); + @override + late final _Translations$receiveOptionsPage$sl receiveOptionsPage = _Translations$receiveOptionsPage$sl._(_root); + @override + late final _Translations$sendPage$sl sendPage = _Translations$sendPage$sl._(_root); + @override + late final _Translations$progressPage$sl progressPage = _Translations$progressPage$sl._(_root); + @override + late final _Translations$webSharePage$sl webSharePage = _Translations$webSharePage$sl._(_root); + @override + late final _Translations$aboutPage$sl aboutPage = _Translations$aboutPage$sl._(_root); + @override + late final _Translations$donationPage$sl donationPage = _Translations$donationPage$sl._(_root); + @override + late final _Translations$changelogPage$sl changelogPage = _Translations$changelogPage$sl._(_root); + @override + late final _Translations$aliasGenerator$sl aliasGenerator = _Translations$aliasGenerator$sl._(_root); + @override + late final _Translations$dialogs$sl dialogs = _Translations$dialogs$sl._(_root); + @override + late final _Translations$sanitization$sl sanitization = _Translations$sanitization$sl._(_root); + @override + late final _Translations$tray$sl tray = _Translations$tray$sl._(_root); + @override + late final _Translations$web$sl web = _Translations$web$sl._(_root); + @override + late final _Translations$assetPicker$sl assetPicker = _Translations$assetPicker$sl._(_root); +} + +// Path: general +class _Translations$general$sl extends Translations$general$en { + _Translations$general$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Sprejmi'; + @override + String get accepted => 'Sprejeto'; + @override + String get add => 'Dodaj'; + @override + String get advanced => 'Napredno'; + @override + String get cancel => 'Prekliči'; + @override + String get close => 'Zapri'; + @override + String get confirm => 'Potrdi'; + @override + String get continueStr => 'Nadaljuj'; + @override + String get copy => 'Kopiraj'; + @override + String get copiedToClipboard => 'Kopirano v odložišče'; + @override + String get decline => 'Zavrni'; + @override + String get done => 'Končano'; + @override + String get delete => 'Izbriši'; + @override + String get edit => 'Uredi'; + @override + String get error => 'Napaka'; + @override + String get example => 'Primer'; + @override + String get files => 'Datoteke'; + @override + String get finished => 'Končano'; + @override + String get hide => 'Skrij'; + @override + String get off => 'Izklopljeno'; + @override + String get offline => 'Brez povezave'; + @override + String get on => 'Vklopljeno'; + @override + String get online => 'Na spletu'; + @override + String get open => 'Odpri'; + @override + String get queue => 'Čakalna vrsta'; + @override + String get quickSave => 'Hitro shranjevanje'; + @override + String get quickSaveFromFavorites => 'Hitro shranjevanje za »Priljubljene«'; + @override + String get renamed => 'Preimenovano'; + @override + String get reset => 'Razveljavi spremembe'; + @override + String get restart => 'Ponovni zagon'; + @override + String get settings => 'Nastavitve'; + @override + String get skipped => 'Preskočeno'; + @override + String get start => 'Začni'; + @override + String get stop => 'Ustavi'; + @override + String get save => 'Shrani'; + @override + String get unchanged => 'Nespremenjeno'; + @override + String get unknown => 'Neznano'; + @override + String get noItemInClipboard => 'V odložišču ni elementov.'; +} + +// Path: receiveTab +class _Translations$receiveTab$sl extends Translations$receiveTab$en { + _Translations$receiveTab$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Prejem'; + @override + late final _Translations$receiveTab$infoBox$sl infoBox = _Translations$receiveTab$infoBox$sl._(_root); +} + +// Path: sendTab +class _Translations$sendTab$sl extends Translations$sendTab$en { + _Translations$sendTab$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Pošlji'; + @override + late final _Translations$sendTab$selection$sl selection = _Translations$sendTab$selection$sl._(_root); + @override + late final _Translations$sendTab$picker$sl picker = _Translations$sendTab$picker$sl._(_root); + @override + String get shareIntentInfo => 'Lahko uporabite funkcijo »Deli« na vaši mobilni napravi za lažjo izbiro datotek.'; + @override + String get nearbyDevices => 'Naprave v bližini'; + @override + String get thisDevice => 'Ta naprava'; + @override + String get scan => 'Išči naprave'; + @override + String get manualSending => 'Ročno pošiljanje'; + @override + String get sendMode => 'Način pošiljanja'; + @override + late final _Translations$sendTab$sendModes$sl sendModes = _Translations$sendTab$sendModes$sl._(_root); + @override + String get sendModeHelp => 'Pojasnilo'; + @override + String get help => 'Preverite, da je ciljna naprava povezana v isto Wi-Fi omrežje.'; + @override + String get placeItems => 'Postavite elemente za deljenje.'; +} + +// Path: settingsTab +class _Translations$settingsTab$sl extends Translations$settingsTab$en { + _Translations$settingsTab$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nastavitve'; + @override + late final _Translations$settingsTab$general$sl general = _Translations$settingsTab$general$sl._(_root); + @override + late final _Translations$settingsTab$receive$sl receive = _Translations$settingsTab$receive$sl._(_root); + @override + late final _Translations$settingsTab$send$sl send = _Translations$settingsTab$send$sl._(_root); + @override + late final _Translations$settingsTab$network$sl network = _Translations$settingsTab$network$sl._(_root); + @override + late final _Translations$settingsTab$other$sl other = _Translations$settingsTab$other$sl._(_root); + @override + String get advancedSettings => 'Napredne nastavitve'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$sl extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Odpravljanje težav'; + @override + String get subTitle => 'Aplikacija ne deluje pravilno? Tukaj najdete rešitve za pogoste težave.'; + @override + String get solution => 'Rešitev:'; + @override + String get fixButton => 'Samodejno odpravi'; + @override + late final _Translations$troubleshootPage$firewall$sl firewall = _Translations$troubleshootPage$firewall$sl._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$sl noDiscovery = _Translations$troubleshootPage$noDiscovery$sl._(_root); + @override + late final _Translations$troubleshootPage$noConnection$sl noConnection = _Translations$troubleshootPage$noConnection$sl._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$sl extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Zgodovina'; + @override + String get openFolder => 'Odpri mapo'; + @override + String get deleteHistory => 'Izbriši zgodovino'; + @override + String get empty => 'Zgodovina je prazna.'; + @override + late final _Translations$receiveHistoryPage$entryActions$sl entryActions = _Translations$receiveHistoryPage$entryActions$sl._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$sl extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplikacije (APK)'; + @override + String get excludeSystemApps => 'Izključi sistemske aplikacije'; + @override + String get excludeAppsWithoutLaunchIntent => 'Izključi aplikacije, ki jih ni mogoče zagnati'; + @override + String apps({required Object n}) => '${n} aplikacij'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$sl extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Izbriši vse'; +} + +// Path: receivePage +class _Translations$receivePage$sl extends Translations$receivePage$en { + _Translations$receivePage$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sl'))( + n, + one: 'želi poslati datoteko', + other: 'želi poslati ${n} datotek', + ); + @override + String get subTitleMessage => 'vam je poslal sporočilo:'; + @override + String get subTitleLink => 'vam je poslal povezavo:'; + @override + String get canceled => 'Pošiljatelj je preklical zahtevo.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$sl extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Možnosti'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(mapa LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Samodejno izklopljeno, ker obstajajo mape.'; +} + +// Path: sendPage +class _Translations$sendPage$sl extends Translations$sendPage$en { + _Translations$sendPage$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Čakanje na odgovor...'; + @override + String get rejected => 'Prejemnik je zavrnil zahtevo.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Prejemnik je zaseden z drugo zahtevo.'; +} + +// Path: progressPage +class _Translations$progressPage$sl extends Translations$progressPage$en { + _Translations$progressPage$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Pošiljanje datotek'; + @override + String get titleReceiving => 'Prejemanje datotek'; + @override + String get savedToGallery => 'Shranjeno v Fotografije'; + @override + late final _Translations$progressPage$total$sl total = _Translations$progressPage$total$sl._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$sl extends Translations$webSharePage$en { + _Translations$webSharePage$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Deli prek povezave'; + @override + String get loading => 'Zagon strežnika...'; + @override + String get stopping => 'Ustavitev strežnika...'; + @override + String get error => 'Prišlo je do napake pri zagonu strežnika.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sl'))( + n, + one: 'Odprite to povezavo v svojem brskalniku:', + other: 'Odprite eno od teh povezav v svojem brskalniku:', + ); + @override + String get requests => 'Zahteve'; + @override + String get noRequests => 'Zaenkrat ni nobenih zahtev.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Samodejno sprejemaj zahteve'; + @override + String get requirePin => 'Zahtevaj PIN'; + @override + String pinHint({required Object pin}) => 'PIN je "${pin}"'; + @override + String get encryptionHint => 'LocalSend uporablja samopodpisano potrdilo. Sprejeti ga morate v svojem brskalniku.'; + @override + String pendingRequests({required Object n}) => 'Čakajoče zahteve: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$sl extends Translations$aboutPage$en { + _Translations$aboutPage$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'O LocalSend'; + @override + List get description => [ + 'LocalSend je brezplačna, odprtokodna aplikacija, ki vam omogoča varno deljenje datotek in sporočil z napravami v bližini prek lokalnega omrežja brez potrebe po internetni povezavi.', + 'Aplikacija je na voljo za Android, iOS, macOS, Windows in Linux. Vse možnosti prenosa lahko najdete na uradni spletni strani.', + ]; + @override + String get author => 'Avtor'; + @override + String get contributors => 'Sodelavci'; + @override + String get packagers => 'Paketniki'; + @override + String get translators => 'Prevajalci'; +} + +// Path: donationPage +class _Translations$donationPage$sl extends Translations$donationPage$en { + _Translations$donationPage$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Doniraj'; + @override + String get info => 'LocalSend je brezplačna, odprtokodna in brez oglasov. Če vam je aplikacija všeč, lahko podprete razvoj z donacijo.'; + @override + String donate({required Object amount}) => 'Doniraj ${amount}'; + @override + String get thanks => 'Najlepša hvala!'; + @override + String get restore => 'Obnovi nakup'; +} + +// Path: changelogPage +class _Translations$changelogPage$sl extends Translations$changelogPage$en { + _Translations$changelogPage$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dnevnik sprememb'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$sl extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Ljubek', + 'Lep', + 'Velik', + 'Svetel', + 'Čist', + 'Pameten', + 'Kul', + 'Prisrčen', + 'Prebrisan', + 'Odločen', + 'Energijski', + 'Učinkovit', + 'Fantastičen', + 'Hiter', + 'Fin', + 'Svež', + 'Dober', + 'Čudovit', + 'Odličen', + 'Postaven', + 'Vroč', + 'Prijazen', + 'Ljubek', + 'Mističen', + 'Urejen', + 'Lep', + 'Potrpežljiv', + 'Prikupen', + 'Mogočen', + 'Bogat', + 'Skrivnosten', + 'Pameten', + 'Trden', + 'Poseben', + 'Strateški', + 'Močan', + 'Pospravljeno', + 'Moder', + ]; + @override + List get fruits => [ + 'Jabolko', + 'Avokado', + 'Banana', + 'Robida', + 'Borovnica', + 'Brokoli', + 'Korenček', + 'Češnja', + 'Kokos', + 'Grozdje', + 'Limona', + 'Solata', + 'Mango', + 'Melona', + 'Goba', + 'Čebula', + 'Pomaranča', + 'Papaja', + 'Breskev', + 'Hruška', + 'Ananas', + 'Krompir', + 'Buča', + 'Malina', + 'Jagoda', + 'Paradižnik', + ]; + + /// V nekaterih jezikih mora biti pridevnik na koncu. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$sl extends Translations$dialogs$en { + _Translations$dialogs$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$sl addFile = _Translations$dialogs$addFile$sl._(_root); + @override + late final _Translations$dialogs$addressInput$sl addressInput = _Translations$dialogs$addressInput$sl._(_root); + @override + late final _Translations$dialogs$cancelSession$sl cancelSession = _Translations$dialogs$cancelSession$sl._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$sl cannotOpenFile = _Translations$dialogs$cannotOpenFile$sl._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$sl encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$sl._(_root); + @override + late final _Translations$dialogs$errorDialog$sl errorDialog = _Translations$dialogs$errorDialog$sl._(_root); + @override + late final _Translations$dialogs$favoriteDialog$sl favoriteDialog = _Translations$dialogs$favoriteDialog$sl._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$sl favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$sl._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$sl favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$sl._(_root); + @override + late final _Translations$dialogs$fileInfo$sl fileInfo = _Translations$dialogs$fileInfo$sl._(_root); + @override + late final _Translations$dialogs$fileNameInput$sl fileNameInput = _Translations$dialogs$fileNameInput$sl._(_root); + @override + late final _Translations$dialogs$historyClearDialog$sl historyClearDialog = _Translations$dialogs$historyClearDialog$sl._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$sl localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$sl._(_root); + @override + late final _Translations$dialogs$messageInput$sl messageInput = _Translations$dialogs$messageInput$sl._(_root); + @override + late final _Translations$dialogs$noFiles$sl noFiles = _Translations$dialogs$noFiles$sl._(_root); + @override + late final _Translations$dialogs$noPermission$sl noPermission = _Translations$dialogs$noPermission$sl._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$sl notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$sl._(_root); + @override + late final _Translations$dialogs$qr$sl qr = _Translations$dialogs$qr$sl._(_root); + @override + late final _Translations$dialogs$quickActions$sl quickActions = _Translations$dialogs$quickActions$sl._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$sl quickSaveNotice = _Translations$dialogs$quickSaveNotice$sl._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$sl quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$sl._(_root); + @override + late final _Translations$dialogs$pin$sl pin = _Translations$dialogs$pin$sl._(_root); + @override + late final _Translations$dialogs$sendModeHelp$sl sendModeHelp = _Translations$dialogs$sendModeHelp$sl._(_root); + @override + late final _Translations$dialogs$zoom$sl zoom = _Translations$dialogs$zoom$sl._(_root); +} + +// Path: sanitization +class _Translations$sanitization$sl extends Translations$sanitization$en { + _Translations$sanitization$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Ime datoteke ne sme biti prazno'; + @override + String get invalid => 'Ime datoteke vsebuje neveljavne znake'; +} + +// Path: tray +class _Translations$tray$sl extends Translations$tray$en { + _Translations$tray$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Zapri LocalSend'; + @override + String get closeWindows => 'Izhod'; +} + +// Path: web +class _Translations$web$sl extends Translations$web$en { + _Translations$web$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Vnesite PIN'; + @override + String get invalidPin => 'Neveljaven PIN'; + @override + String get tooManyAttempts => 'Preveč poskusov'; + @override + String get rejected => 'Zavrnjeno'; + @override + String get files => 'Datoteke'; + @override + String get fileName => 'Ime datoteke'; + @override + String get size => 'Velikost'; +} + +// Path: assetPicker +class _Translations$assetPicker$sl extends Translations$assetPicker$en { + _Translations$assetPicker$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Potrdi'; + @override + String get cancel => 'Prekliči'; + @override + String get edit => 'Uredi'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Nalaganje ni uspelo'; + @override + String get original => 'Izvirnik'; + @override + String get preview => 'Predogled'; + @override + String get select => 'Izberi'; + @override + String get emptyList => 'Prazno'; + @override + String get unSupportedAssetType => 'Nepodprt tip datoteke.'; + @override + String get unableToAccessAll => 'Ni mogoče dostopati do vseh datotek na napravi'; + @override + String get viewingLimitedAssetsTip => 'Prikaži samo datoteke in albume, do katerih ima aplikacija dostop.'; + @override + String get changeAccessibleLimitedAssets => 'Kliknite za posodobitev dostopnih datotek'; + @override + String get accessAllTip => + 'Aplikacija lahko dostopa le do nekaterih datotek na napravi. Pojdite v sistemske nastavitve in omogočite dostop do vseh medijev na napravi.'; + @override + String get goToSystemSettings => 'Pojdi v sistemske nastavitve'; + @override + String get accessLimitedAssets => 'Nadaljuj z omejenim dostopom'; + @override + String get accessiblePathName => 'Dostopne datoteke'; + @override + String get sTypeAudioLabel => 'Zvok'; + @override + String get sTypeImageLabel => 'Slika'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Ostalo'; + @override + String get sActionPlayHint => 'predvajaj'; + @override + String get sActionPreviewHint => 'predogled'; + @override + String get sActionSelectHint => 'izberi'; + @override + String get sActionSwitchPathLabel => 'spremeni pot'; + @override + String get sActionUseCameraHint => 'uporabi kamero'; + @override + String get sNameDurationLabel => 'trajanje'; + @override + String get sUnitAssetCountLabel => 'številka'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$sl extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Vrata:'; + @override + String get alias => 'Ime naprave:'; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$sl extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Izbira'; + @override + String files({required Object files}) => 'Datoteke: ${files}'; + @override + String size({required Object size}) => 'Velikost: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$sl extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get file => 'Datoteka'; + @override + String get folder => 'Mapa'; + @override + String get media => 'Mediji'; + @override + String get text => 'Besedilo'; + @override + String get app => 'Aplikacija'; + @override + String get clipboard => 'Prilepi'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$sl extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get single => 'En prejemnik'; + @override + String get multiple => 'Več prejemnikov'; + @override + String get link => 'Deli prek povezave'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$sl extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Splošno'; + @override + String get brightness => 'Tema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$sl brightnessOptions = _Translations$settingsTab$general$brightnessOptions$sl._( + _root, + ); + @override + String get color => 'Barva'; + @override + late final _Translations$settingsTab$general$colorOptions$sl colorOptions = _Translations$settingsTab$general$colorOptions$sl._(_root); + @override + String get language => 'Jezik'; + @override + late final _Translations$settingsTab$general$languageOptions$sl languageOptions = _Translations$settingsTab$general$languageOptions$sl._(_root); + @override + String get saveWindowPlacement => 'Shrani položaj okna ob izhodu'; + @override + String get saveWindowPlacementWindows => 'Shrani položaj okna ob zaprtju'; + @override + String get minimizeToTray => 'Ob zaprtju minimiziraj v sistemski pladenj / meni'; + @override + String get launchAtStartup => 'Samodejni zagon po prijavi'; + @override + String get launchMinimized => 'Samodejni zagon: Začni skrito'; + @override + String get showInContextMenu => 'Prikaži LocalSend v kontekstnem meniju'; + @override + String get animations => 'Animacije'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$sl extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Prejem'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Samodejno dokončaj'; + @override + String get destination => 'Shrani v mapo'; + @override + String get downloads => '(Prenosi)'; + @override + String get saveToGallery => 'Shrani medije v galerijo'; + @override + String get saveToHistory => 'Shrani v zgodovino'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$sl extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Pošlji'; + @override + String get shareViaLinkAutoAccept => 'Samodejno sprejmi zahteve v načinu »Deli prek povezave«'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$sl extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Omrežje'; + @override + String get needRestart => 'Ponovno zaženite strežnik, da uveljavite nastavitve!'; + @override + String get server => 'Strežnik'; + @override + String get alias => 'Ime naprave'; + @override + String get deviceType => 'Tip naprave'; + @override + String get deviceModel => 'Model naprave'; + @override + String get port => 'Vrata'; + @override + String get discoveryTimeout => 'Časovna omejitev za odkrivanje'; + @override + String get useSystemName => 'Uporabi sistemsko ime'; + @override + String get generateRandomAlias => 'Ustvari naključni vzdevek'; + @override + String portWarning({required Object defaultPort}) => + 'Morda vas druge naprave ne bodo zaznale, ker uporabljate nestandardna vrata. (privzeto: ${defaultPort})'; + @override + String get encryption => 'Šifriranje'; + @override + String get multicastGroup => 'Večtočkovni naslov'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Morda vas druge naprave ne bodo zaznale, ker uporabljate nestandardni večtočkovni naslov. (privzeto: ${defaultMulticast})'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$sl extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Drugo'; + @override + String get support => 'Podprite LocalSend'; + @override + String get donate => 'Donirajte'; + @override + String get privacyPolicy => 'Politika zasebnosti'; + @override + String get termsOfUse => 'Pogoji uporabe'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$sl extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ta naprava lahko pošilja datoteke, ne more pa jih prejemati.'; + @override + String solution({required Object port}) => 'Verjetno gre za težavo z požarnim zidom. Dovoli dohodne povezave (UDP in TCP) na vrata ${port}.'; + @override + String get openFirewall => 'Odpri požarni zid'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$sl extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ta naprava ne more najti drugih naprav.'; + @override + String get solution => + 'Preverite, da so vse naprave v istem Wi-Fi omrežju in imajo enako konfiguracijo (vrata, večtočkovni naslov, šifriranje). Poskusite ročno vnesti IP naslov ciljne naprave. Če to deluje, jo dodajte med priljubljene za prihodnje odkrivanje.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$sl extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Naprave se ne najdejo in ne morejo deliti datotek.'; + @override + String get solution => + 'Preverite, da so obe napravi v istem Wi-Fi omrežju in imajo enake nastavitve (vrata, večtočkovni naslov, šifriranje). Morda omrežje preprečuje komunikacijo med udeleženci (izolacija AP).'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$sl extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get open => 'Odpri datoteko'; + @override + String get showInFolder => 'Prikaži v mapi'; + @override + String get info => 'Informacije'; + @override + String get deleteFromHistory => 'Izbriši iz zgodovine'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$sl extends Translations$progressPage$total$en { + _Translations$progressPage$total$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$sl title = _Translations$progressPage$total$title$sl._(_root); + @override + String count({required Object curr, required Object n}) => 'Datoteke: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Velikost: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Hitrost: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$sl extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dodaj k izbiri'; + @override + String get content => 'Kaj želite dodati?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$sl extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Vnesite naslov'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP naslov'; + @override + String get recentlyUsed => 'Nedavno uporabljeno: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$sl extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Prekliči prenos datotek'; + @override + String get content => 'Ali res želite preklicati prenos datotek?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$sl extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ne morem odpreti datoteke'; + @override + String content({required Object file}) => 'Ni mogoče odpreti "${file}". Ali je bila ta datoteka premaknjena, preimenovana ali izbrisana?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$sl extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Šifriranje onemogočeno'; + @override + String get content => 'Komunikacija zdaj poteka prek nezaščitenega HTTP protokola. Če želite uporabljati HTTPS, znova omogočite šifriranje.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$sl extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$sl extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Priljubljene naprave'; + @override + String get noFavorites => 'Ni še priljubljenih naprav.'; + @override + String get addFavorite => 'Dodaj'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$sl extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Izbriši iz priljubljenih'; + @override + String content({required Object name}) => 'Ali res želite izbrisati napravo "${name}" iz priljubljenih?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$sl extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Dodaj v priljubljene'; + @override + String get titleEdit => 'Nastavitve'; + @override + String get name => 'Ime naprave'; + @override + String get auto => '(samodejno)'; + @override + String get ip => 'IP naslov'; + @override + String get port => 'Vrata'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$sl extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informacije o datoteki'; + @override + String get fileName => 'Ime datoteke:'; + @override + String get path => 'Pot:'; + @override + String get size => 'Velikost:'; + @override + String get sender => 'Pošiljatelj:'; + @override + String get time => 'Čas:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$sl extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Vnesite ime datoteke'; + @override + String original({required Object original}) => 'Izvirno: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$sl extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Počisti zgodovino'; + @override + String get content => 'Ali res želite izbrisati celotno zgodovino?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$sl extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend ne more najti drugih naprav brez dovoljenja za iskanje v lokalnem omrežju. Prosim, omogočite to dovoljenje v nastavitvah.'; + @override + String get gotoSettings => 'Nastavitve'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$sl extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Vnesite sporočilo'; + @override + String get multiline => 'Več vrstic'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$sl extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ni izbranih datotek'; + @override + String get content => 'Prosim, izberite vsaj eno datoteko.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$sl extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ni dovoljenja'; + @override + String get content => 'Niste podelili zahtevanih dovoljenj. Prosim, omogočite jih v nastavitvah.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$sl extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ni na voljo'; + @override + String get content => 'Ta funkcija je na voljo samo na:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$sl extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR koda'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$sl extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hitre akcije'; + @override + String get counter => 'Števec'; + @override + String get prefix => 'Predpona'; + @override + String get padZero => 'Dodaj ničle'; + @override + String get sortBeforeCount => 'Predhodno uredi po abecedi (A-Ž)'; + @override + String get random => 'Naključno'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$sl extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Zahteve za datoteke so zdaj samodejno sprejete. Bodite pozorni, da vam lahko vsi v lokalnem omrežju pošiljajo datoteke.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$sl extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$sl extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Vnesite PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$sl extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Načini pošiljanja'; + @override + String get single => 'Pošlje datoteke enemu prejemniku. Izbira bo po končanem prenosu izbrisana.'; + @override + String get multiple => 'Pošlje datoteke več prejemnikom. Izbira po končanem prenosu ne bo izbrisana.'; + @override + String get link => 'Prejemniki, ki nimajo nameščenega LocalSend, lahko prenesejo izbrane datoteke z odpiranjem povezave v brskalniku.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$sl extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$sl extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; + @override + String get dark => 'Temna'; + @override + String get light => 'Svetla'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$sl extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$sl extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$sl extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$sl._(TranslationsSl root) : this._root = root, super.internal(root); + + final TranslationsSl _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Skupni napredek (${time})'; + @override + String get finishedError => 'Zaključeno z napako'; + @override + String get canceledSender => 'Preklical pošiljatelj'; + @override + String get canceledReceiver => 'Preklical prejemnik'; +} diff --git a/app/lib/gen/strings_sr.g.dart b/app/lib/gen/strings_sr.g.dart new file mode 100644 index 0000000..f75e016 --- /dev/null +++ b/app/lib/gen/strings_sr.g.dart @@ -0,0 +1,1502 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsSr extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsSr({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.sr, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsSr _root = this; // ignore: unused_field + + @override + TranslationsSr $copyWith({TranslationMetadata? meta}) => TranslationsSr(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Srpski (latinica)'; + @override + String get appName => 'LocalSend'; + @override + late final Translations$general$sr general = Translations$general$sr.internal(_root); + @override + late final Translations$receiveTab$sr receiveTab = Translations$receiveTab$sr.internal(_root); + @override + late final Translations$sendTab$sr sendTab = Translations$sendTab$sr.internal(_root); + @override + late final Translations$settingsTab$sr settingsTab = Translations$settingsTab$sr.internal(_root); + @override + late final Translations$troubleshootPage$sr troubleshootPage = Translations$troubleshootPage$sr.internal(_root); + @override + late final Translations$receiveHistoryPage$sr receiveHistoryPage = Translations$receiveHistoryPage$sr.internal(_root); + @override + late final Translations$apkPickerPage$sr apkPickerPage = Translations$apkPickerPage$sr.internal(_root); + @override + late final Translations$selectedFilesPage$sr selectedFilesPage = Translations$selectedFilesPage$sr.internal(_root); + @override + late final Translations$receivePage$sr receivePage = Translations$receivePage$sr.internal(_root); + @override + late final Translations$receiveOptionsPage$sr receiveOptionsPage = Translations$receiveOptionsPage$sr.internal(_root); + @override + late final Translations$sendPage$sr sendPage = Translations$sendPage$sr.internal(_root); + @override + late final Translations$progressPage$sr progressPage = Translations$progressPage$sr.internal(_root); + @override + late final Translations$webSharePage$sr webSharePage = Translations$webSharePage$sr.internal(_root); + @override + late final Translations$aboutPage$sr aboutPage = Translations$aboutPage$sr.internal(_root); + @override + late final Translations$donationPage$sr donationPage = Translations$donationPage$sr.internal(_root); + @override + late final Translations$changelogPage$sr changelogPage = Translations$changelogPage$sr.internal(_root); + @override + late final Translations$aliasGenerator$sr aliasGenerator = Translations$aliasGenerator$sr.internal(_root); + @override + late final Translations$dialogs$sr dialogs = Translations$dialogs$sr.internal(_root); + @override + late final Translations$sanitization$sr sanitization = Translations$sanitization$sr.internal(_root); + @override + late final Translations$tray$sr tray = Translations$tray$sr.internal(_root); + @override + late final Translations$web$sr web = Translations$web$sr.internal(_root); + @override + late final Translations$assetPicker$sr assetPicker = Translations$assetPicker$sr.internal(_root); + @override + late final Translations$networkInterfacesPage$sr networkInterfacesPage = Translations$networkInterfacesPage$sr.internal(_root); +} + +// Path: general +class Translations$general$sr extends Translations$general$en { + Translations$general$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Prihvati'; + @override + String get accepted => 'Prihvaćeno'; + @override + String get add => 'Dodaj'; + @override + String get advanced => 'Napredno'; + @override + String get cancel => 'Otkaži'; + @override + String get close => 'Zatvori'; + @override + String get confirm => 'Potvrdi'; + @override + String get continueStr => 'Nastavi'; + @override + String get copy => 'Kopiraj'; + @override + String get copiedToClipboard => 'Kopirano u privremenu memoriju'; + @override + String get decline => 'Odbij'; + @override + String get done => 'Gotovo'; + @override + String get delete => 'Izbriši'; + @override + String get edit => 'Izmeni'; + @override + String get error => 'Greška'; + @override + String get example => 'Primer'; + @override + String get files => 'Fajlovi'; + @override + String get finished => 'Završeno'; + @override + String get hide => 'Sakrij'; + @override + String get off => 'Isključeno'; + @override + String get offline => 'Oflajn'; + @override + String get on => 'Uključeno'; + @override + String get online => 'Onlajn'; + @override + String get open => 'Otvori'; + @override + String get queue => 'Redosled'; + @override + String get quickSave => 'Brzo čuvanje'; + @override + String get quickSaveFromFavorites => 'Brzo čuvanje u „Omiljeno“'; + @override + String get renamed => 'Preimenovano'; + @override + String get reset => 'Poništi promene'; + @override + String get restart => 'Restartuj'; + @override + String get settings => 'Podešavanja'; + @override + String get skipped => 'Preskočeno'; + @override + String get start => 'Pokreni'; + @override + String get stop => 'Zaustavi'; + @override + String get save => 'Sačuvaj'; + @override + String get unchanged => 'Nepromenjeno'; + @override + String get unknown => 'Nepoznato'; + @override + String get noItemInClipboard => 'Nema predmeta u privremenoj memoriji.'; +} + +// Path: receiveTab +class Translations$receiveTab$sr extends Translations$receiveTab$en { + Translations$receiveTab$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Primanje'; + @override + late final Translations$receiveTab$infoBox$sr infoBox = Translations$receiveTab$infoBox$sr.internal(_root); + @override + late final Translations$receiveTab$quickSave$sr quickSave = Translations$receiveTab$quickSave$sr.internal(_root); +} + +// Path: sendTab +class Translations$sendTab$sr extends Translations$sendTab$en { + Translations$sendTab$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Slanje'; + @override + late final Translations$sendTab$selection$sr selection = Translations$sendTab$selection$sr.internal(_root); + @override + late final Translations$sendTab$picker$sr picker = Translations$sendTab$picker$sr.internal(_root); + @override + String get shareIntentInfo => 'Takođe, možete da koristite funkciju „Deli“ na svom mobilnom uređaju da biste lakše birali fajlove.'; + @override + String get nearbyDevices => 'Uređaji u blizini'; + @override + String get thisDevice => 'Ovaj uređaj'; + @override + String get scan => 'Pretraga uređaja'; + @override + String get manualSending => 'Ručno slanje'; + @override + String get sendMode => 'Režim slanja'; + @override + late final Translations$sendTab$sendModes$sr sendModes = Translations$sendTab$sendModes$sr.internal(_root); + @override + String get sendModeHelp => 'Objašnjenje'; + @override + String get help => 'Uverite se da je primalac takođe na istoj Wi-Fi mreži.'; + @override + String get placeItems => 'Postavite predmete za deljenje.'; +} + +// Path: settingsTab +class Translations$settingsTab$sr extends Translations$settingsTab$en { + Translations$settingsTab$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Podešavanja'; + @override + late final Translations$settingsTab$general$sr general = Translations$settingsTab$general$sr.internal(_root); + @override + late final Translations$settingsTab$receive$sr receive = Translations$settingsTab$receive$sr.internal(_root); + @override + late final Translations$settingsTab$send$sr send = Translations$settingsTab$send$sr.internal(_root); + @override + late final Translations$settingsTab$network$sr network = Translations$settingsTab$network$sr.internal(_root); + @override + late final Translations$settingsTab$other$sr other = Translations$settingsTab$other$sr.internal(_root); + @override + String get advancedSettings => 'Napredna podešavanja'; +} + +// Path: troubleshootPage +class Translations$troubleshootPage$sr extends Translations$troubleshootPage$en { + Translations$troubleshootPage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Otklanjanje grešaka'; + @override + String get subTitle => 'Da li aplikacija radi kako treba? Ovde možete pronaći neka uobičajena rešenja problema.'; + @override + String get solution => 'Rešenje:'; + @override + String get fixButton => 'Popravi automatski'; + @override + late final Translations$troubleshootPage$firewall$sr firewall = Translations$troubleshootPage$firewall$sr.internal(_root); + @override + late final Translations$troubleshootPage$noDiscovery$sr noDiscovery = Translations$troubleshootPage$noDiscovery$sr.internal(_root); + @override + late final Translations$troubleshootPage$noConnection$sr noConnection = Translations$troubleshootPage$noConnection$sr.internal(_root); +} + +// Path: receiveHistoryPage +class Translations$receiveHistoryPage$sr extends Translations$receiveHistoryPage$en { + Translations$receiveHistoryPage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Istorija'; + @override + String get openFolder => 'Otvori folder'; + @override + String get deleteHistory => 'Izbriši istoriju'; + @override + String get empty => 'Istorija je prazna.'; + @override + late final Translations$receiveHistoryPage$entryActions$sr entryActions = Translations$receiveHistoryPage$entryActions$sr.internal(_root); +} + +// Path: apkPickerPage +class Translations$apkPickerPage$sr extends Translations$apkPickerPage$en { + Translations$apkPickerPage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Aplikacije (APK)'; + @override + String get excludeSystemApps => 'Izuzmi sistemske aplikacije'; + @override + String get excludeAppsWithoutLaunchIntent => 'Izuzmi aplikacije koje se ne pokreću'; + @override + String apps({required Object n}) => '${n} aplikacija'; +} + +// Path: selectedFilesPage +class Translations$selectedFilesPage$sr extends Translations$selectedFilesPage$en { + Translations$selectedFilesPage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Izbriši sve'; +} + +// Path: receivePage +class Translations$receivePage$sr extends Translations$receivePage$en { + Translations$receivePage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sr'))( + n, + one: 'želi da vam pošalje fajl', + other: 'želi da vam pošalje ${n} fajlova', + ); + @override + String get subTitleMessage => 'poslao vam je poruku:'; + @override + String get subTitleLink => 'poslao vam je link:'; + @override + String get canceled => 'Pošiljalac je otkazao zahtev.'; +} + +// Path: receiveOptionsPage +class Translations$receiveOptionsPage$sr extends Translations$receiveOptionsPage$en { + Translations$receiveOptionsPage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Opcije'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend folder)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Automatski isključeno jer postoje folderi.'; +} + +// Path: sendPage +class Translations$sendPage$sr extends Translations$sendPage$en { + Translations$sendPage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Čekanje odgovora…'; + @override + String get rejected => 'Primalac je odbio zahtev.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Primalac je zauzet drugim zahtevom.'; +} + +// Path: progressPage +class Translations$progressPage$sr extends Translations$progressPage$en { + Translations$progressPage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Slanje fajlova'; + @override + String get titleReceiving => 'Primanje fajlova'; + @override + String get savedToGallery => 'Sačuvano u galeriji'; + @override + late final Translations$progressPage$total$sr total = Translations$progressPage$total$sr.internal(_root); +} + +// Path: webSharePage +class Translations$webSharePage$sr extends Translations$webSharePage$en { + Translations$webSharePage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Deljenje putem linka'; + @override + String get loading => 'Pokretanje servera…'; + @override + String get stopping => 'Zaustavljanje servera…'; + @override + String get error => 'Došlo je do greške prilikom pokretanja servera.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sr'))( + n, + one: 'Otvorite ovaj link u vašem pregledaču:', + other: 'Otvorite jedan od ovih linkova u vašem pregledaču:', + ); + @override + String get requests => 'Zahtevi'; + @override + String get noRequests => 'Još uvek nema zahteva.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Automatski prihvati zahteve'; + @override + String get requirePin => 'Zahtevaj PIN'; + @override + String pinHint({required Object pin}) => 'PIN je „${pin}“'; + @override + String get encryptionHint => 'LocalSend koristi samopotpisani sertifikat. Morate ga prihvatiti u svom pregledaču.'; + @override + String pendingRequests({required Object n}) => 'Zahtevi na čekanju: ${n}'; +} + +// Path: aboutPage +class Translations$aboutPage$sr extends Translations$aboutPage$en { + Translations$aboutPage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'O LocalSend-u'; + @override + List get description => [ + 'LocalSend je besplatna aplikacija otvorenog koda koja vam omogućava da bezbedno delite fajlove i poruke sa uređajima u blizini preko vaše lokalne mreže, bez potrebe za internet vezom.', + 'Ova aplikacije je dostupna za Android, iOS, macOS, Windows i Linux. Možete pronaći sve opcije za preuzimanje na zvaničnoj početnoj stranici.', + ]; + @override + String get author => 'Autor'; + @override + String get contributors => 'Saradnici'; + @override + String get packagers => 'Pakeri'; + @override + String get translators => 'Prevodioci'; +} + +// Path: donationPage +class Translations$donationPage$sr extends Translations$donationPage$en { + Translations$donationPage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Donacija'; + @override + String get info => 'LocalSend je besplatan, otvorenog koda i bez ikakvih oglasa. Ako vam se sviđa aplikacija, možete podržati razvoj donacijom.'; + @override + String donate({required Object amount}) => 'Doniraj ${amount}'; + @override + String get thanks => 'Hvala vam puno!'; + @override + String get restore => 'Vrati kupovinu'; +} + +// Path: changelogPage +class Translations$changelogPage$sr extends Translations$changelogPage$en { + Translations$changelogPage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Evidencija promena'; +} + +// Path: aliasGenerator +class Translations$aliasGenerator$sr extends Translations$aliasGenerator$en { + Translations$aliasGenerator$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Neodoljiva', + 'Prelepa', + 'Velika', + 'Bistra', + 'Čista', + 'Pametna', + 'Hladnjikava', + 'Slatka', + 'Lukava', + 'Odlučna', + 'Energetska', + 'Efikasna', + 'Fantastična', + 'Brza', + 'Fina', + 'Sveža', + 'Dobra', + 'Divna', + 'Velika', + 'Zgodna', + 'Vruća', + 'Nežna', + 'Ljubazna', + 'Mistična', + 'Uredna', + 'Lepa', + 'Strpljiva', + 'Prelepa', + 'Moćna', + 'Bogata', + 'Tajnovita', + 'Pametna', + 'Čvrsta', + 'Specijalna', + 'Budjava', + 'Jaka', + 'Uredna', + 'Mudra', + ]; + @override + List get fruits => [ + 'Jabuka', + 'Šljiva', + 'Banana', + 'Borovnica', + 'Ribizla', + 'Kajsija', + 'Šargarepa', + 'Trešnja', + 'Paprika', + 'Papričica', + 'Krompiruša', + 'Kupusara', + 'Rotkvica', + 'Lubenica', + 'Pečurka', + 'Mandarina', + 'Pomorandža', + 'Papaja', + 'Breskva', + 'Kruška', + 'Šišarka', + 'Dinja', + 'Bundeva', + 'Višnja', + 'Jagoda', + 'Dunja', + ]; + + /// In some languages, the adjective must be last. Not the case in Serbian, but serbian adjectives must have endings which depend on the gender of the noun. That's why we put all the Fruits with the female form and corresponding adjective endings in female form for this translation. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class Translations$dialogs$sr extends Translations$dialogs$en { + Translations$dialogs$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + late final Translations$dialogs$addFile$sr addFile = Translations$dialogs$addFile$sr.internal(_root); + @override + late final Translations$dialogs$openFile$sr openFile = Translations$dialogs$openFile$sr.internal(_root); + @override + late final Translations$dialogs$addressInput$sr addressInput = Translations$dialogs$addressInput$sr.internal(_root); + @override + late final Translations$dialogs$cancelSession$sr cancelSession = Translations$dialogs$cancelSession$sr.internal(_root); + @override + late final Translations$dialogs$cannotOpenFile$sr cannotOpenFile = Translations$dialogs$cannotOpenFile$sr.internal(_root); + @override + late final Translations$dialogs$encryptionDisabledNotice$sr encryptionDisabledNotice = Translations$dialogs$encryptionDisabledNotice$sr.internal( + _root, + ); + @override + late final Translations$dialogs$errorDialog$sr errorDialog = Translations$dialogs$errorDialog$sr.internal(_root); + @override + late final Translations$dialogs$favoriteDialog$sr favoriteDialog = Translations$dialogs$favoriteDialog$sr.internal(_root); + @override + late final Translations$dialogs$favoriteDeleteDialog$sr favoriteDeleteDialog = Translations$dialogs$favoriteDeleteDialog$sr.internal(_root); + @override + late final Translations$dialogs$favoriteEditDialog$sr favoriteEditDialog = Translations$dialogs$favoriteEditDialog$sr.internal(_root); + @override + late final Translations$dialogs$fileInfo$sr fileInfo = Translations$dialogs$fileInfo$sr.internal(_root); + @override + late final Translations$dialogs$fileNameInput$sr fileNameInput = Translations$dialogs$fileNameInput$sr.internal(_root); + @override + late final Translations$dialogs$historyClearDialog$sr historyClearDialog = Translations$dialogs$historyClearDialog$sr.internal(_root); + @override + late final Translations$dialogs$localNetworkUnauthorized$sr localNetworkUnauthorized = Translations$dialogs$localNetworkUnauthorized$sr.internal( + _root, + ); + @override + late final Translations$dialogs$messageInput$sr messageInput = Translations$dialogs$messageInput$sr.internal(_root); + @override + late final Translations$dialogs$noFiles$sr noFiles = Translations$dialogs$noFiles$sr.internal(_root); + @override + late final Translations$dialogs$noPermission$sr noPermission = Translations$dialogs$noPermission$sr.internal(_root); + @override + late final Translations$dialogs$notAvailableOnPlatform$sr notAvailableOnPlatform = Translations$dialogs$notAvailableOnPlatform$sr.internal(_root); + @override + late final Translations$dialogs$qr$sr qr = Translations$dialogs$qr$sr.internal(_root); + @override + late final Translations$dialogs$quickActions$sr quickActions = Translations$dialogs$quickActions$sr.internal(_root); + @override + late final Translations$dialogs$quickSaveNotice$sr quickSaveNotice = Translations$dialogs$quickSaveNotice$sr.internal(_root); + @override + late final Translations$dialogs$quickSaveFromFavoritesNotice$sr quickSaveFromFavoritesNotice = + Translations$dialogs$quickSaveFromFavoritesNotice$sr.internal(_root); + @override + late final Translations$dialogs$pin$sr pin = Translations$dialogs$pin$sr.internal(_root); + @override + late final Translations$dialogs$sendModeHelp$sr sendModeHelp = Translations$dialogs$sendModeHelp$sr.internal(_root); + @override + late final Translations$dialogs$zoom$sr zoom = Translations$dialogs$zoom$sr.internal(_root); +} + +// Path: sanitization +class Translations$sanitization$sr extends Translations$sanitization$en { + Translations$sanitization$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Naziv fajla ne može biti prazan'; + @override + String get invalid => 'Naziv fajla sadrži nevažeće znakove'; +} + +// Path: tray +class Translations$tray$sr extends Translations$tray$en { + Translations$tray$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Napusti LocalSend'; + @override + String get closeWindows => 'Izađi'; +} + +// Path: web +class Translations$web$sr extends Translations$web$en { + Translations$web$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Unesite PIN'; + @override + String get invalidPin => 'Neispravan PIN'; + @override + String get tooManyAttempts => 'Previše pokušaja'; + @override + String get rejected => 'Odbijeno'; + @override + String get files => 'Fajlovi'; + @override + String get fileName => 'Naziv fajla'; + @override + String get size => 'Veličina'; +} + +// Path: assetPicker +class Translations$assetPicker$sr extends Translations$assetPicker$en { + Translations$assetPicker$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Potvrdi'; + @override + String get cancel => 'Otkaži'; + @override + String get edit => 'Izmeni'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Učitavanje neuspešno'; + @override + String get original => 'Poreklo'; + @override + String get preview => 'Pregled'; + @override + String get select => 'Izaberi'; + @override + String get emptyList => 'Očisti listu'; + @override + String get unSupportedAssetType => 'Nepodržan tip fajla.'; + @override + String get unableToAccessAll => 'Nije moguće pristupiti svim fajlovima na uređaju'; + @override + String get viewingLimitedAssetsTip => 'Samo fajlovi za gledanje i albumi dostupni aplikaciji.'; + @override + String get changeAccessibleLimitedAssets => 'Dodirnite da ažurirate dostupne fajlove'; + @override + String get accessAllTip => + 'Aplikacija može da pristupi samo nekim fajlovima na uređaju. Idite u sistemska podešavanja i dozvolite aplikaciji pristup svim medijima na uređaju.'; + @override + String get goToSystemSettings => 'Idi u sistemska podešavanja'; + @override + String get accessLimitedAssets => 'Nastavi sa ograničenim pristupom'; + @override + String get accessiblePathName => 'Dostupni fajlovi'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Slika'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Ostali mediji'; + @override + String get sActionPlayHint => 'pusti'; + @override + String get sActionPreviewHint => 'pregled'; + @override + String get sActionSelectHint => 'izaberi'; + @override + String get sActionSwitchPathLabel => 'promeni putanju'; + @override + String get sActionUseCameraHint => 'koristi kameru'; + @override + String get sNameDurationLabel => 'trajanje'; + @override + String get sUnitAssetCountLabel => 'broj'; +} + +// Path: networkInterfacesPage +class Translations$networkInterfacesPage$sr extends Translations$networkInterfacesPage$en { + Translations$networkInterfacesPage$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mrežni interfejsi'; + @override + String get preview => 'Pregled'; + @override + String get whitelist => 'Bela lista'; + @override + String get blacklist => 'Crna lista'; + @override + String get info => + 'Podrazumevano, LocalSend koristi sve dostupne mrežne interfejse. Ovde možete izuzeti neželjene mreže. Morate restartovati server da bi se primenile promene.'; +} + +// Path: receiveTab.infoBox +class Translations$receiveTab$infoBox$sr extends Translations$receiveTab$infoBox$en { + Translations$receiveTab$infoBox$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Naziv uređaja:'; +} + +// Path: receiveTab.quickSave +class Translations$receiveTab$quickSave$sr extends Translations$receiveTab$quickSave$en { + Translations$receiveTab$quickSave$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Omiljeno'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class Translations$sendTab$selection$sr extends Translations$sendTab$selection$en { + Translations$sendTab$selection$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Izbor'; + @override + String files({required Object files}) => 'Fajlovi: ${files}'; + @override + String size({required Object size}) => 'Veličina: ${size}'; +} + +// Path: sendTab.picker +class Translations$sendTab$picker$sr extends Translations$sendTab$picker$en { + Translations$sendTab$picker$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get file => 'Fajl'; + @override + String get folder => 'Folder'; + @override + String get media => 'Mediji'; + @override + String get text => 'Tekst'; + @override + String get app => 'Aplikacija'; + @override + String get clipboard => 'Nalepi'; +} + +// Path: sendTab.sendModes +class Translations$sendTab$sendModes$sr extends Translations$sendTab$sendModes$en { + Translations$sendTab$sendModes$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get single => 'Jedan primalac'; + @override + String get multiple => 'Više primalaca'; + @override + String get link => 'Deljenje putem linka'; +} + +// Path: settingsTab.general +class Translations$settingsTab$general$sr extends Translations$settingsTab$general$en { + Translations$settingsTab$general$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Opšte'; + @override + String get brightness => 'Tema'; + @override + late final Translations$settingsTab$general$brightnessOptions$sr brightnessOptions = Translations$settingsTab$general$brightnessOptions$sr.internal( + _root, + ); + @override + String get color => 'Boja'; + @override + late final Translations$settingsTab$general$colorOptions$sr colorOptions = Translations$settingsTab$general$colorOptions$sr.internal(_root); + @override + String get language => 'Jezik'; + @override + late final Translations$settingsTab$general$languageOptions$sr languageOptions = Translations$settingsTab$general$languageOptions$sr.internal( + _root, + ); + @override + String get saveWindowPlacement => 'Sačuvaj položaj prozora nakon napuštanja'; + @override + String get saveWindowPlacementWindows => 'Sačuvaj položaj prozora nakon izlaženja'; + @override + String get minimizeToTray => 'Minimiziraj na sistemsku traku/traku menija prilikom zatvaranja'; + @override + String get launchAtStartup => 'Automatski pokreni nakon prijave'; + @override + String get launchMinimized => 'Automatsko pokretanje: Pokretanje skriveno'; + @override + String get showInContextMenu => 'Prikaži LocalSend u kontekstualnom meniju'; + @override + String get animations => 'Animacije'; +} + +// Path: settingsTab.receive +class Translations$settingsTab$receive$sr extends Translations$settingsTab$receive$en { + Translations$settingsTab$receive$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Primanje'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Automatski završi'; + @override + String get destination => 'Čuvanje u folder'; + @override + String get downloads => '(Downloads)'; + @override + String get saveToGallery => 'Sačuvaj medije u galeriju'; + @override + String get saveToHistory => 'Sačuvaj u istoriji'; +} + +// Path: settingsTab.send +class Translations$settingsTab$send$sr extends Translations$settingsTab$send$en { + Translations$settingsTab$send$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Slanje'; + @override + String get shareViaLinkAutoAccept => 'Automatski prihvati zahteve u režimu „Deljenje putem linka“'; +} + +// Path: settingsTab.network +class Translations$settingsTab$network$sr extends Translations$settingsTab$network$en { + Translations$settingsTab$network$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mreža'; + @override + String get needRestart => 'Restartujte server da bi se primenila podešavanja!'; + @override + String get server => 'Server'; + @override + String get alias => 'Naziv uređaja'; + @override + String get deviceType => 'Tip uređaja'; + @override + String get deviceModel => 'Model uređaja'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Otkrivanje je isteklo'; + @override + String get useSystemName => 'Koristi sistemski naziv'; + @override + String get generateRandomAlias => 'Generiši nasumični pseudonim'; + @override + String portWarning({required Object defaultPort}) => + 'Drugi uređaji vas možda neće otkriti, jer koristite prilagođeni port. (podrazumevani: ${defaultPort})'; + @override + String get encryption => 'Šifrovanje'; + @override + String get multicastGroup => 'Adresa višesmernog emitovanja'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Drugi uređaji vas možda neće otkriti, jer koristite prilagođenu adresu višesmernog emitovanja. (podrazumevana: ${defaultMulticast})'; + @override + String get network => 'Mreža'; + @override + late final Translations$settingsTab$network$networkOptions$sr networkOptions = Translations$settingsTab$network$networkOptions$sr.internal(_root); +} + +// Path: settingsTab.other +class Translations$settingsTab$other$sr extends Translations$settingsTab$other$en { + Translations$settingsTab$other$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ostalo'; + @override + String get support => 'Podržite LocalSend'; + @override + String get donate => 'Doniraj'; + @override + String get privacyPolicy => 'Politika privatnosti'; + @override + String get termsOfUse => 'Uslovi korišćenja'; +} + +// Path: troubleshootPage.firewall +class Translations$troubleshootPage$firewall$sr extends Translations$troubleshootPage$firewall$en { + Translations$troubleshootPage$firewall$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ovaj uređaj može slati fajlove drugim uređajima, ali drugi uređaji ne mogu slati fajlove ovom uređaju.'; + @override + String solution({required Object port}) => + 'Ovo je najverovatnije problem sa zaštitnim zidom. Ovo možete rešiti tako što ćete dozvoliti dolazne veze (UDP i TCP) na portu ${port}.'; + @override + String get openFirewall => 'Otvori zaštitni zid'; +} + +// Path: troubleshootPage.noDiscovery +class Translations$troubleshootPage$noDiscovery$sr extends Translations$troubleshootPage$noDiscovery$en { + Translations$troubleshootPage$noDiscovery$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ovaj uređaj ne može da otkrije druge uređaje.'; + @override + String get solution => + 'Uverite se da su svi uređaji na istoj Wi-Fi mreži i da imaju istu konfiguraciju (port, adresa višesmernog emitovanja, šifrovanje). Možete pokušati da ručno unesete IP adresu ciljnog uređaja. Ako ovo funkcioniše, razmislite o dodavanju ovog uređaja u omiljene kako bi se mogao automatski otkriti u budućnosti.'; +} + +// Path: troubleshootPage.noConnection +class Translations$troubleshootPage$noConnection$sr extends Translations$troubleshootPage$noConnection$en { + Translations$troubleshootPage$noConnection$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Oba uređaja ne mogu da otkriju jedan drugog niti mogu da dele fajlove.'; + @override + String get solution => + 'Da li problem postoji na obe strane? Ako je tako, potrebno je da se uverite da su oba uređaja na istoj Wi-Fi mreži i da imaju istu konfiguraciju (port, adresa višesmernog emitovanja, šifrovanje). Wi-Fi mreža možda neće dozvoliti komunikaciju između učesnika zbog izolacije pristupne tačke (AP). U ovom slučaju, ova opcija mora biti onemogućena na ruteru.'; +} + +// Path: receiveHistoryPage.entryActions +class Translations$receiveHistoryPage$entryActions$sr extends Translations$receiveHistoryPage$entryActions$en { + Translations$receiveHistoryPage$entryActions$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get open => 'Otvori fajl'; + @override + String get showInFolder => 'Prikaži u folderu'; + @override + String get info => 'Informacije'; + @override + String get deleteFromHistory => 'Izbriši iz istorije'; +} + +// Path: progressPage.total +class Translations$progressPage$total$sr extends Translations$progressPage$total$en { + Translations$progressPage$total$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + late final Translations$progressPage$total$title$sr title = Translations$progressPage$total$title$sr.internal(_root); + @override + String count({required Object curr, required Object n}) => 'Fajlova: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Veličina: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Brzina: ${speed}/s'; +} + +// Path: dialogs.addFile +class Translations$dialogs$addFile$sr extends Translations$dialogs$addFile$en { + Translations$dialogs$addFile$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dodajte u izbor'; + @override + String get content => 'Šta želite dodati?'; +} + +// Path: dialogs.openFile +class Translations$dialogs$openFile$sr extends Translations$dialogs$openFile$en { + Translations$dialogs$openFile$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Otvori fajl'; + @override + String get content => 'Želite li da otvorite primljeni fajl?'; +} + +// Path: dialogs.addressInput +class Translations$dialogs$addressInput$sr extends Translations$dialogs$addressInput$en { + Translations$dialogs$addressInput$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Unesite adresu'; + @override + String get hashtag => 'Heš-oznaka'; + @override + String get ip => 'IP adresa'; + @override + String get recentlyUsed => 'Nedavno korišćeno: '; +} + +// Path: dialogs.cancelSession +class Translations$dialogs$cancelSession$sr extends Translations$dialogs$cancelSession$en { + Translations$dialogs$cancelSession$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Otkažite prenos fajlova'; + @override + String get content => 'Želite li zaista da otkažete prenos fajlova?'; +} + +// Path: dialogs.cannotOpenFile +class Translations$dialogs$cannotOpenFile$sr extends Translations$dialogs$cannotOpenFile$en { + Translations$dialogs$cannotOpenFile$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nije moguće otvoriti fajl'; + @override + String content({required Object file}) => 'Nije moguće otvoriti „${file}“. Da li je ovaj fajl premešten, preimenovan ili izbrisan?'; +} + +// Path: dialogs.encryptionDisabledNotice +class Translations$dialogs$encryptionDisabledNotice$sr extends Translations$dialogs$encryptionDisabledNotice$en { + Translations$dialogs$encryptionDisabledNotice$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Šifrovanje onemogućeno'; + @override + String get content => + 'Komunikacija se sada odvija preko nešifrovanog HTTP protokola. Da biste koristili HTTPS protokol, ponovo omogućite šifrovanje.'; +} + +// Path: dialogs.errorDialog +class Translations$dialogs$errorDialog$sr extends Translations$dialogs$errorDialog$en { + Translations$dialogs$errorDialog$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class Translations$dialogs$favoriteDialog$sr extends Translations$dialogs$favoriteDialog$en { + Translations$dialogs$favoriteDialog$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Omiljeno'; + @override + String get noFavorites => 'Još uvek nema omiljenih uređaja.'; + @override + String get addFavorite => 'Dodaj'; +} + +// Path: dialogs.favoriteDeleteDialog +class Translations$dialogs$favoriteDeleteDialog$sr extends Translations$dialogs$favoriteDeleteDialog$en { + Translations$dialogs$favoriteDeleteDialog$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Izbriši iz omiljenih'; + @override + String content({required Object name}) => 'Želite li zaista da izbrišete „${name}“ iz omiljenih?'; +} + +// Path: dialogs.favoriteEditDialog +class Translations$dialogs$favoriteEditDialog$sr extends Translations$dialogs$favoriteEditDialog$en { + Translations$dialogs$favoriteEditDialog$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Dodajte u omiljene'; + @override + String get titleEdit => 'Podešavanja'; + @override + String get name => 'Naziv uređaja'; + @override + String get auto => '(automatski)'; + @override + String get ip => 'IP adresa'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class Translations$dialogs$fileInfo$sr extends Translations$dialogs$fileInfo$en { + Translations$dialogs$fileInfo$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Informacije o fajlu'; + @override + String get fileName => 'Naziv fajla:'; + @override + String get path => 'Putanja:'; + @override + String get size => 'Veličina:'; + @override + String get sender => 'Pošiljalac:'; + @override + String get time => 'Vreme:'; +} + +// Path: dialogs.fileNameInput +class Translations$dialogs$fileNameInput$sr extends Translations$dialogs$fileNameInput$en { + Translations$dialogs$fileNameInput$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Unesite naziv fajla'; + @override + String original({required Object original}) => 'Originalni naziv fajla: ${original}'; +} + +// Path: dialogs.historyClearDialog +class Translations$dialogs$historyClearDialog$sr extends Translations$dialogs$historyClearDialog$en { + Translations$dialogs$historyClearDialog$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Očistite istoriju'; + @override + String get content => 'Želite li zaista da očistite čitavu istoriju?'; +} + +// Path: dialogs.localNetworkUnauthorized +class Translations$dialogs$localNetworkUnauthorized$sr extends Translations$dialogs$localNetworkUnauthorized$en { + Translations$dialogs$localNetworkUnauthorized$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => 'LocalSend ne može da pronađe druge uređaje bez dozvole za skeniranje lokalne mreže. Dajte ovu dozvolu u podešavanjima.'; + @override + String get gotoSettings => 'Podešavanja'; +} + +// Path: dialogs.messageInput +class Translations$dialogs$messageInput$sr extends Translations$dialogs$messageInput$en { + Translations$dialogs$messageInput$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Napišite poruku'; + @override + String get multiline => 'Više redova'; +} + +// Path: dialogs.noFiles +class Translations$dialogs$noFiles$sr extends Translations$dialogs$noFiles$en { + Translations$dialogs$noFiles$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nije izabran nijedan fajl'; + @override + String get content => 'Izaberite bar jedan fajl.'; +} + +// Path: dialogs.noPermission +class Translations$dialogs$noPermission$sr extends Translations$dialogs$noPermission$en { + Translations$dialogs$noPermission$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nema dozvole'; + @override + String get content => 'Niste dali neophodne dozvole. Dajte ih u podešavanjima.'; +} + +// Path: dialogs.notAvailableOnPlatform +class Translations$dialogs$notAvailableOnPlatform$sr extends Translations$dialogs$notAvailableOnPlatform$en { + Translations$dialogs$notAvailableOnPlatform$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nije dostupno'; + @override + String get content => 'Ova funkcija je dostupna samo na:'; +} + +// Path: dialogs.qr +class Translations$dialogs$qr$sr extends Translations$dialogs$qr$en { + Translations$dialogs$qr$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR kôd'; +} + +// Path: dialogs.quickActions +class Translations$dialogs$quickActions$sr extends Translations$dialogs$quickActions$en { + Translations$dialogs$quickActions$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Brze radnje'; + @override + String get counter => 'Brojač'; + @override + String get prefix => 'Prefiks'; + @override + String get padZero => 'Dopuna nulama'; + @override + String get sortBeforeCount => 'Sortiraj unapred po abecedi (A-Z)'; + @override + String get random => 'Nasumično'; +} + +// Path: dialogs.quickSaveNotice +class Translations$dialogs$quickSaveNotice$sr extends Translations$dialogs$quickSaveNotice$en { + Translations$dialogs$quickSaveNotice$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Zahtevi za fajlove se sada automatski prihvataju. Imajte na umu da svi na lokalnoj mreži mogu da vam šalju fajlove.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class Translations$dialogs$quickSaveFromFavoritesNotice$sr extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + Translations$dialogs$quickSaveFromFavoritesNotice$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Zahtevi za fajlove se sada automatski prihvataju sa uređaja koji su na vašoj listi omiljenih.', + 'Upozorenje! Trenutno, ovo nije potpuno bezbedno, jer haker koji ima otisak prsta bilo kog uređaja sa vaše liste omiljenih može da vam šalje fajlove bez ograničenja.', + 'Ipak, ova opcija je i dalje bezbednija od dopuštanja svim korisnicima na lokalnoj mreži da vam šalju fajlove bez ograničenja.', + ]; +} + +// Path: dialogs.pin +class Translations$dialogs$pin$sr extends Translations$dialogs$pin$en { + Translations$dialogs$pin$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Unesite PIN'; +} + +// Path: dialogs.sendModeHelp +class Translations$dialogs$sendModeHelp$sr extends Translations$dialogs$sendModeHelp$en { + Translations$dialogs$sendModeHelp$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Režimi slanja'; + @override + String get single => 'Slanje fajlova jednom primaocu. Izbor će biti očišćen nakon završenog prenosa fajlova.'; + @override + String get multiple => 'Slanje fajlova više primalaca. Izbor neće biti očišćen nakon završenog prenosa fajlova.'; + @override + String get link => 'Primaoci koji nemaju instaliran LocalSend mogu preuzeti izabrane fajlove otvaranjem linka u svom pregledaču.'; +} + +// Path: dialogs.zoom +class Translations$dialogs$zoom$sr extends Translations$dialogs$zoom$en { + Translations$dialogs$zoom$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class Translations$settingsTab$general$brightnessOptions$sr extends Translations$settingsTab$general$brightnessOptions$en { + Translations$settingsTab$general$brightnessOptions$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistemska'; + @override + String get dark => 'Tamna'; + @override + String get light => 'Svetla'; +} + +// Path: settingsTab.general.colorOptions +class Translations$settingsTab$general$colorOptions$sr extends Translations$settingsTab$general$colorOptions$en { + Translations$settingsTab$general$colorOptions$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistemska'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class Translations$settingsTab$general$languageOptions$sr extends Translations$settingsTab$general$languageOptions$en { + Translations$settingsTab$general$languageOptions$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistemski'; +} + +// Path: settingsTab.network.networkOptions +class Translations$settingsTab$network$networkOptions$sr extends Translations$settingsTab$network$networkOptions$en { + Translations$settingsTab$network$networkOptions$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String get filtered => 'Filtrirana'; + @override + String get all => 'Sve'; +} + +// Path: progressPage.total.title +class Translations$progressPage$total$title$sr extends Translations$progressPage$total$title$en { + Translations$progressPage$total$title$sr.internal(TranslationsSr root) : this._root = root, super.internal(root); + + final TranslationsSr _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Ukupan napredak (${time})'; + @override + String get finishedError => 'Završeno sa greškom'; + @override + String get canceledSender => 'Pošiljalac je otkazao'; + @override + String get canceledReceiver => 'Primalac je otkazao'; +} diff --git a/app/lib/gen/strings_sr_Cyrl.g.dart b/app/lib/gen/strings_sr_Cyrl.g.dart new file mode 100644 index 0000000..b092319 --- /dev/null +++ b/app/lib/gen/strings_sr_Cyrl.g.dart @@ -0,0 +1,1504 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; +import 'strings_sr.g.dart'; + +// Path: +class TranslationsSrCyrl extends TranslationsSr with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsSrCyrl({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.srCyrl, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsSrCyrl _root = this; // ignore: unused_field + + @override + TranslationsSrCyrl $copyWith({TranslationMetadata? meta}) => TranslationsSrCyrl(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Српски (ћирилица)'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$sr_Cyrl general = _Translations$general$sr_Cyrl._(_root); + @override + late final _Translations$receiveTab$sr_Cyrl receiveTab = _Translations$receiveTab$sr_Cyrl._(_root); + @override + late final _Translations$sendTab$sr_Cyrl sendTab = _Translations$sendTab$sr_Cyrl._(_root); + @override + late final _Translations$settingsTab$sr_Cyrl settingsTab = _Translations$settingsTab$sr_Cyrl._(_root); + @override + late final _Translations$troubleshootPage$sr_Cyrl troubleshootPage = _Translations$troubleshootPage$sr_Cyrl._(_root); + @override + late final _Translations$receiveHistoryPage$sr_Cyrl receiveHistoryPage = _Translations$receiveHistoryPage$sr_Cyrl._(_root); + @override + late final _Translations$apkPickerPage$sr_Cyrl apkPickerPage = _Translations$apkPickerPage$sr_Cyrl._(_root); + @override + late final _Translations$selectedFilesPage$sr_Cyrl selectedFilesPage = _Translations$selectedFilesPage$sr_Cyrl._(_root); + @override + late final _Translations$receivePage$sr_Cyrl receivePage = _Translations$receivePage$sr_Cyrl._(_root); + @override + late final _Translations$receiveOptionsPage$sr_Cyrl receiveOptionsPage = _Translations$receiveOptionsPage$sr_Cyrl._(_root); + @override + late final _Translations$sendPage$sr_Cyrl sendPage = _Translations$sendPage$sr_Cyrl._(_root); + @override + late final _Translations$progressPage$sr_Cyrl progressPage = _Translations$progressPage$sr_Cyrl._(_root); + @override + late final _Translations$webSharePage$sr_Cyrl webSharePage = _Translations$webSharePage$sr_Cyrl._(_root); + @override + late final _Translations$aboutPage$sr_Cyrl aboutPage = _Translations$aboutPage$sr_Cyrl._(_root); + @override + late final _Translations$donationPage$sr_Cyrl donationPage = _Translations$donationPage$sr_Cyrl._(_root); + @override + late final _Translations$changelogPage$sr_Cyrl changelogPage = _Translations$changelogPage$sr_Cyrl._(_root); + @override + late final _Translations$aliasGenerator$sr_Cyrl aliasGenerator = _Translations$aliasGenerator$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$sr_Cyrl dialogs = _Translations$dialogs$sr_Cyrl._(_root); + @override + late final _Translations$sanitization$sr_Cyrl sanitization = _Translations$sanitization$sr_Cyrl._(_root); + @override + late final _Translations$tray$sr_Cyrl tray = _Translations$tray$sr_Cyrl._(_root); + @override + late final _Translations$web$sr_Cyrl web = _Translations$web$sr_Cyrl._(_root); + @override + late final _Translations$assetPicker$sr_Cyrl assetPicker = _Translations$assetPicker$sr_Cyrl._(_root); + @override + late final _Translations$networkInterfacesPage$sr_Cyrl networkInterfacesPage = _Translations$networkInterfacesPage$sr_Cyrl._(_root); +} + +// Path: general +class _Translations$general$sr_Cyrl extends Translations$general$sr { + _Translations$general$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Прихвати'; + @override + String get accepted => 'Прихваћено'; + @override + String get add => 'Додај'; + @override + String get advanced => 'Напредно'; + @override + String get cancel => 'Откажи'; + @override + String get close => 'Затвори'; + @override + String get confirm => 'Потврди'; + @override + String get continueStr => 'Настави'; + @override + String get copy => 'Копирај'; + @override + String get copiedToClipboard => 'Копирано у привремену меморију'; + @override + String get decline => 'Одбиј'; + @override + String get done => 'Готово'; + @override + String get delete => 'Избриши'; + @override + String get edit => 'Измени'; + @override + String get error => 'Грешка'; + @override + String get example => 'Пример'; + @override + String get files => 'Фајлови'; + @override + String get finished => 'Завршено'; + @override + String get hide => 'Сакриј'; + @override + String get off => 'Искључено'; + @override + String get offline => 'Офлајн'; + @override + String get on => 'Укључено'; + @override + String get online => 'Онлајн'; + @override + String get open => 'Отвори'; + @override + String get queue => 'Редослед'; + @override + String get quickSave => 'Брзо чување'; + @override + String get quickSaveFromFavorites => 'Брзо чување у „Омиљено“'; + @override + String get renamed => 'Преименовано'; + @override + String get reset => 'Поништи промене'; + @override + String get restart => 'Рестартуј'; + @override + String get settings => 'Подешавања'; + @override + String get skipped => 'Прескочено'; + @override + String get start => 'Покрени'; + @override + String get stop => 'Заустави'; + @override + String get save => 'Сачувај'; + @override + String get unchanged => 'Непромењено'; + @override + String get unknown => 'Непознато'; + @override + String get noItemInClipboard => 'Нема предмета у привременој меморији.'; +} + +// Path: receiveTab +class _Translations$receiveTab$sr_Cyrl extends Translations$receiveTab$sr { + _Translations$receiveTab$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Примање'; + @override + late final _Translations$receiveTab$infoBox$sr_Cyrl infoBox = _Translations$receiveTab$infoBox$sr_Cyrl._(_root); + @override + late final _Translations$receiveTab$quickSave$sr_Cyrl quickSave = _Translations$receiveTab$quickSave$sr_Cyrl._(_root); +} + +// Path: sendTab +class _Translations$sendTab$sr_Cyrl extends Translations$sendTab$sr { + _Translations$sendTab$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Слање'; + @override + late final _Translations$sendTab$selection$sr_Cyrl selection = _Translations$sendTab$selection$sr_Cyrl._(_root); + @override + late final _Translations$sendTab$picker$sr_Cyrl picker = _Translations$sendTab$picker$sr_Cyrl._(_root); + @override + String get shareIntentInfo => 'Такође, можете да користите функцију „Дели“ на свом мобилном уређају да бисте лакше бирали фајлове.'; + @override + String get nearbyDevices => 'Уређаји у близини'; + @override + String get thisDevice => 'Овај уређај'; + @override + String get scan => 'Претрага уређаја'; + @override + String get manualSending => 'Ручно слање'; + @override + String get sendMode => 'Режим слања'; + @override + late final _Translations$sendTab$sendModes$sr_Cyrl sendModes = _Translations$sendTab$sendModes$sr_Cyrl._(_root); + @override + String get sendModeHelp => 'Објашњење'; + @override + String get help => 'Уверите се да је прималац такође на истој Wi-Fi мрежи.'; + @override + String get placeItems => 'Поставите предмете за дељење.'; +} + +// Path: settingsTab +class _Translations$settingsTab$sr_Cyrl extends Translations$settingsTab$sr { + _Translations$settingsTab$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Подешавања'; + @override + late final _Translations$settingsTab$general$sr_Cyrl general = _Translations$settingsTab$general$sr_Cyrl._(_root); + @override + late final _Translations$settingsTab$receive$sr_Cyrl receive = _Translations$settingsTab$receive$sr_Cyrl._(_root); + @override + late final _Translations$settingsTab$send$sr_Cyrl send = _Translations$settingsTab$send$sr_Cyrl._(_root); + @override + late final _Translations$settingsTab$network$sr_Cyrl network = _Translations$settingsTab$network$sr_Cyrl._(_root); + @override + late final _Translations$settingsTab$other$sr_Cyrl other = _Translations$settingsTab$other$sr_Cyrl._(_root); + @override + String get advancedSettings => 'Напредна подешавања'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$sr_Cyrl extends Translations$troubleshootPage$sr { + _Translations$troubleshootPage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Отклањање грешака'; + @override + String get subTitle => 'Да ли апликација ради како треба? Овде можете пронаћи нека уобичајена решења проблема.'; + @override + String get solution => 'Решење:'; + @override + String get fixButton => 'Поправи аутоматски'; + @override + late final _Translations$troubleshootPage$firewall$sr_Cyrl firewall = _Translations$troubleshootPage$firewall$sr_Cyrl._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$sr_Cyrl noDiscovery = _Translations$troubleshootPage$noDiscovery$sr_Cyrl._(_root); + @override + late final _Translations$troubleshootPage$noConnection$sr_Cyrl noConnection = _Translations$troubleshootPage$noConnection$sr_Cyrl._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$sr_Cyrl extends Translations$receiveHistoryPage$sr { + _Translations$receiveHistoryPage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Историја'; + @override + String get openFolder => 'Отвори фолдер'; + @override + String get deleteHistory => 'Избриши историју'; + @override + String get empty => 'Историја је празна.'; + @override + late final _Translations$receiveHistoryPage$entryActions$sr_Cyrl entryActions = _Translations$receiveHistoryPage$entryActions$sr_Cyrl._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$sr_Cyrl extends Translations$apkPickerPage$sr { + _Translations$apkPickerPage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Апликације (APK)'; + @override + String get excludeSystemApps => 'Изузми системске апликације'; + @override + String get excludeAppsWithoutLaunchIntent => 'Изузми апликације које се не покрећу'; + @override + String apps({required Object n}) => '${n} апликација'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$sr_Cyrl extends Translations$selectedFilesPage$sr { + _Translations$selectedFilesPage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Избриши све'; +} + +// Path: receivePage +class _Translations$receivePage$sr_Cyrl extends Translations$receivePage$sr { + _Translations$receivePage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sr'))( + n, + one: 'жели да вам пошаље фајл', + other: 'жели да вам пошаље ${n} фајлова', + ); + @override + String get subTitleMessage => 'послао вам је поруку:'; + @override + String get subTitleLink => 'послао вам је линк:'; + @override + String get canceled => 'Пошиљалац је отказао захтев.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$sr_Cyrl extends Translations$receiveOptionsPage$sr { + _Translations$receiveOptionsPage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Опције'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend фолдер)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Аутоматски искључено јер постоје фолдери.'; +} + +// Path: sendPage +class _Translations$sendPage$sr_Cyrl extends Translations$sendPage$sr { + _Translations$sendPage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Чекање одговора…'; + @override + String get rejected => 'Прималац је одбио захтев.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Прималац је заузет другим захтевом.'; +} + +// Path: progressPage +class _Translations$progressPage$sr_Cyrl extends Translations$progressPage$sr { + _Translations$progressPage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Слање фајлова'; + @override + String get titleReceiving => 'Примање фајлова'; + @override + String get savedToGallery => 'Сачувано у галерији'; + @override + late final _Translations$progressPage$total$sr_Cyrl total = _Translations$progressPage$total$sr_Cyrl._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$sr_Cyrl extends Translations$webSharePage$sr { + _Translations$webSharePage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Дељење путем линка'; + @override + String get loading => 'Покретање сервера…'; + @override + String get stopping => 'Заустављање сервера…'; + @override + String get error => 'Дошло је до грешке приликом покретања сервера.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sr'))( + n, + one: 'Отворите овај линк у вашем прегледачу:', + other: 'Отворите један од ових линкова у вашем прегледачу:', + ); + @override + String get requests => 'Захтеви'; + @override + String get noRequests => 'Још увек нема захтева.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Аутоматски прихвати захтеве'; + @override + String get requirePin => 'Захтевај PIN'; + @override + String pinHint({required Object pin}) => 'PIN је ${pin}“„'; + @override + String get encryptionHint => 'LocalSend користи самопотписани сертификат. Морате га прихватити у свом прегледачу.'; + @override + String pendingRequests({required Object n}) => 'Захтеви на чекању: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$sr_Cyrl extends Translations$aboutPage$sr { + _Translations$aboutPage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'О LocalSend-у'; + @override + List get description => [ + 'LocalSend је бесплатна апликација отвореног кода која вам омогућава да безбедно делите фајлове и поруке са уређајима у близини преко ваше локалне мреже, без потребе за интернет везом.', + 'Ова апликације је доступна за Android, iOS, macOS, Windows i Linux. Можете пронаћи све опције за преузимање на званичној почетној страници.', + ]; + @override + String get author => 'Аутор'; + @override + String get contributors => 'Сарадници'; + @override + String get packagers => 'Пакери'; + @override + String get translators => 'Преводиоци'; +} + +// Path: donationPage +class _Translations$donationPage$sr_Cyrl extends Translations$donationPage$sr { + _Translations$donationPage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Донација'; + @override + String get info => 'LocalSend је бесплатан, отвореног кода и без икаквих огласа. Ако вам се свиђа апликација, можете подржати развој донацијом.'; + @override + String donate({required Object amount}) => 'Донирај ${amount}'; + @override + String get thanks => 'Хвала вам пуно!'; + @override + String get restore => 'Врати куповину'; +} + +// Path: changelogPage +class _Translations$changelogPage$sr_Cyrl extends Translations$changelogPage$sr { + _Translations$changelogPage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Евиденција промена'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$sr_Cyrl extends Translations$aliasGenerator$sr { + _Translations$aliasGenerator$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Неодољива', + 'Прелепа', + 'Велика', + 'Бистра', + 'Чиста', + 'Паметна', + 'Хладњикава', + 'Слатка', + 'Лукава', + 'Одлучна', + 'Енергетска', + 'Ефикасна', + 'Фантастична', + 'Брза', + 'Фина', + 'Свежа', + 'Добра', + 'Дивна', + 'Велика', + 'Згодна', + 'Врућа', + 'Нежна', + 'Љубазна', + 'Мистична', + 'Уредна', + 'Лепа', + 'Стрпљива', + 'Прелепа', + 'Моћна', + 'Богата', + 'Тајновита', + 'Паметна', + 'Чврста', + 'Специјална', + 'Буђава', + 'Јака', + 'Уредна', + 'Мудра', + ]; + @override + List get fruits => [ + 'Јабука', + 'Шљива', + 'Банана', + 'Боровница', + 'Рибизла', + 'Кајсија', + 'Шаргарепа', + 'Трешња', + 'Паприка', + 'Папричица', + 'Кромпируша', + 'Купусара', + 'Ротквица', + 'Лубеница', + 'Печурка', + 'Мандарина', + 'Поморанџа', + 'Папаја', + 'Бресква', + 'Крушка', + 'Шишарка', + 'Диња', + 'Бундева', + 'Вишња', + 'Јагода', + 'Дуња', + ]; + + /// In some languages, the adjective must be last. Not the case in Serbian, but serbian adjectives must have endings which depend on the gender of the noun. That's why we put all the Fruits with the female form and corresponding adjective endings in female form for this translation. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$sr_Cyrl extends Translations$dialogs$sr { + _Translations$dialogs$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$sr_Cyrl addFile = _Translations$dialogs$addFile$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$openFile$sr_Cyrl openFile = _Translations$dialogs$openFile$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$addressInput$sr_Cyrl addressInput = _Translations$dialogs$addressInput$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$cancelSession$sr_Cyrl cancelSession = _Translations$dialogs$cancelSession$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$sr_Cyrl cannotOpenFile = _Translations$dialogs$cannotOpenFile$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$sr_Cyrl encryptionDisabledNotice = + _Translations$dialogs$encryptionDisabledNotice$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$errorDialog$sr_Cyrl errorDialog = _Translations$dialogs$errorDialog$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$favoriteDialog$sr_Cyrl favoriteDialog = _Translations$dialogs$favoriteDialog$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$sr_Cyrl favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$sr_Cyrl favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$fileInfo$sr_Cyrl fileInfo = _Translations$dialogs$fileInfo$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$fileNameInput$sr_Cyrl fileNameInput = _Translations$dialogs$fileNameInput$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$historyClearDialog$sr_Cyrl historyClearDialog = _Translations$dialogs$historyClearDialog$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$sr_Cyrl localNetworkUnauthorized = + _Translations$dialogs$localNetworkUnauthorized$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$messageInput$sr_Cyrl messageInput = _Translations$dialogs$messageInput$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$noFiles$sr_Cyrl noFiles = _Translations$dialogs$noFiles$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$noPermission$sr_Cyrl noPermission = _Translations$dialogs$noPermission$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$sr_Cyrl notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$sr_Cyrl._( + _root, + ); + @override + late final _Translations$dialogs$qr$sr_Cyrl qr = _Translations$dialogs$qr$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$quickActions$sr_Cyrl quickActions = _Translations$dialogs$quickActions$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$sr_Cyrl quickSaveNotice = _Translations$dialogs$quickSaveNotice$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$sr_Cyrl quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$pin$sr_Cyrl pin = _Translations$dialogs$pin$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$sendModeHelp$sr_Cyrl sendModeHelp = _Translations$dialogs$sendModeHelp$sr_Cyrl._(_root); + @override + late final _Translations$dialogs$zoom$sr_Cyrl zoom = _Translations$dialogs$zoom$sr_Cyrl._(_root); +} + +// Path: sanitization +class _Translations$sanitization$sr_Cyrl extends Translations$sanitization$sr { + _Translations$sanitization$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Назив фајла не може бити празан'; + @override + String get invalid => 'Назив фајла садржи неважеће знакове'; +} + +// Path: tray +class _Translations$tray$sr_Cyrl extends Translations$tray$sr { + _Translations$tray$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Напусти LocalSend'; + @override + String get closeWindows => 'Изађи'; +} + +// Path: web +class _Translations$web$sr_Cyrl extends Translations$web$sr { + _Translations$web$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Унесите PIN'; + @override + String get invalidPin => 'Неисправан PIN'; + @override + String get tooManyAttempts => 'Превише покушаја'; + @override + String get rejected => 'Одбијено'; + @override + String get files => 'Фајлови'; + @override + String get fileName => 'Назив фајла'; + @override + String get size => 'Величина'; +} + +// Path: assetPicker +class _Translations$assetPicker$sr_Cyrl extends Translations$assetPicker$sr { + _Translations$assetPicker$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Потврди'; + @override + String get cancel => 'Откажи'; + @override + String get edit => 'Измени'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Учитавање неуспешно'; + @override + String get original => 'Порекло'; + @override + String get preview => 'Преглед'; + @override + String get select => 'Изабери'; + @override + String get emptyList => 'Очисти листу'; + @override + String get unSupportedAssetType => 'Неподржан тип фајла.'; + @override + String get unableToAccessAll => 'Није могуће приступити свим фајловима на уређају'; + @override + String get viewingLimitedAssetsTip => 'Само фајлови за гледање и албуми доступни апликацији.'; + @override + String get changeAccessibleLimitedAssets => 'Додирните да ажурирате доступне фајлове'; + @override + String get accessAllTip => + 'Апликација може да приступи само неким фајловима на уређају. Идите у системска подешавања и дозволите апликацији приступ свим медијима на уређају.'; + @override + String get goToSystemSettings => 'Иди у системска подешавања'; + @override + String get accessLimitedAssets => 'Настави са ограниченим приступом'; + @override + String get accessiblePathName => 'Доступни фајлови'; + @override + String get sTypeAudioLabel => 'Аудио'; + @override + String get sTypeImageLabel => 'Слика'; + @override + String get sTypeVideoLabel => 'Видео'; + @override + String get sTypeOtherLabel => 'Остали медији'; + @override + String get sActionPlayHint => 'пусти'; + @override + String get sActionPreviewHint => 'преглед'; + @override + String get sActionSelectHint => 'изабери'; + @override + String get sActionSwitchPathLabel => 'промени путању'; + @override + String get sActionUseCameraHint => 'користи камеру'; + @override + String get sNameDurationLabel => 'трајање'; + @override + String get sUnitAssetCountLabel => 'број'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$sr_Cyrl extends Translations$networkInterfacesPage$sr { + _Translations$networkInterfacesPage$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Мрежни интерфејси'; + @override + String get preview => 'Преглед'; + @override + String get whitelist => 'Бела листа'; + @override + String get blacklist => 'Црна листа'; + @override + String get info => + 'Подразумевано, LocalSend користи све доступне мрежне интерфејсе. Овде можете изузети нежељене мреже. Морате рестартовати сервер да би се примениле промене.'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$sr_Cyrl extends Translations$receiveTab$infoBox$sr { + _Translations$receiveTab$infoBox$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Порт:'; + @override + String get alias => 'Назив уређаја:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$sr_Cyrl extends Translations$receiveTab$quickSave$sr { + _Translations$receiveTab$quickSave$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Омиљено'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$sr_Cyrl extends Translations$sendTab$selection$sr { + _Translations$sendTab$selection$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Избор'; + @override + String files({required Object files}) => 'Фајлови: ${files}'; + @override + String size({required Object size}) => 'Величина: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$sr_Cyrl extends Translations$sendTab$picker$sr { + _Translations$sendTab$picker$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get file => 'Фајл'; + @override + String get folder => 'Фолдер'; + @override + String get media => 'Медији'; + @override + String get text => 'Текст'; + @override + String get app => 'Aпликација'; + @override + String get clipboard => 'Налепи'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$sr_Cyrl extends Translations$sendTab$sendModes$sr { + _Translations$sendTab$sendModes$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get single => 'Један прималац'; + @override + String get multiple => 'Више прималаца'; + @override + String get link => 'Дељење путем линка'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$sr_Cyrl extends Translations$settingsTab$general$sr { + _Translations$settingsTab$general$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Опште'; + @override + String get brightness => 'Тема'; + @override + late final _Translations$settingsTab$general$brightnessOptions$sr_Cyrl brightnessOptions = + _Translations$settingsTab$general$brightnessOptions$sr_Cyrl._(_root); + @override + String get color => 'Боја'; + @override + late final _Translations$settingsTab$general$colorOptions$sr_Cyrl colorOptions = _Translations$settingsTab$general$colorOptions$sr_Cyrl._(_root); + @override + String get language => 'Језик'; + @override + late final _Translations$settingsTab$general$languageOptions$sr_Cyrl languageOptions = _Translations$settingsTab$general$languageOptions$sr_Cyrl._( + _root, + ); + @override + String get saveWindowPlacement => 'Сачувај положај прозора након напуштања'; + @override + String get saveWindowPlacementWindows => 'Сачувај положај прозора након излажења'; + @override + String get minimizeToTray => 'Минимизирај на системску траку/траку менија приликом затварања'; + @override + String get launchAtStartup => 'Аутоматски покрени након пријаве'; + @override + String get launchMinimized => 'Аутоматско покретање: Покретање скривено'; + @override + String get showInContextMenu => 'Прикажи LocalSend у контекстуалном менију'; + @override + String get animations => 'Анимације'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$sr_Cyrl extends Translations$settingsTab$receive$sr { + _Translations$settingsTab$receive$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Примање'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Аутоматски заврши'; + @override + String get destination => 'Чување у фолдер'; + @override + String get downloads => '(Downloads)'; + @override + String get saveToGallery => 'Сачувај медије у галерију'; + @override + String get saveToHistory => 'Сачувај у историји'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$sr_Cyrl extends Translations$settingsTab$send$sr { + _Translations$settingsTab$send$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Слање'; + @override + String get shareViaLinkAutoAccept => 'Аутоматски прихвати захтеве у режиму „Дељење путем линка“'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$sr_Cyrl extends Translations$settingsTab$network$sr { + _Translations$settingsTab$network$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Мрежа'; + @override + String get needRestart => 'Рестартујте сервер да би се применила подешавања!'; + @override + String get server => 'Сервер'; + @override + String get alias => 'Назив уређаја'; + @override + String get deviceType => 'Тип уређаја'; + @override + String get deviceModel => 'Модел уређаја'; + @override + String get port => 'Порт'; + @override + String get discoveryTimeout => 'Откривање је истекло'; + @override + String get useSystemName => 'Користи системски назив'; + @override + String get generateRandomAlias => 'Генериши насумични псеудоним'; + @override + String portWarning({required Object defaultPort}) => + 'Други уређаји вас можда неће открити, јер користите прилагођени порт. (подразумевани: ${defaultPort})'; + @override + String get encryption => 'Шифровање'; + @override + String get multicastGroup => 'Адреса вишесмерног емитовања'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Други уређаји вас можда неће открити, јер користите прилагођену адресу вишесмерног емитовања. (подразумевана: ${defaultMulticast})'; + @override + String get network => 'Мрежа'; + @override + late final _Translations$settingsTab$network$networkOptions$sr_Cyrl networkOptions = _Translations$settingsTab$network$networkOptions$sr_Cyrl._( + _root, + ); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$sr_Cyrl extends Translations$settingsTab$other$sr { + _Translations$settingsTab$other$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Остало'; + @override + String get support => 'Подржите LocalSend'; + @override + String get donate => 'Донирај'; + @override + String get privacyPolicy => 'Политика приватности'; + @override + String get termsOfUse => 'Услови коришћења'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$sr_Cyrl extends Translations$troubleshootPage$firewall$sr { + _Translations$troubleshootPage$firewall$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Овај уређај може слати фајлове другим уређајима; али други уређаји не могу слати фајлове овом уређају.'; + @override + String solution({required Object port}) => + 'Ово је највероватније проблем са заштитним зидом. Ово можете решити тако што ћете дозволити долазне везе (UDP и TCP) на порту ${port}.'; + @override + String get openFirewall => 'Отвори заштитни зид'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$sr_Cyrl extends Translations$troubleshootPage$noDiscovery$sr { + _Translations$troubleshootPage$noDiscovery$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Овај уређај не може да открије друге уређаје.'; + @override + String get solution => + 'Уверите се да су сви уређаји на истој Wi-Fi мрежи и да имају исту конфигурацију (порт, адреса вишесмерног емитовања, шифровање). Можете покушати да ручно унесете IP адресу циљног уређаја. Ако то функционише, размислите о додавању тог уређаја у омиљене како би се могао аутоматски открити у будућности.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$sr_Cyrl extends Translations$troubleshootPage$noConnection$sr { + _Translations$troubleshootPage$noConnection$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Оба уређаја не могу да открију један другог нити могу да деле фајлове.'; + @override + String get solution => + 'Да ли проблем постоји на обе стране? Ако је тако, потребно је да се уверите да су оба уређаја на истој Wi-Fi мрежи и да имају исту конфигурацију (порт, адреса вишесмерног емитовања, шифровање). Wi-Fi мрежа можда неће дозволити комуникацију између учесника због изолације приступне тачке (AP). У овом случају, ова опција мора бити онемогућена на рутеру.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$sr_Cyrl extends Translations$receiveHistoryPage$entryActions$sr { + _Translations$receiveHistoryPage$entryActions$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get open => 'Отвори фајл'; + @override + String get showInFolder => 'Прикажи у фолдеру'; + @override + String get info => 'Информације'; + @override + String get deleteFromHistory => 'Избриши из историје'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$sr_Cyrl extends Translations$progressPage$total$sr { + _Translations$progressPage$total$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$sr_Cyrl title = _Translations$progressPage$total$title$sr_Cyrl._(_root); + @override + String count({required Object curr, required Object n}) => 'Фајлова: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Величина: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Брзина: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$sr_Cyrl extends Translations$dialogs$addFile$sr { + _Translations$dialogs$addFile$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Додајте у избор'; + @override + String get content => 'Шта желите додати?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$sr_Cyrl extends Translations$dialogs$openFile$sr { + _Translations$dialogs$openFile$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Отвори фајл'; + @override + String get content => 'Желите ли да отворите примљени фајл?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$sr_Cyrl extends Translations$dialogs$addressInput$sr { + _Translations$dialogs$addressInput$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Унесите адресу'; + @override + String get hashtag => 'Хеш-ознака'; + @override + String get ip => 'IP адреса'; + @override + String get recentlyUsed => 'Недавно коришћено: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$sr_Cyrl extends Translations$dialogs$cancelSession$sr { + _Translations$dialogs$cancelSession$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Откажите пренос фајлова'; + @override + String get content => 'Желите ли заиста да откажете пренос фајлова?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$sr_Cyrl extends Translations$dialogs$cannotOpenFile$sr { + _Translations$dialogs$cannotOpenFile$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Није могуће отворити фајл'; + @override + String content({required Object file}) => 'Није могуће отворити „${file}“. Да ли је овај фајл премештен, преименован, или избрисан?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$sr_Cyrl extends Translations$dialogs$encryptionDisabledNotice$sr { + _Translations$dialogs$encryptionDisabledNotice$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Шифровање онемогућено'; + @override + String get content => + 'Комуникација се сада одвија преко нешифрованог HTTP протокола. Да бисте користили HTTPS протокол, поново омогућите шифровање.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$sr_Cyrl extends Translations$dialogs$errorDialog$sr { + _Translations$dialogs$errorDialog$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$sr_Cyrl extends Translations$dialogs$favoriteDialog$sr { + _Translations$dialogs$favoriteDialog$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Омиљено'; + @override + String get noFavorites => 'Још увек нема омиљених уређаја.'; + @override + String get addFavorite => 'Додај'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$sr_Cyrl extends Translations$dialogs$favoriteDeleteDialog$sr { + _Translations$dialogs$favoriteDeleteDialog$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Избриши из омиљених'; + @override + String content({required Object name}) => 'Желите ли заиста да избришете „${name}“ из омиљених?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$sr_Cyrl extends Translations$dialogs$favoriteEditDialog$sr { + _Translations$dialogs$favoriteEditDialog$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Додајте у омиљене'; + @override + String get titleEdit => 'Подешавања'; + @override + String get name => 'Назив уређаја'; + @override + String get auto => '(аутоматски)'; + @override + String get ip => 'IP адреса'; + @override + String get port => 'Порт'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$sr_Cyrl extends Translations$dialogs$fileInfo$sr { + _Translations$dialogs$fileInfo$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Информације о фајлу'; + @override + String get fileName => 'Назив фајла:'; + @override + String get path => 'Путања:'; + @override + String get size => 'Величина:'; + @override + String get sender => 'Пошиљалац:'; + @override + String get time => 'Време:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$sr_Cyrl extends Translations$dialogs$fileNameInput$sr { + _Translations$dialogs$fileNameInput$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Унесите назив фајла'; + @override + String original({required Object original}) => 'Оригинални назив фајла: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$sr_Cyrl extends Translations$dialogs$historyClearDialog$sr { + _Translations$dialogs$historyClearDialog$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Очистите историју'; + @override + String get content => 'Желите ли заиста да очистите читаву историју?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$sr_Cyrl extends Translations$dialogs$localNetworkUnauthorized$sr { + _Translations$dialogs$localNetworkUnauthorized$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => 'LocalSend не може да пронађе друге уређаје без дозволе за скенирање локалне мреже. Дајте ову дозволу у подешавањима.'; + @override + String get gotoSettings => 'Подешавања'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$sr_Cyrl extends Translations$dialogs$messageInput$sr { + _Translations$dialogs$messageInput$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Напишите поруку'; + @override + String get multiline => 'Више редова'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$sr_Cyrl extends Translations$dialogs$noFiles$sr { + _Translations$dialogs$noFiles$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Није изабран ниједан фајл'; + @override + String get content => 'Изаберите бар један фајл.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$sr_Cyrl extends Translations$dialogs$noPermission$sr { + _Translations$dialogs$noPermission$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Нема дозволе'; + @override + String get content => 'Нисте дали неопходне дозволе. Дајте их у подешавањима.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$sr_Cyrl extends Translations$dialogs$notAvailableOnPlatform$sr { + _Translations$dialogs$notAvailableOnPlatform$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Није доступно'; + @override + String get content => 'Ова функција је доступна само на:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$sr_Cyrl extends Translations$dialogs$qr$sr { + _Translations$dialogs$qr$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR кôд'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$sr_Cyrl extends Translations$dialogs$quickActions$sr { + _Translations$dialogs$quickActions$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Брзе радње'; + @override + String get counter => 'Бројач'; + @override + String get prefix => 'Префикс'; + @override + String get padZero => 'Допуна нулама'; + @override + String get sortBeforeCount => 'Сортирај унапред по абецеди (A-Z)'; + @override + String get random => 'Насумично'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$sr_Cyrl extends Translations$dialogs$quickSaveNotice$sr { + _Translations$dialogs$quickSaveNotice$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Захтеви за фајлове се сада аутоматски прихватају. Имајте на уму да сви на локалној мрежи могу да вам шаљу фајлове.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$sr_Cyrl extends Translations$dialogs$quickSaveFromFavoritesNotice$sr { + _Translations$dialogs$quickSaveFromFavoritesNotice$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Захтеви за фајлове се сада аутоматски прихватају са уређаја који су на вашој листи омиљених.', + 'Упозорење! Тренутно, ово није потпуно безбедно, јер хакер који има отисак прста било ког уређаја са ваше листе омиљених може да вам шаље фајлове без ограничења.', + 'Ипак, ова опција је и даље безбеднија од допуштања свим корисницима на локалној мрежи да вам шаљу фајлове без ограничења.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$sr_Cyrl extends Translations$dialogs$pin$sr { + _Translations$dialogs$pin$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Унесите PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$sr_Cyrl extends Translations$dialogs$sendModeHelp$sr { + _Translations$dialogs$sendModeHelp$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'Режими слања'; + @override + String get single => 'Слање фајлова једном примаоцу. Избор ће бити очишћен након завршеног преноса фајлова.'; + @override + String get multiple => 'Слање фајлове више прималаца. Избор неће бити очишћен након завршеног преноса фајлова.'; + @override + String get link => 'Примаоци који немају инсталиран LocalSend могу преузети изабране фајлове отварањем линка у свом прегледачу.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$sr_Cyrl extends Translations$dialogs$zoom$sr { + _Translations$dialogs$zoom$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$sr_Cyrl extends Translations$settingsTab$general$brightnessOptions$sr { + _Translations$settingsTab$general$brightnessOptions$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Системска'; + @override + String get dark => 'Тамна'; + @override + String get light => 'Светла'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$sr_Cyrl extends Translations$settingsTab$general$colorOptions$sr { + _Translations$settingsTab$general$colorOptions$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Системска'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$sr_Cyrl extends Translations$settingsTab$general$languageOptions$sr { + _Translations$settingsTab$general$languageOptions$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get system => 'Системски'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$sr_Cyrl extends Translations$settingsTab$network$networkOptions$sr { + _Translations$settingsTab$network$networkOptions$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String get all => 'Све'; + @override + String get filtered => 'Филтрирана'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$sr_Cyrl extends Translations$progressPage$total$title$sr { + _Translations$progressPage$total$title$sr_Cyrl._(TranslationsSrCyrl root) : this._root = root, super.internal(root); + + final TranslationsSrCyrl _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Укупан напредак (${time})'; + @override + String get finishedError => 'Завршено са грешком'; + @override + String get canceledSender => 'Пошиљалац је отказао'; + @override + String get canceledReceiver => 'Прималац је отказао'; +} diff --git a/app/lib/gen/strings_sv.g.dart b/app/lib/gen/strings_sv.g.dart new file mode 100644 index 0000000..5a7a8f3 --- /dev/null +++ b/app/lib/gen/strings_sv.g.dart @@ -0,0 +1,1520 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsSv extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsSv({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.sv, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsSv _root = this; // ignore: unused_field + + @override + TranslationsSv $copyWith({TranslationMetadata? meta}) => TranslationsSv(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Svenska'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$sv general = _Translations$general$sv._(_root); + @override + late final _Translations$receiveTab$sv receiveTab = _Translations$receiveTab$sv._(_root); + @override + late final _Translations$sendTab$sv sendTab = _Translations$sendTab$sv._(_root); + @override + late final _Translations$settingsTab$sv settingsTab = _Translations$settingsTab$sv._(_root); + @override + late final _Translations$troubleshootPage$sv troubleshootPage = _Translations$troubleshootPage$sv._(_root); + @override + late final _Translations$receiveHistoryPage$sv receiveHistoryPage = _Translations$receiveHistoryPage$sv._(_root); + @override + late final _Translations$apkPickerPage$sv apkPickerPage = _Translations$apkPickerPage$sv._(_root); + @override + late final _Translations$selectedFilesPage$sv selectedFilesPage = _Translations$selectedFilesPage$sv._(_root); + @override + late final _Translations$receivePage$sv receivePage = _Translations$receivePage$sv._(_root); + @override + late final _Translations$receiveOptionsPage$sv receiveOptionsPage = _Translations$receiveOptionsPage$sv._(_root); + @override + late final _Translations$sendPage$sv sendPage = _Translations$sendPage$sv._(_root); + @override + late final _Translations$progressPage$sv progressPage = _Translations$progressPage$sv._(_root); + @override + late final _Translations$webSharePage$sv webSharePage = _Translations$webSharePage$sv._(_root); + @override + late final _Translations$aboutPage$sv aboutPage = _Translations$aboutPage$sv._(_root); + @override + late final _Translations$donationPage$sv donationPage = _Translations$donationPage$sv._(_root); + @override + late final _Translations$changelogPage$sv changelogPage = _Translations$changelogPage$sv._(_root); + @override + late final _Translations$aliasGenerator$sv aliasGenerator = _Translations$aliasGenerator$sv._(_root); + @override + late final _Translations$dialogs$sv dialogs = _Translations$dialogs$sv._(_root); + @override + late final _Translations$sanitization$sv sanitization = _Translations$sanitization$sv._(_root); + @override + late final _Translations$tray$sv tray = _Translations$tray$sv._(_root); + @override + late final _Translations$web$sv web = _Translations$web$sv._(_root); + @override + late final _Translations$assetPicker$sv assetPicker = _Translations$assetPicker$sv._(_root); + @override + late final _Translations$networkInterfacesPage$sv networkInterfacesPage = _Translations$networkInterfacesPage$sv._(_root); +} + +// Path: general +class _Translations$general$sv extends Translations$general$en { + _Translations$general$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Acceptera'; + @override + String get accepted => 'Accepterad'; + @override + String get add => 'Lägg till'; + @override + String get advanced => 'Avancerat'; + @override + String get cancel => 'Avbryt'; + @override + String get close => 'Stäng'; + @override + String get confirm => 'Bekräfta'; + @override + String get continueStr => 'Vidare'; + @override + String get copy => 'Kopiera'; + @override + String get copiedToClipboard => 'Kopierat till urklipp'; + @override + String get decline => 'Avböj'; + @override + String get done => 'Klar'; + @override + String get delete => 'Ta bort'; + @override + String get edit => 'Redigera'; + @override + String get error => 'Fel'; + @override + String get example => 'Exempel'; + @override + String get files => 'Filer'; + @override + String get finished => 'Färdig'; + @override + String get hide => 'Göm'; + @override + String get off => 'Av'; + @override + String get offline => 'Offline'; + @override + String get on => 'På'; + @override + String get online => 'Online'; + @override + String get open => 'Öppna'; + @override + String get queue => 'Kö'; + @override + String get quickSave => 'Snabbspara'; + @override + String get quickSaveFromFavorites => 'Snabbspara för "Favoriter"'; + @override + String get renamed => 'Bytt namn'; + @override + String get reset => 'Återställ'; + @override + String get restart => 'Starta om'; + @override + String get settings => 'Inställningar'; + @override + String get skipped => 'Hoppad över'; + @override + String get start => 'Börja'; + @override + String get stop => 'Stopp'; + @override + String get save => 'Spara'; + @override + String get unchanged => 'Oförändrad'; + @override + String get unknown => 'Okänd'; + @override + String get noItemInClipboard => 'Inga objekt i urklipp.'; +} + +// Path: receiveTab +class _Translations$receiveTab$sv extends Translations$receiveTab$en { + _Translations$receiveTab$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ta emot'; + @override + late final _Translations$receiveTab$infoBox$sv infoBox = _Translations$receiveTab$infoBox$sv._(_root); + @override + late final _Translations$receiveTab$quickSave$sv quickSave = _Translations$receiveTab$quickSave$sv._(_root); +} + +// Path: sendTab +class _Translations$sendTab$sv extends Translations$sendTab$en { + _Translations$sendTab$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Skicka'; + @override + late final _Translations$sendTab$selection$sv selection = _Translations$sendTab$selection$sv._(_root); + @override + late final _Translations$sendTab$picker$sv picker = _Translations$sendTab$picker$sv._(_root); + @override + String get shareIntentInfo => 'Du kan också använda "Dela"-funtionen i din mobiltelefon för att lättare välja filer.'; + @override + String get nearbyDevices => 'Närbelägna enhter'; + @override + String get thisDevice => 'Denna Enhet'; + @override + String get scan => 'Leta efter enheter'; + @override + String get manualSending => 'Manuell sändning'; + @override + String get sendMode => 'Sändningsläge'; + @override + late final _Translations$sendTab$sendModes$sv sendModes = _Translations$sendTab$sendModes$sv._(_root); + @override + String get sendModeHelp => 'Förklaring'; + @override + String get help => 'Kontrollera att den sökta enheten är uppkopplad till samma wifi nätverk som din enhet.'; + @override + String get placeItems => 'Placera objekt att dela.'; +} + +// Path: settingsTab +class _Translations$settingsTab$sv extends Translations$settingsTab$en { + _Translations$settingsTab$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Inställningar'; + @override + late final _Translations$settingsTab$general$sv general = _Translations$settingsTab$general$sv._(_root); + @override + late final _Translations$settingsTab$receive$sv receive = _Translations$settingsTab$receive$sv._(_root); + @override + late final _Translations$settingsTab$send$sv send = _Translations$settingsTab$send$sv._(_root); + @override + late final _Translations$settingsTab$network$sv network = _Translations$settingsTab$network$sv._(_root); + @override + late final _Translations$settingsTab$other$sv other = _Translations$settingsTab$other$sv._(_root); + @override + String get advancedSettings => 'Avancerade inställningar'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$sv extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Felsökning'; + @override + String get subTitle => 'Gör appen inte som förväntat? Här hittar du vanliga lösningar.'; + @override + String get solution => 'Lösning:'; + @override + String get fixButton => 'Fixa automatiskt'; + @override + late final _Translations$troubleshootPage$firewall$sv firewall = _Translations$troubleshootPage$firewall$sv._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$sv noDiscovery = _Translations$troubleshootPage$noDiscovery$sv._(_root); + @override + late final _Translations$troubleshootPage$noConnection$sv noConnection = _Translations$troubleshootPage$noConnection$sv._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$sv extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Historik'; + @override + String get openFolder => 'Öppna mapp'; + @override + String get deleteHistory => 'Radera historik'; + @override + String get empty => 'Historiken är tom.'; + @override + late final _Translations$receiveHistoryPage$entryActions$sv entryActions = _Translations$receiveHistoryPage$entryActions$sv._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$sv extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Appar (APK)'; + @override + String get excludeSystemApps => 'Exkludera systemappar'; + @override + String get excludeAppsWithoutLaunchIntent => 'Exkludera appar som inte kan startas'; + @override + String apps({required Object n}) => '${n} Appar'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$sv extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Radera alla'; +} + +// Path: receivePage +class _Translations$receivePage$sv extends Translations$receivePage$en { + _Translations$receivePage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))( + n, + one: 'vill skicka en fil till dig', + other: 'Vill skick ${n} filer till dig', + ); + @override + String get subTitleMessage => 'skickade ett meddelande till dig:'; + @override + String get subTitleLink => 'skickade en länk till dig:'; + @override + String get canceled => 'Sändaren har avbrutit begäran.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$sv extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Alternativ'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend-mappen)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Avstängd automatiskt eftersom det finns kataloger.'; +} + +// Path: sendPage +class _Translations$sendPage$sv extends Translations$sendPage$en { + _Translations$sendPage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Väntar på svar…'; + @override + String get rejected => 'Mottagaren har avvisat begäran.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Mottagaren är upptagen med en annan förfrågan.'; +} + +// Path: progressPage +class _Translations$progressPage$sv extends Translations$progressPage$en { + _Translations$progressPage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Skickar filer'; + @override + String get titleReceiving => 'Tar emot filer'; + @override + String get savedToGallery => 'Sparat i Foton'; + @override + late final _Translations$progressPage$total$sv total = _Translations$progressPage$total$sv._(_root); + @override + late final _Translations$progressPage$remainingTime$sv remainingTime = _Translations$progressPage$remainingTime$sv._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$sv extends Translations$webSharePage$en { + _Translations$webSharePage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dela via länk'; + @override + String get loading => 'Startar server…'; + @override + String get stopping => 'Stoppar servern…'; + @override + String get error => 'Ett fel inträffade vid start av servern.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))( + n, + one: 'Öppna denna länk i webbläsaren:', + other: 'Öppna en av dessa länkar i webbläsaren:', + ); + @override + String get requests => 'Förfrågningar'; + @override + String get noRequests => 'Inga förfrågningar ännu.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Acceptera förfrågningar automatiskt'; + @override + String get requirePin => 'Kräv PIN-kod'; + @override + String pinHint({required Object pin}) => 'PIN-koden är "${pin}"'; + @override + String get encryptionHint => 'LocalSend använder ett självsignerat certifikat. Du behöver acceptera det i webbläsaren.'; + @override + String pendingRequests({required Object n}) => 'Väntande förfrågningar: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$sv extends Translations$aboutPage$en { + _Translations$aboutPage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Om LocalSend'; + @override + List get description => [ + 'LocalSend är fri programvara med öppen källkod som låter dig säkert dela filer och meddelanden med enheter i närheten över ditt lokala nätverk utan att behöva en internetanslutning.', + 'Denna app är tillgänglig på Android, iOS, macOS, Windows och Linux. Du kan hitta alla nedladdningsalternativ på den officiella hemsidan.', + ]; + @override + String get author => 'Upphovsman'; + @override + String get contributors => 'Bidragsgivare'; + @override + String get packagers => 'Förpackare'; + @override + String get translators => 'Översättare'; +} + +// Path: donationPage +class _Translations$donationPage$sv extends Translations$donationPage$en { + _Translations$donationPage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Donera'; + @override + String get info => + 'LocalSend är fri programvara med öppen källkod och utan några annonser. Om du gillar appen kan du stödja utvecklingen med en donation.'; + @override + String donate({required Object amount}) => 'Donera ${amount}'; + @override + String get thanks => 'Tack så mycket!'; + @override + String get restore => 'Återställ köp'; +} + +// Path: changelogPage +class _Translations$changelogPage$sv extends Translations$changelogPage$en { + _Translations$changelogPage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ändringslog'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$sv extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'Bedårande', + 'Vacker', + 'Stor', + 'Ljus', + 'Ren', + 'Klyftig', + 'Cool', + 'Söt', + 'Listig', + 'Bestämd', + 'Energisk', + 'Effektiv', + 'Fantastisk', + 'Snabb', + 'Fint', + 'Fräsch', + 'Bra', + 'Underbar', + 'Jättebra', + 'Stilig', + 'Het', + 'Snäll', + 'Underbar', + 'Mystiker', + 'Prydlig', + 'Trevlig', + 'Tålmodig', + 'Snygg', + 'Kraftfull', + 'Rik', + 'Hemlig', + 'Smart', + 'Solid', + 'Speciell', + 'Strategisk', + 'Stark', + 'Ordentlig', + 'Vis', + ]; + @override + List get fruits => [ + 'Äpple', + 'Avocado', + 'Banan', + 'Björnbär', + 'Blåbär', + 'Broccoli', + 'Morot', + 'Körsbär', + 'Kokosnöt', + 'Druva', + 'Citron', + 'Sallad', + 'Mango', + 'Melon', + 'Svamp', + 'Lök', + 'Apelsin', + 'Papaya', + 'Persika', + 'Päron', + 'Ananas', + 'Potatis', + 'Pumpa', + 'Hallon', + 'Jordgubbe', + 'Tomat', + ]; + + /// In some languages, the adjective must be last. + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$sv extends Translations$dialogs$en { + _Translations$dialogs$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$sv addFile = _Translations$dialogs$addFile$sv._(_root); + @override + late final _Translations$dialogs$openFile$sv openFile = _Translations$dialogs$openFile$sv._(_root); + @override + late final _Translations$dialogs$addressInput$sv addressInput = _Translations$dialogs$addressInput$sv._(_root); + @override + late final _Translations$dialogs$cancelSession$sv cancelSession = _Translations$dialogs$cancelSession$sv._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$sv cannotOpenFile = _Translations$dialogs$cannotOpenFile$sv._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$sv encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$sv._(_root); + @override + late final _Translations$dialogs$errorDialog$sv errorDialog = _Translations$dialogs$errorDialog$sv._(_root); + @override + late final _Translations$dialogs$favoriteDialog$sv favoriteDialog = _Translations$dialogs$favoriteDialog$sv._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$sv favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$sv._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$sv favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$sv._(_root); + @override + late final _Translations$dialogs$fileInfo$sv fileInfo = _Translations$dialogs$fileInfo$sv._(_root); + @override + late final _Translations$dialogs$fileNameInput$sv fileNameInput = _Translations$dialogs$fileNameInput$sv._(_root); + @override + late final _Translations$dialogs$historyClearDialog$sv historyClearDialog = _Translations$dialogs$historyClearDialog$sv._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$sv localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$sv._(_root); + @override + late final _Translations$dialogs$messageInput$sv messageInput = _Translations$dialogs$messageInput$sv._(_root); + @override + late final _Translations$dialogs$noFiles$sv noFiles = _Translations$dialogs$noFiles$sv._(_root); + @override + late final _Translations$dialogs$noPermission$sv noPermission = _Translations$dialogs$noPermission$sv._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$sv notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$sv._(_root); + @override + late final _Translations$dialogs$qr$sv qr = _Translations$dialogs$qr$sv._(_root); + @override + late final _Translations$dialogs$quickActions$sv quickActions = _Translations$dialogs$quickActions$sv._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$sv quickSaveNotice = _Translations$dialogs$quickSaveNotice$sv._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$sv quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$sv._(_root); + @override + late final _Translations$dialogs$pin$sv pin = _Translations$dialogs$pin$sv._(_root); + @override + late final _Translations$dialogs$sendModeHelp$sv sendModeHelp = _Translations$dialogs$sendModeHelp$sv._(_root); + @override + late final _Translations$dialogs$zoom$sv zoom = _Translations$dialogs$zoom$sv._(_root); +} + +// Path: sanitization +class _Translations$sanitization$sv extends Translations$sanitization$en { + _Translations$sanitization$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Filnamnet får inte vara tomt'; + @override + String get invalid => 'Filnamnet innehåller ogiltiga tecken'; +} + +// Path: tray +class _Translations$tray$sv extends Translations$tray$en { + _Translations$tray$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Avsluta LocalSend'; + @override + String get closeWindows => 'Avsluta'; +} + +// Path: web +class _Translations$web$sv extends Translations$web$en { + _Translations$web$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Ange PIN-kod'; + @override + String get invalidPin => 'Ogiltig PIN-kod'; + @override + String get tooManyAttempts => 'För många försök'; + @override + String get rejected => 'Avvisad'; + @override + String get files => 'Filer'; + @override + String get fileName => 'Filnamn'; + @override + String get size => 'Storlek'; +} + +// Path: assetPicker +class _Translations$assetPicker$sv extends Translations$assetPicker$en { + _Translations$assetPicker$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Bekräfta'; + @override + String get cancel => 'Avbryt'; + @override + String get edit => 'Redigera'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Laddning misslyckades'; + @override + String get original => 'Original'; + @override + String get preview => 'Förhandsvisning'; + @override + String get select => 'Välj'; + @override + String get emptyList => 'Tom lista'; + @override + String get unSupportedAssetType => 'Ogiltig filtyp.'; + @override + String get unableToAccessAll => 'Kan inte få åtkomst till alla filer på enheten'; + @override + String get viewingLimitedAssetsTip => 'Endast visa filer och album som kan nås av appen.'; + @override + String get changeAccessibleLimitedAssets => 'Klicka för att uppdatera åtkomliga filer'; + @override + String get accessAllTip => + 'Appen kan endast få åtkomst till vissa filer på enheten. Gå till systeminställningar och tillåt appen att få åtkomst till allt media på enheten.'; + @override + String get goToSystemSettings => 'Gå till systeminställningar'; + @override + String get accessLimitedAssets => 'Fortsätt med begränsad åtkomst'; + @override + String get accessiblePathName => 'Åtkomliga filer'; + @override + String get sTypeAudioLabel => 'Ljud'; + @override + String get sTypeImageLabel => 'Bild'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Annan media'; + @override + String get sActionPlayHint => 'spela'; + @override + String get sActionPreviewHint => 'förhandsvisa'; + @override + String get sActionSelectHint => 'välj'; + @override + String get sActionSwitchPathLabel => 'byt sökväg'; + @override + String get sActionUseCameraHint => 'använd kamera'; + @override + String get sNameDurationLabel => 'längd'; + @override + String get sUnitAssetCountLabel => 'antal'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$sv extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nätverksgränssnitt'; + @override + String get info => + 'Som standard använder LocalSend alla tillgängliga nätverksgränssnitt. Du kan utesluta oönskade nätverk här. Du måste starta om servern för att tillämpa ändringarna.'; + @override + String get preview => 'Förhandsvisning'; + @override + String get whitelist => 'Vitlista'; + @override + String get blacklist => 'Svartlista'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$sv extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Alias:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$sv extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Favoriter'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$sv extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Val'; + @override + String files({required Object files}) => 'Filer: ${files}'; + @override + String size({required Object size}) => 'Storlek: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$sv extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get file => 'Fil'; + @override + String get folder => 'Mapp'; + @override + String get media => 'Media'; + @override + String get text => 'Text'; + @override + String get app => 'App'; + @override + String get clipboard => 'Klistra in'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$sv extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get single => 'En mottagare'; + @override + String get multiple => 'Flera mottagare'; + @override + String get link => 'Dela via länk'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$sv extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Allmänt'; + @override + String get brightness => 'Tema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$sv brightnessOptions = _Translations$settingsTab$general$brightnessOptions$sv._( + _root, + ); + @override + String get color => 'Färg'; + @override + late final _Translations$settingsTab$general$colorOptions$sv colorOptions = _Translations$settingsTab$general$colorOptions$sv._(_root); + @override + String get language => 'Språk'; + @override + late final _Translations$settingsTab$general$languageOptions$sv languageOptions = _Translations$settingsTab$general$languageOptions$sv._(_root); + @override + String get saveWindowPlacement => 'Avsluta: Spara fönsterplacering'; + @override + String get saveWindowPlacementWindows => 'Spara fönsterposition efter avslut'; + @override + String get minimizeToTray => 'Lämna: minimera till tray'; + @override + String get launchAtStartup => 'Starta automatiskt efter inloggning'; + @override + String get launchMinimized => 'Starta automatiskt: starta gömd'; + @override + String get showInContextMenu => 'Visa LocalSend i snabbmenyn'; + @override + String get animations => 'Animationer'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$sv extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ta emot'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Automatisk avslutning'; + @override + String get destination => 'Destination'; + @override + String get downloads => '(Hämtade)'; + @override + String get saveToGallery => 'Spara media i galleriet'; + @override + String get saveToHistory => 'Spara till historik'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$sv extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Skicka'; + @override + String get shareViaLinkAutoAccept => 'Acceptera förfrågningar automatiskt i läget "Dela via länk"'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$sv extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nätverk'; + @override + String get needRestart => 'Starta om servern för att tillämpa inställningarna!'; + @override + String get server => 'Server'; + @override + String get alias => 'Alias'; + @override + String get deviceType => 'Enhetstyp'; + @override + String get deviceModel => 'Enhet modell'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Tidsgräns för upptäckt'; + @override + String get useSystemName => 'Använd systemnamn'; + @override + String get generateRandomAlias => 'Generera slumpmässigt alias'; + @override + String portWarning({required Object defaultPort}) => + 'Du kanske inte upptäcks av andra enheter eftersom du använder en anpassad port. (standard: ${defaultPort})'; + @override + String get encryption => 'Kryptering'; + @override + String get multicastGroup => 'Multicast'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Du kanske inte upptäcks av andra enheter eftersom du använder en anpassad multicast-adress. (standard: ${defaultMulticast})'; + @override + String get network => 'Nätverk'; + @override + late final _Translations$settingsTab$network$networkOptions$sv networkOptions = _Translations$settingsTab$network$networkOptions$sv._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$sv extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Annat'; + @override + String get support => 'Stöd LocalSend'; + @override + String get donate => 'Donera'; + @override + String get privacyPolicy => 'Sekretesspolicy'; + @override + String get termsOfUse => 'Användarvillkor'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$sv extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Denna app kan skicka filer till andra enheter men andra enheter kan inte skicka filer till denna enhet.'; + @override + String solution({required Object port}) => + 'Detta är troligtvis ett brandväggsproblem. Du kan lösa det genom att tillåta inkommande anslutningar (UDP och TCP) på port ${port}.'; + @override + String get openFirewall => 'Öppna brandväggen'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$sv extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Denna enhet kan inte upptäcka andra enheter.'; + @override + String get solution => + 'Se till att alla enheter är på samma Wi-Fi-nätverk och delar samma konfiguration (port, multicast-adress, kryptering). Du kan försöka skriva in IP-adressen för målenheten manuellt. Om detta fungerar, överväg att lägga till den här enheten till favoriterna så att den kan upptäckas automatiskt i framtiden.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$sv extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Båda enheterna kan inte upptäcka varandra eller dela filer.'; + @override + String get solution => + 'Problemet finns på båda sidor? Då måste du se till att båda enheterna är anslutna till samma wifi-nätverk och delar samma konfiguration (port, multicast-adress, kryptering). Wi-Fi kanske inte tillåter kommunikation mellan deltagare. I så fall måste alternativet vara aktiverat på routern.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$sv extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get open => 'Öppna fil'; + @override + String get showInFolder => 'Visa i mapp'; + @override + String get info => 'Information'; + @override + String get deleteFromHistory => 'Ta bort från historik'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$sv extends Translations$progressPage$total$en { + _Translations$progressPage$total$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$sv title = _Translations$progressPage$total$title$sv._(_root); + @override + String count({required Object curr, required Object n}) => 'Filer: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Storlek: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Hastighet: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$sv extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Använd "h" som förkortning för timmar och "m" för minuter + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Använd "d" för dagar, "h" för timmar och "m" för minuter + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$sv extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lägg till i val'; + @override + String get content => 'Vad vill du lägga till?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$sv extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Öppna fil'; + @override + String get content => 'Vill du öppna den mottagna filen?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$sv extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Skriv in adress'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP Address'; + @override + String get recentlyUsed => 'Senast använda: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$sv extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Avbryt filöverföring'; + @override + String get content => 'Vill du verkligen avbryta filöverföringen?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$sv extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kan inte öppna fil'; + @override + String content({required Object file}) => 'Kunde inte öppna "${file}". Har denna fil flyttats, bytt namn eller raderats?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$sv extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Kryptering inaktiverad'; + @override + String get content => 'Kommunikationen sker nu via det oenkrypterade HTTP-protokollet. För att använda HTTPS, aktivera kryptering igen.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$sv extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$sv extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favoriter'; + @override + String get noFavorites => 'Inga favoritenheter än.'; + @override + String get addFavorite => 'Lägg till'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$sv extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ta bort från favoriter'; + @override + String content({required Object name}) => 'Vill du verkligen ta bort från favoriterna "${name}"?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$sv extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Lägg till i favoriter'; + @override + String get titleEdit => 'Inställningar'; + @override + String get name => 'Enhetens namn'; + @override + String get auto => '(auto)'; + @override + String get ip => 'IP-adress'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$sv extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Filinformation'; + @override + String get fileName => 'Filnamn:'; + @override + String get path => 'Sökväg:'; + @override + String get size => 'Storlek:'; + @override + String get sender => 'Avsändare:'; + @override + String get time => 'Tid:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$sv extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Skriv in filnamn'; + @override + String original({required Object original}) => 'Orginal: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$sv extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Rensa historik'; + @override + String get content => 'Vill du verkligen ta bort hela historiken?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$sv extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend kan inte hitta andra enheter utan att ha behörighet att skanna det lokala nätverket. Bevilja denna behörighet i inställningarna.'; + @override + String get gotoSettings => 'Inställningar'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$sv extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Skriv meddelande'; + @override + String get multiline => 'Flerlinje'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$sv extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ingen fil vald'; + @override + String get content => 'Var god välj minst en fil.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$sv extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ingen behörighet'; + @override + String get content => 'Du har inte beviljat nödvändiga behörigheter. Var vänlig bevilja dem i inställningarna.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$sv extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Inte tillgängligt'; + @override + String get content => 'Denna funktion är endast tillgänglig på:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$sv extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR-kod'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$sv extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Snabba Handlingar'; + @override + String get counter => 'Disken'; + @override + String get prefix => 'Prefix'; + @override + String get padZero => 'Block med nollor'; + @override + String get sortBeforeCount => 'Sortera alphabetiskt innan'; + @override + String get random => 'Slumpmässig'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$sv extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'Filförfrågningar accepteras automatiskt. Observera att alla i lokala nätverket kan skicka filer till dig.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$sv extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Filförfrågningar accepteras nu automatiskt från enheter i din favoritlista.', + 'Varning! För närvarande är detta inte helt säkert, eftersom en hacker som har fingeravtrycket från vilken enhet som helst från din favoritlista kan skicka filer till dig utan begränsningar.', + 'Detta alternativ är dock fortfarande säkrare än att låta alla användare på det lokala nätverket skicka filer till dig utan begränsningar.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$sv extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ange PIN-kod'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$sv extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sändningslägen'; + @override + String get single => 'Skickar filer till en mottagare. Valet rensas efter avslutad filöverföring.'; + @override + String get multiple => 'Skickar filer till flera mottagare. Valet rensas inte.'; + @override + String get link => 'Mottagare som inte har LocalSend installerat kan ladda ner de valda filerna genom att öppna länken i deras webbläsare.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$sv extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$sv extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; + @override + String get dark => 'Mörkt'; + @override + String get light => 'Ljust'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$sv extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$sv extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get system => 'System'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$sv extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String get all => 'Alla'; + @override + String get filtered => 'Filtrerad'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$sv extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$sv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Totalt förlopp (${time})'; + @override + String get finishedError => 'Avslutad med fel'; + @override + String get canceledSender => 'Avbruten av sändaren'; + @override + String get canceledReceiver => 'Avbruten av mottagaren'; +} diff --git a/app/lib/gen/strings_ta.g.dart b/app/lib/gen/strings_ta.g.dart new file mode 100644 index 0000000..134aba3 --- /dev/null +++ b/app/lib/gen/strings_ta.g.dart @@ -0,0 +1,1500 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsTa extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsTa({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ta, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsTa _root = this; // ignore: unused_field + + @override + TranslationsTa $copyWith({TranslationMetadata? meta}) => TranslationsTa(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'தமிழ்'; + @override + String get appName => 'உள்ளக'; + @override + late final _Translations$general$ta general = _Translations$general$ta._(_root); + @override + late final _Translations$receiveTab$ta receiveTab = _Translations$receiveTab$ta._(_root); + @override + late final _Translations$sendTab$ta sendTab = _Translations$sendTab$ta._(_root); + @override + late final _Translations$settingsTab$ta settingsTab = _Translations$settingsTab$ta._(_root); + @override + late final _Translations$troubleshootPage$ta troubleshootPage = _Translations$troubleshootPage$ta._(_root); + @override + late final _Translations$receiveHistoryPage$ta receiveHistoryPage = _Translations$receiveHistoryPage$ta._(_root); + @override + late final _Translations$apkPickerPage$ta apkPickerPage = _Translations$apkPickerPage$ta._(_root); + @override + late final _Translations$selectedFilesPage$ta selectedFilesPage = _Translations$selectedFilesPage$ta._(_root); + @override + late final _Translations$receivePage$ta receivePage = _Translations$receivePage$ta._(_root); + @override + late final _Translations$receiveOptionsPage$ta receiveOptionsPage = _Translations$receiveOptionsPage$ta._(_root); + @override + late final _Translations$sendPage$ta sendPage = _Translations$sendPage$ta._(_root); + @override + late final _Translations$progressPage$ta progressPage = _Translations$progressPage$ta._(_root); + @override + late final _Translations$webSharePage$ta webSharePage = _Translations$webSharePage$ta._(_root); + @override + late final _Translations$aboutPage$ta aboutPage = _Translations$aboutPage$ta._(_root); + @override + late final _Translations$donationPage$ta donationPage = _Translations$donationPage$ta._(_root); + @override + late final _Translations$changelogPage$ta changelogPage = _Translations$changelogPage$ta._(_root); + @override + late final _Translations$aliasGenerator$ta aliasGenerator = _Translations$aliasGenerator$ta._(_root); + @override + late final _Translations$dialogs$ta dialogs = _Translations$dialogs$ta._(_root); + @override + late final _Translations$sanitization$ta sanitization = _Translations$sanitization$ta._(_root); + @override + late final _Translations$tray$ta tray = _Translations$tray$ta._(_root); + @override + late final _Translations$web$ta web = _Translations$web$ta._(_root); + @override + late final _Translations$assetPicker$ta assetPicker = _Translations$assetPicker$ta._(_root); + @override + late final _Translations$networkInterfacesPage$ta networkInterfacesPage = _Translations$networkInterfacesPage$ta._(_root); +} + +// Path: general +class _Translations$general$ta extends Translations$general$en { + _Translations$general$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get accept => 'ஏற்றுக்கொள்'; + @override + String get accepted => 'ஏற்றுக்கொள்ளப்பட்டது'; + @override + String get add => 'சேர்க்க'; + @override + String get advanced => 'மேம்பட்ட'; + @override + String get cancel => 'ரத்து செய்'; + @override + String get close => 'மூடு'; + @override + String get confirm => 'உறுதி'; + @override + String get continueStr => 'தொடரவும்'; + @override + String get copy => 'நகல் எடு'; + @override + String get copiedToClipboard => 'கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது'; + @override + String get decline => 'மறு'; + @override + String get done => 'முடிந்தது'; + @override + String get delete => 'நீக்கு'; + @override + String get edit => 'தொகுத்து அமை (திருத்து)'; + @override + String get error => 'பிழை / தவறு'; + @override + String get example => 'உதாரணம்'; + @override + String get files => 'கோப்புகள்'; + @override + String get finished => 'முடிந்தது'; + @override + String get hide => 'மறை'; + @override + String get off => 'ஆஃப் (Off)'; + @override + String get offline => 'ஆஃப்லைன் (Offline)'; + @override + String get on => 'ஆன் (On)'; + @override + String get online => 'ஆன்லைன் (Online)'; + @override + String get open => 'திறக்கவும்'; + @override + String get queue => 'வரிசை'; + @override + String get quickSave => 'விரைவில் சேமி'; + @override + String get quickSaveFromFavorites => 'விருப்பங்களுக்கு விரைவாகச் சேமி'; + @override + String get renamed => 'மறுபெயரிடப்பட்டது'; + @override + String get reset => 'மாற்றங்களைச் செயல்தவிர்'; + @override + String get restart => 'மறுதொடக்கம்'; + @override + String get settings => 'அமைப்புகள்'; + @override + String get skipped => 'தவிர்க்கப்பட்டது'; + @override + String get start => 'தொடங்கு'; + @override + String get stop => 'நிறுத்து'; + @override + String get save => 'சேமி'; + @override + String get unchanged => 'மாறாது'; + @override + String get unknown => 'தெரியவில்லை'; + @override + String get noItemInClipboard => 'கிளிப்போர்டில் உருப்படிகள் இல்லை.'; +} + +// Path: receiveTab +class _Translations$receiveTab$ta extends Translations$receiveTab$en { + _Translations$receiveTab$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'பெறு'; + @override + late final _Translations$receiveTab$infoBox$ta infoBox = _Translations$receiveTab$infoBox$ta._(_root); + @override + late final _Translations$receiveTab$quickSave$ta quickSave = _Translations$receiveTab$quickSave$ta._(_root); +} + +// Path: sendTab +class _Translations$sendTab$ta extends Translations$sendTab$en { + _Translations$sendTab$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'அனுப்பு'; + @override + late final _Translations$sendTab$selection$ta selection = _Translations$sendTab$selection$ta._(_root); + @override + late final _Translations$sendTab$picker$ta picker = _Translations$sendTab$picker$ta._(_root); + @override + String get shareIntentInfo => 'கோப்புகளை மிக எளிதாக தேர்ந்தெடுக்க உங்கள் மொபைல் சாதனத்தின் பகிர் அம்சத்தையும் பயன்படுத்தலாம்.'; + @override + String get nearbyDevices => 'அருகிலுள்ள சாதனங்கள்'; + @override + String get thisDevice => 'இந்த சாதனம்'; + @override + String get scan => 'சாதனங்களைத் தேடு'; + @override + String get manualSending => 'கைமுறையாக அனுப்புதல்'; + @override + String get sendMode => 'அனுப்பும் முறை'; + @override + late final _Translations$sendTab$sendModes$ta sendModes = _Translations$sendTab$sendModes$ta._(_root); + @override + String get sendModeHelp => 'விளக்கம்'; + @override + String get help => 'விரும்பிய இலக்கும் அதே வைஃபை நெட்வொர்க்கில் இருப்பதை உறுதிசெய்யவும்.'; + @override + String get placeItems => 'பகிர்ந்து கொள்ள பொருட்களை வைக்கவும்.'; +} + +// Path: settingsTab +class _Translations$settingsTab$ta extends Translations$settingsTab$en { + _Translations$settingsTab$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'அமைப்புகள்'; + @override + late final _Translations$settingsTab$general$ta general = _Translations$settingsTab$general$ta._(_root); + @override + late final _Translations$settingsTab$receive$ta receive = _Translations$settingsTab$receive$ta._(_root); + @override + late final _Translations$settingsTab$send$ta send = _Translations$settingsTab$send$ta._(_root); + @override + late final _Translations$settingsTab$network$ta network = _Translations$settingsTab$network$ta._(_root); + @override + late final _Translations$settingsTab$other$ta other = _Translations$settingsTab$other$ta._(_root); + @override + String get advancedSettings => 'மேம்பட்ட அமைப்புகள்'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$ta extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'பிரச்சனைகளை தீர்க்கவும்'; + @override + String get subTitle => 'ஆப் எதிர்பார்த்தது போல வேலை செய்யவில்லையா? இங்கே சில பொதுவான தீர்வுகளை நீங்கள் காணலாம்.'; + @override + String get solution => 'தீர்வு:'; + @override + String get fixButton => 'தானாக சரி செய்யவும்'; + @override + late final _Translations$troubleshootPage$firewall$ta firewall = _Translations$troubleshootPage$firewall$ta._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$ta noDiscovery = _Translations$troubleshootPage$noDiscovery$ta._(_root); + @override + late final _Translations$troubleshootPage$noConnection$ta noConnection = _Translations$troubleshootPage$noConnection$ta._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$ta extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'வரலாறு'; + @override + String get openFolder => 'கோப்புறையை திறக்கவும்'; + @override + String get deleteHistory => 'வரலாற்றை நீக்கவும்'; + @override + String get empty => 'வரலாறு காலியாக உள்ளது.'; + @override + late final _Translations$receiveHistoryPage$entryActions$ta entryActions = _Translations$receiveHistoryPage$entryActions$ta._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$ta extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'செயலிகள் (APK)'; + @override + String get excludeSystemApps => 'கணினி செயலிகளைக் கணக்கில் எடுத்துக்கொள்ளாமல் விடவும்'; + @override + String get excludeAppsWithoutLaunchIntent => 'திறக்க முடியாத செயலிகளை தவிர்க்கவும்'; + @override + String apps({required Object n}) => '${n} செயலிகள்'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$ta extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'அனைத்தையும் நீக்கவும்'; +} + +// Path: receivePage +class _Translations$receivePage$ta extends Translations$receivePage$en { + _Translations$receivePage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ta'))( + n, + one: 'உங்களுக்கு ஒரு கோப்பை அனுப்ப விரும்புகிறார்', + other: 'உங்களுக்கு ${n} கோப்புகளை அனுப்ப விரும்புகிறார்', + ); + @override + String get subTitleMessage => 'உங்களுக்கு ஒரு செய்தியை அனுப்பினார்:'; + @override + String get subTitleLink => 'உங்களுக்கு ஒரு இணைப்பை அனுப்பினார்:'; + @override + String get canceled => 'அனுப்புபவர் கோரிக்கையை ரத்து செய்துள்ளார்.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$ta extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'விருப்பங்கள்'; + @override + String get destination => '@: setsionStab.receive.destination'; + @override + String get appDirectory => '(LocalSend கோப்புறை)'; + @override + String get saveToGallery => '@: settionstab.receive.savetogallery'; + @override + String get saveToGalleryOff => 'கோப்புறைகள் இருப்பதால் தானாகவே முடக்கப்பட்டது.'; +} + +// Path: sendPage +class _Translations$sendPage$ta extends Translations$sendPage$en { + _Translations$sendPage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'பதில் வரும் வரை காத்திருக்கிறது…'; + @override + String get rejected => 'பெறுநர் கோரிக்கையை நிராகரித்துள்ளார்.'; + @override + String get tooManyAttempts => '@: web.doomanyattempts'; + @override + String get busy => 'பெறுநர் மற்றொரு கோரிக்கையுடன் ব্যস্তமாக உள்ளார்.'; +} + +// Path: progressPage +class _Translations$progressPage$ta extends Translations$progressPage$en { + _Translations$progressPage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'கோப்புகளை அனுப்புகிறது'; + @override + String get titleReceiving => 'கோப்புகளை பெறுகிறது'; + @override + String get savedToGallery => 'புகைப்படங்களில் சேமிக்கப்பட்டது'; + @override + late final _Translations$progressPage$total$ta total = _Translations$progressPage$total$ta._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$ta extends Translations$webSharePage$en { + _Translations$webSharePage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'இணைப்பின் மூலம் பகிரவும்'; + @override + String get loading => 'சேவையை தொடங்குகிறது…'; + @override + String get stopping => 'சேவையை நிறுத்துகிறது…'; + @override + String get error => 'சேவையை தொடங்கும்போது பிழை ஏற்பட்டது.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ta'))( + n, + one: 'உங்கள் உலாவியில் இந்த இணைப்பை திறக்கவும்:', + other: 'உங்கள் உலாவியில் இந்த இணைப்புகளில் ஒன்றை திறக்கவும்:', + ); + @override + String get requests => 'கோரிக்கைகள்'; + @override + String get noRequests => 'இன்னும் கோரிக்கைகள் இல்லை.'; + @override + String get encryption => '@: settionstab.network.encryption'; + @override + String get autoAccept => 'கோரிக்கைகளை தானாகவே ஏற்கவும்'; + @override + String get requirePin => 'PIN தேவை'; + @override + String pinHint({required Object pin}) => 'PIN "${pin}" ஆகும்'; + @override + String get encryptionHint => 'LocalSend ஒரு சுய கையொப்பம் செய்யப்பட்ட சான்றிதழைப் பயன்படுத்துகிறது. உங்களின் உலாவியில் அதை ஏற்க வேண்டும்.'; + @override + String pendingRequests({required Object n}) => 'நிலுவை கோரிக்கைகள்: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$ta extends Translations$aboutPage$en { + _Translations$aboutPage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'LocalSend பற்றி'; + @override + List get description => [ + 'LocalSend என்பது ஒரு இலவச, திறந்த மூல செயலி ஆகும், இது உங்களுக்கு உங்களின் உள்ளூர் நெட்வொர்க்கின் மூலம் அருகிலுள்ள சாதனங்களுடன் இணையம் தேவையின்றி பாதுகாப்பாக கோப்புகள் மற்றும் செய்திகளை பகிர அனுமதிக்கிறது.', + 'இந்த செயலி Android, iOS, macOS, Windows மற்றும் Linux-ல் கிடைக்கிறது. அனைத்து பதிவிறக்கம் விருப்பங்களையும் உத்தியோகபூர்வ இணையதளத்தில் காணலாம்.', + ]; + @override + String get author => 'ஆசிரியர்'; + @override + String get contributors => 'பங்களிப்பாளர்கள்'; + @override + String get packagers => 'பேக்கேஜர்கள்'; + @override + String get translators => 'மொழிபெயர்ப்பாளர்கள்'; +} + +// Path: donationPage +class _Translations$donationPage$ta extends Translations$donationPage$en { + _Translations$donationPage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'தானம்'; + @override + String get info => + 'LocalSend இலவசம், திறந்த மூலமாக உள்ளது மற்றும் விளம்பரங்களின்றி உள்ளது. செயலியை நீங்கள் விரும்பினால், ஒரு தானம் மூலம் வளர்ச்சியை ஆதரிக்கலாம்.'; + @override + String donate({required Object amount}) => '${amount} தானம் செய்யவும்'; + @override + String get thanks => 'மிகவும் நன்றி!'; + @override + String get restore => 'கொள்முதல் மீட்டமை'; +} + +// Path: changelogPage +class _Translations$changelogPage$ta extends Translations$changelogPage$en { + _Translations$changelogPage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'மாற்றம் பதிவு'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$ta extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'அருமையான', + 'அழகான', + 'பெரிய', + 'பிரகாசமான', + 'சுத்தமான', + 'திறமையான', + 'குளிர்ச்சி', + 'அழகான', + 'வில்லங்கமான', + 'உறுதியான', + 'ஆற்றல் மிக்க', + 'திறமையான', + 'அபாரமான', + 'வேகமான', + 'நன்றாக', + 'புதிய', + 'நல்ல', + 'கண்கவர்', + 'சிறந்த', + 'அழகான', + 'சூடான', + 'கருணைமிக்க', + 'செல்வாக்கான', + 'மர்மமான', + 'ஒழுங்கான', + 'நன்றான', + 'பொறுமையான', + 'அழகான', + 'சக்திவாய்ந்த', + 'செல்வந்தர்', + 'ரகசியமான', + 'சாமர்த்தியமான', + 'உறுதியான', + 'சிறப்பான', + 'உத்தேசமான', + 'வலுவான', + 'சுத்தமாக', + 'புத்திசாலி', + ]; + @override + List get fruits => [ + 'ஆப்பிள்', + 'அவகேடோ', + 'வாழை', + 'கருப்பு திராட்சை', + 'நீல திராட்சை', + 'ப்ரோக்கோலி', + 'கேரட்', + 'செர்ரி', + 'தேங்காய்', + 'திராட்சை', + 'எலுமிச்சை', + 'லெட்டுஸ்', + 'மாம்பழம்', + 'மெலன்', + 'மஷ்ரூம்', + 'வெங்காயம்', + 'ஆரஞ்சு', + 'பப்பாளி', + 'பீச்', + 'பேரிக்காய்', + 'அன்னாசி', + 'உருளைக்கிழங்கு', + 'மடிக்கோயா', + 'ராஸ்பெர்ரி', + 'ஸ்ட்ராபெர்ரி', + 'தக்காளி', + ]; + + /// சில மொழிகளில், பெயர்ச்சொல் இறுதியில் வர வேண்டும். + @override + String combination({required Object adjective, required Object fruit}) => '${adjective} ${fruit}'; +} + +// Path: dialogs +class _Translations$dialogs$ta extends Translations$dialogs$en { + _Translations$dialogs$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$ta addFile = _Translations$dialogs$addFile$ta._(_root); + @override + late final _Translations$dialogs$openFile$ta openFile = _Translations$dialogs$openFile$ta._(_root); + @override + late final _Translations$dialogs$addressInput$ta addressInput = _Translations$dialogs$addressInput$ta._(_root); + @override + late final _Translations$dialogs$cancelSession$ta cancelSession = _Translations$dialogs$cancelSession$ta._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$ta cannotOpenFile = _Translations$dialogs$cannotOpenFile$ta._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$ta encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$ta._(_root); + @override + late final _Translations$dialogs$errorDialog$ta errorDialog = _Translations$dialogs$errorDialog$ta._(_root); + @override + late final _Translations$dialogs$favoriteDialog$ta favoriteDialog = _Translations$dialogs$favoriteDialog$ta._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$ta favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$ta._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$ta favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$ta._(_root); + @override + late final _Translations$dialogs$fileInfo$ta fileInfo = _Translations$dialogs$fileInfo$ta._(_root); + @override + late final _Translations$dialogs$fileNameInput$ta fileNameInput = _Translations$dialogs$fileNameInput$ta._(_root); + @override + late final _Translations$dialogs$historyClearDialog$ta historyClearDialog = _Translations$dialogs$historyClearDialog$ta._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$ta localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$ta._(_root); + @override + late final _Translations$dialogs$messageInput$ta messageInput = _Translations$dialogs$messageInput$ta._(_root); + @override + late final _Translations$dialogs$noFiles$ta noFiles = _Translations$dialogs$noFiles$ta._(_root); + @override + late final _Translations$dialogs$noPermission$ta noPermission = _Translations$dialogs$noPermission$ta._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$ta notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$ta._(_root); + @override + late final _Translations$dialogs$qr$ta qr = _Translations$dialogs$qr$ta._(_root); + @override + late final _Translations$dialogs$quickActions$ta quickActions = _Translations$dialogs$quickActions$ta._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$ta quickSaveNotice = _Translations$dialogs$quickSaveNotice$ta._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$ta quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$ta._(_root); + @override + late final _Translations$dialogs$pin$ta pin = _Translations$dialogs$pin$ta._(_root); + @override + late final _Translations$dialogs$sendModeHelp$ta sendModeHelp = _Translations$dialogs$sendModeHelp$ta._(_root); + @override + late final _Translations$dialogs$zoom$ta zoom = _Translations$dialogs$zoom$ta._(_root); +} + +// Path: sanitization +class _Translations$sanitization$ta extends Translations$sanitization$en { + _Translations$sanitization$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get empty => 'கோப்பின் பெயர் காலியாக இருக்க முடியாது'; + @override + String get invalid => 'கோப்பின் பெயரில் தவறான எழுத்துக்கள் உள்ளன'; +} + +// Path: tray +class _Translations$tray$ta extends Translations$tray$en { + _Translations$tray$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get open => '@: general.open'; + @override + String get close => 'LocalSend-ஐ நிறுத்து'; + @override + String get closeWindows => 'வெளியேறு'; +} + +// Path: web +class _Translations$web$ta extends Translations$web$en { + _Translations$web$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get waiting => '@: sendPage.wainging'; + @override + String get enterPin => 'PIN-ஐ உள்ளிடவும்'; + @override + String get invalidPin => 'தவறான PIN'; + @override + String get tooManyAttempts => 'மிக அதிகமான முயற்சிகள்'; + @override + String get rejected => 'நிராகரிக்கப்பட்டது'; + @override + String get files => 'கோப்புகள்'; + @override + String get fileName => 'கோப்பின் பெயர்'; + @override + String get size => 'அளவு'; +} + +// Path: assetPicker +class _Translations$assetPicker$ta extends Translations$assetPicker$en { + _Translations$assetPicker$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'உறுதிசெய்'; + @override + String get cancel => 'ரத்து செய்'; + @override + String get edit => 'தொகு'; + @override + String get gifIndicator => 'Gif'; + @override + String get loadFailed => 'ஏற்றுதல் தோல்வியடைந்தது'; + @override + String get original => 'மூல'; + @override + String get preview => 'முன்னோட்டம்'; + @override + String get select => 'தேர்வு செய்'; + @override + String get emptyList => 'காலி பட்டியல்'; + @override + String get unSupportedAssetType => 'ஆதரிக்கப்படாத கோப்பு வகை.'; + @override + String get unableToAccessAll => 'சாதனத்தின் அனைத்து கோப்புகளுக்கும் அணுக முடியவில்லை'; + @override + String get viewingLimitedAssetsTip => 'பயன்பாட்டால் அணுகக்கூடிய கோப்புகள் மற்றும் ஆல்பங்களை மட்டுமே பார்க்கவும்.'; + @override + String get changeAccessibleLimitedAssets => 'அணுகக்கூடிய கோப்புகளை புதுப்பிக்க கிளிக் செய்யவும்'; + @override + String get accessAllTip => + 'பயன்பாடு சாதனத்தின் சில கோப்புகளுக்கே அணுக முடியும். முறைமை அமைப்புகள் செல்லவும் மற்றும் பயன்பாட்டுக்கு அனைத்து ஊடகத்திற்கும் அணுகலை அனுமதிக்கவும்.'; + @override + String get goToSystemSettings => 'முறைமை அமைப்புகள் செல்லவும்'; + @override + String get accessLimitedAssets => 'வரையறுக்கப்பட்ட அணுகலுடன் தொடரவும்'; + @override + String get accessiblePathName => 'அணுகக்கூடிய கோப்புகள்'; + @override + String get sTypeAudioLabel => 'ஒலி'; + @override + String get sTypeImageLabel => 'படம்'; + @override + String get sTypeVideoLabel => 'வீடியோ'; + @override + String get sTypeOtherLabel => 'மற்ற ஊடகம்'; + @override + String get sActionPlayHint => 'விளையாட'; + @override + String get sActionPreviewHint => 'முன்னோட்டம்'; + @override + String get sActionSelectHint => 'தேர்வு செய்'; + @override + String get sActionSwitchPathLabel => 'பாதையை மாற்றவும்'; + @override + String get sActionUseCameraHint => 'கேமராவை பயன்படுத்தவும்'; + @override + String get sNameDurationLabel => 'நேர அளவு'; + @override + String get sUnitAssetCountLabel => 'எண்ணிக்கை'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$ta extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'பிணைய இடைமுகங்கள்'; + @override + String get info => + 'இயல்பாக, லோக்கல்சென்ட் கிடைக்கக்கூடிய அனைத்து பிணைய இடைமுகங்களையும் பயன்படுத்துகிறது. தேவையற்ற நெட்வொர்க்குகளை இங்கே விலக்கலாம். மாற்றங்களைப் பயன்படுத்த நீங்கள் சேவையகத்தை மறுதொடக்கம் செய்ய வேண்டும்.'; + @override + String get preview => 'முன்னோட்டம்'; + @override + String get whitelist => 'அனுமதிப்பட்டியலாளர்'; + @override + String get blacklist => 'தடுப்புப்பட்டியல்'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$ta extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get ip => 'இணைய முகவரி:'; + @override + String get port => 'போர்ட்:'; + @override + String get alias => 'சாதனத்தின் பெயர்:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$ta extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get off => '@: செனரல்'; + @override + String get favorites => 'பிடித்தவை'; + @override + String get on => '@: செனரல்'; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$ta extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'தேர்வு'; + @override + String files({required Object files}) => 'கோப்புகள்: ${files}'; + @override + String size({required Object size}) => 'அளவு: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$ta extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get file => 'கோப்பு'; + @override + String get folder => 'கோப்புறை'; + @override + String get media => 'மீடியா'; + @override + String get text => 'தட்டச்சு'; + @override + String get app => 'செயலி'; + @override + String get clipboard => 'ஒட்டவும்'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$ta extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get single => 'ஒற்றை பெறுநர்'; + @override + String get multiple => 'பல பெறுநர்கள்'; + @override + String get link => 'இணைப்பு மூலம் பகிரவும்'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$ta extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'பொது'; + @override + String get brightness => 'தீம்'; + @override + late final _Translations$settingsTab$general$brightnessOptions$ta brightnessOptions = _Translations$settingsTab$general$brightnessOptions$ta._( + _root, + ); + @override + String get color => 'நிறம்'; + @override + late final _Translations$settingsTab$general$colorOptions$ta colorOptions = _Translations$settingsTab$general$colorOptions$ta._(_root); + @override + String get language => 'மொழி'; + @override + late final _Translations$settingsTab$general$languageOptions$ta languageOptions = _Translations$settingsTab$general$languageOptions$ta._(_root); + @override + String get saveWindowPlacement => 'வெளியேறிய பிறகு சாளர நிலையை சேமிக்கவும்'; + @override + String get saveWindowPlacementWindows => 'வெளியேறிய பிறகு சாளர நிலையை சேமிக்கவும்'; + @override + String get minimizeToTray => 'மூடும் போது சிஸ்டம் ட்ரே/மெனு பட்டியில் குறைக்கவும்'; + @override + String get launchAtStartup => 'உள்நுழைந்த பிறகு தானாக துவக்கவும்'; + @override + String get launchMinimized => 'ஆட்டோஸ்டார்ட்: மறைக்கப்பட்ட தொடக்கம்'; + @override + String get showInContextMenu => 'சூழல் மெனுவில் LocalSend ஐக் காட்டு'; + @override + String get animations => 'அனிமேஷன்கள்'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$ta extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'பெறு'; + @override + String get quickSave => '@: general.quicksave'; + @override + String get quickSaveFromFavorites => '@: general.quick பிடித்தவைகளிலிருந்து சேமிக்கவும்'; + @override + String get requirePin => '@: websharepage.requirepin'; + @override + String get autoFinish => 'ஆட்டோ பினிஷ்'; + @override + String get destination => 'கோப்புறையில் சேமிக்கவும்'; + @override + String get downloads => '(பதிவிறக்கங்கள்)'; + @override + String get saveToGallery => 'மீடியாவை கேலரியில் சேமிக்கவும்'; + @override + String get saveToHistory => 'வரலாற்றில் சேமிக்கவும்'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$ta extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'அனுப்பு'; + @override + String get shareViaLinkAutoAccept => '"இணைப்பு வழியாக பகிர்" பயன்முறையில் கோரிக்கைகளை தானாக ஏற்கவும்'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$ta extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'நெட்வொர்க்'; + @override + String get needRestart => 'அமைப்புகளைப் பயன்படுத்த, சேவையகத்தை மறுதொடக்கம் செய்யுங்கள்!'; + @override + String get server => 'சர்வர்'; + @override + String get alias => 'சாதனத்தின் பெயர்'; + @override + String get deviceType => 'சாதன வகை'; + @override + String get deviceModel => 'சாதன மாதிரி'; + @override + String get port => 'போர்ட்'; + @override + String get discoveryTimeout => 'கண்டுபிடிப்பு நேரம் முடிந்தது'; + @override + String get useSystemName => 'அமைப்பின் பெயரைப் பயன்படுத்தவும்'; + @override + String get generateRandomAlias => 'சீரற்ற மாற்றுப்பெயரை உருவாக்கவும்'; + @override + String portWarning({required Object defaultPort}) => + 'நீங்கள் தனிப்பயன் போர்ட்டைப் பயன்படுத்துவதால், பிற சாதனங்களால் உங்களைக் கண்டறிய முடியாமல் போகலாம். (இயல்புநிலை: ${defaultPort})'; + @override + String get encryption => 'மறையாக்கம்'; + @override + String get multicastGroup => 'மல்டிகாஸ்ட் முகவரி'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'நீங்கள் தனிப்பயன் மல்டிகாஸ்ட் முகவரியைப் பயன்படுத்துவதால் பிற சாதனங்களால் உங்களைக் கண்டறிய முடியாமல் போகலாம். (இயல்புநிலை: ${defaultMulticast})'; + @override + String get network => 'பிணையம்'; + @override + late final _Translations$settingsTab$network$networkOptions$ta networkOptions = _Translations$settingsTab$network$networkOptions$ta._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$ta extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'மற்றவை'; + @override + String get support => 'LocalSend ஐ ஆதரிக்க'; + @override + String get donate => 'நன்கொடை'; + @override + String get privacyPolicy => 'தனியுரிமைக் கொள்கை'; + @override + String get termsOfUse => 'பயன்பாட்டு விதிமுறைகள்'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$ta extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'இந்த சாதனம் மற்ற சாதனங்களுக்கு கோப்புகளை அனுப்ப முடிகிறது ஆனால் மற்ற சாதனங்கள் இந்த சாதனத்திற்கு கோப்புகளை அனுப்ப முடியாது.'; + @override + String solution({required Object port}) => + 'இது பொதுவாக ஒரு ஃபயர்வால் பிரச்சனை ஆகும். ${port} போர்ட் மீது உள்வரும் இணைப்புகளை (UDP மற்றும் TCP) அனுமதிப்பதன் மூலம் இதை சரி செய்யலாம்.'; + @override + String get openFirewall => 'ஃபயர்வால் திறக்கவும்'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$ta extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'இந்த சாதனம் மற்ற சாதனங்களை கண்டறிய முடியவில்லை.'; + @override + String get solution => + 'அனைத்து சாதனங்களும் ஒரே Wi-Fi நெட்வொர்க்கில் உள்ளன மற்றும் ஒரே அமைப்பைப் பகிர்ந்து கொள்கின்றன என்பதை உறுதிசெய்யவும் (போர்ட், மல்டிகாஸ்ட் முகவரி, குறியாக்கம்). இலக்கு சாதனத்தின் IP முகவரியை கையால் টাইப் செய்ய முயற்சிக்கவும். இது வேலை செய்தால், இந்த சாதனத்தை விருப்பங்களில் சேர்க்க பரிந்துரை செய்யப்படுகிறது, எனவே எதிர்காலத்தில் இது தானாகவே கண்டறியப்படும்.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$ta extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'இரண்டு சாதனங்களும் ஒருவருக்கொருவர் கண்டறிய முடியவில்லை அல்லது கோப்புகளை பகிர முடியவில்லை.'; + @override + String get solution => + 'பிரச்சனை இரு பக்கங்களிலும் உள்ளதா? அவ்வாறெனில், இரு சாதனங்களும் ஒரே Wi-Fi நெட்வொர்க்கில் உள்ளன மற்றும் ஒரே அமைப்பைப் பகிர்ந்து கொள்கின்றன என்பதை உறுதிசெய்ய வேண்டும் (போர்ட், மல்டிகாஸ்ட் முகவரி, குறியாக்கம்). Access Point (AP) Isolation காரணமாக Wi-Fi நெட்வொர்க்கில் பங்கேற்பாளர்கள் ஒருவருடன் ஒருவர் தொடர்பு கொள்ள முடியாமல் இருக்கலாம். இந்த விருப்பத்தை ரௌட்டரில் முடக்க வேண்டும்.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$ta extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get open => 'கோப்பை திறக்கவும்'; + @override + String get showInFolder => 'கோப்புறையில் காண்பிக்கவும்'; + @override + String get info => 'தகவல்'; + @override + String get deleteFromHistory => 'வரலாற்றில் இருந்து நீக்கவும்'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$ta extends Translations$progressPage$total$en { + _Translations$progressPage$total$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$ta title = _Translations$progressPage$total$title$ta._(_root); + @override + String count({required Object curr, required Object n}) => 'கோப்புகள்: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'அளவு: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'வேகம்: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$ta extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'தேர்வுக்கு சேர்'; + @override + String get content => 'நீங்கள் என்ன சேர்க்க விரும்புகிறீர்கள்?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$ta extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'கோப்பை திறக்கவும்'; + @override + String get content => 'பெறப்பட்ட கோப்பை திறக்க விரும்புகிறீர்களா?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$ta extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'முகவரியை உள்ளிடவும்'; + @override + String get hashtag => 'ஹாஷ்டேக்'; + @override + String get ip => 'IP முகவரி'; + @override + String get recentlyUsed => 'சமீபத்தில் பயன்படுத்தப்பட்டது: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$ta extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'கோப்புகள் பரிமாற்றத்தை ரத்து செய்யவும்'; + @override + String get content => 'நீங்கள் உண்மையிலேயே கோப்புகள் பரிமாற்றத்தை ரத்து செய்ய விரும்புகிறீர்களா?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$ta extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'கோப்பை திறக்க முடியவில்லை'; + @override + String content({required Object file}) => '"${file}"-ஐ திறக்க முடியவில்லை. இந்த கோப்பு நகர்த்தப்பட்டதா, மறுபெயரிடப்பட்டதா அல்லது நீக்கப்பட்டதா?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$ta extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'குறியாக்கம் முடக்கப்பட்டது'; + @override + String get content => + 'இப்போது தகவல்தொடர்பு குறியாக்கமில்லாத HTTP நெறிமுறையின் மூலம் நடக்கிறது. HTTPS நெறிமுறையை பயன்படுத்த, குறியாக்கத்தை மீண்டும் இயக்கவும்.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$ta extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => '@: general.error'; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$ta extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'பிடித்தவை'; + @override + String get noFavorites => 'இன்னும் பிடித்த சாதனங்கள் இல்லை.'; + @override + String get addFavorite => 'சேர்'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$ta extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'பிடித்தவையிலிருந்து நீக்கவும்'; + @override + String content({required Object name}) => '"${name}"-ஐ பிடித்தவையிலிருந்து உண்மையிலேயே நீக்க விரும்புகிறீர்களா?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$ta extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'பிடித்தவைகளில் சேர்க்கவும்'; + @override + String get titleEdit => 'அமைப்புகள்'; + @override + String get name => 'சாதனத்தின் பெயர்'; + @override + String get auto => '(தானாக)'; + @override + String get ip => 'IP முகவரி'; + @override + String get port => 'போர்ட்'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$ta extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'கோப்பு தகவல்'; + @override + String get fileName => 'கோப்பின் பெயர்:'; + @override + String get path => 'பாதை:'; + @override + String get size => 'அளவு:'; + @override + String get sender => 'அனுப்புநர்:'; + @override + String get time => 'நேரம்:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$ta extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'கோப்பின் பெயரை உள்ளிடவும்'; + @override + String original({required Object original}) => 'மூல: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$ta extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'வரலாற்றை அழிக்கவும்'; + @override + String get content => 'மொத்த வரலாற்றையும் உண்மையிலேயே நீக்க விரும்புகிறீர்களா?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$ta extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => '@: உரையாடல்.நோபர்மிசன்.டிடில்'; + @override + String get description => + 'LocalSend உள்நாட்டு நெட்வொர்க்கை ஸ்கேன் செய்ய அனுமதியின்றி சாதனங்களை கண்டறிய முடியாது. தயவுசெய்து அமைப்புகளில் இந்த அனுமதியை வழங்கவும்.'; + @override + String get gotoSettings => 'அமைப்புகள்'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$ta extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'செய்தியை தட்டச்சு செய்யவும்'; + @override + String get multiline => 'பல வரிகள்'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$ta extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'கோப்புகள் தேர்ந்தெடுக்கப்படவில்லை'; + @override + String get content => 'குறைந்தது ஒரு கோப்பை தேர்ந்தெடுக்கவும்.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$ta extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'அனுமதி இல்லை'; + @override + String get content => 'தேவையான அனுமதிகளை நீங்கள் வழங்கவில்லை. தயவுசெய்து அமைப்புகளில் அவற்றை வழங்கவும்.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$ta extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'கிடைக்கவில்லை'; + @override + String get content => 'இந்த அம்சம் மட்டுமே கிடைக்கிறது:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$ta extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR குறியீடு'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$ta extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'விரைவு செயல்கள்'; + @override + String get counter => 'கணக்கிடுபவர்'; + @override + String get prefix => 'முன்னொட்டு'; + @override + String get padZero => 'பூஜ்யங்களால் நிரப்பவும்'; + @override + String get sortBeforeCount => 'முன்னதாக வரிசைப்படுத்தவும் (A-Z)'; + @override + String get random => 'சீரற்ற'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$ta extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => '@: general.quicksave'; + @override + String get content => + 'கோப்பு கோரிக்கைகள் இப்போது தானாகவே ஏற்கப்படும். உள்ளூர் நெட்வொர்க்கில் உள்ள அனைவரும் உங்களுக்கு கோப்புகளை அனுப்ப முடியும் என்பதை கவனிக்கவும்.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$ta extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => '@: general.quick பிடித்தவைகளிலிருந்து சேமிக்கவும்'; + @override + List get content => [ + 'உங்கள் பிடித்த பட்டியலில் உள்ள சாதனங்களில் இருந்து கோப்பு கோரிக்கைகள் இப்போது தானாகவே ஏற்கப்படும்.', + 'எச்சரிக்கை! தற்போது, இது முழுமையாக பாதுகாப்பாக இல்லை, ஏனெனில் உங்கள் பிடித்த பட்டியலில் உள்ள சாதனங்களின் விரலடிகளை வைத்துள்ள ஒரு ஹேக்கர் எந்த கட்டுப்பாடுகளும் இல்லாமல் உங்களுக்கு கோப்புகளை அனுப்ப முடியும்.', + 'என்ன தவிர, இந்த விருப்பம் உள்ளூர் நெட்வொர்க்கில் உள்ள அனைத்து பயனர்களும் எந்த கட்டுப்பாடுகளும் இல்லாமல் உங்களுக்கு கோப்புகளை அனுப்புவதை அனுமதிக்கும் விருப்பத்தை விட அதிகமாக பாதுகாப்பாக உள்ளது.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$ta extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'PIN-ஐ உள்ளிடவும்'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$ta extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'அனுப்பும் முறைகள்'; + @override + String get single => 'கோப்புகளை ஒரு பெறுநருக்கு அனுப்புகிறது. கோப்புகள் பரிமாற்றம் முடிந்த பிறகு தேர்வு அழிக்கப்படும்.'; + @override + String get multiple => 'கோப்புகளை பல பெறுநர்களுக்கு அனுப்புகிறது. கோப்புகள் பரிமாற்றம் முடிந்த பிறகு தேர்வு அழிக்கப்படாது.'; + @override + String get link => + 'LocalSend நிறுவப்படாத பெறுநர்கள் தங்கள் உலாவியில் இணைப்பைத் திறக்க மூலம் தேர்ந்தெடுக்கப்பட்ட கோப்புகளை பதிவிறக்கம் செய்ய முடியும்.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$ta extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get title => 'முகவரி'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$ta extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get system => 'கணினி தீம்'; + @override + String get dark => 'இருண்ட தீம்'; + @override + String get light => 'ஒளி தீம்'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$ta extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get system => 'கணினி நிறம்'; + @override + String get oled => 'ஓஎல்இடி'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$ta extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get system => 'கணினி மொழி'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$ta extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String get all => 'அனைத்தும்'; + @override + String get filtered => 'வடிகட்டப்பட்டது'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$ta extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$ta._(TranslationsTa root) : this._root = root, super.internal(root); + + final TranslationsTa _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'மொத்த முன்னேற்றம் (${time})'; + @override + String get finishedError => 'பிழையுடன் முடிந்தது'; + @override + String get canceledSender => 'அனுப்புநரால் ரத்து செய்யப்பட்டது'; + @override + String get canceledReceiver => 'பெறுநரால் ரத்து செய்யப்பட்டது'; +} diff --git a/app/lib/gen/strings_th.g.dart b/app/lib/gen/strings_th.g.dart new file mode 100644 index 0000000..aa7b133 --- /dev/null +++ b/app/lib/gen/strings_th.g.dart @@ -0,0 +1,1500 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsTh extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsTh({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.th, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsTh _root = this; // ignore: unused_field + + @override + TranslationsTh $copyWith({TranslationMetadata? meta}) => TranslationsTh(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'ไทย'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$th general = _Translations$general$th._(_root); + @override + late final _Translations$receiveTab$th receiveTab = _Translations$receiveTab$th._(_root); + @override + late final _Translations$sendTab$th sendTab = _Translations$sendTab$th._(_root); + @override + late final _Translations$settingsTab$th settingsTab = _Translations$settingsTab$th._(_root); + @override + late final _Translations$troubleshootPage$th troubleshootPage = _Translations$troubleshootPage$th._(_root); + @override + late final _Translations$receiveHistoryPage$th receiveHistoryPage = _Translations$receiveHistoryPage$th._(_root); + @override + late final _Translations$apkPickerPage$th apkPickerPage = _Translations$apkPickerPage$th._(_root); + @override + late final _Translations$selectedFilesPage$th selectedFilesPage = _Translations$selectedFilesPage$th._(_root); + @override + late final _Translations$receivePage$th receivePage = _Translations$receivePage$th._(_root); + @override + late final _Translations$receiveOptionsPage$th receiveOptionsPage = _Translations$receiveOptionsPage$th._(_root); + @override + late final _Translations$sendPage$th sendPage = _Translations$sendPage$th._(_root); + @override + late final _Translations$progressPage$th progressPage = _Translations$progressPage$th._(_root); + @override + late final _Translations$webSharePage$th webSharePage = _Translations$webSharePage$th._(_root); + @override + late final _Translations$aboutPage$th aboutPage = _Translations$aboutPage$th._(_root); + @override + late final _Translations$donationPage$th donationPage = _Translations$donationPage$th._(_root); + @override + late final _Translations$changelogPage$th changelogPage = _Translations$changelogPage$th._(_root); + @override + late final _Translations$aliasGenerator$th aliasGenerator = _Translations$aliasGenerator$th._(_root); + @override + late final _Translations$dialogs$th dialogs = _Translations$dialogs$th._(_root); + @override + late final _Translations$sanitization$th sanitization = _Translations$sanitization$th._(_root); + @override + late final _Translations$tray$th tray = _Translations$tray$th._(_root); + @override + late final _Translations$web$th web = _Translations$web$th._(_root); + @override + late final _Translations$assetPicker$th assetPicker = _Translations$assetPicker$th._(_root); + @override + late final _Translations$networkInterfacesPage$th networkInterfacesPage = _Translations$networkInterfacesPage$th._(_root); +} + +// Path: general +class _Translations$general$th extends Translations$general$en { + _Translations$general$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get accept => 'ยอมรับ'; + @override + String get accepted => 'ยอมรับแล้ว'; + @override + String get add => 'เพิ่ม'; + @override + String get advanced => 'ขั้นสูง'; + @override + String get cancel => 'ยกเลิก'; + @override + String get close => 'ปิด'; + @override + String get confirm => 'ยืนยัน'; + @override + String get continueStr => 'ดำเนินการต่อ'; + @override + String get copy => 'คัดลอก'; + @override + String get copiedToClipboard => 'คัดลอกไปยังคลิปบอร์ดแล้ว'; + @override + String get decline => 'ปฏิเสธ'; + @override + String get done => 'เสร็จแล้ว'; + @override + String get delete => 'ลบ'; + @override + String get edit => 'แก้ไข'; + @override + String get error => 'ข้อผิดพลาด'; + @override + String get example => 'ตัวอย่าง'; + @override + String get files => 'ไฟล์'; + @override + String get finished => 'สำเร็จแล้ว'; + @override + String get hide => 'ซ่อน'; + @override + String get off => 'ปิด'; + @override + String get offline => 'ออฟไลน์'; + @override + String get on => 'เปิด'; + @override + String get online => 'ออนไลน์'; + @override + String get open => 'เปิด'; + @override + String get queue => 'ลำดับคิว'; + @override + String get quickSave => 'บันทึกด่วน'; + @override + String get renamed => 'เปลี่ยนชื่อแล้ว'; + @override + String get reset => 'เลิกทำการเปลี่ยนแปลง'; + @override + String get restart => 'เริ่มต้นใหม่'; + @override + String get settings => 'ตั้งค่า'; + @override + String get skipped => 'ข้ามไฟล์'; + @override + String get start => 'เริ่ม'; + @override + String get stop => 'หยุด'; + @override + String get save => 'บันทึก'; + @override + String get unchanged => 'ไม่เปลี่ยนแปลง'; + @override + String get unknown => 'ไม่รู้จัก'; + @override + String get noItemInClipboard => 'ไม่มีรายการใดในคลิปบอร์ด'; + @override + String get quickSaveFromFavorites => 'เซฟด่วน สำหรับ "รายการโปรด"'; +} + +// Path: receiveTab +class _Translations$receiveTab$th extends Translations$receiveTab$en { + _Translations$receiveTab$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'รับ'; + @override + late final _Translations$receiveTab$infoBox$th infoBox = _Translations$receiveTab$infoBox$th._(_root); + @override + late final _Translations$receiveTab$quickSave$th quickSave = _Translations$receiveTab$quickSave$th._(_root); +} + +// Path: sendTab +class _Translations$sendTab$th extends Translations$sendTab$en { + _Translations$sendTab$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ส่ง'; + @override + late final _Translations$sendTab$selection$th selection = _Translations$sendTab$selection$th._(_root); + @override + late final _Translations$sendTab$picker$th picker = _Translations$sendTab$picker$th._(_root); + @override + String get shareIntentInfo => 'คุณยังสามารถใช้ฟีเจอร์ "แชร์" บนอุปกรณ์ของคุณเพื่อเลือกไฟล์ที่ต้องการได้อย่างง่ายดาย'; + @override + String get nearbyDevices => 'อุปกรณ์ที่อยู่ใกล้เคียง'; + @override + String get thisDevice => 'อุปกรณ์นี้'; + @override + String get scan => 'กำลังค้นหาอุปกรณ์ภายในเครือข่าย'; + @override + String get sendMode => 'โหมดการส่ง'; + @override + late final _Translations$sendTab$sendModes$th sendModes = _Translations$sendTab$sendModes$th._(_root); + @override + String get sendModeHelp => 'คำอธิบาย'; + @override + String get help => 'โปรดตรวจสอบให้แน่ใจว่าอุปกรณ์เป้าหมายเชื่อมต่ออยู่ภายในเครือข่าย WiFi เดียวกันแล้ว'; + @override + String get placeItems => 'วางไฟล์ที่ต้องการแชร์'; + @override + String get manualSending => 'ส่งด้วยตัวเอง'; +} + +// Path: settingsTab +class _Translations$settingsTab$th extends Translations$settingsTab$en { + _Translations$settingsTab$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'การตั้งค่า'; + @override + late final _Translations$settingsTab$general$th general = _Translations$settingsTab$general$th._(_root); + @override + late final _Translations$settingsTab$receive$th receive = _Translations$settingsTab$receive$th._(_root); + @override + late final _Translations$settingsTab$send$th send = _Translations$settingsTab$send$th._(_root); + @override + late final _Translations$settingsTab$network$th network = _Translations$settingsTab$network$th._(_root); + @override + late final _Translations$settingsTab$other$th other = _Translations$settingsTab$other$th._(_root); + @override + String get advancedSettings => 'ตั้งค่าขั้นสูง'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$th extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'แก้ไขปัญหาเบื้องต้น'; + @override + String get subTitle => 'มีปัญหาเกี่ยวกับการใช้งานแอปอยู่หรือเปล่า? คุณสามารถค้นหาวิธีการแก้ปัญหาเบื้องต้นได้จากที่นี้'; + @override + String get solution => 'วิธีทำ:'; + @override + String get fixButton => 'แก้ไขให้โดยอัตโนมัติ'; + @override + late final _Translations$troubleshootPage$firewall$th firewall = _Translations$troubleshootPage$firewall$th._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$th noDiscovery = _Translations$troubleshootPage$noDiscovery$th._(_root); + @override + late final _Translations$troubleshootPage$noConnection$th noConnection = _Translations$troubleshootPage$noConnection$th._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$th extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ประวัติ'; + @override + String get openFolder => 'เปิดโฟลเดอร์'; + @override + String get deleteHistory => 'ลบประวัติ'; + @override + String get empty => 'ประวัติว่างเปล่า'; + @override + late final _Translations$receiveHistoryPage$entryActions$th entryActions = _Translations$receiveHistoryPage$entryActions$th._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$th extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'แอป (APK)'; + @override + String get excludeSystemApps => 'ไม่แสดงแอปของระบบ'; + @override + String get excludeAppsWithoutLaunchIntent => 'ไม่แสดงแอปที่ไม่สามารถเปิดใช้งานได้'; + @override + String apps({required Object n}) => '${n} แอป'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$th extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'ลบทั้งหมด'; +} + +// Path: receivePage +class _Translations$receivePage$th extends Translations$receivePage$en { + _Translations$receivePage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('th'))( + n, + one: 'ต้องการส่งไฟล์ให้คุณ', + other: 'ต้องการส่งไฟล์จำนวน ${n} ไฟล์ให้คุณ', + ); + @override + String get subTitleMessage => 'ส่งข้อความถึงคุณ:'; + @override + String get subTitleLink => 'ส่งลิงค์ให้คุณ:'; + @override + String get canceled => 'ผู้ส่งได้ยกเลิกคำขอส่งไฟล์แล้ว'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$th extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ตัวเลือก'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(โฟลเดอร์ของ LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'ถูกปิดโดยอัตโนมัติเนื่องจากมีโฟลเดอร์'; +} + +// Path: sendPage +class _Translations$sendPage$th extends Translations$sendPage$en { + _Translations$sendPage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'กำลังรอการตอบกลับ...'; + @override + String get rejected => 'ผู้รับได้ปฏิเสธคำขอส่งไฟล์'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'อุปกรณ์ของผู้รับกำลังประมวลผลคำขอรับ-ส่งไฟล์อื่นอยู่'; +} + +// Path: progressPage +class _Translations$progressPage$th extends Translations$progressPage$en { + _Translations$progressPage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'กำลังส่งไฟล์'; + @override + String get titleReceiving => 'กำลังรับไฟล์'; + @override + String get savedToGallery => 'บันทึกไว้ในแอปรูปถ่ายแล้ว'; + @override + late final _Translations$progressPage$total$th total = _Translations$progressPage$total$th._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$th extends Translations$webSharePage$en { + _Translations$webSharePage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'แชร์ผ่านลิงก์'; + @override + String get loading => 'กำลังเริ่มเซิร์ฟเวอร์...'; + @override + String get stopping => 'กำลังหยุดเซิร์ฟเวอร์...'; + @override + String get error => 'เกิดข้อผิดพลาดขณะกำลังเริ่มเซิร์ฟเวอร์'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('th'))( + n, + one: 'เปิดลิงค์นี้ในเบราว์เซอร์:', + other: 'เปิดลิงก์ใดลิงก์หนึ่งในเบราว์เซอร์:', + ); + @override + String get requests => 'คำขอ'; + @override + String get noRequests => 'ยังไม่มีคำขอ'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'ตอบรับคำขอโดยอัตโนมัติ'; + @override + String get requirePin => 'กรอกรหัส PIN'; + @override + String pinHint({required Object pin}) => 'รหัส PIN คือ "${pin}"'; + @override + String get encryptionHint => + 'LocalSend ใช้ใบรับรองอุปกรณ์จากเว็บเบราเซอร์ (self-signed certificate) คุณต้องกดยอมรับใบรับรองนี้ในเบราว์เซอร์บนอุปกรณ์ของคุณ'; + @override + String pendingRequests({required Object n}) => 'คำขอที่รอดำเนินการ: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$th extends Translations$aboutPage$en { + _Translations$aboutPage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'เกี่ยวกับ LocalSend'; + @override + List get description => [ + 'LocalSend เป็นแอปโอเพ่นซอร์สที่คุณสามารถดาวน์โหลดมาใช้ได้ฟรีโดยไม่เสียค่าใช้จ่าย ซึ่งตัวแอปจะช่วยให้คุณสามารถแบ่งปันไฟล์และข้อความกับอุปกรณ์ใกล้เคียงได้อย่างปลอดภัยผ่านเครือข่ายท้องถิ่นที่เชื่อมต่อร่วมกันโดยไม่จำเป็นต้องเชื่อมต่ออินเทอร์เน็ต', + 'แอปนี้พร้อมใช้งานบน Android, iOS, macOS, Windows และ Linux โดยคุณสามารถดาวน์โหลดแอปนี้เพื่อใช้กับระบบปฏิบัติการต่างๆ ได้ผ่านทางหน้าแรกของเว็บไซต์ทางการของเรา', + ]; + @override + String get author => 'ผู้เขียนโปรแกรม'; + @override + String get contributors => 'รายชื่อผู้มีส่วนร่วมพัฒนา'; + @override + String get packagers => 'ไลบรารี'; + @override + String get translators => 'รายชื่อนักแปล'; +} + +// Path: donationPage +class _Translations$donationPage$th extends Translations$donationPage$en { + _Translations$donationPage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'บริจาค'; + @override + String get info => + 'LocalSend เป็นแอปโอเพ่นซอร์สที่คุณสามารถดาวน์โหลดมาใช้ได้ฟรีโดยไม่เสียค่าใช้จ่ายหรือโฆษณาแฝง หากคุณชื่นชอบแอปนี้ คุณสามารถสนับสนุนการพัฒนาแอปได้ด้วยการบริจาคเงิน'; + @override + String donate({required Object amount}) => 'บริจาคเงิน จำนวน ${amount}'; + @override + String get thanks => 'ขอบคุณมาก!'; + @override + String get restore => 'เรียกคืนข้อมูลการซื้อ'; +} + +// Path: changelogPage +class _Translations$changelogPage$th extends Translations$changelogPage$en { + _Translations$changelogPage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'บันทึกรายการเปลี่ยนแปลง'; +} + +// Path: aliasGenerator +class _Translations$aliasGenerator$th extends Translations$aliasGenerator$en { + _Translations$aliasGenerator$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + 'น่ารัก', + 'สวย', + 'ใหญ่', + 'สว่าง', + 'ทำความสะอาด', + 'ฉลาด', + 'เย็น', + 'น่ารัก', + 'ฉลาดแกมโกง', + 'มุ่งมั่น', + 'กระฉับกระเฉง', + 'มีประสิทธิภาพ', + 'มหัศจรรย์', + 'เร็ว', + 'ดี', + 'สด', + 'ดี', + 'งดงาม', + 'ยอดเยี่ยม', + 'หล่อ', + 'ร้อน', + 'ใจดี', + 'น่ารัก', + 'มิสติก', + 'ประณีต', + 'ดี', + 'อดทน', + 'สวย', + 'ทรงพลัง', + 'รวย', + 'ความลับ', + 'ปราดเปรื่อง', + 'แข็ง', + 'พิเศษ', + 'เชิงกลยุทธ์', + 'แข็งแกร่ง', + 'เรียบร้อย', + 'ฉลาด', + ]; + @override + List get fruits => [ + 'แอปเปิล', + 'อาโวคาโด', + 'กล้วย', + 'แบล็คเบอร์รี่', + 'บลูเบอร์รี่', + 'บร็อคโคลี', + 'แครอท', + 'เชอร์รี่', + 'มะพร้าว', + 'องุ่น', + 'มะนาว', + 'ผักกาดหอม', + 'มะม่วง', + 'แตงโม', + 'เห็ด', + 'หัวหอม', + 'ส้ม', + 'มะละกอ', + 'ลูกพีช', + 'ลูกแพร์', + 'สัปปะรด', + 'มันฝรั่ง', + 'ฟักทอง', + 'ราสเบอร์รี่', + 'สตรอเบอร์รี่', + 'มะเขือเทศ', + ]; + + /// ในบางภาษา คำคุณศัพท์จะต้องอยู่ท้ายสุด + @override + String combination({required Object fruit, required Object adjective}) => '${fruit} ${adjective}'; +} + +// Path: dialogs +class _Translations$dialogs$th extends Translations$dialogs$en { + _Translations$dialogs$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$th addFile = _Translations$dialogs$addFile$th._(_root); + @override + late final _Translations$dialogs$addressInput$th addressInput = _Translations$dialogs$addressInput$th._(_root); + @override + late final _Translations$dialogs$cancelSession$th cancelSession = _Translations$dialogs$cancelSession$th._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$th cannotOpenFile = _Translations$dialogs$cannotOpenFile$th._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$th encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$th._(_root); + @override + late final _Translations$dialogs$errorDialog$th errorDialog = _Translations$dialogs$errorDialog$th._(_root); + @override + late final _Translations$dialogs$favoriteDialog$th favoriteDialog = _Translations$dialogs$favoriteDialog$th._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$th favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$th._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$th favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$th._(_root); + @override + late final _Translations$dialogs$fileInfo$th fileInfo = _Translations$dialogs$fileInfo$th._(_root); + @override + late final _Translations$dialogs$fileNameInput$th fileNameInput = _Translations$dialogs$fileNameInput$th._(_root); + @override + late final _Translations$dialogs$historyClearDialog$th historyClearDialog = _Translations$dialogs$historyClearDialog$th._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$th localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$th._(_root); + @override + late final _Translations$dialogs$messageInput$th messageInput = _Translations$dialogs$messageInput$th._(_root); + @override + late final _Translations$dialogs$noFiles$th noFiles = _Translations$dialogs$noFiles$th._(_root); + @override + late final _Translations$dialogs$noPermission$th noPermission = _Translations$dialogs$noPermission$th._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$th notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$th._(_root); + @override + late final _Translations$dialogs$qr$th qr = _Translations$dialogs$qr$th._(_root); + @override + late final _Translations$dialogs$quickActions$th quickActions = _Translations$dialogs$quickActions$th._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$th quickSaveNotice = _Translations$dialogs$quickSaveNotice$th._(_root); + @override + late final _Translations$dialogs$pin$th pin = _Translations$dialogs$pin$th._(_root); + @override + late final _Translations$dialogs$sendModeHelp$th sendModeHelp = _Translations$dialogs$sendModeHelp$th._(_root); + @override + late final _Translations$dialogs$zoom$th zoom = _Translations$dialogs$zoom$th._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$th quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$th._(_root); + @override + late final _Translations$dialogs$openFile$th openFile = _Translations$dialogs$openFile$th._(_root); +} + +// Path: sanitization +class _Translations$sanitization$th extends Translations$sanitization$en { + _Translations$sanitization$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get empty => 'ชื่อไฟล์ไม่สามารถปล่อยเว้นว่างไว้ได้'; + @override + String get invalid => 'ชื่อไฟล์ประกอบไปด้วยอักขระที่ไม่รองรับ'; +} + +// Path: tray +class _Translations$tray$th extends Translations$tray$en { + _Translations$tray$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'ออกจากแอป LocalSend'; + @override + String get closeWindows => 'ออก'; +} + +// Path: web +class _Translations$web$th extends Translations$web$en { + _Translations$web$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'กรอกรหัส PIN'; + @override + String get invalidPin => 'รหัส PIN ไม่ถูกต้อง'; + @override + String get tooManyAttempts => 'ป้อนรหัสผิดหลายครั้ง'; + @override + String get rejected => 'ถูกปฏิเสธ'; + @override + String get files => 'ไฟล์'; + @override + String get fileName => 'ชื่อไฟล์'; + @override + String get size => 'ขนาด'; +} + +// Path: assetPicker +class _Translations$assetPicker$th extends Translations$assetPicker$en { + _Translations$assetPicker$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'ยืนยัน'; + @override + String get cancel => 'ยกเลิก'; + @override + String get edit => 'แก้ไข'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'โหลดล้มเหลว'; + @override + String get original => 'ต้นฉบับ'; + @override + String get preview => 'ตัวอย่าง'; + @override + String get select => 'เลือก'; + @override + String get emptyList => 'รายการว่างเปล่า'; + @override + String get unSupportedAssetType => 'ประเภทไฟล์ที่ไม่รองรับ'; + @override + String get unableToAccessAll => 'ไม่สามารถเข้าถึงไฟล์ทั้งหมดบนอุปกรณ์ได้'; + @override + String get viewingLimitedAssetsTip => 'เลือกดูเฉพาะไฟล์และอัลบั้มที่แอปสามารถเข้าถึงได้'; + @override + String get changeAccessibleLimitedAssets => 'คลิกเพื่ออัปเดตไฟล์ที่แอปจะเข้าถึงได้'; + @override + String get accessAllTip => + 'แอปสามารถเข้าถึงไฟล์ที่อยู่ในอุปกรณ์ของคุณได้เพียงบางไฟล์เท่านั้น คุณต้องไปที่การตั้งค่าระบบและอนุญาตให้แอปสามารถเข้าถึงสื่อมีเดียทั้งหมดที่อยู่ในอุปกรณ์ก่อน'; + @override + String get goToSystemSettings => 'ไปที่การตั้งค่าระบบ'; + @override + String get accessLimitedAssets => 'ดำเนินการต่อด้วยการเข้าถึงแบบจำกัด'; + @override + String get accessiblePathName => 'ไฟล์ที่เข้าถึงได้'; + @override + String get sTypeAudioLabel => 'เสียง'; + @override + String get sTypeImageLabel => 'รูปภาพ'; + @override + String get sTypeVideoLabel => 'วิดีโอ'; + @override + String get sTypeOtherLabel => 'สื่ออื่นๆ'; + @override + String get sActionPlayHint => 'เล่น'; + @override + String get sActionPreviewHint => 'ดูตัวอย่าง'; + @override + String get sActionSelectHint => 'เลือก'; + @override + String get sActionSwitchPathLabel => 'เปลี่ยนที่เก็บไฟล์'; + @override + String get sActionUseCameraHint => 'ใช้กล้อง'; + @override + String get sNameDurationLabel => 'ความยาว'; + @override + String get sUnitAssetCountLabel => 'จำนวน'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$th extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'อินเทอร์เฟซเครือข่าย'; + @override + String get info => + 'ตามค่าเริ่มต้น LocalSend จะใช้อินเทอร์เฟซเครือข่ายที่มีอยู่ทั้งหมด คุณสามารถยกเว้นเครือข่ายที่ไม่ต้องการได้ที่นี่ คุณต้องรีสตาร์ทเซิร์ฟเวอร์เพื่อใช้การเปลี่ยนแปลง'; + @override + String get whitelist => 'ไวท์ลิสต์'; + @override + String get blacklist => 'บัญชีดำ'; + @override + String get preview => 'ดูตัวอย่าง'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$th extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get ip => 'ไอพี:'; + @override + String get port => 'พอร์ต:'; + @override + String get alias => 'ชื่ออุปกรณ์:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$th extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get favorites => 'รายการโปรด'; + @override + String get off => 'บันทึกอย่างรวดเร็ว'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$th extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'การเลือก'; + @override + String files({required Object files}) => 'ไฟล์: ${files}'; + @override + String size({required Object size}) => 'ขนาด: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$th extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get file => 'ไฟล์'; + @override + String get folder => 'โฟลเดอร์'; + @override + String get media => 'มีเดีย'; + @override + String get text => 'ข้อความ'; + @override + String get app => 'แอป'; + @override + String get clipboard => 'วาง'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$th extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get single => 'ผู้รับคนเดียว'; + @override + String get multiple => 'ผู้รับหลายคน'; + @override + String get link => 'แชร์ผ่านลิงก์'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$th extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ทั่วไป'; + @override + String get brightness => 'ธีม'; + @override + late final _Translations$settingsTab$general$brightnessOptions$th brightnessOptions = _Translations$settingsTab$general$brightnessOptions$th._( + _root, + ); + @override + String get color => 'สี'; + @override + late final _Translations$settingsTab$general$colorOptions$th colorOptions = _Translations$settingsTab$general$colorOptions$th._(_root); + @override + String get language => 'ภาษา'; + @override + late final _Translations$settingsTab$general$languageOptions$th languageOptions = _Translations$settingsTab$general$languageOptions$th._(_root); + @override + String get saveWindowPlacement => 'ออก: บันทึกตำแหน่งหน้าต่างของโปรแกรม'; + @override + String get minimizeToTray => 'ย่อแอปไปยัง System Tray/แถบเมนูเมื่อปิดโปรแกรม'; + @override + String get launchAtStartup => 'เริ่มอัตโนมัติหลังจากเข้าสู่ระบบ'; + @override + String get launchMinimized => 'เริ่มอัตโนมัติ: ซ่อนโปรแกรมหลังจากเริ่ม'; + @override + String get showInContextMenu => 'แสดง LocalSend ในเมนูคลิกขวา'; + @override + String get animations => 'ภาพเคลื่อนไหว'; + @override + String get saveWindowPlacementWindows => 'บันทึกตำแหน่งหน้าต่างหลังจากออก'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$th extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'รับ'; + @override + String get quickSave => _root.general.quickSave; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'ดำเนินการให้เสร็จสิ้นโดยอัตโนมัติ'; + @override + String get destination => 'ปลายทาง'; + @override + String get downloads => '(ดาวน์โหลด)'; + @override + String get saveToGallery => 'บันทึกมีเดียลงในแกลอรี่'; + @override + String get saveToHistory => 'บันทึกลงในประวัติย้อนหลัง'; + @override + String get quickSaveFromFavorites => 'บันทึกอย่างรวดเร็วจากรายการโปรด'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$th extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ส่ง'; + @override + String get shareViaLinkAutoAccept => 'ตอบรับคำขอในการโอนถ่ายข้อมูลจากโหมด "แชร์ผ่านลิงก์" โดยอัตโนมัติ'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$th extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'เครือข่าย'; + @override + String get needRestart => 'เริ่มต้นเซิร์ฟเวอร์ใหม่อีกครั้งเพื่อปรับเปลี่ยนค่าให้เป็นไปตามที่ตั้งไว้ก่อนหน้า!'; + @override + String get server => 'เซิร์ฟเวอร์'; + @override + String get alias => 'ชื่ออุปกรณ์'; + @override + String get deviceType => 'ประเภทอุปกรณ์'; + @override + String get deviceModel => 'รุ่นอุปกรณ์'; + @override + String get port => 'พอร์ต'; + @override + String get discoveryTimeout => 'สิ้นสุดเวลาสำหรับการค้นหาอุปกรณ์ในเครือข่าย'; + @override + String portWarning({required Object defaultPort}) => + 'อุปกรณ์เครื่องอื่นอาจจะไม่สามารถค้นหาอุปกรณ์เครื่องนี้เจอในเครื่อข่ายได้เนื่องจากคุณแก้ไขพอร์ตเป็นหมายเลขอื่น (default: ${defaultPort})'; + @override + String get encryption => 'การเข้ารหัส'; + @override + String get multicastGroup => 'มัลติคาสต์'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'อุปกรณ์เครื่องอื่นอาจจะไม่สามารถค้นหาอุปกรณ์เครื่องนี้เจอในเครื่อข่ายได้เนื่องจากคุณกำหนดที่อยู่มัลติคาสต์ใหม่ด้วยตนเอง (default: ${defaultMulticast})'; + @override + String get network => 'เครือข่าย'; + @override + late final _Translations$settingsTab$network$networkOptions$th networkOptions = _Translations$settingsTab$network$networkOptions$th._(_root); + @override + String get useSystemName => 'ใช้ชื่อในระบบ'; + @override + String get generateRandomAlias => 'สุ่มนามแฝง'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$th extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'อื่นๆ'; + @override + String get support => 'สนับสนุน LocalSend'; + @override + String get donate => 'บริจาค'; + @override + String get privacyPolicy => 'นโยบายความเป็นส่วนตัว'; + @override + String get termsOfUse => 'ข้อกำหนดการใช้งาน'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$th extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'แอปนี้สามารถส่งไฟล์ข้อมูลไปยังอุปกรณ์อื่นได้ แต่อุปกรณ์อื่นไม่สามารถส่งไฟล์ข้อมูลมายังอุปกรณ์นี้ได้'; + @override + String solution({required Object port}) => + 'ปัญหานี้อาจมีสาเหตุมาจากการตั้งค่าไฟร์วอลล์ คุณสามารถแก้ไขปัญหานี้ได้ด้วยการอนุญาตการเชื่อมต่อขาเข้า (UDP และ TCP) ผ่านพอร์ตหมายเลข ${port}'; + @override + String get openFirewall => 'เปิดไฟร์วอลล์'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$th extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'อุปกรณ์นี้ไม่สามารถค้นหาอุปกรณ์อื่นได้'; + @override + String get solution => + 'โปรดตรวจสอบให้แน่ใจว่าอุปกรณ์ทั้งหมดเชื่อมต่อกับเครือข่าย Wi-Fi เดียวกันและมีการตั้งค่าที่เหมือนกัน (พอร์ต, ที่อยู่ไอพีของมัลติแคสต์, การเข้ารหัส) คุณสามารถลองป้อนที่อยู่ IP ในอุปกรณ์ของคุณด้วยตนเองได้ หากได้ผล สามารถเพิ่มอุปกรณ์ดังกล่าวไปยังรายการโปรดเพื่อให้สามารถค้นพบได้โดยอัตโนมัติในครั้งถัดไป'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$th extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'อุปกรณ์สำหรับรับ-ส่งข้อมูลค้นหากันไม่เจอและไม่สามารถแชร์ไฟล์ได้'; + @override + String get solution => + 'ปัญหานี้เกิดกับอุปกรณ์ที่จะรับและส่งข้อมูลใช่หรือไม่ ถ้าใช่ คุณจำเป็นต้องตรวจสอบให้แน่ใจว่าอุปกรณ์ทั้งสองได้เชื่อมต่อบนเครือข่ายเดียวกันและได้มีการตั้งค่าการเชื่อมต่อภายในแอปที่เหมือนกัน (ใช้หมายเลขพอร์ต, ที่อยู่มัลติคาสต์, วิธีการเข้ารหัสเดียวกัน) ทั้งนี้เครือข่ายที่คุณเชื่อมต่ออยู่อาจมีการตั้งค่าเพื่อป้องกันไม่ให้อุปกรณ์ภายในเครือข่ายสื่อสารกันได้ หากเป็นเช่นนั้น คุณจำเป็นต้องปรับการตั้งค่าของเราเตอร์ก่อนเป็นอันดับแรกเพื่อให้อุปกรณ์ในเครือข่ายสามารถสื่อสารเพื่อส่งข้อมูลได้'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$th extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get open => 'เปิดไฟล์'; + @override + String get showInFolder => 'แสดงในโฟลเดอร์'; + @override + String get info => 'ข้อมูล'; + @override + String get deleteFromHistory => 'ลบออกจากประวัติ'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$th extends Translations$progressPage$total$en { + _Translations$progressPage$total$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$th title = _Translations$progressPage$total$title$th._(_root); + @override + String count({required Object curr, required Object n}) => 'ไฟล์: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'ขนาด: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'ความเร็ว: ${speed}/วิ'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$th extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'เพิ่มไปยังส่วนที่เลือกไว้'; + @override + String get content => 'คุณต้องการจะเพิ่มไฟล์ใด?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$th extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'กรอกที่อยู่'; + @override + String get hashtag => 'แฮชแท็ก'; + @override + String get ip => 'ที่อยู่ไอพี'; + @override + String get recentlyUsed => 'ใช้งานล่าสุดเมื่อ: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$th extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ยกเลิกการโอนไฟล์'; + @override + String get content => 'คุณต้องการยกเลิกการโอนไฟล์หรือไม่?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$th extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ไม่สามารถเปิดไฟล์ได้'; + @override + String content({required Object file}) => 'ไม่สามารถเปิดไฟล์ "${file}" ได้ โปรดตรวจสอบว่าไฟล์นี้ได้ถูกย้าย เปลี่ยนชื่อ หรือถูกลบไปแล้วหรือไม่'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$th extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ปิดใช้งานการเข้ารหัสอยู่'; + @override + String get content => + 'การส่งข้อมูลที่เกิดขึ้นต่อจากนี้จะเป็นการส่งข้อมูลผ่านโปรโตคอล HTTP ที่ไม่ได้รับการเข้ารหัส หากต้องการส่งข้อมูลผ่านโปรโตคอล HTTPS คุณจำเป็นต้องเปิดใช้งานการเข้ารหัสอีกครั้ง'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$th extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$th extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'รายการโปรด'; + @override + String get noFavorites => 'ยังไม่มีอุปกรณ์ในรายการโปรด'; + @override + String get addFavorite => 'เพิ่มอุปกรณ์'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$th extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ลบจากรายการโปรด'; + @override + String content({required Object name}) => 'คุณต้องการลบอุปกรณ์ "${name}" ออกจากรายการโปรดหรือไม่?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$th extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'เพิ่มในรายการโปรด'; + @override + String get titleEdit => 'ปรับแต่ง'; + @override + String get name => 'ชื่ออุปกรณ์'; + @override + String get auto => '(ตั้งให้อัตโนมัติ)'; + @override + String get ip => 'ที่อยู่ IP'; + @override + String get port => 'พอร์ต'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$th extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ข้อมูลไฟล์'; + @override + String get fileName => 'ชื่อไฟล์:'; + @override + String get path => 'ที่อยู่ไฟล์บนเครื่อง:'; + @override + String get size => 'ขนาด:'; + @override + String get sender => 'ผู้ส่ง:'; + @override + String get time => 'เวลา:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$th extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'กรอกชื่อไฟล์'; + @override + String original({required Object original}) => 'ชื่อไฟล์เดิม: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$th extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ล้างประวัติ'; + @override + String get content => 'คุณต้องการลบประวัติทั้งหมดหรือไม่?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$th extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend ไม่สามารถค้นหาอุปกรณ์อื่นได้หากคุณไม่ให้สิทธิ์การสแกนเครือข่ายที่อุปกรณ์นี้กำลังเชื่อมต่ออยู่ โปรดอนุญาตให้สิทธิ์ในการสแกนนี้ในหน้าการตั้งค่า'; + @override + String get gotoSettings => 'การตั้งค่า'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$th extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'พิมพ์ข้อความ'; + @override + String get multiline => 'หลายบรรทัด'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$th extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ไม่ได้เลือกไฟล์'; + @override + String get content => 'กรุณาเลือกไฟล์อย่างน้อยหนึ่งไฟล์'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$th extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ไม่มีสิทธิ์'; + @override + String get content => 'คุณยังไม่ได้ให้สิทธิ์ที่จำเป็น โปรดให้สิทธิ์เหล่านั้นในการตั้งค่า'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$th extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'ไม่พร้อมใช้งาน'; + @override + String get content => 'ฟีเจอร์นี้ใช้งานได้เฉพาะบน:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$th extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'คิวอาร์โค้ด'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$th extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'การดำเนินการอย่างรวดเร็ว'; + @override + String get counter => 'ตัวนับ'; + @override + String get prefix => 'คำนำหน้า'; + @override + String get padZero => 'เติมศูนย์ด้านหน้า'; + @override + String get sortBeforeCount => 'เรียงตามตัวอักษรไว้ก่อนหน้า'; + @override + String get random => 'สุ่ม'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$th extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'การตอบรับคำขอรับไฟล์จากอุปกรณ์อื่นจะเป็นไปโดยอัตโนมัติ โปรดทราบว่าทุกคนในเครือข่ายที่อุปกรณ์นี้เชื่อมต่ออยู่จะสามารถส่งไฟล์ถึงคุณได้'; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$th extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'กรอกรหัส PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$th extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'โหมดส่งไฟล์'; + @override + String get single => 'ส่งไฟล์ไปยังผู้รับเพียงอุปกรณ์เดียว ไฟล์ที่เลือกไว้จะถูกล้างออกจากรายการทันทีที่โอนไฟล์สำเร็จ'; + @override + String get multiple => 'ส่งไฟล์ไปยังผู้รับหลายอุปกรณ์ ไฟล์ที่เลือกไว้จะไม่ถูกล้างออกจากรายการ'; + @override + String get link => 'ผู้รับที่ไม่ได้ติดตั้งแอป LocalSend สามารถดาวน์โหลดไฟล์ที่เลือกไว้ในรายการได้โดยการเปิดลิงก์ในเบราว์เซอร์'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$th extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$th extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + List get content => [ + 'คำขอไฟล์ได้รับการยอมรับโดยอัตโนมัติจากอุปกรณ์ในรายการโปรดของคุณแล้ว', + 'คำเตือน! ในขณะนี้ระบบยังไม่ปลอดภัยอย่างสมบูรณ์ เนื่องจากแฮกเกอร์ที่มีลายนิ้วมือดิจิทัลของอุปกรณ์ใดๆ จากรายการโปรดของคุณสามารถส่งไฟล์ถึงคุณได้โดยไม่มีข้อจำกัด', + 'อย่างไรก็ตาม ตัวเลือกนี้ยังปลอดภัยกว่าการอนุญาตให้ผู้ใช้ทั้งหมดบนเครือข่ายท้องถิ่นส่งไฟล์ถึงคุณโดยไม่มีข้อจำกัด', + ]; + @override + String get title => 'บันทึกอย่างรวดเร็วจากรายการโปรด'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$th extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get title => 'เปิดไฟล์'; + @override + String get content => 'ต้องการเปิดไฟล์ที่ได้รับหรือไม่?'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$th extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get system => 'ตามระบบ'; + @override + String get dark => 'มืด'; + @override + String get light => 'สว่าง'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$th extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get system => 'ตามระบบ'; + @override + String get oled => 'โอเล็ด'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$th extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get system => 'ตามระบบ'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$th extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String get all => 'ทั้งหมด'; + @override + String get filtered => 'ตัวกรอง'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$th extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$th._(TranslationsTh root) : this._root = root, super.internal(root); + + final TranslationsTh _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'ความคืบหน้าทั้งหมด (${time})'; + @override + String get finishedError => 'ดำเนินการเสร็จสิ้นโดยมีข้อผิดพลาดเกิดขึ้น'; + @override + String get canceledSender => 'ถูกยกเลิกโดยผู้ส่ง'; + @override + String get canceledReceiver => 'ถูกยกเลิกโดยผู้รับ'; +} diff --git a/app/lib/gen/strings_tr.g.dart b/app/lib/gen/strings_tr.g.dart new file mode 100644 index 0000000..3b7d392 --- /dev/null +++ b/app/lib/gen/strings_tr.g.dart @@ -0,0 +1,1436 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsTr extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsTr({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.tr, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsTr _root = this; // ignore: unused_field + + @override + TranslationsTr $copyWith({TranslationMetadata? meta}) => TranslationsTr(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Türkçe'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$tr general = _Translations$general$tr._(_root); + @override + late final _Translations$receiveTab$tr receiveTab = _Translations$receiveTab$tr._(_root); + @override + late final _Translations$sendTab$tr sendTab = _Translations$sendTab$tr._(_root); + @override + late final _Translations$settingsTab$tr settingsTab = _Translations$settingsTab$tr._(_root); + @override + late final _Translations$troubleshootPage$tr troubleshootPage = _Translations$troubleshootPage$tr._(_root); + @override + late final _Translations$receiveHistoryPage$tr receiveHistoryPage = _Translations$receiveHistoryPage$tr._(_root); + @override + late final _Translations$apkPickerPage$tr apkPickerPage = _Translations$apkPickerPage$tr._(_root); + @override + late final _Translations$selectedFilesPage$tr selectedFilesPage = _Translations$selectedFilesPage$tr._(_root); + @override + late final _Translations$receivePage$tr receivePage = _Translations$receivePage$tr._(_root); + @override + late final _Translations$receiveOptionsPage$tr receiveOptionsPage = _Translations$receiveOptionsPage$tr._(_root); + @override + late final _Translations$sendPage$tr sendPage = _Translations$sendPage$tr._(_root); + @override + late final _Translations$progressPage$tr progressPage = _Translations$progressPage$tr._(_root); + @override + late final _Translations$webSharePage$tr webSharePage = _Translations$webSharePage$tr._(_root); + @override + late final _Translations$aboutPage$tr aboutPage = _Translations$aboutPage$tr._(_root); + @override + late final _Translations$donationPage$tr donationPage = _Translations$donationPage$tr._(_root); + @override + late final _Translations$changelogPage$tr changelogPage = _Translations$changelogPage$tr._(_root); + @override + late final _Translations$dialogs$tr dialogs = _Translations$dialogs$tr._(_root); + @override + late final _Translations$sanitization$tr sanitization = _Translations$sanitization$tr._(_root); + @override + late final _Translations$tray$tr tray = _Translations$tray$tr._(_root); + @override + late final _Translations$web$tr web = _Translations$web$tr._(_root); + @override + late final _Translations$assetPicker$tr assetPicker = _Translations$assetPicker$tr._(_root); + @override + late final _Translations$networkInterfacesPage$tr networkInterfacesPage = _Translations$networkInterfacesPage$tr._(_root); +} + +// Path: general +class _Translations$general$tr extends Translations$general$en { + _Translations$general$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Kabul et'; + @override + String get accepted => 'Kabul edildi'; + @override + String get add => 'Ekle'; + @override + String get advanced => 'Gelişmiş'; + @override + String get cancel => 'İptal et'; + @override + String get close => 'Kapat'; + @override + String get confirm => 'Onayla'; + @override + String get continueStr => 'Devam et'; + @override + String get copy => 'Kopyala'; + @override + String get copiedToClipboard => 'Panoya kopyalandı'; + @override + String get decline => 'Reddet'; + @override + String get done => 'Bitir'; + @override + String get delete => 'Sil'; + @override + String get edit => 'Düzenle'; + @override + String get error => 'Hata'; + @override + String get example => 'Örnek'; + @override + String get files => 'Dosyalar'; + @override + String get finished => 'Sonlandırıldı'; + @override + String get hide => 'Gizle'; + @override + String get off => 'Kapalı'; + @override + String get offline => 'Çevrim dışı'; + @override + String get on => 'Açık'; + @override + String get online => 'Çevrim içi'; + @override + String get open => 'Aç'; + @override + String get queue => 'Sıra'; + @override + String get quickSave => 'Hızlı kaydetme'; + @override + String get quickSaveFromFavorites => 'Favoriler'; + @override + String get renamed => 'Yeniden adlandırıldı'; + @override + String get reset => 'Sıfırla'; + @override + String get restart => 'Yeniden başlat'; + @override + String get settings => 'Ayarlar'; + @override + String get skipped => 'Geçildi'; + @override + String get start => 'Başlat'; + @override + String get stop => 'Durdur'; + @override + String get save => 'Kaydet'; + @override + String get unchanged => 'Değiştirilmemiş'; + @override + String get unknown => 'Bilinmiyor'; + @override + String get noItemInClipboard => 'Panoda öğe yok.'; +} + +// Path: receiveTab +class _Translations$receiveTab$tr extends Translations$receiveTab$en { + _Translations$receiveTab$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Alım'; + @override + late final _Translations$receiveTab$infoBox$tr infoBox = _Translations$receiveTab$infoBox$tr._(_root); + @override + late final _Translations$receiveTab$quickSave$tr quickSave = _Translations$receiveTab$quickSave$tr._(_root); +} + +// Path: sendTab +class _Translations$sendTab$tr extends Translations$sendTab$en { + _Translations$sendTab$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Gönder'; + @override + late final _Translations$sendTab$selection$tr selection = _Translations$sendTab$selection$tr._(_root); + @override + late final _Translations$sendTab$picker$tr picker = _Translations$sendTab$picker$tr._(_root); + @override + String get shareIntentInfo => 'Dosyalarınızı daha kolay seçmek için cihazınızın "Paylaş" özelliğini kullanabilirsiniz.'; + @override + String get nearbyDevices => 'Yakınınızdaki cihazlar'; + @override + String get thisDevice => 'Cihazınız'; + @override + String get scan => 'Cihazları tara'; + @override + String get manualSending => 'Manuel Gönderme'; + @override + String get sendMode => 'Gönderme Modu'; + @override + late final _Translations$sendTab$sendModes$tr sendModes = _Translations$sendTab$sendModes$tr._(_root); + @override + String get sendModeHelp => 'Açıklama'; + @override + String get help => 'Lütfen hedef cihaz ile aynı wifi ağında olduğunuzdan emin olun.'; + @override + String get placeItems => 'Paylaşmak istediğiniz dosyayı yerleştiriniz.'; +} + +// Path: settingsTab +class _Translations$settingsTab$tr extends Translations$settingsTab$en { + _Translations$settingsTab$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ayarlar'; + @override + late final _Translations$settingsTab$general$tr general = _Translations$settingsTab$general$tr._(_root); + @override + late final _Translations$settingsTab$receive$tr receive = _Translations$settingsTab$receive$tr._(_root); + @override + late final _Translations$settingsTab$send$tr send = _Translations$settingsTab$send$tr._(_root); + @override + late final _Translations$settingsTab$network$tr network = _Translations$settingsTab$network$tr._(_root); + @override + late final _Translations$settingsTab$other$tr other = _Translations$settingsTab$other$tr._(_root); + @override + String get advancedSettings => 'Gelişmiş ayarlar'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$tr extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Sorun Giderme'; + @override + String get subTitle => 'Bu uygulama beklendiği gibi çalışmıyor mu? Burada ortak çözümler bulabilirsiniz.'; + @override + String get solution => 'Çözüm:'; + @override + String get fixButton => 'Otomatik olarak düzelt'; + @override + late final _Translations$troubleshootPage$firewall$tr firewall = _Translations$troubleshootPage$firewall$tr._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$tr noDiscovery = _Translations$troubleshootPage$noDiscovery$tr._(_root); + @override + late final _Translations$troubleshootPage$noConnection$tr noConnection = _Translations$troubleshootPage$noConnection$tr._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$tr extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Geçmiş'; + @override + String get openFolder => 'Dosyayı aç'; + @override + String get deleteHistory => 'Geçmişi sil'; + @override + String get empty => 'Geçmiş yok.'; + @override + late final _Translations$receiveHistoryPage$entryActions$tr entryActions = _Translations$receiveHistoryPage$entryActions$tr._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$tr extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Uygulamalar (APK)'; + @override + String get excludeSystemApps => 'Sistem uygulamalarını hariç tut'; + @override + String get excludeAppsWithoutLaunchIntent => 'Başlatılamayan uygulamaları hariç tut'; + @override + String apps({required Object n}) => '${n} Uygulamalar'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$tr extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Hepsini sil'; +} + +// Path: receivePage +class _Translations$receivePage$tr extends Translations$receivePage$en { + _Translations$receivePage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('tr'))( + n, + one: 'sana bir dosya göndermek istiyor', + other: 'sana ${n} tane dosya göndermek istiyor', + ); + @override + String get subTitleMessage => 'bir mesaj gönderdi:'; + @override + String get subTitleLink => 'bir bağlantı gönderdi:'; + @override + String get canceled => 'Gönderici isteği iptal etti.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$tr extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Seçenekler'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend klasörü)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Otomatik olarak kapanır çünkü bunlar klasör.'; +} + +// Path: sendPage +class _Translations$sendPage$tr extends Translations$sendPage$en { + _Translations$sendPage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Alıcıdan cevap bekleniyor…'; + @override + String get rejected => 'Alıcı isteği reddetti.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Alıcı başka bir istekle meşgul.'; +} + +// Path: progressPage +class _Translations$progressPage$tr extends Translations$progressPage$en { + _Translations$progressPage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Dosyalar gönderiliyor'; + @override + String get titleReceiving => 'Dosyalar alınıyor'; + @override + String get savedToGallery => 'Galeriye kaydedildi'; + @override + late final _Translations$progressPage$total$tr total = _Translations$progressPage$total$tr._(_root); + @override + late final _Translations$progressPage$remainingTime$tr remainingTime = _Translations$progressPage$remainingTime$tr._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$tr extends Translations$webSharePage$en { + _Translations$webSharePage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Link üzerinden paylaşın'; + @override + String get loading => 'Sunucu başlıyor…'; + @override + String get stopping => 'Sunucu durduruluyor…'; + @override + String get error => 'Sunucuyu başlatırken bir hata oluştu.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('tr'))( + n, + one: 'Bu bağlantıyı tarayıcıda açın:', + other: 'Bu bağlantılardan birini tarayıcıda açın:', + ); + @override + String get requests => 'İstekler'; + @override + String get noRequests => 'Henüz istek yok.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'İstekleri otomatik olarak kabul et'; + @override + String get requirePin => 'PIN gerektir'; + @override + String pinHint({required Object pin}) => 'PIN "${pin}"'; + @override + String get encryptionHint => 'LocalSend, tarayıcıda kabul etmeniz gereken kendi-üretimli bir sertifika kullanır.'; + @override + String pendingRequests({required Object n}) => 'Bekleyen istekler: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$tr extends Translations$aboutPage$en { + _Translations$aboutPage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'LocalSend hakkında'; + @override + List get description => [ + 'LocalSend, internet bağlantısına ihtiyaç duymadan yerel ağınız üzerinden yakınınızdaki cihazlarla dosya ve mesajlarınızı güvenli bir şekilde paylaşmanıza olanak tanıyan özgür ve açık kaynaklı bir uygulamadır.', + 'Bu uygulama Android, iOS, macOS, Windows ve Linux\'ta mevcuttur. Tüm indirme seçeneklerini resmi ana sayfada bulabilirsiniz.', + ]; + @override + String get author => 'Yazar'; + @override + String get contributors => 'Katkıda bulunanlar'; + @override + String get packagers => 'Paketleyiciler'; + @override + String get translators => 'Çevirmenler'; +} + +// Path: donationPage +class _Translations$donationPage$tr extends Translations$donationPage$en { + _Translations$donationPage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Bağış yap'; + @override + String get info => + 'LocalSend ücretsiz, açık kaynaklı ve reklamsız bir uygulamadır. Eğer uygulamayı beğendiyseniz, bağış yaparak uygulamanın gelişimine katkıda bulunabilirsiniz.'; + @override + String donate({required Object amount}) => 'Bağışta bulun ${amount}'; + @override + String get thanks => 'Çok teşekkür ederim!'; + @override + String get restore => 'Satın alınanları geri yükle'; +} + +// Path: changelogPage +class _Translations$changelogPage$tr extends Translations$changelogPage$en { + _Translations$changelogPage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Değişiklik günlüğü'; +} + +// Path: dialogs +class _Translations$dialogs$tr extends Translations$dialogs$en { + _Translations$dialogs$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$tr addFile = _Translations$dialogs$addFile$tr._(_root); + @override + late final _Translations$dialogs$addressInput$tr addressInput = _Translations$dialogs$addressInput$tr._(_root); + @override + late final _Translations$dialogs$cancelSession$tr cancelSession = _Translations$dialogs$cancelSession$tr._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$tr cannotOpenFile = _Translations$dialogs$cannotOpenFile$tr._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$tr encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$tr._(_root); + @override + late final _Translations$dialogs$errorDialog$tr errorDialog = _Translations$dialogs$errorDialog$tr._(_root); + @override + late final _Translations$dialogs$favoriteDialog$tr favoriteDialog = _Translations$dialogs$favoriteDialog$tr._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$tr favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$tr._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$tr favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$tr._(_root); + @override + late final _Translations$dialogs$fileInfo$tr fileInfo = _Translations$dialogs$fileInfo$tr._(_root); + @override + late final _Translations$dialogs$fileNameInput$tr fileNameInput = _Translations$dialogs$fileNameInput$tr._(_root); + @override + late final _Translations$dialogs$historyClearDialog$tr historyClearDialog = _Translations$dialogs$historyClearDialog$tr._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$tr localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$tr._(_root); + @override + late final _Translations$dialogs$messageInput$tr messageInput = _Translations$dialogs$messageInput$tr._(_root); + @override + late final _Translations$dialogs$noFiles$tr noFiles = _Translations$dialogs$noFiles$tr._(_root); + @override + late final _Translations$dialogs$noPermission$tr noPermission = _Translations$dialogs$noPermission$tr._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$tr notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$tr._(_root); + @override + late final _Translations$dialogs$qr$tr qr = _Translations$dialogs$qr$tr._(_root); + @override + late final _Translations$dialogs$quickActions$tr quickActions = _Translations$dialogs$quickActions$tr._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$tr quickSaveNotice = _Translations$dialogs$quickSaveNotice$tr._(_root); + @override + late final _Translations$dialogs$pin$tr pin = _Translations$dialogs$pin$tr._(_root); + @override + late final _Translations$dialogs$sendModeHelp$tr sendModeHelp = _Translations$dialogs$sendModeHelp$tr._(_root); + @override + late final _Translations$dialogs$zoom$tr zoom = _Translations$dialogs$zoom$tr._(_root); + @override + late final _Translations$dialogs$openFile$tr openFile = _Translations$dialogs$openFile$tr._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$tr quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$tr._(_root); +} + +// Path: sanitization +class _Translations$sanitization$tr extends Translations$sanitization$en { + _Translations$sanitization$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Dosya ismi boş olamaz'; + @override + String get invalid => 'Dosya ismi geçersiz karakter bulunduruyor'; +} + +// Path: tray +class _Translations$tray$tr extends Translations$tray$en { + _Translations$tray$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'LocalSend\'den çık'; + @override + String get closeWindows => 'Çıkış'; +} + +// Path: web +class _Translations$web$tr extends Translations$web$en { + _Translations$web$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'PIN girin'; + @override + String get invalidPin => 'Geçersiz PIN'; + @override + String get tooManyAttempts => 'Çok fazla deneme'; + @override + String get rejected => 'Reddedildi'; + @override + String get files => 'Dosyalar'; + @override + String get fileName => 'Dosya adı'; + @override + String get size => 'Boyut'; +} + +// Path: assetPicker +class _Translations$assetPicker$tr extends Translations$assetPicker$en { + _Translations$assetPicker$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Onay'; + @override + String get cancel => 'İptal'; + @override + String get edit => 'Düzenle'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Yükleme başarısız'; + @override + String get original => 'Orijinal'; + @override + String get preview => 'Ön izleme'; + @override + String get select => 'Seç'; + @override + String get emptyList => 'Boş liste'; + @override + String get unSupportedAssetType => 'Desteklenmeyen dosya türü.'; + @override + String get unableToAccessAll => 'Cihazdaki tüm dosyalara erişilemiyor'; + @override + String get viewingLimitedAssetsTip => 'Yalnızca uygulamanın erişilebilir dosyalarını ve albümlerini görüntüleyin.'; + @override + String get changeAccessibleLimitedAssets => 'Erişilebilir dosyaları güncellemek için tıklayın'; + @override + String get accessAllTip => + 'Uygulama yalnızca cihazdaki bazı dosyalara erişebilir. Sistem ayarlarına gidin ve uygulamanın cihazdaki tüm medyalara erişmesine izin verin.'; + @override + String get goToSystemSettings => 'Sistem ayarlarına gidin'; + @override + String get accessLimitedAssets => 'Sınırlı Erişimle Devam Et'; + @override + String get accessiblePathName => 'Erişilebilir dosyalar'; + @override + String get sTypeAudioLabel => 'Ses'; + @override + String get sTypeImageLabel => 'Görüntü'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Diğer medya'; + @override + String get sActionPlayHint => 'oynat'; + @override + String get sActionPreviewHint => 'Ön izleme'; + @override + String get sActionSelectHint => 'seç'; + @override + String get sActionSwitchPathLabel => 'dosya uzantısını değiştir'; + @override + String get sActionUseCameraHint => 'Kamera kullan'; + @override + String get sNameDurationLabel => 'süre'; + @override + String get sUnitAssetCountLabel => 'sayım'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$tr extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ağ Arayüzleri'; + @override + String get preview => 'Önizle'; + @override + String get whitelist => 'Beyaz liste'; + @override + String get blacklist => 'Kara liste'; + @override + String get info => + 'Varsayılan olarak, LocalSend mevcut olan tüm ağları kullanır. Burada istenmeyen ağları engelleyebilirsiniz. Değişikliklerin uygulanması için sunucuyu yeniden başlatmanız gerekir.'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$tr extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Takma isminiz:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$tr extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Favoriler'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$tr extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Seçiminiz'; + @override + String files({required Object files}) => 'Dosyalar: ${files}'; + @override + String size({required Object size}) => 'Boyut: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$tr extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get file => 'Dosya'; + @override + String get folder => 'Klasör'; + @override + String get media => 'Medya'; + @override + String get text => 'Metin'; + @override + String get app => 'Uygulama'; + @override + String get clipboard => 'Yapıştır'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$tr extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get single => 'Tek alıcı'; + @override + String get multiple => 'Birden fazla alıcı'; + @override + String get link => 'Link üzerinden paylaşın'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$tr extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Genel'; + @override + String get brightness => 'Tema'; + @override + late final _Translations$settingsTab$general$brightnessOptions$tr brightnessOptions = _Translations$settingsTab$general$brightnessOptions$tr._( + _root, + ); + @override + String get color => 'Renk'; + @override + late final _Translations$settingsTab$general$colorOptions$tr colorOptions = _Translations$settingsTab$general$colorOptions$tr._(_root); + @override + String get language => 'Dil'; + @override + late final _Translations$settingsTab$general$languageOptions$tr languageOptions = _Translations$settingsTab$general$languageOptions$tr._(_root); + @override + String get saveWindowPlacement => 'Çıkış: Burayı Kaydet'; + @override + String get saveWindowPlacementWindows => 'Çıkıştan sonra pencere konumunu kaydet'; + @override + String get minimizeToTray => 'Çıkış: Simge durumuna küçült'; + @override + String get launchAtStartup => 'Giriş yapıldıktan sonra otomatik başlat'; + @override + String get launchMinimized => 'Otomatik başlatma: Gizli Başlatma'; + @override + String get showInContextMenu => 'LocalSend\'i bağlam menüsünde göster'; + @override + String get animations => 'Animasyonlar'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$tr extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Alım'; + @override + String get quickSave => _root.general.quickSave; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Otomatik bitir'; + @override + String get destination => 'Hedef klasör'; + @override + String get downloads => '(İndirilenler)'; + @override + String get saveToGallery => 'Medyayı galeriye kaydet'; + @override + String get saveToHistory => 'Geçmişe kaydet'; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$tr extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Gönder'; + @override + String get shareViaLinkAutoAccept => 'Link aracılığıyla paylaş: Otomatik olarak kabul et'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$tr extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ağ'; + @override + String get needRestart => 'Ayarları uygulamak için sunucuyu yeniden başlatınız!'; + @override + String get server => 'Sunucu'; + @override + String get alias => 'Takma isminiz'; + @override + String get deviceType => 'Cihaz tipi'; + @override + String get deviceModel => 'Cihaz modeli'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Arama zaman aşımına uğradı'; + @override + String portWarning({required Object defaultPort}) => + 'Kişiselleştirilmiş bir port kullanıyorsanız ağınızdaki diğer cihazlar tarafından bulunamayabilirsiniz. (varsayılan: ${defaultPort})'; + @override + String get encryption => 'Şifreleme'; + @override + String get multicastGroup => 'Çoklu yayın'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Özel çoklu yayın adresini kullandığınız için diğer cihazlar tarafından algılanamayabilirsiniz.(varsayılan: ${defaultMulticast})'; + @override + String get network => 'Ağ'; + @override + late final _Translations$settingsTab$network$networkOptions$tr networkOptions = _Translations$settingsTab$network$networkOptions$tr._(_root); + @override + String get useSystemName => 'Sistem adını kullan'; + @override + String get generateRandomAlias => 'Rastgele takma ad oluştur'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$tr extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Diğer'; + @override + String get support => 'LocalSend\'i destekle'; + @override + String get donate => 'Bağış yap'; + @override + String get privacyPolicy => 'Gizlilik politikası'; + @override + String get termsOfUse => 'Kullanım koşulları'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$tr extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Bu uygulama diğer cihazlara dosya gönderebilir, ancak diğer cihazlar bu cihaza dosya gönderemez.'; + @override + String solution({required Object port}) => + 'Bu büyük olasılıkla bir güvenlik duvarı sorunudur. Port ${port} \'da gelen bağlantılara (UDP ve TCP) izin vererek bunu çözebilirsiniz.'; + @override + String get openFirewall => 'Güvenlik Duvarını Aç'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$tr extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Bu cihaz diğer cihazları keşfedemez.'; + @override + String get solution => + 'Lütfen tüm cihazların aynı Wi-Fi ağında olduğundan ve aynı yapılandırmayı (bağlantı noktası, çok noktaya yayın adresi, şifreleme) paylaştığından emin olun. Hedef cihazın IP adresini manuel olarak yazmayı deneyebilirsiniz. Bu işe yararsa, gelecekte otomatik olarak keşfedilebilmesi için bu cihazı favorilere eklemeyi düşünün.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$tr extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Her iki cihaz da birbirini keşfedemez ve dosya paylaşamazlar.'; + @override + String get solution => + 'Sorun her iki tarafta da var mı? O zaman her iki cihazın da aynı WiFi ağında olduğundan ve aynı yapılandırmayı (bağlantı noktası, çoklu yayın adresi, şifreleme) paylaştığından emin olmanız gerekir. WiFi, katılımcılar arasında iletişime izin vermeyebilir. Bu durumda, bu seçenek yönlendiricide etkinleştirilmelidir.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$tr extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get open => 'Dosya aç'; + @override + String get showInFolder => 'Klasörde göster'; + @override + String get info => 'Bilgi'; + @override + String get deleteFromHistory => 'Geçmişten sil'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$tr extends Translations$progressPage$total$en { + _Translations$progressPage$total$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$tr title = _Translations$progressPage$total$title$tr._(_root); + @override + String count({required Object curr, required Object n}) => 'Dosyalar: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Boyut: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Hız: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$tr extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Saat kısaltması için 's', dakika kısaltması için 'd' kullanın + @override + String hours({required Object h, required Object m}) => '${h}s ${m}d'; + + /// Günler için 'g', saatler için 's' ve dakikalar için 'd' kullanın + @override + String days({required Object d, required Object h, required Object m}) => '${d}g ${h}s ${m}d'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$tr extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Seçime ekle'; + @override + String get content => 'Ne eklemek istiyorsunuz ?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$tr extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Adresi giriniz'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP adresi'; + @override + String get recentlyUsed => 'Daha önce kullanılmış: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$tr extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dosya transferini iptal et'; + @override + String get content => 'Gerçekten dosya transferini iptal etmek istiyor musunuz?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$tr extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dosya açılamadı'; + @override + String content({required Object file}) => '"${file}" dosyası açılamadı. Dosya taşınmış, silinmiş veya ismi değiştirilmiş olabilir mi?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$tr extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Şifreleme devre dışı bırakıldı'; + @override + String get content => + 'Artık iletişim şifrelenmemiş HTTP protokolü aracılığıyla gerçekleşiyor. HTTPS protokolünü kullanmak için şifrelemeyi yeniden aktif edin.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$tr extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$tr extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favoriler'; + @override + String get noFavorites => 'Henüz favori cihaz yok.'; + @override + String get addFavorite => 'Ekle'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$tr extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Favorilerden sil'; + @override + String content({required Object name}) => 'Favorilerden "${name}" öğesini gerçekten silmek istiyor musunuz?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$tr extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Favorilere ekle'; + @override + String get titleEdit => 'Düzenle'; + @override + String get name => 'Takma ad'; + @override + String get auto => '(otomatik)'; + @override + String get ip => 'IP Adresi'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$tr extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dosya bilgileri'; + @override + String get fileName => 'Dosya adı:'; + @override + String get path => 'Yolu:'; + @override + String get size => 'Boyutu:'; + @override + String get sender => 'Gönderen:'; + @override + String get time => 'Zaman:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$tr extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dosya adını giriniz'; + @override + String original({required Object original}) => 'Orijinal: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$tr extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Geçmişi temizle'; + @override + String get content => 'Gerçekten tüm geçmişi silmek istiyor musunuz?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$tr extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => 'LocalSend, lokal ağı tarama iznine sahip olmadan başka cihazları bulamıyor. Lütfen bu izni ayarlarda verin.'; + @override + String get gotoSettings => 'Ayarlar'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$tr extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mesaj yazınız'; + @override + String get multiline => 'Çok satırlı mesaj'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$tr extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Herhangi bir dosya seçilmedi'; + @override + String get content => 'Lütfen bir dosya seçiniz.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$tr extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'İzin yok'; + @override + String get content => 'Gerekli izinleri vermediniz. Lütfen ayarlardan izinleri verin.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$tr extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Müsait değil'; + @override + String get content => 'Bu özellik yalnızca şurada mevcuttur:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$tr extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR Kod'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$tr extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Hızlı eylemler'; + @override + String get counter => 'Sayaç'; + @override + String get prefix => 'Ön ek'; + @override + String get padZero => 'Sıfırlar ile doldurun'; + @override + String get sortBeforeCount => 'Önceden alfabetik olarak sırala'; + @override + String get random => 'Rastgele'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$tr extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Dosya gönderim istekleri otomatik olarak gerçekleşir. Yerel ağınızdaki herkesin size dosya gönderebileceğinin farkında olunuz.'; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$tr extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'PIN girin'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$tr extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Gönderme Modu'; + @override + String get single => 'Dosyaları bir alıcıya gönderir. Seçim, bitmiş dosya aktarımından sonra temizlenir.'; + @override + String get multiple => 'Dosyaları birden çok alıcıya gönderir. Seçim temizlenmeyecektir.'; + @override + String get link => 'LocalSend yüklü olmayan alıcılar, tarayıcılarındaki bağlantıyı açarak seçilen dosyaları indirebilir.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$tr extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$tr extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dosya Aç'; + @override + String get content => 'Alınan dosyayı açmak istiyor musunuz?'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$tr extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Favoriler listenizdeki cihazların paylaşım istekleri otomatik olarak kabul edilecektir.', + 'Uyarı! Şu an, bu tamamen güvenli değildir çünkü favoriler listenizdeki herhangi bir cihazın parmak izine sahip olan hackerlar sınırlama olmadan size dosyalar gönderebilir.', + 'Ancak, bu seçenek yinede ağdaki tüm kullanıcıların size sınırlandırma olmadan dosya göndermesine izin vermekten daha güvenlidir.', + ]; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$tr extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem teması'; + @override + String get dark => 'Koyu'; + @override + String get light => 'Açık'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$tr extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$tr extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get system => 'Sistem dili'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$tr extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String get all => 'Tümü'; + @override + String get filtered => 'Filtrelenmiş'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$tr extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$tr._(TranslationsTr root) : this._root = root, super.internal(root); + + final TranslationsTr _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Toplam ilerleme (${time})'; + @override + String get finishedError => 'İşlem hatayla sonuçlandı'; + @override + String get canceledSender => 'Gönderici tarafından iptal edildi'; + @override + String get canceledReceiver => 'Alıcı tarafından iptal edildi'; +} diff --git a/app/lib/gen/strings_uk.g.dart b/app/lib/gen/strings_uk.g.dart new file mode 100644 index 0000000..4b7ae64 --- /dev/null +++ b/app/lib/gen/strings_uk.g.dart @@ -0,0 +1,1437 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsUk extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsUk({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.uk, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsUk _root = this; // ignore: unused_field + + @override + TranslationsUk $copyWith({TranslationMetadata? meta}) => TranslationsUk(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Українська'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$uk general = _Translations$general$uk._(_root); + @override + late final _Translations$receiveTab$uk receiveTab = _Translations$receiveTab$uk._(_root); + @override + late final _Translations$sendTab$uk sendTab = _Translations$sendTab$uk._(_root); + @override + late final _Translations$settingsTab$uk settingsTab = _Translations$settingsTab$uk._(_root); + @override + late final _Translations$troubleshootPage$uk troubleshootPage = _Translations$troubleshootPage$uk._(_root); + @override + late final _Translations$receiveHistoryPage$uk receiveHistoryPage = _Translations$receiveHistoryPage$uk._(_root); + @override + late final _Translations$apkPickerPage$uk apkPickerPage = _Translations$apkPickerPage$uk._(_root); + @override + late final _Translations$selectedFilesPage$uk selectedFilesPage = _Translations$selectedFilesPage$uk._(_root); + @override + late final _Translations$receivePage$uk receivePage = _Translations$receivePage$uk._(_root); + @override + late final _Translations$receiveOptionsPage$uk receiveOptionsPage = _Translations$receiveOptionsPage$uk._(_root); + @override + late final _Translations$sendPage$uk sendPage = _Translations$sendPage$uk._(_root); + @override + late final _Translations$progressPage$uk progressPage = _Translations$progressPage$uk._(_root); + @override + late final _Translations$webSharePage$uk webSharePage = _Translations$webSharePage$uk._(_root); + @override + late final _Translations$aboutPage$uk aboutPage = _Translations$aboutPage$uk._(_root); + @override + late final _Translations$donationPage$uk donationPage = _Translations$donationPage$uk._(_root); + @override + late final _Translations$changelogPage$uk changelogPage = _Translations$changelogPage$uk._(_root); + @override + late final _Translations$dialogs$uk dialogs = _Translations$dialogs$uk._(_root); + @override + late final _Translations$sanitization$uk sanitization = _Translations$sanitization$uk._(_root); + @override + late final _Translations$tray$uk tray = _Translations$tray$uk._(_root); + @override + late final _Translations$web$uk web = _Translations$web$uk._(_root); + @override + late final _Translations$assetPicker$uk assetPicker = _Translations$assetPicker$uk._(_root); + @override + late final _Translations$networkInterfacesPage$uk networkInterfacesPage = _Translations$networkInterfacesPage$uk._(_root); +} + +// Path: general +class _Translations$general$uk extends Translations$general$en { + _Translations$general$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Прийняти'; + @override + String get accepted => 'Прийнято'; + @override + String get add => 'Додати'; + @override + String get advanced => 'Детальніше'; + @override + String get cancel => 'Скасувати'; + @override + String get close => 'Закрити'; + @override + String get confirm => 'Підтвердити'; + @override + String get continueStr => 'Продовжити'; + @override + String get copy => 'Копіювати'; + @override + String get copiedToClipboard => 'Скопійовано в буфер обміну'; + @override + String get decline => 'Відхилити'; + @override + String get done => 'Виконано'; + @override + String get delete => 'Видалити'; + @override + String get edit => 'Редагувати'; + @override + String get error => 'Помилка'; + @override + String get example => 'Приклад'; + @override + String get files => 'Файли'; + @override + String get finished => 'Завершено'; + @override + String get hide => 'Приховати'; + @override + String get off => 'Вимкнено'; + @override + String get offline => 'Не в мережі'; + @override + String get on => 'Увімкнено'; + @override + String get online => 'У мережі'; + @override + String get open => 'Відкрити'; + @override + String get queue => 'Черга'; + @override + String get quickSave => 'Швидке збереження'; + @override + String get quickSaveFromFavorites => 'Швидке збереження для «Улюблених»'; + @override + String get renamed => 'Перейменовано'; + @override + String get reset => 'Скасувати зміни'; + @override + String get restart => 'Перезапустити'; + @override + String get settings => 'Налаштування'; + @override + String get skipped => 'Відхилено'; + @override + String get start => 'Запустити'; + @override + String get stop => 'Зупинити'; + @override + String get save => 'Зберегти'; + @override + String get unchanged => 'Без змін'; + @override + String get unknown => 'Невідомо'; + @override + String get noItemInClipboard => 'Буфер обміну порожній.'; +} + +// Path: receiveTab +class _Translations$receiveTab$uk extends Translations$receiveTab$en { + _Translations$receiveTab$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Отримати'; + @override + late final _Translations$receiveTab$infoBox$uk infoBox = _Translations$receiveTab$infoBox$uk._(_root); + @override + late final _Translations$receiveTab$quickSave$uk quickSave = _Translations$receiveTab$quickSave$uk._(_root); +} + +// Path: sendTab +class _Translations$sendTab$uk extends Translations$sendTab$en { + _Translations$sendTab$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Надіслати'; + @override + late final _Translations$sendTab$selection$uk selection = _Translations$sendTab$selection$uk._(_root); + @override + late final _Translations$sendTab$picker$uk picker = _Translations$sendTab$picker$uk._(_root); + @override + String get shareIntentInfo => 'Ви також можете скористатися функцією «Поділитися» на своєму мобільному пристрої, щоб швидше вибирати файли.'; + @override + String get nearbyDevices => 'Пристрої поблизу'; + @override + String get thisDevice => 'Цей пристрій'; + @override + String get scan => 'Пошук пристроїв'; + @override + String get manualSending => 'Ручне надсилання'; + @override + String get sendMode => 'Режим надсилання'; + @override + late final _Translations$sendTab$sendModes$uk sendModes = _Translations$sendTab$sendModes$uk._(_root); + @override + String get sendModeHelp => 'Довідка'; + @override + String get help => 'Будь ласка, переконайтеся, що отримувач перебуває в тій же ж Wi-Fi мережі, що й відправник.'; + @override + String get placeItems => 'Додайте файли, щоб поділитися.'; +} + +// Path: settingsTab +class _Translations$settingsTab$uk extends Translations$settingsTab$en { + _Translations$settingsTab$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Налаштування'; + @override + late final _Translations$settingsTab$general$uk general = _Translations$settingsTab$general$uk._(_root); + @override + late final _Translations$settingsTab$receive$uk receive = _Translations$settingsTab$receive$uk._(_root); + @override + late final _Translations$settingsTab$send$uk send = _Translations$settingsTab$send$uk._(_root); + @override + late final _Translations$settingsTab$network$uk network = _Translations$settingsTab$network$uk._(_root); + @override + late final _Translations$settingsTab$other$uk other = _Translations$settingsTab$other$uk._(_root); + @override + String get advancedSettings => 'Розширені налаштування'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$uk extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Усунення несправностей'; + @override + String get subTitle => 'Програма не працює належним чином? Тут ви можете знайти деякі поширені рішення проблем.'; + @override + String get solution => 'Рішення:'; + @override + String get fixButton => 'Виправити автоматично'; + @override + late final _Translations$troubleshootPage$firewall$uk firewall = _Translations$troubleshootPage$firewall$uk._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$uk noDiscovery = _Translations$troubleshootPage$noDiscovery$uk._(_root); + @override + late final _Translations$troubleshootPage$noConnection$uk noConnection = _Translations$troubleshootPage$noConnection$uk._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$uk extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Історія'; + @override + String get openFolder => 'Відкрити папку'; + @override + String get deleteHistory => 'Видалити історію'; + @override + String get empty => 'Історія порожня.'; + @override + late final _Translations$receiveHistoryPage$entryActions$uk entryActions = _Translations$receiveHistoryPage$entryActions$uk._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$uk extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Програми (APK)'; + @override + String get excludeSystemApps => 'Виключити системні програми'; + @override + String get excludeAppsWithoutLaunchIntent => 'Виключити програми, що не запускаються'; + @override + String apps({required Object n}) => '${n} програм'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$uk extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Видалити все'; +} + +// Path: receivePage +class _Translations$receivePage$uk extends Translations$receivePage$en { + _Translations$receivePage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('uk'))( + n, + one: 'хоче надіслати вам файл', + other: 'хоче надіслати вам ${n} файли (-ів)', + ); + @override + String get subTitleMessage => 'надіслав вам повідомлення:'; + @override + String get subTitleLink => 'надіслав вам посилання:'; + @override + String get canceled => 'Відправник скасував запит на передачу файлів.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$uk extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Параметри отримання'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(Папка LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Вимкнено автоматично, оскільки є папки.'; +} + +// Path: sendPage +class _Translations$sendPage$uk extends Translations$sendPage$en { + _Translations$sendPage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Очікування відповіді…'; + @override + String get rejected => 'Отримувач відхилив запит.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Отримувач зайнятий іншим запитом.'; +} + +// Path: progressPage +class _Translations$progressPage$uk extends Translations$progressPage$en { + _Translations$progressPage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Надсилання файлів'; + @override + String get titleReceiving => 'Отримання файлів'; + @override + String get savedToGallery => 'Збережено в галереї'; + @override + late final _Translations$progressPage$total$uk total = _Translations$progressPage$total$uk._(_root); + @override + late final _Translations$progressPage$remainingTime$uk remainingTime = _Translations$progressPage$remainingTime$uk._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$uk extends Translations$webSharePage$en { + _Translations$webSharePage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Поділитися через посилання'; + @override + String get loading => 'Запуск сервера…'; + @override + String get stopping => 'Зупинка сервера…'; + @override + String get error => 'Під час запуску сервера сталася помилка.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('uk'))( + n, + one: 'Відкрийте це посилання в браузері:', + other: 'Відкрийте одне з цих посилань в браузері:', + ); + @override + String get requests => 'Запити'; + @override + String get noRequests => 'Запитів поки що немає.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Автоматично приймати запити'; + @override + String get requirePin => 'Вимагати PIN-код'; + @override + String pinHint({required Object pin}) => 'PIN-код: «${pin}»'; + @override + String get encryptionHint => 'LocalSend використовує самопідписаний сертифікат. Вам потрібно прийняти його в браузері.'; + @override + String pendingRequests({required Object n}) => 'Запити, що очікують на розгляд: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$uk extends Translations$aboutPage$en { + _Translations$aboutPage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Про LocalSend'; + @override + List get description => [ + 'LocalSend — це безплатна програма з відкритим вихідним кодом, яка дозволяє вам безпечно обмінюватися файлами та повідомленнями з пристроями поблизу через локальну мережу, без необхідності підключення до Інтернету.', + 'Ця програма доступна для Android, iOS, macOS, Windows та Linux. Ви можете знайти всі варіанти завантаження на офіційній домашній сторінці.', + ]; + @override + String get author => 'Автор'; + @override + String get contributors => 'Учасники'; + @override + String get packagers => 'Пакувальники'; + @override + String get translators => 'Перекладачі'; +} + +// Path: donationPage +class _Translations$donationPage$uk extends Translations$donationPage$en { + _Translations$donationPage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Пожертвувати'; + @override + String get info => + 'LocalSend — це безплатна програма з відкритим вихідним кодом та без реклами. Якщо вона вам подобається, ви можете підтримати її розробку пожертвою.'; + @override + String donate({required Object amount}) => 'Пожертвувати ${amount}'; + @override + String get thanks => 'Велике спасибі!'; + @override + String get restore => 'Відновити покупку'; +} + +// Path: changelogPage +class _Translations$changelogPage$uk extends Translations$changelogPage$en { + _Translations$changelogPage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Історія змін'; +} + +// Path: dialogs +class _Translations$dialogs$uk extends Translations$dialogs$en { + _Translations$dialogs$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$uk addFile = _Translations$dialogs$addFile$uk._(_root); + @override + late final _Translations$dialogs$openFile$uk openFile = _Translations$dialogs$openFile$uk._(_root); + @override + late final _Translations$dialogs$addressInput$uk addressInput = _Translations$dialogs$addressInput$uk._(_root); + @override + late final _Translations$dialogs$cancelSession$uk cancelSession = _Translations$dialogs$cancelSession$uk._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$uk cannotOpenFile = _Translations$dialogs$cannotOpenFile$uk._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$uk encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$uk._(_root); + @override + late final _Translations$dialogs$errorDialog$uk errorDialog = _Translations$dialogs$errorDialog$uk._(_root); + @override + late final _Translations$dialogs$favoriteDialog$uk favoriteDialog = _Translations$dialogs$favoriteDialog$uk._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$uk favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$uk._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$uk favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$uk._(_root); + @override + late final _Translations$dialogs$fileInfo$uk fileInfo = _Translations$dialogs$fileInfo$uk._(_root); + @override + late final _Translations$dialogs$fileNameInput$uk fileNameInput = _Translations$dialogs$fileNameInput$uk._(_root); + @override + late final _Translations$dialogs$historyClearDialog$uk historyClearDialog = _Translations$dialogs$historyClearDialog$uk._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$uk localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$uk._(_root); + @override + late final _Translations$dialogs$messageInput$uk messageInput = _Translations$dialogs$messageInput$uk._(_root); + @override + late final _Translations$dialogs$noFiles$uk noFiles = _Translations$dialogs$noFiles$uk._(_root); + @override + late final _Translations$dialogs$noPermission$uk noPermission = _Translations$dialogs$noPermission$uk._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$uk notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$uk._(_root); + @override + late final _Translations$dialogs$qr$uk qr = _Translations$dialogs$qr$uk._(_root); + @override + late final _Translations$dialogs$quickActions$uk quickActions = _Translations$dialogs$quickActions$uk._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$uk quickSaveNotice = _Translations$dialogs$quickSaveNotice$uk._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$uk quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$uk._(_root); + @override + late final _Translations$dialogs$pin$uk pin = _Translations$dialogs$pin$uk._(_root); + @override + late final _Translations$dialogs$sendModeHelp$uk sendModeHelp = _Translations$dialogs$sendModeHelp$uk._(_root); + @override + late final _Translations$dialogs$zoom$uk zoom = _Translations$dialogs$zoom$uk._(_root); +} + +// Path: sanitization +class _Translations$sanitization$uk extends Translations$sanitization$en { + _Translations$sanitization$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Назва файлу не може бути порожнім'; + @override + String get invalid => 'Назва файлу містить недопустимі символи'; +} + +// Path: tray +class _Translations$tray$uk extends Translations$tray$en { + _Translations$tray$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Вийти з LocalSend'; + @override + String get closeWindows => 'Вийти'; +} + +// Path: web +class _Translations$web$uk extends Translations$web$en { + _Translations$web$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Введіть PIN-код'; + @override + String get invalidPin => 'Неправильний PIN-код'; + @override + String get tooManyAttempts => 'Забагато спроб'; + @override + String get rejected => 'Відхилено'; + @override + String get files => 'Файлів'; + @override + String get fileName => 'Назва файлу'; + @override + String get size => 'Розмір'; +} + +// Path: assetPicker +class _Translations$assetPicker$uk extends Translations$assetPicker$en { + _Translations$assetPicker$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Підтвердити'; + @override + String get cancel => 'Скасувати'; + @override + String get edit => 'Редагувати'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Не вдалося завантажити'; + @override + String get original => 'Оригінал'; + @override + String get preview => 'Передперегляд'; + @override + String get select => 'Вибрати'; + @override + String get emptyList => 'Список порожній'; + @override + String get unSupportedAssetType => 'Непідтримуваний тип файлу.'; + @override + String get unableToAccessAll => 'Не вдалося отримати доступ до всіх файлів на пристрої'; + @override + String get viewingLimitedAssetsTip => 'Програма може переглядати тільки файли та альбоми, до яких вона має доступ.'; + @override + String get changeAccessibleLimitedAssets => 'Дозволити доступ до додаткових файлів'; + @override + String get accessAllTip => + 'Програма має доступ тільки до деяких файлів на пристрої. Перейдіть до системних налаштувань та дозвольте програмі отримати доступ до всіх медіафайлів на пристрої.'; + @override + String get goToSystemSettings => 'Перейти до системних налаштувань'; + @override + String get accessLimitedAssets => 'Продовжити з обмеженим доступом'; + @override + String get accessiblePathName => 'Доступні файли'; + @override + String get sTypeAudioLabel => 'Аудіо'; + @override + String get sTypeImageLabel => 'Зображення'; + @override + String get sTypeVideoLabel => 'Відео'; + @override + String get sTypeOtherLabel => 'Інші медіафайли'; + @override + String get sActionPlayHint => 'відтворити'; + @override + String get sActionPreviewHint => 'передперегляд'; + @override + String get sActionSelectHint => 'вибрати'; + @override + String get sActionSwitchPathLabel => 'змінити шлях'; + @override + String get sActionUseCameraHint => 'використати камеру'; + @override + String get sNameDurationLabel => 'тривалість'; + @override + String get sUnitAssetCountLabel => 'кількість'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$uk extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Мережевий інтерфейс'; + @override + String get preview => 'Передперегляд'; + @override + String get whitelist => 'Білий список'; + @override + String get blacklist => 'Чорний список'; + @override + String get info => + 'Типово LocalSend використовує всі доступні мережеві інтерфейси. Ви можете виключити небажані мережі тут. Щоб застосувати зміни, потрібно перезапустити сервер.'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$uk extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Порт:'; + @override + String get alias => 'Ім\'я пристрою:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$uk extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Улюблені'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$uk extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Вибірка'; + @override + String files({required Object files}) => 'Файлів: ${files}'; + @override + String size({required Object size}) => 'Розмір: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$uk extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get file => 'Файл'; + @override + String get folder => 'Папка'; + @override + String get media => 'Медіа'; + @override + String get text => 'Текст'; + @override + String get app => 'Програма'; + @override + String get clipboard => 'Вставити'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$uk extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get single => 'Один отримувач'; + @override + String get multiple => 'Декілька отримувачів'; + @override + String get link => 'Поділитися через посилання'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$uk extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Загальні'; + @override + String get brightness => 'Тема'; + @override + late final _Translations$settingsTab$general$brightnessOptions$uk brightnessOptions = _Translations$settingsTab$general$brightnessOptions$uk._( + _root, + ); + @override + String get color => 'Колір'; + @override + late final _Translations$settingsTab$general$colorOptions$uk colorOptions = _Translations$settingsTab$general$colorOptions$uk._(_root); + @override + String get language => 'Мова'; + @override + late final _Translations$settingsTab$general$languageOptions$uk languageOptions = _Translations$settingsTab$general$languageOptions$uk._(_root); + @override + String get saveWindowPlacement => 'Зберігати розташування вікна після виходу'; + @override + String get saveWindowPlacementWindows => 'Зберігати розташування вікна після виходу'; + @override + String get minimizeToTray => 'Згортати в системний трей/смугу меню при закритті'; + @override + String get launchAtStartup => 'Автозапуск'; + @override + String get launchMinimized => 'Прихований автозапуск'; + @override + String get showInContextMenu => 'Відображати LocalSend в контекстному меню'; + @override + String get animations => 'Анімації'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$uk extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Отримання'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Автозавершення'; + @override + String get destination => 'Зберігати в папку'; + @override + String get downloads => '(Завантаження)'; + @override + String get saveToGallery => 'Зберігати медіафайли в галерею'; + @override + String get saveToHistory => 'Зберігати історію'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$uk extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Надсилання'; + @override + String get shareViaLinkAutoAccept => 'Автоматично приймати запити в режимі «Поділитися через посилання»'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$uk extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Мережа'; + @override + String get needRestart => 'Для застосування змін необхідно перезапустити сервер!'; + @override + String get server => 'Сервер'; + @override + String get alias => 'Назва пристрою'; + @override + String get deviceType => 'Тип пристрою'; + @override + String get deviceModel => 'Модель пристрою'; + @override + String get port => 'Порт'; + @override + String get discoveryTimeout => 'Час пошуку вийшов'; + @override + String get useSystemName => 'Використати системну назву'; + @override + String get generateRandomAlias => 'Згенерувати випадковий псевдонім'; + @override + String portWarning({required Object defaultPort}) => + 'Інші пристрої можуть вас не знайти, оскільки ви використовуєте інший, власний порт. (default: ${defaultPort})'; + @override + String get encryption => 'Шифрування'; + @override + String get multicastGroup => 'Адреса групової передачі'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Інші пристрої можуть вас не знайти, оскільки ви використовуєте іншу, власну адресу групової передачі. (default: ${defaultMulticast})'; + @override + String get network => 'Мережа'; + @override + late final _Translations$settingsTab$network$networkOptions$uk networkOptions = _Translations$settingsTab$network$networkOptions$uk._(_root); +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$uk extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Інше'; + @override + String get support => 'Підтримати LocalSend'; + @override + String get donate => 'Пожертвувати'; + @override + String get privacyPolicy => 'Політика конфіденційності'; + @override + String get termsOfUse => 'Умови використання'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$uk extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Цей пристрій може надсилати файли на інші пристрої, але інші пристрої не можуть надсилати файли на цей пристрій.'; + @override + String solution({required Object port}) => + 'Швидше за все, це проблема брандмауера. Ви можете вирішити дану проблему, дозволивши вхідні з\'єднання (UDP та TCP) для порта: ${port}.'; + @override + String get openFirewall => 'Відкрити брандмауер'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$uk extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Цей пристрій не може знайти інші пристрої.'; + @override + String get solution => + 'Будь ласка, переконайтеся, що обидва пристрої знаходяться в одній Wi-Fi мережі та мають однакову конфігурацію (порт, адресу групової передачі, шифрування). Ви можете спробувати ввести IP-адресу цільового пристрою вручну. Якщо це спрацює, подумайте про те, щоб додати цей пристрій до улюблених, щоб його можна було автоматично знаходити в майбутньому.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$uk extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Обидва пристрої не можуть знайти один одного та не можуть обмінюватися файлами.'; + @override + String get solution => + 'Проблема існує з обох сторін? Отже, вам потрібно переконатися, що обидва пристрої знаходяться в одній Wi-Fi мережі та мають однакову конфігурацію (порт, адресу групової передачі, шифрування). Мережа Wi-Fi може не дозволяти обмін (передачу) між учасниками. У такому разі, вам потрібно увімкнути дану опцію на своєму маршрутизаторі.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$uk extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get open => 'Відкрити файл'; + @override + String get showInFolder => 'Показати в папці'; + @override + String get info => 'Інформація'; + @override + String get deleteFromHistory => 'Видалити з історії'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$uk extends Translations$progressPage$total$en { + _Translations$progressPage$total$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$uk title = _Translations$progressPage$total$title$uk._(_root); + @override + String count({required Object curr, required Object n}) => 'Файлів: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Розмір: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Швидкість: ${speed}/s'; +} + +// Path: progressPage.remainingTime +class _Translations$progressPage$remainingTime$uk extends Translations$progressPage$remainingTime$en { + _Translations$progressPage$remainingTime$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; + + /// Використовуйте «h» як скорочення для годин і «m» для хвилин + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// Використовуйте «d» для днів, «h» для годин і «m» для хвилин + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$uk extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Додати у вибірку'; + @override + String get content => 'Що ви хочете додати?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$uk extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Відкрити файл'; + @override + String get content => 'Хочете відкрити отриманий файл?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$uk extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Введіть адресу'; + @override + String get hashtag => 'Хештег'; + @override + String get ip => 'IP-адреса'; + @override + String get recentlyUsed => 'Нещодавно використані: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$uk extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Скасувати надсилання файлів'; + @override + String get content => 'Ви справді хочете скасувати надсилання файлів?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$uk extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Не вдалося відкрити файл'; + @override + String content({required Object file}) => 'Не вдалося відкрити «${file}». Можливо, цей файл було переміщено, перейменовано або видалено?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$uk extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Шифрування вимкнено'; + @override + String get content => + 'Зв\'язок тепер відбувається через незашифрований HTTP протокол. Щоб використовувати протокол HTTPS, знову увімкніть шифрування.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$uk extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$uk extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Улюблені'; + @override + String get noFavorites => 'Улюблених пристроїв поки що немає.'; + @override + String get addFavorite => 'Додати'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$uk extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Видалити з улюблених'; + @override + String content({required Object name}) => 'Ви справді хочете видалити з улюблених «${name}»?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$uk extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Додати до улюблених'; + @override + String get titleEdit => 'Налаштування'; + @override + String get name => 'Ім\'я пристрою'; + @override + String get auto => '(автоматично)'; + @override + String get ip => 'IP-адреса'; + @override + String get port => 'Порт'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$uk extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Інформація про файл'; + @override + String get fileName => 'Назва файлу:'; + @override + String get path => 'Шлях:'; + @override + String get size => 'Розмір:'; + @override + String get sender => 'Відправник:'; + @override + String get time => 'Час:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$uk extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Введіть ім\'я файлу'; + @override + String original({required Object original}) => 'Оригінальне ім\'я файлу: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$uk extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Очистити історію'; + @override + String get content => 'Ви справді хочете видалити всю історію?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$uk extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend не може знайти інші пристрої без дозволу на сканування локальної мережі. Будь ласка, надайте цей дозвіл у налаштуваннях.'; + @override + String get gotoSettings => 'Налаштування'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$uk extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Введіть повідомлення'; + @override + String get multiline => 'Багаторядкове'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$uk extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Не вибрано жодного файлу'; + @override + String get content => 'Будь ласка, додайте як мінімум один файл.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$uk extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Немає дозволу'; + @override + String get content => 'Ви не надали необхідні дозволи. Будь ласка, надайте їх у налаштуваннях.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$uk extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Недоступно'; + @override + String get content => 'Ця функція доступна тільки на:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$uk extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR-код'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$uk extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Швидкі дії'; + @override + String get counter => 'Лічильник'; + @override + String get prefix => 'Префікс'; + @override + String get padZero => 'Додати нулі на початку'; + @override + String get sortBeforeCount => 'Відсортувати за алфавітом (А-Я)'; + @override + String get random => 'Випадково'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$uk extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Запити на отримання файлів відтепер приймаються автоматично. Будьте обережні, всі користувачі цієї локальної мережі можуть надсилати вам файли.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$uk extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Запити на отримання файлів відтепер приймаються автоматично від пристроїв із вашого списку улюблених.', + 'Попередження! Наразі, це не зовсім безпечно, оскільки хакер, який має відбиток пальця будь-якого пристрою з вашого списку улюблених, може безперешкодно надсилати вам файли.', + 'Проте, цей варіант все одно безпечніший, ніж дозволити всім користувачам локальної мережі безперешкодно надсилати вам файли.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$uk extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Введіть PIN-код'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$uk extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'Режими надсилання'; + @override + String get single => 'Надсилає файли одному отримувачу. Вибірку буде очищено після завершення передачі файлів.'; + @override + String get multiple => 'Надсилає файли декільком отримувачам. Вибірку не буде очищено після завершення передачі файлів.'; + @override + String get link => 'Отримувачі, у яких не встановлено LocalSend, можуть завантажити вибрані файли, відкривши посилання у своєму браузері.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$uk extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL-адреса'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$uk extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get system => 'Системна'; + @override + String get dark => 'Темна'; + @override + String get light => 'Світла'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$uk extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get system => 'Системний'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$uk extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get system => 'Системна'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$uk extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String get all => 'Все'; + @override + String get filtered => 'Фільтроване'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$uk extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$uk._(TranslationsUk root) : this._root = root, super.internal(root); + + final TranslationsUk _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Загальний час передачі (${time})'; + @override + String get finishedError => 'Завершено з помилкою'; + @override + String get canceledSender => 'Скасовано відправником'; + @override + String get canceledReceiver => 'Скасовано отримувачем'; +} diff --git a/app/lib/gen/strings_ur.g.dart b/app/lib/gen/strings_ur.g.dart new file mode 100644 index 0000000..81fdc6c --- /dev/null +++ b/app/lib/gen/strings_ur.g.dart @@ -0,0 +1,1313 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsUr extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsUr({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.ur, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsUr _root = this; // ignore: unused_field + + @override + TranslationsUr $copyWith({TranslationMetadata? meta}) => TranslationsUr(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'اردو'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$ur general = _Translations$general$ur._(_root); + @override + late final _Translations$receiveTab$ur receiveTab = _Translations$receiveTab$ur._(_root); + @override + late final _Translations$sendTab$ur sendTab = _Translations$sendTab$ur._(_root); + @override + late final _Translations$settingsTab$ur settingsTab = _Translations$settingsTab$ur._(_root); + @override + late final _Translations$troubleshootPage$ur troubleshootPage = _Translations$troubleshootPage$ur._(_root); + @override + late final _Translations$receiveHistoryPage$ur receiveHistoryPage = _Translations$receiveHistoryPage$ur._(_root); + @override + late final _Translations$apkPickerPage$ur apkPickerPage = _Translations$apkPickerPage$ur._(_root); + @override + late final _Translations$selectedFilesPage$ur selectedFilesPage = _Translations$selectedFilesPage$ur._(_root); + @override + late final _Translations$receivePage$ur receivePage = _Translations$receivePage$ur._(_root); + @override + late final _Translations$receiveOptionsPage$ur receiveOptionsPage = _Translations$receiveOptionsPage$ur._(_root); + @override + late final _Translations$sendPage$ur sendPage = _Translations$sendPage$ur._(_root); + @override + late final _Translations$progressPage$ur progressPage = _Translations$progressPage$ur._(_root); + @override + late final _Translations$webSharePage$ur webSharePage = _Translations$webSharePage$ur._(_root); + @override + late final _Translations$aboutPage$ur aboutPage = _Translations$aboutPage$ur._(_root); + @override + late final _Translations$donationPage$ur donationPage = _Translations$donationPage$ur._(_root); + @override + late final _Translations$changelogPage$ur changelogPage = _Translations$changelogPage$ur._(_root); + @override + late final _Translations$dialogs$ur dialogs = _Translations$dialogs$ur._(_root); + @override + late final _Translations$sanitization$ur sanitization = _Translations$sanitization$ur._(_root); + @override + late final _Translations$tray$ur tray = _Translations$tray$ur._(_root); + @override + late final _Translations$web$ur web = _Translations$web$ur._(_root); + @override + late final _Translations$assetPicker$ur assetPicker = _Translations$assetPicker$ur._(_root); +} + +// Path: general +class _Translations$general$ur extends Translations$general$en { + _Translations$general$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get accept => 'قبول کریں'; + @override + String get accepted => 'قبول کر لیا'; + @override + String get add => 'شامل کریں'; + @override + String get advanced => 'اعلی درجے کی'; + @override + String get cancel => 'منسوخ کریں'; + @override + String get close => 'بند کریں'; + @override + String get confirm => 'تصدیق کریں'; + @override + String get continueStr => 'جاری رہے'; + @override + String get copy => 'کاپی'; + @override + String get copiedToClipboard => 'کلپ بورڈ پر کاپی کیا گیا'; + @override + String get decline => 'رد کرنا'; + @override + String get done => 'ہو گیا'; + @override + String get delete => 'حذف کریں'; + @override + String get edit => 'ترمیم'; + @override + String get error => 'خرابی'; + @override + String get example => 'مثال'; + @override + String get files => 'فائلوں'; + @override + String get finished => 'ختم'; + @override + String get hide => 'چھپائیں'; + @override + String get off => 'بند'; + @override + String get offline => 'آف لائن'; + @override + String get on => 'پر'; + @override + String get online => 'آن لائن'; + @override + String get open => 'کھولیں'; + @override + String get queue => 'قطار'; + @override + String get quickSave => 'فوری محفوظ کریں'; + @override + String get renamed => 'نام تبدیل کر دیا گیا'; + @override + String get reset => 'دوبارہ ترتیب دیں'; + @override + String get restart => 'دوبارہ شروع کریں'; + @override + String get settings => 'ترتیبات'; + @override + String get skipped => 'چھوڑ دیا'; + @override + String get start => 'شروع کریں'; + @override + String get stop => 'رک جاؤ'; + @override + String get save => 'محفوظ کریں'; + @override + String get unchanged => 'غیر تبدیل شدہ'; + @override + String get unknown => 'نامعلوم'; + @override + String get noItemInClipboard => 'کلپ بورڈ میں کوئی آئٹم نہیں ہے۔'; +} + +// Path: receiveTab +class _Translations$receiveTab$ur extends Translations$receiveTab$en { + _Translations$receiveTab$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'وصول کریں'; + @override + late final _Translations$receiveTab$infoBox$ur infoBox = _Translations$receiveTab$infoBox$ur._(_root); +} + +// Path: sendTab +class _Translations$sendTab$ur extends Translations$sendTab$en { + _Translations$sendTab$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'بھیجیں'; + @override + late final _Translations$sendTab$selection$ur selection = _Translations$sendTab$selection$ur._(_root); + @override + late final _Translations$sendTab$picker$ur picker = _Translations$sendTab$picker$ur._(_root); + @override + String get shareIntentInfo => 'آپ اپنے موبائل ڈیوائس کی "شیئر کریں" فیچر کو بھی آسانی سے فائلوں کو منتخب کرنے کے لیے استعمال کرسکتے ہیں۔'; + @override + String get nearbyDevices => 'قریبی ڈیوائس'; + @override + String get thisDevice => 'یہ ڈیوائس'; + @override + String get scan => 'ڈیوائس تلاش کریں'; + @override + String get manualSending => 'خود بھیجنا'; + @override + String get sendMode => 'سینڈ موڈ'; + @override + late final _Translations$sendTab$sendModes$ur sendModes = _Translations$sendTab$sendModes$ur._(_root); + @override + String get sendModeHelp => 'وضاحت'; + @override + String get help => 'براہ کرم یقینی بنائیں کہ مطلوبہ ہدف بھی اسی وائی فائی نیٹ ورک میں ہے۔'; + @override + String get placeItems => 'شئیر کرنے کے لیے اشیاء رکھیں۔'; +} + +// Path: settingsTab +class _Translations$settingsTab$ur extends Translations$settingsTab$en { + _Translations$settingsTab$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'ترتیبات'; + @override + late final _Translations$settingsTab$general$ur general = _Translations$settingsTab$general$ur._(_root); + @override + late final _Translations$settingsTab$receive$ur receive = _Translations$settingsTab$receive$ur._(_root); + @override + late final _Translations$settingsTab$send$ur send = _Translations$settingsTab$send$ur._(_root); + @override + late final _Translations$settingsTab$network$ur network = _Translations$settingsTab$network$ur._(_root); + @override + late final _Translations$settingsTab$other$ur other = _Translations$settingsTab$other$ur._(_root); + @override + String get advancedSettings => 'تجاویز شھر کی ترتیبات'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$ur extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'خرابی کا سراغ لگانا'; + @override + String get subTitle => 'کیا یہ ایپ توقع کے مطابق کام نہیں کرتی؟ یہاں آپ عام حل تلاش کر سکتے ہیں۔'; + @override + String get solution => 'حل:'; + @override + String get fixButton => 'خود بخود درست کریں۔'; + @override + late final _Translations$troubleshootPage$firewall$ur firewall = _Translations$troubleshootPage$firewall$ur._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$ur noDiscovery = _Translations$troubleshootPage$noDiscovery$ur._(_root); + @override + late final _Translations$troubleshootPage$noConnection$ur noConnection = _Translations$troubleshootPage$noConnection$ur._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$ur extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'تاریخ'; + @override + String get openFolder => 'فولڈر کھولیں'; + @override + String get deleteHistory => 'تاریخ کو حذف کریں'; + @override + String get empty => 'تاریخ خالی ہے۔'; + @override + late final _Translations$receiveHistoryPage$entryActions$ur entryActions = _Translations$receiveHistoryPage$entryActions$ur._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$ur extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'اپلیکیشنز (APK)'; + @override + String get excludeSystemApps => 'سسٹم ایپس کو ختم کریں'; + @override + String get excludeAppsWithoutLaunchIntent => 'غیر لانچ ہونے والے ایپس کو ختم کریں'; + @override + String apps({required Object n}) => '${n} ایپس'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$ur extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'تمام حذف کریں'; +} + +// Path: receivePage +class _Translations$receivePage$ur extends Translations$receivePage$en { + _Translations$receivePage$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ur'))( + n, + one: 'آپ کو ایک فائل بھیجنا چاہتا ہے۔', + other: 'آپ کو ${n} فائلیں بھیجنا چاہتا ہے۔', + ); + @override + String get subTitleMessage => 'آپ کو ایک پیغام بھیجا:'; + @override + String get subTitleLink => 'آپ کو ایک لنک بھیجا:'; + @override + String get canceled => 'بھیجنے والے نے درخواست منسوخ کر دی ہے۔'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$ur extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'اختیارات'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(${_root.appName} folder)'; + @override + String get saveToGallery => '. گیلری میں محفوظ کریں${_root.settingsTab.receive.saveToGallery}'; + @override + String get saveToGalleryOff => 'خود کار طور پر منقطع ہوگیا ہے کیونکہ ڈائریکٹریاں ہیں۔'; +} + +// Path: sendPage +class _Translations$sendPage$ur extends Translations$sendPage$en { + _Translations$sendPage$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'جواب کا منتظر...'; + @override + String get rejected => 'وصول کنندہ نے درخواست مسترد کر دی ہے۔'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'وصول کنندہ دوسری درخواست میں مصروف ہے۔'; +} + +// Path: progressPage +class _Translations$progressPage$ur extends Translations$progressPage$en { + _Translations$progressPage$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'فائلیں بھیج رہا ہے'; + @override + String get titleReceiving => 'فائلیں موصول ہو رہی ہیں'; + @override + String get savedToGallery => 'تصاویر میں محفوظ کیا گیا'; + @override + late final _Translations$progressPage$total$ur total = _Translations$progressPage$total$ur._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$ur extends Translations$webSharePage$en { + _Translations$webSharePage$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'لنک کے ذریعے شئیر کریں'; + @override + String get loading => 'سرور کو چالو کررہا ہے...'; + @override + String get stopping => 'سرور بند ہو رہا ہے...'; + @override + String get error => 'سرور چالو کرتے وقت خامی پیش آئی ہے۔'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ur'))( + n, + one: 'اس لنک کو براوزر میں کھولیں:', + other: 'ان میں سے کسی ایک لنک کو براوزر میں کھولیں:', + ); + @override + String get requests => 'درخواستیں'; + @override + String get noRequests => 'ابھی تک کوئی درخواست نہیں۔'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'درخواستیں خود بخود قبول کریں'; + @override + String get requirePin => 'PIN درکار ہے'; + @override + String pinHint({required Object pin}) => 'PIN ہے "${pin}"'; + @override + String get encryptionHint => 'LocalSend براؤزر میں استعمال کرنے کیلئے آپ کوخود سائن کردہ سرٹیفکیٹ قبول کرنا ہوگا۔'; + @override + String pendingRequests({required Object n}) => 'زیر التواء درخواستیں: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$ur extends Translations$aboutPage$en { + _Translations$aboutPage$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'کے بارے میں LocalSend'; + @override + List get description => [ + 'LocalSend ایک مفت، اوپن سورس ایپ ہے جو آپ کو انٹرنیٹ کنکشن کی ضرورت کے بغیر اپنے مقامی نیٹ ورک کے ذریعے قریبی آلات کے ساتھ فائلیں اور پیغامات محفوظ طریقے سے شیئر کرنے کی اجازت دیتی ہے۔', + 'یہ ایپ اینڈرائیڈ، iOS، macOS، ونڈوز، اور لینکس پر دستیاب ہے۔ آپ تمام ڈاؤن لوڈ کے اختیارات سرکاری ویب سائٹ پر تلاش کر سکتے ہیں۔', + ]; + @override + String get author => 'مصنف'; + @override + String get contributors => 'تعاون کنندگان'; + @override + String get packagers => 'پیکجرز'; + @override + String get translators => 'مترجمین'; +} + +// Path: donationPage +class _Translations$donationPage$ur extends Translations$donationPage$en { + _Translations$donationPage$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'عطیہ کریں'; + @override + String get info => + 'LocalSend مفت، اوپن سورس ہے اور اس میں کوئی اشتہارات نہیں ہیں۔ اگر آپ کو ایپ پسند ہے، تو آپ عطیہ کے ذریعے ترقی کی حمایت کر سکتے ہیں۔'; + @override + String donate({required Object amount}) => 'عطیہ کریں ${amount}'; + @override + String get thanks => 'آپ کا بہت بہت شکریہ!'; + @override + String get restore => 'خریداری بحال کریں'; +} + +// Path: changelogPage +class _Translations$changelogPage$ur extends Translations$changelogPage$en { + _Translations$changelogPage$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'چینج لاگ'; +} + +// Path: dialogs +class _Translations$dialogs$ur extends Translations$dialogs$en { + _Translations$dialogs$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$ur addFile = _Translations$dialogs$addFile$ur._(_root); + @override + late final _Translations$dialogs$addressInput$ur addressInput = _Translations$dialogs$addressInput$ur._(_root); + @override + late final _Translations$dialogs$cancelSession$ur cancelSession = _Translations$dialogs$cancelSession$ur._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$ur cannotOpenFile = _Translations$dialogs$cannotOpenFile$ur._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$ur encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$ur._(_root); + @override + late final _Translations$dialogs$errorDialog$ur errorDialog = _Translations$dialogs$errorDialog$ur._(_root); + @override + late final _Translations$dialogs$favoriteDialog$ur favoriteDialog = _Translations$dialogs$favoriteDialog$ur._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$ur favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$ur._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$ur favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$ur._(_root); + @override + late final _Translations$dialogs$fileInfo$ur fileInfo = _Translations$dialogs$fileInfo$ur._(_root); + @override + late final _Translations$dialogs$fileNameInput$ur fileNameInput = _Translations$dialogs$fileNameInput$ur._(_root); + @override + late final _Translations$dialogs$historyClearDialog$ur historyClearDialog = _Translations$dialogs$historyClearDialog$ur._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$ur localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$ur._(_root); + @override + late final _Translations$dialogs$messageInput$ur messageInput = _Translations$dialogs$messageInput$ur._(_root); + @override + late final _Translations$dialogs$noFiles$ur noFiles = _Translations$dialogs$noFiles$ur._(_root); + @override + late final _Translations$dialogs$noPermission$ur noPermission = _Translations$dialogs$noPermission$ur._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$ur notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$ur._(_root); + @override + late final _Translations$dialogs$qr$ur qr = _Translations$dialogs$qr$ur._(_root); + @override + late final _Translations$dialogs$quickActions$ur quickActions = _Translations$dialogs$quickActions$ur._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$ur quickSaveNotice = _Translations$dialogs$quickSaveNotice$ur._(_root); + @override + late final _Translations$dialogs$pin$ur pin = _Translations$dialogs$pin$ur._(_root); + @override + late final _Translations$dialogs$sendModeHelp$ur sendModeHelp = _Translations$dialogs$sendModeHelp$ur._(_root); + @override + late final _Translations$dialogs$zoom$ur zoom = _Translations$dialogs$zoom$ur._(_root); +} + +// Path: sanitization +class _Translations$sanitization$ur extends Translations$sanitization$en { + _Translations$sanitization$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get empty => 'فائل کا نام خالی نہیں ہو سکتا'; + @override + String get invalid => 'فائل کے نام میں غلط حروف ہیں'; +} + +// Path: tray +class _Translations$tray$ur extends Translations$tray$en { + _Translations$tray$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'چھوڑو LocalSend'; + @override + String get closeWindows => 'بند کریں'; +} + +// Path: web +class _Translations$web$ur extends Translations$web$en { + _Translations$web$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'PIN درج کریں'; + @override + String get invalidPin => 'غلط PIN'; + @override + String get tooManyAttempts => 'بہت زیادہ کوششیں'; + @override + String get rejected => 'منسوخ کردیا'; + @override + String get files => 'فائلیں'; + @override + String get fileName => 'فائل کا نام'; + @override + String get size => 'سائز'; +} + +// Path: assetPicker +class _Translations$assetPicker$ur extends Translations$assetPicker$en { + _Translations$assetPicker$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'تصدیق کریں'; + @override + String get cancel => 'منسوخ کریں'; + @override + String get edit => 'ترمیم کریں'; + @override + String get gifIndicator => 'جی آئی ایف'; + @override + String get loadFailed => 'لوڈ نہیں ہوسکی'; + @override + String get original => 'اصل '; + @override + String get preview => 'پیش نظارہ'; + @override + String get select => 'منتخب کریں'; + @override + String get emptyList => 'خالی فہرست'; + @override + String get unSupportedAssetType => 'غیر معتبر فائل کی قسم۔'; + @override + String get unableToAccessAll => 'یہ ڈیوائس پر تمام فائلوں تک رسائی نہیں ہوسکتی ہے۔'; + @override + String get viewingLimitedAssetsTip => 'صرف ایپ تک رسائی پذیر فائلوں اور البم کونسیس ہوسکتی ہیں۔'; + @override + String get changeAccessibleLimitedAssets => 'رسائی پذیر فائلوں کو اپ ڈیٹ کرنے کے لئے کلک کریں'; + @override + String get accessAllTip => + 'ایپ صرف چند فائلوں تک رسائی حاصل کرسکتی ہے ڈیوائس پر۔ سسٹم کی ترتیبات میں جائیں اور ایپ کو ڈیوائس پر تمام میڈیا تک رسائی کی اجازت دیں۔'; + @override + String get goToSystemSettings => 'سسٹم ترتیبات پر جائیں'; + @override + String get accessLimitedAssets => 'محدود رسائی کے ساتھ جاری رکھیں'; + @override + String get accessiblePathName => 'رسائی پذیر فائلیں'; + @override + String get sTypeAudioLabel => 'آڈیو'; + @override + String get sTypeImageLabel => 'تصویر'; + @override + String get sTypeVideoLabel => 'ویڈیو'; + @override + String get sTypeOtherLabel => 'دیگر میڈیا'; + @override + String get sActionPlayHint => 'چلائیں'; + @override + String get sActionPreviewHint => 'پیش نظارہ کریں'; + @override + String get sActionSelectHint => 'منتخب کریں'; + @override + String get sActionSwitchPathLabel => 'راستہ تبدیل کریں'; + @override + String get sActionUseCameraHint => 'کیمرہ استعمال کریں'; + @override + String get sNameDurationLabel => 'مدت'; + @override + String get sUnitAssetCountLabel => 'کاؤنٹ'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$ur extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get ip => ':آئی پی'; + @override + String get port => ':پورٹ'; + @override + String get alias => ':عرف'; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$ur extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'انتخاب'; + @override + String files({required Object files}) => 'فائلیں: ${files}'; + @override + String size({required Object size}) => 'سائز: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$ur extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get file => 'فائل'; + @override + String get folder => 'فولڈر'; + @override + String get media => 'میڈیا'; + @override + String get text => 'ٹیکسٹ'; + @override + String get app => 'ایپ'; + @override + String get clipboard => 'چسپاں کریں'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$ur extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get single => 'سنگل رسپٹ'; + @override + String get multiple => 'ملٹیپل رسپٹ'; + @override + String get link => 'لنک کے ذریعے شیئر کریں'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$ur extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'جنرل'; + @override + String get brightness => 'تھیم'; + @override + late final _Translations$settingsTab$general$brightnessOptions$ur brightnessOptions = _Translations$settingsTab$general$brightnessOptions$ur._( + _root, + ); + @override + String get color => 'رنگ'; + @override + late final _Translations$settingsTab$general$colorOptions$ur colorOptions = _Translations$settingsTab$general$colorOptions$ur._(_root); + @override + String get language => 'زبان'; + @override + late final _Translations$settingsTab$general$languageOptions$ur languageOptions = _Translations$settingsTab$general$languageOptions$ur._(_root); + @override + String get saveWindowPlacement => 'چھوڑیں: ونڈو کی جگہ کو محفوظ کریں۔'; + @override + String get saveWindowPlacementWindows => 'بند ہونے پر ونڈو کی پوزیشن محفوظ کریں'; + @override + String get minimizeToTray => 'چھوڑیں: ٹرے میں چھوٹا کریں۔'; + @override + String get launchAtStartup => 'لاگ ان کے بعد آٹو اسٹارٹ'; + @override + String get launchMinimized => 'آٹو سٹارٹ: سٹارٹ پوشیدہ'; + @override + String get showInContextMenu => 'سیاق و سباق کے مینو میں LocalSend دکھائیں'; + @override + String get animations => 'تحریکات'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$ur extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'وصول کریں'; + @override + String get quickSave => _root.general.quickSave; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'خودکار تکمیل'; + @override + String get destination => 'منزل'; + @override + String get downloads => '(ڈاؤن لوڈ)'; + @override + String get saveToGallery => 'میڈیا کو گیلری میں محفوظ کریں۔'; + @override + String get saveToHistory => 'تاریخچہ میں محفوظ کریں'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$ur extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'بھیجیں'; + @override + String get shareViaLinkAutoAccept => '"لنک کے ذریعے شیئر کریں" موڈ میں درخواستیں خود بخود قبول کریں'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$ur extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'نیٹ ورک'; + @override + String get needRestart => 'ترتیبات کو لاگو کرنے کے لیے سرور کو دوبارہ شروع کریں!'; + @override + String get server => 'سرور'; + @override + String get alias => 'عرف'; + @override + String get deviceType => 'آلہ کی قسم'; + @override + String get deviceModel => 'آلہ کا ماڈل'; + @override + String get port => 'پورٹ'; + @override + String get discoveryTimeout => 'نیٹورک پرڈھونڈنے کی مدت ختم ہوگئ ہے'; + @override + String portWarning({required Object defaultPort}) => + 'ہو سکتا ہے آپ کو دوسرے آلات سے پتہ نہ چل سکے کیونکہ آپ حسب ضرورت پورٹ استعمال کر رہے ہیں۔ (پہلے سے طے شدہ: ${defaultPort})'; + @override + String get encryption => 'خفیہ کاری'; + @override + String get multicastGroup => 'ملٹی کاسٹ'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'ہو سکتا ہے آپ کو دوسرے آلات سے پتہ نہ لگے کیونکہ آپ حسب ضرورت ملٹی کاسٹ ایڈریس استعمال کر رہے ہیں۔ (پہلے سے طے شدہ: ${defaultMulticast})'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$ur extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'دیگر'; + @override + String get support => 'LocalSend کی حمایت کریں'; + @override + String get donate => 'عطیہ کریں'; + @override + String get privacyPolicy => 'رازداری کی پالیسی'; + @override + String get termsOfUse => 'استعمال کی شرائط'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$ur extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'یہ ایپ دیگر آلات پر فائلیں بھیج سکتی ہے لیکن دیگر آلات اس ڈیوائس پر فائلیں نہیں بھیج سکتے۔'; + @override + String solution({required Object port}) => + 'یہ ممکنہ طور پر فائر وال کا مسئلہ ہے۔ آپ اسے پورٹ ${port} پر آنے والے کنکشنز (UDP اور TCP) کی اجازت دے کر حل کر سکتے ہیں۔'; + @override + String get openFirewall => 'فائر وال کھولیں'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$ur extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'یہ آلہ دوسرے آلات کو دریافت نہیں کر سکتا۔'; + @override + String get solution => + 'براہ کرم یقینی بنائیں کہ تمام آلات ایک ہی وائی فائی نیٹ ورک پر ہیں اور ایک ہی ترتیب (پورٹ، ملٹی کاسٹ ایڈریس، انکرپشن) شیئر کرتے ہیں۔ آپ ہدف والے آلے کا IP پتہ دستی طور پر ٹائپ کرنے کی کوشش کر سکتے ہیں۔ اگر یہ کام کرتا ہے، تو اس آلے کو پسندیدہ میں شامل کرنے پر غور کریں تاکہ مستقبل میں اسے خود بخود دریافت کیا جا سکے۔'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$ur extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'دونوں آلات ایک دوسرے کو دریافت نہیں کرسکتے ہیں اور نہ ہی وہ فائلوں کا اشتراک کرسکتے ہیں۔'; + @override + String get solution => + 'مسئلہ دونوں طرف موجود ہے؟ پھر آپ کو یہ یقینی بنانا ہوگا کہ دونوں ڈیوائسز ایک ہی وائی فائی نیٹ ورک میں ہیں اور ایک ہی کنفیگریشن (پورٹ، ملٹی کاسٹ ایڈریس، انکرپشن) کا اشتراک کرتے ہیں۔ وائی فائی شرکاء کے درمیان مواصلت کی اجازت نہیں دے سکتا ہے۔ اس صورت میں، یہ اختیار روٹر پر فعال ہونا ضروری ہے.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$ur extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get open => 'فائل کھولو'; + @override + String get showInFolder => 'فولڈر میں دکھائیں'; + @override + String get info => 'معلومات'; + @override + String get deleteFromHistory => 'تاریخ سے حذف کریں'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$ur extends Translations$progressPage$total$en { + _Translations$progressPage$total$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$ur title = _Translations$progressPage$total$title$ur._(_root); + @override + String count({required Object curr, required Object n}) => 'فائلوں: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'سائز: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'رفتار: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$ur extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'انتخاب میں شامل کریں'; + @override + String get content => 'آپ کیا شامل کرنا چاہتے ہیں؟'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$ur extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'پتہ درج کریں۔'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'اپ ایڈریس'; + @override + String get recentlyUsed => 'حال ہی میں استعمال ہوا:'; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$ur extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'فائل ٹرانسفر منسوخ کریں۔'; + @override + String get content => 'کیا آپ واقعی فائل ٹرانسفر کو منسوخ کرنا چاہتے ہیں؟'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$ur extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'فائل نہیں کھل سکی'; + @override + String content({required Object file}) => '"${file}" کھول نہیں سکتا۔ کیا یہ فائل منتقل ہوگئی ہے، نام تبدیل ہوگیا ہے یا حذف ہوگئی ہے؟'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$ur extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'Encryption disabled'; + @override + String get content => 'Communication now takes place via the unencrypted HTTP protocol. To use HTTPS, enable encryption again.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$ur extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$ur extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'پسندیدہ'; + @override + String get noFavorites => 'ابھی تک کوئی پسندیدہ آلات نہیں ہیں۔'; + @override + String get addFavorite => 'شامل کریں'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$ur extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'پسندیدہ سے حذف کریں'; + @override + String content({required Object name}) => 'کیا آپ واقعی "${name}" کو پسندیدہ سے حذف کرنا چاہتے ہیں؟'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$ur extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'پسندیدہ میں شامل کریں'; + @override + String get titleEdit => 'ترتیبات'; + @override + String get name => 'آلے کا نام'; + @override + String get auto => '(خودکار)'; + @override + String get ip => 'IP پتہ'; + @override + String get port => 'پورٹ'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$ur extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'فائل کی معلومات'; + @override + String get fileName => 'فائل کا نام:'; + @override + String get path => 'راستہ:'; + @override + String get size => 'سائز:'; + @override + String get sender => 'بھیجنے والا:'; + @override + String get time => 'وقت:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$ur extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'فائل کا نام درج کریں۔'; + @override + String original({required Object original}) => 'اصل: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$ur extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'تاریخ صاف کریں'; + @override + String get content => 'کیا آپ واقعی پوری تاریخ حذف کرنا چاہتے ہیں؟'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$ur extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'لوکل نیٹ ورک کا سکین کرنے کی اجازت کے بغیر LocalSend، دیگر ڈیوائسز تلاش نہیں کرسکتا ہے۔ براہ کرم ترتیبات میں اس اجازت کو منظور کریں۔'; + @override + String get gotoSettings => 'ترتیبات'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$ur extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'پیغام ٹائپ کریں۔'; + @override + String get multiline => 'ملٹی لائن'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$ur extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'کوئی فائل منتخب نہیں کی گئی'; + @override + String get content => 'براہ کرم کم از کم ایک فائل منتخب کریں۔'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$ur extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'اجازت نہیں'; + @override + String get content => 'آپ نے ضروری اجازتیں فراہم نہیں کی ہیں۔ براہ کرم انہیں ترتیبات میں فراہم کریں۔'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$ur extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'دستیاب نہیں'; + @override + String get content => 'یہ خصوصیت صرف یہاں دستیاب ہے:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$ur extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR کوڈ'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$ur extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'فوری اقدامات'; + @override + String get counter => 'کاؤنٹر'; + @override + String get prefix => 'سابقہ'; + @override + String get padZero => 'زیرو کے ساتھ پیڈ'; + @override + String get sortBeforeCount => 'پہلے سے حروف تہجی کے مطابق ترتیب دیں۔'; + @override + String get random => 'بے ترتیب'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$ur extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => 'فائل کی درخواستیں خود بخود قبول ہو جاتی ہیں۔ آگاہ رہیں کہ مقامی نیٹ ورک میں موجود ہر کوئی آپ کو فائلیں بھیج سکتا ہے۔'; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$ur extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'PIN درج کریں'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$ur extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'بھیجنے کے انداز'; + @override + String get single => 'ایک ریسیور کو فائل بھیجتا ہے۔ بھیجتے وقت سلیکشن ختم ہوجائیگا۔'; + @override + String get multiple => 'اکثر متعدد ریسیورز کو فائل بھیجتا ہے۔ سلیکشن ختم نہیں ہوگا۔'; + @override + String get link => 'LocalSend نصب نہیں ہونے والے رسیورز منتخب شدہ فائلز کو لنک اپنے براؤزر میں کھولنے سے ڈاؤن لوڈ کر سکتے ہیں۔'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$ur extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$ur extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get system => 'سسٹم'; + @override + String get dark => 'اندھیرا'; + @override + String get light => 'روشنی'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$ur extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get system => 'نظام'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$ur extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String get system => 'سسٹم'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$ur extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$ur._(TranslationsUr root) : this._root = root, super.internal(root); + + final TranslationsUr _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'کل پیش رفت (${time})'; + @override + String get finishedError => 'غلطی کے ساتھ ختم'; + @override + String get canceledSender => 'بھیجنے والے کے ذریعے منسوخ کر دیا گیا۔'; + @override + String get canceledReceiver => 'وصول کنندہ کے ذریعے منسوخ کر دیا گیا۔'; +} diff --git a/app/lib/gen/strings_vi.g.dart b/app/lib/gen/strings_vi.g.dart new file mode 100644 index 0000000..3532704 --- /dev/null +++ b/app/lib/gen/strings_vi.g.dart @@ -0,0 +1,1413 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsVi extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsVi({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.vi, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsVi _root = this; // ignore: unused_field + + @override + TranslationsVi $copyWith({TranslationMetadata? meta}) => TranslationsVi(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => 'Tiếng Anh'; + @override + String get appName => 'LocalSend'; + @override + late final _Translations$general$vi general = _Translations$general$vi._(_root); + @override + late final _Translations$receiveTab$vi receiveTab = _Translations$receiveTab$vi._(_root); + @override + late final _Translations$sendTab$vi sendTab = _Translations$sendTab$vi._(_root); + @override + late final _Translations$settingsTab$vi settingsTab = _Translations$settingsTab$vi._(_root); + @override + late final _Translations$troubleshootPage$vi troubleshootPage = _Translations$troubleshootPage$vi._(_root); + @override + late final _Translations$receiveHistoryPage$vi receiveHistoryPage = _Translations$receiveHistoryPage$vi._(_root); + @override + late final _Translations$apkPickerPage$vi apkPickerPage = _Translations$apkPickerPage$vi._(_root); + @override + late final _Translations$selectedFilesPage$vi selectedFilesPage = _Translations$selectedFilesPage$vi._(_root); + @override + late final _Translations$receivePage$vi receivePage = _Translations$receivePage$vi._(_root); + @override + late final _Translations$receiveOptionsPage$vi receiveOptionsPage = _Translations$receiveOptionsPage$vi._(_root); + @override + late final _Translations$sendPage$vi sendPage = _Translations$sendPage$vi._(_root); + @override + late final _Translations$progressPage$vi progressPage = _Translations$progressPage$vi._(_root); + @override + late final _Translations$webSharePage$vi webSharePage = _Translations$webSharePage$vi._(_root); + @override + late final _Translations$aboutPage$vi aboutPage = _Translations$aboutPage$vi._(_root); + @override + late final _Translations$donationPage$vi donationPage = _Translations$donationPage$vi._(_root); + @override + late final _Translations$changelogPage$vi changelogPage = _Translations$changelogPage$vi._(_root); + @override + late final _Translations$dialogs$vi dialogs = _Translations$dialogs$vi._(_root); + @override + late final _Translations$sanitization$vi sanitization = _Translations$sanitization$vi._(_root); + @override + late final _Translations$tray$vi tray = _Translations$tray$vi._(_root); + @override + late final _Translations$web$vi web = _Translations$web$vi._(_root); + @override + late final _Translations$assetPicker$vi assetPicker = _Translations$assetPicker$vi._(_root); + @override + late final _Translations$networkInterfacesPage$vi networkInterfacesPage = _Translations$networkInterfacesPage$vi._(_root); +} + +// Path: general +class _Translations$general$vi extends Translations$general$en { + _Translations$general$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get accept => 'Đồng ý'; + @override + String get accepted => 'Đã đồng ý'; + @override + String get add => 'Thêm'; + @override + String get advanced => 'Nâng cao'; + @override + String get cancel => 'Thoát'; + @override + String get close => 'Đóng'; + @override + String get confirm => 'Xác nhận'; + @override + String get continueStr => 'Tiếp tục'; + @override + String get copy => 'Sao chép'; + @override + String get copiedToClipboard => 'Đã sao chép vào bộ nhớ tạm'; + @override + String get decline => 'Từ chối'; + @override + String get done => 'Hoàn thành'; + @override + String get delete => 'Xoá'; + @override + String get edit => 'Sửa'; + @override + String get error => 'Lỗi'; + @override + String get example => 'Ví dụ'; + @override + String get files => 'Tập tin'; + @override + String get finished => 'Đã xong'; + @override + String get hide => 'Ẩn'; + @override + String get off => 'Tắt'; + @override + String get offline => 'Ngoại tuyến'; + @override + String get on => 'Bật'; + @override + String get online => 'Trực tuyến'; + @override + String get open => 'Mở'; + @override + String get queue => 'Hàng chờ'; + @override + String get quickSave => 'Lưu nhanh'; + @override + String get quickSaveFromFavorites => 'Lưu nhanh cho "Yêu thích"'; + @override + String get renamed => 'Đã đổi tên'; + @override + String get reset => 'Thiết lập lại'; + @override + String get restart => 'Khởi động lại'; + @override + String get settings => 'Cài đặt'; + @override + String get skipped => 'Đã bỏ qua'; + @override + String get start => 'Bắt đầu'; + @override + String get stop => 'Dừng'; + @override + String get save => 'Lưu'; + @override + String get unchanged => 'Chưa thay đổi'; + @override + String get unknown => 'Không rõ'; + @override + String get noItemInClipboard => 'Không có gì trong bộ nhớ tạm.'; +} + +// Path: receiveTab +class _Translations$receiveTab$vi extends Translations$receiveTab$en { + _Translations$receiveTab$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nhận'; + @override + late final _Translations$receiveTab$infoBox$vi infoBox = _Translations$receiveTab$infoBox$vi._(_root); + @override + late final _Translations$receiveTab$quickSave$vi quickSave = _Translations$receiveTab$quickSave$vi._(_root); +} + +// Path: sendTab +class _Translations$sendTab$vi extends Translations$sendTab$en { + _Translations$sendTab$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Gửi'; + @override + late final _Translations$sendTab$selection$vi selection = _Translations$sendTab$selection$vi._(_root); + @override + late final _Translations$sendTab$picker$vi picker = _Translations$sendTab$picker$vi._(_root); + @override + String get shareIntentInfo => 'Bạn có thể dùng tính năng "Chia sẻ" trong điện thoại của bạn để lựa chọn các tập tin dễ dàng hơn.'; + @override + String get nearbyDevices => 'Thiết bị lân cận'; + @override + String get thisDevice => 'Thiết bị hiện tại'; + @override + String get scan => 'Tìm kiếm thiết bị'; + @override + String get manualSending => 'Gửi thủ công'; + @override + String get sendMode => 'Chế độ gửi'; + @override + late final _Translations$sendTab$sendModes$vi sendModes = _Translations$sendTab$sendModes$vi._(_root); + @override + String get sendModeHelp => 'Giải thích'; + @override + String get help => 'Vui lòng đảm bảo thiết bị gửi và nhận dùng chung mạng wifi.'; + @override + String get placeItems => 'Đặt các mục để chia sẻ.'; +} + +// Path: settingsTab +class _Translations$settingsTab$vi extends Translations$settingsTab$en { + _Translations$settingsTab$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Cài đặt'; + @override + late final _Translations$settingsTab$general$vi general = _Translations$settingsTab$general$vi._(_root); + @override + late final _Translations$settingsTab$receive$vi receive = _Translations$settingsTab$receive$vi._(_root); + @override + late final _Translations$settingsTab$send$vi send = _Translations$settingsTab$send$vi._(_root); + @override + late final _Translations$settingsTab$network$vi network = _Translations$settingsTab$network$vi._(_root); + @override + late final _Translations$settingsTab$other$vi other = _Translations$settingsTab$other$vi._(_root); + @override + String get advancedSettings => 'Cài đặt nâng cao'; +} + +// Path: troubleshootPage +class _Translations$troubleshootPage$vi extends Translations$troubleshootPage$en { + _Translations$troubleshootPage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Gỡ lỗi'; + @override + String get subTitle => 'Ứng dụng không hoạt động như dự kiến? Bạn có thể tìm giải pháp cho những vấn đề thường gặp tại đây.'; + @override + String get solution => 'Giải pháp:'; + @override + String get fixButton => 'Sửa lỗi tự động'; + @override + late final _Translations$troubleshootPage$firewall$vi firewall = _Translations$troubleshootPage$firewall$vi._(_root); + @override + late final _Translations$troubleshootPage$noDiscovery$vi noDiscovery = _Translations$troubleshootPage$noDiscovery$vi._(_root); + @override + late final _Translations$troubleshootPage$noConnection$vi noConnection = _Translations$troubleshootPage$noConnection$vi._(_root); +} + +// Path: receiveHistoryPage +class _Translations$receiveHistoryPage$vi extends Translations$receiveHistoryPage$en { + _Translations$receiveHistoryPage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lịch sử'; + @override + String get openFolder => 'Mở thư mục'; + @override + String get deleteHistory => 'Xoá lịch sử'; + @override + String get empty => 'Lịch sử rỗng.'; + @override + late final _Translations$receiveHistoryPage$entryActions$vi entryActions = _Translations$receiveHistoryPage$entryActions$vi._(_root); +} + +// Path: apkPickerPage +class _Translations$apkPickerPage$vi extends Translations$apkPickerPage$en { + _Translations$apkPickerPage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ứng dụng (APK)'; + @override + String get excludeSystemApps => 'Mở ứng dụng hệ thống'; + @override + String get excludeAppsWithoutLaunchIntent => 'Loại trừ các ứng dụng không thể khởi chạy'; + @override + String apps({required Object n}) => '${n} Ứng dụng'; +} + +// Path: selectedFilesPage +class _Translations$selectedFilesPage$vi extends Translations$selectedFilesPage$en { + _Translations$selectedFilesPage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => 'Xoá toàn bộ'; +} + +// Path: receivePage +class _Translations$receivePage$vi extends Translations$receivePage$en { + _Translations$receivePage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('vi'))( + n, + one: 'muốn gửi cho bạn một tập tin', + other: 'muốn gửi cho bạn ${n} tập tin', + ); + @override + String get subTitleMessage => 'đã gửi cho bạn một tin nhắn:'; + @override + String get subTitleLink => 'đã gửi cho bạn một liên kết:'; + @override + String get canceled => 'Người gửi đã xoá yêu cầu.'; +} + +// Path: receiveOptionsPage +class _Translations$receiveOptionsPage$vi extends Translations$receiveOptionsPage$en { + _Translations$receiveOptionsPage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Tuỳ chọn'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(Thư mục LocalSend)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => 'Đã tự động tắt vì là thư mục.'; +} + +// Path: sendPage +class _Translations$sendPage$vi extends Translations$sendPage$en { + _Translations$sendPage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get waiting => 'Đang chờ phản hồi…'; + @override + String get rejected => 'Người nhận đã từ chối yêu cầu.'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => 'Người nhận đang bận xử lý một yêu cầu khác.'; +} + +// Path: progressPage +class _Translations$progressPage$vi extends Translations$progressPage$en { + _Translations$progressPage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get titleSending => 'Đang gửi tập tin'; + @override + String get titleReceiving => 'Đang nhận tập tin'; + @override + String get savedToGallery => 'Đã lưu vào Ảnh'; + @override + late final _Translations$progressPage$total$vi total = _Translations$progressPage$total$vi._(_root); +} + +// Path: webSharePage +class _Translations$webSharePage$vi extends Translations$webSharePage$en { + _Translations$webSharePage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Chia sẻ qua liên kết'; + @override + String get loading => 'Đang khởi tạo server…'; + @override + String get stopping => 'Đang dừng server…'; + @override + String get error => 'Một lỗi đã xảy ra khi khởi tạo server.'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('vi'))( + n, + one: 'Mở liên kết trong trình duyệt:', + other: 'Mở một trong các liên kết với trình duyệt:', + ); + @override + String get requests => 'Yêu cầu'; + @override + String get noRequests => 'Hiện không có yêu cầu nào.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => 'Tự động chấp nhận yêu cầu'; + @override + String get requirePin => 'Cần cung cấp mã PIN'; + @override + String pinHint({required Object pin}) => 'Mã PIN là "${pin}"'; + @override + String get encryptionHint => 'LocalSend dùng chứng chỉ tự tạo. Bạn cần chấp thuận trong trình duyệt.'; + @override + String pendingRequests({required Object n}) => 'Yêu cầu chờ: ${n}'; +} + +// Path: aboutPage +class _Translations$aboutPage$vi extends Translations$aboutPage$en { + _Translations$aboutPage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Thông tin về LocalSend'; + @override + List get description => [ + 'LocalSend là một phần mềm miễn phí mã nguồn mở, giúp bạn chia sẻ tập tin cũng như tin nhắn đến các thiết bị phụ cận một cách bảo mật thông qua mạng nội bộ mà không cần kết nối mạng đến bên ngoài.', + 'Ứng dụng có trên Android, iOS, macOS, Windows và Linux. Bạn có thể tìm thấy các tuỳ chọn tải ở trang chủ.', + ]; + @override + String get author => 'Tác giả'; + @override + String get contributors => 'Người đóng góp'; + @override + String get packagers => 'Người đóng gói'; + @override + String get translators => 'Người dịch'; +} + +// Path: donationPage +class _Translations$donationPage$vi extends Translations$donationPage$en { + _Translations$donationPage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Ủng hộ'; + @override + String get info => + 'LocalSend là ứng dụng miễn phí, mã nguồn mở, không chứa quảng cáo. Nếu bạn yêu thích ứng dụng này, bạn có thể hỗ trợ việc phát triển bằng việc ủng hộ.'; + @override + String donate({required Object amount}) => 'Ủng hộ ${amount}'; + @override + String get thanks => 'Xin chân thành cảm ơn!'; + @override + String get restore => 'Khôi phục lịch sử ủng hộ'; +} + +// Path: changelogPage +class _Translations$changelogPage$vi extends Translations$changelogPage$en { + _Translations$changelogPage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lịch sử thay đổi'; +} + +// Path: dialogs +class _Translations$dialogs$vi extends Translations$dialogs$en { + _Translations$dialogs$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + late final _Translations$dialogs$addFile$vi addFile = _Translations$dialogs$addFile$vi._(_root); + @override + late final _Translations$dialogs$openFile$vi openFile = _Translations$dialogs$openFile$vi._(_root); + @override + late final _Translations$dialogs$addressInput$vi addressInput = _Translations$dialogs$addressInput$vi._(_root); + @override + late final _Translations$dialogs$cancelSession$vi cancelSession = _Translations$dialogs$cancelSession$vi._(_root); + @override + late final _Translations$dialogs$cannotOpenFile$vi cannotOpenFile = _Translations$dialogs$cannotOpenFile$vi._(_root); + @override + late final _Translations$dialogs$encryptionDisabledNotice$vi encryptionDisabledNotice = _Translations$dialogs$encryptionDisabledNotice$vi._(_root); + @override + late final _Translations$dialogs$errorDialog$vi errorDialog = _Translations$dialogs$errorDialog$vi._(_root); + @override + late final _Translations$dialogs$favoriteDialog$vi favoriteDialog = _Translations$dialogs$favoriteDialog$vi._(_root); + @override + late final _Translations$dialogs$favoriteDeleteDialog$vi favoriteDeleteDialog = _Translations$dialogs$favoriteDeleteDialog$vi._(_root); + @override + late final _Translations$dialogs$favoriteEditDialog$vi favoriteEditDialog = _Translations$dialogs$favoriteEditDialog$vi._(_root); + @override + late final _Translations$dialogs$fileInfo$vi fileInfo = _Translations$dialogs$fileInfo$vi._(_root); + @override + late final _Translations$dialogs$fileNameInput$vi fileNameInput = _Translations$dialogs$fileNameInput$vi._(_root); + @override + late final _Translations$dialogs$historyClearDialog$vi historyClearDialog = _Translations$dialogs$historyClearDialog$vi._(_root); + @override + late final _Translations$dialogs$localNetworkUnauthorized$vi localNetworkUnauthorized = _Translations$dialogs$localNetworkUnauthorized$vi._(_root); + @override + late final _Translations$dialogs$messageInput$vi messageInput = _Translations$dialogs$messageInput$vi._(_root); + @override + late final _Translations$dialogs$noFiles$vi noFiles = _Translations$dialogs$noFiles$vi._(_root); + @override + late final _Translations$dialogs$noPermission$vi noPermission = _Translations$dialogs$noPermission$vi._(_root); + @override + late final _Translations$dialogs$notAvailableOnPlatform$vi notAvailableOnPlatform = _Translations$dialogs$notAvailableOnPlatform$vi._(_root); + @override + late final _Translations$dialogs$qr$vi qr = _Translations$dialogs$qr$vi._(_root); + @override + late final _Translations$dialogs$quickActions$vi quickActions = _Translations$dialogs$quickActions$vi._(_root); + @override + late final _Translations$dialogs$quickSaveNotice$vi quickSaveNotice = _Translations$dialogs$quickSaveNotice$vi._(_root); + @override + late final _Translations$dialogs$quickSaveFromFavoritesNotice$vi quickSaveFromFavoritesNotice = + _Translations$dialogs$quickSaveFromFavoritesNotice$vi._(_root); + @override + late final _Translations$dialogs$pin$vi pin = _Translations$dialogs$pin$vi._(_root); + @override + late final _Translations$dialogs$sendModeHelp$vi sendModeHelp = _Translations$dialogs$sendModeHelp$vi._(_root); + @override + late final _Translations$dialogs$zoom$vi zoom = _Translations$dialogs$zoom$vi._(_root); +} + +// Path: sanitization +class _Translations$sanitization$vi extends Translations$sanitization$en { + _Translations$sanitization$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get empty => 'Tên tập tin không được để trống'; + @override + String get invalid => 'Tên tập tin chứa ký tự không hợp lệ'; +} + +// Path: tray +class _Translations$tray$vi extends Translations$tray$en { + _Translations$tray$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => 'Đóng LocalSend'; + @override + String get closeWindows => 'Thoát'; +} + +// Path: web +class _Translations$web$vi extends Translations$web$en { + _Translations$web$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => 'Nhập mã PIN'; + @override + String get invalidPin => 'Sai mã PIN'; + @override + String get tooManyAttempts => 'Sai quá nhiều'; + @override + String get rejected => 'Đã từ chối'; + @override + String get files => 'Tập tin'; + @override + String get fileName => 'Tên'; + @override + String get size => 'Kích thước'; +} + +// Path: assetPicker +class _Translations$assetPicker$vi extends Translations$assetPicker$en { + _Translations$assetPicker$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get confirm => 'Xác nhận'; + @override + String get cancel => 'Thoát'; + @override + String get edit => 'Sửa'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => 'Tải lỗi'; + @override + String get original => 'Gốc'; + @override + String get preview => 'Xem trước'; + @override + String get select => 'Chọn'; + @override + String get emptyList => 'Danh sách trống'; + @override + String get unSupportedAssetType => 'Định dạng tập tin không được hỗ trợ.'; + @override + String get unableToAccessAll => 'Không thể truy cập tới tất cả tập tin trong thiết bị'; + @override + String get viewingLimitedAssetsTip => 'Chỉ hiển thị các tập tin và album mà ứng dụng có thể truy cập.'; + @override + String get changeAccessibleLimitedAssets => 'Ấn để cập nhận các tập tin có thể truy cập.'; + @override + String get accessAllTip => + 'Ứng dụng chỉ có thể truy cập một số tập tin trong thiết bị. Hãy vào cài đặt hệ thống để chấp thuận ứng dụng có thể truy cập tất cả media trong thiết bị.'; + @override + String get goToSystemSettings => 'Truy cập cài đặt hệ thống'; + @override + String get accessLimitedAssets => 'Tiếp tục với truy cập bị giới hạn'; + @override + String get accessiblePathName => 'Các tập tin có thể truy cập'; + @override + String get sTypeAudioLabel => 'Audio'; + @override + String get sTypeImageLabel => 'Ảnh'; + @override + String get sTypeVideoLabel => 'Video'; + @override + String get sTypeOtherLabel => 'Media khác'; + @override + String get sActionPlayHint => 'mở'; + @override + String get sActionPreviewHint => 'xem trước'; + @override + String get sActionSelectHint => 'chọn'; + @override + String get sActionSwitchPathLabel => 'đổi đường dẫn'; + @override + String get sActionUseCameraHint => 'dùng camera'; + @override + String get sNameDurationLabel => 'thời lượng'; + @override + String get sUnitAssetCountLabel => 'đếm'; +} + +// Path: networkInterfacesPage +class _Translations$networkInterfacesPage$vi extends Translations$networkInterfacesPage$en { + _Translations$networkInterfacesPage$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get info => + 'LocalSend mặc định sử dụng tất cả các giao diện mạng có sẵn. Bạn có thể loại trừ các mạng không mong muốn tại đây. Bạn cần khởi động lại server để áp dụng các thay đổi.'; + @override + String get title => 'Card mạng'; + @override + String get preview => 'Xem trước'; + @override + String get whitelist => 'Cho phép'; + @override + String get blacklist => 'Chặn'; +} + +// Path: receiveTab.infoBox +class _Translations$receiveTab$infoBox$vi extends Translations$receiveTab$infoBox$en { + _Translations$receiveTab$infoBox$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => 'Biệt danh:'; +} + +// Path: receiveTab.quickSave +class _Translations$receiveTab$quickSave$vi extends Translations$receiveTab$quickSave$en { + _Translations$receiveTab$quickSave$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => 'Yêu thích'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class _Translations$sendTab$selection$vi extends Translations$sendTab$selection$en { + _Translations$sendTab$selection$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Lựa chọn'; + @override + String files({required Object files}) => 'Tập tin: ${files}'; + @override + String size({required Object size}) => 'Kích thước: ${size}'; +} + +// Path: sendTab.picker +class _Translations$sendTab$picker$vi extends Translations$sendTab$picker$en { + _Translations$sendTab$picker$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get file => 'Tập tin'; + @override + String get folder => 'Thư mục'; + @override + String get media => 'Media'; + @override + String get text => 'Văn bản'; + @override + String get app => 'Ứng dụng'; + @override + String get clipboard => 'Dán'; +} + +// Path: sendTab.sendModes +class _Translations$sendTab$sendModes$vi extends Translations$sendTab$sendModes$en { + _Translations$sendTab$sendModes$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get single => 'Một người nhận'; + @override + String get multiple => 'Nhiều người nhận'; + @override + String get link => 'Chia sẻ liên kết'; +} + +// Path: settingsTab.general +class _Translations$settingsTab$general$vi extends Translations$settingsTab$general$en { + _Translations$settingsTab$general$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Chung'; + @override + String get brightness => 'Chủ đề'; + @override + late final _Translations$settingsTab$general$brightnessOptions$vi brightnessOptions = _Translations$settingsTab$general$brightnessOptions$vi._( + _root, + ); + @override + String get color => 'Màu sắc'; + @override + late final _Translations$settingsTab$general$colorOptions$vi colorOptions = _Translations$settingsTab$general$colorOptions$vi._(_root); + @override + String get language => 'Ngôn ngữ'; + @override + late final _Translations$settingsTab$general$languageOptions$vi languageOptions = _Translations$settingsTab$general$languageOptions$vi._(_root); + @override + String get saveWindowPlacement => 'Thoát: Lưu vị trí cửa sổ hiển thị'; + @override + String get saveWindowPlacementWindows => 'Lưu vị trí cửa sổ sau khi thoát ứng dụng'; + @override + String get minimizeToTray => 'Thoát: Ẩn xuống thanh tác vụ'; + @override + String get launchAtStartup => 'Tự khởi động sau khi đăng nhập'; + @override + String get launchMinimized => 'Tự khởi động: Khởi động ẩn'; + @override + String get showInContextMenu => 'Hiển thị LocalSend ở danh mục'; + @override + String get animations => 'Hoạt ảnh'; +} + +// Path: settingsTab.receive +class _Translations$settingsTab$receive$vi extends Translations$settingsTab$receive$en { + _Translations$settingsTab$receive$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nhận'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => 'Tự động hoàn thành'; + @override + String get destination => 'Đích đến'; + @override + String get downloads => '(Downloads)'; + @override + String get saveToGallery => 'Lưu media vào thư viện'; + @override + String get saveToHistory => 'Lưu vào lịch sử'; +} + +// Path: settingsTab.send +class _Translations$settingsTab$send$vi extends Translations$settingsTab$send$en { + _Translations$settingsTab$send$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Gửi'; + @override + String get shareViaLinkAutoAccept => 'Chia sẻ qua liên kết: Tự động chấp nhận'; +} + +// Path: settingsTab.network +class _Translations$settingsTab$network$vi extends Translations$settingsTab$network$en { + _Translations$settingsTab$network$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mạng'; + @override + String get needRestart => 'Khởi động lại server để cài đặt có hiệu lực!'; + @override + String get server => 'Server'; + @override + String get alias => 'Biệt danh'; + @override + String get deviceType => 'Loại thiết bị'; + @override + String get deviceModel => 'Model thiết bị'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => 'Hết thời gian tìm kiếm'; + @override + String get useSystemName => 'Dùng tên hệ thống'; + @override + String get generateRandomAlias => 'Dùng bí danh ngẫu nhiên'; + @override + String portWarning({required Object defaultPort}) => + 'Các thiết bị khác có thể không nhận diện được thiết bị của bạn, vì bạn đang dùng port tuỳ chỉnh. (mặc định: ${defaultPort})'; + @override + String get encryption => 'Mã hoá'; + @override + String get multicastGroup => 'Đa phương tiện'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => + 'Các thiết bị khác có thể không nhận diện được thiết bị của bạn, vì bạn đang dùng địa chỉ multicast tuỳ chỉnh. (mặc định: ${defaultMulticast})'; + @override + late final _Translations$settingsTab$network$networkOptions$vi networkOptions = _Translations$settingsTab$network$networkOptions$vi._(_root); + @override + String get network => 'Giao diện mạng'; +} + +// Path: settingsTab.other +class _Translations$settingsTab$other$vi extends Translations$settingsTab$other$en { + _Translations$settingsTab$other$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Khác'; + @override + String get support => 'Hỗ trợ LocalSend'; + @override + String get donate => 'Ủng hộ'; + @override + String get privacyPolicy => 'Chính sách bảo mật'; + @override + String get termsOfUse => 'Điều khoản sử dụng'; +} + +// Path: troubleshootPage.firewall +class _Translations$troubleshootPage$firewall$vi extends Translations$troubleshootPage$firewall$en { + _Translations$troubleshootPage$firewall$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Ứng dụng có thể gửi tập tin tới các thiết bị khác, nhưng các thiết bị khác không thể gửi tập tin đến thiết bị này.'; + @override + String solution({required Object port}) => + 'Có vẻ như đây là một vấn đề với tường lửa (firewall). Bạn có thể khắc phục bằng cách chấp thuận các kết nối đến (UDP và TCP) trên port ${port}.'; + @override + String get openFirewall => 'Mở tường lửa(Firewall)'; +} + +// Path: troubleshootPage.noDiscovery +class _Translations$troubleshootPage$noDiscovery$vi extends Translations$troubleshootPage$noDiscovery$en { + _Translations$troubleshootPage$noDiscovery$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Thiết bị này không thể tìm thấy thiết bị khác.'; + @override + String get solution => + 'Hãy đảm bảo rằng các thiết bị được kết nối với cùng một mạng Wi-Fi và dùng chung thiết lập (port, multicast address, encryption). Bạn có thể thử nhập địa chỉ IP của thiết bị đích đến. Nếu nó hoạt động, cân nhắc thêm thiết bị đó vào mục yêu thích. Thiết bị sẽ được nhận tự động trong những lần tìm kiếm trong tương lai.'; +} + +// Path: troubleshootPage.noConnection +class _Translations$troubleshootPage$noConnection$vi extends Translations$troubleshootPage$noConnection$en { + _Translations$troubleshootPage$noConnection$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get symptom => 'Cả hai thiết bị không thể nhận diện lẫn nhau cũng như không thể chia sẻ tập tin.'; + @override + String get solution => + 'Vấn đề tồn tại ở cả 2 thiết bị? Nếu thế, bạn cần chắc chắn rằng cả hai thiết bị đang dùng chung một mạng wifi với cùng thiết lập (port, địa chỉ multicast, mã hoá). Wifi có thể không cho các thiết bị giao tiếp với nhau. Trong trường hợp đó, bạn cần tìm trong thiết lập của router.'; +} + +// Path: receiveHistoryPage.entryActions +class _Translations$receiveHistoryPage$entryActions$vi extends Translations$receiveHistoryPage$entryActions$en { + _Translations$receiveHistoryPage$entryActions$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get open => 'Mở tập tin'; + @override + String get showInFolder => 'Hiển thị trong thư mục'; + @override + String get info => 'Thông tin'; + @override + String get deleteFromHistory => 'Xoá khỏi lịch sử'; +} + +// Path: progressPage.total +class _Translations$progressPage$total$vi extends Translations$progressPage$total$en { + _Translations$progressPage$total$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + late final _Translations$progressPage$total$title$vi title = _Translations$progressPage$total$title$vi._(_root); + @override + String count({required Object curr, required Object n}) => 'Tập tin: ${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => 'Kích thước: ${curr} / ${n}'; + @override + String speed({required Object speed}) => 'Tốc độ: ${speed}/s'; +} + +// Path: dialogs.addFile +class _Translations$dialogs$addFile$vi extends Translations$dialogs$addFile$en { + _Translations$dialogs$addFile$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Thêm vào lựa chọn'; + @override + String get content => 'Bạn muốn thêm mục nào?'; +} + +// Path: dialogs.openFile +class _Translations$dialogs$openFile$vi extends Translations$dialogs$openFile$en { + _Translations$dialogs$openFile$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mở tệp tin'; + @override + String get content => 'Bạn có muốn mở tập tin vừa nhận được không?'; +} + +// Path: dialogs.addressInput +class _Translations$dialogs$addressInput$vi extends Translations$dialogs$addressInput$en { + _Translations$dialogs$addressInput$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nhập địa chỉ'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'Địa chỉ IP'; + @override + String get recentlyUsed => 'Sử dụng gần đây: '; +} + +// Path: dialogs.cancelSession +class _Translations$dialogs$cancelSession$vi extends Translations$dialogs$cancelSession$en { + _Translations$dialogs$cancelSession$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Dừng gửi tập tin'; + @override + String get content => 'Bạn có thực sự muống dừng quá trình gửi tập tin?'; +} + +// Path: dialogs.cannotOpenFile +class _Translations$dialogs$cannotOpenFile$vi extends Translations$dialogs$cannotOpenFile$en { + _Translations$dialogs$cannotOpenFile$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Không thể mở tập tin'; + @override + String content({required Object file}) => 'Không thể mở "${file}". Có thể tập tin có thể đã bị di chuyển, đổi tên hoặc xoá?'; +} + +// Path: dialogs.encryptionDisabledNotice +class _Translations$dialogs$encryptionDisabledNotice$vi extends Translations$dialogs$encryptionDisabledNotice$en { + _Translations$dialogs$encryptionDisabledNotice$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mã hoá đã tắt'; + @override + String get content => 'Kết nối hiện đang hoạt động trên giao thức HTTP. Để dùng HTTPS, hãy bật mã hoá.'; +} + +// Path: dialogs.errorDialog +class _Translations$dialogs$errorDialog$vi extends Translations$dialogs$errorDialog$en { + _Translations$dialogs$errorDialog$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class _Translations$dialogs$favoriteDialog$vi extends Translations$dialogs$favoriteDialog$en { + _Translations$dialogs$favoriteDialog$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Yêu thích'; + @override + String get noFavorites => 'Hiện không có thiết bị yêu thích.'; + @override + String get addFavorite => 'Thêm'; +} + +// Path: dialogs.favoriteDeleteDialog +class _Translations$dialogs$favoriteDeleteDialog$vi extends Translations$dialogs$favoriteDeleteDialog$en { + _Translations$dialogs$favoriteDeleteDialog$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Xoá khỏi yêu thích'; + @override + String content({required Object name}) => 'Bạn có chắc chắn muốn xoá "${name}" khỏi yêu thích?'; +} + +// Path: dialogs.favoriteEditDialog +class _Translations$dialogs$favoriteEditDialog$vi extends Translations$dialogs$favoriteEditDialog$en { + _Translations$dialogs$favoriteEditDialog$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => 'Thêm vào yêu thích'; + @override + String get titleEdit => 'Điều chỉnh'; + @override + String get name => 'Biệt danh'; + @override + String get auto => '(tự động)'; + @override + String get ip => 'Địa chỉ IP'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class _Translations$dialogs$fileInfo$vi extends Translations$dialogs$fileInfo$en { + _Translations$dialogs$fileInfo$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Thông tin tập tin'; + @override + String get fileName => 'Tên:'; + @override + String get path => 'Đường dẫn:'; + @override + String get size => 'Kích thước:'; + @override + String get sender => 'Người gửi:'; + @override + String get time => 'Thời gian:'; +} + +// Path: dialogs.fileNameInput +class _Translations$dialogs$fileNameInput$vi extends Translations$dialogs$fileNameInput$en { + _Translations$dialogs$fileNameInput$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nhập tên'; + @override + String original({required Object original}) => 'Ban đầu: ${original}'; +} + +// Path: dialogs.historyClearDialog +class _Translations$dialogs$historyClearDialog$vi extends Translations$dialogs$historyClearDialog$en { + _Translations$dialogs$historyClearDialog$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Xoá lịch sử'; + @override + String get content => 'Bạn có chắc chắn muốn xoá toàn bộ lịch sử?'; +} + +// Path: dialogs.localNetworkUnauthorized +class _Translations$dialogs$localNetworkUnauthorized$vi extends Translations$dialogs$localNetworkUnauthorized$en { + _Translations$dialogs$localNetworkUnauthorized$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => + 'LocalSend không thể tìm kiếm thiết bị khác khi không được phép quét mạng nội bộ. Vui lòng trao quyền cho ứng dụng trong cài đặt.'; + @override + String get gotoSettings => 'Cài đặt'; +} + +// Path: dialogs.messageInput +class _Translations$dialogs$messageInput$vi extends Translations$dialogs$messageInput$en { + _Translations$dialogs$messageInput$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nhập tin nhắn'; + @override + String get multiline => 'Nhiều dòng'; +} + +// Path: dialogs.noFiles +class _Translations$dialogs$noFiles$vi extends Translations$dialogs$noFiles$en { + _Translations$dialogs$noFiles$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Không có tập tin nào được chọn'; + @override + String get content => 'Vui lòng chọn ít nhất một tập tin.'; +} + +// Path: dialogs.noPermission +class _Translations$dialogs$noPermission$vi extends Translations$dialogs$noPermission$en { + _Translations$dialogs$noPermission$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Chưa được trao quyền.'; + @override + String get content => 'Bạn chưa được trao quyền. Vui lòng trao quyền cho ứng dụng trong cài đặt.'; +} + +// Path: dialogs.notAvailableOnPlatform +class _Translations$dialogs$notAvailableOnPlatform$vi extends Translations$dialogs$notAvailableOnPlatform$en { + _Translations$dialogs$notAvailableOnPlatform$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Không khả dụng'; + @override + String get content => 'Tính năng chỉ có trên:'; +} + +// Path: dialogs.qr +class _Translations$dialogs$qr$vi extends Translations$dialogs$qr$en { + _Translations$dialogs$qr$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Mã QR'; +} + +// Path: dialogs.quickActions +class _Translations$dialogs$quickActions$vi extends Translations$dialogs$quickActions$en { + _Translations$dialogs$quickActions$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Thao Tác Nhanh'; + @override + String get counter => 'Bộ đếm'; + @override + String get prefix => 'Tiếp đầu ngữ'; + @override + String get padZero => 'Pad with zeros'; + @override + String get sortBeforeCount => 'Sắp xếp theo bảng chữ cái'; + @override + String get random => 'Ngẫu nhiên'; +} + +// Path: dialogs.quickSaveNotice +class _Translations$dialogs$quickSaveNotice$vi extends Translations$dialogs$quickSaveNotice$en { + _Translations$dialogs$quickSaveNotice$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => + 'Yêu cầu tập tin đã được chấp thuận tự động. Chú ý rằng bất kỳ ai dùng chung mạng nội bộ với bạn đều có thể gửi tập tin cho bạn.'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class _Translations$dialogs$quickSaveFromFavoritesNotice$vi extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + _Translations$dialogs$quickSaveFromFavoritesNotice$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + 'Yêu cầu sẽ được chấp thuận tự động nếu thiết bị nằm trong danh sách yêu thích.', + 'Lưu ý! Hiện tại, tính năng này không hoàn toàn an toàn, vì tin tặc có thể mạo danh thiết bị trong danh sách yêu thích và gửi tệp tin cho bạn mà không gặp trở ngại gì.', + 'Tuy nhiên, tính năng này vẫn an toàn hơn tự động chấp thuận tập tin từ tất cả người dùng chung mạng nội bộ.', + ]; +} + +// Path: dialogs.pin +class _Translations$dialogs$pin$vi extends Translations$dialogs$pin$en { + _Translations$dialogs$pin$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Nhập mã PIN'; +} + +// Path: dialogs.sendModeHelp +class _Translations$dialogs$sendModeHelp$vi extends Translations$dialogs$sendModeHelp$en { + _Translations$dialogs$sendModeHelp$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Chế độ gửi'; + @override + String get single => 'Gửi tập tin tới một người nhận. Lựa chọn sẽ được xoá sau khi quá trình gửi hoàn thành.'; + @override + String get multiple => 'Gửi tập tin tới nhiều người nhận. Lựa chọn sẽ không bị xoá.'; + @override + String get link => 'Người nhận chưa cài đặt LocalSend có thể nhận tập tin bằng cách mở liên kết trong trình duyệt.'; +} + +// Path: dialogs.zoom +class _Translations$dialogs$zoom$vi extends Translations$dialogs$zoom$en { + _Translations$dialogs$zoom$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get title => 'Đường dẫn'; +} + +// Path: settingsTab.general.brightnessOptions +class _Translations$settingsTab$general$brightnessOptions$vi extends Translations$settingsTab$general$brightnessOptions$en { + _Translations$settingsTab$general$brightnessOptions$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get system => 'Hệ thống'; + @override + String get dark => 'Tối'; + @override + String get light => 'Sáng'; +} + +// Path: settingsTab.general.colorOptions +class _Translations$settingsTab$general$colorOptions$vi extends Translations$settingsTab$general$colorOptions$en { + _Translations$settingsTab$general$colorOptions$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get system => 'Hệ thống'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class _Translations$settingsTab$general$languageOptions$vi extends Translations$settingsTab$general$languageOptions$en { + _Translations$settingsTab$general$languageOptions$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get system => 'Hệ thống'; +} + +// Path: settingsTab.network.networkOptions +class _Translations$settingsTab$network$networkOptions$vi extends Translations$settingsTab$network$networkOptions$en { + _Translations$settingsTab$network$networkOptions$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String get all => 'Tất cả'; + @override + String get filtered => 'Đã lọc'; +} + +// Path: progressPage.total.title +class _Translations$progressPage$total$title$vi extends Translations$progressPage$total$title$en { + _Translations$progressPage$total$title$vi._(TranslationsVi root) : this._root = root, super.internal(root); + + final TranslationsVi _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => 'Tổng tiến độ (${time})'; + @override + String get finishedError => 'Kết thúc với lỗi'; + @override + String get canceledSender => 'Đã huỷ bởi người gửi'; + @override + String get canceledReceiver => 'Đã huỷ bởi người nhận'; +} diff --git a/app/lib/gen/strings_zh_CN.g.dart b/app/lib/gen/strings_zh_CN.g.dart new file mode 100644 index 0000000..fbc58e1 --- /dev/null +++ b/app/lib/gen/strings_zh_CN.g.dart @@ -0,0 +1,1517 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsZhCn extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsZhCn({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.zhCn, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsZhCn _root = this; // ignore: unused_field + + @override + TranslationsZhCn $copyWith({TranslationMetadata? meta}) => TranslationsZhCn(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => '简体中文'; + @override + String get appName => 'LocalSend'; + @override + late final Translations$general$zh_CN general = Translations$general$zh_CN.internal(_root); + @override + late final Translations$receiveTab$zh_CN receiveTab = Translations$receiveTab$zh_CN.internal(_root); + @override + late final Translations$sendTab$zh_CN sendTab = Translations$sendTab$zh_CN.internal(_root); + @override + late final Translations$settingsTab$zh_CN settingsTab = Translations$settingsTab$zh_CN.internal(_root); + @override + late final Translations$troubleshootPage$zh_CN troubleshootPage = Translations$troubleshootPage$zh_CN.internal(_root); + @override + late final Translations$receiveHistoryPage$zh_CN receiveHistoryPage = Translations$receiveHistoryPage$zh_CN.internal(_root); + @override + late final Translations$apkPickerPage$zh_CN apkPickerPage = Translations$apkPickerPage$zh_CN.internal(_root); + @override + late final Translations$selectedFilesPage$zh_CN selectedFilesPage = Translations$selectedFilesPage$zh_CN.internal(_root); + @override + late final Translations$receivePage$zh_CN receivePage = Translations$receivePage$zh_CN.internal(_root); + @override + late final Translations$receiveOptionsPage$zh_CN receiveOptionsPage = Translations$receiveOptionsPage$zh_CN.internal(_root); + @override + late final Translations$sendPage$zh_CN sendPage = Translations$sendPage$zh_CN.internal(_root); + @override + late final Translations$progressPage$zh_CN progressPage = Translations$progressPage$zh_CN.internal(_root); + @override + late final Translations$webSharePage$zh_CN webSharePage = Translations$webSharePage$zh_CN.internal(_root); + @override + late final Translations$aboutPage$zh_CN aboutPage = Translations$aboutPage$zh_CN.internal(_root); + @override + late final Translations$donationPage$zh_CN donationPage = Translations$donationPage$zh_CN.internal(_root); + @override + late final Translations$changelogPage$zh_CN changelogPage = Translations$changelogPage$zh_CN.internal(_root); + @override + late final Translations$aliasGenerator$zh_CN aliasGenerator = Translations$aliasGenerator$zh_CN.internal(_root); + @override + late final Translations$dialogs$zh_CN dialogs = Translations$dialogs$zh_CN.internal(_root); + @override + late final Translations$sanitization$zh_CN sanitization = Translations$sanitization$zh_CN.internal(_root); + @override + late final Translations$tray$zh_CN tray = Translations$tray$zh_CN.internal(_root); + @override + late final Translations$web$zh_CN web = Translations$web$zh_CN.internal(_root); + @override + late final Translations$assetPicker$zh_CN assetPicker = Translations$assetPicker$zh_CN.internal(_root); + @override + late final Translations$networkInterfacesPage$zh_CN networkInterfacesPage = Translations$networkInterfacesPage$zh_CN.internal(_root); +} + +// Path: general +class Translations$general$zh_CN extends Translations$general$en { + Translations$general$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get accept => '接受'; + @override + String get accepted => '已接受'; + @override + String get add => '添加'; + @override + String get advanced => '高级'; + @override + String get cancel => '取消'; + @override + String get close => '关闭'; + @override + String get confirm => '确认'; + @override + String get continueStr => '继续'; + @override + String get copy => '复制'; + @override + String get copiedToClipboard => '已复制到剪贴板'; + @override + String get decline => '拒绝'; + @override + String get done => '完成'; + @override + String get delete => '删除'; + @override + String get edit => '编辑'; + @override + String get error => '错误'; + @override + String get example => '示例'; + @override + String get files => '文件'; + @override + String get finished => '已完成'; + @override + String get hide => '隐藏'; + @override + String get off => '关'; + @override + String get offline => '离线'; + @override + String get on => '开'; + @override + String get online => '在线'; + @override + String get open => '打开'; + @override + String get queue => '队列'; + @override + String get quickSave => '自动保存'; + @override + String get quickSaveFromFavorites => '自动保存来自“收藏夹(白名单)”设备的文件'; + @override + String get renamed => '重命名成功'; + @override + String get reset => '重置'; + @override + String get restart => '重启'; + @override + String get settings => '设置'; + @override + String get skipped => '已跳过'; + @override + String get start => '开始'; + @override + String get stop => '停止'; + @override + String get save => '保存'; + @override + String get unchanged => '未更改'; + @override + String get unknown => '未知'; + @override + String get noItemInClipboard => '剪贴板为空'; +} + +// Path: receiveTab +class Translations$receiveTab$zh_CN extends Translations$receiveTab$en { + Translations$receiveTab$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '接收'; + @override + late final Translations$receiveTab$infoBox$zh_CN infoBox = Translations$receiveTab$infoBox$zh_CN.internal(_root); + @override + late final Translations$receiveTab$quickSave$zh_CN quickSave = Translations$receiveTab$quickSave$zh_CN.internal(_root); +} + +// Path: sendTab +class Translations$sendTab$zh_CN extends Translations$sendTab$en { + Translations$sendTab$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '发送'; + @override + late final Translations$sendTab$selection$zh_CN selection = Translations$sendTab$selection$zh_CN.internal(_root); + @override + late final Translations$sendTab$picker$zh_CN picker = Translations$sendTab$picker$zh_CN.internal(_root); + @override + String get shareIntentInfo => '你也可以通过移动设备中的“分享”功能更简单地发送文件。'; + @override + String get nearbyDevices => '附近的设备'; + @override + String get thisDevice => '这台设备'; + @override + String get scan => '扫描设备'; + @override + String get manualSending => '手动发送'; + @override + String get sendMode => '发送模式'; + @override + late final Translations$sendTab$sendModes$zh_CN sendModes = Translations$sendTab$sendModes$zh_CN.internal(_root); + @override + String get sendModeHelp => '提示'; + @override + String get help => '请确保目标连接到同一个 Wi‑Fi 网络。'; + @override + String get placeItems => '列出要分享的项目。'; +} + +// Path: settingsTab +class Translations$settingsTab$zh_CN extends Translations$settingsTab$en { + Translations$settingsTab$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '设置'; + @override + late final Translations$settingsTab$general$zh_CN general = Translations$settingsTab$general$zh_CN.internal(_root); + @override + late final Translations$settingsTab$receive$zh_CN receive = Translations$settingsTab$receive$zh_CN.internal(_root); + @override + late final Translations$settingsTab$send$zh_CN send = Translations$settingsTab$send$zh_CN.internal(_root); + @override + late final Translations$settingsTab$network$zh_CN network = Translations$settingsTab$network$zh_CN.internal(_root); + @override + late final Translations$settingsTab$other$zh_CN other = Translations$settingsTab$other$zh_CN.internal(_root); + @override + String get advancedSettings => '高级设置'; +} + +// Path: troubleshootPage +class Translations$troubleshootPage$zh_CN extends Translations$troubleshootPage$en { + Translations$troubleshootPage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '故障排除'; + @override + String get subTitle => '应用没有按预期工作?您可以在这里找到常用解决方案。'; + @override + String get solution => '解决方案:'; + @override + String get fixButton => '自动修复'; + @override + late final Translations$troubleshootPage$firewall$zh_CN firewall = Translations$troubleshootPage$firewall$zh_CN.internal(_root); + @override + late final Translations$troubleshootPage$noDiscovery$zh_CN noDiscovery = Translations$troubleshootPage$noDiscovery$zh_CN.internal(_root); + @override + late final Translations$troubleshootPage$noConnection$zh_CN noConnection = Translations$troubleshootPage$noConnection$zh_CN.internal(_root); +} + +// Path: receiveHistoryPage +class Translations$receiveHistoryPage$zh_CN extends Translations$receiveHistoryPage$en { + Translations$receiveHistoryPage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '历史'; + @override + String get openFolder => '打开目录'; + @override + String get deleteHistory => '删除历史记录'; + @override + String get empty => '无历史记录。'; + @override + late final Translations$receiveHistoryPage$entryActions$zh_CN entryActions = Translations$receiveHistoryPage$entryActions$zh_CN.internal(_root); +} + +// Path: apkPickerPage +class Translations$apkPickerPage$zh_CN extends Translations$apkPickerPage$en { + Translations$apkPickerPage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '应用(APK)'; + @override + String get excludeSystemApps => '排除系统应用'; + @override + String get excludeAppsWithoutLaunchIntent => '排除无法启动的应用'; + @override + String apps({required Object n}) => '${n} 个应用'; +} + +// Path: selectedFilesPage +class Translations$selectedFilesPage$zh_CN extends Translations$selectedFilesPage$en { + Translations$selectedFilesPage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => '全部删除'; +} + +// Path: receivePage +class Translations$receivePage$zh_CN extends Translations$receivePage$en { + Translations$receivePage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))( + n, + one: '想要发送给你一个文件', + other: '想要发送给你 ${n} 个文件', + ); + @override + String get subTitleMessage => '发送给你了一条消息:'; + @override + String get subTitleLink => '发送给你了一个链接:'; + @override + String get canceled => '发送者取消了请求。'; +} + +// Path: receiveOptionsPage +class Translations$receiveOptionsPage$zh_CN extends Translations$receiveOptionsPage$en { + Translations$receiveOptionsPage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '设置'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend 文件夹)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => '由于分享内容中存在文件夹,已自动关闭。'; +} + +// Path: sendPage +class Translations$sendPage$zh_CN extends Translations$sendPage$en { + Translations$sendPage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get waiting => '等待响应中……'; + @override + String get rejected => '对方拒绝了请求。'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => '对方正在处理另一个请求。'; +} + +// Path: progressPage +class Translations$progressPage$zh_CN extends Translations$progressPage$en { + Translations$progressPage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get titleSending => '正在发送文件'; + @override + String get titleReceiving => '正在接收文件'; + @override + String get savedToGallery => '已保存到相册'; + @override + late final Translations$progressPage$total$zh_CN total = Translations$progressPage$total$zh_CN.internal(_root); + @override + late final Translations$progressPage$remainingTime$zh_CN remainingTime = Translations$progressPage$remainingTime$zh_CN.internal(_root); +} + +// Path: webSharePage +class Translations$webSharePage$zh_CN extends Translations$webSharePage$en { + Translations$webSharePage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '分享为链接'; + @override + String get loading => '正在启动服务器……'; + @override + String get stopping => '正在停止服务器……'; + @override + String get error => '在启动服务器过程中发生了错误。'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))( + n, + one: '在浏览器中打开链接:', + other: '在浏览器中打开其中一个链接:', + ); + @override + String get requests => '请求'; + @override + String get noRequests => '尚无请求。'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => '自动接受请求'; + @override + String get requirePin => '启用 PIN 密码'; + @override + String pinHint({required Object pin}) => 'PIN 为 “${pin}”'; + @override + String get encryptionHint => 'LocalSend 使用自签名证书。您需要在浏览器中允许它。'; + @override + String pendingRequests({required Object n}) => '待处理请求:${n}'; +} + +// Path: aboutPage +class Translations$aboutPage$zh_CN extends Translations$aboutPage$en { + Translations$aboutPage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '关于 LocalSend'; + @override + List get description => [ + 'LocalSend 是一款免费的开源应用程序,可让您通过本地网络与附近的设备安全地分享文件和信息,而无需互联网连接。', + '本程序可在 Android、iOS、macOS、Windows 和 Linux 上使用。您可以在官方主页找到所有下载选项。', + ]; + @override + String get author => '作者'; + @override + String get contributors => '贡献者'; + @override + String get packagers => '打包者'; + @override + String get translators => '翻译者'; +} + +// Path: donationPage +class Translations$donationPage$zh_CN extends Translations$donationPage$en { + Translations$donationPage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '捐赠'; + @override + String get info => 'LocalSend 免费、开源、无广告。如果您喜欢这款应用程序,可以捐款支持开发。'; + @override + String donate({required Object amount}) => '捐款 ${amount}'; + @override + String get thanks => '非常感谢您的支持!'; + @override + String get restore => '恢复购买'; +} + +// Path: changelogPage +class Translations$changelogPage$zh_CN extends Translations$changelogPage$en { + Translations$changelogPage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '更新日志'; +} + +// Path: aliasGenerator +class Translations$aliasGenerator$zh_CN extends Translations$aliasGenerator$en { + Translations$aliasGenerator$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + List get adjectives => [ + '迷人', + '美丽', + '巨大', + '明亮', + '干净', + '聪明', + '帅气', + '可爱', + '狡猾', + '坚定', + '有活力', + '高效', + '极好', + '快速', + '不错', + '新鲜', + '好', + '华丽', + '伟大', + '英俊', + '炽热', + '善良', + '诚实', + '神秘', + '整洁', + '开心', + '耐心', + '漂亮', + '强大', + '富有', + '秘密', + '聪明', + '稳固', + '特别', + '战略性', + '强大', + '整洁', + '智慧', + ]; + @override + List get fruits => [ + '苹果', + '鳄梨', + '香蕉', + '黑莓', + '蓝莓', + '西兰花', + '胡萝卜', + '樱桃', + '椰子', + '葡萄', + '柠檬', + '莴苣', + '芒果', + '甜瓜', + '蘑菇', + '洋葱', + '橙子', + '木瓜', + '桃子', + '梨', + '菠萝', + '土豆', + '南瓜', + '覆盆子', + '草莓', + '番茄', + ]; + @override + String combination({required Object adjective, required Object fruit}) => '${adjective}的${fruit}'; +} + +// Path: dialogs +class Translations$dialogs$zh_CN extends Translations$dialogs$en { + Translations$dialogs$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + late final Translations$dialogs$addFile$zh_CN addFile = Translations$dialogs$addFile$zh_CN.internal(_root); + @override + late final Translations$dialogs$openFile$zh_CN openFile = Translations$dialogs$openFile$zh_CN.internal(_root); + @override + late final Translations$dialogs$addressInput$zh_CN addressInput = Translations$dialogs$addressInput$zh_CN.internal(_root); + @override + late final Translations$dialogs$cancelSession$zh_CN cancelSession = Translations$dialogs$cancelSession$zh_CN.internal(_root); + @override + late final Translations$dialogs$cannotOpenFile$zh_CN cannotOpenFile = Translations$dialogs$cannotOpenFile$zh_CN.internal(_root); + @override + late final Translations$dialogs$encryptionDisabledNotice$zh_CN encryptionDisabledNotice = + Translations$dialogs$encryptionDisabledNotice$zh_CN.internal(_root); + @override + late final Translations$dialogs$errorDialog$zh_CN errorDialog = Translations$dialogs$errorDialog$zh_CN.internal(_root); + @override + late final Translations$dialogs$favoriteDialog$zh_CN favoriteDialog = Translations$dialogs$favoriteDialog$zh_CN.internal(_root); + @override + late final Translations$dialogs$favoriteDeleteDialog$zh_CN favoriteDeleteDialog = Translations$dialogs$favoriteDeleteDialog$zh_CN.internal(_root); + @override + late final Translations$dialogs$favoriteEditDialog$zh_CN favoriteEditDialog = Translations$dialogs$favoriteEditDialog$zh_CN.internal(_root); + @override + late final Translations$dialogs$fileInfo$zh_CN fileInfo = Translations$dialogs$fileInfo$zh_CN.internal(_root); + @override + late final Translations$dialogs$fileNameInput$zh_CN fileNameInput = Translations$dialogs$fileNameInput$zh_CN.internal(_root); + @override + late final Translations$dialogs$historyClearDialog$zh_CN historyClearDialog = Translations$dialogs$historyClearDialog$zh_CN.internal(_root); + @override + late final Translations$dialogs$localNetworkUnauthorized$zh_CN localNetworkUnauthorized = + Translations$dialogs$localNetworkUnauthorized$zh_CN.internal(_root); + @override + late final Translations$dialogs$messageInput$zh_CN messageInput = Translations$dialogs$messageInput$zh_CN.internal(_root); + @override + late final Translations$dialogs$noFiles$zh_CN noFiles = Translations$dialogs$noFiles$zh_CN.internal(_root); + @override + late final Translations$dialogs$noPermission$zh_CN noPermission = Translations$dialogs$noPermission$zh_CN.internal(_root); + @override + late final Translations$dialogs$notAvailableOnPlatform$zh_CN notAvailableOnPlatform = Translations$dialogs$notAvailableOnPlatform$zh_CN.internal( + _root, + ); + @override + late final Translations$dialogs$qr$zh_CN qr = Translations$dialogs$qr$zh_CN.internal(_root); + @override + late final Translations$dialogs$quickActions$zh_CN quickActions = Translations$dialogs$quickActions$zh_CN.internal(_root); + @override + late final Translations$dialogs$quickSaveNotice$zh_CN quickSaveNotice = Translations$dialogs$quickSaveNotice$zh_CN.internal(_root); + @override + late final Translations$dialogs$quickSaveFromFavoritesNotice$zh_CN quickSaveFromFavoritesNotice = + Translations$dialogs$quickSaveFromFavoritesNotice$zh_CN.internal(_root); + @override + late final Translations$dialogs$pin$zh_CN pin = Translations$dialogs$pin$zh_CN.internal(_root); + @override + late final Translations$dialogs$sendModeHelp$zh_CN sendModeHelp = Translations$dialogs$sendModeHelp$zh_CN.internal(_root); + @override + late final Translations$dialogs$zoom$zh_CN zoom = Translations$dialogs$zoom$zh_CN.internal(_root); +} + +// Path: sanitization +class Translations$sanitization$zh_CN extends Translations$sanitization$en { + Translations$sanitization$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get empty => '文件名不能为空'; + @override + String get invalid => '文件名包含无效字符'; +} + +// Path: tray +class Translations$tray$zh_CN extends Translations$tray$en { + Translations$tray$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => '退出 LocalSend'; + @override + String get closeWindows => '退出'; +} + +// Path: web +class Translations$web$zh_CN extends Translations$web$en { + Translations$web$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => '输入 PIN'; + @override + String get invalidPin => 'PIN 无效'; + @override + String get tooManyAttempts => '尝试次数过多'; + @override + String get rejected => '已拒绝'; + @override + String get files => '文件'; + @override + String get fileName => '文件名'; + @override + String get size => '大小'; +} + +// Path: assetPicker +class Translations$assetPicker$zh_CN extends Translations$assetPicker$en { + Translations$assetPicker$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get confirm => '确认'; + @override + String get cancel => '取消'; + @override + String get edit => '编辑'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => '加载失败'; + @override + String get original => '原文件'; + @override + String get preview => '预览'; + @override + String get select => '选择'; + @override + String get emptyList => '清空列表'; + @override + String get unSupportedAssetType => '不支持该文件格式'; + @override + String get unableToAccessAll => '无法访问设备上的所有文件'; + @override + String get viewingLimitedAssetsTip => '应用程序仅能查看您允许的文件和相册。'; + @override + String get changeAccessibleLimitedAssets => '点击以更改可访问文件范围'; + @override + String get accessAllTip => '应用程序只能访问设备上的部分文件,请转到系统设置并允许该应用访问设备上的所有媒体文件。'; + @override + String get goToSystemSettings => '转到系统设置'; + @override + String get accessLimitedAssets => '继续受限访问'; + @override + String get accessiblePathName => '可访问的文件'; + @override + String get sTypeAudioLabel => '音频'; + @override + String get sTypeImageLabel => '图片'; + @override + String get sTypeVideoLabel => '视频'; + @override + String get sTypeOtherLabel => '其他媒体文件'; + @override + String get sActionPlayHint => '播放'; + @override + String get sActionPreviewHint => '预览'; + @override + String get sActionSelectHint => '选择'; + @override + String get sActionSwitchPathLabel => '更改路径'; + @override + String get sActionUseCameraHint => '使用摄像头'; + @override + String get sNameDurationLabel => '时长'; + @override + String get sUnitAssetCountLabel => '计数'; +} + +// Path: networkInterfacesPage +class Translations$networkInterfacesPage$zh_CN extends Translations$networkInterfacesPage$en { + Translations$networkInterfacesPage$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '网络接口'; + @override + String get info => '默认情况下,LocalSend 使用所有可用的网络接口。您可以在此处排除不需要的网络接口。您需要重新启动服务器以应用更改。'; + @override + String get preview => '预览'; + @override + String get whitelist => '白名单'; + @override + String get blacklist => '黑名单'; +} + +// Path: receiveTab.infoBox +class Translations$receiveTab$infoBox$zh_CN extends Translations$receiveTab$infoBox$en { + Translations$receiveTab$infoBox$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => '端口:'; + @override + String get alias => '设备名称:'; +} + +// Path: receiveTab.quickSave +class Translations$receiveTab$quickSave$zh_CN extends Translations$receiveTab$quickSave$en { + Translations$receiveTab$quickSave$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => '收藏夹'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class Translations$sendTab$selection$zh_CN extends Translations$sendTab$selection$en { + Translations$sendTab$selection$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '选择'; + @override + String files({required Object files}) => '文件:${files}'; + @override + String size({required Object size}) => '大小:${size}'; +} + +// Path: sendTab.picker +class Translations$sendTab$picker$zh_CN extends Translations$sendTab$picker$en { + Translations$sendTab$picker$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get file => '文件'; + @override + String get folder => '文件夹'; + @override + String get media => '媒体'; + @override + String get text => '文本'; + @override + String get app => '应用'; + @override + String get clipboard => '剪贴板'; +} + +// Path: sendTab.sendModes +class Translations$sendTab$sendModes$zh_CN extends Translations$sendTab$sendModes$en { + Translations$sendTab$sendModes$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get single => '一个接收者'; + @override + String get multiple => '多个接收者'; + @override + String get link => '通过链接分享'; +} + +// Path: settingsTab.general +class Translations$settingsTab$general$zh_CN extends Translations$settingsTab$general$en { + Translations$settingsTab$general$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '通用'; + @override + String get brightness => '主题'; + @override + late final Translations$settingsTab$general$brightnessOptions$zh_CN brightnessOptions = + Translations$settingsTab$general$brightnessOptions$zh_CN.internal(_root); + @override + String get color => '颜色'; + @override + late final Translations$settingsTab$general$colorOptions$zh_CN colorOptions = Translations$settingsTab$general$colorOptions$zh_CN.internal(_root); + @override + String get language => '语言'; + @override + late final Translations$settingsTab$general$languageOptions$zh_CN languageOptions = Translations$settingsTab$general$languageOptions$zh_CN.internal( + _root, + ); + @override + String get saveWindowPlacement => '退出时保存窗口位置'; + @override + String get saveWindowPlacementWindows => '退出时保存窗口位置'; + @override + String get minimizeToTray => '关闭时最小化到系统托盘'; + @override + String get launchAtStartup => '登录系统后自动启动程序'; + @override + String get launchMinimized => '启动时最小化到任务栏'; + @override + String get showInContextMenu => '在“发送到...”文件菜单中显示 LocalSend'; + @override + String get animations => '动画效果'; +} + +// Path: settingsTab.receive +class Translations$settingsTab$receive$zh_CN extends Translations$settingsTab$receive$en { + Translations$settingsTab$receive$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '接收'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => '自动完成传输任务'; + @override + String get destination => '保存目录'; + @override + String get downloads => '(下载)'; + @override + String get saveToGallery => '保存到相册'; + @override + String get saveToHistory => '保存到历史记录'; +} + +// Path: settingsTab.send +class Translations$settingsTab$send$zh_CN extends Translations$settingsTab$send$en { + Translations$settingsTab$send$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '发送'; + @override + String get shareViaLinkAutoAccept => '通过链接分享:自动同意接收请求'; +} + +// Path: settingsTab.network +class Translations$settingsTab$network$zh_CN extends Translations$settingsTab$network$en { + Translations$settingsTab$network$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '网络'; + @override + String get needRestart => '重启服务器后生效!'; + @override + String get server => '服务器'; + @override + String get alias => '设备名称'; + @override + String get deviceType => '设备类型'; + @override + String get deviceModel => '设备型号'; + @override + String get port => '端口'; + @override + String get discoveryTimeout => '搜索设备超时'; + @override + String get useSystemName => '使用系统名称'; + @override + String get generateRandomAlias => '生成随机昵称'; + @override + String portWarning({required Object defaultPort}) => '由于正在使用自定义端口,你可能不会被其他设备检测到。(默认端口:${defaultPort})'; + @override + String get encryption => '加密'; + @override + String get multicastGroup => '多播'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => '由于正在使用自定义多播地址,你可能不会被其他设备检测到。(默认地址:${defaultMulticast})'; + @override + String get network => '网络'; + @override + late final Translations$settingsTab$network$networkOptions$zh_CN networkOptions = Translations$settingsTab$network$networkOptions$zh_CN.internal( + _root, + ); +} + +// Path: settingsTab.other +class Translations$settingsTab$other$zh_CN extends Translations$settingsTab$other$en { + Translations$settingsTab$other$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '其他'; + @override + String get support => '支持 LocalSend'; + @override + String get donate => '捐赠'; + @override + String get privacyPolicy => '隐私政策'; + @override + String get termsOfUse => '使用条款'; +} + +// Path: troubleshootPage.firewall +class Translations$troubleshootPage$firewall$zh_CN extends Translations$troubleshootPage$firewall$en { + Translations$troubleshootPage$firewall$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get symptom => '此设备可以发送文件至其他设备,但其它设备无法发送文件到此设备。'; + @override + String solution({required Object port}) => '这最可能是由防火墙规则设定引起的。你可以通过在端口 ${port} 上允许(UDP 和 TCP 的)传入请求来解决这个问题。'; + @override + String get openFirewall => '打开防火墙'; +} + +// Path: troubleshootPage.noDiscovery +class Translations$troubleshootPage$noDiscovery$zh_CN extends Translations$troubleshootPage$noDiscovery$en { + Translations$troubleshootPage$noDiscovery$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get symptom => '此设备未能发现其他设备。'; + @override + String get solution => '确保所有设备都处于同一个 Wi‑Fi 网络上,且共享相同的网络配置(端口、多播地址、加密选项)。您可以尝试手动输入目标设备的 IP 地址。如果起到了效果,请考虑将此设备添加到收藏夹中,以便将来可以自动发现。'; +} + +// Path: troubleshootPage.noConnection +class Translations$troubleshootPage$noConnection$zh_CN extends Translations$troubleshootPage$noConnection$en { + Translations$troubleshootPage$noConnection$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get symptom => '双方设备均无法发现对方或者分享文件。'; + @override + String get solution => '当问题发生在双方设备上时,请先确认双方设备处于同一个 Wi‑Fi 网络上,且共享相同的网络配置(端口、多播地址、加密选项)。若因 Wi‑Fi 不允许参与者间通信,那么请在路由器中关闭“接入点(AP)隔离”选项。'; +} + +// Path: receiveHistoryPage.entryActions +class Translations$receiveHistoryPage$entryActions$zh_CN extends Translations$receiveHistoryPage$entryActions$en { + Translations$receiveHistoryPage$entryActions$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get open => '打开文件'; + @override + String get showInFolder => '在文件管理器中显示'; + @override + String get info => '信息'; + @override + String get deleteFromHistory => '从历史记录中删除'; +} + +// Path: progressPage.total +class Translations$progressPage$total$zh_CN extends Translations$progressPage$total$en { + Translations$progressPage$total$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + late final Translations$progressPage$total$title$zh_CN title = Translations$progressPage$total$title$zh_CN.internal(_root); + @override + String count({required Object curr, required Object n}) => '文件:${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => '大小:${curr} / ${n}'; + @override + String speed({required Object speed}) => '速度:${speed}/s'; +} + +// Path: progressPage.remainingTime +class Translations$progressPage$remainingTime$zh_CN extends Translations$progressPage$remainingTime$en { + Translations$progressPage$remainingTime$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + + /// 使用'h'作为小时缩写,使用'm'作为分钟缩写 + @override + String hours({required Object h, required Object m}) => '${h}h ${m}m'; + + /// 使用'd'作为天缩写,使用'h'作为小时缩写,使用'm'作为分钟缩写 + @override + String days({required Object d, required Object h, required Object m}) => '${d}d ${h}h ${m}m'; + + @override + String seconds({required Object n, required Object ss}) => '${n}:${ss}'; + @override + String minutes({required Object n, required Object ss}) => '${n}:${ss}'; +} + +// Path: dialogs.addFile +class Translations$dialogs$addFile$zh_CN extends Translations$dialogs$addFile$en { + Translations$dialogs$addFile$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '添加文件'; + @override + String get content => '你想添加什么文件?'; +} + +// Path: dialogs.openFile +class Translations$dialogs$openFile$zh_CN extends Translations$dialogs$openFile$en { + Translations$dialogs$openFile$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '打开文件'; + @override + String get content => '您是否要打开接收的文件?'; +} + +// Path: dialogs.addressInput +class Translations$dialogs$addressInput$zh_CN extends Translations$dialogs$addressInput$en { + Translations$dialogs$addressInput$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '输入地址'; + @override + String get hashtag => '标签'; + @override + String get ip => 'IP 地址'; + @override + String get recentlyUsed => '最近使用: '; +} + +// Path: dialogs.cancelSession +class Translations$dialogs$cancelSession$zh_CN extends Translations$dialogs$cancelSession$en { + Translations$dialogs$cancelSession$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '取消文件传输'; + @override + String get content => '要取消文件传输吗?'; +} + +// Path: dialogs.cannotOpenFile +class Translations$dialogs$cannotOpenFile$zh_CN extends Translations$dialogs$cannotOpenFile$en { + Translations$dialogs$cannotOpenFile$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '无法打开文件'; + @override + String content({required Object file}) => '无法打开 “${file}”。这个文件是否已被移动、重命名或删除?'; +} + +// Path: dialogs.encryptionDisabledNotice +class Translations$dialogs$encryptionDisabledNotice$zh_CN extends Translations$dialogs$encryptionDisabledNotice$en { + Translations$dialogs$encryptionDisabledNotice$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '加密已关闭'; + @override + String get content => '正在通过未加密的 HTTP 协议连接。要使用 HTTPS 协议,请开启加密选项。'; +} + +// Path: dialogs.errorDialog +class Translations$dialogs$errorDialog$zh_CN extends Translations$dialogs$errorDialog$en { + Translations$dialogs$errorDialog$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class Translations$dialogs$favoriteDialog$zh_CN extends Translations$dialogs$favoriteDialog$en { + Translations$dialogs$favoriteDialog$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '收藏夹'; + @override + String get noFavorites => '还没有收藏的设备。'; + @override + String get addFavorite => '新建'; +} + +// Path: dialogs.favoriteDeleteDialog +class Translations$dialogs$favoriteDeleteDialog$zh_CN extends Translations$dialogs$favoriteDeleteDialog$en { + Translations$dialogs$favoriteDeleteDialog$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '删除收藏'; + @override + String content({required Object name}) => '确定要取消收藏 “${name}” 吗?'; +} + +// Path: dialogs.favoriteEditDialog +class Translations$dialogs$favoriteEditDialog$zh_CN extends Translations$dialogs$favoriteEditDialog$en { + Translations$dialogs$favoriteEditDialog$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => '添加到收藏夹'; + @override + String get titleEdit => '设置'; + @override + String get name => '名称'; + @override + String get auto => '(自动)'; + @override + String get ip => 'IP 地址'; + @override + String get port => '端口'; +} + +// Path: dialogs.fileInfo +class Translations$dialogs$fileInfo$zh_CN extends Translations$dialogs$fileInfo$en { + Translations$dialogs$fileInfo$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '文件信息'; + @override + String get fileName => '文件名:'; + @override + String get path => '路径:'; + @override + String get size => '大小:'; + @override + String get sender => '发送者:'; + @override + String get time => '时间:'; +} + +// Path: dialogs.fileNameInput +class Translations$dialogs$fileNameInput$zh_CN extends Translations$dialogs$fileNameInput$en { + Translations$dialogs$fileNameInput$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '输入文件名'; + @override + String original({required Object original}) => '原名:${original}'; +} + +// Path: dialogs.historyClearDialog +class Translations$dialogs$historyClearDialog$zh_CN extends Translations$dialogs$historyClearDialog$en { + Translations$dialogs$historyClearDialog$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '清空历史记录'; + @override + String get content => '确定要清空全部历史记录吗?'; +} + +// Path: dialogs.localNetworkUnauthorized +class Translations$dialogs$localNetworkUnauthorized$zh_CN extends Translations$dialogs$localNetworkUnauthorized$en { + Translations$dialogs$localNetworkUnauthorized$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => 'LocalSend 在没有扫描本地网络的权限的情况下无法找到其他设备。请在设置中授予此权限。'; + @override + String get gotoSettings => '设置'; +} + +// Path: dialogs.messageInput +class Translations$dialogs$messageInput$zh_CN extends Translations$dialogs$messageInput$en { + Translations$dialogs$messageInput$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '输入消息'; + @override + String get multiline => '多行'; +} + +// Path: dialogs.noFiles +class Translations$dialogs$noFiles$zh_CN extends Translations$dialogs$noFiles$en { + Translations$dialogs$noFiles$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '未选择文件'; + @override + String get content => '请至少选择一个文件。'; +} + +// Path: dialogs.noPermission +class Translations$dialogs$noPermission$zh_CN extends Translations$dialogs$noPermission$en { + Translations$dialogs$noPermission$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '没有权限'; + @override + String get content => '您尚未授予必要的权限。请在设置中授予权限。'; +} + +// Path: dialogs.notAvailableOnPlatform +class Translations$dialogs$notAvailableOnPlatform$zh_CN extends Translations$dialogs$notAvailableOnPlatform$en { + Translations$dialogs$notAvailableOnPlatform$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '不可用'; + @override + String get content => '此功能只在以下平台可用:'; +} + +// Path: dialogs.qr +class Translations$dialogs$qr$zh_CN extends Translations$dialogs$qr$en { + Translations$dialogs$qr$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '二维码'; +} + +// Path: dialogs.quickActions +class Translations$dialogs$quickActions$zh_CN extends Translations$dialogs$quickActions$en { + Translations$dialogs$quickActions$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '快速操作'; + @override + String get counter => '计数器'; + @override + String get prefix => '前缀'; + @override + String get padZero => '以零填充'; + @override + String get sortBeforeCount => '事先以字母顺序排序'; + @override + String get random => '随机'; +} + +// Path: dialogs.quickSaveNotice +class Translations$dialogs$quickSaveNotice$zh_CN extends Translations$dialogs$quickSaveNotice$en { + Translations$dialogs$quickSaveNotice$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => '自动接受所有文件传输请求。请注意,这会让此网络中的所有人都可以向你发送文件。'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class Translations$dialogs$quickSaveFromFavoritesNotice$zh_CN extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + Translations$dialogs$quickSaveFromFavoritesNotice$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + '当前会自动接受收藏夹中设备的文件请求。', + '警告:这目前并非绝对安全,知道您收藏夹列表中的设备指纹被黑客窃取,其仍可以向您发送文件。', + '但是,此选项比“允许任何设备”更安全。', + ]; +} + +// Path: dialogs.pin +class Translations$dialogs$pin$zh_CN extends Translations$dialogs$pin$en { + Translations$dialogs$pin$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '输入 PIN'; +} + +// Path: dialogs.sendModeHelp +class Translations$dialogs$sendModeHelp$zh_CN extends Translations$dialogs$sendModeHelp$en { + Translations$dialogs$sendModeHelp$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => '发送模式'; + @override + String get single => '发送文件给一个接收者。已选择的文件在发送后会取消选择。'; + @override + String get multiple => '发送文件给多个接收者。已选择的文件在发送后不会取消选择。'; + @override + String get link => '未安装 LocalSend 的接收者可以在浏览器中打开链接以下载选中的文件。'; +} + +// Path: dialogs.zoom +class Translations$dialogs$zoom$zh_CN extends Translations$dialogs$zoom$en { + Translations$dialogs$zoom$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get title => 'URL'; +} + +// Path: settingsTab.general.brightnessOptions +class Translations$settingsTab$general$brightnessOptions$zh_CN extends Translations$settingsTab$general$brightnessOptions$en { + Translations$settingsTab$general$brightnessOptions$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get system => '跟随系统'; + @override + String get dark => '深色'; + @override + String get light => '浅色'; +} + +// Path: settingsTab.general.colorOptions +class Translations$settingsTab$general$colorOptions$zh_CN extends Translations$settingsTab$general$colorOptions$en { + Translations$settingsTab$general$colorOptions$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get system => '跟随系统'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class Translations$settingsTab$general$languageOptions$zh_CN extends Translations$settingsTab$general$languageOptions$en { + Translations$settingsTab$general$languageOptions$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get system => '跟随系统'; +} + +// Path: settingsTab.network.networkOptions +class Translations$settingsTab$network$networkOptions$zh_CN extends Translations$settingsTab$network$networkOptions$en { + Translations$settingsTab$network$networkOptions$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String get all => '所有'; + @override + String get filtered => '已过滤'; +} + +// Path: progressPage.total.title +class Translations$progressPage$total$title$zh_CN extends Translations$progressPage$total$title$en { + Translations$progressPage$total$title$zh_CN.internal(TranslationsZhCn root) : this._root = root, super.internal(root); + + final TranslationsZhCn _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => '总进度 (${time})'; + @override + String get finishedError => '已完成,但发生错误'; + @override + String get canceledSender => '发送者已取消'; + @override + String get canceledReceiver => '接收者已取消'; +} diff --git a/app/lib/gen/strings_zh_HK.g.dart b/app/lib/gen/strings_zh_HK.g.dart new file mode 100644 index 0000000..4af4ba1 --- /dev/null +++ b/app/lib/gen/strings_zh_HK.g.dart @@ -0,0 +1,1411 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsZhHk extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsZhHk({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.zhHk, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsZhHk _root = this; // ignore: unused_field + + @override + TranslationsZhHk $copyWith({TranslationMetadata? meta}) => TranslationsZhHk(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => '繁體中文 (香港)'; + @override + String get appName => 'LocalSend'; + @override + late final Translations$general$zh_HK general = Translations$general$zh_HK.internal(_root); + @override + late final Translations$receiveTab$zh_HK receiveTab = Translations$receiveTab$zh_HK.internal(_root); + @override + late final Translations$sendTab$zh_HK sendTab = Translations$sendTab$zh_HK.internal(_root); + @override + late final Translations$settingsTab$zh_HK settingsTab = Translations$settingsTab$zh_HK.internal(_root); + @override + late final Translations$troubleshootPage$zh_HK troubleshootPage = Translations$troubleshootPage$zh_HK.internal(_root); + @override + late final Translations$receiveHistoryPage$zh_HK receiveHistoryPage = Translations$receiveHistoryPage$zh_HK.internal(_root); + @override + late final Translations$apkPickerPage$zh_HK apkPickerPage = Translations$apkPickerPage$zh_HK.internal(_root); + @override + late final Translations$selectedFilesPage$zh_HK selectedFilesPage = Translations$selectedFilesPage$zh_HK.internal(_root); + @override + late final Translations$receivePage$zh_HK receivePage = Translations$receivePage$zh_HK.internal(_root); + @override + late final Translations$receiveOptionsPage$zh_HK receiveOptionsPage = Translations$receiveOptionsPage$zh_HK.internal(_root); + @override + late final Translations$sendPage$zh_HK sendPage = Translations$sendPage$zh_HK.internal(_root); + @override + late final Translations$progressPage$zh_HK progressPage = Translations$progressPage$zh_HK.internal(_root); + @override + late final Translations$webSharePage$zh_HK webSharePage = Translations$webSharePage$zh_HK.internal(_root); + @override + late final Translations$aboutPage$zh_HK aboutPage = Translations$aboutPage$zh_HK.internal(_root); + @override + late final Translations$donationPage$zh_HK donationPage = Translations$donationPage$zh_HK.internal(_root); + @override + late final Translations$changelogPage$zh_HK changelogPage = Translations$changelogPage$zh_HK.internal(_root); + @override + late final Translations$dialogs$zh_HK dialogs = Translations$dialogs$zh_HK.internal(_root); + @override + late final Translations$sanitization$zh_HK sanitization = Translations$sanitization$zh_HK.internal(_root); + @override + late final Translations$tray$zh_HK tray = Translations$tray$zh_HK.internal(_root); + @override + late final Translations$web$zh_HK web = Translations$web$zh_HK.internal(_root); + @override + late final Translations$assetPicker$zh_HK assetPicker = Translations$assetPicker$zh_HK.internal(_root); + @override + late final Translations$networkInterfacesPage$zh_HK networkInterfacesPage = Translations$networkInterfacesPage$zh_HK.internal(_root); +} + +// Path: general +class Translations$general$zh_HK extends Translations$general$en { + Translations$general$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get accept => '接受'; + @override + String get accepted => '已接受'; + @override + String get add => '新增'; + @override + String get advanced => '更多資訊'; + @override + String get cancel => '取消'; + @override + String get close => '關閉'; + @override + String get confirm => '確認'; + @override + String get continueStr => '繼續'; + @override + String get copy => '複製'; + @override + String get copiedToClipboard => '已複製到剪貼簿'; + @override + String get decline => '拒絕'; + @override + String get done => '完成'; + @override + String get delete => '刪除'; + @override + String get edit => '編輯'; + @override + String get error => '錯誤'; + @override + String get example => '範例'; + @override + String get files => '檔案'; + @override + String get finished => '搞掂'; + @override + String get hide => '隱藏'; + @override + String get off => '閂'; + @override + String get offline => '離線'; + @override + String get on => '開'; + @override + String get online => '線上'; + @override + String get open => '開啟'; + @override + String get queue => '佇列'; + @override + String get quickSave => '自動儲存'; + @override + String get quickSaveFromFavorites => '自動儲存來自已收藏裝置嘅檔案'; + @override + String get renamed => '改咗名'; + @override + String get reset => '重設'; + @override + String get restart => '重新啟動'; + @override + String get settings => '設定'; + @override + String get skipped => '已跳過'; + @override + String get start => '開始'; + @override + String get stop => '停止'; + @override + String get save => '儲存'; + @override + String get unchanged => '冇改過'; + @override + String get unknown => '未知'; + @override + String get noItemInClipboard => '剪貼簿冇嘢.'; +} + +// Path: receiveTab +class Translations$receiveTab$zh_HK extends Translations$receiveTab$en { + Translations$receiveTab$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.settingsTab.receive.title; + @override + late final Translations$receiveTab$infoBox$zh_HK infoBox = Translations$receiveTab$infoBox$zh_HK.internal(_root); + @override + late final Translations$receiveTab$quickSave$zh_HK quickSave = Translations$receiveTab$quickSave$zh_HK.internal(_root); +} + +// Path: sendTab +class Translations$sendTab$zh_HK extends Translations$sendTab$en { + Translations$sendTab$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.settingsTab.send.title; + @override + late final Translations$sendTab$selection$zh_HK selection = Translations$sendTab$selection$zh_HK.internal(_root); + @override + late final Translations$sendTab$picker$zh_HK picker = Translations$sendTab$picker$zh_HK.internal(_root); + @override + String get shareIntentInfo => '用你裝置嘅「分享」功能以更方便揀選檔案。'; + @override + String get nearbyDevices => '附近裝置'; + @override + String get thisDevice => '此裝置'; + @override + String get scan => '掃描裝置'; + @override + String get manualSending => '手動傳送'; + @override + String get sendMode => '傳送模式'; + @override + late final Translations$sendTab$sendModes$zh_HK sendModes = Translations$sendTab$sendModes$zh_HK.internal(_root); + @override + String get sendModeHelp => '説明'; + @override + String get help => '請確保目標裝置駁緊同一個 Wi‑Fi 網路。'; + @override + String get placeItems => '將要分享嘅檔案拉過嚟呢度.'; +} + +// Path: settingsTab +class Translations$settingsTab$zh_HK extends Translations$settingsTab$en { + Translations$settingsTab$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.settings; + @override + late final Translations$settingsTab$general$zh_HK general = Translations$settingsTab$general$zh_HK.internal(_root); + @override + late final Translations$settingsTab$receive$zh_HK receive = Translations$settingsTab$receive$zh_HK.internal(_root); + @override + late final Translations$settingsTab$send$zh_HK send = Translations$settingsTab$send$zh_HK.internal(_root); + @override + late final Translations$settingsTab$network$zh_HK network = Translations$settingsTab$network$zh_HK.internal(_root); + @override + late final Translations$settingsTab$other$zh_HK other = Translations$settingsTab$other$zh_HK.internal(_root); + @override + String get advancedSettings => '進階設定'; +} + +// Path: troubleshootPage +class Translations$troubleshootPage$zh_HK extends Translations$troubleshootPage$en { + Translations$troubleshootPage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '疑難排解'; + @override + String get subTitle => '個 app 唔 work?你可以喺度揾到一啲常見問題嘅解決辦法。'; + @override + String get solution => '解決辦法:'; + @override + String get fixButton => '自動修復'; + @override + late final Translations$troubleshootPage$firewall$zh_HK firewall = Translations$troubleshootPage$firewall$zh_HK.internal(_root); + @override + late final Translations$troubleshootPage$noDiscovery$zh_HK noDiscovery = Translations$troubleshootPage$noDiscovery$zh_HK.internal(_root); + @override + late final Translations$troubleshootPage$noConnection$zh_HK noConnection = Translations$troubleshootPage$noConnection$zh_HK.internal(_root); +} + +// Path: receiveHistoryPage +class Translations$receiveHistoryPage$zh_HK extends Translations$receiveHistoryPage$en { + Translations$receiveHistoryPage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '歷史記錄'; + @override + String get openFolder => '開啟資料夾'; + @override + String get deleteHistory => '清除記錄'; + @override + String get empty => '得個吉噃 :(.'; + @override + late final Translations$receiveHistoryPage$entryActions$zh_HK entryActions = Translations$receiveHistoryPage$entryActions$zh_HK.internal(_root); +} + +// Path: apkPickerPage +class Translations$apkPickerPage$zh_HK extends Translations$apkPickerPage$en { + Translations$apkPickerPage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '應用程式(APK)'; + @override + String get excludeSystemApps => '排除系統應用程式'; + @override + String get excludeAppsWithoutLaunchIntent => '排除唔開得嘅應用程式'; + @override + String apps({required Object n}) => '${n} 個應用程式'; +} + +// Path: selectedFilesPage +class Translations$selectedFilesPage$zh_HK extends Translations$selectedFilesPage$en { + Translations$selectedFilesPage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => '全部刪除'; +} + +// Path: receivePage +class Translations$receivePage$zh_HK extends Translations$receivePage$en { + Translations$receivePage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))( + n, + one: '想 send 1 個檔案畀你', + other: '想 send ${n} 個檔案畀你', + ); + @override + String get subTitleMessage => 'send 咗條訊息畀你:'; + @override + String get subTitleLink => 'send 咗條 link 畀你:'; + @override + String get canceled => '對方取消咗個請求。'; +} + +// Path: receiveOptionsPage +class Translations$receiveOptionsPage$zh_HK extends Translations$receiveOptionsPage$en { + Translations$receiveOptionsPage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.settings; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend 資料夾)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => '因為有資料夾存在而自動閂咗.'; +} + +// Path: sendPage +class Translations$sendPage$zh_HK extends Translations$sendPage$en { + Translations$sendPage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get waiting => '等緊回應……'; + @override + String get rejected => '對方拒絕咗個請求。'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => '對方忙緊另一個請求。'; +} + +// Path: progressPage +class Translations$progressPage$zh_HK extends Translations$progressPage$en { + Translations$progressPage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get titleSending => '正在傳送檔案'; + @override + String get titleReceiving => '正在接收檔案'; + @override + String get savedToGallery => '成功 save 咗落相簿'; + @override + late final Translations$progressPage$total$zh_HK total = Translations$progressPage$total$zh_HK.internal(_root); +} + +// Path: webSharePage +class Translations$webSharePage$zh_HK extends Translations$webSharePage$en { + Translations$webSharePage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.sendTab.sendModes.link; + @override + String get loading => '開緊個 server……'; + @override + String get stopping => '閂緊個 server……'; + @override + String get error => '開 server 嗰陣發生錯誤。'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))( + n, + one: '喺瀏覽器開啟以下連結:', + other: '喺瀏覽器開啟以下任何一個連結:', + ); + @override + String get requests => '請求'; + @override + String get noRequests => '未有請求.'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => '自動接受請求'; + @override + String get requirePin => '需要密碼'; + @override + String pinHint({required Object pin}) => '密碼為「${pin}」'; + @override + String get encryptionHint => 'LocalSend 用嘅係自我簽署憑證。麻煩你喺瀏覽器度允許咗佢。'; + @override + String pendingRequests({required Object n}) => '仲有 ${n} 個請求未處理'; +} + +// Path: aboutPage +class Translations$aboutPage$zh_HK extends Translations$aboutPage$en { + Translations$aboutPage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '關於 LocalSend'; + @override + List get description => [ + 'LocalSend 係一款免費嘅開源應用程式,佢可以透過區域網路幫你安全噉將檔案同訊息分享畀附近嘅裝置,全程無需互聯網連線。', + '呢個 app 喺 Android、iOS、macOS、Windows 同 Linux 都用得㗎。你可以喺我哋嘅網站揾到呢個 app 所有平台嘅版本同其他下載方式。', + ]; + @override + String get author => '作者'; + @override + String get contributors => '貢獻者'; + @override + String get packagers => '封裝人員'; + @override + String get translators => '翻譯人員'; +} + +// Path: donationPage +class Translations$donationPage$zh_HK extends Translations$donationPage$en { + Translations$donationPage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.settingsTab.other.donate; + @override + String get info => 'LocalSend 唔單只免費、開源,仲係冇廣告添㗎!如果你鍾意呢個 app,不妨捐款贊助我哋開發.'; + @override + String donate({required Object amount}) => '捐 ${amount}'; + @override + String get thanks => '多謝支持!'; + @override + String get restore => '還原 app 內購買'; +} + +// Path: changelogPage +class Translations$changelogPage$zh_HK extends Translations$changelogPage$en { + Translations$changelogPage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '更新記錄'; +} + +// Path: dialogs +class Translations$dialogs$zh_HK extends Translations$dialogs$en { + Translations$dialogs$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + late final Translations$dialogs$addFile$zh_HK addFile = Translations$dialogs$addFile$zh_HK.internal(_root); + @override + late final Translations$dialogs$openFile$zh_HK openFile = Translations$dialogs$openFile$zh_HK.internal(_root); + @override + late final Translations$dialogs$addressInput$zh_HK addressInput = Translations$dialogs$addressInput$zh_HK.internal(_root); + @override + late final Translations$dialogs$cancelSession$zh_HK cancelSession = Translations$dialogs$cancelSession$zh_HK.internal(_root); + @override + late final Translations$dialogs$cannotOpenFile$zh_HK cannotOpenFile = Translations$dialogs$cannotOpenFile$zh_HK.internal(_root); + @override + late final Translations$dialogs$encryptionDisabledNotice$zh_HK encryptionDisabledNotice = + Translations$dialogs$encryptionDisabledNotice$zh_HK.internal(_root); + @override + late final Translations$dialogs$errorDialog$zh_HK errorDialog = Translations$dialogs$errorDialog$zh_HK.internal(_root); + @override + late final Translations$dialogs$favoriteDialog$zh_HK favoriteDialog = Translations$dialogs$favoriteDialog$zh_HK.internal(_root); + @override + late final Translations$dialogs$favoriteDeleteDialog$zh_HK favoriteDeleteDialog = Translations$dialogs$favoriteDeleteDialog$zh_HK.internal(_root); + @override + late final Translations$dialogs$favoriteEditDialog$zh_HK favoriteEditDialog = Translations$dialogs$favoriteEditDialog$zh_HK.internal(_root); + @override + late final Translations$dialogs$fileInfo$zh_HK fileInfo = Translations$dialogs$fileInfo$zh_HK.internal(_root); + @override + late final Translations$dialogs$fileNameInput$zh_HK fileNameInput = Translations$dialogs$fileNameInput$zh_HK.internal(_root); + @override + late final Translations$dialogs$historyClearDialog$zh_HK historyClearDialog = Translations$dialogs$historyClearDialog$zh_HK.internal(_root); + @override + late final Translations$dialogs$localNetworkUnauthorized$zh_HK localNetworkUnauthorized = + Translations$dialogs$localNetworkUnauthorized$zh_HK.internal(_root); + @override + late final Translations$dialogs$messageInput$zh_HK messageInput = Translations$dialogs$messageInput$zh_HK.internal(_root); + @override + late final Translations$dialogs$noFiles$zh_HK noFiles = Translations$dialogs$noFiles$zh_HK.internal(_root); + @override + late final Translations$dialogs$noPermission$zh_HK noPermission = Translations$dialogs$noPermission$zh_HK.internal(_root); + @override + late final Translations$dialogs$notAvailableOnPlatform$zh_HK notAvailableOnPlatform = Translations$dialogs$notAvailableOnPlatform$zh_HK.internal( + _root, + ); + @override + late final Translations$dialogs$qr$zh_HK qr = Translations$dialogs$qr$zh_HK.internal(_root); + @override + late final Translations$dialogs$quickActions$zh_HK quickActions = Translations$dialogs$quickActions$zh_HK.internal(_root); + @override + late final Translations$dialogs$quickSaveNotice$zh_HK quickSaveNotice = Translations$dialogs$quickSaveNotice$zh_HK.internal(_root); + @override + late final Translations$dialogs$quickSaveFromFavoritesNotice$zh_HK quickSaveFromFavoritesNotice = + Translations$dialogs$quickSaveFromFavoritesNotice$zh_HK.internal(_root); + @override + late final Translations$dialogs$pin$zh_HK pin = Translations$dialogs$pin$zh_HK.internal(_root); + @override + late final Translations$dialogs$sendModeHelp$zh_HK sendModeHelp = Translations$dialogs$sendModeHelp$zh_HK.internal(_root); + @override + late final Translations$dialogs$zoom$zh_HK zoom = Translations$dialogs$zoom$zh_HK.internal(_root); +} + +// Path: sanitization +class Translations$sanitization$zh_HK extends Translations$sanitization$en { + Translations$sanitization$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get empty => '檔案名稱唔可以係吉嘅'; + @override + String get invalid => '檔案名稱唔可以包括唔用得嘅字元'; +} + +// Path: tray +class Translations$tray$zh_HK extends Translations$tray$en { + Translations$tray$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => '退出 LocalSend'; + @override + String get closeWindows => '離開'; +} + +// Path: web +class Translations$web$zh_HK extends Translations$web$en { + Translations$web$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => '輸入密碼'; + @override + String get invalidPin => '密碼無效'; + @override + String get tooManyAttempts => '嘗試次數過多,請稍後再試'; + @override + String get rejected => '已遭對方拒絕'; + @override + String get files => _root.general.files; + @override + String get fileName => '檔案名稱'; + @override + String get size => '大細'; +} + +// Path: assetPicker +class Translations$assetPicker$zh_HK extends Translations$assetPicker$en { + Translations$assetPicker$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get confirm => _root.general.confirm; + @override + String get cancel => _root.general.cancel; + @override + String get edit => _root.general.edit; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => '載入失敗'; + @override + String get original => '原始檔案'; + @override + String get preview => '預覽'; + @override + String get select => '揀選'; + @override + String get emptyList => '列表冇嘢'; + @override + String get unSupportedAssetType => '檔案類型唔支援。'; + @override + String get unableToAccessAll => '無法存取裝置入面所有檔案'; + @override + String get viewingLimitedAssetsTip => '你淨係可以睇到個 app 能夠存取嘅檔案同相簿。'; + @override + String get changeAccessibleLimitedAssets => '撳呢度更新可存取檔案'; + @override + String get accessAllTip => '個 app 只能夠存取裝置入面部分檔案。要存取所有媒體,你要去系統設定開返個權限。'; + @override + String get goToSystemSettings => '開啟系統設定'; + @override + String get accessLimitedAssets => '喺限制存取嘅情況下繼續'; + @override + String get accessiblePathName => '可存取檔案'; + @override + String get sTypeAudioLabel => '音樂'; + @override + String get sTypeImageLabel => '相片'; + @override + String get sTypeVideoLabel => '影片'; + @override + String get sTypeOtherLabel => '其他媒體'; + @override + String get sActionPlayHint => '播放'; + @override + String get sActionPreviewHint => _root.assetPicker.preview; + @override + String get sActionSelectHint => _root.assetPicker.select; + @override + String get sActionSwitchPathLabel => '更改路徑'; + @override + String get sActionUseCameraHint => '影相'; + @override + String get sNameDurationLabel => '持續時間'; + @override + String get sUnitAssetCountLabel => '數量'; +} + +// Path: networkInterfacesPage +class Translations$networkInterfacesPage$zh_HK extends Translations$networkInterfacesPage$en { + Translations$networkInterfacesPage$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get info => 'LocalSend 預設使用所有可用的網路介面。您可以在這裡排除不需要的網路。您需要重新啟動伺服器才能套用變更。'; + @override + String get title => '網路介面'; + @override + String get preview => '預覽'; + @override + String get whitelist => '白名單'; + @override + String get blacklist => '黑名單'; +} + +// Path: receiveTab.infoBox +class Translations$receiveTab$infoBox$zh_HK extends Translations$receiveTab$infoBox$en { + Translations$receiveTab$infoBox$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => 'Port:'; + @override + String get alias => '名:'; +} + +// Path: receiveTab.quickSave +class Translations$receiveTab$quickSave$zh_HK extends Translations$receiveTab$quickSave$en { + Translations$receiveTab$quickSave$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get off => '關閉'; + @override + String get favorites => '僅來自已收藏裝置嘅檔案'; + @override + String get on => '來自所有裝置嘅檔案'; +} + +// Path: sendTab.selection +class Translations$sendTab$selection$zh_HK extends Translations$sendTab$selection$en { + Translations$sendTab$selection$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '揀選'; + @override + String files({required Object files}) => '檔案:${files}'; + @override + String size({required Object size}) => '大細:${size}'; +} + +// Path: sendTab.picker +class Translations$sendTab$picker$zh_HK extends Translations$sendTab$picker$en { + Translations$sendTab$picker$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get file => '檔案'; + @override + String get folder => '資料夾'; + @override + String get media => '媒體'; + @override + String get text => '文字'; + @override + String get app => '應用程式'; + @override + String get clipboard => '貼上'; +} + +// Path: sendTab.sendModes +class Translations$sendTab$sendModes$zh_HK extends Translations$sendTab$sendModes$en { + Translations$sendTab$sendModes$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get single => '單一接收者'; + @override + String get multiple => '多個接收者'; + @override + String get link => '用 link 分享'; +} + +// Path: settingsTab.general +class Translations$settingsTab$general$zh_HK extends Translations$settingsTab$general$en { + Translations$settingsTab$general$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '一般'; + @override + String get brightness => '亮度'; + @override + late final Translations$settingsTab$general$brightnessOptions$zh_HK brightnessOptions = + Translations$settingsTab$general$brightnessOptions$zh_HK.internal(_root); + @override + String get color => '色彩'; + @override + late final Translations$settingsTab$general$colorOptions$zh_HK colorOptions = Translations$settingsTab$general$colorOptions$zh_HK.internal(_root); + @override + String get language => '語言'; + @override + late final Translations$settingsTab$general$languageOptions$zh_HK languageOptions = Translations$settingsTab$general$languageOptions$zh_HK.internal( + _root, + ); + @override + String get saveWindowPlacement => '退出嗰陣記低視窗位置'; + @override + String get saveWindowPlacementWindows => '離開嗰陣記低視窗位置'; + @override + String get minimizeToTray => '關閉嗰陣縮細做通知圖示'; + @override + String get launchAtStartup => '開機自動啟動'; + @override + String get launchMinimized => '自動啟動成通知圖示'; + @override + String get showInContextMenu => '喺檔案功能表嘅「傳送到」項目顯示 LocalSend'; + @override + String get animations => '動畫'; +} + +// Path: settingsTab.receive +class Translations$settingsTab$receive$zh_HK extends Translations$settingsTab$receive$en { + Translations$settingsTab$receive$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '接收'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => '完成後自動關閉傳輸畫面'; + @override + String get destination => '儲存位置'; + @override + String get downloads => '(下載資料夾)'; + @override + String get saveToGallery => 'Save 落相簿'; + @override + String get saveToHistory => 'Save 去歷史紀錄'; +} + +// Path: settingsTab.send +class Translations$settingsTab$send$zh_HK extends Translations$settingsTab$send$en { + Translations$settingsTab$send$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '傳送'; + @override + String get shareViaLinkAutoAccept => '用 link 分享檔案嗰陣自動接收'; +} + +// Path: settingsTab.network +class Translations$settingsTab$network$zh_HK extends Translations$settingsTab$network$en { + Translations$settingsTab$network$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '網路'; + @override + String get needRestart => '熄咗個 server 再開過,設定先會生效!'; + @override + String get server => 'Server'; + @override + String get alias => '名'; + @override + String get deviceType => '裝置類型'; + @override + String get deviceModel => '裝置型號'; + @override + String get port => 'Port'; + @override + String get discoveryTimeout => '裝置搜尋逾時'; + @override + String get useSystemName => '使用系統名稱'; + @override + String get generateRandomAlias => '求其改個名'; + @override + String portWarning({required Object defaultPort}) => '改 port 嘅話其他裝置有機會偵測唔到你。(預設:${defaultPort})'; + @override + String get encryption => '加密傳送'; + @override + String get multicastGroup => '多播 IP 地址'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => '用自訂多播地址嘅話其他裝置有機會偵測唔到你。(預設:${defaultMulticast})'; + @override + String get network => '網絡'; + @override + late final Translations$settingsTab$network$networkOptions$zh_HK networkOptions = Translations$settingsTab$network$networkOptions$zh_HK.internal( + _root, + ); +} + +// Path: settingsTab.other +class Translations$settingsTab$other$zh_HK extends Translations$settingsTab$other$en { + Translations$settingsTab$other$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '其他'; + @override + String get support => '支援 LocalSend'; + @override + String get donate => '捐款'; + @override + String get privacyPolicy => '私隱權政策'; + @override + String get termsOfUse => '服務條款'; +} + +// Path: troubleshootPage.firewall +class Translations$troubleshootPage$firewall$zh_HK extends Translations$troubleshootPage$firewall$en { + Translations$troubleshootPage$firewall$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get symptom => '我 send 到嘢但係接收唔到。'; + @override + String solution({required Object port}) => '應該係防火牆嘅問題,可以透過允許接受 port ${port} 嘅連線(UDP 同 TCP)嚟解決。'; + @override + String get openFirewall => '開啟防火牆設定'; +} + +// Path: troubleshootPage.noDiscovery +class Translations$troubleshootPage$noDiscovery$zh_HK extends Translations$troubleshootPage$noDiscovery$en { + Translations$troubleshootPage$noDiscovery$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get symptom => '呢部機偵測唔到其他裝置。'; + @override + String get solution => '請確保所有裝置都駁緊同一個 Wi‑Fi 網路同用緊相同嘅設定(port、多播 IP 地址同有冇開加密傳送)。你亦都可以試下人手輸入目標裝置嘅 IP 地址。如果 work 嘅話可以選擇收藏呢部裝置,噉樣日後就會自動偵測到佢,毋須重新輸入。'; +} + +// Path: troubleshootPage.noConnection +class Translations$troubleshootPage$noConnection$zh_HK extends Translations$troubleshootPage$noConnection$en { + Translations$troubleshootPage$noConnection$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get symptom => '兩部裝置都偵測唔到同 send 唔到嘢畀對方。'; + @override + String get solution => + '如果兩邊都發生同樣嘅情況,你要 check 清楚兩邊係咪駁緊同一個 Wi‑Fi 網路同用緊相同嘅設定(port、多播 IP 地址同有冇開加密傳送)。亦可能係個 Wi‑Fi 唔畀裝置之間通訊,呢種情況下要喺 router 嗰邊熄咗「接入點 (AP) 隔離」模式至得。'; +} + +// Path: receiveHistoryPage.entryActions +class Translations$receiveHistoryPage$entryActions$zh_HK extends Translations$receiveHistoryPage$entryActions$en { + Translations$receiveHistoryPage$entryActions$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get open => _root.dialogs.openFile.title; + @override + String get showInFolder => '喺檔案瀏覽器顯示'; + @override + String get info => '資訊'; + @override + String get deleteFromHistory => '刪走呢筆記錄'; +} + +// Path: progressPage.total +class Translations$progressPage$total$zh_HK extends Translations$progressPage$total$en { + Translations$progressPage$total$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + late final Translations$progressPage$total$title$zh_HK title = Translations$progressPage$total$title$zh_HK.internal(_root); + @override + String count({required Object curr, required Object n}) => '檔案:${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => '大細:${curr} / ${n}'; + @override + String speed({required Object speed}) => '速度:${speed}/s'; +} + +// Path: dialogs.addFile +class Translations$dialogs$addFile$zh_HK extends Translations$dialogs$addFile$en { + Translations$dialogs$addFile$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '將檔案加至選擇'; + @override + String get content => '您想新增什麼檔案?'; +} + +// Path: dialogs.openFile +class Translations$dialogs$openFile$zh_HK extends Translations$dialogs$openFile$en { + Translations$dialogs$openFile$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '開啟檔案'; + @override + String get content => '你係咪要開啟接收咗嘅檔案?'; +} + +// Path: dialogs.addressInput +class Translations$dialogs$addressInput$zh_HK extends Translations$dialogs$addressInput$en { + Translations$dialogs$addressInput$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '輸入地址'; + @override + String get hashtag => 'Hashtag'; + @override + String get ip => 'IP 地址'; + @override + String get recentlyUsed => '輸入記錄: '; +} + +// Path: dialogs.cancelSession +class Translations$dialogs$cancelSession$zh_HK extends Translations$dialogs$cancelSession$en { + Translations$dialogs$cancelSession$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '取消檔案傳輸'; + @override + String get content => '你係咪要放棄傳輸檔案?'; +} + +// Path: dialogs.cannotOpenFile +class Translations$dialogs$cannotOpenFile$zh_HK extends Translations$dialogs$cannotOpenFile$en { + Translations$dialogs$cannotOpenFile$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '無法開啟檔案'; + @override + String content({required Object file}) => '檔案「${file}」開唔到喎,係咪畀人郁過、改過名或者剷走咗?'; +} + +// Path: dialogs.encryptionDisabledNotice +class Translations$dialogs$encryptionDisabledNotice$zh_HK extends Translations$dialogs$encryptionDisabledNotice$en { + Translations$dialogs$encryptionDisabledNotice$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '加密已停用'; + @override + String get content => '而家會透過未經加密嘅 HTTP 協定嚟通訊。要用 HTTPS 請開返加密。'; +} + +// Path: dialogs.errorDialog +class Translations$dialogs$errorDialog$zh_HK extends Translations$dialogs$errorDialog$en { + Translations$dialogs$errorDialog$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class Translations$dialogs$favoriteDialog$zh_HK extends Translations$dialogs$favoriteDialog$en { + Translations$dialogs$favoriteDialog$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '收藏'; + @override + String get noFavorites => '未收藏任何裝置.'; + @override + String get addFavorite => _root.general.add; +} + +// Path: dialogs.favoriteDeleteDialog +class Translations$dialogs$favoriteDeleteDialog$zh_HK extends Translations$dialogs$favoriteDeleteDialog$en { + Translations$dialogs$favoriteDeleteDialog$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '取消收藏裝置'; + @override + String content({required Object name}) => '你係咪要取消收藏裝置「${name}」?'; +} + +// Path: dialogs.favoriteEditDialog +class Translations$dialogs$favoriteEditDialog$zh_HK extends Translations$dialogs$favoriteEditDialog$en { + Translations$dialogs$favoriteEditDialog$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => '新增至收藏'; + @override + String get titleEdit => '編輯'; + @override + String get name => '名'; + @override + String get auto => '(自動)'; + @override + String get ip => 'IP 地址'; + @override + String get port => 'Port'; +} + +// Path: dialogs.fileInfo +class Translations$dialogs$fileInfo$zh_HK extends Translations$dialogs$fileInfo$en { + Translations$dialogs$fileInfo$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '檔案資訊'; + @override + String get fileName => '檔案名稱:'; + @override + String get path => '路徑:'; + @override + String get size => '大小:'; + @override + String get sender => '傳送者:'; + @override + String get time => '時間:'; +} + +// Path: dialogs.fileNameInput +class Translations$dialogs$fileNameInput$zh_HK extends Translations$dialogs$fileNameInput$en { + Translations$dialogs$fileNameInput$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '輸入檔案名稱'; + @override + String original({required Object original}) => '原名:${original}'; +} + +// Path: dialogs.historyClearDialog +class Translations$dialogs$historyClearDialog$zh_HK extends Translations$dialogs$historyClearDialog$en { + Translations$dialogs$historyClearDialog$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '清除歷史記錄'; + @override + String get content => '你係咪真係要剷走全部歷史記錄?'; +} + +// Path: dialogs.localNetworkUnauthorized +class Translations$dialogs$localNetworkUnauthorized$zh_HK extends Translations$dialogs$localNetworkUnauthorized$en { + Translations$dialogs$localNetworkUnauthorized$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => '喺冇權掃描區域網路嘅情況下 LocalSend 唔會偵測到其他裝置。麻煩你喺系統設定開返呢個權限。'; + @override + String get gotoSettings => '開啟系統設定'; +} + +// Path: dialogs.messageInput +class Translations$dialogs$messageInput$zh_HK extends Translations$dialogs$messageInput$en { + Translations$dialogs$messageInput$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '輸入訊息'; + @override + String get multiline => '多行'; +} + +// Path: dialogs.noFiles +class Translations$dialogs$noFiles$zh_HK extends Translations$dialogs$noFiles$en { + Translations$dialogs$noFiles$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '冇揀選檔案'; + @override + String get content => '最少需要揀選一個檔案。'; +} + +// Path: dialogs.noPermission +class Translations$dialogs$noPermission$zh_HK extends Translations$dialogs$noPermission$en { + Translations$dialogs$noPermission$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '權限閂咗'; + @override + String get content => '你冇畀足夠權限我哋進行處理。麻煩你喺系統設定開返啲權限。'; +} + +// Path: dialogs.notAvailableOnPlatform +class Translations$dialogs$notAvailableOnPlatform$zh_HK extends Translations$dialogs$notAvailableOnPlatform$en { + Translations$dialogs$notAvailableOnPlatform$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '無法使用'; + @override + String get content => '此功能只適用於:'; +} + +// Path: dialogs.qr +class Translations$dialogs$qr$zh_HK extends Translations$dialogs$qr$en { + Translations$dialogs$qr$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR Code'; +} + +// Path: dialogs.quickActions +class Translations$dialogs$quickActions$zh_HK extends Translations$dialogs$quickActions$en { + Translations$dialogs$quickActions$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '快速動作'; + @override + String get counter => '計數器'; + @override + String get prefix => '前綴'; + @override + String get padZero => '補零'; + @override + String get sortBeforeCount => '事前跟字母排序'; + @override + String get random => '隨機'; +} + +// Path: dialogs.quickSaveNotice +class Translations$dialogs$quickSaveNotice$zh_HK extends Translations$dialogs$quickSaveNotice$en { + Translations$dialogs$quickSaveNotice$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => '自動接受所有檔案傳輸請求。留意返,噉樣會令呢個網路嘅所有人都 send 得嘢畀你。'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class Translations$dialogs$quickSaveFromFavoritesNotice$zh_HK extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + Translations$dialogs$quickSaveFromFavoritesNotice$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + '自動接受來自已收藏裝置嘅檔案傳輸請求。', + '警告:目前呢個選項並非絕對安全,因為只要黑客攞到你任何一部已收藏裝置嘅指紋,佢就可以無限制噉 send 嘢畀你。', + '不過揀已收藏裝置點都安全過揀所有裝置嘅。', + ]; +} + +// Path: dialogs.pin +class Translations$dialogs$pin$zh_HK extends Translations$dialogs$pin$en { + Translations$dialogs$pin$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.web.enterPin; +} + +// Path: dialogs.sendModeHelp +class Translations$dialogs$sendModeHelp$zh_HK extends Translations$dialogs$sendModeHelp$en { + Translations$dialogs$sendModeHelp$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => _root.sendTab.sendMode; + @override + String get single => '淨係 send 畀一部裝置,傳輸完成後會清除揀選項目。'; + @override + String get multiple => '一次過 send 畀多部裝置,揀選項目會一路保留。'; + @override + String get link => '冇裝 LocalSend 嘅裝置可以透過條 link 嚟 download 返揀選嘅項目。'; +} + +// Path: dialogs.zoom +class Translations$dialogs$zoom$zh_HK extends Translations$dialogs$zoom$en { + Translations$dialogs$zoom$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get title => '網址'; +} + +// Path: settingsTab.general.brightnessOptions +class Translations$settingsTab$general$brightnessOptions$zh_HK extends Translations$settingsTab$general$brightnessOptions$en { + Translations$settingsTab$general$brightnessOptions$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get system => '跟機'; + @override + String get dark => '暗色'; + @override + String get light => '亮色'; +} + +// Path: settingsTab.general.colorOptions +class Translations$settingsTab$general$colorOptions$zh_HK extends Translations$settingsTab$general$colorOptions$en { + Translations$settingsTab$general$colorOptions$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get system => '跟機'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class Translations$settingsTab$general$languageOptions$zh_HK extends Translations$settingsTab$general$languageOptions$en { + Translations$settingsTab$general$languageOptions$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get system => '跟機'; +} + +// Path: settingsTab.network.networkOptions +class Translations$settingsTab$network$networkOptions$zh_HK extends Translations$settingsTab$network$networkOptions$en { + Translations$settingsTab$network$networkOptions$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String get all => '全部'; + @override + String get filtered => '已過濾'; +} + +// Path: progressPage.total.title +class Translations$progressPage$total$title$zh_HK extends Translations$progressPage$total$title$en { + Translations$progressPage$total$title$zh_HK.internal(TranslationsZhHk root) : this._root = root, super.internal(root); + + final TranslationsZhHk _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => '進度:${time}'; + @override + String get finishedError => '搞掂,不過有 error'; + @override + String get canceledSender => '傳送者取消咗'; + @override + String get canceledReceiver => '接收者取消咗'; +} diff --git a/app/lib/gen/strings_zh_TW.g.dart b/app/lib/gen/strings_zh_TW.g.dart new file mode 100644 index 0000000..9e097da --- /dev/null +++ b/app/lib/gen/strings_zh_TW.g.dart @@ -0,0 +1,1425 @@ +/// +/// Generated file. Do not edit. +/// +// coverage:ignore-file +// ignore_for_file: type=lint, unused_import + +import 'package:flutter/widgets.dart'; +import 'package:intl/intl.dart'; +import 'package:slang/generated.dart'; +import 'strings.g.dart'; + +// Path: +class TranslationsZhTw extends Translations with BaseTranslations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + TranslationsZhTw({ + Map? overrides, + PluralResolver? cardinalResolver, + PluralResolver? ordinalResolver, + TranslationMetadata? meta, + }) : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = + meta ?? + TranslationMetadata( + locale: AppLocale.zhTw, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ), + super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver); + + /// Metadata for the translations of . + @override + final TranslationMetadata $meta; + + late final TranslationsZhTw _root = this; // ignore: unused_field + + @override + TranslationsZhTw $copyWith({TranslationMetadata? meta}) => TranslationsZhTw(meta: meta ?? this.$meta); + + // Translations + @override + String get locale => '繁體中文 (台灣)'; + @override + String get appName => 'LocalSend'; + @override + late final Translations$general$zh_TW general = Translations$general$zh_TW.internal(_root); + @override + late final Translations$receiveTab$zh_TW receiveTab = Translations$receiveTab$zh_TW.internal(_root); + @override + late final Translations$sendTab$zh_TW sendTab = Translations$sendTab$zh_TW.internal(_root); + @override + late final Translations$settingsTab$zh_TW settingsTab = Translations$settingsTab$zh_TW.internal(_root); + @override + late final Translations$troubleshootPage$zh_TW troubleshootPage = Translations$troubleshootPage$zh_TW.internal(_root); + @override + late final Translations$receiveHistoryPage$zh_TW receiveHistoryPage = Translations$receiveHistoryPage$zh_TW.internal(_root); + @override + late final Translations$apkPickerPage$zh_TW apkPickerPage = Translations$apkPickerPage$zh_TW.internal(_root); + @override + late final Translations$selectedFilesPage$zh_TW selectedFilesPage = Translations$selectedFilesPage$zh_TW.internal(_root); + @override + late final Translations$receivePage$zh_TW receivePage = Translations$receivePage$zh_TW.internal(_root); + @override + late final Translations$receiveOptionsPage$zh_TW receiveOptionsPage = Translations$receiveOptionsPage$zh_TW.internal(_root); + @override + late final Translations$sendPage$zh_TW sendPage = Translations$sendPage$zh_TW.internal(_root); + @override + late final Translations$progressPage$zh_TW progressPage = Translations$progressPage$zh_TW.internal(_root); + @override + late final Translations$webSharePage$zh_TW webSharePage = Translations$webSharePage$zh_TW.internal(_root); + @override + late final Translations$aboutPage$zh_TW aboutPage = Translations$aboutPage$zh_TW.internal(_root); + @override + late final Translations$donationPage$zh_TW donationPage = Translations$donationPage$zh_TW.internal(_root); + @override + late final Translations$changelogPage$zh_TW changelogPage = Translations$changelogPage$zh_TW.internal(_root); + @override + late final Translations$dialogs$zh_TW dialogs = Translations$dialogs$zh_TW.internal(_root); + @override + late final Translations$sanitization$zh_TW sanitization = Translations$sanitization$zh_TW.internal(_root); + @override + late final Translations$tray$zh_TW tray = Translations$tray$zh_TW.internal(_root); + @override + late final Translations$web$zh_TW web = Translations$web$zh_TW.internal(_root); + @override + late final Translations$assetPicker$zh_TW assetPicker = Translations$assetPicker$zh_TW.internal(_root); + @override + late final Translations$networkInterfacesPage$zh_TW networkInterfacesPage = Translations$networkInterfacesPage$zh_TW.internal(_root); +} + +// Path: general +class Translations$general$zh_TW extends Translations$general$en { + Translations$general$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get accept => '接受'; + @override + String get accepted => '已接受'; + @override + String get add => '新增'; + @override + String get advanced => '進階'; + @override + String get cancel => '取消'; + @override + String get close => '關閉'; + @override + String get confirm => '確認'; + @override + String get continueStr => '繼續'; + @override + String get copy => '複製'; + @override + String get copiedToClipboard => '已複製到剪貼簿'; + @override + String get decline => '拒絕'; + @override + String get done => '完成'; + @override + String get delete => '刪除'; + @override + String get edit => '編輯'; + @override + String get error => '錯誤'; + @override + String get example => '範例'; + @override + String get files => '檔案'; + @override + String get finished => '已完成'; + @override + String get hide => '隱藏'; + @override + String get off => '關閉'; + @override + String get offline => '離線'; + @override + String get on => '開啟'; + @override + String get online => '線上'; + @override + String get open => '開啟'; + @override + String get queue => '佇列'; + @override + String get quickSave => '自動儲存'; + @override + String get quickSaveFromFavorites => '自動儲存來自「最愛」裝置的檔案'; + @override + String get renamed => '已重新命名'; + @override + String get reset => '復原變更'; + @override + String get restart => '重新啟動'; + @override + String get settings => '設定'; + @override + String get skipped => '已跳過'; + @override + String get start => '開始'; + @override + String get stop => '停止'; + @override + String get save => '儲存'; + @override + String get unchanged => '未變更'; + @override + String get unknown => '未知'; + @override + String get noItemInClipboard => '剪貼簿中沒有內容。'; +} + +// Path: receiveTab +class Translations$receiveTab$zh_TW extends Translations$receiveTab$en { + Translations$receiveTab$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '接收'; + @override + late final Translations$receiveTab$infoBox$zh_TW infoBox = Translations$receiveTab$infoBox$zh_TW.internal(_root); + @override + late final Translations$receiveTab$quickSave$zh_TW quickSave = Translations$receiveTab$quickSave$zh_TW.internal(_root); +} + +// Path: sendTab +class Translations$sendTab$zh_TW extends Translations$sendTab$en { + Translations$sendTab$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '傳送'; + @override + late final Translations$sendTab$selection$zh_TW selection = Translations$sendTab$selection$zh_TW.internal(_root); + @override + late final Translations$sendTab$picker$zh_TW picker = Translations$sendTab$picker$zh_TW.internal(_root); + @override + String get shareIntentInfo => '您也可以使用您的行動裝置中的「分享」功能更簡單地選取檔案。'; + @override + String get nearbyDevices => '附近的裝置'; + @override + String get thisDevice => '此裝置'; + @override + String get scan => '尋找裝置'; + @override + String get manualSending => '手動傳送'; + @override + String get sendMode => '傳送模式'; + @override + late final Translations$sendTab$sendModes$zh_TW sendModes = Translations$sendTab$sendModes$zh_TW.internal(_root); + @override + String get sendModeHelp => '說明'; + @override + String get help => '請確保所需目標的處於相同的 Wi‑Fi 網路。'; + @override + String get placeItems => '列出要分享的項目。'; +} + +// Path: settingsTab +class Translations$settingsTab$zh_TW extends Translations$settingsTab$en { + Translations$settingsTab$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '設定'; + @override + late final Translations$settingsTab$general$zh_TW general = Translations$settingsTab$general$zh_TW.internal(_root); + @override + late final Translations$settingsTab$receive$zh_TW receive = Translations$settingsTab$receive$zh_TW.internal(_root); + @override + late final Translations$settingsTab$send$zh_TW send = Translations$settingsTab$send$zh_TW.internal(_root); + @override + late final Translations$settingsTab$network$zh_TW network = Translations$settingsTab$network$zh_TW.internal(_root); + @override + late final Translations$settingsTab$other$zh_TW other = Translations$settingsTab$other$zh_TW.internal(_root); + @override + String get advancedSettings => '進階設定'; +} + +// Path: troubleshootPage +class Translations$troubleshootPage$zh_TW extends Translations$troubleshootPage$en { + Translations$troubleshootPage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '疑難排解'; + @override + String get subTitle => '這個應用程式並未如預期運作?在這裡您可以找到常見的解決方案。'; + @override + String get solution => '解決方案:'; + @override + String get fixButton => '自動修正'; + @override + late final Translations$troubleshootPage$firewall$zh_TW firewall = Translations$troubleshootPage$firewall$zh_TW.internal(_root); + @override + late final Translations$troubleshootPage$noDiscovery$zh_TW noDiscovery = Translations$troubleshootPage$noDiscovery$zh_TW.internal(_root); + @override + late final Translations$troubleshootPage$noConnection$zh_TW noConnection = Translations$troubleshootPage$noConnection$zh_TW.internal(_root); +} + +// Path: receiveHistoryPage +class Translations$receiveHistoryPage$zh_TW extends Translations$receiveHistoryPage$en { + Translations$receiveHistoryPage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '歷史記錄'; + @override + String get openFolder => '開啟資料夾'; + @override + String get deleteHistory => '刪除歷史記錄'; + @override + String get empty => '沒有歷史記錄。'; + @override + late final Translations$receiveHistoryPage$entryActions$zh_TW entryActions = Translations$receiveHistoryPage$entryActions$zh_TW.internal(_root); +} + +// Path: apkPickerPage +class Translations$apkPickerPage$zh_TW extends Translations$apkPickerPage$en { + Translations$apkPickerPage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '應用程式 (APK)'; + @override + String get excludeSystemApps => '排除系統應用程式'; + @override + String get excludeAppsWithoutLaunchIntent => '排除不可啟動的應用程式'; + @override + String apps({required Object n}) => '${n} 個應用程式'; +} + +// Path: selectedFilesPage +class Translations$selectedFilesPage$zh_TW extends Translations$selectedFilesPage$en { + Translations$selectedFilesPage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get deleteAll => '全部刪除'; +} + +// Path: receivePage +class Translations$receivePage$zh_TW extends Translations$receivePage$en { + Translations$receivePage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String subTitle({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))( + n, + one: '要傳送一個檔案給您', + other: '要傳送 ${n} 個檔案給您', + ); + @override + String get subTitleMessage => '已傳送一則訊息給您:'; + @override + String get subTitleLink => '已傳送一個連結給您:'; + @override + String get canceled => '傳送者已取消要求。'; +} + +// Path: receiveOptionsPage +class Translations$receiveOptionsPage$zh_TW extends Translations$receiveOptionsPage$en { + Translations$receiveOptionsPage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '選項'; + @override + String get destination => _root.settingsTab.receive.destination; + @override + String get appDirectory => '(LocalSend 資料夾)'; + @override + String get saveToGallery => _root.settingsTab.receive.saveToGallery; + @override + String get saveToGalleryOff => '因內容存在資料夾而自動關閉。'; +} + +// Path: sendPage +class Translations$sendPage$zh_TW extends Translations$sendPage$en { + Translations$sendPage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get waiting => '正在等候回應…'; + @override + String get rejected => '接收者拒絕了要求。'; + @override + String get tooManyAttempts => _root.web.tooManyAttempts; + @override + String get busy => '接收者正忙於處理另一個要求。'; +} + +// Path: progressPage +class Translations$progressPage$zh_TW extends Translations$progressPage$en { + Translations$progressPage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get titleSending => '正在傳送檔案'; + @override + String get titleReceiving => '正在接收檔案'; + @override + String get savedToGallery => '已儲存至相簿'; + @override + late final Translations$progressPage$total$zh_TW total = Translations$progressPage$total$zh_TW.internal(_root); + @override + late final Translations$progressPage$remainingTime$zh_TW remainingTime = Translations$progressPage$remainingTime$zh_TW.internal(_root); +} + +// Path: webSharePage +class Translations$webSharePage$zh_TW extends Translations$webSharePage$en { + Translations$webSharePage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '透過連結分享'; + @override + String get loading => '正在啟動伺服器…'; + @override + String get stopping => '正在關閉伺服器…'; + @override + String get error => '啟動伺服器時發生錯誤。'; + @override + String openLink({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))( + n, + one: '在瀏覽器開啟此連結:', + other: '在瀏覽器中開啟其中一個連結:', + ); + @override + String get requests => '要求'; + @override + String get noRequests => '目前沒有任何要求。'; + @override + String get encryption => _root.settingsTab.network.encryption; + @override + String get autoAccept => '自動接受請求'; + @override + String get requirePin => '需要 PIN 碼'; + @override + String pinHint({required Object pin}) => 'PIN 碼是「${pin}」'; + @override + String get encryptionHint => 'LocalSend 使用自簽署憑證。您需要在瀏覽器中接受它。'; + @override + String pendingRequests({required Object n}) => '待處理的要求:${n}'; +} + +// Path: aboutPage +class Translations$aboutPage$zh_TW extends Translations$aboutPage$en { + Translations$aboutPage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '關於 LocalSend'; + @override + List get description => [ + 'LocalSend 是一款免費的開源應用程式,可讓您透過區域網路與鄰近的裝置安全的分享檔案和訊息,無需網際網路連線。', + '此應用程式可在 Android、iOS、macOS、Windows 和 Linux 上使用。 您可以在官網首頁上找到所有下載選項。', + ]; + @override + String get author => '作者'; + @override + String get contributors => '貢獻者'; + @override + String get packagers => '封裝人員'; + @override + String get translators => '翻譯人員'; +} + +// Path: donationPage +class Translations$donationPage$zh_TW extends Translations$donationPage$en { + Translations$donationPage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '贊助'; + @override + String get info => 'LocalSend 是免費、開源且沒有任何廣告的。如果您喜歡此應用程式,可以透過捐贈來支持開發。'; + @override + String donate({required Object amount}) => '贊助 ${amount}'; + @override + String get thanks => '非常感謝您!'; + @override + String get restore => '復原購買'; +} + +// Path: changelogPage +class Translations$changelogPage$zh_TW extends Translations$changelogPage$en { + Translations$changelogPage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '變更記錄'; +} + +// Path: dialogs +class Translations$dialogs$zh_TW extends Translations$dialogs$en { + Translations$dialogs$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + late final Translations$dialogs$addFile$zh_TW addFile = Translations$dialogs$addFile$zh_TW.internal(_root); + @override + late final Translations$dialogs$openFile$zh_TW openFile = Translations$dialogs$openFile$zh_TW.internal(_root); + @override + late final Translations$dialogs$addressInput$zh_TW addressInput = Translations$dialogs$addressInput$zh_TW.internal(_root); + @override + late final Translations$dialogs$cancelSession$zh_TW cancelSession = Translations$dialogs$cancelSession$zh_TW.internal(_root); + @override + late final Translations$dialogs$cannotOpenFile$zh_TW cannotOpenFile = Translations$dialogs$cannotOpenFile$zh_TW.internal(_root); + @override + late final Translations$dialogs$encryptionDisabledNotice$zh_TW encryptionDisabledNotice = + Translations$dialogs$encryptionDisabledNotice$zh_TW.internal(_root); + @override + late final Translations$dialogs$errorDialog$zh_TW errorDialog = Translations$dialogs$errorDialog$zh_TW.internal(_root); + @override + late final Translations$dialogs$favoriteDialog$zh_TW favoriteDialog = Translations$dialogs$favoriteDialog$zh_TW.internal(_root); + @override + late final Translations$dialogs$favoriteDeleteDialog$zh_TW favoriteDeleteDialog = Translations$dialogs$favoriteDeleteDialog$zh_TW.internal(_root); + @override + late final Translations$dialogs$favoriteEditDialog$zh_TW favoriteEditDialog = Translations$dialogs$favoriteEditDialog$zh_TW.internal(_root); + @override + late final Translations$dialogs$fileInfo$zh_TW fileInfo = Translations$dialogs$fileInfo$zh_TW.internal(_root); + @override + late final Translations$dialogs$fileNameInput$zh_TW fileNameInput = Translations$dialogs$fileNameInput$zh_TW.internal(_root); + @override + late final Translations$dialogs$historyClearDialog$zh_TW historyClearDialog = Translations$dialogs$historyClearDialog$zh_TW.internal(_root); + @override + late final Translations$dialogs$localNetworkUnauthorized$zh_TW localNetworkUnauthorized = + Translations$dialogs$localNetworkUnauthorized$zh_TW.internal(_root); + @override + late final Translations$dialogs$messageInput$zh_TW messageInput = Translations$dialogs$messageInput$zh_TW.internal(_root); + @override + late final Translations$dialogs$noFiles$zh_TW noFiles = Translations$dialogs$noFiles$zh_TW.internal(_root); + @override + late final Translations$dialogs$noPermission$zh_TW noPermission = Translations$dialogs$noPermission$zh_TW.internal(_root); + @override + late final Translations$dialogs$notAvailableOnPlatform$zh_TW notAvailableOnPlatform = Translations$dialogs$notAvailableOnPlatform$zh_TW.internal( + _root, + ); + @override + late final Translations$dialogs$qr$zh_TW qr = Translations$dialogs$qr$zh_TW.internal(_root); + @override + late final Translations$dialogs$quickActions$zh_TW quickActions = Translations$dialogs$quickActions$zh_TW.internal(_root); + @override + late final Translations$dialogs$quickSaveNotice$zh_TW quickSaveNotice = Translations$dialogs$quickSaveNotice$zh_TW.internal(_root); + @override + late final Translations$dialogs$quickSaveFromFavoritesNotice$zh_TW quickSaveFromFavoritesNotice = + Translations$dialogs$quickSaveFromFavoritesNotice$zh_TW.internal(_root); + @override + late final Translations$dialogs$pin$zh_TW pin = Translations$dialogs$pin$zh_TW.internal(_root); + @override + late final Translations$dialogs$sendModeHelp$zh_TW sendModeHelp = Translations$dialogs$sendModeHelp$zh_TW.internal(_root); + @override + late final Translations$dialogs$zoom$zh_TW zoom = Translations$dialogs$zoom$zh_TW.internal(_root); +} + +// Path: sanitization +class Translations$sanitization$zh_TW extends Translations$sanitization$en { + Translations$sanitization$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get empty => '檔案名稱不能為空'; + @override + String get invalid => '檔案名稱包含無效字元'; +} + +// Path: tray +class Translations$tray$zh_TW extends Translations$tray$en { + Translations$tray$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get open => _root.general.open; + @override + String get close => '退出 LocalSend'; + @override + String get closeWindows => '離開'; +} + +// Path: web +class Translations$web$zh_TW extends Translations$web$en { + Translations$web$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get waiting => _root.sendPage.waiting; + @override + String get enterPin => '輸入 PIN 碼'; + @override + String get invalidPin => 'PIN 碼無效'; + @override + String get tooManyAttempts => '嘗試次數過多,請稍後再試'; + @override + String get rejected => '遭到拒絕'; + @override + String get files => '檔案'; + @override + String get fileName => '檔案名稱'; + @override + String get size => '大小'; +} + +// Path: assetPicker +class Translations$assetPicker$zh_TW extends Translations$assetPicker$en { + Translations$assetPicker$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get confirm => '確認'; + @override + String get cancel => '取消'; + @override + String get edit => '編輯'; + @override + String get gifIndicator => 'GIF'; + @override + String get loadFailed => '載入失敗'; + @override + String get original => '原始檔案'; + @override + String get preview => '預覽'; + @override + String get select => '選取'; + @override + String get emptyList => '空白清單'; + @override + String get unSupportedAssetType => '不支援的檔案類型。'; + @override + String get unableToAccessAll => '無法存取此裝置上的所有檔案'; + @override + String get viewingLimitedAssetsTip => '僅檢視此應用程式可存取的檔案和相簿。'; + @override + String get changeAccessibleLimitedAssets => '按一下以更新可存取的檔案'; + @override + String get accessAllTip => '應用程式僅可存取此裝置的部分檔案,前往系統設定並允許應用程式存取此裝置上的所有媒體。'; + @override + String get goToSystemSettings => '前往系統設定'; + @override + String get accessLimitedAssets => '以受限制的存取繼續'; + @override + String get accessiblePathName => '可存取的檔案'; + @override + String get sTypeAudioLabel => '音樂'; + @override + String get sTypeImageLabel => '圖片'; + @override + String get sTypeVideoLabel => '影片'; + @override + String get sTypeOtherLabel => '其他媒體'; + @override + String get sActionPlayHint => '播放'; + @override + String get sActionPreviewHint => '預覽'; + @override + String get sActionSelectHint => '選取'; + @override + String get sActionSwitchPathLabel => '變更路徑'; + @override + String get sActionUseCameraHint => '使用相機'; + @override + String get sNameDurationLabel => '持續時間'; + @override + String get sUnitAssetCountLabel => '計數'; +} + +// Path: networkInterfacesPage +class Translations$networkInterfacesPage$zh_TW extends Translations$networkInterfacesPage$en { + Translations$networkInterfacesPage$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get info => 'LocalSend 預設使用所有可用的網路介面,您可於此處排除不想使用的網路。您需要重新啟動伺服器以套用變更。'; + @override + String get title => '網路介面'; + @override + String get preview => '預覽'; + @override + String get whitelist => '允許清單'; + @override + String get blacklist => '禁止清單'; +} + +// Path: receiveTab.infoBox +class Translations$receiveTab$infoBox$zh_TW extends Translations$receiveTab$infoBox$en { + Translations$receiveTab$infoBox$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get ip => 'IP:'; + @override + String get port => '通訊埠:'; + @override + String get alias => '裝置名稱:'; +} + +// Path: receiveTab.quickSave +class Translations$receiveTab$quickSave$zh_TW extends Translations$receiveTab$quickSave$en { + Translations$receiveTab$quickSave$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get off => _root.general.off; + @override + String get favorites => '最愛'; + @override + String get on => _root.general.on; +} + +// Path: sendTab.selection +class Translations$sendTab$selection$zh_TW extends Translations$sendTab$selection$en { + Translations$sendTab$selection$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '選取'; + @override + String files({required Object files}) => '檔案:${files}'; + @override + String size({required Object size}) => '大小:${size}'; +} + +// Path: sendTab.picker +class Translations$sendTab$picker$zh_TW extends Translations$sendTab$picker$en { + Translations$sendTab$picker$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get file => '檔案'; + @override + String get folder => '資料夾'; + @override + String get media => '媒體'; + @override + String get text => '文字'; + @override + String get app => '應用程式'; + @override + String get clipboard => '貼上'; +} + +// Path: sendTab.sendModes +class Translations$sendTab$sendModes$zh_TW extends Translations$sendTab$sendModes$en { + Translations$sendTab$sendModes$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get single => '單一接收者'; + @override + String get multiple => '多重接收者'; + @override + String get link => '透過連結分享'; +} + +// Path: settingsTab.general +class Translations$settingsTab$general$zh_TW extends Translations$settingsTab$general$en { + Translations$settingsTab$general$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '一般'; + @override + String get brightness => '主題'; + @override + late final Translations$settingsTab$general$brightnessOptions$zh_TW brightnessOptions = + Translations$settingsTab$general$brightnessOptions$zh_TW.internal(_root); + @override + String get color => '色彩'; + @override + late final Translations$settingsTab$general$colorOptions$zh_TW colorOptions = Translations$settingsTab$general$colorOptions$zh_TW.internal(_root); + @override + String get language => '語言'; + @override + late final Translations$settingsTab$general$languageOptions$zh_TW languageOptions = Translations$settingsTab$general$languageOptions$zh_TW.internal( + _root, + ); + @override + String get saveWindowPlacement => '退出時儲存視窗位置'; + @override + String get saveWindowPlacementWindows => '離開時儲存視窗位置'; + @override + String get minimizeToTray => '關閉時最小化至系統匣'; + @override + String get launchAtStartup => '登入後自動啟動'; + @override + String get launchMinimized => '自動啟動至系統匣'; + @override + String get showInContextMenu => '在檔案功能表「傳送到」項目中顯示 LocalSend'; + @override + String get animations => '動畫'; +} + +// Path: settingsTab.receive +class Translations$settingsTab$receive$zh_TW extends Translations$settingsTab$receive$en { + Translations$settingsTab$receive$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '接收'; + @override + String get quickSave => _root.general.quickSave; + @override + String get quickSaveFromFavorites => _root.general.quickSaveFromFavorites; + @override + String get requirePin => _root.webSharePage.requirePin; + @override + String get autoFinish => '自動完成傳送任務'; + @override + String get destination => '儲存目錄'; + @override + String get downloads => '(下載)'; + @override + String get saveToGallery => '儲存媒體至相簿'; + @override + String get saveToHistory => '儲存至歷史記錄'; +} + +// Path: settingsTab.send +class Translations$settingsTab$send$zh_TW extends Translations$settingsTab$send$en { + Translations$settingsTab$send$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '傳送'; + @override + String get shareViaLinkAutoAccept => '透過連結分享:自動同意接收要求'; +} + +// Path: settingsTab.network +class Translations$settingsTab$network$zh_TW extends Translations$settingsTab$network$en { + Translations$settingsTab$network$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '網路'; + @override + String get needRestart => '重新啟動伺服器以套用設定!'; + @override + String get server => '伺服器'; + @override + String get alias => '裝置名稱'; + @override + String get deviceType => '裝置類型'; + @override + String get deviceModel => '裝置型號'; + @override + String get port => '通訊埠'; + @override + String get discoveryTimeout => '探索裝置逾時'; + @override + String get useSystemName => '使用系統名稱'; + @override + String get generateRandomAlias => '隨機產生別名'; + @override + String portWarning({required Object defaultPort}) => '您可能無法被其他裝置偵測,因為您正在使用自訂通訊埠。(預設:${defaultPort})'; + @override + String get encryption => '加密'; + @override + String get multicastGroup => '多點傳送'; + @override + String multicastGroupWarning({required Object defaultMulticast}) => '您可能無法被其他裝置偵測,因為您正在使用自訂多點傳送位址。(預設:${defaultMulticast})'; + @override + String get network => '網路'; + @override + late final Translations$settingsTab$network$networkOptions$zh_TW networkOptions = Translations$settingsTab$network$networkOptions$zh_TW.internal( + _root, + ); +} + +// Path: settingsTab.other +class Translations$settingsTab$other$zh_TW extends Translations$settingsTab$other$en { + Translations$settingsTab$other$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '其它'; + @override + String get support => '支持 LocalSend'; + @override + String get donate => '贊助'; + @override + String get privacyPolicy => '隱私權政策'; + @override + String get termsOfUse => '使用條款'; +} + +// Path: troubleshootPage.firewall +class Translations$troubleshootPage$firewall$zh_TW extends Translations$troubleshootPage$firewall$en { + Translations$troubleshootPage$firewall$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get symptom => '此應用程式可以向其他裝置傳送檔案,但其他裝置無法向此裝置傳送檔案。'; + @override + String solution({required Object port}) => '這很可能是防火牆問題。您可以透過允許通訊埠 ${port} 上的連入連線 (UDP 和 TCP) 以解決此問題。'; + @override + String get openFirewall => '開啟防火牆'; +} + +// Path: troubleshootPage.noDiscovery +class Translations$troubleshootPage$noDiscovery$zh_TW extends Translations$troubleshootPage$noDiscovery$en { + Translations$troubleshootPage$noDiscovery$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get symptom => '本裝置無法探索其他裝置。'; + @override + String get solution => '請確保所有裝置都在同一個 Wi‑Fi 網路上並共用相同的設定 (通訊埠、多點傳送位址、加密選項)。您可以嘗試手動輸入目標裝置的 IP 位址。如果這樣可以運作,考慮將此裝置新增至最愛,以便未來可以自動偵測到。'; +} + +// Path: troubleshootPage.noConnection +class Translations$troubleshootPage$noConnection$zh_TW extends Translations$troubleshootPage$noConnection$en { + Translations$troubleshootPage$noConnection$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get symptom => '兩部裝置無法探索彼此,也無法分享檔案。'; + @override + String get solution => '雙方都存在問題?然後你需要確保兩部裝置處於相同的 Wi‑Fi 網路中並共用相同的組態 (通訊埠、多點傳送位址、加密選項)。Wi‑Fi 可能不允許參與者之間進行通訊。在這種狀況下,必須在路由器上停用「存取點 (AP) 隔離」選項。'; +} + +// Path: receiveHistoryPage.entryActions +class Translations$receiveHistoryPage$entryActions$zh_TW extends Translations$receiveHistoryPage$entryActions$en { + Translations$receiveHistoryPage$entryActions$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get open => '開啟檔案'; + @override + String get showInFolder => '在資料夾中顯示'; + @override + String get info => '資訊'; + @override + String get deleteFromHistory => '從歷史記錄刪除'; +} + +// Path: progressPage.total +class Translations$progressPage$total$zh_TW extends Translations$progressPage$total$en { + Translations$progressPage$total$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + late final Translations$progressPage$total$title$zh_TW title = Translations$progressPage$total$title$zh_TW.internal(_root); + @override + String count({required Object curr, required Object n}) => '檔案:${curr} / ${n}'; + @override + String size({required Object curr, required Object n}) => '大小:${curr} / ${n}'; + @override + String speed({required Object speed}) => '速度:${speed}/s'; +} + +// Path: progressPage.remainingTime +class Translations$progressPage$remainingTime$zh_TW extends Translations$progressPage$remainingTime$en { + Translations$progressPage$remainingTime$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String hours({required Object h, required Object m}) => '${h}小時 ${m}分鐘'; + @override + String days({required Object d, required Object h, required Object m}) => '${d}天 ${h}小時 ${m}分鐘'; +} + +// Path: dialogs.addFile +class Translations$dialogs$addFile$zh_TW extends Translations$dialogs$addFile$en { + Translations$dialogs$addFile$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '新增檔案'; + @override + String get content => '您想要新增什麼檔案?'; +} + +// Path: dialogs.openFile +class Translations$dialogs$openFile$zh_TW extends Translations$dialogs$openFile$en { + Translations$dialogs$openFile$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '開啟檔案'; + @override + String get content => '您想開啟接收到的檔案嗎?'; +} + +// Path: dialogs.addressInput +class Translations$dialogs$addressInput$zh_TW extends Translations$dialogs$addressInput$en { + Translations$dialogs$addressInput$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '輸入位址'; + @override + String get hashtag => '雜湊標記'; + @override + String get ip => 'IP 位址'; + @override + String get recentlyUsed => '最近使用: '; +} + +// Path: dialogs.cancelSession +class Translations$dialogs$cancelSession$zh_TW extends Translations$dialogs$cancelSession$en { + Translations$dialogs$cancelSession$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '取消檔案傳輸'; + @override + String get content => '您確定要取消檔案傳輸嗎?'; +} + +// Path: dialogs.cannotOpenFile +class Translations$dialogs$cannotOpenFile$zh_TW extends Translations$dialogs$cannotOpenFile$en { + Translations$dialogs$cannotOpenFile$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '無法開啟檔案'; + @override + String content({required Object file}) => '無法開啟「${file}」,這個檔案已被移動、重新命名或刪除了嗎?'; +} + +// Path: dialogs.encryptionDisabledNotice +class Translations$dialogs$encryptionDisabledNotice$zh_TW extends Translations$dialogs$encryptionDisabledNotice$en { + Translations$dialogs$encryptionDisabledNotice$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '加密已停用'; + @override + String get content => '目前的通訊透過未經加密的 HTTP 通訊協定執行。若要使用 HTTPS,請再次啟用加密。'; +} + +// Path: dialogs.errorDialog +class Translations$dialogs$errorDialog$zh_TW extends Translations$dialogs$errorDialog$en { + Translations$dialogs$errorDialog$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.error; +} + +// Path: dialogs.favoriteDialog +class Translations$dialogs$favoriteDialog$zh_TW extends Translations$dialogs$favoriteDialog$en { + Translations$dialogs$favoriteDialog$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '最愛'; + @override + String get noFavorites => '還沒有最愛的裝置。'; + @override + String get addFavorite => '新增'; +} + +// Path: dialogs.favoriteDeleteDialog +class Translations$dialogs$favoriteDeleteDialog$zh_TW extends Translations$dialogs$favoriteDeleteDialog$en { + Translations$dialogs$favoriteDeleteDialog$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '從最愛中刪除'; + @override + String content({required Object name}) => '您確定要從最愛中刪除「${name}」嗎?'; +} + +// Path: dialogs.favoriteEditDialog +class Translations$dialogs$favoriteEditDialog$zh_TW extends Translations$dialogs$favoriteEditDialog$en { + Translations$dialogs$favoriteEditDialog$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get titleAdd => '新增至最愛'; + @override + String get titleEdit => '設定'; + @override + String get name => '裝置名稱'; + @override + String get auto => '(自動)'; + @override + String get ip => 'IP 位址'; + @override + String get port => '連接埠'; +} + +// Path: dialogs.fileInfo +class Translations$dialogs$fileInfo$zh_TW extends Translations$dialogs$fileInfo$en { + Translations$dialogs$fileInfo$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '檔案資訊'; + @override + String get fileName => '檔案名稱:'; + @override + String get path => '路徑:'; + @override + String get size => '大小:'; + @override + String get sender => '傳送者:'; + @override + String get time => '時間:'; +} + +// Path: dialogs.fileNameInput +class Translations$dialogs$fileNameInput$zh_TW extends Translations$dialogs$fileNameInput$en { + Translations$dialogs$fileNameInput$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '輸入檔案名稱'; + @override + String original({required Object original}) => '原始檔案名稱:${original}'; +} + +// Path: dialogs.historyClearDialog +class Translations$dialogs$historyClearDialog$zh_TW extends Translations$dialogs$historyClearDialog$en { + Translations$dialogs$historyClearDialog$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '清除歷史記錄'; + @override + String get content => '您真的要刪除整個歷史記錄嗎?'; +} + +// Path: dialogs.localNetworkUnauthorized +class Translations$dialogs$localNetworkUnauthorized$zh_TW extends Translations$dialogs$localNetworkUnauthorized$en { + Translations$dialogs$localNetworkUnauthorized$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => _root.dialogs.noPermission.title; + @override + String get description => '在未取得掃描區域網路權限的狀況下 LocalSend 無法找到其他裝置,請在設定中授予此權限。'; + @override + String get gotoSettings => '設定'; +} + +// Path: dialogs.messageInput +class Translations$dialogs$messageInput$zh_TW extends Translations$dialogs$messageInput$en { + Translations$dialogs$messageInput$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '輸入訊息'; + @override + String get multiline => '多行'; +} + +// Path: dialogs.noFiles +class Translations$dialogs$noFiles$zh_TW extends Translations$dialogs$noFiles$en { + Translations$dialogs$noFiles$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '未選取檔案'; + @override + String get content => '請至少選取一個檔案。'; +} + +// Path: dialogs.noPermission +class Translations$dialogs$noPermission$zh_TW extends Translations$dialogs$noPermission$en { + Translations$dialogs$noPermission$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '沒有權限'; + @override + String get content => '您尚未授予必要的權限。請在設定中授予權限。'; +} + +// Path: dialogs.notAvailableOnPlatform +class Translations$dialogs$notAvailableOnPlatform$zh_TW extends Translations$dialogs$notAvailableOnPlatform$en { + Translations$dialogs$notAvailableOnPlatform$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '無法使用'; + @override + String get content => '此功能僅適用於:'; +} + +// Path: dialogs.qr +class Translations$dialogs$qr$zh_TW extends Translations$dialogs$qr$en { + Translations$dialogs$qr$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => 'QR 圖碼'; +} + +// Path: dialogs.quickActions +class Translations$dialogs$quickActions$zh_TW extends Translations$dialogs$quickActions$en { + Translations$dialogs$quickActions$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '快速動作'; + @override + String get counter => '計數器'; + @override + String get prefix => '前置詞'; + @override + String get padZero => '字元零填補'; + @override + String get sortBeforeCount => '事先依字母排序'; + @override + String get random => '隨機'; +} + +// Path: dialogs.quickSaveNotice +class Translations$dialogs$quickSaveNotice$zh_TW extends Translations$dialogs$quickSaveNotice$en { + Translations$dialogs$quickSaveNotice$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSave; + @override + String get content => '自動接受所有檔案要求。請注意,區域網路中的所有人都可以傳送檔案給您。'; +} + +// Path: dialogs.quickSaveFromFavoritesNotice +class Translations$dialogs$quickSaveFromFavoritesNotice$zh_TW extends Translations$dialogs$quickSaveFromFavoritesNotice$en { + Translations$dialogs$quickSaveFromFavoritesNotice$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => _root.general.quickSaveFromFavorites; + @override + List get content => [ + '自動接受來自您最愛清單中裝置傳送的檔案。', + '警告:目前這並非絕對安全,因為知道您最愛裝置指紋的駭客仍然可以向您傳送檔案。', + '但仍然比允許任何裝置更安全。', + ]; +} + +// Path: dialogs.pin +class Translations$dialogs$pin$zh_TW extends Translations$dialogs$pin$en { + Translations$dialogs$pin$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => _root.web.enterPin; +} + +// Path: dialogs.sendModeHelp +class Translations$dialogs$sendModeHelp$zh_TW extends Translations$dialogs$sendModeHelp$en { + Translations$dialogs$sendModeHelp$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '傳送模式'; + @override + String get single => '傳送檔案至單個接收者,選取項目將在檔案傳輸完成後被清除。'; + @override + String get multiple => '傳送檔案至多重接收者,選取項目將不會被清除。'; + @override + String get link => '未安裝 LocalSend 的接收者可以透過在瀏覽器開啟連結以下載選取的檔案.'; +} + +// Path: dialogs.zoom +class Translations$dialogs$zoom$zh_TW extends Translations$dialogs$zoom$en { + Translations$dialogs$zoom$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get title => '網址'; +} + +// Path: settingsTab.general.brightnessOptions +class Translations$settingsTab$general$brightnessOptions$zh_TW extends Translations$settingsTab$general$brightnessOptions$en { + Translations$settingsTab$general$brightnessOptions$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get system => '系統'; + @override + String get dark => '深色'; + @override + String get light => '淺色'; +} + +// Path: settingsTab.general.colorOptions +class Translations$settingsTab$general$colorOptions$zh_TW extends Translations$settingsTab$general$colorOptions$en { + Translations$settingsTab$general$colorOptions$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get system => '系統'; + @override + String get oled => 'OLED'; +} + +// Path: settingsTab.general.languageOptions +class Translations$settingsTab$general$languageOptions$zh_TW extends Translations$settingsTab$general$languageOptions$en { + Translations$settingsTab$general$languageOptions$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get system => '系統'; +} + +// Path: settingsTab.network.networkOptions +class Translations$settingsTab$network$networkOptions$zh_TW extends Translations$settingsTab$network$networkOptions$en { + Translations$settingsTab$network$networkOptions$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String get all => '全部'; + @override + String get filtered => '已篩選'; +} + +// Path: progressPage.total.title +class Translations$progressPage$total$title$zh_TW extends Translations$progressPage$total$title$en { + Translations$progressPage$total$title$zh_TW.internal(TranslationsZhTw root) : this._root = root, super.internal(root); + + final TranslationsZhTw _root; // ignore: unused_field + + // Translations + @override + String sending({required Object time}) => '整體進度 (${time})'; + @override + String get finishedError => '已完成,但發生錯誤'; + @override + String get canceledSender => '傳送者已取消'; + @override + String get canceledReceiver => '接收者已取消'; +} diff --git a/app/lib/main.dart b/app/lib/main.dart new file mode 100644 index 0000000..a4aa884 --- /dev/null +++ b/app/lib/main.dart @@ -0,0 +1,90 @@ +import 'package:common/isolate.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:localsend_app/config/init.dart'; +import 'package:localsend_app/config/init_error.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/persistence/color_mode.dart'; +import 'package:localsend_app/pages/home_page.dart'; +import 'package:localsend_app/provider/local_ip_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/ui/dynamic_colors.dart'; +import 'package:localsend_app/widget/watcher/life_cycle_watcher.dart'; +import 'package:localsend_app/widget/watcher/shortcut_watcher.dart'; +import 'package:localsend_app/widget/watcher/tray_watcher.dart'; +import 'package:localsend_app/widget/watcher/window_watcher.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +Future main(List args) async { + final RefenaContainer container; + try { + container = await preInit(args); + } catch (e, stackTrace) { + showInitErrorApp( + error: e, + stackTrace: stackTrace, + ); + return; + } + + runApp( + RefenaScope.withContainer( + container: container, + child: TranslationProvider( + child: const LocalSendApp(), + ), + ), + ); +} + +class LocalSendApp extends StatelessWidget { + const LocalSendApp(); + + @override + Widget build(BuildContext context) { + final ref = context.ref; + final (themeMode, colorMode) = ref.watch(settingsProvider.select((settings) => (settings.theme, settings.colorMode))); + final dynamicColors = ref.watch(dynamicColorsProvider); + return TrayWatcher( + child: WindowWatcher( + child: LifeCycleWatcher( + onChangedState: (AppLifecycleState state) { + switch (state) { + case AppLifecycleState.resumed: + ref.redux(localIpProvider).dispatch(InitLocalIpAction()); + break; + case AppLifecycleState.detached: + // The main isolate is only exited when all child isolates are exited. + // https://github.com/localsend/localsend/issues/1568 + ref.redux(parentIsolateProvider).dispatch(IsolateDisposeAction()); + break; + default: + break; + } + }, + child: ShortcutWatcher( + child: MaterialApp( + title: t.appName, + locale: TranslationProvider.of(context).flutterLocale, + supportedLocales: AppLocaleUtils.supportedLocales, + localizationsDelegates: GlobalMaterialLocalizations.delegates, + debugShowCheckedModeBanner: false, + theme: getTheme(colorMode, Brightness.light, dynamicColors), + darkTheme: getTheme(colorMode, Brightness.dark, dynamicColors), + themeMode: colorMode == ColorMode.oled ? ThemeMode.dark : themeMode, + navigatorKey: Routerino.navigatorKey, + home: RouterinoHome( + builder: () => const HomePage( + initialTab: HomeTab.receive, + appStart: true, + ), + ), + ), + ), + ), + ), + ); + } +} diff --git a/app/lib/model/cross_file.dart b/app/lib/model/cross_file.dart new file mode 100644 index 0000000..a6c6f23 --- /dev/null +++ b/app/lib/model/cross_file.dart @@ -0,0 +1,40 @@ +import 'dart:typed_data'; + +import 'package:common/model/file_type.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:wechat_assets_picker/wechat_assets_picker.dart'; + +part 'cross_file.mapper.dart'; + +/// Common file model to avoid any third party libraries in the core logic. +/// This model is used during the file selection phase. +@MappableClass() +class CrossFile with CrossFileMappable { + final String name; + final FileType fileType; + final int size; + final Uint8List? thumbnail; + final AssetEntity? asset; // for thumbnails + final String? path; + final List? bytes; // if type message, then UTF-8 encoded + final DateTime? lastModified; + final DateTime? lastAccessed; + + const CrossFile({ + required this.name, + required this.fileType, + required this.size, + required this.thumbnail, + required this.asset, + required this.path, + required this.bytes, + required this.lastModified, + required this.lastAccessed, + }); + + /// Custom toString() to avoid printing the bytes. + @override + String toString() { + return 'CrossFile(name: $name, fileType: $fileType, size: $size, thumbnail: ${thumbnail != null ? thumbnail!.length : 'null'}, asset: $asset, path: $path, bytes: ${bytes != null ? bytes!.length : 'null'})'; + } +} diff --git a/app/lib/model/cross_file.mapper.dart b/app/lib/model/cross_file.mapper.dart new file mode 100644 index 0000000..c612dbb --- /dev/null +++ b/app/lib/model/cross_file.mapper.dart @@ -0,0 +1,217 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'cross_file.dart'; + +class CrossFileMapper extends ClassMapperBase { + CrossFileMapper._(); + + static CrossFileMapper? _instance; + static CrossFileMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = CrossFileMapper._()); + FileTypeMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'CrossFile'; + + static String _$name(CrossFile v) => v.name; + static const Field _f$name = Field('name', _$name); + static FileType _$fileType(CrossFile v) => v.fileType; + static const Field _f$fileType = Field( + 'fileType', + _$fileType, + ); + static int _$size(CrossFile v) => v.size; + static const Field _f$size = Field('size', _$size); + static Uint8List? _$thumbnail(CrossFile v) => v.thumbnail; + static const Field _f$thumbnail = Field( + 'thumbnail', + _$thumbnail, + ); + static AssetEntity? _$asset(CrossFile v) => v.asset; + static const Field _f$asset = Field('asset', _$asset); + static String? _$path(CrossFile v) => v.path; + static const Field _f$path = Field('path', _$path); + static List? _$bytes(CrossFile v) => v.bytes; + static const Field> _f$bytes = Field('bytes', _$bytes); + static DateTime? _$lastModified(CrossFile v) => v.lastModified; + static const Field _f$lastModified = Field( + 'lastModified', + _$lastModified, + ); + static DateTime? _$lastAccessed(CrossFile v) => v.lastAccessed; + static const Field _f$lastAccessed = Field( + 'lastAccessed', + _$lastAccessed, + ); + + @override + final MappableFields fields = const { + #name: _f$name, + #fileType: _f$fileType, + #size: _f$size, + #thumbnail: _f$thumbnail, + #asset: _f$asset, + #path: _f$path, + #bytes: _f$bytes, + #lastModified: _f$lastModified, + #lastAccessed: _f$lastAccessed, + }; + + static CrossFile _instantiate(DecodingData data) { + return CrossFile( + name: data.dec(_f$name), + fileType: data.dec(_f$fileType), + size: data.dec(_f$size), + thumbnail: data.dec(_f$thumbnail), + asset: data.dec(_f$asset), + path: data.dec(_f$path), + bytes: data.dec(_f$bytes), + lastModified: data.dec(_f$lastModified), + lastAccessed: data.dec(_f$lastAccessed), + ); + } + + @override + final Function instantiate = _instantiate; + + static CrossFile fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static CrossFile deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin CrossFileMappable { + String serialize() { + return CrossFileMapper.ensureInitialized().encodeJson( + this as CrossFile, + ); + } + + Map toJson() { + return CrossFileMapper.ensureInitialized().encodeMap( + this as CrossFile, + ); + } + + CrossFileCopyWith get copyWith => + _CrossFileCopyWithImpl( + this as CrossFile, + $identity, + $identity, + ); + @override + String toString() { + return CrossFileMapper.ensureInitialized().stringifyValue( + this as CrossFile, + ); + } + + @override + bool operator ==(Object other) { + return CrossFileMapper.ensureInitialized().equalsValue( + this as CrossFile, + other, + ); + } + + @override + int get hashCode { + return CrossFileMapper.ensureInitialized().hashValue(this as CrossFile); + } +} + +extension CrossFileValueCopy<$R, $Out> on ObjectCopyWith<$R, CrossFile, $Out> { + CrossFileCopyWith<$R, CrossFile, $Out> get $asCrossFile => + $base.as((v, t, t2) => _CrossFileCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class CrossFileCopyWith<$R, $In extends CrossFile, $Out> + implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith<$R, int, ObjectCopyWith<$R, int, int>>? get bytes; + $R call({ + String? name, + FileType? fileType, + int? size, + Uint8List? thumbnail, + AssetEntity? asset, + String? path, + List? bytes, + DateTime? lastModified, + DateTime? lastAccessed, + }); + CrossFileCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _CrossFileCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, CrossFile, $Out> + implements CrossFileCopyWith<$R, CrossFile, $Out> { + _CrossFileCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + CrossFileMapper.ensureInitialized(); + @override + ListCopyWith<$R, int, ObjectCopyWith<$R, int, int>>? get bytes => + $value.bytes != null + ? ListCopyWith( + $value.bytes!, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(bytes: v), + ) + : null; + @override + $R call({ + String? name, + FileType? fileType, + int? size, + Object? thumbnail = $none, + Object? asset = $none, + Object? path = $none, + Object? bytes = $none, + Object? lastModified = $none, + Object? lastAccessed = $none, + }) => $apply( + FieldCopyWithData({ + if (name != null) #name: name, + if (fileType != null) #fileType: fileType, + if (size != null) #size: size, + if (thumbnail != $none) #thumbnail: thumbnail, + if (asset != $none) #asset: asset, + if (path != $none) #path: path, + if (bytes != $none) #bytes: bytes, + if (lastModified != $none) #lastModified: lastModified, + if (lastAccessed != $none) #lastAccessed: lastAccessed, + }), + ); + @override + CrossFile $make(CopyWithData data) => CrossFile( + name: data.get(#name, or: $value.name), + fileType: data.get(#fileType, or: $value.fileType), + size: data.get(#size, or: $value.size), + thumbnail: data.get(#thumbnail, or: $value.thumbnail), + asset: data.get(#asset, or: $value.asset), + path: data.get(#path, or: $value.path), + bytes: data.get(#bytes, or: $value.bytes), + lastModified: data.get(#lastModified, or: $value.lastModified), + lastAccessed: data.get(#lastAccessed, or: $value.lastAccessed), + ); + + @override + CrossFileCopyWith<$R2, CrossFile, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _CrossFileCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/log_entry.dart b/app/lib/model/log_entry.dart new file mode 100644 index 0000000..683079d --- /dev/null +++ b/app/lib/model/log_entry.dart @@ -0,0 +1,19 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +part 'log_entry.mapper.dart'; + +@MappableClass() +class LogEntry with LogEntryMappable { + final DateTime timestamp; + final String log; + + const LogEntry({ + required this.timestamp, + required this.log, + }); + + @override + String toString() { + return 'LogEntry(timestamp: $timestamp, log: $log)'; + } +} diff --git a/app/lib/model/log_entry.mapper.dart b/app/lib/model/log_entry.mapper.dart new file mode 100644 index 0000000..a0a5392 --- /dev/null +++ b/app/lib/model/log_entry.mapper.dart @@ -0,0 +1,130 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'log_entry.dart'; + +class LogEntryMapper extends ClassMapperBase { + LogEntryMapper._(); + + static LogEntryMapper? _instance; + static LogEntryMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = LogEntryMapper._()); + } + return _instance!; + } + + @override + final String id = 'LogEntry'; + + static DateTime _$timestamp(LogEntry v) => v.timestamp; + static const Field _f$timestamp = Field( + 'timestamp', + _$timestamp, + ); + static String _$log(LogEntry v) => v.log; + static const Field _f$log = Field('log', _$log); + + @override + final MappableFields fields = const { + #timestamp: _f$timestamp, + #log: _f$log, + }; + + static LogEntry _instantiate(DecodingData data) { + return LogEntry(timestamp: data.dec(_f$timestamp), log: data.dec(_f$log)); + } + + @override + final Function instantiate = _instantiate; + + static LogEntry fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static LogEntry deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin LogEntryMappable { + String serialize() { + return LogEntryMapper.ensureInitialized().encodeJson( + this as LogEntry, + ); + } + + Map toJson() { + return LogEntryMapper.ensureInitialized().encodeMap( + this as LogEntry, + ); + } + + LogEntryCopyWith get copyWith => + _LogEntryCopyWithImpl( + this as LogEntry, + $identity, + $identity, + ); + @override + String toString() { + return LogEntryMapper.ensureInitialized().stringifyValue(this as LogEntry); + } + + @override + bool operator ==(Object other) { + return LogEntryMapper.ensureInitialized().equalsValue( + this as LogEntry, + other, + ); + } + + @override + int get hashCode { + return LogEntryMapper.ensureInitialized().hashValue(this as LogEntry); + } +} + +extension LogEntryValueCopy<$R, $Out> on ObjectCopyWith<$R, LogEntry, $Out> { + LogEntryCopyWith<$R, LogEntry, $Out> get $asLogEntry => + $base.as((v, t, t2) => _LogEntryCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class LogEntryCopyWith<$R, $In extends LogEntry, $Out> + implements ClassCopyWith<$R, $In, $Out> { + $R call({DateTime? timestamp, String? log}); + LogEntryCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _LogEntryCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, LogEntry, $Out> + implements LogEntryCopyWith<$R, LogEntry, $Out> { + _LogEntryCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + LogEntryMapper.ensureInitialized(); + @override + $R call({DateTime? timestamp, String? log}) => $apply( + FieldCopyWithData({ + if (timestamp != null) #timestamp: timestamp, + if (log != null) #log: log, + }), + ); + @override + LogEntry $make(CopyWithData data) => LogEntry( + timestamp: data.get(#timestamp, or: $value.timestamp), + log: data.get(#log, or: $value.log), + ); + + @override + LogEntryCopyWith<$R2, LogEntry, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _LogEntryCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/persistence/color_mode.dart b/app/lib/model/persistence/color_mode.dart new file mode 100644 index 0000000..29bf816 --- /dev/null +++ b/app/lib/model/persistence/color_mode.dart @@ -0,0 +1,6 @@ +enum ColorMode { + system, // dynamic colors + localsend, + oled, + yaru, +} diff --git a/app/lib/model/persistence/favorite_device.dart b/app/lib/model/persistence/favorite_device.dart new file mode 100644 index 0000000..e91e6c5 --- /dev/null +++ b/app/lib/model/persistence/favorite_device.dart @@ -0,0 +1,47 @@ +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:uuid/uuid.dart'; + +part 'favorite_device.mapper.dart'; + +const _uuid = Uuid(); + +@MappableClass() +class FavoriteDevice with FavoriteDeviceMappable { + final String id; + final String fingerprint; + final String ip; + final int port; + final String alias; + + /// If true, the alias was set by the user. + /// If false, the alias is derived from the original device alias and + /// should be updated when the original device alias changes. + final bool customAlias; + + const FavoriteDevice({ + required this.id, + required this.fingerprint, + required this.ip, + required this.port, + required this.alias, + this.customAlias = false, + }); + + factory FavoriteDevice.fromValues({ + required String fingerprint, + required String ip, + required int port, + required String alias, + }) { + return FavoriteDevice( + id: _uuid.v1(), + fingerprint: fingerprint, + ip: ip, + port: port, + alias: alias, + customAlias: false, + ); + } + + static const fromJson = FavoriteDeviceMapper.fromJson; +} diff --git a/app/lib/model/persistence/favorite_device.mapper.dart b/app/lib/model/persistence/favorite_device.mapper.dart new file mode 100644 index 0000000..b004614 --- /dev/null +++ b/app/lib/model/persistence/favorite_device.mapper.dart @@ -0,0 +1,183 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'favorite_device.dart'; + +class FavoriteDeviceMapper extends ClassMapperBase { + FavoriteDeviceMapper._(); + + static FavoriteDeviceMapper? _instance; + static FavoriteDeviceMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = FavoriteDeviceMapper._()); + } + return _instance!; + } + + @override + final String id = 'FavoriteDevice'; + + static String _$id(FavoriteDevice v) => v.id; + static const Field _f$id = Field('id', _$id); + static String _$fingerprint(FavoriteDevice v) => v.fingerprint; + static const Field _f$fingerprint = Field( + 'fingerprint', + _$fingerprint, + ); + static String _$ip(FavoriteDevice v) => v.ip; + static const Field _f$ip = Field('ip', _$ip); + static int _$port(FavoriteDevice v) => v.port; + static const Field _f$port = Field('port', _$port); + static String _$alias(FavoriteDevice v) => v.alias; + static const Field _f$alias = Field('alias', _$alias); + static bool _$customAlias(FavoriteDevice v) => v.customAlias; + static const Field _f$customAlias = Field( + 'customAlias', + _$customAlias, + opt: true, + def: false, + ); + + @override + final MappableFields fields = const { + #id: _f$id, + #fingerprint: _f$fingerprint, + #ip: _f$ip, + #port: _f$port, + #alias: _f$alias, + #customAlias: _f$customAlias, + }; + + static FavoriteDevice _instantiate(DecodingData data) { + return FavoriteDevice( + id: data.dec(_f$id), + fingerprint: data.dec(_f$fingerprint), + ip: data.dec(_f$ip), + port: data.dec(_f$port), + alias: data.dec(_f$alias), + customAlias: data.dec(_f$customAlias), + ); + } + + @override + final Function instantiate = _instantiate; + + static FavoriteDevice fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static FavoriteDevice deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin FavoriteDeviceMappable { + String serialize() { + return FavoriteDeviceMapper.ensureInitialized().encodeJson( + this as FavoriteDevice, + ); + } + + Map toJson() { + return FavoriteDeviceMapper.ensureInitialized().encodeMap( + this as FavoriteDevice, + ); + } + + FavoriteDeviceCopyWith + get copyWith => _FavoriteDeviceCopyWithImpl( + this as FavoriteDevice, + $identity, + $identity, + ); + @override + String toString() { + return FavoriteDeviceMapper.ensureInitialized().stringifyValue( + this as FavoriteDevice, + ); + } + + @override + bool operator ==(Object other) { + return FavoriteDeviceMapper.ensureInitialized().equalsValue( + this as FavoriteDevice, + other, + ); + } + + @override + int get hashCode { + return FavoriteDeviceMapper.ensureInitialized().hashValue( + this as FavoriteDevice, + ); + } +} + +extension FavoriteDeviceValueCopy<$R, $Out> + on ObjectCopyWith<$R, FavoriteDevice, $Out> { + FavoriteDeviceCopyWith<$R, FavoriteDevice, $Out> get $asFavoriteDevice => + $base.as((v, t, t2) => _FavoriteDeviceCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class FavoriteDeviceCopyWith<$R, $In extends FavoriteDevice, $Out> + implements ClassCopyWith<$R, $In, $Out> { + $R call({ + String? id, + String? fingerprint, + String? ip, + int? port, + String? alias, + bool? customAlias, + }); + FavoriteDeviceCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ); +} + +class _FavoriteDeviceCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, FavoriteDevice, $Out> + implements FavoriteDeviceCopyWith<$R, FavoriteDevice, $Out> { + _FavoriteDeviceCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + FavoriteDeviceMapper.ensureInitialized(); + @override + $R call({ + String? id, + String? fingerprint, + String? ip, + int? port, + String? alias, + bool? customAlias, + }) => $apply( + FieldCopyWithData({ + if (id != null) #id: id, + if (fingerprint != null) #fingerprint: fingerprint, + if (ip != null) #ip: ip, + if (port != null) #port: port, + if (alias != null) #alias: alias, + if (customAlias != null) #customAlias: customAlias, + }), + ); + @override + FavoriteDevice $make(CopyWithData data) => FavoriteDevice( + id: data.get(#id, or: $value.id), + fingerprint: data.get(#fingerprint, or: $value.fingerprint), + ip: data.get(#ip, or: $value.ip), + port: data.get(#port, or: $value.port), + alias: data.get(#alias, or: $value.alias), + customAlias: data.get(#customAlias, or: $value.customAlias), + ); + + @override + FavoriteDeviceCopyWith<$R2, FavoriteDevice, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _FavoriteDeviceCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/persistence/receive_history_entry.dart b/app/lib/model/persistence/receive_history_entry.dart new file mode 100644 index 0000000..298748c --- /dev/null +++ b/app/lib/model/persistence/receive_history_entry.dart @@ -0,0 +1,57 @@ +import 'package:common/model/file_type.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:intl/intl.dart'; +import 'package:localsend_app/gen/strings.g.dart'; + +part 'receive_history_entry.mapper.dart'; + +@MappableClass() +class ReceiveHistoryEntry with ReceiveHistoryEntryMappable { + final String id; + + /// The name of the file. + /// If [isMessage] is true, this is the message content. + final String fileName; + + final FileType fileType; + final String? path; + final bool savedToGallery; + + @MappableField(hook: IsMessageHook()) + final bool isMessage; + + final int fileSize; + final String senderAlias; + final DateTime timestamp; + + const ReceiveHistoryEntry({ + required this.id, + required this.fileName, + required this.fileType, + required this.path, + required this.savedToGallery, + required this.isMessage, + required this.fileSize, + required this.senderAlias, + required this.timestamp, + }); + + /// Format string using the intl package. + /// Because the raw timestamp is saved in UTC, we need to transform it to local time zone first. + String get timestampString { + final localTimestamp = timestamp.toLocal(); + final languageTag = LocaleSettings.currentLocale.languageTag; + return '${DateFormat.yMd(languageTag).format(localTimestamp)} ${DateFormat.jm(languageTag).format(localTimestamp)}'; + } + + static const fromJson = ReceiveHistoryEntryMapper.fromJson; +} + +class IsMessageHook extends MappingHook { + const IsMessageHook(); + + @override + Object? beforeDecode(Object? value) { + return value == true; + } +} diff --git a/app/lib/model/persistence/receive_history_entry.mapper.dart b/app/lib/model/persistence/receive_history_entry.mapper.dart new file mode 100644 index 0000000..51a68cd --- /dev/null +++ b/app/lib/model/persistence/receive_history_entry.mapper.dart @@ -0,0 +1,233 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'receive_history_entry.dart'; + +class ReceiveHistoryEntryMapper extends ClassMapperBase { + ReceiveHistoryEntryMapper._(); + + static ReceiveHistoryEntryMapper? _instance; + static ReceiveHistoryEntryMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = ReceiveHistoryEntryMapper._()); + FileTypeMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'ReceiveHistoryEntry'; + + static String _$id(ReceiveHistoryEntry v) => v.id; + static const Field _f$id = Field('id', _$id); + static String _$fileName(ReceiveHistoryEntry v) => v.fileName; + static const Field _f$fileName = Field( + 'fileName', + _$fileName, + ); + static FileType _$fileType(ReceiveHistoryEntry v) => v.fileType; + static const Field _f$fileType = Field( + 'fileType', + _$fileType, + ); + static String? _$path(ReceiveHistoryEntry v) => v.path; + static const Field _f$path = Field( + 'path', + _$path, + ); + static bool _$savedToGallery(ReceiveHistoryEntry v) => v.savedToGallery; + static const Field _f$savedToGallery = Field( + 'savedToGallery', + _$savedToGallery, + ); + static bool _$isMessage(ReceiveHistoryEntry v) => v.isMessage; + static const Field _f$isMessage = Field( + 'isMessage', + _$isMessage, + hook: IsMessageHook(), + ); + static int _$fileSize(ReceiveHistoryEntry v) => v.fileSize; + static const Field _f$fileSize = Field( + 'fileSize', + _$fileSize, + ); + static String _$senderAlias(ReceiveHistoryEntry v) => v.senderAlias; + static const Field _f$senderAlias = Field( + 'senderAlias', + _$senderAlias, + ); + static DateTime _$timestamp(ReceiveHistoryEntry v) => v.timestamp; + static const Field _f$timestamp = Field( + 'timestamp', + _$timestamp, + ); + + @override + final MappableFields fields = const { + #id: _f$id, + #fileName: _f$fileName, + #fileType: _f$fileType, + #path: _f$path, + #savedToGallery: _f$savedToGallery, + #isMessage: _f$isMessage, + #fileSize: _f$fileSize, + #senderAlias: _f$senderAlias, + #timestamp: _f$timestamp, + }; + + static ReceiveHistoryEntry _instantiate(DecodingData data) { + return ReceiveHistoryEntry( + id: data.dec(_f$id), + fileName: data.dec(_f$fileName), + fileType: data.dec(_f$fileType), + path: data.dec(_f$path), + savedToGallery: data.dec(_f$savedToGallery), + isMessage: data.dec(_f$isMessage), + fileSize: data.dec(_f$fileSize), + senderAlias: data.dec(_f$senderAlias), + timestamp: data.dec(_f$timestamp), + ); + } + + @override + final Function instantiate = _instantiate; + + static ReceiveHistoryEntry fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static ReceiveHistoryEntry deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin ReceiveHistoryEntryMappable { + String serialize() { + return ReceiveHistoryEntryMapper.ensureInitialized() + .encodeJson(this as ReceiveHistoryEntry); + } + + Map toJson() { + return ReceiveHistoryEntryMapper.ensureInitialized() + .encodeMap(this as ReceiveHistoryEntry); + } + + ReceiveHistoryEntryCopyWith< + ReceiveHistoryEntry, + ReceiveHistoryEntry, + ReceiveHistoryEntry + > + get copyWith => + _ReceiveHistoryEntryCopyWithImpl< + ReceiveHistoryEntry, + ReceiveHistoryEntry + >(this as ReceiveHistoryEntry, $identity, $identity); + @override + String toString() { + return ReceiveHistoryEntryMapper.ensureInitialized().stringifyValue( + this as ReceiveHistoryEntry, + ); + } + + @override + bool operator ==(Object other) { + return ReceiveHistoryEntryMapper.ensureInitialized().equalsValue( + this as ReceiveHistoryEntry, + other, + ); + } + + @override + int get hashCode { + return ReceiveHistoryEntryMapper.ensureInitialized().hashValue( + this as ReceiveHistoryEntry, + ); + } +} + +extension ReceiveHistoryEntryValueCopy<$R, $Out> + on ObjectCopyWith<$R, ReceiveHistoryEntry, $Out> { + ReceiveHistoryEntryCopyWith<$R, ReceiveHistoryEntry, $Out> + get $asReceiveHistoryEntry => $base.as( + (v, t, t2) => _ReceiveHistoryEntryCopyWithImpl<$R, $Out>(v, t, t2), + ); +} + +abstract class ReceiveHistoryEntryCopyWith< + $R, + $In extends ReceiveHistoryEntry, + $Out +> + implements ClassCopyWith<$R, $In, $Out> { + $R call({ + String? id, + String? fileName, + FileType? fileType, + String? path, + bool? savedToGallery, + bool? isMessage, + int? fileSize, + String? senderAlias, + DateTime? timestamp, + }); + ReceiveHistoryEntryCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ); +} + +class _ReceiveHistoryEntryCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, ReceiveHistoryEntry, $Out> + implements ReceiveHistoryEntryCopyWith<$R, ReceiveHistoryEntry, $Out> { + _ReceiveHistoryEntryCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + ReceiveHistoryEntryMapper.ensureInitialized(); + @override + $R call({ + String? id, + String? fileName, + FileType? fileType, + Object? path = $none, + bool? savedToGallery, + bool? isMessage, + int? fileSize, + String? senderAlias, + DateTime? timestamp, + }) => $apply( + FieldCopyWithData({ + if (id != null) #id: id, + if (fileName != null) #fileName: fileName, + if (fileType != null) #fileType: fileType, + if (path != $none) #path: path, + if (savedToGallery != null) #savedToGallery: savedToGallery, + if (isMessage != null) #isMessage: isMessage, + if (fileSize != null) #fileSize: fileSize, + if (senderAlias != null) #senderAlias: senderAlias, + if (timestamp != null) #timestamp: timestamp, + }), + ); + @override + ReceiveHistoryEntry $make(CopyWithData data) => ReceiveHistoryEntry( + id: data.get(#id, or: $value.id), + fileName: data.get(#fileName, or: $value.fileName), + fileType: data.get(#fileType, or: $value.fileType), + path: data.get(#path, or: $value.path), + savedToGallery: data.get(#savedToGallery, or: $value.savedToGallery), + isMessage: data.get(#isMessage, or: $value.isMessage), + fileSize: data.get(#fileSize, or: $value.fileSize), + senderAlias: data.get(#senderAlias, or: $value.senderAlias), + timestamp: data.get(#timestamp, or: $value.timestamp), + ); + + @override + ReceiveHistoryEntryCopyWith<$R2, ReceiveHistoryEntry, $Out2> + $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _ReceiveHistoryEntryCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/send_mode.dart b/app/lib/model/send_mode.dart new file mode 100644 index 0000000..438122c --- /dev/null +++ b/app/lib/model/send_mode.dart @@ -0,0 +1,5 @@ +enum SendMode { + single, // 1:1 file transfer + multiple, // 1:n file transfer + link, // 1:n file transfer but receiver needs to initiate +} diff --git a/app/lib/model/state/nearby_devices_state.dart b/app/lib/model/state/nearby_devices_state.dart new file mode 100644 index 0000000..3ac4c96 --- /dev/null +++ b/app/lib/model/state/nearby_devices_state.dart @@ -0,0 +1,60 @@ +import 'package:common/model/device.dart'; +import 'package:dart_mappable/dart_mappable.dart'; + +part 'nearby_devices_state.mapper.dart'; + +@MappableClass() +class NearbyDevicesState with NearbyDevicesStateMappable { + final bool runningFavoriteScan; + final Set runningIps; // list of local ips + final Map devices; // ip -> device + + /// Devices that are discovered via signaling server. + /// The key is the fingerprint of the device. + /// We do not trust the fingerprint, so we allow multiple devices with the same fingerprint. + final Map> signalingDevices; + + const NearbyDevicesState({ + required this.runningFavoriteScan, + required this.runningIps, + required this.devices, + required this.signalingDevices, + }); + + Map get allDevices { + final Map allDevices = {}; + allDevices.addAll(devices); + for (final devices in signalingDevices.values) { + for (final device in devices) { + final currentDevice = allDevices[device.fingerprint]; + if (currentDevice != null && currentDevice.alias == device.alias) { + allDevices[device.fingerprint] = currentDevice.merge(device); + } else { + allDevices[device.fingerprint] = device; + } + } + } + return allDevices; + } +} + +extension on Device { + Device merge(Device other) { + return Device( + signalingId: signalingId ?? other.signalingId, + ip: ip ?? other.ip, + version: version, + port: port, + https: https, + fingerprint: fingerprint, + alias: alias, + deviceModel: deviceModel, + deviceType: deviceType, + download: download, + discoveryMethods: { + ...discoveryMethods, + ...other.discoveryMethods, + }, + ); + } +} diff --git a/app/lib/model/state/nearby_devices_state.mapper.dart b/app/lib/model/state/nearby_devices_state.mapper.dart new file mode 100644 index 0000000..3f73feb --- /dev/null +++ b/app/lib/model/state/nearby_devices_state.mapper.dart @@ -0,0 +1,211 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'nearby_devices_state.dart'; + +class NearbyDevicesStateMapper extends ClassMapperBase { + NearbyDevicesStateMapper._(); + + static NearbyDevicesStateMapper? _instance; + static NearbyDevicesStateMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = NearbyDevicesStateMapper._()); + DeviceMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'NearbyDevicesState'; + + static bool _$runningFavoriteScan(NearbyDevicesState v) => + v.runningFavoriteScan; + static const Field _f$runningFavoriteScan = Field( + 'runningFavoriteScan', + _$runningFavoriteScan, + ); + static Set _$runningIps(NearbyDevicesState v) => v.runningIps; + static const Field> _f$runningIps = Field( + 'runningIps', + _$runningIps, + ); + static Map _$devices(NearbyDevicesState v) => v.devices; + static const Field> _f$devices = + Field('devices', _$devices); + static Map> _$signalingDevices(NearbyDevicesState v) => + v.signalingDevices; + static const Field>> + _f$signalingDevices = Field('signalingDevices', _$signalingDevices); + + @override + final MappableFields fields = const { + #runningFavoriteScan: _f$runningFavoriteScan, + #runningIps: _f$runningIps, + #devices: _f$devices, + #signalingDevices: _f$signalingDevices, + }; + + static NearbyDevicesState _instantiate(DecodingData data) { + return NearbyDevicesState( + runningFavoriteScan: data.dec(_f$runningFavoriteScan), + runningIps: data.dec(_f$runningIps), + devices: data.dec(_f$devices), + signalingDevices: data.dec(_f$signalingDevices), + ); + } + + @override + final Function instantiate = _instantiate; + + static NearbyDevicesState fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static NearbyDevicesState deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin NearbyDevicesStateMappable { + String serialize() { + return NearbyDevicesStateMapper.ensureInitialized() + .encodeJson(this as NearbyDevicesState); + } + + Map toJson() { + return NearbyDevicesStateMapper.ensureInitialized() + .encodeMap(this as NearbyDevicesState); + } + + NearbyDevicesStateCopyWith< + NearbyDevicesState, + NearbyDevicesState, + NearbyDevicesState + > + get copyWith => + _NearbyDevicesStateCopyWithImpl( + this as NearbyDevicesState, + $identity, + $identity, + ); + @override + String toString() { + return NearbyDevicesStateMapper.ensureInitialized().stringifyValue( + this as NearbyDevicesState, + ); + } + + @override + bool operator ==(Object other) { + return NearbyDevicesStateMapper.ensureInitialized().equalsValue( + this as NearbyDevicesState, + other, + ); + } + + @override + int get hashCode { + return NearbyDevicesStateMapper.ensureInitialized().hashValue( + this as NearbyDevicesState, + ); + } +} + +extension NearbyDevicesStateValueCopy<$R, $Out> + on ObjectCopyWith<$R, NearbyDevicesState, $Out> { + NearbyDevicesStateCopyWith<$R, NearbyDevicesState, $Out> + get $asNearbyDevicesState => $base.as( + (v, t, t2) => _NearbyDevicesStateCopyWithImpl<$R, $Out>(v, t, t2), + ); +} + +abstract class NearbyDevicesStateCopyWith< + $R, + $In extends NearbyDevicesState, + $Out +> + implements ClassCopyWith<$R, $In, $Out> { + MapCopyWith<$R, String, Device, DeviceCopyWith<$R, Device, Device>> + get devices; + MapCopyWith< + $R, + String, + Set, + ObjectCopyWith<$R, Set, Set> + > + get signalingDevices; + $R call({ + bool? runningFavoriteScan, + Set? runningIps, + Map? devices, + Map>? signalingDevices, + }); + NearbyDevicesStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ); +} + +class _NearbyDevicesStateCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, NearbyDevicesState, $Out> + implements NearbyDevicesStateCopyWith<$R, NearbyDevicesState, $Out> { + _NearbyDevicesStateCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + NearbyDevicesStateMapper.ensureInitialized(); + @override + MapCopyWith<$R, String, Device, DeviceCopyWith<$R, Device, Device>> + get devices => MapCopyWith( + $value.devices, + (v, t) => v.copyWith.$chain(t), + (v) => call(devices: v), + ); + @override + MapCopyWith< + $R, + String, + Set, + ObjectCopyWith<$R, Set, Set> + > + get signalingDevices => MapCopyWith( + $value.signalingDevices, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(signalingDevices: v), + ); + @override + $R call({ + bool? runningFavoriteScan, + Set? runningIps, + Map? devices, + Map>? signalingDevices, + }) => $apply( + FieldCopyWithData({ + if (runningFavoriteScan != null) + #runningFavoriteScan: runningFavoriteScan, + if (runningIps != null) #runningIps: runningIps, + if (devices != null) #devices: devices, + if (signalingDevices != null) #signalingDevices: signalingDevices, + }), + ); + @override + NearbyDevicesState $make(CopyWithData data) => NearbyDevicesState( + runningFavoriteScan: data.get( + #runningFavoriteScan, + or: $value.runningFavoriteScan, + ), + runningIps: data.get(#runningIps, or: $value.runningIps), + devices: data.get(#devices, or: $value.devices), + signalingDevices: data.get(#signalingDevices, or: $value.signalingDevices), + ); + + @override + NearbyDevicesStateCopyWith<$R2, NearbyDevicesState, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _NearbyDevicesStateCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/state/network_state.dart b/app/lib/model/state/network_state.dart new file mode 100644 index 0000000..ad90648 --- /dev/null +++ b/app/lib/model/state/network_state.dart @@ -0,0 +1,14 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +part 'network_state.mapper.dart'; + +@MappableClass() +class NetworkState with NetworkStateMappable { + final List localIps; + final bool initialized; + + const NetworkState({ + required this.localIps, + required this.initialized, + }); +} diff --git a/app/lib/model/state/network_state.mapper.dart b/app/lib/model/state/network_state.mapper.dart new file mode 100644 index 0000000..d673609 --- /dev/null +++ b/app/lib/model/state/network_state.mapper.dart @@ -0,0 +1,149 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'network_state.dart'; + +class NetworkStateMapper extends ClassMapperBase { + NetworkStateMapper._(); + + static NetworkStateMapper? _instance; + static NetworkStateMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = NetworkStateMapper._()); + } + return _instance!; + } + + @override + final String id = 'NetworkState'; + + static List _$localIps(NetworkState v) => v.localIps; + static const Field> _f$localIps = Field( + 'localIps', + _$localIps, + ); + static bool _$initialized(NetworkState v) => v.initialized; + static const Field _f$initialized = Field( + 'initialized', + _$initialized, + ); + + @override + final MappableFields fields = const { + #localIps: _f$localIps, + #initialized: _f$initialized, + }; + + static NetworkState _instantiate(DecodingData data) { + return NetworkState( + localIps: data.dec(_f$localIps), + initialized: data.dec(_f$initialized), + ); + } + + @override + final Function instantiate = _instantiate; + + static NetworkState fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static NetworkState deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin NetworkStateMappable { + String serialize() { + return NetworkStateMapper.ensureInitialized().encodeJson( + this as NetworkState, + ); + } + + Map toJson() { + return NetworkStateMapper.ensureInitialized().encodeMap( + this as NetworkState, + ); + } + + NetworkStateCopyWith get copyWith => + _NetworkStateCopyWithImpl( + this as NetworkState, + $identity, + $identity, + ); + @override + String toString() { + return NetworkStateMapper.ensureInitialized().stringifyValue( + this as NetworkState, + ); + } + + @override + bool operator ==(Object other) { + return NetworkStateMapper.ensureInitialized().equalsValue( + this as NetworkState, + other, + ); + } + + @override + int get hashCode { + return NetworkStateMapper.ensureInitialized().hashValue( + this as NetworkState, + ); + } +} + +extension NetworkStateValueCopy<$R, $Out> + on ObjectCopyWith<$R, NetworkState, $Out> { + NetworkStateCopyWith<$R, NetworkState, $Out> get $asNetworkState => + $base.as((v, t, t2) => _NetworkStateCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class NetworkStateCopyWith<$R, $In extends NetworkState, $Out> + implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>> get localIps; + $R call({List? localIps, bool? initialized}); + NetworkStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _NetworkStateCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, NetworkState, $Out> + implements NetworkStateCopyWith<$R, NetworkState, $Out> { + _NetworkStateCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + NetworkStateMapper.ensureInitialized(); + @override + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>> get localIps => + ListCopyWith( + $value.localIps, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(localIps: v), + ); + @override + $R call({List? localIps, bool? initialized}) => $apply( + FieldCopyWithData({ + if (localIps != null) #localIps: localIps, + if (initialized != null) #initialized: initialized, + }), + ); + @override + NetworkState $make(CopyWithData data) => NetworkState( + localIps: data.get(#localIps, or: $value.localIps), + initialized: data.get(#initialized, or: $value.initialized), + ); + + @override + NetworkStateCopyWith<$R2, NetworkState, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _NetworkStateCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/state/purchase_state.dart b/app/lib/model/state/purchase_state.dart new file mode 100644 index 0000000..4541669 --- /dev/null +++ b/app/lib/model/state/purchase_state.dart @@ -0,0 +1,46 @@ +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:flutter/foundation.dart'; + +part 'purchase_state.mapper.dart'; + +enum PurchaseItem { + donate5( + androidId: 'localsend_android_donate_5', + iosId: 'localsend_ios_donate_5', + ), + donate10( + androidId: 'localsend_android_donate_10', + iosId: 'localsend_ios_donate_10', + ), + donate20( + androidId: 'localsend_android_donate_20', + iosId: 'localsend_ios_donate_20', + ), + donate50( + androidId: 'localsend_android_donate_50', + iosId: 'localsend_ios_donate_50', + ); + + const PurchaseItem({ + required this.androidId, + required this.iosId, + }); + + final String androidId; + final String iosId; + + String get platformProductId => defaultTargetPlatform == TargetPlatform.android ? androidId : iosId; +} + +@MappableClass() +class PurchaseState with PurchaseStateMappable { + final Map prices; + final Set purchases; + final bool pending; + + const PurchaseState({ + required this.prices, + required this.purchases, + required this.pending, + }); +} diff --git a/app/lib/model/state/purchase_state.mapper.dart b/app/lib/model/state/purchase_state.mapper.dart new file mode 100644 index 0000000..1f8df61 --- /dev/null +++ b/app/lib/model/state/purchase_state.mapper.dart @@ -0,0 +1,165 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'purchase_state.dart'; + +class PurchaseStateMapper extends ClassMapperBase { + PurchaseStateMapper._(); + + static PurchaseStateMapper? _instance; + static PurchaseStateMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = PurchaseStateMapper._()); + } + return _instance!; + } + + @override + final String id = 'PurchaseState'; + + static Map _$prices(PurchaseState v) => v.prices; + static const Field> _f$prices = + Field('prices', _$prices); + static Set _$purchases(PurchaseState v) => v.purchases; + static const Field> _f$purchases = Field( + 'purchases', + _$purchases, + ); + static bool _$pending(PurchaseState v) => v.pending; + static const Field _f$pending = Field( + 'pending', + _$pending, + ); + + @override + final MappableFields fields = const { + #prices: _f$prices, + #purchases: _f$purchases, + #pending: _f$pending, + }; + + static PurchaseState _instantiate(DecodingData data) { + return PurchaseState( + prices: data.dec(_f$prices), + purchases: data.dec(_f$purchases), + pending: data.dec(_f$pending), + ); + } + + @override + final Function instantiate = _instantiate; + + static PurchaseState fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static PurchaseState deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin PurchaseStateMappable { + String serialize() { + return PurchaseStateMapper.ensureInitialized().encodeJson( + this as PurchaseState, + ); + } + + Map toJson() { + return PurchaseStateMapper.ensureInitialized().encodeMap( + this as PurchaseState, + ); + } + + PurchaseStateCopyWith + get copyWith => _PurchaseStateCopyWithImpl( + this as PurchaseState, + $identity, + $identity, + ); + @override + String toString() { + return PurchaseStateMapper.ensureInitialized().stringifyValue( + this as PurchaseState, + ); + } + + @override + bool operator ==(Object other) { + return PurchaseStateMapper.ensureInitialized().equalsValue( + this as PurchaseState, + other, + ); + } + + @override + int get hashCode { + return PurchaseStateMapper.ensureInitialized().hashValue( + this as PurchaseState, + ); + } +} + +extension PurchaseStateValueCopy<$R, $Out> + on ObjectCopyWith<$R, PurchaseState, $Out> { + PurchaseStateCopyWith<$R, PurchaseState, $Out> get $asPurchaseState => + $base.as((v, t, t2) => _PurchaseStateCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class PurchaseStateCopyWith<$R, $In extends PurchaseState, $Out> + implements ClassCopyWith<$R, $In, $Out> { + MapCopyWith<$R, PurchaseItem, String, ObjectCopyWith<$R, String, String>> + get prices; + $R call({ + Map? prices, + Set? purchases, + bool? pending, + }); + PurchaseStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _PurchaseStateCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, PurchaseState, $Out> + implements PurchaseStateCopyWith<$R, PurchaseState, $Out> { + _PurchaseStateCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + PurchaseStateMapper.ensureInitialized(); + @override + MapCopyWith<$R, PurchaseItem, String, ObjectCopyWith<$R, String, String>> + get prices => MapCopyWith( + $value.prices, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(prices: v), + ); + @override + $R call({ + Map? prices, + Set? purchases, + bool? pending, + }) => $apply( + FieldCopyWithData({ + if (prices != null) #prices: prices, + if (purchases != null) #purchases: purchases, + if (pending != null) #pending: pending, + }), + ); + @override + PurchaseState $make(CopyWithData data) => PurchaseState( + prices: data.get(#prices, or: $value.prices), + purchases: data.get(#purchases, or: $value.purchases), + pending: data.get(#pending, or: $value.pending), + ); + + @override + PurchaseStateCopyWith<$R2, PurchaseState, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _PurchaseStateCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/state/send/send_session_state.dart b/app/lib/model/state/send/send_session_state.dart new file mode 100644 index 0000000..87a7b93 --- /dev/null +++ b/app/lib/model/state/send/send_session_state.dart @@ -0,0 +1,60 @@ +import 'package:common/model/device.dart'; +import 'package:common/model/session_status.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:localsend_app/model/state/send/sending_file.dart'; +import 'package:localsend_app/model/state/server/receive_session_state.dart'; + +part 'send_session_state.mapper.dart'; + +@MappableClass() +class SendSessionState with SendSessionStateMappable implements SessionState { + final String sessionId; + final String? remoteSessionId; // v2 + final bool background; + + @override + final SessionStatus status; + + final Device target; + final Map files; // file id as key + + @override + final int? startTime; + + @override + final int? endTime; + + final List? sendingTasks; // used to cancel tasks + final String? errorMessage; + + const SendSessionState({ + required this.sessionId, + required this.remoteSessionId, + required this.background, + required this.status, + required this.target, + required this.files, + required this.startTime, + required this.endTime, + required this.sendingTasks, + required this.errorMessage, + }); + + /// Custom toString() to avoid printing the bytes. + /// The default toString() does not respect the overridden toString() of + /// SendingFile. + @override + String toString() { + return 'SendSessionState(sessionId: $sessionId, remoteSessionId: $remoteSessionId, background: $background, status: $status, target: $target, files: $files, startTime: $startTime, endTime: $endTime, sendingTasks: $sendingTasks, errorMessage: $errorMessage)'; + } +} + +class SendingTask { + final int isolateIndex; + final int taskId; + + SendingTask({ + required this.isolateIndex, + required this.taskId, + }); +} diff --git a/app/lib/model/state/send/send_session_state.mapper.dart b/app/lib/model/state/send/send_session_state.mapper.dart new file mode 100644 index 0000000..1fd8467 --- /dev/null +++ b/app/lib/model/state/send/send_session_state.mapper.dart @@ -0,0 +1,270 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'send_session_state.dart'; + +class SendSessionStateMapper extends ClassMapperBase { + SendSessionStateMapper._(); + + static SendSessionStateMapper? _instance; + static SendSessionStateMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = SendSessionStateMapper._()); + DeviceMapper.ensureInitialized(); + SendingFileMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'SendSessionState'; + + static String _$sessionId(SendSessionState v) => v.sessionId; + static const Field _f$sessionId = Field( + 'sessionId', + _$sessionId, + ); + static String? _$remoteSessionId(SendSessionState v) => v.remoteSessionId; + static const Field _f$remoteSessionId = Field( + 'remoteSessionId', + _$remoteSessionId, + ); + static bool _$background(SendSessionState v) => v.background; + static const Field _f$background = Field( + 'background', + _$background, + ); + static SessionStatus _$status(SendSessionState v) => v.status; + static const Field _f$status = Field( + 'status', + _$status, + ); + static Device _$target(SendSessionState v) => v.target; + static const Field _f$target = Field( + 'target', + _$target, + ); + static Map _$files(SendSessionState v) => v.files; + static const Field> _f$files = + Field('files', _$files); + static int? _$startTime(SendSessionState v) => v.startTime; + static const Field _f$startTime = Field( + 'startTime', + _$startTime, + ); + static int? _$endTime(SendSessionState v) => v.endTime; + static const Field _f$endTime = Field( + 'endTime', + _$endTime, + ); + static List? _$sendingTasks(SendSessionState v) => + v.sendingTasks; + static const Field> _f$sendingTasks = + Field('sendingTasks', _$sendingTasks); + static String? _$errorMessage(SendSessionState v) => v.errorMessage; + static const Field _f$errorMessage = Field( + 'errorMessage', + _$errorMessage, + ); + + @override + final MappableFields fields = const { + #sessionId: _f$sessionId, + #remoteSessionId: _f$remoteSessionId, + #background: _f$background, + #status: _f$status, + #target: _f$target, + #files: _f$files, + #startTime: _f$startTime, + #endTime: _f$endTime, + #sendingTasks: _f$sendingTasks, + #errorMessage: _f$errorMessage, + }; + + static SendSessionState _instantiate(DecodingData data) { + return SendSessionState( + sessionId: data.dec(_f$sessionId), + remoteSessionId: data.dec(_f$remoteSessionId), + background: data.dec(_f$background), + status: data.dec(_f$status), + target: data.dec(_f$target), + files: data.dec(_f$files), + startTime: data.dec(_f$startTime), + endTime: data.dec(_f$endTime), + sendingTasks: data.dec(_f$sendingTasks), + errorMessage: data.dec(_f$errorMessage), + ); + } + + @override + final Function instantiate = _instantiate; + + static SendSessionState fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static SendSessionState deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin SendSessionStateMappable { + String serialize() { + return SendSessionStateMapper.ensureInitialized() + .encodeJson(this as SendSessionState); + } + + Map toJson() { + return SendSessionStateMapper.ensureInitialized() + .encodeMap(this as SendSessionState); + } + + SendSessionStateCopyWith + get copyWith => + _SendSessionStateCopyWithImpl( + this as SendSessionState, + $identity, + $identity, + ); + @override + String toString() { + return SendSessionStateMapper.ensureInitialized().stringifyValue( + this as SendSessionState, + ); + } + + @override + bool operator ==(Object other) { + return SendSessionStateMapper.ensureInitialized().equalsValue( + this as SendSessionState, + other, + ); + } + + @override + int get hashCode { + return SendSessionStateMapper.ensureInitialized().hashValue( + this as SendSessionState, + ); + } +} + +extension SendSessionStateValueCopy<$R, $Out> + on ObjectCopyWith<$R, SendSessionState, $Out> { + SendSessionStateCopyWith<$R, SendSessionState, $Out> + get $asSendSessionState => + $base.as((v, t, t2) => _SendSessionStateCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class SendSessionStateCopyWith<$R, $In extends SendSessionState, $Out> + implements ClassCopyWith<$R, $In, $Out> { + DeviceCopyWith<$R, Device, Device> get target; + MapCopyWith< + $R, + String, + SendingFile, + SendingFileCopyWith<$R, SendingFile, SendingFile> + > + get files; + ListCopyWith<$R, SendingTask, ObjectCopyWith<$R, SendingTask, SendingTask>>? + get sendingTasks; + $R call({ + String? sessionId, + String? remoteSessionId, + bool? background, + SessionStatus? status, + Device? target, + Map? files, + int? startTime, + int? endTime, + List? sendingTasks, + String? errorMessage, + }); + SendSessionStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ); +} + +class _SendSessionStateCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, SendSessionState, $Out> + implements SendSessionStateCopyWith<$R, SendSessionState, $Out> { + _SendSessionStateCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + SendSessionStateMapper.ensureInitialized(); + @override + DeviceCopyWith<$R, Device, Device> get target => + $value.target.copyWith.$chain((v) => call(target: v)); + @override + MapCopyWith< + $R, + String, + SendingFile, + SendingFileCopyWith<$R, SendingFile, SendingFile> + > + get files => MapCopyWith( + $value.files, + (v, t) => v.copyWith.$chain(t), + (v) => call(files: v), + ); + @override + ListCopyWith<$R, SendingTask, ObjectCopyWith<$R, SendingTask, SendingTask>>? + get sendingTasks => $value.sendingTasks != null + ? ListCopyWith( + $value.sendingTasks!, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(sendingTasks: v), + ) + : null; + @override + $R call({ + String? sessionId, + Object? remoteSessionId = $none, + bool? background, + SessionStatus? status, + Device? target, + Map? files, + Object? startTime = $none, + Object? endTime = $none, + Object? sendingTasks = $none, + Object? errorMessage = $none, + }) => $apply( + FieldCopyWithData({ + if (sessionId != null) #sessionId: sessionId, + if (remoteSessionId != $none) #remoteSessionId: remoteSessionId, + if (background != null) #background: background, + if (status != null) #status: status, + if (target != null) #target: target, + if (files != null) #files: files, + if (startTime != $none) #startTime: startTime, + if (endTime != $none) #endTime: endTime, + if (sendingTasks != $none) #sendingTasks: sendingTasks, + if (errorMessage != $none) #errorMessage: errorMessage, + }), + ); + @override + SendSessionState $make(CopyWithData data) => SendSessionState( + sessionId: data.get(#sessionId, or: $value.sessionId), + remoteSessionId: data.get(#remoteSessionId, or: $value.remoteSessionId), + background: data.get(#background, or: $value.background), + status: data.get(#status, or: $value.status), + target: data.get(#target, or: $value.target), + files: data.get(#files, or: $value.files), + startTime: data.get(#startTime, or: $value.startTime), + endTime: data.get(#endTime, or: $value.endTime), + sendingTasks: data.get(#sendingTasks, or: $value.sendingTasks), + errorMessage: data.get(#errorMessage, or: $value.errorMessage), + ); + + @override + SendSessionStateCopyWith<$R2, SendSessionState, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _SendSessionStateCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/state/send/sending_file.dart b/app/lib/model/state/send/sending_file.dart new file mode 100644 index 0000000..89377a4 --- /dev/null +++ b/app/lib/model/state/send/sending_file.dart @@ -0,0 +1,37 @@ +import 'dart:typed_data'; + +import 'package:common/model/dto/file_dto.dart'; +import 'package:common/model/file_status.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:wechat_assets_picker/wechat_assets_picker.dart'; + +part 'sending_file.mapper.dart'; + +@MappableClass() +class SendingFile with SendingFileMappable { + final FileDto file; + final FileStatus status; + final String? token; + final Uint8List? thumbnail; + final AssetEntity? asset; // for thumbnails + final String? path; // android, iOS, desktop + final List? bytes; // web + final String? errorMessage; // when status == failed + + const SendingFile({ + required this.file, + required this.status, + required this.token, + required this.thumbnail, + required this.asset, + required this.path, + required this.bytes, + required this.errorMessage, + }); + + /// Custom toString() to avoid printing the bytes. + @override + String toString() { + return 'SendingFile(file: $file, status: $status, token: $token, thumbnail: ${thumbnail != null ? thumbnail!.length : 'null'}, asset: $asset, path: $path, bytes: ${bytes != null ? bytes!.length : 'null'}, errorMessage: $errorMessage)'; + } +} diff --git a/app/lib/model/state/send/sending_file.mapper.dart b/app/lib/model/state/send/sending_file.mapper.dart new file mode 100644 index 0000000..4a9719a --- /dev/null +++ b/app/lib/model/state/send/sending_file.mapper.dart @@ -0,0 +1,209 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'sending_file.dart'; + +class SendingFileMapper extends ClassMapperBase { + SendingFileMapper._(); + + static SendingFileMapper? _instance; + static SendingFileMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = SendingFileMapper._()); + } + return _instance!; + } + + @override + final String id = 'SendingFile'; + + static FileDto _$file(SendingFile v) => v.file; + static const Field _f$file = Field('file', _$file); + static FileStatus _$status(SendingFile v) => v.status; + static const Field _f$status = Field( + 'status', + _$status, + ); + static String? _$token(SendingFile v) => v.token; + static const Field _f$token = Field('token', _$token); + static Uint8List? _$thumbnail(SendingFile v) => v.thumbnail; + static const Field _f$thumbnail = Field( + 'thumbnail', + _$thumbnail, + ); + static AssetEntity? _$asset(SendingFile v) => v.asset; + static const Field _f$asset = Field( + 'asset', + _$asset, + ); + static String? _$path(SendingFile v) => v.path; + static const Field _f$path = Field('path', _$path); + static List? _$bytes(SendingFile v) => v.bytes; + static const Field> _f$bytes = Field('bytes', _$bytes); + static String? _$errorMessage(SendingFile v) => v.errorMessage; + static const Field _f$errorMessage = Field( + 'errorMessage', + _$errorMessage, + ); + + @override + final MappableFields fields = const { + #file: _f$file, + #status: _f$status, + #token: _f$token, + #thumbnail: _f$thumbnail, + #asset: _f$asset, + #path: _f$path, + #bytes: _f$bytes, + #errorMessage: _f$errorMessage, + }; + + static SendingFile _instantiate(DecodingData data) { + return SendingFile( + file: data.dec(_f$file), + status: data.dec(_f$status), + token: data.dec(_f$token), + thumbnail: data.dec(_f$thumbnail), + asset: data.dec(_f$asset), + path: data.dec(_f$path), + bytes: data.dec(_f$bytes), + errorMessage: data.dec(_f$errorMessage), + ); + } + + @override + final Function instantiate = _instantiate; + + static SendingFile fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static SendingFile deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin SendingFileMappable { + String serialize() { + return SendingFileMapper.ensureInitialized().encodeJson( + this as SendingFile, + ); + } + + Map toJson() { + return SendingFileMapper.ensureInitialized().encodeMap( + this as SendingFile, + ); + } + + SendingFileCopyWith get copyWith => + _SendingFileCopyWithImpl( + this as SendingFile, + $identity, + $identity, + ); + @override + String toString() { + return SendingFileMapper.ensureInitialized().stringifyValue( + this as SendingFile, + ); + } + + @override + bool operator ==(Object other) { + return SendingFileMapper.ensureInitialized().equalsValue( + this as SendingFile, + other, + ); + } + + @override + int get hashCode { + return SendingFileMapper.ensureInitialized().hashValue(this as SendingFile); + } +} + +extension SendingFileValueCopy<$R, $Out> + on ObjectCopyWith<$R, SendingFile, $Out> { + SendingFileCopyWith<$R, SendingFile, $Out> get $asSendingFile => + $base.as((v, t, t2) => _SendingFileCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class SendingFileCopyWith<$R, $In extends SendingFile, $Out> + implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith<$R, int, ObjectCopyWith<$R, int, int>>? get bytes; + $R call({ + FileDto? file, + FileStatus? status, + String? token, + Uint8List? thumbnail, + AssetEntity? asset, + String? path, + List? bytes, + String? errorMessage, + }); + SendingFileCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _SendingFileCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, SendingFile, $Out> + implements SendingFileCopyWith<$R, SendingFile, $Out> { + _SendingFileCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + SendingFileMapper.ensureInitialized(); + @override + ListCopyWith<$R, int, ObjectCopyWith<$R, int, int>>? get bytes => + $value.bytes != null + ? ListCopyWith( + $value.bytes!, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(bytes: v), + ) + : null; + @override + $R call({ + FileDto? file, + FileStatus? status, + Object? token = $none, + Object? thumbnail = $none, + Object? asset = $none, + Object? path = $none, + Object? bytes = $none, + Object? errorMessage = $none, + }) => $apply( + FieldCopyWithData({ + if (file != null) #file: file, + if (status != null) #status: status, + if (token != $none) #token: token, + if (thumbnail != $none) #thumbnail: thumbnail, + if (asset != $none) #asset: asset, + if (path != $none) #path: path, + if (bytes != $none) #bytes: bytes, + if (errorMessage != $none) #errorMessage: errorMessage, + }), + ); + @override + SendingFile $make(CopyWithData data) => SendingFile( + file: data.get(#file, or: $value.file), + status: data.get(#status, or: $value.status), + token: data.get(#token, or: $value.token), + thumbnail: data.get(#thumbnail, or: $value.thumbnail), + asset: data.get(#asset, or: $value.asset), + path: data.get(#path, or: $value.path), + bytes: data.get(#bytes, or: $value.bytes), + errorMessage: data.get(#errorMessage, or: $value.errorMessage), + ); + + @override + SendingFileCopyWith<$R2, SendingFile, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _SendingFileCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/state/send/web/web_send_file.dart b/app/lib/model/state/send/web/web_send_file.dart new file mode 100644 index 0000000..2d1e0ba --- /dev/null +++ b/app/lib/model/state/send/web/web_send_file.dart @@ -0,0 +1,20 @@ +import 'package:common/model/dto/file_dto.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:wechat_assets_picker/wechat_assets_picker.dart'; + +part 'web_send_file.mapper.dart'; + +@MappableClass() +class WebSendFile with WebSendFileMappable { + final FileDto file; + final AssetEntity? asset; // for thumbnails + final String? path; // android, iOS, desktop + final List? bytes; // web + + const WebSendFile({ + required this.file, + required this.asset, + required this.path, + required this.bytes, + }); +} diff --git a/app/lib/model/state/send/web/web_send_file.mapper.dart b/app/lib/model/state/send/web/web_send_file.mapper.dart new file mode 100644 index 0000000..765b1e2 --- /dev/null +++ b/app/lib/model/state/send/web/web_send_file.mapper.dart @@ -0,0 +1,163 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'web_send_file.dart'; + +class WebSendFileMapper extends ClassMapperBase { + WebSendFileMapper._(); + + static WebSendFileMapper? _instance; + static WebSendFileMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = WebSendFileMapper._()); + } + return _instance!; + } + + @override + final String id = 'WebSendFile'; + + static FileDto _$file(WebSendFile v) => v.file; + static const Field _f$file = Field('file', _$file); + static AssetEntity? _$asset(WebSendFile v) => v.asset; + static const Field _f$asset = Field( + 'asset', + _$asset, + ); + static String? _$path(WebSendFile v) => v.path; + static const Field _f$path = Field('path', _$path); + static List? _$bytes(WebSendFile v) => v.bytes; + static const Field> _f$bytes = Field('bytes', _$bytes); + + @override + final MappableFields fields = const { + #file: _f$file, + #asset: _f$asset, + #path: _f$path, + #bytes: _f$bytes, + }; + + static WebSendFile _instantiate(DecodingData data) { + return WebSendFile( + file: data.dec(_f$file), + asset: data.dec(_f$asset), + path: data.dec(_f$path), + bytes: data.dec(_f$bytes), + ); + } + + @override + final Function instantiate = _instantiate; + + static WebSendFile fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static WebSendFile deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin WebSendFileMappable { + String serialize() { + return WebSendFileMapper.ensureInitialized().encodeJson( + this as WebSendFile, + ); + } + + Map toJson() { + return WebSendFileMapper.ensureInitialized().encodeMap( + this as WebSendFile, + ); + } + + WebSendFileCopyWith get copyWith => + _WebSendFileCopyWithImpl( + this as WebSendFile, + $identity, + $identity, + ); + @override + String toString() { + return WebSendFileMapper.ensureInitialized().stringifyValue( + this as WebSendFile, + ); + } + + @override + bool operator ==(Object other) { + return WebSendFileMapper.ensureInitialized().equalsValue( + this as WebSendFile, + other, + ); + } + + @override + int get hashCode { + return WebSendFileMapper.ensureInitialized().hashValue(this as WebSendFile); + } +} + +extension WebSendFileValueCopy<$R, $Out> + on ObjectCopyWith<$R, WebSendFile, $Out> { + WebSendFileCopyWith<$R, WebSendFile, $Out> get $asWebSendFile => + $base.as((v, t, t2) => _WebSendFileCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class WebSendFileCopyWith<$R, $In extends WebSendFile, $Out> + implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith<$R, int, ObjectCopyWith<$R, int, int>>? get bytes; + $R call({FileDto? file, AssetEntity? asset, String? path, List? bytes}); + WebSendFileCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _WebSendFileCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, WebSendFile, $Out> + implements WebSendFileCopyWith<$R, WebSendFile, $Out> { + _WebSendFileCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + WebSendFileMapper.ensureInitialized(); + @override + ListCopyWith<$R, int, ObjectCopyWith<$R, int, int>>? get bytes => + $value.bytes != null + ? ListCopyWith( + $value.bytes!, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(bytes: v), + ) + : null; + @override + $R call({ + FileDto? file, + Object? asset = $none, + Object? path = $none, + Object? bytes = $none, + }) => $apply( + FieldCopyWithData({ + if (file != null) #file: file, + if (asset != $none) #asset: asset, + if (path != $none) #path: path, + if (bytes != $none) #bytes: bytes, + }), + ); + @override + WebSendFile $make(CopyWithData data) => WebSendFile( + file: data.get(#file, or: $value.file), + asset: data.get(#asset, or: $value.asset), + path: data.get(#path, or: $value.path), + bytes: data.get(#bytes, or: $value.bytes), + ); + + @override + WebSendFileCopyWith<$R2, WebSendFile, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _WebSendFileCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/state/send/web/web_send_session.dart b/app/lib/model/state/send/web/web_send_session.dart new file mode 100644 index 0000000..524ab41 --- /dev/null +++ b/app/lib/model/state/send/web/web_send_session.dart @@ -0,0 +1,20 @@ +import 'dart:async'; + +import 'package:dart_mappable/dart_mappable.dart'; + +part 'web_send_session.mapper.dart'; + +@MappableClass() +class WebSendSession with WebSendSessionMappable { + final String sessionId; + final StreamController? responseHandler; // used to accept or reject incoming requests + final String ip; + final String deviceInfo; // parsed from userAgent + + const WebSendSession({ + required this.sessionId, + required this.responseHandler, + required this.ip, + required this.deviceInfo, + }); +} diff --git a/app/lib/model/state/send/web/web_send_session.mapper.dart b/app/lib/model/state/send/web/web_send_session.mapper.dart new file mode 100644 index 0000000..de3771a --- /dev/null +++ b/app/lib/model/state/send/web/web_send_session.mapper.dart @@ -0,0 +1,167 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'web_send_session.dart'; + +class WebSendSessionMapper extends ClassMapperBase { + WebSendSessionMapper._(); + + static WebSendSessionMapper? _instance; + static WebSendSessionMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = WebSendSessionMapper._()); + } + return _instance!; + } + + @override + final String id = 'WebSendSession'; + + static String _$sessionId(WebSendSession v) => v.sessionId; + static const Field _f$sessionId = Field( + 'sessionId', + _$sessionId, + ); + static StreamController? _$responseHandler(WebSendSession v) => + v.responseHandler; + static const Field> + _f$responseHandler = Field('responseHandler', _$responseHandler); + static String _$ip(WebSendSession v) => v.ip; + static const Field _f$ip = Field('ip', _$ip); + static String _$deviceInfo(WebSendSession v) => v.deviceInfo; + static const Field _f$deviceInfo = Field( + 'deviceInfo', + _$deviceInfo, + ); + + @override + final MappableFields fields = const { + #sessionId: _f$sessionId, + #responseHandler: _f$responseHandler, + #ip: _f$ip, + #deviceInfo: _f$deviceInfo, + }; + + static WebSendSession _instantiate(DecodingData data) { + return WebSendSession( + sessionId: data.dec(_f$sessionId), + responseHandler: data.dec(_f$responseHandler), + ip: data.dec(_f$ip), + deviceInfo: data.dec(_f$deviceInfo), + ); + } + + @override + final Function instantiate = _instantiate; + + static WebSendSession fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static WebSendSession deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin WebSendSessionMappable { + String serialize() { + return WebSendSessionMapper.ensureInitialized().encodeJson( + this as WebSendSession, + ); + } + + Map toJson() { + return WebSendSessionMapper.ensureInitialized().encodeMap( + this as WebSendSession, + ); + } + + WebSendSessionCopyWith + get copyWith => _WebSendSessionCopyWithImpl( + this as WebSendSession, + $identity, + $identity, + ); + @override + String toString() { + return WebSendSessionMapper.ensureInitialized().stringifyValue( + this as WebSendSession, + ); + } + + @override + bool operator ==(Object other) { + return WebSendSessionMapper.ensureInitialized().equalsValue( + this as WebSendSession, + other, + ); + } + + @override + int get hashCode { + return WebSendSessionMapper.ensureInitialized().hashValue( + this as WebSendSession, + ); + } +} + +extension WebSendSessionValueCopy<$R, $Out> + on ObjectCopyWith<$R, WebSendSession, $Out> { + WebSendSessionCopyWith<$R, WebSendSession, $Out> get $asWebSendSession => + $base.as((v, t, t2) => _WebSendSessionCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class WebSendSessionCopyWith<$R, $In extends WebSendSession, $Out> + implements ClassCopyWith<$R, $In, $Out> { + $R call({ + String? sessionId, + StreamController? responseHandler, + String? ip, + String? deviceInfo, + }); + WebSendSessionCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ); +} + +class _WebSendSessionCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, WebSendSession, $Out> + implements WebSendSessionCopyWith<$R, WebSendSession, $Out> { + _WebSendSessionCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + WebSendSessionMapper.ensureInitialized(); + @override + $R call({ + String? sessionId, + Object? responseHandler = $none, + String? ip, + String? deviceInfo, + }) => $apply( + FieldCopyWithData({ + if (sessionId != null) #sessionId: sessionId, + if (responseHandler != $none) #responseHandler: responseHandler, + if (ip != null) #ip: ip, + if (deviceInfo != null) #deviceInfo: deviceInfo, + }), + ); + @override + WebSendSession $make(CopyWithData data) => WebSendSession( + sessionId: data.get(#sessionId, or: $value.sessionId), + responseHandler: data.get(#responseHandler, or: $value.responseHandler), + ip: data.get(#ip, or: $value.ip), + deviceInfo: data.get(#deviceInfo, or: $value.deviceInfo), + ); + + @override + WebSendSessionCopyWith<$R2, WebSendSession, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _WebSendSessionCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/state/send/web/web_send_state.dart b/app/lib/model/state/send/web/web_send_state.dart new file mode 100644 index 0000000..8006480 --- /dev/null +++ b/app/lib/model/state/send/web/web_send_state.dart @@ -0,0 +1,27 @@ +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:localsend_app/model/state/send/web/web_send_file.dart'; +import 'package:localsend_app/model/state/send/web/web_send_session.dart'; + +part 'web_send_state.mapper.dart'; + +@MappableClass() +class WebSendState with WebSendStateMappable { + final Map sessions; // session id -> session data, also includes incoming requests + final Map files; // file id as key + final bool autoAccept; // automatically accept incoming requests + final String? pin; + final Map pinAttempts; // IP address -> attempts (will be reset on session end) + + const WebSendState({ + required this.sessions, + required this.files, + required this.autoAccept, + required this.pin, + required this.pinAttempts, + }); + + @override + String toString() { + return 'WebSendState(sessions: $sessions, files: <${files.keys}>, autoAccept: $autoAccept, pin: $pin, pinAttempts: $pinAttempts)'; + } +} diff --git a/app/lib/model/state/send/web/web_send_state.mapper.dart b/app/lib/model/state/send/web/web_send_state.mapper.dart new file mode 100644 index 0000000..3e32af7 --- /dev/null +++ b/app/lib/model/state/send/web/web_send_state.mapper.dart @@ -0,0 +1,223 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'web_send_state.dart'; + +class WebSendStateMapper extends ClassMapperBase { + WebSendStateMapper._(); + + static WebSendStateMapper? _instance; + static WebSendStateMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = WebSendStateMapper._()); + WebSendSessionMapper.ensureInitialized(); + WebSendFileMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'WebSendState'; + + static Map _$sessions(WebSendState v) => v.sessions; + static const Field> _f$sessions = + Field('sessions', _$sessions); + static Map _$files(WebSendState v) => v.files; + static const Field> _f$files = Field( + 'files', + _$files, + ); + static bool _$autoAccept(WebSendState v) => v.autoAccept; + static const Field _f$autoAccept = Field( + 'autoAccept', + _$autoAccept, + ); + static String? _$pin(WebSendState v) => v.pin; + static const Field _f$pin = Field('pin', _$pin); + static Map _$pinAttempts(WebSendState v) => v.pinAttempts; + static const Field> _f$pinAttempts = Field( + 'pinAttempts', + _$pinAttempts, + ); + + @override + final MappableFields fields = const { + #sessions: _f$sessions, + #files: _f$files, + #autoAccept: _f$autoAccept, + #pin: _f$pin, + #pinAttempts: _f$pinAttempts, + }; + + static WebSendState _instantiate(DecodingData data) { + return WebSendState( + sessions: data.dec(_f$sessions), + files: data.dec(_f$files), + autoAccept: data.dec(_f$autoAccept), + pin: data.dec(_f$pin), + pinAttempts: data.dec(_f$pinAttempts), + ); + } + + @override + final Function instantiate = _instantiate; + + static WebSendState fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static WebSendState deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin WebSendStateMappable { + String serialize() { + return WebSendStateMapper.ensureInitialized().encodeJson( + this as WebSendState, + ); + } + + Map toJson() { + return WebSendStateMapper.ensureInitialized().encodeMap( + this as WebSendState, + ); + } + + WebSendStateCopyWith get copyWith => + _WebSendStateCopyWithImpl( + this as WebSendState, + $identity, + $identity, + ); + @override + String toString() { + return WebSendStateMapper.ensureInitialized().stringifyValue( + this as WebSendState, + ); + } + + @override + bool operator ==(Object other) { + return WebSendStateMapper.ensureInitialized().equalsValue( + this as WebSendState, + other, + ); + } + + @override + int get hashCode { + return WebSendStateMapper.ensureInitialized().hashValue( + this as WebSendState, + ); + } +} + +extension WebSendStateValueCopy<$R, $Out> + on ObjectCopyWith<$R, WebSendState, $Out> { + WebSendStateCopyWith<$R, WebSendState, $Out> get $asWebSendState => + $base.as((v, t, t2) => _WebSendStateCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class WebSendStateCopyWith<$R, $In extends WebSendState, $Out> + implements ClassCopyWith<$R, $In, $Out> { + MapCopyWith< + $R, + String, + WebSendSession, + WebSendSessionCopyWith<$R, WebSendSession, WebSendSession> + > + get sessions; + MapCopyWith< + $R, + String, + WebSendFile, + WebSendFileCopyWith<$R, WebSendFile, WebSendFile> + > + get files; + MapCopyWith<$R, String, int, ObjectCopyWith<$R, int, int>> get pinAttempts; + $R call({ + Map? sessions, + Map? files, + bool? autoAccept, + String? pin, + Map? pinAttempts, + }); + WebSendStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _WebSendStateCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, WebSendState, $Out> + implements WebSendStateCopyWith<$R, WebSendState, $Out> { + _WebSendStateCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + WebSendStateMapper.ensureInitialized(); + @override + MapCopyWith< + $R, + String, + WebSendSession, + WebSendSessionCopyWith<$R, WebSendSession, WebSendSession> + > + get sessions => MapCopyWith( + $value.sessions, + (v, t) => v.copyWith.$chain(t), + (v) => call(sessions: v), + ); + @override + MapCopyWith< + $R, + String, + WebSendFile, + WebSendFileCopyWith<$R, WebSendFile, WebSendFile> + > + get files => MapCopyWith( + $value.files, + (v, t) => v.copyWith.$chain(t), + (v) => call(files: v), + ); + @override + MapCopyWith<$R, String, int, ObjectCopyWith<$R, int, int>> get pinAttempts => + MapCopyWith( + $value.pinAttempts, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(pinAttempts: v), + ); + @override + $R call({ + Map? sessions, + Map? files, + bool? autoAccept, + Object? pin = $none, + Map? pinAttempts, + }) => $apply( + FieldCopyWithData({ + if (sessions != null) #sessions: sessions, + if (files != null) #files: files, + if (autoAccept != null) #autoAccept: autoAccept, + if (pin != $none) #pin: pin, + if (pinAttempts != null) #pinAttempts: pinAttempts, + }), + ); + @override + WebSendState $make(CopyWithData data) => WebSendState( + sessions: data.get(#sessions, or: $value.sessions), + files: data.get(#files, or: $value.files), + autoAccept: data.get(#autoAccept, or: $value.autoAccept), + pin: data.get(#pin, or: $value.pin), + pinAttempts: data.get(#pinAttempts, or: $value.pinAttempts), + ); + + @override + WebSendStateCopyWith<$R2, WebSendState, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _WebSendStateCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/state/server/receive_session_state.dart b/app/lib/model/state/server/receive_session_state.dart new file mode 100644 index 0000000..0498c39 --- /dev/null +++ b/app/lib/model/state/server/receive_session_state.dart @@ -0,0 +1,75 @@ +import 'dart:async'; + +import 'package:common/model/device.dart'; +import 'package:common/model/file_type.dart'; +import 'package:common/model/session_status.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:localsend_app/model/state/server/receiving_file.dart'; + +part 'receive_session_state.mapper.dart'; + +abstract class SessionState { + SessionStatus get status; + int? get startTime; + int? get endTime; +} + +@MappableClass() +class ReceiveSessionState with ReceiveSessionStateMappable implements SessionState { + final String sessionId; + + @override + final SessionStatus status; + + final Device sender; + + // Might not be the same as sender.alias since it can be overridden as a favorite + final String senderAlias; + + final Map files; // file id as key + + @override + final int? startTime; + + @override + final int? endTime; + + final String destinationDirectory; + final String cacheDirectory; + final bool saveToGallery; + + /// On Android, we need to manually create missing directories. + /// To improve performance, we cache the created directories so we don't need to check them again. + /// WARNING: This list is modified in-place! + final Set createdDirectories; + + final StreamController?>? responseHandler; + + const ReceiveSessionState({ + required this.sessionId, + required this.status, + required this.sender, + required this.senderAlias, + required this.files, + required this.startTime, + required this.endTime, + required this.destinationDirectory, + required this.cacheDirectory, + required this.saveToGallery, + required this.createdDirectories, + required this.responseHandler, + }); + + /// Returns the message of this request if this is a "message request". + /// Message requests must contain a single text file with preview included. + String? get message { + final firstFile = files.values.first.file; + return files.length == 1 && firstFile.fileType == FileType.text ? firstFile.preview : null; + } + + /// Returns true if this request contains files having a directory path. + /// "Save to gallery" is disabled for such requests. + bool get containsDirectories { + return files.values.any((f) => f.file.fileName.contains('/')); + } +} diff --git a/app/lib/model/state/server/receive_session_state.mapper.dart b/app/lib/model/state/server/receive_session_state.mapper.dart new file mode 100644 index 0000000..40b64d3 --- /dev/null +++ b/app/lib/model/state/server/receive_session_state.mapper.dart @@ -0,0 +1,298 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'receive_session_state.dart'; + +class ReceiveSessionStateMapper extends ClassMapperBase { + ReceiveSessionStateMapper._(); + + static ReceiveSessionStateMapper? _instance; + static ReceiveSessionStateMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = ReceiveSessionStateMapper._()); + DeviceMapper.ensureInitialized(); + ReceivingFileMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'ReceiveSessionState'; + + static String _$sessionId(ReceiveSessionState v) => v.sessionId; + static const Field _f$sessionId = Field( + 'sessionId', + _$sessionId, + ); + static SessionStatus _$status(ReceiveSessionState v) => v.status; + static const Field _f$status = Field( + 'status', + _$status, + ); + static Device _$sender(ReceiveSessionState v) => v.sender; + static const Field _f$sender = Field( + 'sender', + _$sender, + ); + static String _$senderAlias(ReceiveSessionState v) => v.senderAlias; + static const Field _f$senderAlias = Field( + 'senderAlias', + _$senderAlias, + ); + static Map _$files(ReceiveSessionState v) => v.files; + static const Field> _f$files = + Field('files', _$files); + static int? _$startTime(ReceiveSessionState v) => v.startTime; + static const Field _f$startTime = Field( + 'startTime', + _$startTime, + ); + static int? _$endTime(ReceiveSessionState v) => v.endTime; + static const Field _f$endTime = Field( + 'endTime', + _$endTime, + ); + static String _$destinationDirectory(ReceiveSessionState v) => + v.destinationDirectory; + static const Field _f$destinationDirectory = + Field('destinationDirectory', _$destinationDirectory); + static String _$cacheDirectory(ReceiveSessionState v) => v.cacheDirectory; + static const Field _f$cacheDirectory = Field( + 'cacheDirectory', + _$cacheDirectory, + ); + static bool _$saveToGallery(ReceiveSessionState v) => v.saveToGallery; + static const Field _f$saveToGallery = Field( + 'saveToGallery', + _$saveToGallery, + ); + static Set _$createdDirectories(ReceiveSessionState v) => + v.createdDirectories; + static const Field> _f$createdDirectories = + Field('createdDirectories', _$createdDirectories); + static StreamController?>? _$responseHandler( + ReceiveSessionState v, + ) => v.responseHandler; + static const Field< + ReceiveSessionState, + StreamController?> + > + _f$responseHandler = Field('responseHandler', _$responseHandler); + + @override + final MappableFields fields = const { + #sessionId: _f$sessionId, + #status: _f$status, + #sender: _f$sender, + #senderAlias: _f$senderAlias, + #files: _f$files, + #startTime: _f$startTime, + #endTime: _f$endTime, + #destinationDirectory: _f$destinationDirectory, + #cacheDirectory: _f$cacheDirectory, + #saveToGallery: _f$saveToGallery, + #createdDirectories: _f$createdDirectories, + #responseHandler: _f$responseHandler, + }; + + static ReceiveSessionState _instantiate(DecodingData data) { + return ReceiveSessionState( + sessionId: data.dec(_f$sessionId), + status: data.dec(_f$status), + sender: data.dec(_f$sender), + senderAlias: data.dec(_f$senderAlias), + files: data.dec(_f$files), + startTime: data.dec(_f$startTime), + endTime: data.dec(_f$endTime), + destinationDirectory: data.dec(_f$destinationDirectory), + cacheDirectory: data.dec(_f$cacheDirectory), + saveToGallery: data.dec(_f$saveToGallery), + createdDirectories: data.dec(_f$createdDirectories), + responseHandler: data.dec(_f$responseHandler), + ); + } + + @override + final Function instantiate = _instantiate; + + static ReceiveSessionState fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static ReceiveSessionState deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin ReceiveSessionStateMappable { + String serialize() { + return ReceiveSessionStateMapper.ensureInitialized() + .encodeJson(this as ReceiveSessionState); + } + + Map toJson() { + return ReceiveSessionStateMapper.ensureInitialized() + .encodeMap(this as ReceiveSessionState); + } + + ReceiveSessionStateCopyWith< + ReceiveSessionState, + ReceiveSessionState, + ReceiveSessionState + > + get copyWith => + _ReceiveSessionStateCopyWithImpl< + ReceiveSessionState, + ReceiveSessionState + >(this as ReceiveSessionState, $identity, $identity); + @override + String toString() { + return ReceiveSessionStateMapper.ensureInitialized().stringifyValue( + this as ReceiveSessionState, + ); + } + + @override + bool operator ==(Object other) { + return ReceiveSessionStateMapper.ensureInitialized().equalsValue( + this as ReceiveSessionState, + other, + ); + } + + @override + int get hashCode { + return ReceiveSessionStateMapper.ensureInitialized().hashValue( + this as ReceiveSessionState, + ); + } +} + +extension ReceiveSessionStateValueCopy<$R, $Out> + on ObjectCopyWith<$R, ReceiveSessionState, $Out> { + ReceiveSessionStateCopyWith<$R, ReceiveSessionState, $Out> + get $asReceiveSessionState => $base.as( + (v, t, t2) => _ReceiveSessionStateCopyWithImpl<$R, $Out>(v, t, t2), + ); +} + +abstract class ReceiveSessionStateCopyWith< + $R, + $In extends ReceiveSessionState, + $Out +> + implements ClassCopyWith<$R, $In, $Out> { + DeviceCopyWith<$R, Device, Device> get sender; + MapCopyWith< + $R, + String, + ReceivingFile, + ReceivingFileCopyWith<$R, ReceivingFile, ReceivingFile> + > + get files; + $R call({ + String? sessionId, + SessionStatus? status, + Device? sender, + String? senderAlias, + Map? files, + int? startTime, + int? endTime, + String? destinationDirectory, + String? cacheDirectory, + bool? saveToGallery, + Set? createdDirectories, + StreamController?>? responseHandler, + }); + ReceiveSessionStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ); +} + +class _ReceiveSessionStateCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, ReceiveSessionState, $Out> + implements ReceiveSessionStateCopyWith<$R, ReceiveSessionState, $Out> { + _ReceiveSessionStateCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + ReceiveSessionStateMapper.ensureInitialized(); + @override + DeviceCopyWith<$R, Device, Device> get sender => + $value.sender.copyWith.$chain((v) => call(sender: v)); + @override + MapCopyWith< + $R, + String, + ReceivingFile, + ReceivingFileCopyWith<$R, ReceivingFile, ReceivingFile> + > + get files => MapCopyWith( + $value.files, + (v, t) => v.copyWith.$chain(t), + (v) => call(files: v), + ); + @override + $R call({ + String? sessionId, + SessionStatus? status, + Device? sender, + String? senderAlias, + Map? files, + Object? startTime = $none, + Object? endTime = $none, + String? destinationDirectory, + String? cacheDirectory, + bool? saveToGallery, + Set? createdDirectories, + Object? responseHandler = $none, + }) => $apply( + FieldCopyWithData({ + if (sessionId != null) #sessionId: sessionId, + if (status != null) #status: status, + if (sender != null) #sender: sender, + if (senderAlias != null) #senderAlias: senderAlias, + if (files != null) #files: files, + if (startTime != $none) #startTime: startTime, + if (endTime != $none) #endTime: endTime, + if (destinationDirectory != null) + #destinationDirectory: destinationDirectory, + if (cacheDirectory != null) #cacheDirectory: cacheDirectory, + if (saveToGallery != null) #saveToGallery: saveToGallery, + if (createdDirectories != null) #createdDirectories: createdDirectories, + if (responseHandler != $none) #responseHandler: responseHandler, + }), + ); + @override + ReceiveSessionState $make(CopyWithData data) => ReceiveSessionState( + sessionId: data.get(#sessionId, or: $value.sessionId), + status: data.get(#status, or: $value.status), + sender: data.get(#sender, or: $value.sender), + senderAlias: data.get(#senderAlias, or: $value.senderAlias), + files: data.get(#files, or: $value.files), + startTime: data.get(#startTime, or: $value.startTime), + endTime: data.get(#endTime, or: $value.endTime), + destinationDirectory: data.get( + #destinationDirectory, + or: $value.destinationDirectory, + ), + cacheDirectory: data.get(#cacheDirectory, or: $value.cacheDirectory), + saveToGallery: data.get(#saveToGallery, or: $value.saveToGallery), + createdDirectories: data.get( + #createdDirectories, + or: $value.createdDirectories, + ), + responseHandler: data.get(#responseHandler, or: $value.responseHandler), + ); + + @override + ReceiveSessionStateCopyWith<$R2, ReceiveSessionState, $Out2> + $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _ReceiveSessionStateCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/state/server/receiving_file.dart b/app/lib/model/state/server/receiving_file.dart new file mode 100644 index 0000000..b643313 --- /dev/null +++ b/app/lib/model/state/server/receiving_file.dart @@ -0,0 +1,26 @@ +import 'package:common/model/dto/file_dto.dart'; +import 'package:common/model/file_status.dart'; +import 'package:dart_mappable/dart_mappable.dart'; + +part 'receiving_file.mapper.dart'; + +@MappableClass() +class ReceivingFile with ReceivingFileMappable { + final FileDto file; + final FileStatus status; + final String? token; + final String? desiredName; // not null when accepted + final String? path; // when finished + final bool savedToGallery; // when finished + final String? errorMessage; // when status == failed + + const ReceivingFile({ + required this.file, + required this.status, + required this.token, + required this.desiredName, + required this.path, + required this.savedToGallery, + required this.errorMessage, + }); +} diff --git a/app/lib/model/state/server/receiving_file.mapper.dart b/app/lib/model/state/server/receiving_file.mapper.dart new file mode 100644 index 0000000..0aea396 --- /dev/null +++ b/app/lib/model/state/server/receiving_file.mapper.dart @@ -0,0 +1,193 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'receiving_file.dart'; + +class ReceivingFileMapper extends ClassMapperBase { + ReceivingFileMapper._(); + + static ReceivingFileMapper? _instance; + static ReceivingFileMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = ReceivingFileMapper._()); + } + return _instance!; + } + + @override + final String id = 'ReceivingFile'; + + static FileDto _$file(ReceivingFile v) => v.file; + static const Field _f$file = Field('file', _$file); + static FileStatus _$status(ReceivingFile v) => v.status; + static const Field _f$status = Field( + 'status', + _$status, + ); + static String? _$token(ReceivingFile v) => v.token; + static const Field _f$token = Field('token', _$token); + static String? _$desiredName(ReceivingFile v) => v.desiredName; + static const Field _f$desiredName = Field( + 'desiredName', + _$desiredName, + ); + static String? _$path(ReceivingFile v) => v.path; + static const Field _f$path = Field('path', _$path); + static bool _$savedToGallery(ReceivingFile v) => v.savedToGallery; + static const Field _f$savedToGallery = Field( + 'savedToGallery', + _$savedToGallery, + ); + static String? _$errorMessage(ReceivingFile v) => v.errorMessage; + static const Field _f$errorMessage = Field( + 'errorMessage', + _$errorMessage, + ); + + @override + final MappableFields fields = const { + #file: _f$file, + #status: _f$status, + #token: _f$token, + #desiredName: _f$desiredName, + #path: _f$path, + #savedToGallery: _f$savedToGallery, + #errorMessage: _f$errorMessage, + }; + + static ReceivingFile _instantiate(DecodingData data) { + return ReceivingFile( + file: data.dec(_f$file), + status: data.dec(_f$status), + token: data.dec(_f$token), + desiredName: data.dec(_f$desiredName), + path: data.dec(_f$path), + savedToGallery: data.dec(_f$savedToGallery), + errorMessage: data.dec(_f$errorMessage), + ); + } + + @override + final Function instantiate = _instantiate; + + static ReceivingFile fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static ReceivingFile deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin ReceivingFileMappable { + String serialize() { + return ReceivingFileMapper.ensureInitialized().encodeJson( + this as ReceivingFile, + ); + } + + Map toJson() { + return ReceivingFileMapper.ensureInitialized().encodeMap( + this as ReceivingFile, + ); + } + + ReceivingFileCopyWith + get copyWith => _ReceivingFileCopyWithImpl( + this as ReceivingFile, + $identity, + $identity, + ); + @override + String toString() { + return ReceivingFileMapper.ensureInitialized().stringifyValue( + this as ReceivingFile, + ); + } + + @override + bool operator ==(Object other) { + return ReceivingFileMapper.ensureInitialized().equalsValue( + this as ReceivingFile, + other, + ); + } + + @override + int get hashCode { + return ReceivingFileMapper.ensureInitialized().hashValue( + this as ReceivingFile, + ); + } +} + +extension ReceivingFileValueCopy<$R, $Out> + on ObjectCopyWith<$R, ReceivingFile, $Out> { + ReceivingFileCopyWith<$R, ReceivingFile, $Out> get $asReceivingFile => + $base.as((v, t, t2) => _ReceivingFileCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class ReceivingFileCopyWith<$R, $In extends ReceivingFile, $Out> + implements ClassCopyWith<$R, $In, $Out> { + $R call({ + FileDto? file, + FileStatus? status, + String? token, + String? desiredName, + String? path, + bool? savedToGallery, + String? errorMessage, + }); + ReceivingFileCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _ReceivingFileCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, ReceivingFile, $Out> + implements ReceivingFileCopyWith<$R, ReceivingFile, $Out> { + _ReceivingFileCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + ReceivingFileMapper.ensureInitialized(); + @override + $R call({ + FileDto? file, + FileStatus? status, + Object? token = $none, + Object? desiredName = $none, + Object? path = $none, + bool? savedToGallery, + Object? errorMessage = $none, + }) => $apply( + FieldCopyWithData({ + if (file != null) #file: file, + if (status != null) #status: status, + if (token != $none) #token: token, + if (desiredName != $none) #desiredName: desiredName, + if (path != $none) #path: path, + if (savedToGallery != null) #savedToGallery: savedToGallery, + if (errorMessage != $none) #errorMessage: errorMessage, + }), + ); + @override + ReceivingFile $make(CopyWithData data) => ReceivingFile( + file: data.get(#file, or: $value.file), + status: data.get(#status, or: $value.status), + token: data.get(#token, or: $value.token), + desiredName: data.get(#desiredName, or: $value.desiredName), + path: data.get(#path, or: $value.path), + savedToGallery: data.get(#savedToGallery, or: $value.savedToGallery), + errorMessage: data.get(#errorMessage, or: $value.errorMessage), + ); + + @override + ReceivingFileCopyWith<$R2, ReceivingFile, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _ReceivingFileCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/state/server/server_state.dart b/app/lib/model/state/server/server_state.dart new file mode 100644 index 0000000..df41a0f --- /dev/null +++ b/app/lib/model/state/server/server_state.dart @@ -0,0 +1,32 @@ +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:localsend_app/model/state/send/web/web_send_state.dart'; +import 'package:localsend_app/model/state/server/receive_session_state.dart'; +import 'package:localsend_app/util/simple_server.dart'; + +part 'server_state.mapper.dart'; + +@MappableClass() +class ServerState with ServerStateMappable { + final SimpleServer httpServer; + final String alias; + final int port; + final bool https; + final ReceiveSessionState? session; + final WebSendState? webSendState; + final Map pinAttempts; // IP address -> attempts (won't be reset on session end) + + const ServerState({ + required this.httpServer, + required this.alias, + required this.port, + required this.https, + required this.session, + required this.webSendState, + required this.pinAttempts, + }); + + @override + String toString() { + return 'ServerState(alias: $alias, port: $port, https: $https, session: $session, webSendState: $webSendState, pinAttempts: $pinAttempts)'; + } +} diff --git a/app/lib/model/state/server/server_state.mapper.dart b/app/lib/model/state/server/server_state.mapper.dart new file mode 100644 index 0000000..c33d1e1 --- /dev/null +++ b/app/lib/model/state/server/server_state.mapper.dart @@ -0,0 +1,210 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'server_state.dart'; + +class ServerStateMapper extends ClassMapperBase { + ServerStateMapper._(); + + static ServerStateMapper? _instance; + static ServerStateMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = ServerStateMapper._()); + ReceiveSessionStateMapper.ensureInitialized(); + WebSendStateMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'ServerState'; + + static SimpleServer _$httpServer(ServerState v) => v.httpServer; + static const Field _f$httpServer = Field( + 'httpServer', + _$httpServer, + ); + static String _$alias(ServerState v) => v.alias; + static const Field _f$alias = Field('alias', _$alias); + static int _$port(ServerState v) => v.port; + static const Field _f$port = Field('port', _$port); + static bool _$https(ServerState v) => v.https; + static const Field _f$https = Field('https', _$https); + static ReceiveSessionState? _$session(ServerState v) => v.session; + static const Field _f$session = Field( + 'session', + _$session, + ); + static WebSendState? _$webSendState(ServerState v) => v.webSendState; + static const Field _f$webSendState = Field( + 'webSendState', + _$webSendState, + ); + static Map _$pinAttempts(ServerState v) => v.pinAttempts; + static const Field> _f$pinAttempts = Field( + 'pinAttempts', + _$pinAttempts, + ); + + @override + final MappableFields fields = const { + #httpServer: _f$httpServer, + #alias: _f$alias, + #port: _f$port, + #https: _f$https, + #session: _f$session, + #webSendState: _f$webSendState, + #pinAttempts: _f$pinAttempts, + }; + + static ServerState _instantiate(DecodingData data) { + return ServerState( + httpServer: data.dec(_f$httpServer), + alias: data.dec(_f$alias), + port: data.dec(_f$port), + https: data.dec(_f$https), + session: data.dec(_f$session), + webSendState: data.dec(_f$webSendState), + pinAttempts: data.dec(_f$pinAttempts), + ); + } + + @override + final Function instantiate = _instantiate; + + static ServerState fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static ServerState deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin ServerStateMappable { + String serialize() { + return ServerStateMapper.ensureInitialized().encodeJson( + this as ServerState, + ); + } + + Map toJson() { + return ServerStateMapper.ensureInitialized().encodeMap( + this as ServerState, + ); + } + + ServerStateCopyWith get copyWith => + _ServerStateCopyWithImpl( + this as ServerState, + $identity, + $identity, + ); + @override + String toString() { + return ServerStateMapper.ensureInitialized().stringifyValue( + this as ServerState, + ); + } + + @override + bool operator ==(Object other) { + return ServerStateMapper.ensureInitialized().equalsValue( + this as ServerState, + other, + ); + } + + @override + int get hashCode { + return ServerStateMapper.ensureInitialized().hashValue(this as ServerState); + } +} + +extension ServerStateValueCopy<$R, $Out> + on ObjectCopyWith<$R, ServerState, $Out> { + ServerStateCopyWith<$R, ServerState, $Out> get $asServerState => + $base.as((v, t, t2) => _ServerStateCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class ServerStateCopyWith<$R, $In extends ServerState, $Out> + implements ClassCopyWith<$R, $In, $Out> { + ReceiveSessionStateCopyWith<$R, ReceiveSessionState, ReceiveSessionState>? + get session; + WebSendStateCopyWith<$R, WebSendState, WebSendState>? get webSendState; + MapCopyWith<$R, String, int, ObjectCopyWith<$R, int, int>> get pinAttempts; + $R call({ + SimpleServer? httpServer, + String? alias, + int? port, + bool? https, + ReceiveSessionState? session, + WebSendState? webSendState, + Map? pinAttempts, + }); + ServerStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _ServerStateCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, ServerState, $Out> + implements ServerStateCopyWith<$R, ServerState, $Out> { + _ServerStateCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + ServerStateMapper.ensureInitialized(); + @override + ReceiveSessionStateCopyWith<$R, ReceiveSessionState, ReceiveSessionState>? + get session => $value.session?.copyWith.$chain((v) => call(session: v)); + @override + WebSendStateCopyWith<$R, WebSendState, WebSendState>? get webSendState => + $value.webSendState?.copyWith.$chain((v) => call(webSendState: v)); + @override + MapCopyWith<$R, String, int, ObjectCopyWith<$R, int, int>> get pinAttempts => + MapCopyWith( + $value.pinAttempts, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(pinAttempts: v), + ); + @override + $R call({ + SimpleServer? httpServer, + String? alias, + int? port, + bool? https, + Object? session = $none, + Object? webSendState = $none, + Map? pinAttempts, + }) => $apply( + FieldCopyWithData({ + if (httpServer != null) #httpServer: httpServer, + if (alias != null) #alias: alias, + if (port != null) #port: port, + if (https != null) #https: https, + if (session != $none) #session: session, + if (webSendState != $none) #webSendState: webSendState, + if (pinAttempts != null) #pinAttempts: pinAttempts, + }), + ); + @override + ServerState $make(CopyWithData data) => ServerState( + httpServer: data.get(#httpServer, or: $value.httpServer), + alias: data.get(#alias, or: $value.alias), + port: data.get(#port, or: $value.port), + https: data.get(#https, or: $value.https), + session: data.get(#session, or: $value.session), + webSendState: data.get(#webSendState, or: $value.webSendState), + pinAttempts: data.get(#pinAttempts, or: $value.pinAttempts), + ); + + @override + ServerStateCopyWith<$R2, ServerState, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _ServerStateCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/model/state/settings_state.dart b/app/lib/model/state/settings_state.dart new file mode 100644 index 0000000..ca5d9cf --- /dev/null +++ b/app/lib/model/state/settings_state.dart @@ -0,0 +1,67 @@ +import 'package:common/model/device.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/persistence/color_mode.dart'; +import 'package:localsend_app/model/send_mode.dart'; + +part 'settings_state.mapper.dart'; + +@MappableClass() +class SettingsState with SettingsStateMappable { + final String showToken; // the token to show / maximize the window because only one instance is allowed + final String alias; + final ThemeMode theme; + final ColorMode colorMode; + final AppLocale? locale; + final int port; + final List? networkWhitelist; // null = disabled + final List? networkBlacklist; // null = disabled + final String multicastGroup; + final String? destination; // null = default + final bool saveToGallery; // only Android, iOS + final bool saveToHistory; + final bool quickSave; // automatically accept file requests + final bool quickSaveFromFavorites; // automatically accept file requests from favorites + final String? receivePin; // null = disabled + final bool autoFinish; // automatically finish sessions + final bool minimizeToTray; // minimize to tray instead of exiting the app + final bool https; + final SendMode sendMode; + final bool saveWindowPlacement; + final bool enableAnimations; + final DeviceType? deviceType; + final String? deviceModel; + final bool shareViaLinkAutoAccept; + final int discoveryTimeout; + final bool advancedSettings; + + const SettingsState({ + required this.showToken, + required this.alias, + required this.theme, + required this.colorMode, + required this.locale, + required this.port, + required this.networkWhitelist, + required this.networkBlacklist, + required this.multicastGroup, + required this.destination, + required this.saveToGallery, + required this.saveToHistory, + required this.quickSave, + required this.quickSaveFromFavorites, + required this.receivePin, + required this.autoFinish, + required this.minimizeToTray, + required this.https, + required this.sendMode, + required this.saveWindowPlacement, + required this.enableAnimations, + required this.deviceType, + required this.deviceModel, + required this.shareViaLinkAutoAccept, + required this.discoveryTimeout, + required this.advancedSettings, + }); +} diff --git a/app/lib/model/state/settings_state.mapper.dart b/app/lib/model/state/settings_state.mapper.dart new file mode 100644 index 0000000..44f9c18 --- /dev/null +++ b/app/lib/model/state/settings_state.mapper.dart @@ -0,0 +1,441 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'settings_state.dart'; + +class SettingsStateMapper extends ClassMapperBase { + SettingsStateMapper._(); + + static SettingsStateMapper? _instance; + static SettingsStateMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = SettingsStateMapper._()); + DeviceTypeMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'SettingsState'; + + static String _$showToken(SettingsState v) => v.showToken; + static const Field _f$showToken = Field( + 'showToken', + _$showToken, + ); + static String _$alias(SettingsState v) => v.alias; + static const Field _f$alias = Field('alias', _$alias); + static ThemeMode _$theme(SettingsState v) => v.theme; + static const Field _f$theme = Field( + 'theme', + _$theme, + ); + static ColorMode _$colorMode(SettingsState v) => v.colorMode; + static const Field _f$colorMode = Field( + 'colorMode', + _$colorMode, + ); + static AppLocale? _$locale(SettingsState v) => v.locale; + static const Field _f$locale = Field( + 'locale', + _$locale, + ); + static int _$port(SettingsState v) => v.port; + static const Field _f$port = Field('port', _$port); + static List? _$networkWhitelist(SettingsState v) => + v.networkWhitelist; + static const Field> _f$networkWhitelist = Field( + 'networkWhitelist', + _$networkWhitelist, + ); + static List? _$networkBlacklist(SettingsState v) => + v.networkBlacklist; + static const Field> _f$networkBlacklist = Field( + 'networkBlacklist', + _$networkBlacklist, + ); + static String _$multicastGroup(SettingsState v) => v.multicastGroup; + static const Field _f$multicastGroup = Field( + 'multicastGroup', + _$multicastGroup, + ); + static String? _$destination(SettingsState v) => v.destination; + static const Field _f$destination = Field( + 'destination', + _$destination, + ); + static bool _$saveToGallery(SettingsState v) => v.saveToGallery; + static const Field _f$saveToGallery = Field( + 'saveToGallery', + _$saveToGallery, + ); + static bool _$saveToHistory(SettingsState v) => v.saveToHistory; + static const Field _f$saveToHistory = Field( + 'saveToHistory', + _$saveToHistory, + ); + static bool _$quickSave(SettingsState v) => v.quickSave; + static const Field _f$quickSave = Field( + 'quickSave', + _$quickSave, + ); + static bool _$quickSaveFromFavorites(SettingsState v) => + v.quickSaveFromFavorites; + static const Field _f$quickSaveFromFavorites = Field( + 'quickSaveFromFavorites', + _$quickSaveFromFavorites, + ); + static String? _$receivePin(SettingsState v) => v.receivePin; + static const Field _f$receivePin = Field( + 'receivePin', + _$receivePin, + ); + static bool _$autoFinish(SettingsState v) => v.autoFinish; + static const Field _f$autoFinish = Field( + 'autoFinish', + _$autoFinish, + ); + static bool _$minimizeToTray(SettingsState v) => v.minimizeToTray; + static const Field _f$minimizeToTray = Field( + 'minimizeToTray', + _$minimizeToTray, + ); + static bool _$https(SettingsState v) => v.https; + static const Field _f$https = Field('https', _$https); + static SendMode _$sendMode(SettingsState v) => v.sendMode; + static const Field _f$sendMode = Field( + 'sendMode', + _$sendMode, + ); + static bool _$saveWindowPlacement(SettingsState v) => v.saveWindowPlacement; + static const Field _f$saveWindowPlacement = Field( + 'saveWindowPlacement', + _$saveWindowPlacement, + ); + static bool _$enableAnimations(SettingsState v) => v.enableAnimations; + static const Field _f$enableAnimations = Field( + 'enableAnimations', + _$enableAnimations, + ); + static DeviceType? _$deviceType(SettingsState v) => v.deviceType; + static const Field _f$deviceType = Field( + 'deviceType', + _$deviceType, + ); + static String? _$deviceModel(SettingsState v) => v.deviceModel; + static const Field _f$deviceModel = Field( + 'deviceModel', + _$deviceModel, + ); + static bool _$shareViaLinkAutoAccept(SettingsState v) => + v.shareViaLinkAutoAccept; + static const Field _f$shareViaLinkAutoAccept = Field( + 'shareViaLinkAutoAccept', + _$shareViaLinkAutoAccept, + ); + static int _$discoveryTimeout(SettingsState v) => v.discoveryTimeout; + static const Field _f$discoveryTimeout = Field( + 'discoveryTimeout', + _$discoveryTimeout, + ); + static bool _$advancedSettings(SettingsState v) => v.advancedSettings; + static const Field _f$advancedSettings = Field( + 'advancedSettings', + _$advancedSettings, + ); + + @override + final MappableFields fields = const { + #showToken: _f$showToken, + #alias: _f$alias, + #theme: _f$theme, + #colorMode: _f$colorMode, + #locale: _f$locale, + #port: _f$port, + #networkWhitelist: _f$networkWhitelist, + #networkBlacklist: _f$networkBlacklist, + #multicastGroup: _f$multicastGroup, + #destination: _f$destination, + #saveToGallery: _f$saveToGallery, + #saveToHistory: _f$saveToHistory, + #quickSave: _f$quickSave, + #quickSaveFromFavorites: _f$quickSaveFromFavorites, + #receivePin: _f$receivePin, + #autoFinish: _f$autoFinish, + #minimizeToTray: _f$minimizeToTray, + #https: _f$https, + #sendMode: _f$sendMode, + #saveWindowPlacement: _f$saveWindowPlacement, + #enableAnimations: _f$enableAnimations, + #deviceType: _f$deviceType, + #deviceModel: _f$deviceModel, + #shareViaLinkAutoAccept: _f$shareViaLinkAutoAccept, + #discoveryTimeout: _f$discoveryTimeout, + #advancedSettings: _f$advancedSettings, + }; + + static SettingsState _instantiate(DecodingData data) { + return SettingsState( + showToken: data.dec(_f$showToken), + alias: data.dec(_f$alias), + theme: data.dec(_f$theme), + colorMode: data.dec(_f$colorMode), + locale: data.dec(_f$locale), + port: data.dec(_f$port), + networkWhitelist: data.dec(_f$networkWhitelist), + networkBlacklist: data.dec(_f$networkBlacklist), + multicastGroup: data.dec(_f$multicastGroup), + destination: data.dec(_f$destination), + saveToGallery: data.dec(_f$saveToGallery), + saveToHistory: data.dec(_f$saveToHistory), + quickSave: data.dec(_f$quickSave), + quickSaveFromFavorites: data.dec(_f$quickSaveFromFavorites), + receivePin: data.dec(_f$receivePin), + autoFinish: data.dec(_f$autoFinish), + minimizeToTray: data.dec(_f$minimizeToTray), + https: data.dec(_f$https), + sendMode: data.dec(_f$sendMode), + saveWindowPlacement: data.dec(_f$saveWindowPlacement), + enableAnimations: data.dec(_f$enableAnimations), + deviceType: data.dec(_f$deviceType), + deviceModel: data.dec(_f$deviceModel), + shareViaLinkAutoAccept: data.dec(_f$shareViaLinkAutoAccept), + discoveryTimeout: data.dec(_f$discoveryTimeout), + advancedSettings: data.dec(_f$advancedSettings), + ); + } + + @override + final Function instantiate = _instantiate; + + static SettingsState fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static SettingsState deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin SettingsStateMappable { + String serialize() { + return SettingsStateMapper.ensureInitialized().encodeJson( + this as SettingsState, + ); + } + + Map toJson() { + return SettingsStateMapper.ensureInitialized().encodeMap( + this as SettingsState, + ); + } + + SettingsStateCopyWith + get copyWith => _SettingsStateCopyWithImpl( + this as SettingsState, + $identity, + $identity, + ); + @override + String toString() { + return SettingsStateMapper.ensureInitialized().stringifyValue( + this as SettingsState, + ); + } + + @override + bool operator ==(Object other) { + return SettingsStateMapper.ensureInitialized().equalsValue( + this as SettingsState, + other, + ); + } + + @override + int get hashCode { + return SettingsStateMapper.ensureInitialized().hashValue( + this as SettingsState, + ); + } +} + +extension SettingsStateValueCopy<$R, $Out> + on ObjectCopyWith<$R, SettingsState, $Out> { + SettingsStateCopyWith<$R, SettingsState, $Out> get $asSettingsState => + $base.as((v, t, t2) => _SettingsStateCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class SettingsStateCopyWith<$R, $In extends SettingsState, $Out> + implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>>? + get networkWhitelist; + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>>? + get networkBlacklist; + $R call({ + String? showToken, + String? alias, + ThemeMode? theme, + ColorMode? colorMode, + AppLocale? locale, + int? port, + List? networkWhitelist, + List? networkBlacklist, + String? multicastGroup, + String? destination, + bool? saveToGallery, + bool? saveToHistory, + bool? quickSave, + bool? quickSaveFromFavorites, + String? receivePin, + bool? autoFinish, + bool? minimizeToTray, + bool? https, + SendMode? sendMode, + bool? saveWindowPlacement, + bool? enableAnimations, + DeviceType? deviceType, + String? deviceModel, + bool? shareViaLinkAutoAccept, + int? discoveryTimeout, + bool? advancedSettings, + }); + SettingsStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _SettingsStateCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, SettingsState, $Out> + implements SettingsStateCopyWith<$R, SettingsState, $Out> { + _SettingsStateCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + SettingsStateMapper.ensureInitialized(); + @override + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>>? + get networkWhitelist => $value.networkWhitelist != null + ? ListCopyWith( + $value.networkWhitelist!, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(networkWhitelist: v), + ) + : null; + @override + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>>? + get networkBlacklist => $value.networkBlacklist != null + ? ListCopyWith( + $value.networkBlacklist!, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(networkBlacklist: v), + ) + : null; + @override + $R call({ + String? showToken, + String? alias, + ThemeMode? theme, + ColorMode? colorMode, + Object? locale = $none, + int? port, + Object? networkWhitelist = $none, + Object? networkBlacklist = $none, + String? multicastGroup, + Object? destination = $none, + bool? saveToGallery, + bool? saveToHistory, + bool? quickSave, + bool? quickSaveFromFavorites, + Object? receivePin = $none, + bool? autoFinish, + bool? minimizeToTray, + bool? https, + SendMode? sendMode, + bool? saveWindowPlacement, + bool? enableAnimations, + Object? deviceType = $none, + Object? deviceModel = $none, + bool? shareViaLinkAutoAccept, + int? discoveryTimeout, + bool? advancedSettings, + }) => $apply( + FieldCopyWithData({ + if (showToken != null) #showToken: showToken, + if (alias != null) #alias: alias, + if (theme != null) #theme: theme, + if (colorMode != null) #colorMode: colorMode, + if (locale != $none) #locale: locale, + if (port != null) #port: port, + if (networkWhitelist != $none) #networkWhitelist: networkWhitelist, + if (networkBlacklist != $none) #networkBlacklist: networkBlacklist, + if (multicastGroup != null) #multicastGroup: multicastGroup, + if (destination != $none) #destination: destination, + if (saveToGallery != null) #saveToGallery: saveToGallery, + if (saveToHistory != null) #saveToHistory: saveToHistory, + if (quickSave != null) #quickSave: quickSave, + if (quickSaveFromFavorites != null) + #quickSaveFromFavorites: quickSaveFromFavorites, + if (receivePin != $none) #receivePin: receivePin, + if (autoFinish != null) #autoFinish: autoFinish, + if (minimizeToTray != null) #minimizeToTray: minimizeToTray, + if (https != null) #https: https, + if (sendMode != null) #sendMode: sendMode, + if (saveWindowPlacement != null) + #saveWindowPlacement: saveWindowPlacement, + if (enableAnimations != null) #enableAnimations: enableAnimations, + if (deviceType != $none) #deviceType: deviceType, + if (deviceModel != $none) #deviceModel: deviceModel, + if (shareViaLinkAutoAccept != null) + #shareViaLinkAutoAccept: shareViaLinkAutoAccept, + if (discoveryTimeout != null) #discoveryTimeout: discoveryTimeout, + if (advancedSettings != null) #advancedSettings: advancedSettings, + }), + ); + @override + SettingsState $make(CopyWithData data) => SettingsState( + showToken: data.get(#showToken, or: $value.showToken), + alias: data.get(#alias, or: $value.alias), + theme: data.get(#theme, or: $value.theme), + colorMode: data.get(#colorMode, or: $value.colorMode), + locale: data.get(#locale, or: $value.locale), + port: data.get(#port, or: $value.port), + networkWhitelist: data.get(#networkWhitelist, or: $value.networkWhitelist), + networkBlacklist: data.get(#networkBlacklist, or: $value.networkBlacklist), + multicastGroup: data.get(#multicastGroup, or: $value.multicastGroup), + destination: data.get(#destination, or: $value.destination), + saveToGallery: data.get(#saveToGallery, or: $value.saveToGallery), + saveToHistory: data.get(#saveToHistory, or: $value.saveToHistory), + quickSave: data.get(#quickSave, or: $value.quickSave), + quickSaveFromFavorites: data.get( + #quickSaveFromFavorites, + or: $value.quickSaveFromFavorites, + ), + receivePin: data.get(#receivePin, or: $value.receivePin), + autoFinish: data.get(#autoFinish, or: $value.autoFinish), + minimizeToTray: data.get(#minimizeToTray, or: $value.minimizeToTray), + https: data.get(#https, or: $value.https), + sendMode: data.get(#sendMode, or: $value.sendMode), + saveWindowPlacement: data.get( + #saveWindowPlacement, + or: $value.saveWindowPlacement, + ), + enableAnimations: data.get(#enableAnimations, or: $value.enableAnimations), + deviceType: data.get(#deviceType, or: $value.deviceType), + deviceModel: data.get(#deviceModel, or: $value.deviceModel), + shareViaLinkAutoAccept: data.get( + #shareViaLinkAutoAccept, + or: $value.shareViaLinkAutoAccept, + ), + discoveryTimeout: data.get(#discoveryTimeout, or: $value.discoveryTimeout), + advancedSettings: data.get(#advancedSettings, or: $value.advancedSettings), + ); + + @override + SettingsStateCopyWith<$R2, SettingsState, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _SettingsStateCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/pages/about/about_page.dart b/app/lib/pages/about/about_page.dart new file mode 100644 index 0000000..b7554a9 --- /dev/null +++ b/app/lib/pages/about/about_page.dart @@ -0,0 +1,220 @@ +import 'package:collection/collection.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/pages/debug/debug_page.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/local_send_logo.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:routerino/routerino.dart'; +import 'package:url_launcher/url_launcher.dart'; + +part 'contributors.dart'; + +part 'packagers.dart'; + +part 'translators.dart'; + +final _translatorWithGithubRegex = RegExp(r'(.+) \(@([\w\-_]+)\)'); + +class AboutPage extends StatelessWidget { + const AboutPage(); + + @override + Widget build(BuildContext context) { + final primaryColor = Theme.of(context).colorScheme.primary; + return Scaffold( + appBar: basicLocalSendAppbar(t.aboutPage.title), + body: ResponsiveListView( + padding: const EdgeInsets.symmetric(horizontal: 15), + children: [ + const SizedBox(height: 20), + const LocalSendLogo(withText: true), + Text( + '© ${DateTime.now().year} Tien Do Nam', + textAlign: TextAlign.center, + ), + const SizedBox(height: 10), + Center( + child: TextButton( + onPressed: () async { + await launchUrl(Uri.parse('https://localsend.org')); + }, + child: const Text('localsend.org'), + ), + ), + const SizedBox(height: 10), + Text(t.aboutPage.description.join('\n\n')), + const SizedBox(height: 20), + Text(t.aboutPage.author, style: const TextStyle(fontWeight: FontWeight.bold)), + Text.rich( + _buildContributor( + label: 'Tien Do Nam (@Tienisto)', + primaryColor: primaryColor, + ), + ), + const SizedBox(height: 20), + Text(t.aboutPage.contributors, style: const TextStyle(fontWeight: FontWeight.bold)), + ..._contributors.map((contributor) { + return Text.rich( + _buildContributor( + label: contributor, + primaryColor: primaryColor, + ), + ); + }), + const SizedBox(height: 20), + Text(t.aboutPage.packagers, style: const TextStyle(fontWeight: FontWeight.bold)), + Table( + columnWidths: const { + 0: IntrinsicColumnWidth(), + 1: FlexColumnWidth(), + }, + children: [ + ..._packagers.entries.map( + (e) => TableRow( + children: [ + Padding( + padding: const EdgeInsets.only(right: 10), + child: Text(e.key), + ), + Text.rich( + TextSpan( + children: e.value.mapIndexed( + (index, translator) { + return _buildContributor( + label: translator, + primaryColor: primaryColor, + newLine: index != 0, + ); + }, + ).toList(), + ), + ), + ], + ), + ), + ], + ), + const SizedBox(height: 20), + Text(t.aboutPage.translators, style: const TextStyle(fontWeight: FontWeight.bold)), + Table( + columnWidths: const { + 0: IntrinsicColumnWidth(), + 1: FlexColumnWidth(), + }, + children: [ + ..._translators.entries.map( + (e) => TableRow( + children: [ + Padding( + padding: const EdgeInsets.only(right: 10), + child: Text(e.key.translations.locale), + ), + Text.rich( + TextSpan( + children: e.value.mapIndexed( + (index, translator) { + return _buildContributor( + label: translator, + primaryColor: primaryColor, + newLine: index != 0, + ); + }, + ).toList(), + ), + ), + ], + ), + ), + ], + ), + const SizedBox(height: 20), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextButton( + onPressed: () async { + await launchUrl(Uri.parse('https://localsend.org')); + }, + child: const Text('Homepage'), + ), + TextButton( + onPressed: () async { + await launchUrl(Uri.parse('https://github.com/localsend/localsend'), mode: LaunchMode.externalApplication); + }, + child: const Text('Source Code (Github)'), + ), + TextButton( + onPressed: () async { + await launchUrl(Uri.parse('https://codeberg.org/localsend/localsend'), mode: LaunchMode.externalApplication); + }, + child: const Text('Source Code (Codeberg)'), + ), + TextButton( + onPressed: () async { + await launchUrl(Uri.parse('https://www.apache.org/licenses/LICENSE-2.0')); + }, + child: const Text('Apache License 2.0'), + ), + TextButton( + onPressed: () async { + await context.push(() => const LicensePage()); + }, + child: const Text('License Notices'), + ), + TextButton( + onPressed: () async { + await context.push(() => const DebugPage()); + }, + child: const Text('Debugging'), + ), + ], + ), + const SizedBox(height: 50), + ], + ), + ); + } +} + +/// Displays the contributor name and links to their github profile. +InlineSpan _buildContributor({required String label, required Color primaryColor, bool newLine = false}) { + final newLineStr = newLine ? '\n' : ''; + + if (label.startsWith('@')) { + // Only github name + return TextSpan( + text: '$newLineStr$label', + style: TextStyle(color: primaryColor), + recognizer: TapGestureRecognizer() + ..onTap = () async { + await launchUrl(Uri.parse('https://github.com/${label.substring(1)}'), mode: LaunchMode.externalApplication); + }, + ); + } + + final match = _translatorWithGithubRegex.firstMatch(label); + if (match != null) { + // Full name and github name + final fullName = match.group(1)!; + final githubName = match.group(2)!; + return TextSpan( + children: [ + TextSpan(text: '$newLineStr$fullName'), + const TextSpan(text: ' '), + TextSpan( + text: '@$githubName', + style: TextStyle(color: primaryColor), + recognizer: TapGestureRecognizer() + ..onTap = () async { + await launchUrl(Uri.parse('https://github.com/$githubName'), mode: LaunchMode.externalApplication); + }, + ), + ], + ); + } + + // Only full name + return TextSpan(text: '$newLineStr$label'); +} diff --git a/app/lib/pages/about/contributors.dart b/app/lib/pages/about/contributors.dart new file mode 100644 index 0000000..b5d64aa --- /dev/null +++ b/app/lib/pages/about/contributors.dart @@ -0,0 +1,20 @@ +part of 'about_page.dart'; + +/// Contributors who made several contributions to the project or +/// who is maintainer of one of the distribution channels. +/// Translators should not be listed here. +const _contributors = [ + 'Gabriel Lima (@TheGB0077)', + '@Caesarovich', + '@gitstart', + ..._packageMaintainers, +]; + +/// Maintainers of one of the distribution channels. +const _packageMaintainers = [ + '@brogers5', + '@Nixuge', + '@proletarius101', + '@sikmir', + '@sitiom', +]; diff --git a/app/lib/pages/about/packagers.dart b/app/lib/pages/about/packagers.dart new file mode 100644 index 0000000..fdf0fed --- /dev/null +++ b/app/lib/pages/about/packagers.dart @@ -0,0 +1,37 @@ +part of 'about_page.dart'; + +/// Packagers who distribute the app. +/// Also write your full name here if you want. +const _packagers = >{ + 'Chocolatey': [ + '@brogers5', + ], + 'Winget': [ + '@sitiom', + '@Tienisto', + ], + 'Scoop': [ + '@sitiom', + ], + 'Homebrew': [ + '@Tienisto', + ], + 'Flathub': [ + '@proletarius101', + '@Tienisto', + ], + 'Nix': [ + '@sikmir', + '@linsui', + ], + 'Snapcraft': [ + '@thatLeaflet', + ], + 'AUR': [ + '@Nixuge', + ], + 'F-Droid': [ + '@linsui', + '@Tienisto', + ], +}; diff --git a/app/lib/pages/about/translators.dart b/app/lib/pages/about/translators.dart new file mode 100644 index 0000000..ed58168 --- /dev/null +++ b/app/lib/pages/about/translators.dart @@ -0,0 +1,110 @@ +part of 'about_page.dart'; + +/// Translators who translated the app to a specific language. +/// The list might be incomplete. +/// Also write your full name here if you want. +const _translators = >{ + AppLocale.ar: [ + '@Adam1141', + ], + AppLocale.bn: [ + '@RishiASheth', + ], + AppLocale.cs: [ + '@Amereyeu', + ], + AppLocale.da: [ + '@Limfjorden', + ], + AppLocale.de: [ + 'Tien Do Nam (@Tienisto)', + ], + AppLocale.el: [ + 'Petros Kyladitis (@multipetros)', + ], + AppLocale.en: [ + 'Tien Do Nam (@Tienisto)', + '@Coopydood', + ], + AppLocale.esEs: [ + 'Esteban Daniel Saracho (@esaracho)', + 'Rafael González (@LoboGuardian)', + ], + AppLocale.fa: [ + '@farshad991', + ], + AppLocale.filPh: [ + 'Bryan James Ilaga (@BryanJames16)', + 'Linwel Colmo (@leanwell)', + ], + AppLocale.fr: [ + '@Nixuge', + ], + AppLocale.he: [ + '@ShlomoCode', + ], + AppLocale.hu: [ + '@gidano', + ], + AppLocale.it: [ + 'Francesco Marastoni (@Francesco146)', + 'Dario Landucci (@LandOfDar)', + ], + AppLocale.ja: [ + 'soya_daizu (@soya-daizu)', + ], + AppLocale.km: [ + 'Chandara H. Wei (@nidexingg)', + ], + AppLocale.ko: [ + '@mgmix', + ], + AppLocale.nl: [ + 'Martijn van Berkel (@Flitskikker)', + '@stijnphr', + '@jan-vandenberg', + ], + AppLocale.pl: [ + '@Radplay', + '@trag1c', + '@j-koziel', + ], + AppLocale.ptBr: [ + 'Gabriel Lima (@TheGB0077)', + 'Arthur Lobo (@ArthurLobopro)', + ], + AppLocale.ro: [ + '@UnifeGi', + ], + AppLocale.ru: [ + 'Sergiy Tkachuk (@sergd88)', + ], + AppLocale.sr: [ + 'Nebojsa Tomic (@nebojsatomic)', + 'Nemanja Dimitrijevic (@nemanya-d)', + ], + AppLocale.th: [ + '@watchakorn-18k', + ], + AppLocale.tr: [ + 'Mert Şişmanoğlu (@mertssmnoglu)', + 'Ali Mert Erdogan (@aliwert)', + ], + AppLocale.uk: [ + 'Sergiy Tkachuk (@sergd88)', + ], + AppLocale.vi: [ + '@faea726', + ], + AppLocale.zhCn: [ + '@nkh0472', + '@graphemecluster', + ], + AppLocale.zhHk: [ + '@graphemecluster', + ], + AppLocale.zhTw: [ + '@Neo1102', + '@graphemecluster', + ], +}; diff --git a/app/lib/pages/apk_picker_page.dart b/app/lib/pages/apk_picker_page.dart new file mode 100644 index 0000000..328bea8 --- /dev/null +++ b/app/lib/pages/apk_picker_page.dart @@ -0,0 +1,286 @@ +import 'package:common/model/file_type.dart'; +import 'package:device_apps/device_apps.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/provider/apk_provider.dart'; +import 'package:localsend_app/provider/selection/selected_sending_files_provider.dart'; +import 'package:localsend_app/util/file_size_helper.dart'; +import 'package:localsend_app/util/native/cross_file_converters.dart'; +import 'package:localsend_app/util/ui/nav_bar_padding.dart'; +import 'package:localsend_app/widget/file_thumbnail.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:localsend_app/widget/sliver/sliver_pinned_header.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +class ApkPickerPage extends StatefulWidget { + const ApkPickerPage({super.key}); + + @override + State createState() => _ApkPickerPageState(); +} + +class _ApkPickerPageState extends State with Refena { + final _textController = TextEditingController(); + final List _selectedApps = []; + + Future _pickApp(Application app) async { + await ref + .redux(selectedSendingFilesProvider) + .dispatchAsync( + AddFilesAction( + files: [app], + converter: CrossFileConverters.convertApplication, + ), + ); + + if (mounted) { + context.pop(); + } + } + + Future _pickApps(List apps) async { + // ignore: discarded_futures + + for (Application app in apps) { + await ref + .redux(selectedSendingFilesProvider) + .dispatchAsync( + AddFilesAction( + files: [app], + converter: CrossFileConverters.convertApplication, + ), + ); + } + + if (mounted) { + context.pop(); + } + } + + @override + void dispose() { + _textController.dispose(); + ref.dispose(apkSearchParamProvider); + super.dispose(); + } + + void _appSelection(Application app) { + setState(() { + if (_selectedApps.contains(app)) { + _selectedApps.remove(app); + } else { + _selectedApps.add(app); + } + }); + } + + @override + Widget build(BuildContext context) { + final apkParams = ref.watch(apkSearchParamProvider); + final apkAsync = ref.watch(apkProvider); + + return Scaffold( + appBar: AppBar( + title: Text(t.apkPickerPage.title), + actions: [ + PopupMenuButton( + itemBuilder: (context) { + return [ + CheckedPopupMenuItem( + value: 0, + checked: !apkParams.includeSystemApps, + child: Text(t.apkPickerPage.excludeSystemApps), + ), + CheckedPopupMenuItem( + value: 1, + checked: apkParams.onlyAppsWithLaunchIntent, + child: Text(t.apkPickerPage.excludeAppsWithoutLaunchIntent), + ), + ]; + }, + onSelected: (value) { + switch (value) { + case 0: + ref.notifier(apkSearchParamProvider).setState((old) => old.copyWith(includeSystemApps: !old.includeSystemApps)); + break; + case 1: + ref.notifier(apkSearchParamProvider).setState((old) => old.copyWith(onlyAppsWithLaunchIntent: !old.onlyAppsWithLaunchIntent)); + break; + } + }, + ), + ], + ), + floatingActionButton: (_selectedApps.isEmpty) + ? Container() + : FloatingActionButton.extended( + onPressed: () async => await _pickApps(_selectedApps), + label: Row( + children: [ + const Icon(Icons.add), + const SizedBox(width: 5), + Text('Add ${_selectedApps.length} ${(_selectedApps.length == 1) ? "App" : "Apps"}'), + ], + ), + ), + body: ResponsiveListView.single( + padding: const EdgeInsets.symmetric(horizontal: 15), + tabletPadding: const EdgeInsets.symmetric(horizontal: 15), + child: CustomScrollView( + slivers: [ + const SliverToBoxAdapter( + child: SizedBox(height: 10), + ), + SliverPinnedHeader( + height: 80, + child: Padding( + padding: const EdgeInsets.only(top: 10), + child: TextFormField( + controller: _textController, + autofocus: true, + onChanged: (s) { + ref.notifier(apkSearchParamProvider).setState((old) => old.copyWith(query: s)); + setState(() {}); + }, + decoration: InputDecoration( + fillColor: ElevationOverlay.applySurfaceTint( + Theme.of(context).inputDecorationTheme.fillColor!, + Theme.of(context).colorScheme.surfaceTint, + 3, + ), + prefixIcon: const Icon(Icons.search), + suffixIcon: apkParams.query.isNotEmpty + ? IconButton( + onPressed: () { + ref.notifier(apkSearchParamProvider).setState((old) => old.copyWith(query: '')); + _textController.clear(); + }, + icon: const Icon(Icons.clear), + ) + : Text(apkParams.query), + ), + ), + ), + ), + SliverToBoxAdapter( + child: Row( + children: [ + Text(t.apkPickerPage.apps(n: apkAsync.data?.length ?? 0)), + const Spacer(), + Row( + children: [ + const Text('Select Multiple Apps'), + const SizedBox(width: 5), + Switch( + value: apkParams.selectMultipleApps, + onChanged: (bool newValue) { + setState(() { + apkParams.selectMultipleApps = !apkParams.selectMultipleApps; + }); + }, + activeTrackColor: Theme.of(context).colorScheme.primary, + activeThumbColor: Theme.of(context).colorScheme.onPrimary, + inactiveThumbColor: Theme.of(context).colorScheme.outline, + inactiveTrackColor: Theme.of(context).colorScheme.surface, + ), + ], + ), + ], + ), + ), + const SliverToBoxAdapter( + child: SizedBox(height: 10), + ), + apkAsync.when( + data: (appList) { + return SliverList( + delegate: SliverChildBuilderDelegate( + childCount: appList.length, + (context, index) { + final app = appList[index]; + final thumbnail = (app as ApplicationWithIcon).icon; + + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: InkWell( + onTap: () async => (apkParams.selectMultipleApps) ? _appSelection(app) : _pickApp(app), + customBorder: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + child: Row( + children: [ + MemoryThumbnail( + bytes: thumbnail, + size: 60, + fileType: FileType.apk, + ), + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + app.appName, + maxLines: 1, + overflow: TextOverflow.fade, + softWrap: false, + ), + Consumer( + builder: (context, ref) { + final appSize = ref.watch(apkSizeProvider(app.apkFilePath)); + final appSizeString = appSize.maybeWhen( + data: (size) => '${size.asReadableFileSize} • ', + orElse: () => '', + ); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '$appSizeString${app.versionName != null ? 'v${app.versionName}' : ''}', + style: Theme.of(context).textTheme.bodySmall, + ), + Text( + app.packageName, + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ); + }, + ), + ], + ), + ), + if (apkParams.selectMultipleApps) + Icon( + _selectedApps.contains(app) ? Icons.check_circle : Icons.radio_button_unchecked, + color: _selectedApps.contains(app) ? Theme.of(context).iconTheme.color : Colors.grey, + ), + ], + ), + ), + ); + }, + ), + ); + }, + error: (e, st) { + return SliverToBoxAdapter(child: Text('Error: $e\n$st')); + }, + loading: () { + return const SliverToBoxAdapter( + child: Center( + child: CircularProgressIndicator(), + ), + ); + }, + ), + SliverToBoxAdapter( + child: SizedBox(height: getNavBarPadding(context) + 50), + ), + ], + ), + ), + ); + } +} diff --git a/app/lib/pages/changelog_page.dart b/app/lib/pages/changelog_page.dart new file mode 100644 index 0000000..7e1f64f --- /dev/null +++ b/app/lib/pages/changelog_page.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart' show rootBundle; +import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:localsend_app/gen/assets.gen.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/util/ui/nav_bar_padding.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; + +class ChangelogPage extends StatelessWidget { + const ChangelogPage(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: basicLocalSendAppbar(t.changelogPage.title), + body: FutureBuilder( + future: rootBundle.loadString(Assets.changelog), // ignore: discarded_futures + builder: (context, data) { + if (!data.hasData) { + return Container(); + } + return Markdown( + padding: EdgeInsets.only( + left: 15 + MediaQuery.of(context).padding.left, + right: 15 + MediaQuery.of(context).padding.right, + top: 15, + bottom: 15 + getNavBarPadding(context), + ), + data: data.data!, + ); + }, + ), + ); + } +} diff --git a/app/lib/pages/debug/debug_page.dart b/app/lib/pages/debug/debug_page.dart new file mode 100644 index 0000000..37c0900 --- /dev/null +++ b/app/lib/pages/debug/debug_page.dart @@ -0,0 +1,94 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/pages/debug/discovery_debug_page.dart'; +import 'package:localsend_app/pages/debug/http_logs_page.dart'; +import 'package:localsend_app/pages/debug/security_debug_page.dart'; +import 'package:localsend_app/provider/app_arguments_provider.dart'; +import 'package:localsend_app/provider/persistence_provider.dart'; +import 'package:localsend_app/util/shared_preferences/shared_preferences_file.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/debug_entry.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; +import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart'; + +class DebugPage extends StatelessWidget { + const DebugPage({super.key}); + + @override + Widget build(BuildContext context) { + final appArguments = context.watch(appArgumentsProvider); + final portableMode = context.watch(persistenceProvider.select((state) => state.isPortableMode())); + final store = SharedPreferencesStorePlatform.instance; + + return Scaffold( + appBar: basicLocalSendAppbar('Debugging'), + body: ListView( + padding: const EdgeInsets.only(left: 20, right: 20, top: 10, bottom: 30), + children: [ + DebugEntry( + name: 'Debug Mode', + value: kDebugMode.toString(), + ), + DebugEntry( + name: 'Portable Mode', + value: portableMode ? 'true' : 'false', + ), + DebugEntry( + name: 'Executable Path', + value: Platform.resolvedExecutable, + ), + DebugEntry( + name: 'Working Directory', + value: Directory.current.path, + ), + if (store is SharedPreferencesFile) + DebugEntry( + name: 'Settings Path', + value: store.getPath(), + ), + DebugEntry( + name: 'App Arguments', + value: appArguments.isEmpty ? null : appArguments.map((e) => '"$e"').join(' '), + ), + DebugEntry( + name: 'Dart SDK', + value: Platform.version, + ), + const SizedBox(height: 20), + const Text('More', style: DebugEntry.headerStyle), + const SizedBox(height: 5), + Wrap( + spacing: 10, + runSpacing: 10, + children: [ + FilledButton( + onPressed: () async => context.push(() => const SecurityDebugPage()), + child: const Text('Security'), + ), + FilledButton( + onPressed: () async => context.push(() => const DiscoveryDebugPage()), + child: const Text('Discovery'), + ), + FilledButton( + onPressed: () async => context.push(() => const HttpLogsPage()), + child: const Text('HTTP Logs'), + ), + if (kDebugMode) + FilledButton( + onPressed: () async => context.push(() => const RefenaTracingPage()), + child: const Text('Refena Tracing'), + ), + FilledButton( + onPressed: () async => await context.ref.read(persistenceProvider).clear(), + child: const Text('Clear settings'), + ), + ], + ), + ], + ), + ); + } +} diff --git a/app/lib/pages/debug/discovery_debug_page.dart b/app/lib/pages/debug/discovery_debug_page.dart new file mode 100644 index 0000000..aacf393 --- /dev/null +++ b/app/lib/pages/debug/discovery_debug_page.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:localsend_app/provider/logging/discovery_logs_provider.dart'; +import 'package:localsend_app/provider/network/nearby_devices_provider.dart'; +import 'package:localsend_app/widget/copyable_text.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +final _dateFormat = DateFormat.Hms(); + +class DiscoveryDebugPage extends StatelessWidget { + const DiscoveryDebugPage({super.key}); + + @override + Widget build(BuildContext context) { + final ref = context.ref; + final logs = ref.watch(discoveryLoggerProvider); + return Scaffold( + appBar: basicLocalSendAppbar('Discovery Debugging'), + body: ResponsiveListView( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 30), + children: [ + Row( + children: [ + ElevatedButton( + onPressed: () => ref.redux(nearbyDevicesProvider).dispatch(StartMulticastScan()), + child: const Text('Announce'), + ), + const SizedBox(width: 20), + ElevatedButton( + onPressed: () => ref.notifier(discoveryLoggerProvider).clear(), + child: const Text('Clear'), + ), + ], + ), + const SizedBox(height: 20), + ...logs.map( + (log) => CopyableText( + prefix: TextSpan( + text: '[${_dateFormat.format(log.timestamp)}] ', + style: const TextStyle( + color: Colors.green, + fontWeight: FontWeight.bold, + ), + ), + name: log.log, + value: log.log, + ), + ), + ], + ), + ); + } +} diff --git a/app/lib/pages/debug/http_logs_page.dart b/app/lib/pages/debug/http_logs_page.dart new file mode 100644 index 0000000..3296cf7 --- /dev/null +++ b/app/lib/pages/debug/http_logs_page.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:localsend_app/provider/logging/http_logs_provider.dart'; +import 'package:localsend_app/widget/copyable_text.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +final _dateFormat = DateFormat.Hms(); + +class HttpLogsPage extends StatelessWidget { + const HttpLogsPage({super.key}); + + @override + Widget build(BuildContext context) { + final logs = context.ref.watch(httpLogsProvider); + return Scaffold( + appBar: basicLocalSendAppbar('HTTP Logs'), + body: ResponsiveListView( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 30), + children: [ + Row( + children: [ + ElevatedButton( + onPressed: () => context.ref.notifier(httpLogsProvider).clear(), + child: const Text('Clear'), + ), + ], + ), + const SizedBox(height: 20), + ...logs.map( + (log) => CopyableText( + prefix: TextSpan( + text: '[${_dateFormat.format(log.timestamp)}] ', + style: const TextStyle( + color: Colors.green, + fontWeight: FontWeight.bold, + ), + ), + name: log.log, + value: log.log, + ), + ), + ], + ), + ); + } +} diff --git a/app/lib/pages/debug/security_debug_page.dart b/app/lib/pages/debug/security_debug_page.dart new file mode 100644 index 0000000..6df0c67 --- /dev/null +++ b/app/lib/pages/debug/security_debug_page.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/provider/security_provider.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/debug_entry.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +class SecurityDebugPage extends StatelessWidget { + const SecurityDebugPage({super.key}); + + @override + Widget build(BuildContext context) { + final securityContext = context.ref.watch(securityProvider); + return Scaffold( + appBar: basicLocalSendAppbar('Security Debugging'), + body: ResponsiveListView( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 30), + maxWidth: 700, + children: [ + Row( + children: [ + FilledButton( + onPressed: () async => await context.ref.redux(securityProvider).dispatchAsync(ResetSecurityContextAction()), + child: const Text('Reset'), + ), + ], + ), + DebugEntry( + name: 'Certificate SHA-256 (fingerprint)', + value: securityContext.certificateHash, + ), + DebugEntry( + name: 'Certificate', + value: securityContext.certificate, + ), + DebugEntry( + name: 'Private Key', + value: securityContext.privateKey, + ), + DebugEntry( + name: 'Public Key', + value: securityContext.publicKey, + ), + ], + ), + ); + } +} diff --git a/app/lib/pages/donation/donation_page.dart b/app/lib/pages/donation/donation_page.dart new file mode 100644 index 0000000..6eeada2 --- /dev/null +++ b/app/lib/pages/donation/donation_page.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/state/purchase_state.dart'; +import 'package:localsend_app/pages/donation/donation_page_vm.dart'; +// [FOSS_REMOVE_START] +import 'package:localsend_app/provider/purchase_provider.dart'; +// [FOSS_REMOVE_END] +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class DonationPage extends StatelessWidget { + const DonationPage({super.key}); + + @override + Widget build(BuildContext context) { + return ViewModelBuilder( + provider: (ref) => donationPageVmProvider, + // [FOSS_REMOVE_START] + init: (context) => context.redux(purchaseProvider).dispatchAsync(FetchPricesAndPurchasesAction()), // ignore: discarded_futures + // [FOSS_REMOVE_END] + builder: (context, vm) { + return Scaffold( + appBar: basicLocalSendAppbar(t.donationPage.title), + body: Stack( + children: [ + ResponsiveListView( + padding: const EdgeInsets.symmetric(horizontal: 20), + children: [ + const SizedBox(height: 50), + Center( + child: Text( + t.donationPage.info, + textAlign: TextAlign.center, + ), + ), + const SizedBox(height: 50), + if (vm.purchased.isNotEmpty) + Padding( + padding: const EdgeInsets.only(bottom: 20), + child: Center( + child: Text( + t.donationPage.thanks, + textAlign: TextAlign.center, + style: TextStyle(color: Theme.of(context).colorScheme.primary), + ), + ), + ), + if (vm.platformSupportPayment) _StoreDonation(vm) else const _LinkDonation(), + ], + ), + if (vm.pending) + Container( + color: Colors.black.withValues(alpha: 0.1), + child: const Center( + child: CircularProgressIndicator(), + ), + ), + ], + ), + ); + }, + ); + } +} + +class _StoreDonation extends StatelessWidget { + final DonationPageVm vm; + + const _StoreDonation(this.vm); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + ...PurchaseItem.values.map((item) { + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: FilledButton.icon( + onPressed: vm.purchased.contains(item) ? null : () => vm.purchase(item), + icon: const Icon(Icons.favorite), + label: Text(t.donationPage.donate(amount: vm.prices[item] ?? '...')), + ), + ); + }), + const SizedBox(height: 20), + TextButton.icon( + onPressed: vm.restore, + icon: const Icon(Icons.restore), + label: Text(t.donationPage.restore), + ), + ], + ); + } +} + +class _LinkDonation extends StatelessWidget { + const _LinkDonation(); + + @override + Widget build(BuildContext context) { + return Wrap( + alignment: WrapAlignment.center, + children: [ + TextButton.icon( + onPressed: () async { + await launchUrl(Uri.parse('https://github.com/sponsors/Tienisto'), mode: LaunchMode.externalApplication); + }, + icon: const Icon(Icons.open_in_new), + label: const Text('Github'), + ), + TextButton.icon( + onPressed: () async { + await launchUrl(Uri.parse('https://ko-fi.com/tienisto'), mode: LaunchMode.externalApplication); + }, + icon: const Icon(Icons.open_in_new), + label: const Text('Ko-fi'), + ), + ], + ); + } +} diff --git a/app/lib/pages/donation/donation_page_vm.dart b/app/lib/pages/donation/donation_page_vm.dart new file mode 100644 index 0000000..9a7387c --- /dev/null +++ b/app/lib/pages/donation/donation_page_vm.dart @@ -0,0 +1,51 @@ +import 'package:localsend_app/model/state/purchase_state.dart'; +// [FOSS_REMOVE_START] +import 'package:localsend_app/provider/purchase_provider.dart'; +// [FOSS_REMOVE_END] +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +class DonationPageVm { + final bool platformSupportPayment; + final Map prices; + final Set purchased; + final bool pending; + final void Function(PurchaseItem item) purchase; + final void Function() restore; + + DonationPageVm({ + required this.platformSupportPayment, + required this.prices, + required this.purchased, + required this.pending, + required this.purchase, + required this.restore, + }); +} + +// [FOSS_REMOVE_START] +final donationPageVmProvider = ViewProvider((ref) { + final state = ref.watch(purchaseProvider); + return DonationPageVm( + platformSupportPayment: checkPlatformSupportPayment(), + prices: state.prices, + purchased: state.purchases, + pending: state.pending, + purchase: (item) => ref.redux(purchaseProvider).dispatchAsync(PurchaseAction(item)), + restore: () => ref.redux(purchaseProvider).dispatchAsync(PurchaseRestoreAction()), + ); +}); +// [FOSS_REMOVE_END] + +/// This is a noop version of the original view model. +/// Used to compile the FOSS version of the app by removing the original provider above. +final donationPageNoopVmProvider = ViewProvider((ref) { + return DonationPageVm( + platformSupportPayment: false, + prices: {}, + purchased: {}, + pending: false, + purchase: (_) {}, + restore: () {}, + ); +}); diff --git a/app/lib/pages/home_page.dart b/app/lib/pages/home_page.dart new file mode 100644 index 0000000..23d39cc --- /dev/null +++ b/app/lib/pages/home_page.dart @@ -0,0 +1,199 @@ +import 'dart:io'; + +import 'package:bitsdojo_window/bitsdojo_window.dart'; +import 'package:desktop_drop/desktop_drop.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/init.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/pages/home_page_controller.dart'; +import 'package:localsend_app/pages/tabs/receive_tab.dart'; +import 'package:localsend_app/pages/tabs/send_tab.dart'; +import 'package:localsend_app/pages/tabs/settings_tab.dart'; +import 'package:localsend_app/provider/selection/selected_sending_files_provider.dart'; +import 'package:localsend_app/util/native/cross_file_converters.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/responsive_builder.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +enum HomeTab { + receive(Icons.wifi), + send(Icons.send), + settings(Icons.settings); + + const HomeTab(this.icon); + + final IconData icon; + + String get label { + switch (this) { + case HomeTab.receive: + return t.receiveTab.title; + case HomeTab.send: + return t.sendTab.title; + case HomeTab.settings: + return t.settingsTab.title; + } + } +} + +class HomePage extends StatefulWidget { + final HomeTab initialTab; + + /// It is important for the initializing step + /// because the first init clears the cache + final bool appStart; + + const HomePage({ + required this.initialTab, + required this.appStart, + super.key, + }); + + @override + State createState() => _HomePageState(); +} + +class _HomePageState extends State with Refena { + bool _dragAndDropIndicator = false; + + @override + void initState() { + super.initState(); + + ensureRef((ref) async { + ref.redux(homePageControllerProvider).dispatch(ChangeTabAction(widget.initialTab)); + await postInit(context, ref, widget.appStart); + }); + } + + @override + Widget build(BuildContext context) { + Translations.of(context); // rebuild on locale change + final vm = context.watch(homePageControllerProvider); + + return DropTarget( + onDragEntered: (_) { + setState(() { + _dragAndDropIndicator = true; + }); + }, + onDragExited: (_) { + setState(() { + _dragAndDropIndicator = false; + }); + }, + onDragDone: (event) async { + if (event.files.length == 1 && Directory(event.files.first.path).existsSync()) { + // user dropped a directory + await ref.redux(selectedSendingFilesProvider).dispatchAsync(AddDirectoryAction(event.files.first.path)); + } else { + // user dropped one or more files + await ref + .redux(selectedSendingFilesProvider) + .dispatchAsync( + AddFilesAction( + files: event.files, + converter: CrossFileConverters.convertXFile, + ), + ); + } + vm.changeTab(HomeTab.send); + }, + child: ResponsiveBuilder( + builder: (sizingInformation) { + return Scaffold( + body: Row( + children: [ + if (!sizingInformation.isMobile) + Stack( + children: [ + NavigationRail( + selectedIndex: vm.currentTab.index, + onDestinationSelected: (index) => vm.changeTab(HomeTab.values[index]), + extended: sizingInformation.isDesktop, + backgroundColor: Theme.of(context).cardColorWithElevation, + leading: sizingInformation.isDesktop + ? Column( + children: [ + checkPlatform([TargetPlatform.macOS]) + ? // considered adding some extra space so it looks more natural + SizedBox(height: 40) + : SizedBox(height: 20), + const Text( + 'LocalSend', + style: TextStyle(fontSize: 32, fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + SizedBox(height: 20), + ], + ) + : checkPlatform([TargetPlatform.macOS]) + ? SizedBox( + height: 20, + ) + : null, + destinations: HomeTab.values.map((tab) { + return NavigationRailDestination( + icon: Icon(tab.icon), + label: Text(tab.label), + ); + }).toList(), + ), + // makes the top draggable + Positioned( + top: 0, + left: 0, + right: 0, + height: 40, + child: MoveWindow(), + ), + ], + ), + Expanded( + child: Stack( + children: [ + PageView( + controller: vm.controller, + physics: const NeverScrollableScrollPhysics(), + children: const [ + SafeArea(child: ReceiveTab()), + SafeArea(child: SendTab()), + SettingsTab(), + ], + ), + if (_dragAndDropIndicator) + Container( + width: double.infinity, + decoration: BoxDecoration( + color: Theme.of(context).scaffoldBackgroundColor, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.file_download, size: 128), + const SizedBox(height: 30), + Text(t.sendTab.placeItems, style: Theme.of(context).textTheme.titleLarge), + ], + ), + ), + ], + ), + ), + ], + ), + bottomNavigationBar: sizingInformation.isMobile + ? NavigationBar( + selectedIndex: vm.currentTab.index, + onDestinationSelected: (index) => vm.changeTab(HomeTab.values[index]), + destinations: HomeTab.values.map((tab) { + return NavigationDestination(icon: Icon(tab.icon), label: tab.label); + }).toList(), + ) + : null, + ); + }, + ), + ); + } +} diff --git a/app/lib/pages/home_page_controller.dart b/app/lib/pages/home_page_controller.dart new file mode 100644 index 0000000..6fd6ad0 --- /dev/null +++ b/app/lib/pages/home_page_controller.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/pages/home_page.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +class HomePageVm { + final PageController controller; + final HomeTab currentTab; + final void Function(HomeTab) changeTab; + + HomePageVm({ + required this.controller, + required this.currentTab, + required this.changeTab, + }); +} + +final homePageControllerProvider = ReduxProvider( + (ref) => HomePageController(), +); + +class HomePageController extends ReduxNotifier { + @override + HomePageVm init() { + return HomePageVm( + controller: PageController(), + currentTab: HomeTab.receive, + changeTab: (tab) => redux.dispatch(ChangeTabAction(tab)), + ); + } +} + +class ChangeTabAction extends ReduxAction { + final HomeTab tab; + + ChangeTabAction(this.tab); + + @override + HomePageVm reduce() { + state.controller.jumpToPage(tab.index); + return HomePageVm( + controller: state.controller, + currentTab: tab, + changeTab: state.changeTab, + ); + } +} diff --git a/app/lib/pages/language_page.dart b/app/lib/pages/language_page.dart new file mode 100644 index 0000000..470d4db --- /dev/null +++ b/app/lib/pages/language_page.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +class LanguagePage extends StatefulWidget { + const LanguagePage({super.key}); + + @override + State createState() => _LanguagePageState(); +} + +class _LanguagePageState extends State { + @override + void initState() { + super.initState(); + + // ignore: discarded_futures + LocaleSettings.instance.loadAllLocales().then((_) { + setState(() {}); + }); + } + + @override + Widget build(BuildContext context) { + final t = Translations.of(context); + final activeLocale = context.ref.watch(settingsProvider.select((s) => s.locale)); + return Scaffold( + appBar: basicLocalSendAppbar(t.sendTab.selection.title), + body: ResponsiveListView( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 20), + children: [ + ...[ + null, + ...AppLocale.values, + ].map((locale) { + return ListTile( + onTap: () async { + await context.ref.notifier(settingsProvider).setLocale(locale); + if (locale == null) { + await LocaleSettings.useDeviceLocale(); + } else { + await LocaleSettings.setLocale(locale); + } + }, + title: Row( + children: [ + Flexible( + child: Text(locale?.humanName ?? t.settingsTab.general.languageOptions.system), + ), + if (locale == activeLocale) ...[ + const SizedBox(width: 10), + const Icon(Icons.check_circle, color: Colors.green), + ], + ], + ), + ); + }), + ], + ), + ); + } +} + +extension AppLocaleExt on AppLocale { + String get humanName { + return LocaleSettings.instance.translationMap[this]?.locale ?? 'Loading'; + } +} diff --git a/app/lib/pages/progress_page.dart b/app/lib/pages/progress_page.dart new file mode 100644 index 0000000..7eaae20 --- /dev/null +++ b/app/lib/pages/progress_page.dart @@ -0,0 +1,595 @@ +import 'dart:async'; +import 'dart:typed_data'; + +import 'package:bitsdojo_window/bitsdojo_window.dart'; +import 'package:common/model/dto/file_dto.dart'; +import 'package:common/model/file_status.dart'; +import 'package:common/model/session_status.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/state/server/receive_session_state.dart'; +import 'package:localsend_app/provider/network/send_provider.dart'; +import 'package:localsend_app/provider/network/server/server_provider.dart'; +import 'package:localsend_app/provider/progress_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/file_size_helper.dart'; +import 'package:localsend_app/util/file_speed_helper.dart'; +import 'package:localsend_app/util/native/open_file.dart'; +import 'package:localsend_app/util/native/open_folder.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/util/native/taskbar_helper.dart'; +import 'package:localsend_app/util/ui/nav_bar_padding.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/custom_progress_bar.dart'; +import 'package:localsend_app/widget/dialogs/cancel_session_dialog.dart'; +import 'package:localsend_app/widget/dialogs/error_dialog.dart'; +import 'package:localsend_app/widget/file_thumbnail.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; +import 'package:wechat_assets_picker/wechat_assets_picker.dart'; + +class ProgressPage extends StatefulWidget { + final bool showAppBar; + final bool closeSessionOnClose; + final String sessionId; + + const ProgressPage({ + required this.showAppBar, + required this.closeSessionOnClose, + required this.sessionId, + }); + + @override + State createState() => _ProgressPageState(); +} + +class _ProgressPageState extends State with Refena { + int _totalBytes = double.maxFinite.toInt(); + int _lastRemainingTimeUpdate = 0; // millis since epoch + String? _remainingTime; + List _files = []; // also contains declined files (files without token) + Set _selectedFiles = {}; + SessionStatus? _lastStatus; + + // If [autoFinish] is enabled, we wait a few seconds before automatically closing the session. + int _finishCounter = 3; + Timer? _finishTimer; + Timer? _wakelockPlusTimer; + + bool _advanced = false; + + @override + void initState() { + super.initState(); + + // init + WidgetsBinding.instance.addPostFrameCallback((_) { + try { + unawaited(WakelockPlus.enable()); + } catch (_) {} + + // Periodically call WakelockPlus.enable() to keep the screen awake + _wakelockPlusTimer = Timer.periodic(const Duration(seconds: 30), (timer) { + final finished = + ref.read(serverProvider)?.session?.files.values.map((e) => e.status).isFinishedOrSkipped ?? + ref.read(sendProvider)[widget.sessionId]?.files.values.map((e) => e.status).isFinishedOrSkipped ?? + true; + if (finished) { + timer.cancel(); + try { + unawaited(WakelockPlus.disable()); + } catch (_) {} + } else { + try { + unawaited(WakelockPlus.enable()); + } catch (_) {} + } + }); + + if (ref.read(settingsProvider).autoFinish) { + _finishTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + final finished = + ref.read(serverProvider)?.session?.files.values.map((e) => e.status).isFinishedOrSkipped ?? + ref.read(sendProvider)[widget.sessionId]?.files.values.map((e) => e.status).isFinishedOrSkipped ?? + true; + if (finished) { + if (_finishCounter == 1) { + timer.cancel(); + _exit(closeSession: true); + } else { + setState(() { + _finishCounter--; + }); + } + } + }); + } + + setState(() { + final receiveSession = ref.read(serverProvider)?.session; + if (receiveSession != null) { + _files = receiveSession.files.values.map((f) => f.file).toList(); + + // We previously used f.token != null here, but this may not work on very fast networks. + _selectedFiles = receiveSession.files.values.where((f) => f.status != FileStatus.skipped).map((f) => f.file.id).toSet(); + } else { + final sendSession = ref.read(sendProvider)[widget.sessionId]; + if (sendSession != null) { + _files = sendSession.files.values.map((f) => f.file).toList(); + _selectedFiles = sendSession.files.values.where((f) => f.status != FileStatus.skipped).map((f) => f.file.id).toSet(); + } + } + + _totalBytes = _files.where((f) => _selectedFiles.contains(f.id)).fold(0, (prev, curr) => prev + curr.size); + }); + }); + } + + void _exit({required bool closeSession}) async { + final receiveSession = ref.read(serverProvider.select((s) => s?.session)); + final sendSession = ref.read(sendProvider)[widget.sessionId]; + final SessionStatus? status = receiveSession?.status ?? sendSession?.status; + final keepSession = !closeSession && (status == SessionStatus.sending || status == SessionStatus.finishedWithErrors); + final result = status == null || keepSession || await _askCancelConfirmation(status); + + if (result && mounted) { + // ignore: unawaited_futures + context.popUntilRoot(); + } + } + + Future _askCancelConfirmation(SessionStatus status) async { + final bool result = switch (status == SessionStatus.sending) { + true => (await context.pushBottomSheet(() => const CancelSessionDialog())) == true, + false => true, + }; + if (result) { + final receiveSession = ref.read(serverProvider)?.session; + final sendState = ref.read(sendProvider)[widget.sessionId]; + + if (receiveSession != null) { + if (receiveSession.status == SessionStatus.sending) { + ref.notifier(serverProvider).cancelSession(); + } else { + ref.notifier(serverProvider).closeSession(); + } + } else if (sendState != null) { + if (sendState.status == SessionStatus.sending) { + ref.notifier(sendProvider).cancelSession(widget.sessionId); + } else { + ref.notifier(sendProvider).closeSession(widget.sessionId); + } + } + } + return result; + } + + @override + void dispose() { + super.dispose(); + _finishTimer?.cancel(); + _wakelockPlusTimer?.cancel(); + TaskbarHelper.clearProgressBar(); // ignore: discarded_futures + try { + WakelockPlus.disable(); // ignore: discarded_futures + } catch (_) {} + } + + @override + Widget build(BuildContext context) { + final progressNotifier = ref.watch(progressProvider); + final currBytes = _files.fold( + 0, + (prev, curr) => prev + ((progressNotifier.getProgress(sessionId: widget.sessionId, fileId: curr.id) * curr.size).round()), + ); + + final receiveSession = ref.watch(serverProvider.select((s) => s?.session)); + final sendSession = ref.watch(sendProvider)[widget.sessionId]; + + final SessionState? commonSessionState = receiveSession ?? sendSession; + + if (commonSessionState == null) { + return Scaffold( + body: Container(), + ); + } + + final status = commonSessionState.status; + + if (status == SessionStatus.sending) { + // ignore: discarded_futures + TaskbarHelper.setProgressBar(currBytes, _totalBytes); + } else if (status != _lastStatus) { + _lastStatus = status; + // ignore: discarded_futures + TaskbarHelper.visualizeStatus(status); + } + + final title = receiveSession != null ? t.progressPage.titleReceiving : t.progressPage.titleSending; + final startTime = commonSessionState.startTime; + final endTime = commonSessionState.endTime; + final int? speedInBytes; + if (startTime != null && currBytes >= 500 * 1024) { + speedInBytes = getFileSpeed(start: startTime, end: endTime ?? DateTime.now().millisecondsSinceEpoch, bytes: currBytes); + + final now = DateTime.now().millisecondsSinceEpoch; + if (now - _lastRemainingTimeUpdate >= 1000) { + _remainingTime = getRemainingTime(bytesPerSeconds: speedInBytes, remainingBytes: _totalBytes - currBytes); + _lastRemainingTimeUpdate = now; + } + } else { + speedInBytes = null; + } + + final fileStatusMap = receiveSession?.files.map((k, f) => MapEntry(k, f.status)) ?? sendSession!.files.map((k, f) => MapEntry(k, f.status)); + final finishedCount = fileStatusMap.values.where((s) => s == FileStatus.finished).length; + + return PopScope( + onPopInvokedWithResult: (didPop, result) { + if (didPop) { + // Already popped. + // Because the user cannot pop this page, we can safely assume that all sessions are closed if they should be. + return; + } + _exit(closeSession: widget.closeSessionOnClose); + }, + canPop: false, + child: Scaffold( + appBar: widget.showAppBar ? basicLocalSendAppbar(title) : null, + body: Stack( + children: [ + ListView.builder( + padding: EdgeInsets.only( + top: MediaQuery.of(context).padding.top + 20, + bottom: 150 + getNavBarPadding(context), + left: 15, + right: 30, + ), + itemCount: _files.length + 2, + itemBuilder: (context, index) { + if (index == 0) { + // title + if (widget.showAppBar) { + return Container(); + } + + return Padding( + padding: const EdgeInsets.only(bottom: 5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: Theme.of(context).textTheme.titleLarge), + if (checkPlatformWithFileSystem() && receiveSession != null) + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: '${t.settingsTab.receive.destination}: ', + style: const TextStyle(color: Colors.grey), + ), + TextSpan( + text: receiveSession.destinationDirectory, + style: TextStyle( + color: checkPlatform([TargetPlatform.iOS]) ? Colors.grey : Theme.of(context).colorScheme.primary, + ), + recognizer: checkPlatform([TargetPlatform.iOS]) + ? null + : (TapGestureRecognizer() + ..onTap = () async { + await openFolder(folderPath: receiveSession.destinationDirectory); + }), + ), + ], + ), + ), + ), + ], + ), + ); + } + + if (index == 1) { + // error card + final errorMessage = sendSession?.errorMessage; + if (errorMessage == null) { + return Container(); + } + + return SelectableText(errorMessage, style: TextStyle(color: Theme.of(context).colorScheme.warning)); + } + + final file = _files[index - 2]; + final String fileName = receiveSession?.files[file.id]?.desiredName ?? file.fileName; + + final fileStatus = fileStatusMap[file.id]!; + final savedToGallery = receiveSession?.files[file.id]?.savedToGallery ?? false; + + final String? filePath; + if (receiveSession != null && fileStatus == FileStatus.finished && !savedToGallery) { + filePath = receiveSession.files[file.id]!.path; + } else if (sendSession != null) { + filePath = sendSession.files[file.id]!.path; + } else { + filePath = null; + } + + final String? errorMessage; + if (receiveSession != null) { + errorMessage = receiveSession.files[file.id]!.errorMessage; + } else if (sendSession != null) { + errorMessage = sendSession.files[file.id]!.errorMessage; + } else { + errorMessage = null; + } + + final Uint8List? thumbnail; + final AssetEntity? asset; + if (sendSession != null) { + thumbnail = sendSession.files[file.id]!.thumbnail; + asset = sendSession.files[file.id]!.asset; + } else { + thumbnail = null; + asset = null; + } + + return Padding( + padding: const EdgeInsets.symmetric(vertical: 5), + child: InkWell( + splashColor: Colors.transparent, + splashFactory: NoSplash.splashFactory, + highlightColor: Colors.transparent, + hoverColor: Colors.transparent, + onTap: filePath != null && receiveSession != null ? () async => openFile(context, file.fileType, filePath!) : null, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SmartFileThumbnail( + bytes: thumbnail, + asset: asset, + path: filePath, + fileType: file.fileType, + ), + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Flexible( + child: Text( + fileName, + style: const TextStyle(fontSize: 16, height: 1), + maxLines: 1, + overflow: TextOverflow.fade, + softWrap: false, + ), + ), + Text(' (${file.size.asReadableFileSize})', style: const TextStyle(fontSize: 16, height: 1)), + ], + ), + const SizedBox(height: 5), + if (fileStatus == FileStatus.sending) + Padding( + padding: const EdgeInsets.only(top: 5), + child: CustomProgressBar( + progress: progressNotifier.getProgress(sessionId: widget.sessionId, fileId: file.id), + ), + ) + else + Row( + children: [ + Flexible( + child: Text( + savedToGallery ? t.progressPage.savedToGallery : fileStatus.label, + style: TextStyle(color: fileStatus.getColor(context), height: 1), + ), + ), + if (errorMessage != null) ...[ + const SizedBox(width: 5), + InkWell( + onTap: () async { + await showDialog( + context: context, + builder: (_) => ErrorDialog(error: errorMessage!), + ); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 5), + child: Icon(Icons.info, color: Theme.of(context).colorScheme.warning, size: 20), + ), + ), + ], + ], + ), + ], + ), + ), + if (sendSession != null && fileStatus == FileStatus.failed) + IconButton( + icon: const Icon(Icons.refresh), + onPressed: () async { + await ref + .notifier(sendProvider) + .sendFile( + sessionId: widget.sessionId, + isolateIndex: 0, + file: sendSession.files[file.id]!, + isRetry: true, + ); + }, + ), + ], + ), + ), + ); + }, + ), + SafeArea( + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.only(left: 10, right: 10, bottom: 10), + child: Card( + child: Padding( + padding: const EdgeInsets.only(left: 15, right: 15, bottom: 5, top: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + status.getLabel( + remainingTime: _remainingTime ?? '-', + ), + style: const TextStyle(fontSize: 20), + ), + const SizedBox(height: 5), + TweenAnimationBuilder( + tween: Tween(begin: 0, end: _totalBytes == 0 ? 0 : currBytes / _totalBytes), + duration: const Duration(milliseconds: 200), + curve: Curves.easeOut, + builder: (context, value, child) { + return CustomProgressBar( + progress: value, + borderRadius: 5, + ); + }, + ), + AnimatedCrossFade( + crossFadeState: _advanced ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: const Duration(milliseconds: 200), + alignment: Alignment.topLeft, + firstChild: Container(), + secondChild: Padding( + padding: const EdgeInsets.only(top: 10, bottom: 5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + t.progressPage.total.count( + curr: finishedCount, + n: _selectedFiles.length, + ), + ), + Text( + t.progressPage.total.size( + curr: currBytes.asReadableFileSize, + n: _totalBytes == double.maxFinite.toInt() ? '-' : _totalBytes.asReadableFileSize, + ), + ), + if (speedInBytes != null) + Text( + t.progressPage.total.speed( + speed: speedInBytes.asReadableFileSize, + ), + ), + ], + ), + ), + ), + const SizedBox(height: 5), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton.icon( + style: TextButton.styleFrom(foregroundColor: Theme.of(context).colorScheme.onSurface), + onPressed: () { + setState(() => _advanced = !_advanced); + }, + icon: const Icon(Icons.info), + label: Text(_advanced ? t.general.hide : t.general.advanced), + ), + TextButton.icon( + style: TextButton.styleFrom(foregroundColor: Theme.of(context).colorScheme.onSurface), + onPressed: () => _exit(closeSession: true), + icon: Icon(status == SessionStatus.sending ? Icons.close : Icons.check_circle), + label: Text( + status == SessionStatus.sending + ? t.general.cancel + : _finishTimer != null + ? '${t.general.done} ($_finishCounter)' + : t.general.done, + ), + ), + ], + ), + ], + ), + ), + ), + ), + ), + ), + checkPlatform([TargetPlatform.macOS]) + ? Positioned( + top: 0, + left: 0, + right: 0, + height: 40, + child: MoveWindow(), + ) + : SizedBox(), + ], + ), + ), + ); + } +} + +extension on FileStatus { + String get label { + switch (this) { + case FileStatus.queue: + return t.general.queue; + case FileStatus.skipped: + return t.general.skipped; + case FileStatus.sending: + return ''; // progress bar will be showed here + case FileStatus.failed: + return t.general.error; + case FileStatus.finished: + return t.general.done; + } + } + + Color getColor(BuildContext context) { + switch (this) { + case FileStatus.queue: + return Theme.of(context).colorScheme.primary; + case FileStatus.skipped: + return Colors.grey; + case FileStatus.sending: + return Theme.of(context).colorScheme.primary; + case FileStatus.failed: + return Theme.of(context).colorScheme.warning; + case FileStatus.finished: + return Theme.of(context).colorScheme.primary; + } + } +} + +extension on SessionStatus { + String getLabel({required String remainingTime}) { + switch (this) { + case SessionStatus.sending: + return t.progressPage.total.title.sending( + time: remainingTime, + ); + case SessionStatus.finished: + return t.general.finished; + case SessionStatus.finishedWithErrors: + return t.progressPage.total.title.finishedError; + case SessionStatus.canceledBySender: + return t.progressPage.total.title.canceledSender; + case SessionStatus.canceledByReceiver: + return t.progressPage.total.title.canceledReceiver; + default: + return ''; + } + } +} diff --git a/app/lib/pages/receive_history_page.dart b/app/lib/pages/receive_history_page.dart new file mode 100644 index 0000000..de90ff6 --- /dev/null +++ b/app/lib/pages/receive_history_page.dart @@ -0,0 +1,242 @@ +import 'dart:io'; + +import 'package:common/model/device.dart'; +import 'package:common/model/session_status.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/persistence/receive_history_entry.dart'; +import 'package:localsend_app/pages/receive_page.dart'; +import 'package:localsend_app/provider/receive_history_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/file_size_helper.dart'; +import 'package:localsend_app/util/native/directories.dart'; +import 'package:localsend_app/util/native/open_file.dart'; +import 'package:localsend_app/util/native/open_folder.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/dialogs/file_info_dialog.dart'; +import 'package:localsend_app/widget/dialogs/history_clear_dialog.dart'; +import 'package:localsend_app/widget/file_thumbnail.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:path/path.dart' as path; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +enum _EntryOption { + open, + showInFolder, + info, + delete; + + String get label { + return switch (this) { + _EntryOption.open => t.receiveHistoryPage.entryActions.open, + _EntryOption.showInFolder => t.receiveHistoryPage.entryActions.showInFolder, + _EntryOption.info => t.receiveHistoryPage.entryActions.info, + _EntryOption.delete => t.receiveHistoryPage.entryActions.deleteFromHistory, + }; + } +} + +const _optionsAll = _EntryOption.values; +final _optionsWithoutOpen = [_EntryOption.info, _EntryOption.delete]; + +class ReceiveHistoryPage extends StatelessWidget { + const ReceiveHistoryPage({super.key}); + + Future _openFile( + BuildContext context, + ReceiveHistoryEntry entry, + Dispatcher> dispatcher, + ) async { + if (entry.path != null) { + await openFile( + context, + entry.fileType, + entry.path!, + onDeleteTap: () => dispatcher.dispatchAsync(RemoveHistoryEntryAction(entry.id)), + ); + } + } + + @override + Widget build(BuildContext context) { + final entries = context.watch(receiveHistoryProvider); + return Scaffold( + appBar: basicLocalSendAppbar(t.receiveHistoryPage.title), + body: ResponsiveListView( + padding: const EdgeInsets.symmetric(vertical: 20), + children: [ + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: [ + const SizedBox(width: 15), + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.secondaryContainerIfDark, + foregroundColor: Theme.of(context).colorScheme.onSecondaryContainerIfDark, + ), + onPressed: checkPlatform([TargetPlatform.iOS]) + ? null + : () async { + // ignore: use_build_context_synchronously + final destination = context.read(settingsProvider).destination ?? await getDefaultDestinationDirectory(); + await openFolder(folderPath: destination); + }, + icon: const Icon(Icons.folder), + label: Text(t.receiveHistoryPage.openFolder), + ), + const SizedBox(width: 20), + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.secondaryContainerIfDark, + foregroundColor: Theme.of(context).colorScheme.onSecondaryContainerIfDark, + ), + onPressed: entries.isEmpty + ? null + : () async { + final result = await showDialog( + context: context, + builder: (_) => const HistoryClearDialog(), + ); + + if (context.mounted && result == true) { + await context.redux(receiveHistoryProvider).dispatchAsync(RemoveAllHistoryEntriesAction()); + } + }, + icon: const Icon(Icons.delete), + label: Text(t.receiveHistoryPage.deleteHistory), + ), + ], + ), + ), + const SizedBox(height: 20), + if (entries.isEmpty) + Padding( + padding: const EdgeInsets.only(top: 100), + child: Center(child: Text(t.receiveHistoryPage.empty, style: Theme.of(context).textTheme.headlineMedium)), + ) + else + ...entries.map((entry) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), + child: InkWell( + splashColor: Colors.transparent, + splashFactory: NoSplash.splashFactory, + highlightColor: Colors.transparent, + hoverColor: Colors.transparent, + onTap: entry.path != null || entry.isMessage + ? () async { + if (entry.isMessage) { + final vm = ViewProvider((ref) { + return ReceivePageVm( + status: SessionStatus.waiting, + sender: Device( + signalingId: null, + ip: '0.0.0.0', + version: '1.0.0', + port: 8080, + https: false, + fingerprint: 'fingerprint', + alias: entry.senderAlias, + deviceModel: 'deviceModel', + deviceType: DeviceType.web, + download: true, + discoveryMethods: const {}, + ), + showSenderInfo: false, + files: [], + message: entry.fileName, + onAccept: () {}, + onDecline: () {}, + onClose: () {}, + ); + }); + + // ignore: unawaited_futures + context.push(() => ReceivePage(vm)); + return; + } + + await _openFile(context, entry, context.redux(receiveHistoryProvider)); + } + : null, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + FilePathThumbnail( + path: entry.path, + fileType: entry.fileType, + ), + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 3), + Text( + entry.fileName, + style: const TextStyle(fontSize: 16), + maxLines: 1, + overflow: TextOverflow.fade, + softWrap: false, + ), + Text( + '${entry.timestampString} - ${entry.fileSize.asReadableFileSize} - ${entry.senderAlias}', + maxLines: 1, + overflow: TextOverflow.fade, + softWrap: false, + style: const TextStyle(color: Colors.grey), + ), + ], + ), + ), + const SizedBox(width: 10), + PopupMenuButton<_EntryOption>( + onSelected: (_EntryOption item) async { + switch (item) { + case _EntryOption.open: + await _openFile(context, entry, context.redux(receiveHistoryProvider)); + break; + case _EntryOption.showInFolder: + if (entry.path != null) { + await openFolder( + folderPath: File(entry.path!).parent.path, + fileName: path.basename(entry.path!), + ); + } + break; + case _EntryOption.info: + // ignore: use_build_context_synchronously + await showDialog( + context: context, + builder: (_) => FileInfoDialog(entry: entry), + ); + break; + case _EntryOption.delete: + // ignore: use_build_context_synchronously + await context.redux(receiveHistoryProvider).dispatchAsync(RemoveHistoryEntryAction(entry.id)); + break; + } + }, + itemBuilder: (BuildContext context) { + return (entry.path != null ? _optionsAll : _optionsWithoutOpen).map((e) { + return PopupMenuItem<_EntryOption>( + value: e, + child: Text(e.label), + ); + }).toList(); + }, + ), + ], + ), + ), + ); + }), + ], + ), + ); + } +} diff --git a/app/lib/pages/receive_options_page.dart b/app/lib/pages/receive_options_page.dart new file mode 100644 index 0000000..9a768f1 --- /dev/null +++ b/app/lib/pages/receive_options_page.dart @@ -0,0 +1,194 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/pages/receive_page.dart'; +import 'package:localsend_app/provider/network/server/server_provider.dart'; +import 'package:localsend_app/provider/selection/selected_receiving_files_provider.dart'; +import 'package:localsend_app/util/file_size_helper.dart'; +import 'package:localsend_app/util/file_type_ext.dart'; +import 'package:localsend_app/util/native/pick_directory_path.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/custom_dropdown_button.dart'; +import 'package:localsend_app/widget/custom_icon_button.dart'; +import 'package:localsend_app/widget/dialogs/file_name_input_dialog.dart'; +import 'package:localsend_app/widget/dialogs/quick_actions_dialog.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +class ReceiveOptionsPage extends StatelessWidget { + final ReceivePageVm vm; + + const ReceiveOptionsPage(this.vm); + + @override + Widget build(BuildContext context) { + final ref = context.ref; + final receiveSession = ref.watch(serverProvider.select((s) => s?.session)); + if (receiveSession == null) { + return Scaffold( + body: Container(), + ); + } + final selectState = ref.watch(selectedReceivingFilesProvider); + + return Scaffold( + appBar: AppBar( + title: Text(t.receiveOptionsPage.title), + ), + body: ResponsiveListView( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 20), + children: [ + Row( + children: [ + Text(t.receiveOptionsPage.destination, style: Theme.of(context).textTheme.titleLarge), + if (checkPlatformWithFileSystem()) + Padding( + padding: const EdgeInsets.only(left: 10), + child: CustomIconButton( + onPressed: () async { + final directory = await pickDirectoryPath(); + if (directory != null) { + ref.notifier(serverProvider).setSessionDestinationDir(directory); + } + }, + child: const Icon(Icons.edit), + ), + ), + ], + ), + const SizedBox(height: 5), + Text(checkPlatformWithFileSystem() ? receiveSession.destinationDirectory : t.receiveOptionsPage.appDirectory), + if (checkPlatformWithGallery()) + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 20), + Text(t.receiveOptionsPage.saveToGallery, style: Theme.of(context).textTheme.titleLarge), + const SizedBox(height: 10), + Row( + children: [ + CustomDropdownButton( + value: receiveSession.saveToGallery, + expanded: false, + items: [false, true].map((b) { + return DropdownMenuItem( + value: b, + alignment: Alignment.center, + child: ConstrainedBox( + constraints: const BoxConstraints(minWidth: 80), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Text(b ? t.general.on : t.general.off), + ), + ), + ); + }).toList(), + onChanged: (b) => ref.notifier(serverProvider).setSessionSaveToGallery(b), + ), + if (receiveSession.containsDirectories && !receiveSession.saveToGallery) ...[ + const SizedBox(width: 10), + Expanded( + child: Text(t.receiveOptionsPage.saveToGalleryOff, style: const TextStyle(color: Colors.grey)), + ), + ], + ], + ), + ], + ), + const SizedBox(height: 20), + Row( + children: [ + Text(t.general.files, style: Theme.of(context).textTheme.titleLarge), + const SizedBox(width: 10), + Tooltip( + message: t.dialogs.quickActions.title, + child: CustomIconButton( + onPressed: () async { + await showDialog(context: context, builder: (_) => const QuickActionsDialog()); + }, + child: const Icon(Icons.tips_and_updates), + ), + ), + const SizedBox(width: 10), + Tooltip( + message: t.general.reset, + child: CustomIconButton( + onPressed: () => ref.notifier(selectedReceivingFilesProvider).setFiles(vm.files), + child: const Icon(Icons.undo), + ), + ), + ], + ), + const SizedBox(height: 5), + ...vm.files.map((file) { + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon(file.fileType.icon, size: 46), + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + selectState[file.id] ?? file.fileName, + style: const TextStyle(fontSize: 16), + maxLines: 1, + overflow: TextOverflow.fade, + softWrap: false, + ), + Text( + '${!selectState.containsKey(file.id) ? t.general.skipped : (selectState[file.id] == file.fileName ? t.general.unchanged : t.general.renamed)} - ${file.size.asReadableFileSize}', + style: TextStyle( + color: !selectState.containsKey(file.id) + ? Colors.grey + : (selectState[file.id] == file.fileName ? Theme.of(context).colorScheme.onSecondaryContainer : Colors.orange), + ), + ), + ], + ), + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + CustomIconButton( + onPressed: selectState[file.id] == null + ? null + : () async { + final result = await showDialog( + context: context, + builder: (_) => FileNameInputDialog( + originalName: file.fileName, + initialName: selectState[file.id]!, + ), + ); + if (result != null) { + ref.notifier(selectedReceivingFilesProvider).rename(file.id, result); + } + }, + child: const Icon(Icons.edit), + ), + Checkbox( + value: selectState.containsKey(file.id), + activeColor: Theme.of(context).colorScheme.onSurface, + checkColor: Theme.of(context).colorScheme.surface, + onChanged: (selected) { + if (selected == true) { + ref.notifier(selectedReceivingFilesProvider).select(file); + } else { + ref.notifier(selectedReceivingFilesProvider).unselect(file.id); + } + }, + ), + ], + ), + ], + ), + ); + }), + ], + ), + ); + } +} diff --git a/app/lib/pages/receive_page.dart b/app/lib/pages/receive_page.dart new file mode 100644 index 0000000..a3a3bf6 --- /dev/null +++ b/app/lib/pages/receive_page.dart @@ -0,0 +1,351 @@ +import 'dart:async'; + +import 'package:common/model/device.dart'; +import 'package:common/model/dto/file_dto.dart'; +import 'package:common/model/session_status.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/persistence/color_mode.dart'; +import 'package:localsend_app/pages/receive_options_page.dart'; +import 'package:localsend_app/provider/favorites_provider.dart'; +import 'package:localsend_app/provider/selection/selected_receiving_files_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/device_type_ext.dart'; +import 'package:localsend_app/util/favorites.dart'; +import 'package:localsend_app/util/ip_helper.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/util/native/taskbar_helper.dart'; +import 'package:localsend_app/util/ui/snackbar.dart'; +import 'package:localsend_app/widget/device_bage.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class ReceivePageVm { + final SessionStatus? status; + final Device sender; + + /// Show hashtag and device model. + final bool showSenderInfo; + final List files; + final String? message; + final bool isLink; + final void Function() onAccept; + final void Function() onDecline; + final void Function() onClose; + + ReceivePageVm({ + required this.status, + required this.sender, + required this.showSenderInfo, + required this.files, + required this.message, + required this.onAccept, + required this.onDecline, + required this.onClose, + }) : isLink = message != null && !message.trim().contains(RegExp(r'\s')) && (Uri.tryParse(message.trim())?.isAbsolute ?? false); +} + +class ReceivePage extends StatefulWidget { + final ViewProvider vm; + + const ReceivePage(this.vm); + + @override + State createState() => _ReceivePageState(); +} + +class _ReceivePageState extends State with Refena { + bool _showFullIp = false; + + @override + Widget build(BuildContext context) { + final vm = context.watch( + widget.vm, + listener: (prev, next) { + if (prev.status != next.status) { + // ignore: discarded_futures + TaskbarHelper.visualizeStatus(next.status); + } + }, + ); + + if (vm.status == null && vm.message == null) { + return const Scaffold( + body: SizedBox(), + ); + } + + final senderFavoriteEntry = ref.watch(favoritesProvider.select((state) => state.findDevice(vm.sender))); + + return ViewModelBuilder( + provider: (ref) => widget.vm, + onFirstFrame: (context, vm) { + ref.notifier(selectedReceivingFilesProvider).setFiles(vm.files); + }, + dispose: (ref) { + ref.dispose(widget.vm); + unawaited(TaskbarHelper.clearProgressBar()); + }, + builder: (context, vm) { + return PopScope( + onPopInvokedWithResult: (didPop, result) { + if (didPop) { + vm.onDecline(); + } + }, + canPop: true, + child: Scaffold( + body: SafeArea( + child: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: ResponsiveListView.defaultMaxWidth), + child: Builder( + builder: (context) { + final height = MediaQuery.of(context).size.height; + final smallUi = vm.message != null && height < 600; + return Padding( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: smallUi ? 20 : 30), + child: Column( + children: [ + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (vm.showSenderInfo && !smallUi) + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Icon(vm.sender.deviceType.icon, size: 64), + ), + Builder( + builder: (context) { + final alias = senderFavoriteEntry?.alias ?? vm.sender.alias; + if (alias.isEmpty) { + return Text('', style: TextStyle(fontSize: smallUi ? 32 : 48)); + } + return FittedBox( + child: Text( + alias, + style: TextStyle(fontSize: smallUi ? 32 : 48), + textAlign: TextAlign.center, + ), + ); + }, + ), + if (vm.showSenderInfo) ...[ + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InkWell( + onTap: () { + setState(() { + _showFullIp = !_showFullIp; + }); + }, + child: DeviceBadge( + backgroundColor: Theme.of(context).colorScheme.onSecondaryContainer, + foregroundColor: Theme.of(context).colorScheme.onInverseSurface, + label: switch (vm.sender.ip) { + String ip => _showFullIp ? ip : '#${ip.visualId}', + null => 'WebRTC', + }, + ), + ), + if (vm.sender.deviceModel != null) ...[ + const SizedBox(width: 10), + DeviceBadge( + backgroundColor: Theme.of(context).colorScheme.onSecondaryContainer, + foregroundColor: Theme.of(context).colorScheme.onInverseSurface, + label: vm.sender.deviceModel!, + ), + ], + ], + ), + ], + const SizedBox(height: 40), + Text( + vm.message != null + ? (vm.isLink ? t.receivePage.subTitleLink : t.receivePage.subTitleMessage) + : t.receivePage.subTitle(n: vm.files.length), + style: smallUi ? null : Theme.of(context).textTheme.titleLarge, + textAlign: TextAlign.center, + ), + if (vm.message != null) + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: const EdgeInsets.only(top: 20), + child: SizedBox( + height: 100, + child: Card( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(10), + child: SelectableText( + vm.message!, + ), + ), + ), + ), + ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ElevatedButton( + onPressed: () { + unawaited( + Clipboard.setData(ClipboardData(text: vm.message!)), + ); + if (checkPlatformIsDesktop()) { + context.showSnackBar(t.general.copiedToClipboard); + } + vm.onAccept(); + context.pop(); + }, + child: Text(t.general.copy), + ), + if (vm.isLink) + Padding( + padding: const EdgeInsetsDirectional.only(start: 20), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of(context).colorScheme.onPrimary, + ), + onPressed: () { + // ignore: discarded_futures + launchUrl(Uri.parse(vm.message!), mode: LaunchMode.externalApplication); + vm.onAccept(); + context.pop(); + }, + child: Text(t.general.open), + ), + ), + ], + ), + ], + ), + ], + ), + ), + _Actions(vm), + ], + ), + ); + }, + ), + ), + ), + ), + ), + ); + }, + ); + } +} + +class _Actions extends StatelessWidget { + final ReceivePageVm vm; + + const _Actions(this.vm); + + @override + Widget build(BuildContext context) { + final selectedFiles = context.watch(selectedReceivingFilesProvider); + final colorMode = context.watch(settingsProvider.select((state) => state.colorMode)); + + if (vm.message != null) { + return Center( + child: TextButton.icon( + style: TextButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onSurface, + ), + onPressed: () { + vm.onAccept(); + context.pop(); + }, + icon: const Icon(Icons.close), + label: Text(t.general.close), + ), + ); + } + + if (vm.status == SessionStatus.canceledBySender) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 20), + child: Text( + t.receivePage.canceled, + style: TextStyle(color: Theme.of(context).colorScheme.warning), + textAlign: TextAlign.center, + ), + ), + Center( + child: ElevatedButton.icon( + onPressed: () { + vm.onClose(); + context.pop(); + }, + icon: const Icon(Icons.check_circle), + label: Text(t.general.close), + ), + ), + ], + ); + } + + return Column( + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 20), + child: TextButton.icon( + style: TextButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onSurface, + ), + onPressed: () async { + await context.push(() => ReceiveOptionsPage(vm)); + }, + icon: const Icon(Icons.settings), + label: Text(t.receiveOptionsPage.title), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + elevation: colorMode == ColorMode.yaru ? 0 : null, + backgroundColor: colorMode == ColorMode.yaru ? Theme.of(context).colorScheme.surface : Theme.of(context).colorScheme.error, + foregroundColor: colorMode == ColorMode.yaru ? Theme.of(context).colorScheme.onSurface : Theme.of(context).colorScheme.onError, + ), + onPressed: () { + vm.onDecline(); + context.pop(); + }, + icon: const Icon(Icons.close), + label: Text(t.general.decline), + ), + const SizedBox(width: 20), + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of(context).colorScheme.onPrimary, + ), + onPressed: selectedFiles.isEmpty ? null : () => vm.onAccept(), + icon: const Icon(Icons.check_circle), + label: Text(t.general.accept), + ), + ], + ), + ], + ); + } +} diff --git a/app/lib/pages/selected_files_page.dart b/app/lib/pages/selected_files_page.dart new file mode 100644 index 0000000..bae4339 --- /dev/null +++ b/app/lib/pages/selected_files_page.dart @@ -0,0 +1,149 @@ +import 'dart:convert'; + +import 'package:common/model/file_type.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/provider/selection/selected_sending_files_provider.dart'; +import 'package:localsend_app/util/file_size_helper.dart'; +import 'package:localsend_app/util/native/open_file.dart'; +import 'package:localsend_app/util/ui/nav_bar_padding.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/dialogs/message_input_dialog.dart'; +import 'package:localsend_app/widget/file_thumbnail.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +class SelectedFilesPage extends StatelessWidget { + const SelectedFilesPage(); + + @override + Widget build(BuildContext context) { + final ref = context.ref; + final selectedFiles = ref.watch(selectedSendingFilesProvider); + + return Scaffold( + appBar: basicLocalSendAppbar(t.sendTab.selection.title), + body: ResponsiveListView.single( + padding: const EdgeInsets.symmetric(horizontal: 15), + tabletPadding: const EdgeInsets.symmetric(horizontal: 15), + child: CustomScrollView( + slivers: [ + const SliverToBoxAdapter( + child: SizedBox(height: 15), + ), + SliverToBoxAdapter( + child: Row( + children: [ + const SizedBox(width: 5), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(t.sendTab.selection.files(files: selectedFiles.length)), + Text(t.sendTab.selection.size(size: selectedFiles.fold(0, (prev, curr) => prev + curr.size).asReadableFileSize)), + ], + ), + ), + FilledButton( + onPressed: () { + ref.redux(selectedSendingFilesProvider).dispatch(ClearSelectionAction()); + context.popUntilRoot(); + }, + child: Text(t.selectedFilesPage.deleteAll), + ), + ], + ), + ), + const SliverToBoxAdapter( + child: SizedBox(height: 10), + ), + SliverList( + delegate: SliverChildBuilderDelegate( + childCount: selectedFiles.length, + (context, index) { + final file = selectedFiles[index]; + + final String? message; + if (file.fileType == FileType.text && file.bytes != null) { + message = utf8.decode(file.bytes!); + } else { + message = null; + } + + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: InkWell( + splashColor: Colors.transparent, + splashFactory: NoSplash.splashFactory, + highlightColor: Colors.transparent, + hoverColor: Colors.transparent, + onTap: file.path != null ? () async => openFile(context, file.fileType, file.path!) : null, + child: Card( + child: Padding( + padding: const EdgeInsets.all(10), + child: Row( + children: [ + SmartFileThumbnail.fromCrossFile(file), + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + message != null ? '"${message.replaceAll('\n', ' ')}"' : file.name, + maxLines: 1, + overflow: TextOverflow.fade, + softWrap: false, + ), + Text(file.size.asReadableFileSize, style: Theme.of(context).textTheme.bodySmall), + ], + ), + ), + if (file.fileType == FileType.text && file.bytes != null) + TextButton( + style: TextButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onSurface, + ), + onPressed: () async { + final result = await showDialog( + context: context, + builder: (_) => MessageInputDialog(initialText: message), + ); + if (result != null) { + ref.redux(selectedSendingFilesProvider).dispatch(UpdateMessageAction(message: result, index: index)); + } + }, + child: const Icon(Icons.edit), + ), + TextButton( + style: TextButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onSurface, + ), + onPressed: () { + final currCount = ref.read(selectedSendingFilesProvider).length; + ref.redux(selectedSendingFilesProvider).dispatch(RemoveSelectedFileAction(index)); + if (currCount == 1) { + context.popUntilRoot(); + } + }, + child: const Icon(Icons.delete), + ), + ], + ), + ), + ), + ), + ); + }, + ), + ), + SliverToBoxAdapter( + child: SizedBox(height: 15 + getNavBarPadding(context)), + ), + ], + ), + ), + ); + } +} diff --git a/app/lib/pages/send_page.dart b/app/lib/pages/send_page.dart new file mode 100644 index 0000000..309e62d --- /dev/null +++ b/app/lib/pages/send_page.dart @@ -0,0 +1,208 @@ +import 'dart:async'; + +import 'package:common/model/device.dart'; +import 'package:common/model/session_status.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/provider/favorites_provider.dart'; +import 'package:localsend_app/provider/network/send_provider.dart'; +import 'package:localsend_app/util/favorites.dart'; +import 'package:localsend_app/util/native/taskbar_helper.dart'; +import 'package:localsend_app/widget/animations/initial_fade_transition.dart'; +import 'package:localsend_app/widget/animations/initial_slide_transition.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/dialogs/error_dialog.dart'; +import 'package:localsend_app/widget/list_tile/device_list_tile.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +class SendPage extends StatefulWidget { + final bool showAppBar; + final bool closeSessionOnClose; + final String sessionId; + + const SendPage({ + required this.showAppBar, + required this.closeSessionOnClose, + required this.sessionId, + }); + + @override + State createState() => _SendPageState(); +} + +class _SendPageState extends State with Refena { + Device? _myDevice; + Device? _targetDevice; + + @override + void dispose() { + super.dispose(); + unawaited(TaskbarHelper.clearProgressBar()); + } + + void _cancel() { + // the state will be lost so we store them temporarily (only for UI) + final myDevice = ref.read(deviceFullInfoProvider); + final sendState = ref.read(sendProvider)[widget.sessionId]; + if (sendState == null) { + return; + } + + setState(() { + _myDevice = myDevice; + _targetDevice = sendState.target; + }); + ref.notifier(sendProvider).cancelSession(widget.sessionId); + } + + @override + Widget build(BuildContext context) { + final sendState = ref.watch( + sendProvider.select((state) => state[widget.sessionId]), + listener: (prev, next) { + final prevStatus = prev[widget.sessionId]?.status; + final nextStatus = next[widget.sessionId]?.status; + if (prevStatus != nextStatus) { + // ignore: discarded_futures + TaskbarHelper.visualizeStatus(nextStatus); + } + }, + ); + if (sendState == null && _myDevice == null && _targetDevice == null) { + return Scaffold( + body: Container(), + ); + } + final myDevice = ref.watch(deviceFullInfoProvider); + final targetDevice = sendState?.target ?? _targetDevice!; + final targetFavoriteEntry = ref.watch(favoritesProvider.select((state) => state.findDevice(targetDevice))); + final waiting = sendState?.status == SessionStatus.waiting; + + return PopScope( + onPopInvokedWithResult: (didPop, result) { + if (didPop && widget.closeSessionOnClose) { + _cancel(); + } + }, + canPop: true, + child: Scaffold( + appBar: widget.showAppBar ? basicLocalSendAppbar('') : null, + body: SafeArea( + child: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: ResponsiveListView.defaultMaxWidth), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 30), + child: Column( + children: [ + Expanded( + child: Column( + children: [ + InitialSlideTransition( + origin: const Offset(0, -1), + duration: const Duration(milliseconds: 400), + child: DeviceListTile( + device: myDevice, + ), + ), + const SizedBox(height: 20), + const InitialFadeTransition( + duration: Duration(milliseconds: 300), + delay: Duration(milliseconds: 400), + child: Icon(Icons.arrow_downward), + ), + const SizedBox(height: 20), + Hero( + tag: 'device-${targetDevice.ip}', + child: DeviceListTile( + device: targetDevice, + nameOverride: targetFavoriteEntry?.alias, + ), + ), + ], + ), + ), + if (sendState != null) + InitialFadeTransition( + duration: const Duration(milliseconds: 300), + delay: const Duration(milliseconds: 400), + child: Column( + children: [ + switch (sendState.status) { + SessionStatus.waiting => Padding( + padding: const EdgeInsets.only(bottom: 20), + child: Text(t.sendPage.waiting, textAlign: TextAlign.center), + ), + SessionStatus.declined => Padding( + padding: const EdgeInsets.only(bottom: 20), + child: Text( + t.sendPage.rejected, + style: TextStyle(color: Theme.of(context).colorScheme.warning), + textAlign: TextAlign.center, + ), + ), + SessionStatus.tooManyAttempts => Padding( + padding: const EdgeInsets.only(bottom: 20), + child: Text( + t.sendPage.tooManyAttempts, + style: TextStyle(color: Theme.of(context).colorScheme.warning), + textAlign: TextAlign.center, + ), + ), + SessionStatus.recipientBusy => Padding( + padding: const EdgeInsets.only(bottom: 20), + child: Text( + t.sendPage.busy, + style: TextStyle(color: Theme.of(context).colorScheme.warning), + textAlign: TextAlign.center, + ), + ), + SessionStatus.finishedWithErrors => Padding( + padding: const EdgeInsets.only(bottom: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(t.general.error, style: TextStyle(color: Theme.of(context).colorScheme.warning)), + if (sendState.errorMessage != null) + TextButton( + style: TextButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.warning, + ), + onPressed: () async => showDialog( + context: context, + builder: (_) => ErrorDialog(error: sendState.errorMessage!), + ), + child: const Icon(Icons.info), + ), + ], + ), + ), + _ => const SizedBox(), + }, + Center( + child: FilledButton.icon( + onPressed: () { + _cancel(); + context.pop(); + }, + icon: Icon(waiting ? Icons.close : Icons.check_circle), + label: Text(waiting ? t.general.cancel : t.general.close), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ), + ), + ), + ); + } +} diff --git a/app/lib/pages/settings/network_interfaces_page.dart b/app/lib/pages/settings/network_interfaces_page.dart new file mode 100644 index 0000000..0b3ac14 --- /dev/null +++ b/app/lib/pages/settings/network_interfaces_page.dart @@ -0,0 +1,223 @@ +import 'package:collection/collection.dart'; +import 'package:common/util/network_interfaces.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:local_hero/local_hero.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/dialogs/text_field_tv.dart'; +import 'package:localsend_app/widget/labeled_checkbox.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:moform/moform.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +class NetworkInterfacesPage extends StatefulWidget { + const NetworkInterfacesPage(); + + @override + State createState() => _NetworkInterfacesPageState(); +} + +class _NetworkInterfacesPageState extends State { + List<(String, List)> rawInterfaces = []; + + @override + void initState() { + super.initState(); + + // ignore: discarded_futures + getNetworkInterfaces(whitelist: null, blacklist: null).then((value) { + if (mounted) { + setState(() { + rawInterfaces = value.map((e) => (e.name, e.addresses.map((a) => a.address).toList())).toList(); + }); + } + }); + } + + @override + Widget build(BuildContext context) { + final settings = context.watch(settingsProvider); + final currList = settings.networkWhitelist ?? settings.networkBlacklist ?? []; + final Future Function(List?) updateFunction = settings.networkWhitelist != null + ? context.notifier(settingsProvider).setNetworkWhitelist + : context.notifier(settingsProvider).setNetworkBlacklist; + return Scaffold( + appBar: basicLocalSendAppbar(t.networkInterfacesPage.title), + body: LocalHeroScope( + duration: const Duration(milliseconds: 200), + curve: Curves.easeInOut, + child: ResponsiveListView( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 20), + children: [ + Text( + t.networkInterfacesPage.info, + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + Padding( + padding: const EdgeInsets.only(left: 10), + child: Text( + t.networkInterfacesPage.preview, + style: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + ), + ScrollConfiguration( + // By default, Flutter only allows dragging with touch devices. + // We also allow dragging with mouse. + behavior: const MaterialScrollBehavior().copyWith( + dragDevices: { + PointerDeviceKind.mouse, + PointerDeviceKind.touch, + PointerDeviceKind.stylus, + PointerDeviceKind.trackpad, + PointerDeviceKind.unknown, + }, + ), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: rawInterfaces.mapIndexed((i, e) { + final ignored = isNetworkIgnoredRaw( + networkWhitelist: settings.networkWhitelist, + networkBlacklist: settings.networkBlacklist, + interface: e.$2, + ); + final style = ignored + ? const TextStyle( + color: Colors.grey, + decoration: TextDecoration.lineThrough, + ) + : null; + return Padding( + padding: const EdgeInsets.only(right: 10), + child: Card( + child: Padding( + padding: const EdgeInsets.all(8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('[#${i + 1}] ${e.$1}', style: style), + ...e.$2.map((ip) => Text(ip, style: style)), + ], + ), + ), + ), + ); + }).toList(), + ), + ), + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + LabeledCheckbox( + label: t.networkInterfacesPage.whitelist, + value: settings.networkWhitelist != null, + onChanged: (value) async { + if (value == false) { + await context.notifier(settingsProvider).setNetworkWhitelist(null); + } else { + await context.notifier(settingsProvider).setNetworkWhitelist(switch (currList) { + [] => [''], + _ => [...currList], + }); + if (context.mounted) { + await context.notifier(settingsProvider).setNetworkBlacklist(null); + } + } + }, + ), + LabeledCheckbox( + label: t.networkInterfacesPage.blacklist, + value: settings.networkBlacklist != null, + onChanged: (value) async { + if (value == false) { + await context.notifier(settingsProvider).setNetworkBlacklist(null); + } else { + await context.notifier(settingsProvider).setNetworkBlacklist(switch (currList) { + [] => [''], + _ => [...currList], + }); + if (context.mounted) { + await context.notifier(settingsProvider).setNetworkWhitelist(null); + } + } + }, + ), + ], + ), + const SizedBox(height: 20), + ...currList.mapIndexed((i, e) { + return Padding( + padding: const EdgeInsets.only(bottom: 12), + child: StringField( + value: e, + onChanged: (value) async { + await updateFunction([ + ...currList.sublist(0, i), + value, + ...currList.sublist(i + 1), + ]); + }, + builder: (context, controller) { + return TextFieldTv( + name: t.networkInterfacesPage.whitelist, + controller: controller, + onDelete: () async { + if (currList.length == 1) { + await updateFunction(null); + return; + } + await updateFunction([ + ...currList.sublist(0, i), + ...currList.sublist(i + 1), + ]); + }, + ); + }, + ), + ); + }), + if (settings.networkWhitelist != null || settings.networkBlacklist != null) + LocalHero( + tag: 'network_interfaces_bottom', + child: Row( + children: [ + Material( + color: Colors.transparent, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '${t.general.example}:', + ), + Text('123.123.123.123'), + Text('123.123.123.*'), + ], + ), + ), + const Spacer(), + FilledButton.icon( + onPressed: () async { + await updateFunction([ + ...currList, + '', + ]); + }, + icon: const Icon(Icons.add), + label: Text(t.general.add), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/app/lib/pages/tabs/receive_tab.dart b/app/lib/pages/tabs/receive_tab.dart new file mode 100644 index 0000000..379edcd --- /dev/null +++ b/app/lib/pages/tabs/receive_tab.dart @@ -0,0 +1,257 @@ +import 'package:bitsdojo_window/bitsdojo_window.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/pages/home_page.dart'; +import 'package:localsend_app/pages/home_page_controller.dart'; +import 'package:localsend_app/pages/receive_history_page.dart'; +import 'package:localsend_app/pages/tabs/receive_tab_vm.dart'; +import 'package:localsend_app/provider/animation_provider.dart'; +import 'package:localsend_app/util/ip_helper.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/animations/initial_fade_transition.dart'; +import 'package:localsend_app/widget/column_list_view.dart'; +import 'package:localsend_app/widget/custom_icon_button.dart'; +import 'package:localsend_app/widget/local_send_logo.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:localsend_app/widget/rotating_widget.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +enum _QuickSaveMode { + off, + favorites, + on, +} + +class ReceiveTab extends StatelessWidget { + const ReceiveTab(); + + @override + Widget build(BuildContext context) { + final vm = context.watch(receiveTabVmProvider); + + return Stack( + children: [ + checkPlatform([TargetPlatform.macOS]) + ? SizedBox(height: 50, child: MoveWindow()) + : SizedBox(height: 0, width: 0), // makes the top part that's not occupied by another widget draggable + Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: ResponsiveListView.defaultMaxWidth), + child: Padding( + padding: const EdgeInsets.all(30), + child: ColumnListView( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InitialFadeTransition( + duration: const Duration(milliseconds: 300), + delay: const Duration(milliseconds: 200), + child: Consumer( + builder: (context, ref) { + final animations = ref.watch(animationProvider); + final activeTab = ref.watch(homePageControllerProvider.select((state) => state.currentTab)); + return RotatingWidget( + duration: const Duration(seconds: 15), + spinning: vm.serverState != null && animations && activeTab == HomeTab.receive, + child: const LocalSendLogo(withText: false), + ); + }, + ), + ), + FittedBox( + fit: BoxFit.scaleDown, + child: Text(vm.serverState?.alias ?? vm.aliasSettings, style: const TextStyle(fontSize: 48)), + ), + InitialFadeTransition( + duration: const Duration(milliseconds: 300), + delay: const Duration(milliseconds: 500), + child: Text( + vm.serverState == null ? t.general.offline : vm.localIps.map((ip) => '#${ip.visualId}').toSet().join(' '), + style: const TextStyle(fontSize: 24), + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.only(top: 10), + child: Center( + child: Column( + children: [ + Text(t.general.quickSave), + const SizedBox(height: 10), + SegmentedButton<_QuickSaveMode>( + multiSelectionEnabled: false, + emptySelectionAllowed: false, + showSelectedIcon: false, + onSelectionChanged: (selection) async { + if (selection.contains(_QuickSaveMode.off)) { + await vm.onSetQuickSave(context, false); + if (context.mounted) { + await vm.onSetQuickSaveFromFavorites(context, false); + } + } else if (selection.contains(_QuickSaveMode.favorites)) { + await vm.onSetQuickSave(context, false); + if (context.mounted) { + await vm.onSetQuickSaveFromFavorites(context, true); + } + } else if (selection.contains(_QuickSaveMode.on)) { + await vm.onSetQuickSaveFromFavorites(context, false); + if (context.mounted) { + await vm.onSetQuickSave(context, true); + } + } + }, + selected: { + if (!vm.quickSaveSettings && !vm.quickSaveFromFavoritesSettings) _QuickSaveMode.off, + if (vm.quickSaveFromFavoritesSettings) _QuickSaveMode.favorites, + if (vm.quickSaveSettings) _QuickSaveMode.on, + }, + segments: [ + ButtonSegment( + value: _QuickSaveMode.off, + label: Text(t.receiveTab.quickSave.off), + ), + ButtonSegment( + value: _QuickSaveMode.favorites, + label: Text(t.receiveTab.quickSave.favorites), + ), + ButtonSegment( + value: _QuickSaveMode.on, + label: Text(t.receiveTab.quickSave.on), + ), + ], + ), + ], + ), + ), + ), + const SizedBox(height: 15), + ], + ), + ), + ), + ), + _InfoBox(vm), + _CornerButtons( + showAdvanced: vm.showAdvanced, + showHistoryButton: vm.showHistoryButton, + toggleAdvanced: vm.toggleAdvanced, + ), + ], + ); + } +} + +class _CornerButtons extends StatelessWidget { + final bool showAdvanced; + final bool showHistoryButton; + final Future Function() toggleAdvanced; + + const _CornerButtons({ + required this.showAdvanced, + required this.showHistoryButton, + required this.toggleAdvanced, + }); + + @override + Widget build(BuildContext context) { + return Align( + alignment: Alignment.topRight, + child: Padding( + padding: const EdgeInsets.all(20), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + if (!showAdvanced) + AnimatedOpacity( + opacity: showHistoryButton ? 1 : 0, + duration: const Duration(milliseconds: 200), + child: CustomIconButton( + onPressed: () async { + await context.push(() => const ReceiveHistoryPage()); + }, + child: const Icon(Icons.history), + ), + ), + CustomIconButton( + key: const ValueKey('info-btn'), + onPressed: toggleAdvanced, + child: const Icon(Icons.info), + ), + ], + ), + ), + ); + } +} + +class _InfoBox extends StatelessWidget { + final ReceiveTabVm vm; + + const _InfoBox(this.vm); + + @override + Widget build(BuildContext context) { + return AnimatedCrossFade( + crossFadeState: vm.showAdvanced ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: const Duration(milliseconds: 200), + firstChild: Container(), + secondChild: Align( + alignment: Alignment.topRight, + child: Padding( + padding: const EdgeInsets.all(15), + child: Card( + child: Padding( + padding: const EdgeInsets.all(15), + child: Table( + columnWidths: const { + 0: IntrinsicColumnWidth(), + 1: IntrinsicColumnWidth(), + 2: IntrinsicColumnWidth(), + }, + children: [ + TableRow( + children: [ + Text(t.receiveTab.infoBox.alias), + const SizedBox(width: 10), + Padding( + padding: const EdgeInsets.only(right: 30), + child: SelectableText(vm.serverState?.alias ?? '-'), + ), + ], + ), + TableRow( + children: [ + Text(t.receiveTab.infoBox.ip), + const SizedBox(width: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (vm.localIps.isEmpty) Text(t.general.unknown), + ...vm.localIps.map((ip) => SelectableText(ip)), + ], + ), + ], + ), + TableRow( + children: [ + Text(t.receiveTab.infoBox.port), + const SizedBox(width: 10), + SelectableText(vm.serverState?.port.toString() ?? '-'), + ], + ), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/app/lib/pages/tabs/receive_tab_vm.dart b/app/lib/pages/tabs/receive_tab_vm.dart new file mode 100644 index 0000000..c83422e --- /dev/null +++ b/app/lib/pages/tabs/receive_tab_vm.dart @@ -0,0 +1,82 @@ +import 'package:common/util/sleep.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/model/state/server/server_state.dart'; +import 'package:localsend_app/provider/local_ip_provider.dart'; +import 'package:localsend_app/provider/network/server/server_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/widget/dialogs/quick_save_from_favorites_notice.dart'; +import 'package:localsend_app/widget/dialogs/quick_save_notice.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +/// Whether the advanced network info is shown +final _showAdvancedProvider = StateProvider((ref) => false, debugLabel: '_showAdvancedProvider'); + +/// Whether the history button is shown +/// This extra boolean is needed to delay the animation +final _showHistoryButtonProvider = StateProvider((ref) => true, debugLabel: '_showHistoryButtonProvider'); + +class ReceiveTabVm { + final String aliasSettings; + final bool quickSaveSettings; + final bool quickSaveFromFavoritesSettings; + final ServerState? serverState; + final List localIps; + final bool showAdvanced; + final bool showHistoryButton; + final Future Function() toggleAdvanced; + final Future Function(BuildContext context, bool enable) onSetQuickSave; + final Future Function(BuildContext context, bool enable) onSetQuickSaveFromFavorites; + + const ReceiveTabVm({ + required this.aliasSettings, + required this.quickSaveSettings, + required this.quickSaveFromFavoritesSettings, + required this.serverState, + required this.localIps, + required this.showAdvanced, + required this.showHistoryButton, + required this.toggleAdvanced, + required this.onSetQuickSave, + required this.onSetQuickSaveFromFavorites, + }); +} + +final receiveTabVmProvider = ViewProvider((ref) { + final (alias, quickSave, quickSaveFromFavorites) = ref.watch(settingsProvider.select((s) => (s.alias, s.quickSave, s.quickSaveFromFavorites))); + final networkInfo = ref.watch(localIpProvider).localIps; + final serverState = ref.watch(serverProvider); + final showAdvanced = ref.watch(_showAdvancedProvider); + final showHistoryButton = ref.watch(_showHistoryButtonProvider); + + return ReceiveTabVm( + aliasSettings: alias, + quickSaveSettings: quickSave, + quickSaveFromFavoritesSettings: quickSaveFromFavorites, + serverState: serverState, + localIps: networkInfo, + showAdvanced: showAdvanced, + showHistoryButton: showHistoryButton, + toggleAdvanced: () async { + if (showAdvanced) { + ref.notifier(_showAdvancedProvider).setState((_) => false); + await sleepAsync(200); + ref.notifier(_showHistoryButtonProvider).setState((_) => true); + } else { + ref.notifier(_showAdvancedProvider).setState((_) => true); + ref.notifier(_showHistoryButtonProvider).setState((_) => false); + } + }, + onSetQuickSave: (context, enable) async { + await ref.notifier(settingsProvider).setQuickSave(enable); + if (enable && context.mounted) { + await QuickSaveNotice.open(context); + } + }, + onSetQuickSaveFromFavorites: (context, enable) async { + await ref.notifier(settingsProvider).setQuickSaveFromFavorites(enable); + if (enable && context.mounted) { + await QuickSaveFromFavoritesNotice.open(context); + } + }, + ); +}); diff --git a/app/lib/pages/tabs/send_tab.dart b/app/lib/pages/tabs/send_tab.dart new file mode 100644 index 0000000..dd1e40f --- /dev/null +++ b/app/lib/pages/tabs/send_tab.dart @@ -0,0 +1,592 @@ +import 'package:bitsdojo_window/bitsdojo_window.dart'; +import 'package:collection/collection.dart'; +import 'package:common/model/device.dart'; +import 'package:common/model/session_status.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/send_mode.dart'; +import 'package:localsend_app/pages/selected_files_page.dart'; +import 'package:localsend_app/pages/tabs/send_tab_vm.dart'; +import 'package:localsend_app/pages/troubleshoot_page.dart'; +import 'package:localsend_app/provider/animation_provider.dart'; +import 'package:localsend_app/provider/network/nearby_devices_provider.dart'; +import 'package:localsend_app/provider/network/scan_facade.dart'; +import 'package:localsend_app/provider/network/send_provider.dart'; +import 'package:localsend_app/provider/progress_provider.dart'; +import 'package:localsend_app/provider/selection/selected_sending_files_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/favorites.dart'; +import 'package:localsend_app/util/file_size_helper.dart'; +import 'package:localsend_app/util/native/file_picker.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/big_button.dart'; +import 'package:localsend_app/widget/custom_icon_button.dart'; +import 'package:localsend_app/widget/dialogs/add_file_dialog.dart'; +import 'package:localsend_app/widget/dialogs/send_mode_help_dialog.dart'; +import 'package:localsend_app/widget/file_thumbnail.dart'; +import 'package:localsend_app/widget/list_tile/device_list_tile.dart'; +import 'package:localsend_app/widget/list_tile/device_placeholder_list_tile.dart'; +import 'package:localsend_app/widget/opacity_slideshow.dart'; +import 'package:localsend_app/widget/responsive_builder.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:localsend_app/widget/responsive_wrap_view.dart'; +import 'package:localsend_app/widget/rotating_widget.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +const _horizontalPadding = 15.0; +final _options = FilePickerOption.getOptionsForPlatform(); + +class SendTab extends StatelessWidget { + const SendTab(); + + @override + Widget build(BuildContext context) { + return ViewModelBuilder( + provider: (ref) => sendTabVmProvider, + init: (context) async => context.global.dispatchAsync(SendTabInitAction(context)), // ignore: discarded_futures + builder: (context, vm) { + final sizingInformation = SizingInformation(MediaQuery.sizeOf(context).width); + final buttonWidth = sizingInformation.isDesktop ? BigButton.desktopWidth : BigButton.mobileWidth; + final ref = context.ref; + return Stack( + children: [ + ResponsiveListView( + padding: EdgeInsets.zero, + children: [ + const SizedBox(height: 20), + if (vm.selectedFiles.isEmpty) ...[ + Padding( + padding: const EdgeInsets.symmetric(horizontal: _horizontalPadding), + child: Text( + t.sendTab.selection.title, + style: Theme.of(context).textTheme.titleMedium, + ), + ), + ResponsiveWrapView( + outerHorizontalPadding: 15, + outerVerticalPadding: 10, + childPadding: 10, + minChildWidth: buttonWidth, + children: _options.map((option) { + return BigButton( + icon: option.icon, + label: option.label, + filled: false, + onTap: () async => ref.global.dispatchAsync( + PickFileAction( + option: option, + context: context, + ), + ), + ); + }).toList(), + ), + ] else ...[ + Card( + margin: const EdgeInsets.only(bottom: 10, left: _horizontalPadding, right: _horizontalPadding), + child: Padding( + padding: const EdgeInsetsDirectional.only(start: 15, top: 5, bottom: 15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + t.sendTab.selection.title, + style: Theme.of(context).textTheme.titleMedium, + ), + const Spacer(), + CustomIconButton( + onPressed: () => ref.redux(selectedSendingFilesProvider).dispatch(ClearSelectionAction()), + child: Icon(Icons.close, color: Theme.of(context).colorScheme.secondary), + ), + const SizedBox(width: 5), + ], + ), + const SizedBox(height: 5), + Text(t.sendTab.selection.files(files: vm.selectedFiles.length)), + Text(t.sendTab.selection.size(size: vm.selectedFiles.fold(0, (prev, curr) => prev + curr.size).asReadableFileSize)), + const SizedBox(height: 10), + SizedBox( + height: defaultThumbnailSize, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: vm.selectedFiles.length, + itemBuilder: (context, index) { + final file = vm.selectedFiles[index]; + return Padding( + padding: const EdgeInsets.only(right: 10), + child: SmartFileThumbnail.fromCrossFile(file), + ); + }, + ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + style: TextButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onSurface, + ), + onPressed: () async { + await context.push(() => const SelectedFilesPage()); + }, + child: Text(t.general.edit), + ), + const SizedBox(width: 15), + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of(context).colorScheme.onPrimary, + ), + onPressed: () async { + if (_options.length == 1) { + // open directly + await ref.global.dispatchAsync( + PickFileAction( + option: _options.first, + context: context, + ), + ); + return; + } + await AddFileDialog.open( + context: context, + options: _options, + ); + }, + icon: const Icon(Icons.add), + label: Text(t.general.add), + ), + const SizedBox(width: 15), + ], + ), + ], + ), + ), + ), + ], + Row( + children: [ + const SizedBox(width: _horizontalPadding), + Flexible( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: Text(t.sendTab.nearbyDevices, style: Theme.of(context).textTheme.titleMedium), + ), + ), + const SizedBox(width: 10), + _ScanButton( + ips: vm.localIps, + ), + Tooltip( + message: t.sendTab.manualSending, + child: CustomIconButton( + onPressed: () async => vm.onTapAddress(context), + child: const Icon(Icons.ads_click), + ), + ), + Tooltip( + message: t.dialogs.favoriteDialog.title, + child: CustomIconButton( + onPressed: () async => await vm.onTapFavorite(context), + child: const Icon(Icons.favorite), + ), + ), + _SendModeButton( + onSelect: (mode) async => vm.onTapSendMode(context, mode), + ), + ], + ), + if (vm.nearbyDevices.isEmpty) + const Padding( + padding: EdgeInsets.only(bottom: 10, left: _horizontalPadding, right: _horizontalPadding), + child: Opacity( + opacity: 0.3, + child: DevicePlaceholderListTile(), + ), + ), + ...vm.nearbyDevices.map((device) { + final favoriteEntry = vm.favoriteDevices.findDevice(device); + return Padding( + padding: const EdgeInsets.only(bottom: 10, left: _horizontalPadding, right: _horizontalPadding), + child: Hero( + tag: 'device-${device.ip}', + child: vm.sendMode == SendMode.multiple + ? _MultiSendDeviceListTile( + device: device, + isFavorite: favoriteEntry != null, + nameOverride: favoriteEntry?.alias, + vm: vm, + ) + : DeviceListTile( + device: device, + isFavorite: favoriteEntry != null, + nameOverride: favoriteEntry?.alias, + onFavoriteTap: () async => await vm.onToggleFavorite(context, device), + onTap: () async => await vm.onTapDevice(context, device), + ), + ), + ); + }), + const SizedBox(height: 10), + Center( + child: TextButton( + onPressed: () async { + await context.push(() => const TroubleshootPage()); + }, + child: Text(t.troubleshootPage.title), + ), + ), + const SizedBox(height: 20), + Padding( + padding: const EdgeInsets.symmetric(horizontal: _horizontalPadding), + child: Consumer( + builder: (context, ref) { + final animations = ref.watch(animationProvider); + return OpacitySlideshow( + durationMillis: 6000, + running: animations, + children: [ + Text( + t.sendTab.help, + style: const TextStyle(color: Colors.grey), + textAlign: TextAlign.center, + ), + if (checkPlatformCanReceiveShareIntent()) + Text( + t.sendTab.shareIntentInfo, + style: const TextStyle(color: Colors.grey), + textAlign: TextAlign.center, + ), + ], + ); + }, + ), + ), + const SizedBox(height: 50), + ], + ), + // make the top draggable on Desktop + checkPlatform([TargetPlatform.macOS]) + ? SizedBox(height: 50, child: MoveWindow()) + : SizedBox( + height: 0, + width: 0, + ), + ], + ); + }, + ); + } +} + +/// A button that opens a popup menu to select [T]. +/// This is used for the scan button and the send mode button. +class _CircularPopupButton extends StatelessWidget { + final String tooltip; + final PopupMenuItemBuilder itemBuilder; + final PopupMenuItemSelected? onSelected; + final Widget child; + + const _CircularPopupButton({ + required this.tooltip, + required this.onSelected, + required this.itemBuilder, + required this.child, + super.key, + }); + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: BorderRadius.circular(9999), + child: Material( + type: MaterialType.transparency, + child: DividerTheme( + data: DividerThemeData( + color: Theme.of(context).brightness == Brightness.light ? Colors.teal.shade100 : Colors.grey.shade700, + ), + child: PopupMenuButton( + offset: const Offset(0, 40), + onSelected: onSelected, + tooltip: tooltip, + itemBuilder: itemBuilder, + child: child, + ), + ), + ), + ); + } +} + +/// The scan button that uses [_CircularPopupButton]. +class _ScanButton extends StatelessWidget { + final List ips; + + const _ScanButton({ + required this.ips, + }); + + @override + Widget build(BuildContext context) { + final (scanningFavorites, scanningIps) = context.ref.watch(nearbyDevicesProvider.select((s) => (s.runningFavoriteScan, s.runningIps))); + final animations = context.ref.watch(animationProvider); + + final spinning = (scanningFavorites || scanningIps.isNotEmpty) && animations; + final iconColor = !animations && scanningIps.isNotEmpty ? Theme.of(context).colorScheme.warning : null; + + if (ips.length <= StartSmartScan.maxInterfaces) { + return Tooltip( + message: t.sendTab.scan, + child: RotatingWidget( + duration: const Duration(seconds: 2), + spinning: spinning, + reverse: true, + child: CustomIconButton( + onPressed: () async { + context.redux(nearbyDevicesProvider).dispatch(ClearFoundDevicesAction()); + await context.global.dispatchAsync(StartSmartScan(forceLegacy: true)); + }, + child: Icon(Icons.sync, color: iconColor), + ), + ), + ); + } + + return _CircularPopupButton( + tooltip: t.sendTab.scan, + onSelected: (ip) async { + context.redux(nearbyDevicesProvider).dispatch(ClearFoundDevicesAction()); + await context.global.dispatchAsync(StartLegacySubnetScan(subnets: [ip])); + }, + itemBuilder: (_) { + return [ + ...ips.map( + (ip) => PopupMenuItem( + value: ip, + padding: const EdgeInsets.only(left: 12, right: 8), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + _RotatingSyncIcon(ip), + const SizedBox(width: 10), + Text(ip), + ], + ), + ), + ), + ]; + }, + child: RotatingWidget( + duration: const Duration(seconds: 2), + spinning: spinning, + reverse: true, + child: Padding( + padding: const EdgeInsets.all(8), + child: Icon(Icons.sync, color: iconColor), + ), + ), + ); + } +} + +/// A separate widget, so it gets the latest data from provider. +class _RotatingSyncIcon extends StatelessWidget { + final String ip; + + const _RotatingSyncIcon(this.ip); + + @override + Widget build(BuildContext context) { + final scanningIps = context.ref.watch(nearbyDevicesProvider.select((s) => s.runningIps)); + return RotatingWidget( + duration: const Duration(seconds: 2), + spinning: scanningIps.contains(ip), + reverse: true, + child: const Icon(Icons.sync), + ); + } +} + +class _SendModeButton extends StatelessWidget { + final void Function(SendMode mode) onSelect; + + const _SendModeButton({required this.onSelect}); + + @override + Widget build(BuildContext context) { + return _CircularPopupButton( + tooltip: t.sendTab.sendMode, + onSelected: (mode) async { + switch (mode) { + case 0: + onSelect(SendMode.single); + break; + case 1: + onSelect(SendMode.multiple); + break; + case 2: + onSelect(SendMode.link); + break; + case -1: + await showDialog(context: context, builder: (_) => const SendModeHelpDialog()); + break; + } + }, + itemBuilder: (_) => [ + PopupMenuItem( + value: 0, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Consumer( + builder: (context, ref) { + final sendMode = ref.watch(settingsProvider.select((s) => s.sendMode)); + return Visibility( + visible: sendMode == SendMode.single, + maintainSize: true, + maintainAnimation: true, + maintainState: true, + child: const Icon(Icons.check_circle), + ); + }, + ), + const SizedBox(width: 10), + Text(t.sendTab.sendModes.single), + ], + ), + ), + PopupMenuItem( + value: 1, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Consumer( + builder: (context, ref) { + final sendMode = ref.watch(settingsProvider.select((s) => s.sendMode)); + return Visibility( + visible: sendMode == SendMode.multiple, + maintainSize: true, + maintainAnimation: true, + maintainState: true, + child: const Icon(Icons.check_circle), + ); + }, + ), + const SizedBox(width: 10), + Text(t.sendTab.sendModes.multiple), + ], + ), + ), + PopupMenuItem( + value: 2, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Visibility( + visible: false, + maintainSize: true, + maintainAnimation: true, + maintainState: true, + child: Icon(Icons.check_circle), + ), + const SizedBox(width: 10), + Text(t.sendTab.sendModes.link), + ], + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + value: -1, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Directionality( + textDirection: TextDirection.ltr, + child: Icon(Icons.help), + ), + const SizedBox(width: 10), + Text(t.sendTab.sendModeHelp), + ], + ), + ), + ], + child: const Padding( + padding: EdgeInsets.all(8), + child: Icon(Icons.settings), + ), + ); + } +} + +/// An advanced list tile which shows the progress of the file transfer. +class _MultiSendDeviceListTile extends StatelessWidget { + final Device device; + final bool isFavorite; + final String? nameOverride; + final SendTabVm vm; + + const _MultiSendDeviceListTile({ + required this.device, + required this.isFavorite, + required this.nameOverride, + required this.vm, + }); + + @override + Widget build(BuildContext context) { + final ref = context.ref; + final session = ref.watch(sendProvider).values.firstWhereOrNull((s) => s.target.ip == device.ip); + final double? progress; + if (session != null) { + final files = session.files.values.where((f) => f.token != null); + final progressNotifier = ref.watch(progressProvider); + final currBytes = files.fold( + 0, + (prev, curr) => prev + ((progressNotifier.getProgress(sessionId: session.sessionId, fileId: curr.file.id) * curr.file.size).round()), + ); + final totalBytes = files.fold(0, (prev, curr) => prev + curr.file.size); + progress = totalBytes == 0 ? 0 : currBytes / totalBytes; + } else { + progress = null; + } + return DeviceListTile( + device: device, + info: session?.status.humanString, + progress: progress, + isFavorite: isFavorite, + nameOverride: nameOverride, + onFavoriteTap: device.ip == null ? null : () async => await vm.onToggleFavorite(context, device), + onTap: () async => await vm.onTapDeviceMultiSend(context, device), + ); + } +} + +extension on SessionStatus { + String? get humanString { + switch (this) { + case SessionStatus.waiting: + return t.sendPage.waiting; + case SessionStatus.recipientBusy: + return t.sendPage.busy; + case SessionStatus.declined: + return t.sendPage.rejected; + case SessionStatus.tooManyAttempts: + return t.sendPage.tooManyAttempts; + case SessionStatus.sending: + return null; + case SessionStatus.finished: + return t.general.finished; + case SessionStatus.finishedWithErrors: + return t.progressPage.total.title.finishedError; + case SessionStatus.canceledBySender: + return t.progressPage.total.title.canceledSender; + case SessionStatus.canceledByReceiver: + return t.progressPage.total.title.canceledReceiver; + } + } +} diff --git a/app/lib/pages/tabs/send_tab_vm.dart b/app/lib/pages/tabs/send_tab_vm.dart new file mode 100644 index 0000000..080e26c --- /dev/null +++ b/app/lib/pages/tabs/send_tab_vm.dart @@ -0,0 +1,209 @@ +import 'package:collection/collection.dart'; +import 'package:common/model/device.dart'; +import 'package:common/model/session_status.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/model/cross_file.dart'; +import 'package:localsend_app/model/persistence/favorite_device.dart'; +import 'package:localsend_app/model/send_mode.dart'; +import 'package:localsend_app/pages/progress_page.dart'; +import 'package:localsend_app/pages/send_page.dart'; +import 'package:localsend_app/pages/web_send_page.dart'; +import 'package:localsend_app/provider/favorites_provider.dart'; +import 'package:localsend_app/provider/local_ip_provider.dart'; +import 'package:localsend_app/provider/network/nearby_devices_provider.dart'; +import 'package:localsend_app/provider/network/scan_facade.dart'; +import 'package:localsend_app/provider/network/send_provider.dart'; +import 'package:localsend_app/provider/selection/selected_sending_files_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/favorites.dart'; +import 'package:localsend_app/widget/dialogs/address_input_dialog.dart'; +import 'package:localsend_app/widget/dialogs/favorite_delete_dialog.dart'; +import 'package:localsend_app/widget/dialogs/favorite_dialog.dart'; +import 'package:localsend_app/widget/dialogs/favorite_edit_dialog.dart'; +import 'package:localsend_app/widget/dialogs/no_files_dialog.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +class SendTabVm { + final SendMode sendMode; + final List selectedFiles; + final List localIps; + final Iterable nearbyDevices; + final List favoriteDevices; + final Future Function(BuildContext context) onTapAddress; + final Future Function(BuildContext context) onTapFavorite; + final Future Function(BuildContext context, SendMode mode) onTapSendMode; + final Future Function(BuildContext context, Device device) onToggleFavorite; + final Future Function(BuildContext context, Device device) onTapDevice; + final Future Function(BuildContext context, Device device) onTapDeviceMultiSend; + + const SendTabVm({ + required this.sendMode, + required this.selectedFiles, + required this.localIps, + required this.nearbyDevices, + required this.favoriteDevices, + required this.onTapAddress, + required this.onTapFavorite, + required this.onTapSendMode, + required this.onToggleFavorite, + required this.onTapDevice, + required this.onTapDeviceMultiSend, + }); +} + +final sendTabVmProvider = ViewProvider((ref) { + final sendMode = ref.watch(settingsProvider.select((s) => s.sendMode)); + final selectedFiles = ref.watch(selectedSendingFilesProvider); + final localIps = ref.watch(localIpProvider).localIps; + final nearbyDevices = ref.watch(nearbyDevicesProvider).allDevices.values; + final favoriteDevices = ref.watch(favoritesProvider); + + return SendTabVm( + sendMode: sendMode, + selectedFiles: selectedFiles, + localIps: localIps, + nearbyDevices: nearbyDevices, + favoriteDevices: favoriteDevices, + onTapAddress: (context) async { + final files = ref.read(selectedSendingFilesProvider); + if (files.isEmpty) { + await context.pushBottomSheet(() => const NoFilesDialog()); + return; + } + final device = await showDialog( + context: context, + builder: (_) => const AddressInputDialog(), + ); + if (device != null && context.mounted) { + await ref + .notifier(sendProvider) + .startSession( + target: device, + files: files, + background: false, + ); + } + }, + onTapFavorite: (context) async { + final device = await showDialog( + context: context, + builder: (_) => const FavoritesDialog(), + ); + if (device != null && context.mounted) { + final files = ref.read(selectedSendingFilesProvider); + if (files.isEmpty) { + await context.pushBottomSheet(() => const NoFilesDialog()); + return; + } + + await ref + .notifier(sendProvider) + .startSession( + target: device, + files: files, + background: false, + ); + } + }, + onTapSendMode: (context, mode) async { + if (mode == SendMode.link) { + final files = ref.read(selectedSendingFilesProvider); + if (files.isEmpty) { + await context.pushBottomSheet(() => const NoFilesDialog()); + return; + } + await context.push(() => WebSendPage(files)); + return; + } + + await ref.notifier(settingsProvider).setSendMode(mode); + if (mode != SendMode.multiple) { + ref.notifier(sendProvider).clearAllSessions(); + } + }, + onToggleFavorite: (context, device) async { + final favoriteDevice = favoriteDevices.findDevice(device); + if (favoriteDevice != null) { + final result = await showDialog( + context: context, + builder: (_) => FavoriteDeleteDialog(favoriteDevice), + ); + if (result == true) { + await ref.redux(favoritesProvider).dispatchAsync(RemoveFavoriteAction(deviceFingerprint: device.fingerprint)); + } + } else { + await showDialog( + context: context, + builder: (_) => FavoriteEditDialog(prefilledDevice: device), + ); + } + }, + onTapDevice: (context, device) async { + if (selectedFiles.isEmpty) { + await context.pushBottomSheet(() => const NoFilesDialog()); + return; + } + + await ref + .notifier(sendProvider) + .startSession( + target: device, + files: selectedFiles, + background: false, + ); + }, + onTapDeviceMultiSend: (context, device) async { + final session = ref.read(sendProvider).values.firstWhereOrNull((s) => s.target.ip == device.ip); + if (session != null) { + if (session.status == SessionStatus.waiting) { + ref.notifier(sendProvider).setBackground(session.sessionId, false); + await context.push( + () => SendPage(showAppBar: true, closeSessionOnClose: false, sessionId: session.sessionId), + transition: RouterinoTransition.fade(), + ); + ref.notifier(sendProvider).setBackground(session.sessionId, true); + return; + } else if (session.status == SessionStatus.sending || session.status == SessionStatus.finishedWithErrors) { + ref.notifier(sendProvider).setBackground(session.sessionId, false); + await context.push(() => ProgressPage(showAppBar: true, closeSessionOnClose: false, sessionId: session.sessionId)); + ref.notifier(sendProvider).setBackground(session.sessionId, true); + return; + } + } + + final files = ref.read(selectedSendingFilesProvider); + if (files.isEmpty) { + await context.pushBottomSheet(() => const NoFilesDialog()); + return; + } + + if (session != null) { + // close old session + ref.notifier(sendProvider).closeSession(session.sessionId); + } + + await ref + .notifier(sendProvider) + .startSession( + target: device, + files: files, + background: true, + ); + }, + ); +}); + +class SendTabInitAction extends AsyncGlobalAction { + final BuildContext context; + + SendTabInitAction(this.context); + + @override + Future reduce() async { + final devices = ref.read(nearbyDevicesProvider).devices; + if (devices.isEmpty) { + await dispatchAsync(StartSmartScan(forceLegacy: false)); + } + } +} diff --git a/app/lib/pages/tabs/settings_tab.dart b/app/lib/pages/tabs/settings_tab.dart new file mode 100644 index 0000000..2e81af8 --- /dev/null +++ b/app/lib/pages/tabs/settings_tab.dart @@ -0,0 +1,770 @@ +import 'dart:io'; +import 'dart:ui'; +import 'package:bitsdojo_window/bitsdojo_window.dart'; +import 'package:common/constants.dart'; +import 'package:common/model/device.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/persistence/color_mode.dart'; +import 'package:localsend_app/pages/about/about_page.dart'; +import 'package:localsend_app/pages/changelog_page.dart'; +import 'package:localsend_app/pages/donation/donation_page.dart'; +import 'package:localsend_app/pages/language_page.dart'; +import 'package:localsend_app/pages/settings/network_interfaces_page.dart'; +import 'package:localsend_app/pages/tabs/settings_tab_controller.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/provider/version_provider.dart'; +import 'package:localsend_app/util/alias_generator.dart'; +import 'package:localsend_app/util/device_type_ext.dart'; +import 'package:localsend_app/util/native/macos_channel.dart'; +import 'package:localsend_app/util/native/pick_directory_path.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/custom_dropdown_button.dart'; +import 'package:localsend_app/widget/dialogs/encryption_disabled_notice.dart'; +import 'package:localsend_app/widget/dialogs/pin_dialog.dart'; +import 'package:localsend_app/widget/dialogs/quick_save_from_favorites_notice.dart'; +import 'package:localsend_app/widget/dialogs/quick_save_notice.dart'; +import 'package:localsend_app/widget/dialogs/text_field_tv.dart'; +import 'package:localsend_app/widget/dialogs/text_field_with_actions.dart'; +import 'package:localsend_app/widget/labeled_checkbox.dart'; +import 'package:localsend_app/widget/local_send_logo.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class SettingsTab extends StatelessWidget { + const SettingsTab(); + + @override + Widget build(BuildContext context) { + return ViewModelBuilder( + provider: (ref) => settingsTabControllerProvider, + builder: (context, vm) { + final ref = context.ref; + return Stack( + children: [ + Padding( + padding: EdgeInsets.only( + right: MediaQuery.of(context).padding.right, + ), // So camera or 3-button navigation doesn't interfere on the right, rest is handled + child: ResponsiveListView( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 40), + children: [ + SizedBox(height: 30 + MediaQuery.of(context).padding.top), + _SettingsSection( + title: t.settingsTab.general.title, + children: [ + _SettingsEntry( + label: t.settingsTab.general.brightness, + child: CustomDropdownButton( + value: vm.settings.theme, + items: vm.themeModes.map((theme) { + return DropdownMenuItem( + value: theme, + alignment: Alignment.center, + child: Text(theme.humanName), + ); + }).toList(), + onChanged: (theme) => vm.onChangeTheme(context, theme), + ), + ), + _SettingsEntry( + label: t.settingsTab.general.color, + child: CustomDropdownButton( + value: vm.settings.colorMode, + items: vm.colorModes.map((colorMode) { + return DropdownMenuItem( + value: colorMode, + alignment: Alignment.center, + child: Text(colorMode.humanName), + ); + }).toList(), + onChanged: vm.onChangeColorMode, + ), + ), + _ButtonEntry( + label: t.settingsTab.general.language, + buttonLabel: vm.settings.locale?.humanName ?? t.settingsTab.general.languageOptions.system, + onTap: () => vm.onTapLanguage(context), + ), + if (checkPlatformIsDesktop()) ...[ + /// Wayland does window position handling, so there's no need for it. See [https://github.com/localsend/localsend/issues/544] + if (vm.advanced && checkPlatformIsNotWaylandDesktop()) + _BooleanEntry( + label: defaultTargetPlatform == TargetPlatform.windows + ? t.settingsTab.general.saveWindowPlacementWindows + : t.settingsTab.general.saveWindowPlacement, + value: vm.settings.saveWindowPlacement, + onChanged: (b) async { + await ref.notifier(settingsProvider).setSaveWindowPlacement(b); + }, + ), + if (checkPlatformHasTray()) ...[ + _BooleanEntry( + label: t.settingsTab.general.minimizeToTray, + value: vm.settings.minimizeToTray, + onChanged: (b) async { + await ref.notifier(settingsProvider).setMinimizeToTray(b); + }, + ), + ], + if (checkPlatformIsDesktop()) ...[ + _BooleanEntry( + label: t.settingsTab.general.launchAtStartup, + value: vm.autoStart, + onChanged: (_) => vm.onToggleAutoStart(context), + ), + Visibility( + visible: vm.autoStart, + maintainAnimation: true, + maintainState: true, + child: AnimatedOpacity( + opacity: vm.autoStart ? 1.0 : 0.0, + duration: const Duration(milliseconds: 500), + child: _BooleanEntry( + label: t.settingsTab.general.launchMinimized, + value: vm.autoStartLaunchHidden, + onChanged: (_) => vm.onToggleAutoStartLaunchHidden(context), + ), + ), + ), + ], + if (vm.advanced && checkPlatform([TargetPlatform.windows])) ...[ + _BooleanEntry( + label: t.settingsTab.general.showInContextMenu, + value: vm.showInContextMenu, + onChanged: (_) => vm.onToggleShowInContextMenu(context), + ), + ], + ], + _BooleanEntry( + label: t.settingsTab.general.animations, + value: vm.settings.enableAnimations, + onChanged: (b) async { + await ref.notifier(settingsProvider).setEnableAnimations(b); + }, + ), + ], + ), + _SettingsSection( + title: t.settingsTab.receive.title, + children: [ + _BooleanEntry( + label: t.settingsTab.receive.quickSave, + value: vm.settings.quickSave, + onChanged: (b) async { + final old = vm.settings.quickSave; + await ref.notifier(settingsProvider).setQuickSave(b); + if (!old && b && context.mounted) { + await QuickSaveNotice.open(context); + } + }, + ), + _BooleanEntry( + label: t.settingsTab.receive.quickSaveFromFavorites, + value: vm.settings.quickSaveFromFavorites, + onChanged: (b) async { + final old = vm.settings.quickSaveFromFavorites; + await ref.notifier(settingsProvider).setQuickSaveFromFavorites(b); + if (!old && b && context.mounted) { + await QuickSaveFromFavoritesNotice.open(context); + } + }, + ), + _BooleanEntry( + label: t.settingsTab.receive.requirePin, + value: vm.settings.receivePin != null, + onChanged: (b) async { + final currentPIN = vm.settings.receivePin; + if (currentPIN != null) { + await ref.notifier(settingsProvider).setReceivePin(null); + } else { + final String? newPin = await showDialog( + context: context, + builder: (_) => const PinDialog( + obscureText: false, + generateRandom: false, + ), + ); + + if (newPin != null && newPin.isNotEmpty) { + await ref.notifier(settingsProvider).setReceivePin(newPin); + } + } + }, + ), + if (checkPlatformWithFileSystem()) + _SettingsEntry( + label: t.settingsTab.receive.destination, + child: TextButton( + style: TextButton.styleFrom( + backgroundColor: Theme.of(context).inputDecorationTheme.fillColor, + shape: RoundedRectangleBorder(borderRadius: Theme.of(context).inputDecorationTheme.borderRadius), + foregroundColor: Theme.of(context).colorScheme.onSurface, + ), + onPressed: () async { + if (vm.settings.destination != null) { + await ref.notifier(settingsProvider).setDestination(null); + if (defaultTargetPlatform == TargetPlatform.macOS) { + await removeExistingDestinationAccess(); + } + return; + } + + final directory = await pickDirectoryPath(); + if (directory != null) { + if (defaultTargetPlatform == TargetPlatform.macOS) { + await persistDestinationFolderAccess(directory); + } + await ref.notifier(settingsProvider).setDestination(directory); + } + }, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 5), + child: Text(vm.settings.destination ?? t.settingsTab.receive.downloads, style: Theme.of(context).textTheme.titleMedium), + ), + ), + ), + if (checkPlatformWithGallery()) + _BooleanEntry( + label: t.settingsTab.receive.saveToGallery, + value: vm.settings.saveToGallery, + onChanged: (b) async { + await ref.notifier(settingsProvider).setSaveToGallery(b); + }, + ), + _BooleanEntry( + label: t.settingsTab.receive.autoFinish, + value: vm.settings.autoFinish, + onChanged: (b) async { + await ref.notifier(settingsProvider).setAutoFinish(b); + }, + ), + _BooleanEntry( + label: t.settingsTab.receive.saveToHistory, + value: vm.settings.saveToHistory, + onChanged: (b) async { + await ref.notifier(settingsProvider).setSaveToHistory(b); + }, + ), + ], + ), + if (vm.advanced) + _SettingsSection( + title: t.settingsTab.send.title, + children: [ + _BooleanEntry( + label: t.settingsTab.send.shareViaLinkAutoAccept, + value: vm.settings.shareViaLinkAutoAccept, + onChanged: (b) async { + await ref.notifier(settingsProvider).setShareViaLinkAutoAccept(b); + }, + ), + ], + ), + _SettingsSection( + title: t.settingsTab.network.title, + children: [ + AnimatedCrossFade( + crossFadeState: + vm.serverState != null && + (vm.serverState!.alias != vm.settings.alias || + vm.serverState!.port != vm.settings.port || + vm.serverState!.https != vm.settings.https) + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, + duration: const Duration(milliseconds: 200), + alignment: Alignment.topLeft, + firstChild: Container(), + secondChild: Padding( + padding: const EdgeInsets.only(bottom: 15), + child: Text(t.settingsTab.network.needRestart, style: TextStyle(color: Theme.of(context).colorScheme.warning)), + ), + ), + _SettingsEntry( + label: '${t.settingsTab.network.server}${vm.serverState == null ? ' (${t.general.offline})' : ''}', + child: DecoratedBox( + decoration: BoxDecoration( + color: Theme.of(context).inputDecorationTheme.fillColor, + borderRadius: Theme.of(context).inputDecorationTheme.borderRadius, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + if (vm.serverState == null) + Tooltip( + message: t.general.start, + child: TextButton( + style: TextButton.styleFrom(foregroundColor: Theme.of(context).colorScheme.onSurface), + onPressed: () => vm.onTapStartServer(context), + child: const Icon(Icons.play_arrow), + ), + ) + else + Tooltip( + message: t.general.restart, + child: TextButton( + style: TextButton.styleFrom(foregroundColor: Theme.of(context).colorScheme.onSurface), + onPressed: () => vm.onTapRestartServer(context), + child: const Icon(Icons.refresh), + ), + ), + Tooltip( + message: t.general.stop, + child: TextButton( + style: TextButton.styleFrom(foregroundColor: Theme.of(context).colorScheme.onSurface), + onPressed: vm.serverState == null ? null : vm.onTapStopServer, + child: const Icon(Icons.stop), + ), + ), + ], + ), + ), + ), + _SettingsEntry( + label: t.settingsTab.network.alias, + child: TextFieldWithActions( + name: t.settingsTab.network.alias, + controller: vm.aliasController, + onChanged: (s) async { + await ref.notifier(settingsProvider).setAlias(s); + }, + actions: [ + Tooltip( + message: t.settingsTab.network.generateRandomAlias, + child: IconButton( + onPressed: () async { + // Generates random alias + final newAlias = generateRandomAlias(); + + // Update the TextField with the new alias + vm.aliasController.text = newAlias; + + // Persist the new alias using the settingsProvider + await ref.notifier(settingsProvider).setAlias(newAlias); + }, + icon: const Icon(Icons.casino), + ), + ), + Tooltip( + message: t.settingsTab.network.useSystemName, + child: IconButton( + onPressed: () async { + final String newAlias; + if (Platform.isMacOS) { + final result = await Process.run('scutil', ['--get', 'ComputerName']); + newAlias = result.stdout.toString().trim(); + } else { + newAlias = Platform.localHostname; + } + + vm.aliasController.text = newAlias; + await ref.notifier(settingsProvider).setAlias(newAlias); + }, + icon: const Icon(Icons.desktop_windows_rounded), + ), + ), + ], + ), + ), + if (vm.advanced) + _SettingsEntry( + label: t.settingsTab.network.deviceType, + child: CustomDropdownButton( + value: vm.deviceInfo.deviceType, + items: DeviceType.values.map((type) { + return DropdownMenuItem( + value: type, + alignment: Alignment.center, + child: Icon(type.icon), + ); + }).toList(), + onChanged: (type) async { + await ref.notifier(settingsProvider).setDeviceType(type); + }, + ), + ), + if (vm.advanced) + _SettingsEntry( + label: t.settingsTab.network.deviceModel, + child: TextFieldTv( + name: t.settingsTab.network.deviceModel, + controller: vm.deviceModelController, + onChanged: (s) async { + await ref.notifier(settingsProvider).setDeviceModel(s); + }, + ), + ), + if (vm.advanced) + _SettingsEntry( + label: t.settingsTab.network.port, + child: TextFieldTv( + name: t.settingsTab.network.port, + controller: vm.portController, + onChanged: (s) async { + final port = int.tryParse(s); + if (port != null) { + await ref.notifier(settingsProvider).setPort(port); + } + }, + ), + ), + if (vm.advanced) + _ButtonEntry( + label: t.settingsTab.network.network, + buttonLabel: switch (vm.settings.networkWhitelist != null || vm.settings.networkBlacklist != null) { + true => t.settingsTab.network.networkOptions.filtered, + false => t.settingsTab.network.networkOptions.all, + }, + onTap: () async { + await context.push(() => const NetworkInterfacesPage()); + }, + ), + if (vm.advanced) + _SettingsEntry( + label: t.settingsTab.network.discoveryTimeout, + child: TextFieldTv( + name: t.settingsTab.network.discoveryTimeout, + controller: vm.timeoutController, + onChanged: (s) async { + final timeout = int.tryParse(s); + if (timeout != null) { + await ref.notifier(settingsProvider).setDiscoveryTimeout(timeout); + } + }, + ), + ), + if (vm.advanced) + _BooleanEntry( + label: t.settingsTab.network.encryption, + value: vm.settings.https, + onChanged: (b) async { + final old = vm.settings.https; + await ref.notifier(settingsProvider).setHttps(b); + if (old && !b && context.mounted) { + await EncryptionDisabledNotice.open(context); + } + }, + ), + if (vm.advanced) + _SettingsEntry( + label: t.settingsTab.network.multicastGroup, + child: TextFieldTv( + name: t.settingsTab.network.multicastGroup, + controller: vm.multicastController, + onChanged: (s) async { + await ref.notifier(settingsProvider).setMulticastGroup(s); + }, + ), + ), + AnimatedCrossFade( + crossFadeState: vm.settings.port != defaultPort ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: const Duration(milliseconds: 200), + alignment: Alignment.topLeft, + firstChild: Container(), + secondChild: Padding( + padding: const EdgeInsets.only(bottom: 15), + child: Text( + t.settingsTab.network.portWarning(defaultPort: defaultPort), + style: const TextStyle(color: Colors.grey), + ), + ), + ), + AnimatedCrossFade( + crossFadeState: vm.settings.multicastGroup != defaultMulticastGroup ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: const Duration(milliseconds: 200), + alignment: Alignment.topLeft, + firstChild: Container(), + secondChild: Padding( + padding: const EdgeInsets.only(bottom: 15), + child: Text( + t.settingsTab.network.multicastGroupWarning(defaultMulticast: defaultMulticastGroup), + style: const TextStyle(color: Colors.grey), + ), + ), + ), + ], + ), + _SettingsSection( + title: t.settingsTab.other.title, + padding: const EdgeInsets.only(bottom: 0), + children: [ + _ButtonEntry( + label: t.aboutPage.title, + buttonLabel: t.general.open, + onTap: () async { + await context.push(() => const AboutPage()); + }, + ), + _ButtonEntry( + label: t.settingsTab.other.support, + buttonLabel: t.settingsTab.other.donate, + onTap: () async { + await context.push(() => const DonationPage()); + }, + ), + _ButtonEntry( + label: t.settingsTab.other.privacyPolicy, + buttonLabel: t.general.open, + onTap: () async { + await launchUrl( + Uri.parse('https://localsend.org/privacy'), + mode: LaunchMode.externalApplication, + ); + }, + ), + if (checkPlatform([TargetPlatform.iOS, TargetPlatform.macOS])) + _ButtonEntry( + label: t.settingsTab.other.termsOfUse, + buttonLabel: t.general.open, + onTap: () async { + await launchUrl( + Uri.parse('https://www.apple.com/legal/internet-services/itunes/dev/stdeula/'), + mode: LaunchMode.externalApplication, + ); + }, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + LabeledCheckbox( + label: t.settingsTab.advancedSettings, + value: vm.advanced, + labelFirst: true, + onChanged: (b) async { + vm.onTapAdvanced(b == true); + await ref.notifier(settingsProvider).setAdvancedSettingsEnabled(b == true); + }, + ), + const SizedBox(width: 10), + ], + ), + const SizedBox(height: 20), + const LocalSendLogo(withText: true), + const SizedBox(height: 5), + ref + .watch(versionProvider) + .maybeWhen( + data: (version) => Text( + 'Version: $version', + textAlign: TextAlign.center, + ), + orElse: () => Container(), + ), + Text( + '© ${DateTime.now().year} Tien Do Nam', + textAlign: TextAlign.center, + ), + Center( + child: TextButton.icon( + style: TextButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onSurface, + ), + onPressed: () async { + await context.push(() => const ChangelogPage()); + }, + icon: const Icon(Icons.history), + label: Text(t.changelogPage.title), + ), + ), + const SizedBox(height: 80), + ], + ), + ), + // a pseudo appbar that is draggable for the settings page + SizedBox( + height: 50 + MediaQuery.of(context).padding.top, + child: ClipRRect( + child: BackdropFilter( + filter: ImageFilter.blur( + sigmaX: 20.0, + sigmaY: 20.0, + ), + child: MoveWindow( + child: SafeArea( + child: Container( + alignment: Alignment.center, + child: Padding( + padding: const EdgeInsets.only(left: 8), + child: Text(t.settingsTab.title, style: Theme.of(context).textTheme.titleLarge, textAlign: TextAlign.center), + ), + ), + ), + ), + ), + ), + ), + ], + ); + }, + ); + } +} + +class _SettingsEntry extends StatelessWidget { + final String label; + final Widget child; + + const _SettingsEntry({required this.label, required this.child}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 15), + child: Row( + children: [ + Expanded( + child: Text(label), + ), + const SizedBox(width: 10), + SizedBox( + width: 150, + child: child, + ), + ], + ), + ); + } +} + +/// A specialized version of [_SettingsEntry]. +class _BooleanEntry extends StatelessWidget { + final String label; + final bool value; + final ValueChanged onChanged; + + const _BooleanEntry({ + required this.label, + required this.value, + required this.onChanged, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return _SettingsEntry( + label: label, + child: Stack( + children: [ + Container( + width: double.infinity, + height: 50, + decoration: BoxDecoration( + color: theme.inputDecorationTheme.fillColor, + borderRadius: theme.inputDecorationTheme.borderRadius, + ), + ), + Positioned.fill( + child: Center( + child: Switch( + value: value, + onChanged: onChanged, + activeTrackColor: theme.colorScheme.primary, + activeThumbColor: theme.colorScheme.onPrimary, + inactiveThumbColor: theme.colorScheme.outline, + inactiveTrackColor: theme.colorScheme.surface, + ), + ), + ), + ], + ), + ); + } +} + +/// A specialized version of [_SettingsEntry]. +class _ButtonEntry extends StatelessWidget { + final String label; + final String buttonLabel; + final void Function() onTap; + + const _ButtonEntry({ + required this.label, + required this.buttonLabel, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return _SettingsEntry( + label: label, + child: TextButton( + style: TextButton.styleFrom( + backgroundColor: Theme.of(context).inputDecorationTheme.fillColor, + shape: RoundedRectangleBorder(borderRadius: Theme.of(context).inputDecorationTheme.borderRadius), + foregroundColor: Theme.of(context).colorScheme.onSurface, + ), + onPressed: onTap, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 5), + child: Text( + buttonLabel, + style: Theme.of(context).textTheme.titleMedium, + textAlign: TextAlign.center, + ), + ), + ), + ); + } +} + +class _SettingsSection extends StatelessWidget { + final String title; + final List children; + final EdgeInsets padding; + + const _SettingsSection({ + required this.title, + required this.children, + this.padding = const EdgeInsets.only(bottom: 15), + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: padding, + child: Card( + child: Padding( + padding: const EdgeInsets.only(left: 15, right: 15, top: 15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: Theme.of(context).textTheme.titleMedium), + const SizedBox(height: 10), + ...children, + ], + ), + ), + ), + ); + } +} + +extension on ThemeMode { + String get humanName { + switch (this) { + case ThemeMode.system: + return t.settingsTab.general.brightnessOptions.system; + case ThemeMode.light: + return t.settingsTab.general.brightnessOptions.light; + case ThemeMode.dark: + return t.settingsTab.general.brightnessOptions.dark; + } + } +} + +extension on ColorMode { + String get humanName { + return switch (this) { + ColorMode.system => t.settingsTab.general.colorOptions.system, + ColorMode.localsend => t.appName, + ColorMode.oled => t.settingsTab.general.colorOptions.oled, + ColorMode.yaru => 'Yaru', + }; + } +} diff --git a/app/lib/pages/tabs/settings_tab_controller.dart b/app/lib/pages/tabs/settings_tab_controller.dart new file mode 100644 index 0000000..d402d48 --- /dev/null +++ b/app/lib/pages/tabs/settings_tab_controller.dart @@ -0,0 +1,241 @@ +import 'package:common/isolate.dart'; +import 'package:common/model/device_info_result.dart'; +import 'package:common/util/sleep.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/model/persistence/color_mode.dart'; +import 'package:localsend_app/pages/language_page.dart'; +import 'package:localsend_app/pages/tabs/settings_tab_vm.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/provider/local_ip_provider.dart'; +import 'package:localsend_app/provider/network/server/server_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/native/autostart_helper.dart'; +import 'package:localsend_app/util/native/context_menu_helper.dart'; +import 'package:localsend_app/util/ui/dynamic_colors.dart'; +import 'package:localsend_app/util/ui/snackbar.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +final settingsTabControllerProvider = ReduxProvider((ref) { + final settings = ref.notifier(settingsProvider); + final server = ref.notifier(serverProvider); + final isolateController = ref.notifier(parentIsolateProvider); + final localIpService = ref.notifier(localIpProvider); + final initialDeviceInfo = ref.read(deviceInfoProvider); + final supportsDynamicColors = ref.read(dynamicColorsProvider) != null; + + return SettingsTabController( + settingsService: settings, + serverNotifier: server, + isolateController: isolateController, + localIpService: localIpService, + initialDeviceInfo: initialDeviceInfo, + supportsDynamicColors: supportsDynamicColors, + ); +}); + +class SettingsTabController extends ReduxNotifier { + final SettingsService _settingsService; + final ServerService _serverService; + final IsolateController _isolateController; + final LocalIpService _localIpService; + final DeviceInfoResult _initialDeviceInfo; + final bool _supportsDynamicColors; + + SettingsTabController({ + required SettingsService settingsService, + required ServerService serverNotifier, + required IsolateController isolateController, + required LocalIpService localIpService, + required DeviceInfoResult initialDeviceInfo, + required bool supportsDynamicColors, + }) : _settingsService = settingsService, + _serverService = serverNotifier, + _isolateController = isolateController, + _localIpService = localIpService, + _initialDeviceInfo = initialDeviceInfo, + _supportsDynamicColors = supportsDynamicColors; + + @override + SettingsTabVm init() { + return SettingsTabVm( + advanced: _settingsService.state.advancedSettings, + aliasController: TextEditingController(text: _settingsService.state.alias), + deviceModelController: TextEditingController(text: _initialDeviceInfo.deviceModel), + portController: TextEditingController(text: _settingsService.state.port.toString()), + timeoutController: TextEditingController(text: _settingsService.state.discoveryTimeout.toString()), + multicastController: TextEditingController(text: _settingsService.state.multicastGroup), + settings: _settingsService.state, + serverState: _serverService.state, + deviceInfo: _initialDeviceInfo, + colorModes: _supportsDynamicColors ? ColorMode.values : ColorMode.values.where((e) => e != ColorMode.system).toList(), + autoStart: false, + autoStartLaunchHidden: false, + showInContextMenu: false, + onChangeTheme: (context, theme) async { + await _settingsService.setTheme(theme); + await sleepAsync(500); // workaround: brightness takes some time to be updated + if (context.mounted) { + await updateSystemOverlayStyle(context); + } + }, + onChangeColorMode: (colorMode) async { + await _settingsService.setColorMode(colorMode); + if (colorMode == ColorMode.oled) { + await _settingsService.setTheme(ThemeMode.dark); + await updateSystemOverlayStyleWithBrightness(Brightness.dark); + } + }, + onTapLanguage: (context) async { + await context.push(() => const LanguagePage()); + }, + onToggleAutoStart: (context) async { + final bool success; + if (state.autoStart) { + success = await disableAutoStart(); + } else { + success = await enableAutoStart(startHidden: state.autoStartLaunchHidden); + } + + if (success) { + redux.dispatch(_SetAutoStartAction(!state.autoStart)); + } + }, + onToggleAutoStartLaunchHidden: (context) async { + if (state.autoStart) { + final success = await enableAutoStart(startHidden: !state.autoStartLaunchHidden); + if (success) { + redux.dispatch(_SetAutoStartLaunchHiddenAction(!state.autoStartLaunchHidden)); + } + } + }, + onToggleShowInContextMenu: (context) async { + final bool success; + if (state.showInContextMenu) { + success = await disableContextMenu(); + } else { + success = await enableContextMenu(); + } + if (success) { + redux.dispatch(_SetShowInContextMenuAction(!state.showInContextMenu)); + } + }, + onTapRestartServer: (context) async { + try { + final newServerState = await _serverService.restartServer( + alias: _settingsService.state.alias, + port: _settingsService.state.port, + https: _settingsService.state.https, + ); + + if (newServerState != null) { + // the new state is always valid, so we can "repair" user's setting + state.aliasController.text = newServerState.alias; + state.portController.text = newServerState.port.toString(); + await _settingsService.setAlias(newServerState.alias); + await _settingsService.setPort(newServerState.port); + external(_isolateController).dispatch(IsolateSendMulticastRestartListenerAction()); + external(_localIpService).dispatchAsync(FetchLocalIpAction()); // ignore: unawaited_futures + } + } catch (e) { + // ignore: use_build_context_synchronously + context.showSnackBar(e.toString()); + } + }, + onTapStartServer: (context) async { + try { + await _serverService.startServerFromSettings(); + } catch (e) { + // ignore: use_build_context_synchronously + context.showSnackBar(e.toString()); + } + }, + onTapStopServer: () async => await _serverService.stopServer(), + onTapAdvanced: (advanced) => redux.dispatch(SetAdvancedAction(advanced)), + ); + } + + @override + get initialAction => _SettingsTabInitAction(); + + @override + void dispose() { + state.aliasController.dispose(); + state.deviceModelController.dispose(); + state.portController.dispose(); + state.timeoutController.dispose(); + state.multicastController.dispose(); + super.dispose(); + } +} + +class _SettingsTabInitAction extends AsyncReduxAction { + @override + Future reduce() async { + dispatch(_SettingsTabWatchAction()); + final autoStartEnabled = await isAutoStartEnabled(); + final autoStartHidden = await isAutoStartHidden(); + final showInContextMenu = await isContextMenuEnabled(); + return state.copyWith( + autoStart: autoStartEnabled, + autoStartLaunchHidden: autoStartHidden, + showInContextMenu: showInContextMenu, + ); + } +} + +class _SettingsTabWatchAction extends WatchAction { + @override + SettingsTabVm reduce() { + return state.copyWith( + settings: ref.watch(settingsProvider), + serverState: ref.watch(serverProvider), + deviceInfo: ref.watch(deviceInfoProvider), + ); + } +} + +class SetAdvancedAction extends ReduxAction { + final bool advanced; + + SetAdvancedAction(this.advanced); + + @override + SettingsTabVm reduce() { + return state.copyWith(advanced: advanced); + } +} + +class _SetAutoStartAction extends ReduxAction { + final bool enabled; + + _SetAutoStartAction(this.enabled); + + @override + SettingsTabVm reduce() { + return state.copyWith(autoStart: enabled); + } +} + +class _SetAutoStartLaunchHiddenAction extends ReduxAction { + final bool enabled; + + _SetAutoStartLaunchHiddenAction(this.enabled); + + @override + SettingsTabVm reduce() { + return state.copyWith(autoStartLaunchHidden: enabled); + } +} + +class _SetShowInContextMenuAction extends ReduxAction { + final bool enabled; + + _SetShowInContextMenuAction(this.enabled); + + @override + SettingsTabVm reduce() { + return state.copyWith(showInContextMenu: enabled); + } +} diff --git a/app/lib/pages/tabs/settings_tab_vm.dart b/app/lib/pages/tabs/settings_tab_vm.dart new file mode 100644 index 0000000..6a2e7c0 --- /dev/null +++ b/app/lib/pages/tabs/settings_tab_vm.dart @@ -0,0 +1,63 @@ +import 'package:common/model/device_info_result.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/model/persistence/color_mode.dart'; +import 'package:localsend_app/model/state/server/server_state.dart'; +import 'package:localsend_app/model/state/settings_state.dart'; + +part 'settings_tab_vm.mapper.dart'; + +@MappableClass() +class SettingsTabVm with SettingsTabVmMappable { + final bool advanced; + final TextEditingController aliasController; + final TextEditingController deviceModelController; + final TextEditingController portController; + final TextEditingController timeoutController; + final TextEditingController multicastController; + + final SettingsState settings; + final ServerState? serverState; + final DeviceInfoResult deviceInfo; + final List themeModes = ThemeMode.values; + final List colorModes; + final bool autoStart; + final bool autoStartLaunchHidden; + final bool showInContextMenu; + final void Function(BuildContext context, ThemeMode mode) onChangeTheme; + final void Function(ColorMode mode) onChangeColorMode; + final void Function(BuildContext context) onTapLanguage; + final void Function(BuildContext context) onToggleAutoStart; + final void Function(BuildContext context) onToggleAutoStartLaunchHidden; + final void Function(BuildContext context) onToggleShowInContextMenu; + final void Function(BuildContext context) onTapRestartServer; + final void Function(BuildContext context) onTapStartServer; + final void Function() onTapStopServer; + final void Function(bool advanced) onTapAdvanced; + + SettingsTabVm({ + required this.advanced, + required this.aliasController, + required this.deviceModelController, + required this.portController, + required this.timeoutController, + required this.multicastController, + required this.settings, + required this.serverState, + required this.deviceInfo, + required this.colorModes, + required this.autoStart, + required this.autoStartLaunchHidden, + required this.showInContextMenu, + required this.onChangeTheme, + required this.onChangeColorMode, + required this.onTapLanguage, + required this.onToggleAutoStart, + required this.onToggleAutoStartLaunchHidden, + required this.onToggleShowInContextMenu, + required this.onTapRestartServer, + required this.onTapStartServer, + required this.onTapStopServer, + required this.onTapAdvanced, + }); +} diff --git a/app/lib/pages/tabs/settings_tab_vm.mapper.dart b/app/lib/pages/tabs/settings_tab_vm.mapper.dart new file mode 100644 index 0000000..85576ce --- /dev/null +++ b/app/lib/pages/tabs/settings_tab_vm.mapper.dart @@ -0,0 +1,473 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'settings_tab_vm.dart'; + +class SettingsTabVmMapper extends ClassMapperBase { + SettingsTabVmMapper._(); + + static SettingsTabVmMapper? _instance; + static SettingsTabVmMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = SettingsTabVmMapper._()); + SettingsStateMapper.ensureInitialized(); + ServerStateMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'SettingsTabVm'; + + static bool _$advanced(SettingsTabVm v) => v.advanced; + static const Field _f$advanced = Field( + 'advanced', + _$advanced, + ); + static TextEditingController _$aliasController(SettingsTabVm v) => + v.aliasController; + static const Field _f$aliasController = + Field('aliasController', _$aliasController); + static TextEditingController _$deviceModelController(SettingsTabVm v) => + v.deviceModelController; + static const Field + _f$deviceModelController = Field( + 'deviceModelController', + _$deviceModelController, + ); + static TextEditingController _$portController(SettingsTabVm v) => + v.portController; + static const Field _f$portController = + Field('portController', _$portController); + static TextEditingController _$timeoutController(SettingsTabVm v) => + v.timeoutController; + static const Field + _f$timeoutController = Field('timeoutController', _$timeoutController); + static TextEditingController _$multicastController(SettingsTabVm v) => + v.multicastController; + static const Field + _f$multicastController = Field('multicastController', _$multicastController); + static SettingsState _$settings(SettingsTabVm v) => v.settings; + static const Field _f$settings = Field( + 'settings', + _$settings, + ); + static ServerState? _$serverState(SettingsTabVm v) => v.serverState; + static const Field _f$serverState = Field( + 'serverState', + _$serverState, + ); + static DeviceInfoResult _$deviceInfo(SettingsTabVm v) => v.deviceInfo; + static const Field _f$deviceInfo = Field( + 'deviceInfo', + _$deviceInfo, + ); + static List _$colorModes(SettingsTabVm v) => v.colorModes; + static const Field> _f$colorModes = Field( + 'colorModes', + _$colorModes, + ); + static bool _$autoStart(SettingsTabVm v) => v.autoStart; + static const Field _f$autoStart = Field( + 'autoStart', + _$autoStart, + ); + static bool _$autoStartLaunchHidden(SettingsTabVm v) => + v.autoStartLaunchHidden; + static const Field _f$autoStartLaunchHidden = Field( + 'autoStartLaunchHidden', + _$autoStartLaunchHidden, + ); + static bool _$showInContextMenu(SettingsTabVm v) => v.showInContextMenu; + static const Field _f$showInContextMenu = Field( + 'showInContextMenu', + _$showInContextMenu, + ); + static Function _$onChangeTheme(SettingsTabVm v) => + (v as dynamic).onChangeTheme as Function; + static dynamic _arg$onChangeTheme(f) => + f(); + static const Field _f$onChangeTheme = Field( + 'onChangeTheme', + _$onChangeTheme, + arg: _arg$onChangeTheme, + ); + static Function _$onChangeColorMode(SettingsTabVm v) => + (v as dynamic).onChangeColorMode as Function; + static dynamic _arg$onChangeColorMode(f) => f(); + static const Field _f$onChangeColorMode = Field( + 'onChangeColorMode', + _$onChangeColorMode, + arg: _arg$onChangeColorMode, + ); + static Function _$onTapLanguage(SettingsTabVm v) => + (v as dynamic).onTapLanguage as Function; + static dynamic _arg$onTapLanguage(f) => f(); + static const Field _f$onTapLanguage = Field( + 'onTapLanguage', + _$onTapLanguage, + arg: _arg$onTapLanguage, + ); + static Function _$onToggleAutoStart(SettingsTabVm v) => + (v as dynamic).onToggleAutoStart as Function; + static dynamic _arg$onToggleAutoStart(f) => f(); + static const Field _f$onToggleAutoStart = Field( + 'onToggleAutoStart', + _$onToggleAutoStart, + arg: _arg$onToggleAutoStart, + ); + static Function _$onToggleAutoStartLaunchHidden(SettingsTabVm v) => + (v as dynamic).onToggleAutoStartLaunchHidden as Function; + static dynamic _arg$onToggleAutoStartLaunchHidden(f) => + f(); + static const Field _f$onToggleAutoStartLaunchHidden = + Field( + 'onToggleAutoStartLaunchHidden', + _$onToggleAutoStartLaunchHidden, + arg: _arg$onToggleAutoStartLaunchHidden, + ); + static Function _$onToggleShowInContextMenu(SettingsTabVm v) => + (v as dynamic).onToggleShowInContextMenu as Function; + static dynamic _arg$onToggleShowInContextMenu(f) => + f(); + static const Field _f$onToggleShowInContextMenu = + Field( + 'onToggleShowInContextMenu', + _$onToggleShowInContextMenu, + arg: _arg$onToggleShowInContextMenu, + ); + static Function _$onTapRestartServer(SettingsTabVm v) => + (v as dynamic).onTapRestartServer as Function; + static dynamic _arg$onTapRestartServer(f) => f(); + static const Field _f$onTapRestartServer = Field( + 'onTapRestartServer', + _$onTapRestartServer, + arg: _arg$onTapRestartServer, + ); + static Function _$onTapStartServer(SettingsTabVm v) => + (v as dynamic).onTapStartServer as Function; + static dynamic _arg$onTapStartServer(f) => f(); + static const Field _f$onTapStartServer = Field( + 'onTapStartServer', + _$onTapStartServer, + arg: _arg$onTapStartServer, + ); + static Function _$onTapStopServer(SettingsTabVm v) => + (v as dynamic).onTapStopServer as Function; + static dynamic _arg$onTapStopServer(f) => f(); + static const Field _f$onTapStopServer = Field( + 'onTapStopServer', + _$onTapStopServer, + arg: _arg$onTapStopServer, + ); + static Function _$onTapAdvanced(SettingsTabVm v) => + (v as dynamic).onTapAdvanced as Function; + static dynamic _arg$onTapAdvanced(f) => f(); + static const Field _f$onTapAdvanced = Field( + 'onTapAdvanced', + _$onTapAdvanced, + arg: _arg$onTapAdvanced, + ); + static List _$themeModes(SettingsTabVm v) => v.themeModes; + static const Field> _f$themeModes = Field( + 'themeModes', + _$themeModes, + mode: FieldMode.member, + ); + + @override + final MappableFields fields = const { + #advanced: _f$advanced, + #aliasController: _f$aliasController, + #deviceModelController: _f$deviceModelController, + #portController: _f$portController, + #timeoutController: _f$timeoutController, + #multicastController: _f$multicastController, + #settings: _f$settings, + #serverState: _f$serverState, + #deviceInfo: _f$deviceInfo, + #colorModes: _f$colorModes, + #autoStart: _f$autoStart, + #autoStartLaunchHidden: _f$autoStartLaunchHidden, + #showInContextMenu: _f$showInContextMenu, + #onChangeTheme: _f$onChangeTheme, + #onChangeColorMode: _f$onChangeColorMode, + #onTapLanguage: _f$onTapLanguage, + #onToggleAutoStart: _f$onToggleAutoStart, + #onToggleAutoStartLaunchHidden: _f$onToggleAutoStartLaunchHidden, + #onToggleShowInContextMenu: _f$onToggleShowInContextMenu, + #onTapRestartServer: _f$onTapRestartServer, + #onTapStartServer: _f$onTapStartServer, + #onTapStopServer: _f$onTapStopServer, + #onTapAdvanced: _f$onTapAdvanced, + #themeModes: _f$themeModes, + }; + + static SettingsTabVm _instantiate(DecodingData data) { + return SettingsTabVm( + advanced: data.dec(_f$advanced), + aliasController: data.dec(_f$aliasController), + deviceModelController: data.dec(_f$deviceModelController), + portController: data.dec(_f$portController), + timeoutController: data.dec(_f$timeoutController), + multicastController: data.dec(_f$multicastController), + settings: data.dec(_f$settings), + serverState: data.dec(_f$serverState), + deviceInfo: data.dec(_f$deviceInfo), + colorModes: data.dec(_f$colorModes), + autoStart: data.dec(_f$autoStart), + autoStartLaunchHidden: data.dec(_f$autoStartLaunchHidden), + showInContextMenu: data.dec(_f$showInContextMenu), + onChangeTheme: data.dec(_f$onChangeTheme), + onChangeColorMode: data.dec(_f$onChangeColorMode), + onTapLanguage: data.dec(_f$onTapLanguage), + onToggleAutoStart: data.dec(_f$onToggleAutoStart), + onToggleAutoStartLaunchHidden: data.dec(_f$onToggleAutoStartLaunchHidden), + onToggleShowInContextMenu: data.dec(_f$onToggleShowInContextMenu), + onTapRestartServer: data.dec(_f$onTapRestartServer), + onTapStartServer: data.dec(_f$onTapStartServer), + onTapStopServer: data.dec(_f$onTapStopServer), + onTapAdvanced: data.dec(_f$onTapAdvanced), + ); + } + + @override + final Function instantiate = _instantiate; + + static SettingsTabVm fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static SettingsTabVm deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin SettingsTabVmMappable { + String serialize() { + return SettingsTabVmMapper.ensureInitialized().encodeJson( + this as SettingsTabVm, + ); + } + + Map toJson() { + return SettingsTabVmMapper.ensureInitialized().encodeMap( + this as SettingsTabVm, + ); + } + + SettingsTabVmCopyWith + get copyWith => _SettingsTabVmCopyWithImpl( + this as SettingsTabVm, + $identity, + $identity, + ); + @override + String toString() { + return SettingsTabVmMapper.ensureInitialized().stringifyValue( + this as SettingsTabVm, + ); + } + + @override + bool operator ==(Object other) { + return SettingsTabVmMapper.ensureInitialized().equalsValue( + this as SettingsTabVm, + other, + ); + } + + @override + int get hashCode { + return SettingsTabVmMapper.ensureInitialized().hashValue( + this as SettingsTabVm, + ); + } +} + +extension SettingsTabVmValueCopy<$R, $Out> + on ObjectCopyWith<$R, SettingsTabVm, $Out> { + SettingsTabVmCopyWith<$R, SettingsTabVm, $Out> get $asSettingsTabVm => + $base.as((v, t, t2) => _SettingsTabVmCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class SettingsTabVmCopyWith<$R, $In extends SettingsTabVm, $Out> + implements ClassCopyWith<$R, $In, $Out> { + SettingsStateCopyWith<$R, SettingsState, SettingsState> get settings; + ServerStateCopyWith<$R, ServerState, ServerState>? get serverState; + ListCopyWith<$R, ColorMode, ObjectCopyWith<$R, ColorMode, ColorMode>> + get colorModes; + $R call({ + bool? advanced, + TextEditingController? aliasController, + TextEditingController? deviceModelController, + TextEditingController? portController, + TextEditingController? timeoutController, + TextEditingController? multicastController, + SettingsState? settings, + ServerState? serverState, + DeviceInfoResult? deviceInfo, + List? colorModes, + bool? autoStart, + bool? autoStartLaunchHidden, + bool? showInContextMenu, + void Function(BuildContext, ThemeMode)? onChangeTheme, + void Function(ColorMode)? onChangeColorMode, + void Function(BuildContext)? onTapLanguage, + void Function(BuildContext)? onToggleAutoStart, + void Function(BuildContext)? onToggleAutoStartLaunchHidden, + void Function(BuildContext)? onToggleShowInContextMenu, + void Function(BuildContext)? onTapRestartServer, + void Function(BuildContext)? onTapStartServer, + void Function()? onTapStopServer, + void Function(bool)? onTapAdvanced, + }); + SettingsTabVmCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _SettingsTabVmCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, SettingsTabVm, $Out> + implements SettingsTabVmCopyWith<$R, SettingsTabVm, $Out> { + _SettingsTabVmCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + SettingsTabVmMapper.ensureInitialized(); + @override + SettingsStateCopyWith<$R, SettingsState, SettingsState> get settings => + $value.settings.copyWith.$chain((v) => call(settings: v)); + @override + ServerStateCopyWith<$R, ServerState, ServerState>? get serverState => + $value.serverState?.copyWith.$chain((v) => call(serverState: v)); + @override + ListCopyWith<$R, ColorMode, ObjectCopyWith<$R, ColorMode, ColorMode>> + get colorModes => ListCopyWith( + $value.colorModes, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(colorModes: v), + ); + @override + $R call({ + bool? advanced, + TextEditingController? aliasController, + TextEditingController? deviceModelController, + TextEditingController? portController, + TextEditingController? timeoutController, + TextEditingController? multicastController, + SettingsState? settings, + Object? serverState = $none, + DeviceInfoResult? deviceInfo, + List? colorModes, + bool? autoStart, + bool? autoStartLaunchHidden, + bool? showInContextMenu, + void Function(BuildContext, ThemeMode)? onChangeTheme, + void Function(ColorMode)? onChangeColorMode, + void Function(BuildContext)? onTapLanguage, + void Function(BuildContext)? onToggleAutoStart, + void Function(BuildContext)? onToggleAutoStartLaunchHidden, + void Function(BuildContext)? onToggleShowInContextMenu, + void Function(BuildContext)? onTapRestartServer, + void Function(BuildContext)? onTapStartServer, + void Function()? onTapStopServer, + void Function(bool)? onTapAdvanced, + }) => $apply( + FieldCopyWithData({ + if (advanced != null) #advanced: advanced, + if (aliasController != null) #aliasController: aliasController, + if (deviceModelController != null) + #deviceModelController: deviceModelController, + if (portController != null) #portController: portController, + if (timeoutController != null) #timeoutController: timeoutController, + if (multicastController != null) + #multicastController: multicastController, + if (settings != null) #settings: settings, + if (serverState != $none) #serverState: serverState, + if (deviceInfo != null) #deviceInfo: deviceInfo, + if (colorModes != null) #colorModes: colorModes, + if (autoStart != null) #autoStart: autoStart, + if (autoStartLaunchHidden != null) + #autoStartLaunchHidden: autoStartLaunchHidden, + if (showInContextMenu != null) #showInContextMenu: showInContextMenu, + if (onChangeTheme != null) #onChangeTheme: onChangeTheme, + if (onChangeColorMode != null) #onChangeColorMode: onChangeColorMode, + if (onTapLanguage != null) #onTapLanguage: onTapLanguage, + if (onToggleAutoStart != null) #onToggleAutoStart: onToggleAutoStart, + if (onToggleAutoStartLaunchHidden != null) + #onToggleAutoStartLaunchHidden: onToggleAutoStartLaunchHidden, + if (onToggleShowInContextMenu != null) + #onToggleShowInContextMenu: onToggleShowInContextMenu, + if (onTapRestartServer != null) #onTapRestartServer: onTapRestartServer, + if (onTapStartServer != null) #onTapStartServer: onTapStartServer, + if (onTapStopServer != null) #onTapStopServer: onTapStopServer, + if (onTapAdvanced != null) #onTapAdvanced: onTapAdvanced, + }), + ); + @override + SettingsTabVm $make(CopyWithData data) => SettingsTabVm( + advanced: data.get(#advanced, or: $value.advanced), + aliasController: data.get(#aliasController, or: $value.aliasController), + deviceModelController: data.get( + #deviceModelController, + or: $value.deviceModelController, + ), + portController: data.get(#portController, or: $value.portController), + timeoutController: data.get( + #timeoutController, + or: $value.timeoutController, + ), + multicastController: data.get( + #multicastController, + or: $value.multicastController, + ), + settings: data.get(#settings, or: $value.settings), + serverState: data.get(#serverState, or: $value.serverState), + deviceInfo: data.get(#deviceInfo, or: $value.deviceInfo), + colorModes: data.get(#colorModes, or: $value.colorModes), + autoStart: data.get(#autoStart, or: $value.autoStart), + autoStartLaunchHidden: data.get( + #autoStartLaunchHidden, + or: $value.autoStartLaunchHidden, + ), + showInContextMenu: data.get( + #showInContextMenu, + or: $value.showInContextMenu, + ), + onChangeTheme: data.get(#onChangeTheme, or: $value.onChangeTheme), + onChangeColorMode: data.get( + #onChangeColorMode, + or: $value.onChangeColorMode, + ), + onTapLanguage: data.get(#onTapLanguage, or: $value.onTapLanguage), + onToggleAutoStart: data.get( + #onToggleAutoStart, + or: $value.onToggleAutoStart, + ), + onToggleAutoStartLaunchHidden: data.get( + #onToggleAutoStartLaunchHidden, + or: $value.onToggleAutoStartLaunchHidden, + ), + onToggleShowInContextMenu: data.get( + #onToggleShowInContextMenu, + or: $value.onToggleShowInContextMenu, + ), + onTapRestartServer: data.get( + #onTapRestartServer, + or: $value.onTapRestartServer, + ), + onTapStartServer: data.get(#onTapStartServer, or: $value.onTapStartServer), + onTapStopServer: data.get(#onTapStopServer, or: $value.onTapStopServer), + onTapAdvanced: data.get(#onTapAdvanced, or: $value.onTapAdvanced), + ); + + @override + SettingsTabVmCopyWith<$R2, SettingsTabVm, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _SettingsTabVmCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/pages/troubleshoot_page.dart b/app/lib/pages/troubleshoot_page.dart new file mode 100644 index 0000000..293dcbc --- /dev/null +++ b/app/lib/pages/troubleshoot_page.dart @@ -0,0 +1,227 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/native/cmd_helper.dart'; +import 'package:localsend_app/util/native/macos_channel.dart' as macos_channel; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/custom_icon_button.dart'; +import 'package:localsend_app/widget/dialogs/not_available_on_platform_dialog.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +class TroubleshootPage extends StatelessWidget { + const TroubleshootPage(); + + @override + Widget build(BuildContext context) { + final settings = context.ref.watch(settingsProvider); + return Scaffold( + appBar: basicLocalSendAppbar(t.troubleshootPage.title), + body: ResponsiveListView( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 30), + children: [ + Text(t.troubleshootPage.subTitle, textAlign: TextAlign.center), + const SizedBox(height: 5), + _TroubleshootItem( + symptomText: t.troubleshootPage.firewall.symptom, + solutionText: t.troubleshootPage.firewall.solution(port: settings.port), + primaryButton: _FixButton( + label: t.troubleshootPage.fixButton, + onTapMap: { + TargetPlatform.windows: _CommandFixAction( + adminPrivileges: true, + commands: [ + 'netsh advfirewall firewall add rule name="LocalSend" dir=in action=allow protocol=TCP localport=${settings.port}', + 'netsh advfirewall firewall add rule name="LocalSend" dir=in action=allow protocol=UDP localport=${settings.port}', + ], + ), + }, + ), + secondaryButton: _FixButton( + label: t.troubleshootPage.firewall.openFirewall, + onTapMap: { + TargetPlatform.windows: _CommandFixAction( + adminPrivileges: false, + commands: ['wf'], + ), + TargetPlatform.macOS: _NativeFixAction(() => macos_channel.openFirewallSettings()), + }, + ), + ), + _TroubleshootItem( + symptomText: t.troubleshootPage.noDiscovery.symptom, + solutionText: t.troubleshootPage.noDiscovery.solution, + ), + _TroubleshootItem( + symptomText: t.troubleshootPage.noConnection.symptom, + solutionText: t.troubleshootPage.noConnection.solution, + ), + ], + ), + ); + } +} + +class _TroubleshootItem extends StatefulWidget { + final String symptomText; + final String solutionText; + final _FixButton? primaryButton; + final _FixButton? secondaryButton; + + const _TroubleshootItem({ + required this.symptomText, + required this.solutionText, + this.primaryButton, + this.secondaryButton, + }); + + @override + State<_TroubleshootItem> createState() => _TroubleshootItemState(); +} + +class _TroubleshootItemState extends State<_TroubleshootItem> { + bool _showCommands = false; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 15), + child: Card( + child: Padding( + padding: const EdgeInsets.all(15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(widget.symptomText, style: Theme.of(context).textTheme.titleMedium), + const SizedBox(height: 10), + Text(t.troubleshootPage.solution), + Text(widget.solutionText), + if (widget.primaryButton != null) ...[ + const SizedBox(height: 10), + Wrap( + runSpacing: 10, + children: [ + widget.primaryButton!, + if (widget.secondaryButton != null) ...[ + const SizedBox(width: 10), + widget.secondaryButton!, + ], + if (widget.primaryButton!.onTap?.commands != null) ...[ + const SizedBox(width: 10), + CustomIconButton( + onPressed: () { + setState(() => _showCommands = !_showCommands); + }, + child: const Icon(Icons.info), + ), + ], + ], + ), + AnimatedCrossFade( + crossFadeState: _showCommands ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: const Duration(milliseconds: 200), + firstChild: Container(), + secondChild: SelectionArea( + child: Column( + children: [ + ...?widget.primaryButton?.onTap?.commands?.map((cmd) { + return Padding( + padding: const EdgeInsets.only(top: 10), + child: Text(cmd, style: const TextStyle(fontFamily: 'RobotoMono')), + ); + }), + ], + ), + ), + ), + ], + ], + ), + ), + ), + ); + } +} + +class _FixButton extends StatelessWidget { + final String label; + final Map onTapMap; + final _FixAction? onTap; + + _FixButton({ + required this.label, + required this.onTapMap, + }) : onTap = onTapMap[defaultTargetPlatform]; + + @override + Widget build(BuildContext context) { + return ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of(context).colorScheme.onPrimary, + ), + onPressed: () async { + if (onTap != null) { + onTap!.runFix(); + } else { + await showDialog( + context: context, + builder: (_) => NotAvailableOnPlatformDialog(platforms: onTapMap.keys.toList()), + ); + } + }, + child: Text(label), + ); + } +} + +abstract class _FixAction { + void runFix(); + + List? get commands; +} + +class _CommandFixAction extends _FixAction { + final bool adminPrivileges; + + @override + final List commands; + + _CommandFixAction({ + required this.adminPrivileges, + required this.commands, + }); + + @override + void runFix() async { + if (adminPrivileges) { + if (checkPlatform([TargetPlatform.windows])) { + await runWindowsCommandAsAdmin(commands); + } else { + throw 'Admin privileges are only implemented on Windows.'; + } + } else { + for (final c in commands) { + await Process.run(c, [], runInShell: true); + } + } + } +} + +class _NativeFixAction extends _FixAction { + final Future Function() action; + + _NativeFixAction(this.action); + + @override + List? get commands => null; + + @override + void runFix() async { + await action(); + } +} diff --git a/app/lib/pages/web_send_page.dart b/app/lib/pages/web_send_page.dart new file mode 100644 index 0000000..ca6ed18 --- /dev/null +++ b/app/lib/pages/web_send_page.dart @@ -0,0 +1,361 @@ +import 'package:common/util/sleep.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/cross_file.dart'; +import 'package:localsend_app/provider/local_ip_provider.dart'; +import 'package:localsend_app/provider/network/server/server_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/util/ui/snackbar.dart'; +import 'package:localsend_app/widget/custom_basic_appbar.dart'; +import 'package:localsend_app/widget/dialogs/pin_dialog.dart'; +import 'package:localsend_app/widget/dialogs/qr_dialog.dart'; +import 'package:localsend_app/widget/dialogs/zoom_dialog.dart'; +import 'package:localsend_app/widget/responsive_list_view.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +enum _ServerState { initializing, running, error, stopping } + +class WebSendPage extends StatefulWidget { + final List files; + + const WebSendPage(this.files); + + @override + State createState() => _WebSendPageState(); +} + +class _WebSendPageState extends State with Refena { + _ServerState _stateEnum = _ServerState.initializing; + bool _encrypted = false; + String? _initializedError; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _init(encrypted: false); + }); + } + + void _init({required bool encrypted}) async { + final settings = ref.read(settingsProvider); + final (beforeAutoAccept, beforePin) = ref.read(serverProvider.select((state) => (state?.webSendState?.autoAccept, state?.webSendState?.pin))); + setState(() { + _stateEnum = _ServerState.initializing; + _encrypted = encrypted; + _initializedError = null; + }); + await sleepAsync(500); + try { + await ref + .notifier(serverProvider) + .restartServer( + alias: settings.alias, + port: settings.port, + https: _encrypted, + ); + await ref.notifier(serverProvider).initializeWebSend(widget.files); + if (beforeAutoAccept != null) { + ref.notifier(serverProvider).setWebSendAutoAccept(beforeAutoAccept); + } + ref.notifier(serverProvider).setWebSendPin(beforePin); + setState(() { + _stateEnum = _ServerState.running; + }); + } catch (e) { + if (context.mounted) { + setState(() { + _stateEnum = _ServerState.error; + _initializedError = e.toString(); + }); + } + } + } + + /// Web share uses unencrypted http, so we need to revert to the previous state. + Future _revertServerState() async { + await ref.notifier(serverProvider).restartServerFromSettings(); + } + + @override + Widget build(BuildContext context) { + return PopScope( + onPopInvokedWithResult: (_, _) async { + if (_stateEnum != _ServerState.running) { + return; + } + + setState(() { + _stateEnum = _ServerState.stopping; + }); + await sleepAsync(250); + await _revertServerState(); + await sleepAsync(250); + + if (context.mounted) { + context.pop(); + } + }, + canPop: false, + child: Scaffold( + appBar: basicLocalSendAppbar(t.webSharePage.title), + body: Builder( + builder: (context) { + if (_stateEnum != _ServerState.running) { + return Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (_stateEnum == _ServerState.initializing || _stateEnum == _ServerState.stopping) ...[ + const CircularProgressIndicator(), + const SizedBox(height: 20), + Center( + child: Text( + _stateEnum == _ServerState.initializing ? t.webSharePage.loading : t.webSharePage.stopping, + style: Theme.of(context).textTheme.titleLarge, + ), + ), + ] else if (_initializedError != null) ...[ + const Icon(Icons.error_outline, size: 48, color: Colors.red), + const SizedBox(height: 10), + Center( + child: Text(t.webSharePage.error, style: Theme.of(context).textTheme.titleLarge), + ), + const SizedBox(height: 10), + Center( + child: SelectableText(_initializedError!, style: Theme.of(context).textTheme.bodyMedium), + ), + ], + ], + ); + } + + final serverState = context.watch(serverProvider)!; + final webSendState = serverState.webSendState!; + final networkState = context.watch(localIpProvider); + + return ResponsiveListView( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 20), + children: [ + Text(t.webSharePage.openLink(n: networkState.localIps.length), style: Theme.of(context).textTheme.titleMedium), + const SizedBox(height: 10), + Card( + color: Theme.of(context).colorScheme.secondaryContainer, + child: Padding( + padding: const EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ...networkState.localIps.map((ip) { + final url = '${_encrypted ? 'https' : 'http'}://$ip:${serverState.port}'; + final urlWithPin = switch (webSendState.pin) { + String() => '$url/?pin=${Uri.encodeQueryComponent(webSendState.pin!)}', + null => url, + }; + return Padding( + padding: const EdgeInsets.all(5), + child: Row( + children: [ + SelectableText( + url, + style: Theme.of(context).textTheme.bodyMedium, + ), + const SizedBox(width: 5), + InkWell( + onTap: () async { + await Clipboard.setData(ClipboardData(text: url)); + if (context.mounted && checkPlatformIsDesktop()) { + context.showSnackBar(t.general.copiedToClipboard); + } + }, + child: const Padding( + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 2), + child: Icon(Icons.content_copy, size: 16), + ), + ), + InkWell( + onTap: () async { + await showDialog( + context: context, + builder: (_) => QrDialog( + data: urlWithPin, + label: url, + listenIncomingWebSendRequests: true, + pin: webSendState.pin, + ), + ); + }, + child: const Padding( + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 2), + child: Icon(Icons.qr_code, size: 16), + ), + ), + InkWell( + onTap: () async { + await showDialog( + context: context, + builder: (_) => ZoomDialog( + label: url, + pin: webSendState.pin, + listenIncomingWebSendRequests: true, + ), + ); + }, + child: const Padding( + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 2), + child: Icon(Icons.tv, size: 16), + ), + ), + ], + ), + ); + }), + ], + ), + ), + ), + const SizedBox(height: 20), + Text(t.webSharePage.requests, style: Theme.of(context).textTheme.titleMedium), + const SizedBox(height: 10), + if (webSendState.sessions.isEmpty) + Padding( + padding: const EdgeInsets.only(bottom: 30), + child: Text(t.webSharePage.noRequests), + ), + ...webSendState.sessions.entries.map((entry) { + final session = entry.value; + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Card( + child: Padding( + padding: const EdgeInsets.all(10), + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + session.deviceInfo, + style: Theme.of(context).textTheme.bodyLarge!.copyWith( + color: session.responseHandler != null ? Theme.of(context).colorScheme.warning : null, + ), + ), + const SizedBox(height: 5), + Text(session.ip, style: Theme.of(context).textTheme.bodyMedium!.copyWith(color: Colors.grey)), + ], + ), + ), + if (session.responseHandler != null) ...[ + TextButton( + onPressed: () { + ref.notifier(serverProvider).declineWebSendRequest(session.sessionId); + }, + style: TextButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onSurface, + ), + child: const Icon(Icons.close), + ), + TextButton( + onPressed: () { + ref.notifier(serverProvider).acceptWebSendRequest(session.sessionId); + }, + style: TextButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onSurface, + ), + child: const Icon(Icons.check_circle), + ), + ] else + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Text( + t.general.accepted, + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: Theme.of(context).colorScheme.onSecondaryContainer, + ), + ), + ), + ], + ), + ), + ), + ); + }), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text(t.webSharePage.encryption, style: Theme.of(context).textTheme.titleMedium), + const SizedBox(width: 10), + Checkbox( + value: _encrypted, + onChanged: (value) { + _init(encrypted: value == true); + }, + ), + ], + ), + if (_encrypted) + Text( + t.webSharePage.encryptionHint, + style: Theme.of(context).textTheme.bodyMedium!.copyWith(color: Theme.of(context).colorScheme.warning), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text(t.webSharePage.autoAccept, style: Theme.of(context).textTheme.titleMedium), + const SizedBox(width: 10), + Checkbox( + value: webSendState.autoAccept, + onChanged: (value) { + ref.notifier(serverProvider).setWebSendAutoAccept(value == true); + }, + ), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text(t.webSharePage.requirePin, style: Theme.of(context).textTheme.titleMedium), + const SizedBox(width: 10), + Checkbox( + value: webSendState.pin != null, + onChanged: (value) async { + final currentPIN = webSendState.pin; + if (currentPIN != null) { + ref.notifier(serverProvider).setWebSendPin(null); + } else { + final String? newPin = await showDialog( + context: context, + builder: (_) => const PinDialog( + obscureText: false, + generateRandom: true, + ), + ); + + if (newPin != null && newPin.isNotEmpty) { + ref.notifier(serverProvider).setWebSendPin(newPin); + } + } + }, + ), + ], + ), + if (webSendState.pin != null) ...[ + Text( + t.webSharePage.pinHint(pin: webSendState.pin!), + style: Theme.of(context).textTheme.bodyMedium!.copyWith(color: Theme.of(context).colorScheme.warning), + ), + ], + ], + ); + }, + ), + ), + ); + } +} diff --git a/app/lib/provider/animation_provider.dart b/app/lib/provider/animation_provider.dart new file mode 100644 index 0000000..7cf00b8 --- /dev/null +++ b/app/lib/provider/animation_provider.dart @@ -0,0 +1,36 @@ +import 'package:flutter/scheduler.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +/// If true, then animations are disabled. +/// Used when the app is in the background. +final sleepProvider = StateProvider((ref) { + return false; +}, debugLabel: 'sleepProvider'); + +/// If false, then animations are disabled. +final animationProvider = ViewProvider((ref) { + final sleeping = ref.watch(sleepProvider); + final enableAnimations = ref.watch(settingsProvider.select((s) => s.enableAnimations)); + final animations = enableAnimations && !sleeping; + + timeDilation = animations ? 1.0 : 0.00001; + if (animations) { + setDefaultRouteTransition(); + } else { + Routerino.transition = RouterinoTransition.noTransition; + } + + return animations; +}, debugLabel: 'animationProvider'); + +void setDefaultRouteTransition() { + // use the "slide" transition for desktop + if (checkPlatformIsDesktop()) { + Routerino.transition = RouterinoTransition.cupertino; + } else { + Routerino.transition = RouterinoTransition.material; + } +} diff --git a/app/lib/provider/apk_provider.dart b/app/lib/provider/apk_provider.dart new file mode 100644 index 0000000..efd4466 --- /dev/null +++ b/app/lib/provider/apk_provider.dart @@ -0,0 +1,55 @@ +import 'dart:io'; + +import 'package:device_apps/device_apps.dart'; +import 'package:localsend_app/provider/param/apk_provider_param.dart'; +import 'package:localsend_app/provider/param/cached_apk_provider_param.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +final apkSearchParamProvider = StateProvider( + (ref) => ApkProviderParam( + query: '', + includeSystemApps: false, + onlyAppsWithLaunchIntent: true, + selectMultipleApps: false, + ), +); + +final apkProvider = ViewProvider>>((ref) { + final param = ref.watch(apkSearchParamProvider); + + return ref + .watch( + _apkProvider( + CachedApkProviderParam( + includeSystemApps: param.includeSystemApps, + onlyAppsWithLaunchIntent: param.onlyAppsWithLaunchIntent, + selectMultipleApps: param.selectMultipleApps, + ), + ), + ) + .maybeWhen( + data: (apps) { + final query = param.query.trim().toLowerCase(); + if (query.isNotEmpty) { + apps = apps.where((a) => a.appName.toLowerCase().contains(query) || a.packageName.contains(query)).toList(); + } + + apps.sort((a, b) => a.appName.compareTo(b.appName)); + return AsyncValue>.data(apps); + }, + orElse: () => const AsyncValue>.loading(), + ); +}); + +final apkSizeProvider = FutureFamilyProvider((_, path) { + return File(path).length(); +}); + +/// Provides a list of APKs which is cached +final _apkProvider = FutureFamilyProvider, CachedApkProviderParam>((_, param) { + return DeviceApps.getInstalledApplications( + includeSystemApps: param.includeSystemApps, + onlyAppsWithLaunchIntent: param.onlyAppsWithLaunchIntent, + includeAppIcons: true, + ); +}); diff --git a/app/lib/provider/app_arguments_provider.dart b/app/lib/provider/app_arguments_provider.dart new file mode 100644 index 0000000..706b8f0 --- /dev/null +++ b/app/lib/provider/app_arguments_provider.dart @@ -0,0 +1,7 @@ +import 'package:refena_flutter/refena_flutter.dart'; + +/// Contains the arguments with which the app was started. +final appArgumentsProvider = Provider( + (ref) => [], + debugLabel: 'appArgumentsProvider', +); diff --git a/app/lib/provider/device_info_provider.dart b/app/lib/provider/device_info_provider.dart new file mode 100644 index 0000000..a5e0f13 --- /dev/null +++ b/app/lib/provider/device_info_provider.dart @@ -0,0 +1,50 @@ +import 'package:collection/collection.dart'; +import 'package:common/constants.dart'; +import 'package:common/isolate.dart'; +import 'package:common/model/device.dart'; +import 'package:common/model/device_info_result.dart'; +import 'package:localsend_app/provider/local_ip_provider.dart'; +import 'package:localsend_app/provider/network/server/server_provider.dart'; +import 'package:localsend_app/provider/security_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +final deviceRawInfoProvider = Provider((ref) { + throw Exception('deviceRawInfoProvider not initialized'); +}); + +final deviceInfoProvider = ViewProvider( + (ref) { + final (deviceType, deviceModel) = ref.watch(settingsProvider.select((state) => (state.deviceType, state.deviceModel))); + final rawInfo = ref.watch(deviceRawInfoProvider); + + return DeviceInfoResult( + deviceType: deviceType ?? rawInfo.deviceType, + deviceModel: deviceModel ?? rawInfo.deviceModel, + androidSdkInt: rawInfo.androidSdkInt, + ); + }, + onChanged: (_, next, ref) { + ref.redux(parentIsolateProvider).dispatch(IsolateSyncDeviceInfoAction(deviceInfo: next)); + }, +); + +final deviceFullInfoProvider = ViewProvider((ref) { + final networkInfo = ref.watch(localIpProvider); + final serverState = ref.watch(serverProvider); + final rawInfo = ref.watch(deviceInfoProvider); + final securityContext = ref.read(securityProvider); + return Device( + signalingId: null, + ip: networkInfo.localIps.firstOrNull ?? '-', + version: protocolVersion, + port: serverState?.port ?? -1, + alias: serverState?.alias ?? '-', + https: serverState?.https ?? true, + fingerprint: securityContext.certificateHash, + deviceModel: rawInfo.deviceModel, + deviceType: rawInfo.deviceType, + download: serverState?.webSendState != null, + discoveryMethods: const {}, + ); +}); diff --git a/app/lib/provider/favorites_provider.dart b/app/lib/provider/favorites_provider.dart new file mode 100644 index 0000000..18d87d1 --- /dev/null +++ b/app/lib/provider/favorites_provider.dart @@ -0,0 +1,84 @@ +import 'package:localsend_app/model/persistence/favorite_device.dart'; +import 'package:localsend_app/provider/persistence_provider.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +/// This provider stores the list of favorite devices. +/// It automatically saves the list to the device's storage. +final favoritesProvider = ReduxProvider>((ref) { + return FavoritesService(ref.read(persistenceProvider)); +}); + +class FavoritesService extends ReduxNotifier> { + final PersistenceService _persistence; + + FavoritesService(this._persistence); + + @override + List init() => _persistence.getFavorites(); +} + +/// Adds a favorite device. +class AddFavoriteAction extends AsyncReduxAction> { + final FavoriteDevice device; + + AddFavoriteAction(this.device); + + @override + Future> reduce() async { + final updated = List.unmodifiable([ + ...state, + device, + ]); + await notifier._persistence.setFavorites(updated); + return updated; + } +} + +/// Updates a favorite device. +class UpdateFavoriteAction extends AsyncReduxAction> { + final FavoriteDevice device; + + UpdateFavoriteAction(this.device); + + @override + Future> reduce() async { + final index = state.indexWhere((e) => e.id == device.id); + if (index == -1) { + // Unknown device + await Future.microtask(() {}); + return state; + } + final updated = List.unmodifiable( + [ + ...state, + ]..replaceRange(index, index + 1, [device]), + ); + await notifier._persistence.setFavorites(updated); + return updated; + } +} + +/// Removes a favorite device. +class RemoveFavoriteAction extends AsyncReduxAction> { + final String deviceFingerprint; + + RemoveFavoriteAction({ + required this.deviceFingerprint, + }); + + @override + Future> reduce() async { + final index = state.indexWhere((e) => e.fingerprint == deviceFingerprint); + if (index == -1) { + // Unknown device + return state; + } + final updated = List.unmodifiable( + [ + ...state, + ]..removeAt(index), + ); + await notifier._persistence.setFavorites(updated); + return updated; + } +} diff --git a/app/lib/provider/http_provider.dart b/app/lib/provider/http_provider.dart new file mode 100644 index 0000000..4aefef0 --- /dev/null +++ b/app/lib/provider/http_provider.dart @@ -0,0 +1,19 @@ +import 'package:localsend_app/provider/security_provider.dart'; +import 'package:localsend_app/rust/api/http.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +class HttpClientCollection { + final RsHttpClient v2; + + HttpClientCollection({ + required this.v2, + }); +} + +/// Provides an HTTP client for each protocol version. +final httpProvider = ViewProvider((ref) { + final securityContext = ref.watch(securityProvider); + return HttpClientCollection( + v2: createClient(privateKey: securityContext.privateKey, cert: securityContext.certificate, version: LsHttpClientVersion.v2), + ); +}); diff --git a/app/lib/provider/last_devices.provider.dart b/app/lib/provider/last_devices.provider.dart new file mode 100644 index 0000000..dc2c562 --- /dev/null +++ b/app/lib/provider/last_devices.provider.dart @@ -0,0 +1,29 @@ +import 'package:common/model/device.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +/// This provider stores the last devices that the user sent a file to. +/// It stores only the last 5 devices that were selected by be [AddressInputDialog]. +/// The information is **not** persisted. +final lastDevicesProvider = ReduxProvider>((ref) { + return LastDevicesService(); +}); + +class LastDevicesService extends ReduxNotifier> { + @override + List init() => []; +} + +/// Adds a device to the list of last devices. +class AddLastDeviceAction extends ReduxAction> { + final Device device; + + AddLastDeviceAction(this.device); + + @override + List reduce() { + return { + device, + ...state, + }.take(5).toList(); + } +} diff --git a/app/lib/provider/local_ip_provider.dart b/app/lib/provider/local_ip_provider.dart new file mode 100644 index 0000000..b371f90 --- /dev/null +++ b/app/lib/provider/local_ip_provider.dart @@ -0,0 +1,137 @@ +import 'dart:async'; + +import 'package:collection/collection.dart'; +import 'package:common/util/network_interfaces.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:localsend_app/model/state/network_state.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:logging/logging.dart'; +import 'package:network_info_plus/network_info_plus.dart' as plugin; +import 'package:refena_flutter/refena_flutter.dart'; + +final _logger = Logger('NetworkInfo'); + +final localIpProvider = ReduxProvider((ref) { + return LocalIpService( + ref.notifier(settingsProvider), + ); +}); + +StreamSubscription? _subscription; + +class LocalIpService extends ReduxNotifier { + final SettingsService _settingsService; + + LocalIpService(this._settingsService); + + @override + NetworkState init() { + return const NetworkState( + localIps: [], + initialized: false, + ); + } + + @override + get initialAction => InitLocalIpAction(); +} + +/// Fetches the local IP address and registers a listener to update the IP address +class InitLocalIpAction extends ReduxAction { + @override + NetworkState reduce() { + if (!kIsWeb) { + // ignore: discarded_futures + _subscription?.cancel(); + + if (checkPlatform([TargetPlatform.windows])) { + // https://github.com/localsend/localsend/issues/12 + // https://github.com/localsend/localsend/issues/78 + } else { + _subscription = Connectivity().onConnectivityChanged.listen((_) async { + await dispatchAsync(FetchLocalIpAction()); + }); + } + } + + return state; + } + + @override + void after() { + // ignore: discarded_futures + dispatchAsync(FetchLocalIpAction()); + } +} + +class FetchLocalIpAction extends AsyncReduxAction { + @override + Future reduce() async { + return NetworkState( + localIps: await _getIp( + whitelist: notifier._settingsService.state.networkWhitelist, + blacklist: notifier._settingsService.state.networkBlacklist, + ), + initialized: true, + ); + } +} + +Future> _getIp({ + required List? whitelist, + required List? blacklist, +}) async { + final info = plugin.NetworkInfo(); + String? ip; + try { + ip = await info.getWifiIP(); + } catch (e) { + _logger.warning('Failed to get wifi IP', e); + } + + final nativeResult = + (await getNetworkInterfaces( + whitelist: whitelist, + blacklist: blacklist, + )) + .map((interface) => interface.addresses.map((a) => a.address).toList()) + .expand((ip) => ip) + .where((ip) => !ip.contains(':')) // ignore IPv6 for now + .toList(); + + final addresses = rankIpAddresses(nativeResult, ip); + _logger.info('Network state: $addresses'); + return addresses; +} + +List rankIpAddresses(List nativeResult, String? thirdPartyResult) { + if (thirdPartyResult == null) { + // only take the list + return nativeResult._rankIpAddresses(null); + } else if (nativeResult.isEmpty) { + // only take the first IP from third party library + return [thirdPartyResult]; + } else if (thirdPartyResult.endsWith('.1')) { + // merge + return {thirdPartyResult, ...nativeResult}.toList()._rankIpAddresses(null); + } else { + // merge but prefer result from third party library + return {thirdPartyResult, ...nativeResult}.toList()._rankIpAddresses(thirdPartyResult); + } +} + +/// Sorts Ip addresses with first being the most likely primary local address +/// Currently, +/// - sorts ending with ".1" last +/// - primary is always first +extension ListIpExt on List { + List _rankIpAddresses(String? primary) { + return sorted((a, b) { + int scoreA = a == primary ? 10 : (a.endsWith('.1') ? 0 : 1); + int scoreB = b == primary ? 10 : (b.endsWith('.1') ? 0 : 1); + return scoreB.compareTo(scoreA); + }); + } +} diff --git a/app/lib/provider/logging/discovery_logs_provider.dart b/app/lib/provider/logging/discovery_logs_provider.dart new file mode 100644 index 0000000..828964d --- /dev/null +++ b/app/lib/provider/logging/discovery_logs_provider.dart @@ -0,0 +1,31 @@ +import 'package:localsend_app/model/log_entry.dart'; +import 'package:logging/logging.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +final _logger = Logger('Discovery'); + +/// Contains the discovery logs for debugging purposes. +final discoveryLoggerProvider = NotifierProvider>((ref) { + return DiscoveryLogger(); +}); + +class DiscoveryLogger extends Notifier> { + DiscoveryLogger(); + + @override + List init() { + return []; + } + + void addLog(String log) { + _logger.info(log); + state = [ + ...state, + LogEntry(timestamp: DateTime.now(), log: log), + ].take(200).toList(); + } + + void clear() { + state = []; + } +} diff --git a/app/lib/provider/logging/http_logs_provider.dart b/app/lib/provider/logging/http_logs_provider.dart new file mode 100644 index 0000000..debacf4 --- /dev/null +++ b/app/lib/provider/logging/http_logs_provider.dart @@ -0,0 +1,32 @@ +import 'package:localsend_app/model/log_entry.dart'; +import 'package:logging/logging.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +final _logger = Logger('HTTP'); + +/// Contains the discovery logs for debugging purposes. +final httpLogsProvider = NotifierProvider>((ref) { + return HttpLogsService(); +}); + +class HttpLogsService extends Notifier> { + @override + List init() { + return []; + } + + void addLog(String log) { + _logger.info(log); + state = [ + ...state, + LogEntry(timestamp: DateTime.now(), log: log), + ].take(200).toList(); + } + + void clear() { + state = []; + } + + @override + String describeState(List state) => '${state.length} logs'; +} diff --git a/app/lib/provider/network/nearby_devices_provider.dart b/app/lib/provider/network/nearby_devices_provider.dart new file mode 100644 index 0000000..8aaa47f --- /dev/null +++ b/app/lib/provider/network/nearby_devices_provider.dart @@ -0,0 +1,246 @@ +import 'dart:async'; + +import 'package:collection/collection.dart'; +import 'package:common/isolate.dart'; +import 'package:common/model/device.dart'; +import 'package:localsend_app/model/persistence/favorite_device.dart'; +import 'package:localsend_app/model/state/nearby_devices_state.dart'; +import 'package:localsend_app/provider/favorites_provider.dart'; +import 'package:localsend_app/provider/logging/discovery_logs_provider.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +/// This provider is responsible for: +/// - Scanning the network for other LocalSend instances +/// - Keeping track of all found devices (they are only stored in RAM) +/// +/// Use [scanProvider] to have a high-level API to perform discovery operations. +final nearbyDevicesProvider = ReduxProvider((ref) { + return NearbyDevicesService( + isolateController: ref.notifier(parentIsolateProvider), + favoriteService: ref.notifier(favoritesProvider), + discoveryLogs: ref.notifier(discoveryLoggerProvider), + ); +}); + +class NearbyDevicesService extends ReduxNotifier { + final IsolateController _isolateController; + final FavoritesService _favoriteService; + final DiscoveryLogger _discoveryLogger; + + NearbyDevicesService({ + required IsolateController isolateController, + required FavoritesService favoriteService, + required DiscoveryLogger discoveryLogs, + }) : _discoveryLogger = discoveryLogs, + _isolateController = isolateController, + _favoriteService = favoriteService; + + @override + NearbyDevicesState init() => const NearbyDevicesState( + runningFavoriteScan: false, + runningIps: {}, + devices: {}, + signalingDevices: {}, + ); +} + +/// Binds the UDP port and listens for incoming announcements. +/// This should run forever as long as the app is running. +class StartMulticastListener extends AsyncReduxAction { + @override + Future reduce() async { + await for (final device in notifier._isolateController.state.multicastDiscovery!.receiveFromIsolate) { + await dispatchAsync(RegisterDeviceAction(device)); + notifier._discoveryLogger.addLog('[DISCOVER/UDP] ${device.alias} (${device.ip}, model: ${device.deviceModel})'); + } + return state; + } +} + +/// Removes all found devices from the state. +class ClearFoundDevicesAction extends ReduxAction { + @override + NearbyDevicesState reduce() { + return state.copyWith( + devices: {}, + ); + } +} + +/// Registers a device in the state. +/// It will override any existing device with the same IP. +class RegisterDeviceAction extends AsyncReduxAction { + final Device device; + + RegisterDeviceAction(this.device); + + @override + bool get trackOrigin => false; + + @override + Future reduce() async { + assert(device.ip?.isNotEmpty ?? false, 'IP must not be empty'); + + final favoriteDevice = notifier._favoriteService.state.firstWhereOrNull((e) => e.fingerprint == device.fingerprint); + if (favoriteDevice != null && !favoriteDevice.customAlias) { + // Update existing favorite with new alias + await external(notifier._favoriteService).dispatchAsync(UpdateFavoriteAction(favoriteDevice.copyWith(alias: device.alias))); + } else { + await Future.microtask(() {}); + } + return state.copyWith( + devices: {...state.devices}..update(device.ip!, (_) => device, ifAbsent: () => device), + ); + } +} + +/// Registers a new device found via signaling. +class RegisterSignalingDeviceAction extends ReduxAction { + final Device device; + + RegisterSignalingDeviceAction(this.device); + + @override + NearbyDevicesState reduce() { + final Set existingDevices = state.signalingDevices[device.fingerprint]?.toSet() ?? {}; + final existingDevice = existingDevices.firstWhereOrNull((e) => e.signalingId == device.signalingId); + if (existingDevice != null) { + existingDevices.remove(existingDevice); + } + existingDevices.add(device); + + return state.copyWith( + signalingDevices: { + ...state.signalingDevices, + device.fingerprint: existingDevices, + }, + ); + } +} + +class UnregisterSignalingDeviceAction extends ReduxAction { + final String signalingId; + + UnregisterSignalingDeviceAction(this.signalingId); + + @override + NearbyDevicesState reduce() { + return state.copyWith( + signalingDevices: { + for (final entry in state.signalingDevices.entries) entry.key: entry.value.where((e) => e.signalingId != signalingId).toSet(), + }, + ); + } +} + +/// It does not really "scan". +/// It just sends an announcement which will cause a response on every other LocalSend member of the network. +class StartMulticastScan extends ReduxAction { + @override + NearbyDevicesState reduce() { + external(notifier._isolateController).dispatch(IsolateSendMulticastAnnouncementAction()); + return state; + } +} + +/// Scans one particular subnet with traditional HTTP/TCP discovery. +/// This method awaits until the scan is finished. +class StartLegacyScan extends AsyncReduxAction { + final int port; + final String localIp; + final bool https; + + StartLegacyScan({ + required this.port, + required this.localIp, + required this.https, + }); + + @override + Future reduce() async { + if (state.runningIps.contains(localIp)) { + // already running for the same localIp + await Future.microtask(() {}); + return state; + } + + dispatch(_SetRunningIpsAction({...state.runningIps, localIp})); + + final stream = external(notifier._isolateController).dispatchTakeResult( + IsolateInterfaceHttpDiscoveryAction( + networkInterface: localIp, + port: port, + https: https, + ), + ); + + await for (final device in stream) { + notifier._discoveryLogger.addLog('[DISCOVER/TCP] ${device.alias} (${device.ip}, model: ${device.deviceModel})'); + await dispatchAsync(RegisterDeviceAction(device)); + } + + return state.copyWith( + runningIps: state.runningIps.where((ip) => ip != localIp).toSet(), + ); + } +} + +class StartFavoriteScan extends AsyncReduxAction { + final List devices; + final bool https; + + StartFavoriteScan({ + required this.devices, + required this.https, + }); + + @override + Future reduce() async { + if (devices.isEmpty) { + return state; + } + dispatch(_SetRunningFavoriteScanAction(true)); + + final stream = external(notifier._isolateController).dispatchTakeResult( + IsolateFavoriteHttpDiscoveryAction( + favorites: devices.map((e) => (e.ip, e.port)).toList(), + https: https, + ), + ); + + await for (final device in stream) { + notifier._discoveryLogger.addLog('[DISCOVER/TCP] ${device.alias} (${device.ip}, model: ${device.deviceModel})'); + await dispatchAsync(RegisterDeviceAction(device)); + } + + return state.copyWith( + runningFavoriteScan: false, + ); + } +} + +class _SetRunningIpsAction extends ReduxAction { + final Set runningIps; + + _SetRunningIpsAction(this.runningIps); + + @override + NearbyDevicesState reduce() { + return state.copyWith( + runningIps: runningIps, + ); + } +} + +class _SetRunningFavoriteScanAction extends ReduxAction { + final bool running; + + _SetRunningFavoriteScanAction(this.running); + + @override + NearbyDevicesState reduce() { + return state.copyWith( + runningFavoriteScan: running, + ); + } +} diff --git a/app/lib/provider/network/scan_facade.dart b/app/lib/provider/network/scan_facade.dart new file mode 100644 index 0000000..45b9e20 --- /dev/null +++ b/app/lib/provider/network/scan_facade.dart @@ -0,0 +1,82 @@ +import 'dart:async'; + +import 'package:common/util/sleep.dart'; +import 'package:localsend_app/pages/home_page.dart'; +import 'package:localsend_app/pages/home_page_controller.dart'; +import 'package:localsend_app/provider/favorites_provider.dart'; +import 'package:localsend_app/provider/local_ip_provider.dart'; +import 'package:localsend_app/provider/network/nearby_devices_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +/// Scans the network via multicast first, +/// if no devices has been found, try http-based discovery on the first subnet. +/// If [forceLegacy] is true, then the http-based discovery runs in parallel. +/// Otherwise, it runs after a delay of 1 second and only if no devices has been found. +class StartSmartScan extends AsyncGlobalAction { + /// Maximum number of interfaces to scan. + /// If there are more interfaces, the first ones will be used or the user needs to select one. + static const maxInterfaces = 3; + + final bool forceLegacy; + + StartSmartScan({required this.forceLegacy}); + + @override + Future reduce() async { + // Try performant Multicast/UDP method first + ref.redux(nearbyDevicesProvider).dispatch(StartMulticastScan()); + + // At the same time, try to discover favorites + final favorites = ref.read(favoritesProvider); + final https = ref.read(settingsProvider).https; + await ref.redux(nearbyDevicesProvider).dispatchAsync(StartFavoriteScan(devices: favorites, https: https)); + + if (!forceLegacy) { + // Wait a bit before trying the legacy method. + // Skip waiting if [forceLegacy] is true. + await sleepAsync(1000); + } + + // If no devices has been found, then switch to legacy discovery mode + // which is purely HTTP/TCP based. + final stillEmpty = ref.read(nearbyDevicesProvider).devices.isEmpty; + final stillInSendTab = ref.read(homePageControllerProvider).currentTab == HomeTab.send; + if (forceLegacy || (stillEmpty && stillInSendTab)) { + final networkInterfaces = ref.read(localIpProvider).localIps.take(maxInterfaces).toList(); + if (networkInterfaces.isNotEmpty) { + await dispatchAsync(StartLegacySubnetScan(subnets: networkInterfaces)); + } + } else { + if (!stillEmpty) { + emitMessage('Already found devices. This network seem to work, no need to start legacy scan.'); + } + if (!stillInSendTab) { + emitMessage('User left the send tab. No need to start legacy scan.'); + } + } + } +} + +/// HTTP based discovery on a fixed set of subnets. +class StartLegacySubnetScan extends AsyncGlobalAction { + final List subnets; + + StartLegacySubnetScan({ + required this.subnets, + }); + + @override + Future reduce() async { + final settings = ref.read(settingsProvider); + final port = settings.port; + final https = settings.https; + + // send announcement in parallel + ref.redux(nearbyDevicesProvider).dispatch(StartMulticastScan()); + + await Future.wait([ + for (final subnet in subnets) ref.redux(nearbyDevicesProvider).dispatchAsync(StartLegacyScan(port: port, localIp: subnet, https: https)), + ]); + } +} diff --git a/app/lib/provider/network/send_provider.dart b/app/lib/provider/network/send_provider.dart new file mode 100644 index 0000000..0a1bbd6 --- /dev/null +++ b/app/lib/provider/network/send_provider.dart @@ -0,0 +1,661 @@ +import 'dart:async'; +import 'dart:collection'; +import 'dart:convert'; + +import 'package:common/isolate.dart'; +import 'package:common/model/device.dart'; +import 'package:common/model/dto/file_dto.dart'; +import 'package:common/model/file_status.dart'; +import 'package:common/model/file_type.dart'; +import 'package:common/model/session_status.dart'; +import 'package:common/util/sleep.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/model/cross_file.dart'; +import 'package:localsend_app/model/send_mode.dart'; +import 'package:localsend_app/model/state/send/send_session_state.dart'; +import 'package:localsend_app/model/state/send/sending_file.dart'; +import 'package:localsend_app/pages/home_page.dart'; +import 'package:localsend_app/pages/progress_page.dart'; +import 'package:localsend_app/pages/send_page.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/provider/http_provider.dart'; +import 'package:localsend_app/provider/progress_provider.dart'; +import 'package:localsend_app/provider/selection/selected_sending_files_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/rust/api/http.dart' as rust_http; +import 'package:localsend_app/rust/api/model.dart' as rust_model; +import 'package:localsend_app/util/rust.dart'; +import 'package:localsend_app/widget/dialogs/pin_dialog.dart'; +import 'package:logging/logging.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:rhttp/rhttp.dart'; +import 'package:routerino/routerino.dart'; +import 'package:uri_content/uri_content.dart'; +import 'package:uuid/uuid.dart'; + +const _uuid = Uuid(); +final _logger = Logger('Send'); + +/// This provider manages sending files to other devices. +/// +/// In contrast to [serverProvider], this provider does not manage a server. +/// Instead, it only does HTTP requests to other servers. +final sendProvider = NotifierProvider>((ref) { + return SendNotifier(); +}); + +class SendNotifier extends Notifier> { + SendNotifier(); + + @override + Map init() { + return {}; + } + + /// Starts a session. + /// If [background] is true, then the session closes itself on success and no pages will be open + /// If [background] is false, then this method will open pages by itself and waits for user input to close the session. + Future startSession({ + required Device target, + required List files, + required bool background, + }) async { + final client = ref.read(httpProvider).v2; + final sessionId = _uuid.v4(); + + final requestState = SendSessionState( + sessionId: sessionId, + remoteSessionId: null, + background: background, + status: SessionStatus.waiting, + target: target, + files: Map.fromEntries( + await Future.wait( + files.map((file) async { + final id = _uuid.v4(); + return MapEntry( + id, + SendingFile( + file: FileDto( + id: id, + fileName: file.name, + size: file.size, + fileType: file.fileType, + hash: null, + preview: files.length == 1 && files.first.fileType == FileType.text && files.first.bytes != null + ? utf8.decode(files.first.bytes!) // send simple message by embedding it into the preview + : null, + metadata: file.lastModified != null || file.lastAccessed != null + ? FileMetadata( + lastModified: file.lastModified, + lastAccessed: file.lastAccessed, + ) + : null, + ), + status: FileStatus.queue, + token: null, + thumbnail: file.thumbnail, + asset: file.asset, + path: file.path, + bytes: file.bytes, + errorMessage: null, + ), + ); + }), + ), + ), + startTime: null, + endTime: null, + sendingTasks: [], + errorMessage: null, + ); + + final originDevice = ref.read(deviceFullInfoProvider); + final requestDto = rust_model.PrepareUploadRequestDto( + info: rust_model.RegisterDto( + alias: originDevice.alias, + version: originDevice.version, + deviceModel: originDevice.deviceModel, + deviceType: originDevice.deviceType.toRust(), + token: originDevice.fingerprint, + port: originDevice.port, + protocol: originDevice.https ? rust_model.ProtocolType.https : rust_model.ProtocolType.http, + hasWebInterface: originDevice.download, + ), + files: { + for (final entry in requestState.files.entries) entry.key: entry.value.file.toRust(), + }, + ); + + state = state.updateSession( + sessionId: sessionId, + state: (_) => requestState, + ); + + if (!background) { + // ignore: use_build_context_synchronously, unawaited_futures + Routerino.context.push( + () => SendPage(showAppBar: false, closeSessionOnClose: true, sessionId: sessionId), + transition: RouterinoTransition.fade(), + ); + } + + rust_http.PrepareUploadResult? response; + bool invalidPin; + bool pinFirstAttempt = true; + String? pin; + do { + invalidPin = false; + try { + response = await client.prepareUpload( + protocol: target.getProtocolType(), + ip: target.ip!, + port: target.port, + payload: requestDto, + // TODO + publicKey: null, + pin: pin, + ); + } on rust_http.RsHttpClientError_StatusCode catch (e) { + switch (e.status) { + case 401: + invalidPin = true; + + // wait until animation is finished + await sleepAsync(500); + + pin = await showDialog( + context: Routerino.context, // ignore: use_build_context_synchronously + builder: (_) => PinDialog( + obscureText: true, + showInvalidPin: !pinFirstAttempt, + ), + ); + + pinFirstAttempt = false; + + if (pin == null) { + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + status: SessionStatus.canceledBySender, + ), + ); + return; + } + break; + case 403: + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + status: SessionStatus.declined, + ), + ); + return; + case 409: + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + status: SessionStatus.recipientBusy, + ), + ); + return; + case 429: + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + status: SessionStatus.tooManyAttempts, + ), + ); + return; + default: + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + status: SessionStatus.finishedWithErrors, + errorMessage: e.humanErrorMessage, + ), + ); + return; + } + } catch (e) { + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + status: SessionStatus.finishedWithErrors, + errorMessage: e.humanErrorMessage, + ), + ); + return; + } + } while (invalidPin); + + if (response == null) { + return; + } + + final Map fileMap; + if (response.statusCode == 204) { + // Nothing selected + // Interpret this as "Read and close" + fileMap = {}; + } else { + try { + fileMap = response.response!.files; + final sessionId = response.response!.sessionId; + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + remoteSessionId: sessionId, + ), + ); + } catch (e) { + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + status: SessionStatus.finishedWithErrors, + errorMessage: e.humanErrorMessage, + ), + ); + return; + } + } + + if (fileMap.isEmpty) { + // receiver has nothing selected + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + status: SessionStatus.finished, + ), + ); + + if (state[sessionId]?.background == false) { + // ignore: use_build_context_synchronously, unawaited_futures + Routerino.context.pushRootImmediately(() => const HomePage(initialTab: HomeTab.send, appStart: false)); + } + + closeSession(sessionId); + return; + } + + final sendingFiles = { + for (final file in requestState.files.values) + file.file.id: fileMap.containsKey(file.file.id) ? file.copyWith(token: fileMap[file.file.id]) : file.copyWith(status: FileStatus.skipped), + }; + + if (state[sessionId]?.background == false) { + final background = ref.read(settingsProvider).sendMode == SendMode.multiple; + + // ignore: use_build_context_synchronously, unawaited_futures + Routerino.context.pushAndRemoveUntil( + removeUntil: HomePage, + transition: RouterinoTransition.fade(), + // immediately is not possible: https://github.com/flutter/flutter/issues/121910 + builder: () => ProgressPage( + showAppBar: background, + closeSessionOnClose: !background, + sessionId: sessionId, + ), + ); + } + + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + status: SessionStatus.sending, + files: sendingFiles, + ), + ); + + await _sendLoop(ref, sessionId, target, sendingFiles); + } + + Future _sendLoop(Ref ref, String sessionId, Device target, Map files) async { + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith(startTime: DateTime.now().millisecondsSinceEpoch), + ); + + final queue = Queue()..addAll(files.values); + final concurrency = ref.read(parentIsolateProvider).uploadIsolateCount; + _logger.info('Sending files using $concurrency concurrent isolates'); + + final futures = List.generate(concurrency, (index) async { + while (true) { + final file = switch (queue.isEmpty) { + true => null, + false => queue.removeFirst(), + }; + + if (file == null) { + break; + } + + await sendFile( + sessionId: sessionId, + isolateIndex: index, + file: file, + isRetry: false, + ); + } + }); + + await Future.wait(futures); + + _finish(sessionId: sessionId); + } + + void _finish({required String sessionId}) { + final sessionState = state[sessionId]; + if (sessionState == null) { + return; + } + + if (state[sessionId]!.status != SessionStatus.sending) { + _logger.info('Transfer was canceled.'); + } else { + final hasError = sessionState.files.values.any((file) => file.status == FileStatus.failed); + if (!hasError && sessionState.background == true) { + // close session because everything is fine and it is in background + closeSession(sessionId); + _logger.info('Transfer finished and session removed.'); + } else { + // keep session alive when there are errors or currently in foreground + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + status: hasError ? SessionStatus.finishedWithErrors : SessionStatus.finished, + endTime: DateTime.now().millisecondsSinceEpoch, + ), + ); + + if (hasError) { + _logger.info('Transfer finished with errors.'); + } else { + _logger.info('Transfer finished successfully.'); + } + } + } + } + + final uriContent = UriContent(); + + /// Sends a file. + /// Returns true, if the next file should be sent. + Future sendFile({ + required String sessionId, + required int isolateIndex, + required SendingFile file, + required bool isRetry, + }) async { + final token = file.token; + if (token == null) { + return true; + } + + final status = state[sessionId]?.status; + const allowedStates = {SessionStatus.sending, SessionStatus.finishedWithErrors}; + if (status == null || !allowedStates.contains(status)) { + return false; + } + + final remoteSessionId = state[sessionId]!.remoteSessionId; + final target = state[sessionId]!.target; + + if (isRetry) { + _logger.info('Retrying ${file.file.fileName}'); + + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + status: SessionStatus.sending, + files: s.files.map((key, value) { + if (key == file.file.id) { + return MapEntry(key, value.copyWith(status: FileStatus.queue, errorMessage: null)); + } + return MapEntry(key, value); + }), + ), + ); + } else { + _logger.info('Sending ${file.file.fileName}'); + } + + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.withFileStatus(file.file.id, FileStatus.sending, null), + ); + + final taskResult = ref + .redux(parentIsolateProvider) + .dispatchTakeResult( + IsolateHttpUploadAction( + isolateIndex: isolateIndex, + remoteSessionId: remoteSessionId, + remoteFileToken: token, + fileId: file.file.id, + filePath: file.path, + fileBytes: file.bytes, + mime: file.file.lookupMime(), + fileSize: file.file.size, + device: target, + ), + ); + + String? fileError; + try { + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + sendingTasks: [ + ...?s.sendingTasks, + SendingTask( + isolateIndex: isolateIndex, + taskId: taskResult.taskId, + ), + ], + ), + ); + + await for (final progress in taskResult.progress) { + ref + .notifier(progressProvider) + .setProgress( + sessionId: sessionId, + fileId: file.file.id, + progress: progress, + ); + } + + // set progress to 100% when successfully finished + ref + .notifier(progressProvider) + .setProgress( + sessionId: sessionId, + fileId: file.file.id, + progress: 1, + ); + } catch (e, st) { + fileError = e.humanErrorMessage; + _logger.warning('Error while sending file ${file.file.fileName}', e, st); + } finally { + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + sendingTasks: s.sendingTasks?.where((task) => !(task.isolateIndex == isolateIndex && task.taskId == taskResult.taskId)).toList(), + ), + ); + } + + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.withFileStatus(file.file.id, fileError != null ? FileStatus.failed : FileStatus.finished, fileError), + ); + + if (isRetry) { + final state = this.state[sessionId]; + if (state != null && state.files.values.map((e) => e.status).isFinishedOrError) { + _finish(sessionId: sessionId); + return false; + } + } + + return true; + } + + /// Closes the send-session and sends a cancel event to the receiver. + void cancelSession(String sessionId) { + final sessionState = state[sessionId]; + if (sessionState == null) { + return; + } + final remoteSessionId = sessionState.remoteSessionId; + + _cancelRunningRequests(sessionState); + + if (remoteSessionId == null) { + closeSession(sessionId); + return; + } + + // notify the receiver + final target = sessionState.target; + try { + ref + .read(httpProvider) + .v2 + // ignore: discarded_futures + .cancel( + protocol: target.getProtocolType(), + ip: target.ip!, + port: target.port, + sessionId: remoteSessionId, + ); + } catch (e) { + _logger.warning('Error while canceling session', e); + } + + // finally, close session locally + closeSession(sessionId); + } + + void cancelSessionByReceiver(String sessionId) { + final sessionState = state[sessionId]; + if (sessionState == null) { + return; + } + _cancelRunningRequests(sessionState); + + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith( + status: SessionStatus.canceledByReceiver, + endTime: DateTime.now().millisecondsSinceEpoch, + ), + ); + } + + void _cancelRunningRequests(SendSessionState state) { + for (final task in state.sendingTasks ?? []) { + ref + .redux(parentIsolateProvider) + .dispatch( + IsolateHttpUploadCancelAction( + isolateIndex: task.isolateIndex, + taskId: task.taskId, + ), + ); + } + } + + /// Closes the session + void closeSession(String sessionId) { + final sessionState = state[sessionId]; + if (sessionState == null) { + return; + } + state = state.removeSession(ref, sessionId); + if (sessionState.status == SessionStatus.finished && ref.read(settingsProvider).sendMode == SendMode.single) { + // clear selected files + ref.redux(selectedSendingFilesProvider).dispatch(ClearSelectionAction()); + } + } + + void clearAllSessions() { + state = {}; + ref.notifier(progressProvider).removeAllSessions(); + } + + void setBackground(String sessionId, bool background) { + state = state.updateSession( + sessionId: sessionId, + state: (s) => s?.copyWith(background: background), + ); + } +} + +extension on Map { + Map updateSession({ + required String sessionId, + required SendSessionState? Function(SendSessionState? old) state, + }) { + final newState = state(this[sessionId]); + if (newState == null) { + // no change + return this; + } + return { + ...this, + sessionId: newState, + }; + } + + Map removeSession(Ref ref, String sessionId) { + ref.notifier(progressProvider).removeSession(sessionId); + return {...this}..remove(sessionId); + } +} + +extension on SendSessionState { + SendSessionState withFileStatus(String fileId, FileStatus status, String? errorMessage) { + return copyWith( + files: {...files} + ..update( + fileId, + (file) => file.copyWith( + status: status, + errorMessage: errorMessage, + ), + ), + ); + } +} + +extension on Object { + String get humanErrorMessage { + final e = this; + final (statusCode, message) = switch (this) { + RhttpStatusCodeException(:final statusCode, :final body) => (statusCode, _parseErrorMessage(body)), + _ => (null, e.toString()), + }; + + if (statusCode != null && message != null) { + return '[$statusCode] $message'; + } + + return e.toString(); + } +} + +String? _parseErrorMessage(Object? body) { + if (body is! String) { + return null; + } + + try { + return (jsonDecode(body) as Map)['message']; + } catch (_) { + return null; + } +} diff --git a/app/lib/provider/network/server/controller/common.dart b/app/lib/provider/network/server/controller/common.dart new file mode 100644 index 0000000..55edefa --- /dev/null +++ b/app/lib/provider/network/server/controller/common.dart @@ -0,0 +1,38 @@ +import 'dart:io'; + +import 'package:localsend_app/provider/network/server/server_utils.dart'; +import 'package:localsend_app/util/simple_server.dart'; + +/// Responds with 401 or 429 if the pin is invalid or too many attempts. +/// Returns true if the pin is correct, or if no pin is set. +Future checkPin({ + required ServerUtils server, + required String? pin, + required Map pinAttempts, + required HttpRequest request, +}) async { + if (pin != null) { + final attempts = pinAttempts[request.ip] ?? 0; + if (attempts >= 3) { + await request.respondJson(429, message: 'Too many attempts.'); + return false; + } + + final requestPin = request.uri.queryParameters['pin']; + if (requestPin != pin) { + if (requestPin?.isNotEmpty ?? false) { + pinAttempts[request.ip] = attempts + 1; + + if (attempts == 2) { + // it was 2 before incrementing + await request.respondJson(429, message: 'Too many attempts.'); + return false; + } + } + await request.respondJson(401, message: 'Invalid pin.'); + return false; + } + } + + return true; +} diff --git a/app/lib/provider/network/server/controller/receive_controller.dart b/app/lib/provider/network/server/controller/receive_controller.dart new file mode 100644 index 0000000..149aa2f --- /dev/null +++ b/app/lib/provider/network/server/controller/receive_controller.dart @@ -0,0 +1,882 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:collection/collection.dart'; +import 'package:common/api_route_builder.dart'; +import 'package:common/constants.dart'; +import 'package:common/model/device.dart'; +import 'package:common/model/dto/info_dto.dart'; +import 'package:common/model/dto/info_register_dto.dart'; +import 'package:common/model/dto/prepare_upload_request_dto.dart'; +import 'package:common/model/dto/prepare_upload_response_dto.dart'; +import 'package:common/model/dto/register_dto.dart'; +import 'package:common/model/file_status.dart'; +import 'package:common/model/file_type.dart'; +import 'package:common/model/session_status.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/model/state/send/send_session_state.dart'; +import 'package:localsend_app/model/state/server/receive_session_state.dart'; +import 'package:localsend_app/model/state/server/receiving_file.dart'; +import 'package:localsend_app/pages/home_page.dart'; +import 'package:localsend_app/pages/home_page_controller.dart'; +import 'package:localsend_app/pages/progress_page.dart'; +import 'package:localsend_app/pages/receive_page.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/provider/favorites_provider.dart'; +import 'package:localsend_app/provider/http_provider.dart'; +import 'package:localsend_app/provider/logging/discovery_logs_provider.dart'; +import 'package:localsend_app/provider/network/nearby_devices_provider.dart'; +import 'package:localsend_app/provider/network/send_provider.dart'; +import 'package:localsend_app/provider/network/server/controller/common.dart'; +import 'package:localsend_app/provider/network/server/server_provider.dart'; +import 'package:localsend_app/provider/network/server/server_utils.dart'; +import 'package:localsend_app/provider/progress_provider.dart'; +import 'package:localsend_app/provider/receive_history_provider.dart'; +import 'package:localsend_app/provider/selection/selected_receiving_files_provider.dart'; +import 'package:localsend_app/provider/selection/selected_sending_files_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/native/directories.dart'; +import 'package:localsend_app/util/native/file_saver.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/util/native/tray_helper.dart'; +import 'package:localsend_app/util/rust.dart'; +import 'package:localsend_app/util/simple_server.dart'; +import 'package:localsend_app/widget/dialogs/open_file_dialog.dart'; +import 'package:logging/logging.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; +import 'package:uuid/uuid.dart'; +import 'package:window_manager/window_manager.dart'; + +const _uuid = Uuid(); + +final _logger = Logger('ReceiveController'); + +/// Handles all requests for receiving files. +class ReceiveController { + final ServerUtils server; + + ReceiveController(this.server); + + /// Installs all routes for receiving files. + void installRoutes({ + required SimpleServerRouteBuilder router, + required String alias, + required int port, + required bool https, + required String fingerprint, + required String showToken, + }) { + router.get(ApiRoute.info.v1, (HttpRequest request) async { + return await _infoHandler(request: request, alias: alias, fingerprint: fingerprint); + }); + + router.get(ApiRoute.info.v2, (HttpRequest request) async { + return await _infoHandler(request: request, alias: alias, fingerprint: fingerprint); + }); + + // An upgraded version of /info + router.post(ApiRoute.register.v1, (HttpRequest request) async { + return await _registerHandler(request: request, alias: alias, port: port, https: https, fingerprint: fingerprint); + }); + + router.post(ApiRoute.register.v2, (HttpRequest request) async { + return await _registerHandler(request: request, alias: alias, port: port, https: https, fingerprint: fingerprint); + }); + + router.post(ApiRoute.prepareUpload.v1, (HttpRequest request) async { + return await _prepareUploadHandler(request: request, port: port, https: https, v2: false); + }); + + router.post(ApiRoute.prepareUpload.v2, (HttpRequest request) async { + return await _prepareUploadHandler(request: request, port: port, https: https, v2: true); + }); + + router.post(ApiRoute.upload.v1, (HttpRequest request) async { + return await _uploadHandler(request: request, v2: false); + }); + + router.post(ApiRoute.upload.v2, (HttpRequest request) async { + return await _uploadHandler(request: request, v2: true); + }); + + router.post(ApiRoute.cancel.v1, (HttpRequest request) async { + return await _cancelHandler(request: request, v2: false); + }); + + router.post(ApiRoute.cancel.v2, (HttpRequest request) async { + return await _cancelHandler(request: request, v2: true); + }); + + router.post(ApiRoute.show.v1, (HttpRequest request) async { + return await _showHandler(request: request, showToken: showToken); + }); + + router.post(ApiRoute.show.v2, (HttpRequest request) async { + return await _showHandler(request: request, showToken: showToken); + }); + } + + Future _infoHandler({ + required HttpRequest request, + required String alias, + required String fingerprint, + }) async { + final senderFingerprint = request.uri.queryParameters['fingerprint']; + if (senderFingerprint == fingerprint) { + // "I talked to myself lol" + return await request.respondJson(412, message: 'Self-discovered'); + } + + final deviceInfo = server.ref.read(deviceInfoProvider); + + final dto = InfoDto( + alias: alias, + version: protocolVersion, + deviceModel: deviceInfo.deviceModel, + deviceType: deviceInfo.deviceType, + fingerprint: fingerprint, + download: server.getState().webSendState != null, + ); + + return await request.respondJson(200, body: dto.toJson()); + } + + Future _registerHandler({ + required HttpRequest request, + required String alias, + required String fingerprint, + required int port, + required bool https, + }) async { + final payload = await request.readAsString(); + final RegisterDto requestDto; + try { + requestDto = RegisterDto.fromJson(jsonDecode(payload)); + } catch (e) { + return await request.respondJson(400, message: 'Request body malformed'); + } + + if (requestDto.fingerprint == fingerprint) { + // "I talked to myself lol" + return await request.respondJson(412, message: 'Self-discovered'); + } + + // Save device information + await server.ref + .redux(nearbyDevicesProvider) + .dispatchAsync(RegisterDeviceAction(requestDto.toDevice(request.ip, port, https, HttpDiscovery(ip: request.ip)))); + server.ref.notifier(discoveryLoggerProvider).addLog('[DISCOVER/TCP] Received "/register" HTTP request: ${requestDto.alias} (${request.ip})'); + + final deviceInfo = server.ref.read(deviceInfoProvider); + + final responseDto = InfoDto( + alias: alias, + version: protocolVersion, + deviceModel: deviceInfo.deviceModel, + deviceType: deviceInfo.deviceType, + fingerprint: fingerprint, + download: server.getState().webSendState != null, + ); + + return await request.respondJson(200, body: responseDto.toJson()); + } + + Future _prepareUploadHandler({ + required HttpRequest request, + required int port, + required bool https, + required bool v2, + }) async { + if (server.getState().session != null) { + // block incoming requests when we are already in a session + return await request.respondJson(409, message: 'Blocked by another session'); + } + + final pinCorrect = await checkPin( + server: server, + pin: server.ref.read(settingsProvider).receivePin, + pinAttempts: server.getState().pinAttempts, + request: request, + ); + if (!pinCorrect) { + return; + } + + final PrepareUploadRequestDto dto; + try { + final payload = await request.readAsString(); + dto = PrepareUploadRequestDto.fromJson(jsonDecode(payload)); + } catch (e) { + return await request.respondJson(400, message: 'Request body malformed'); + } + + if (dto.files.isEmpty) { + // block empty requests (at least one file is required) + return await request.respondJson(400, message: 'Request must contain at least one file'); + } + + final settings = server.ref.read(settingsProvider); + final destinationDir = settings.destination ?? await getDefaultDestinationDirectory(); + final cacheDir = await getCacheDirectory(); + final sessionId = _uuid.v4(); + + _logger.info('Session Id: $sessionId'); + _logger.info('Destination Directory: $destinationDir'); + + final streamController = StreamController?>(); + server.setState( + (oldState) => oldState?.copyWith( + session: ReceiveSessionState( + sessionId: sessionId, + status: SessionStatus.waiting, + sender: dto.info.toDevice(request.ip, port, https, null), + senderAlias: server.ref.read(favoritesProvider).firstWhereOrNull((e) => e.fingerprint == dto.info.fingerprint)?.alias ?? dto.info.alias, + files: { + for (final file in dto.files.values) + file.id: ReceivingFile( + file: file, + status: FileStatus.queue, + token: null, + desiredName: null, + path: null, + savedToGallery: false, + errorMessage: null, + ), + }, + startTime: null, + endTime: null, + destinationDirectory: destinationDir, + cacheDirectory: cacheDir, + saveToGallery: checkPlatformWithGallery() && settings.saveToGallery && dto.files.values.every((f) => !f.fileName.contains('/')), + createdDirectories: {}, + responseHandler: streamController, + ), + ), + ); + + bool quickSave = settings.quickSave && server.getState().session?.message == null; + final quickSaveFromFavorites = settings.quickSaveFromFavorites && server.getState().session?.message == null; + if (quickSaveFromFavorites) { + final bool isFavorite = server.ref.read(favoritesProvider).any((e) => e.fingerprint == dto.info.fingerprint); + if (isFavorite) { + quickSave = true; + } + } + final Map? selection; + if (quickSave) { + // accept all files + selection = { + for (final f in dto.files.values) f.id: f.fileName, + }; + } else { + if (checkPlatformHasTray() && (await windowManager.isMinimized() || !(await windowManager.isVisible()) || !(await windowManager.isFocused()))) { + await showFromTray(); + } + + final message = server.getState().session?.message; + if (message != null) { + // Message already received + await server.ref + .redux(receiveHistoryProvider) + .dispatchAsync( + AddHistoryEntryAction( + entryId: const Uuid().v4(), + fileName: message, + fileType: FileType.text, + path: null, + savedToGallery: false, + isMessage: true, + fileSize: utf8.encode(message).length, + senderAlias: server.getState().session!.senderAlias, + timestamp: DateTime.now().toUtc(), + ), + ); + } + + final receiveProvider = ViewProvider((ref) { + final session = ref.watch(serverProvider.select((state) => state?.session)); + return ReceivePageVm( + status: session?.status, + sender: session?.sender ?? Device.empty, + showSenderInfo: true, + files: session?.files.values.map((f) => f.file).toList() ?? [], + message: message, + onAccept: () async { + if (message != null) { + // accept nothing + ref.notifier(serverProvider).acceptFileRequest({}); + return; + } + + final sessionId = ref.read(serverProvider)?.session?.sessionId; + if (sessionId == null) { + return; + } + + final selectedFiles = ref.read(selectedReceivingFilesProvider); + ref.notifier(serverProvider).acceptFileRequest(selectedFiles); + + await Routerino.context.pushAndRemoveUntilImmediately( + removeUntil: ReceivePage, + builder: () => ProgressPage( + showAppBar: false, + closeSessionOnClose: true, + sessionId: sessionId, + ), + ); + }, + onDecline: () { + ref.notifier(serverProvider).declineFileRequest(); + }, + onClose: () { + ref.notifier(serverProvider).closeSession(); + }, + ); + }); + + // ignore: use_build_context_synchronously, unawaited_futures + Routerino.context.push(() => ReceivePage(receiveProvider)); + + // Delayed response (waiting for user's decision) + selection = await streamController.stream.first; + } + + if (server.getState().session == null) { + // somehow this state is already disposed + return await request.respondJson(500, message: 'Server is in invalid state'); + } + + if (selection == null) { + closeSession(); + return await request.respondJson(403, message: 'File request declined by recipient'); + } + + if (selection.isEmpty) { + // nothing selected, send this to sender and close session + // This usually happens for message transfers + closeSession(); + return await request.respondJson(204); + } + + server.setState( + (oldState) { + final receiveState = oldState!.session!; + return oldState.copyWith( + session: receiveState.copyWith( + status: SessionStatus.sending, + files: Map.fromEntries( + receiveState.files.values.map((entry) { + final desiredName = selection![entry.file.id]; + return MapEntry( + entry.file.id, + ReceivingFile( + file: entry.file, + status: desiredName != null ? FileStatus.queue : FileStatus.skipped, + token: desiredName != null ? _uuid.v4() : null, + desiredName: desiredName, + path: null, + savedToGallery: false, + errorMessage: null, + ), + ); + }), + ), + responseHandler: null, + ), + ); + }, + ); + + if (quickSave) { + // ignore: use_build_context_synchronously, unawaited_futures + Routerino.context.pushImmediately( + () => ProgressPage( + showAppBar: false, + closeSessionOnClose: true, + sessionId: sessionId, + ), + ); + } + + final files = { + for (final file in server.getState().session!.files.values.where((f) => f.token != null)) file.file.id: file.token, + }; + + if (checkPlatform([TargetPlatform.android, TargetPlatform.iOS])) { + if (checkPlatform([TargetPlatform.android]) && !server.getState().session!.destinationDirectory.startsWith('/storage/emulated/0/Download')) { + // Android requires more permission to save files outside of the Download directory + try { + final result = await Permission.storage.request(); + _logger.info('storage permission: $result'); + } catch (e) { + _logger.warning('Could not request storage permission', e); + } + } + try { + await Permission.storage.request(); + } catch (e) { + _logger.warning('Could not request storage permission', e); + } + } + + if (v2) { + return await request.respondJson( + 200, + body: PrepareUploadResponseDto( + sessionId: sessionId, + files: files.cast(), + ).toJson(), + ); + } + + return await request.respondJson(200, body: files); + } + + Future _uploadHandler({ + required HttpRequest request, + required bool v2, + }) async { + final receiveState = server.getState().session; + if (receiveState == null) { + return await request.respondJson(409, message: 'No session'); + } + + if (request.ip != receiveState.sender.ip) { + _logger.warning('Invalid ip address: ${request.ip} (expected: ${receiveState.sender.ip})'); + return await request.respondJson(403, message: 'Invalid IP address: ${request.ip}'); + } + + const allowedStates = {SessionStatus.sending, SessionStatus.finishedWithErrors}; + if (!allowedStates.contains(receiveState.status)) { + _logger.warning('Wrong state: ${receiveState.status}'); + return await request.respondJson(409, message: 'Recipient is in wrong state'); + } + + final fileId = request.uri.queryParameters['fileId']; + final token = request.uri.queryParameters['token']; + final sessionId = request.uri.queryParameters['sessionId']; + if (fileId == null || token == null || (v2 && sessionId == null)) { + // reject because of missing parameters + _logger.warning('Missing parameters: fileId=$fileId, token=$token, sessionId=$sessionId'); + return await request.respondJson(400, message: 'Missing parameters'); + } + + if (v2 && sessionId != receiveState.sessionId) { + // reject because of wrong session id + _logger.warning('Wrong session id: $sessionId (expected: ${receiveState.sessionId})'); + return await request.respondJson(403, message: 'Invalid session id'); + } + + final receivingFile = receiveState.files[fileId]; + if (receivingFile == null || receivingFile.token != token) { + // reject because there is no file or token does not match + _logger.warning('Wrong fileId: $fileId (expected: ${receivingFile?.file.id})'); + return await request.respondJson(403, message: 'Invalid token'); + } + + // begin of actual file transfer + server.setState( + (oldState) => oldState?.copyWith( + session: receiveState.copyWith( + files: {...receiveState.files} + ..update( + fileId, + (_) => receivingFile.copyWith( + status: FileStatus.sending, + ), + ), + startTime: receiveState.startTime ?? DateTime.now().millisecondsSinceEpoch, + status: SessionStatus.sending, // in case it was finishedWithErrors and user retries a failed file + ), + ), + ); + final fileType = receivingFile.file.fileType; + final shouldSaveToGallery = receiveState.saveToGallery && (fileType == FileType.image || fileType == FileType.video); + + String? filePath; + bool savedToGallery = false; + try { + _logger.info('Saving ${receivingFile.file.fileName}'); + + (savedToGallery, filePath) = await saveFile( + destinationDirectory: receiveState.destinationDirectory, + fileName: receivingFile.desiredName!, + saveToGallery: shouldSaveToGallery, + isImage: fileType == FileType.image, + stream: request, + onProgress: (savedBytes) { + if (receivingFile.file.size != 0) { + server.ref + .notifier(progressProvider) + .setProgress( + sessionId: receiveState.sessionId, + fileId: fileId, + progress: savedBytes / receivingFile.file.size, + ); + } + }, + lastModified: receivingFile.file.metadata?.lastModified, + lastAccessed: receivingFile.file.metadata?.lastAccessed, + androidSdkInt: server.ref.read(deviceInfoProvider).androidSdkInt, + createdDirectories: receiveState.createdDirectories, + ); + if (server.getState().session == null || !allowedStates.contains(server.getState().session!.status)) { + return await request.respondJson(500, message: 'Server is in invalid state'); + } + server.setState( + (oldState) => oldState?.copyWith( + session: oldState.session?.fileFinished( + fileId: fileId, + status: FileStatus.finished, + path: filePath, + savedToGallery: savedToGallery, + errorMessage: null, + ), + ), + ); + + // Track it in history + await server.ref + .redux(receiveHistoryProvider) + .dispatchAsync( + AddHistoryEntryAction( + entryId: fileId, + fileName: receivingFile.desiredName!, + fileType: receivingFile.file.fileType, + path: filePath, + savedToGallery: savedToGallery, + isMessage: false, + fileSize: receivingFile.file.size, + senderAlias: receiveState.senderAlias, + timestamp: DateTime.now().toUtc(), + ), + ); + + _logger.info('Saved ${receivingFile.file.fileName}.'); + } catch (e, st) { + server.setState( + (oldState) => oldState?.copyWith( + session: oldState.session?.fileFinished( + fileId: fileId, + status: FileStatus.failed, + path: null, + savedToGallery: false, + errorMessage: e.toString(), + ), + ), + ); + _logger.severe('Failed to save file', e, st); + } + + server.ref + .notifier(progressProvider) + .setProgress( + sessionId: receiveState.sessionId, + fileId: fileId, + progress: 1, + ); + + final session = server.getState().session; + if (session == null) { + return await request.respondJson(500, message: 'Server is in invalid state'); + } + + if (allowedStates.contains(session.status) && session.files.values.map((e) => e.status).isFinishedOrError) { + final hasError = session.files.values.any((f) => f.status == FileStatus.failed); + server.setState( + (oldState) => oldState?.copyWith( + session: oldState.session!.copyWith( + status: hasError ? SessionStatus.finishedWithErrors : SessionStatus.finished, + endTime: DateTime.now().millisecondsSinceEpoch, + ), + ), + ); + final settings = server.ref.read(settingsProvider); + bool quickSave = settings.quickSave && server.getState().session?.message == null; + final quickSaveFromFavorites = settings.quickSaveFromFavorites && server.getState().session?.message == null; + if (quickSaveFromFavorites) { + // dto is not defined here. I must check sender fingerprint + final bool isFavorite = server.ref.read(favoritesProvider).any((e) => e.fingerprint == session.sender.fingerprint); + if (isFavorite) { + quickSave = true; + } + } + if (quickSave) { + // close the session **after** return of the response + Future.delayed(Duration.zero, () { + closeSession(); + _logger.info('Closing session'); + + // ignore: use_build_context_synchronously, discarded_futures + Routerino.context.pushRootImmediately(() => const HomePage(initialTab: HomeTab.receive, appStart: false)); + + // open the dialog to open file instantly + if (filePath != null && filePath.isNotEmpty) { + // ignore: discarded_futures + OpenFileDialog.open( + Routerino.context, // ignore: use_build_context_synchronously + filePath: filePath, + fileType: fileType, + openGallery: savedToGallery, + ); + } + }); + } + _logger.info('Received all files.'); + } + + return server.getState().session?.files[fileId]?.status == FileStatus.finished + ? await request.respondJson(200) + : await request.respondJson(500, message: 'Could not save file. Check receiving device for more information.'); + } + + Future _cancelHandler({ + required HttpRequest request, + required bool v2, + }) async { + final receiveSession = server.getState().session; + if (receiveSession != null) { + // We are currently receiving files. + + if (!v2 && receiveSession.sender.version != '1.0') { + // disallow v1 cancel for active v2 sessions + return await request.respondJson(403, message: 'No permission'); + } + + if (receiveSession.sender.ip != request.ip) { + return await request.respondJson(403, message: 'No permission'); + } + + // require session id for v2 + // don't require it when during waiting state + if (v2 && receiveSession.status != SessionStatus.waiting) { + final sessionId = request.uri.queryParameters['sessionId']; + if (sessionId != receiveSession.sessionId) { + return await request.respondJson(403, message: 'No permission'); + } + } + + // check if valid state + final currentStatus = receiveSession.status; + if (currentStatus != SessionStatus.waiting && currentStatus != SessionStatus.sending) { + return await request.respondJson(403, message: 'No permission'); + } + + _cancelBySender(server); + return await request.respondJson(200); + } else { + // We are not receiving files so we may be sending files. + + final sessionId = request.uri.queryParameters['sessionId']; + final sendSessions = server.ref.read(sendProvider); + final SendSessionState sendState; + if (v2) { + // In v2, we require sessionId. + + final selectedSession = sendSessions.values.firstWhereOrNull((s) => s.remoteSessionId == sessionId); + if (selectedSession == null) { + return await request.respondJson(403, message: 'No permission'); + } + + sendState = selectedSession; + } else { + // In v1, we are a little bit more tolerant. + // Let's assume the sessionId if only one send session exist + + final onlySession = sendSessions.values.singleOrNull; + if (onlySession == null) { + return await request.respondJson(403, message: 'No permission'); + } + + sendState = onlySession; + } + + if (sendState.target.ip != request.ip) { + return await request.respondJson(403, message: 'No permission'); + } + + // check if valid state + if (sendState.status != SessionStatus.sending) { + return await request.respondJson(403, message: 'No permission'); + } + + server.ref + .notifier(sendProvider) + .cancelSessionByReceiver( + sendState.sessionId, + ); + return await request.respondJson(200); + } + } + + Future _showHandler({ + required HttpRequest request, + required String showToken, + }) async { + final senderToken = request.uri.queryParameters['token']; + if (senderToken == showToken && checkPlatformIsDesktop()) { + // ignore: unawaited_futures + showFromTray().catchError((e) { + // don't wait for it + _logger.severe('Failed to show from tray', e); + }); + + // ignore: unawaited_futures + request.readAsString().then((body) async { + if (body.isEmpty) { + return; + } + + final Map jsonBody = jsonDecode(body); + final List args = (jsonBody['args'] as List?)?.cast() ?? []; + final filesAdded = await server.ref.redux(selectedSendingFilesProvider).dispatchAsyncTakeResult(LoadSelectionFromArgsAction(args)); + if (filesAdded) { + server.ref.redux(homePageControllerProvider).dispatch(ChangeTabAction(HomeTab.send)); + } + }); + + return await request.respondJson(200); + } + + return await request.respondJson(403, message: 'Invalid token'); + } + + void acceptFileRequest(Map fileNameMap) { + final controller = server.getState().session?.responseHandler; + if (controller == null || controller.isClosed) { + return; + } + + controller.add(fileNameMap); + controller.close(); // ignore: discarded_futures + } + + void declineFileRequest() { + final controller = server.getState().session?.responseHandler; + if (controller == null || controller.isClosed) { + return; + } + + controller.add(null); + controller.close(); // ignore: discarded_futures + } + + /// Updates the destination directory for the current session. + void setSessionDestinationDir(String destinationDirectory) { + server.setState( + (oldState) => oldState?.copyWith( + session: oldState.session?.copyWith( + destinationDirectory: destinationDirectory.replaceAll('\\', '/'), + ), + ), + ); + } + + /// Updates the "saveToGallery" setting for the current session. + void setSessionSaveToGallery(bool saveToGallery) { + server.setState( + (oldState) => oldState?.copyWith( + session: oldState.session?.copyWith( + saveToGallery: saveToGallery, + ), + ), + ); + } + + /// In addition to [closeSession], this method also + /// - cancels incoming requests (TODO) + /// - notifies the sender that the session has been canceled + void cancelSession() async { + final session = server.getStateOrNull()?.session; + if (session == null) { + // the server is not running + return; + } + + // notify sender + final target = session.sender; + try { + server.ref + .read(httpProvider) + .v2 + // ignore: unawaited_futures + .cancel( + protocol: target.getProtocolType(), + ip: target.ip!, + port: target.port, + sessionId: session.sessionId, + ); + } catch (e) { + _logger.warning('Failed to notify sender', e); + } + + closeSession(); + + // TODO: cancel incoming requests (https://github.com/dart-lang/shelf/issues/319) + // restartServer(alias: tempState.alias, port: tempState.port); + } + + void closeSession() { + final sessionId = server.getStateOrNull()?.session?.sessionId; + if (sessionId == null) { + return; + } + + server.setState( + (oldState) => oldState?.copyWith( + session: null, + ), + ); + server.ref.notifier(progressProvider).removeSession(sessionId); + } +} + +void _cancelBySender(ServerUtils server) { + final receiveSession = server.getState().session; + if (receiveSession == null) { + return; + } + + if (receiveSession.status == SessionStatus.waiting) { + // received cancel during accept/decline + // pop just in case if user is in [ReceiveOptionsPage] + Routerino.context.popUntil(ReceivePage); + } + + server.setState( + (oldState) => oldState?.copyWith( + session: oldState.session?.copyWith( + status: SessionStatus.canceledBySender, + endTime: DateTime.now().millisecondsSinceEpoch, + ), + ), + ); +} + +extension on ReceiveSessionState { + ReceiveSessionState fileFinished({ + required String fileId, + required FileStatus status, + required String? path, + required bool savedToGallery, + required String? errorMessage, + }) { + return copyWith( + files: {...files} + ..update( + fileId, + (file) => file.copyWith( + status: status, + path: path, + savedToGallery: savedToGallery, + errorMessage: errorMessage, + ), + ), + ); + } +} diff --git a/app/lib/provider/network/server/controller/send_controller.dart b/app/lib/provider/network/server/controller/send_controller.dart new file mode 100644 index 0000000..470fdf9 --- /dev/null +++ b/app/lib/provider/network/server/controller/send_controller.dart @@ -0,0 +1,329 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:common/api_route_builder.dart'; +import 'package:common/constants.dart'; +import 'package:common/model/dto/file_dto.dart'; +import 'package:common/model/dto/info_dto.dart'; +import 'package:common/model/dto/receive_request_response_dto.dart'; +import 'package:common/model/file_type.dart'; +import 'package:common/util/stream.dart'; +import 'package:localsend_app/gen/assets.gen.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/cross_file.dart'; +import 'package:localsend_app/model/state/send/web/web_send_file.dart'; +import 'package:localsend_app/model/state/send/web/web_send_session.dart'; +import 'package:localsend_app/model/state/send/web/web_send_state.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/provider/network/server/controller/common.dart'; +import 'package:localsend_app/provider/network/server/server_utils.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/simple_server.dart'; +import 'package:uri_content/uri_content.dart'; +import 'package:uuid/uuid.dart'; + +const _uuid = Uuid(); + +/// Handles all requests for sending files. +class SendController { + final ServerUtils server; + + SendController(this.server); + + /// Installs all routes for receiving files. + void installRoutes({ + required SimpleServerRouteBuilder router, + required String alias, + required String fingerprint, + }) { + router.get('/', (HttpRequest request) async { + final state = server.getState(); + if (state.webSendState == null) { + // There is no web send state + return await request.respondAsset(403, Assets.web.error403); + } + + return await request.respondAsset(200, Assets.web.index); + }); + + router.get('/main.js', (HttpRequest request) async { + final state = server.getState(); + if (state.webSendState == null) { + // There is no web send state + return await request.respondAsset(403, Assets.web.error403); + } + + return await request.respondAsset(200, Assets.web.main, 'text/javascript; charset=utf-8'); + }); + + router.get('/i18n.json', (HttpRequest request) async { + final state = server.getState(); + if (state.webSendState == null) { + // There is no web send state + return await request.respondJson(403, message: 'Web send not initialized.'); + } + + return await request.respondJson( + 200, + body: { + 'waiting': t.web.waiting, + 'enterPin': t.web.enterPin, + 'invalidPin': t.web.invalidPin, + 'tooManyAttempts': t.web.tooManyAttempts, + 'rejected': t.web.rejected, + 'files': t.web.files, + 'fileName': t.web.fileName, + 'size': t.web.size, + }, + ); + }); + + router.post(ApiRoute.prepareDownload.v2, (HttpRequest request) async { + final state = server.getState(); + if (state.webSendState == null) { + // There is no web send state + return request.respondJson(403, message: 'Web send not initialized.'); + } + + final requestSessionId = request.uri.queryParameters['sessionId']; + if (requestSessionId != null) { + // Check if the user already has permission + final session = server.getState().webSendState?.sessions[requestSessionId]; + if (session != null && session.responseHandler == null && session.ip == request.ip) { + final deviceInfo = server.ref.read(deviceInfoProvider); + return await request.respondJson( + 200, + body: ReceiveRequestResponseDto( + info: InfoDto( + alias: alias, + version: protocolVersion, + deviceModel: deviceInfo.deviceModel, + deviceType: deviceInfo.deviceType, + fingerprint: fingerprint, + download: true, + ), + sessionId: session.sessionId, + files: { + for (final entry in state.webSendState!.files.entries) entry.key: entry.value.file, + }, + ).toJson(), + ); + } + } + + final pinCorrect = await checkPin( + server: server, + pin: state.webSendState!.pin, + pinAttempts: state.webSendState!.pinAttempts, + request: request, + ); + if (!pinCorrect) { + return; + } + + final streamController = StreamController(); + final sessionId = request.ip; + server.setState( + (oldState) => oldState!.copyWith( + webSendState: oldState.webSendState!.copyWith( + sessions: { + ...oldState.webSendState!.sessions, + sessionId: WebSendSession( + sessionId: sessionId, + responseHandler: streamController, + ip: request.ip, + deviceInfo: request.deviceInfo, + ), + }, + ), + ), + ); + + final accepted = state.webSendState?.autoAccept == true || await streamController.stream.first; + if (!accepted) { + // user rejected the file transfer + server.setState( + (oldState) => oldState!.copyWith( + webSendState: oldState.webSendState!.copyWith( + sessions: { + for (final entry in oldState.webSendState!.sessions.entries) + if (entry.key != sessionId) entry.key: entry.value, // remove session + }, + ), + ), + ); + return await request.respondJson(403, message: 'File transfer rejected.'); + } + + server.setState( + (oldState) => oldState!.copyWith( + webSendState: oldState.webSendState!.updateSession( + sessionId: sessionId, + update: (oldSession) { + return oldSession.copyWith( + responseHandler: null, // this indicates that the session is active + ); + }, + ), + ), + ); + final deviceInfo = server.ref.read(deviceInfoProvider); + return await request.respondJson( + 200, + body: ReceiveRequestResponseDto( + info: InfoDto( + alias: alias, + version: protocolVersion, + deviceModel: deviceInfo.deviceModel, + deviceType: deviceInfo.deviceType, + fingerprint: fingerprint, + download: true, + ), + sessionId: sessionId, + files: { + for (final entry in state.webSendState!.files.entries) entry.key: entry.value.file, + }, + ).toJson(), + ); + }); + + router.get(ApiRoute.download.v2, (HttpRequest request) async { + final sessionId = request.uri.queryParameters['sessionId']; + if (sessionId == null) { + return await request.respondJson(400, message: 'Missing sessionId.'); + } + + final session = server.getState().webSendState?.sessions[sessionId]; + if (session == null || session.responseHandler != null || session.ip != request.ip) { + return await request.respondJson(403, message: 'Invalid sessionId.'); + } + + final fileId = request.uri.queryParameters['fileId']; + if (fileId == null) { + return await request.respondJson(400, message: 'Missing fileId.'); + } + + final file = server.getState().webSendState?.files[fileId]; + if (file == null) { + return await request.respondJson(403, message: 'Invalid fileId.'); + } + + final fileName = file.file.fileName.replaceAll('/', '-'); // File name may be inside directories + + request.response + ..statusCode = 200 + ..headers.set('content-type', 'application/octet-stream') + ..headers.set('content-disposition', 'attachment; filename="${Uri.encodeComponent(fileName)}"'); + + final isInlineContent = file.bytes != null; // text message, clipboard content + if (isInlineContent) { + request.response.headers.set('content-length', '${file.bytes!.length}'); + + final byteStream = Stream.fromIterable([file.bytes!]); + final (streamController, subscription) = byteStream.digested(); + + await request.response.addStream(streamController.stream).then((_) { + // ignore: discarded_futures + request.response.close(); + // ignore: discarded_futures + subscription.cancel(); + }); + } else { + final path = file.path!; + final isContentUri = path.startsWith('content://'); + + // Read file size at download time, since the file could have changed since it was selected (#2359, #2043) + final fileSize = isContentUri ? await UriContent().getContentLength(Uri.parse(path)) : File(path).lengthSync(); + request.response.headers.set('content-length', '$fileSize'); + + final fileStream = isContentUri ? UriContent().getContentStream(Uri.parse(path)) : File(path).openRead(); + final (streamController, subscription) = fileStream.digested(); + + await request.response.addStream(streamController.stream).then((_) { + request.response.close(); // ignore: discarded_futures + subscription.cancel(); // ignore: discarded_futures + }); + } + }); + } + + Future initializeWebSend({required List files}) async { + final webSendState = WebSendState( + sessions: {}, + files: Map.fromEntries( + await Future.wait( + files.map((file) async { + final id = _uuid.v4(); + return MapEntry( + id, + WebSendFile( + file: FileDto( + id: id, + fileName: file.name, + size: file.size, + fileType: file.fileType, + hash: null, + preview: files.first.fileType == FileType.text && files.first.bytes != null + ? utf8.decode(files.first.bytes!) // send simple message by embedding it into the preview + : null, + metadata: file.lastModified != null || file.lastAccessed != null + ? FileMetadata( + lastModified: file.lastModified, + lastAccessed: file.lastAccessed, + ) + : null, + ), + asset: file.asset, + path: file.path, + bytes: file.bytes, + ), + ); + }), + ), + ), + autoAccept: server.ref.read(settingsProvider).shareViaLinkAutoAccept, + pin: null, + pinAttempts: {}, + ); + + server.setState( + (oldState) => oldState?.copyWith( + webSendState: webSendState, + ), + ); + } + + void acceptRequest(String sessionId) { + _respondRequest(sessionId, true); + } + + void declineRequest(String sessionId) { + _respondRequest(sessionId, false); + } + + void _respondRequest(String sessionId, bool accepted) { + final controller = server.getState().webSendState?.sessions[sessionId]?.responseHandler; + if (controller == null) { + return; + } + + controller.add(accepted); + controller.close(); // ignore: discarded_futures + } +} + +extension on WebSendState { + WebSendState updateSession({ + required String sessionId, + required WebSendSession Function(WebSendSession oldSession) update, + }) { + return copyWith( + sessions: {...sessions} + ..update( + sessionId, + (session) => update(session), + ), + ); + } +} diff --git a/app/lib/provider/network/server/server_provider.dart b/app/lib/provider/network/server/server_provider.dart new file mode 100644 index 0000000..879d16d --- /dev/null +++ b/app/lib/provider/network/server/server_provider.dart @@ -0,0 +1,265 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:common/constants.dart'; +import 'package:common/isolate.dart'; +import 'package:common/model/dto/multicast_dto.dart'; +import 'package:localsend_app/model/cross_file.dart'; +import 'package:localsend_app/model/state/server/server_state.dart'; +import 'package:localsend_app/provider/network/server/controller/receive_controller.dart'; +import 'package:localsend_app/provider/network/server/controller/send_controller.dart'; +import 'package:localsend_app/provider/network/server/server_utils.dart'; +import 'package:localsend_app/provider/security_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/util/alias_generator.dart'; +import 'package:localsend_app/util/simple_server.dart'; +import 'package:logging/logging.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +final _logger = Logger('Server'); + +/// This provider runs the server and provides the current server state. +/// It is a singleton provider, so only one server can be running at a time. +/// The server state is null if the server is not running. +/// The server can receive files (since v1) and send files (since v2). +final serverProvider = NotifierProvider( + (ref) { + return ServerService(); + }, + onChanged: (_, next, ref) { + final settings = ref.read(settingsProvider); + final syncState = ref.read(parentIsolateProvider).syncState; + final syncStatePrev = (syncState.alias, syncState.port, syncState.protocol, syncState.serverRunning, syncState.download); + final syncStateNext = ( + next?.alias ?? settings.alias, + next?.port ?? settings.port, + (next?.https ?? settings.https) ? ProtocolType.https : ProtocolType.http, + next != null, + next?.webSendState != null, + ); + + if (syncStatePrev == syncStateNext) { + return; + } + + ref + .redux(parentIsolateProvider) + .dispatch( + IsolateSyncServerStateAction( + alias: syncStateNext.$1, + port: syncStateNext.$2, + protocol: syncStateNext.$3, + serverRunning: syncStateNext.$4, + download: syncStateNext.$5, + ), + ); + }, +); + +class ServerService extends Notifier { + late final _serverUtils = ServerUtils( + refFunc: () => ref, + getState: () => state!, + getStateOrNull: () => state, + setState: (builder) => state = builder(state), + ); + + late final _receiveController = ReceiveController(_serverUtils); + late final _sendController = SendController(_serverUtils); + + ServerService(); + + @override + ServerState? init() { + return null; + } + + /// Starts the server from user settings. + Future startServerFromSettings() async { + final settings = ref.read(settingsProvider); + return startServer( + alias: settings.alias, + port: settings.port, + https: settings.https, + ); + } + + /// Starts the server. + Future startServer({ + required String alias, + required int port, + required bool https, + }) async { + if (state != null) { + _logger.info('Server already running.'); + return null; + } + + alias = alias.trim(); + if (alias.isEmpty) { + alias = generateRandomAlias(); + } + + if (port < 0 || port > 65535) { + port = defaultPort; + } + + final router = SimpleServerRouteBuilder(); + final fingerprint = ref.read(securityProvider).certificateHash; + _receiveController.installRoutes( + router: router, + alias: alias, + port: port, + https: https, + fingerprint: fingerprint, + showToken: ref.read(settingsProvider).showToken, + ); + _sendController.installRoutes( + router: router, + alias: alias, + fingerprint: fingerprint, + ); + + _logger.info('Starting server...'); + + final HttpServer httpServer; + if (https) { + final securityContext = ref.read(securityProvider); + httpServer = await HttpServer.bindSecure( + '0.0.0.0', + port, + SecurityContext() + ..usePrivateKeyBytes(securityContext.privateKey.codeUnits) + ..useCertificateChainBytes(securityContext.certificate.codeUnits), + ); + _logger.info('Server started. (Port: $port, HTTPS only)'); + } else { + httpServer = await HttpServer.bind( + '0.0.0.0', + port, + ); + _logger.info('Server started. (Port: $port, HTTP only)'); + } + + final server = SimpleServer.start(server: httpServer, routes: router); + + final newServerState = ServerState( + httpServer: server, + alias: alias, + port: port, + https: https, + session: null, + webSendState: null, + pinAttempts: {}, + ); + + state = newServerState; + return newServerState; + } + + Future stopServer() async { + _logger.info('Stopping server...'); + await state?.httpServer.close(); + state = null; + _logger.info('Server stopped.'); + } + + Future restartServerFromSettings() async { + await stopServer(); + return await startServerFromSettings(); + } + + Future restartServer({required String alias, required int port, required bool https}) async { + await stopServer(); + return await startServer(alias: alias, port: port, https: https); + } + + void acceptFileRequest(Map fileNameMap) { + _receiveController.acceptFileRequest(fileNameMap); + } + + void declineFileRequest() { + _receiveController.declineFileRequest(); + } + + /// Updates the destination directory for the current session. + void setSessionDestinationDir(String destinationDirectory) { + _receiveController.setSessionDestinationDir(destinationDirectory); + } + + /// Updates the save to gallery setting for the current session. + void setSessionSaveToGallery(bool saveToGallery) { + _receiveController.setSessionSaveToGallery(saveToGallery); + } + + /// In addition to [closeSession], this method also cancels incoming requests. + void cancelSession() { + _receiveController.cancelSession(); + } + + /// Clears the session. + void closeSession() { + _receiveController.closeSession(); + } + + /// Initializes the web send state. + Future initializeWebSend(List files) async { + await _sendController.initializeWebSend(files: files); + } + + /// Updates the web send pin. + void setWebSendPin(String? pin) { + state = state?.copyWith( + webSendState: state?.webSendState?.copyWith( + pin: pin, + ), + ); + } + + /// Updates the auto accept setting for web send. + void setWebSendAutoAccept(bool autoAccept) { + state = state?.copyWith( + webSendState: state?.webSendState?.copyWith( + autoAccept: autoAccept, + ), + ); + } + + /// Accepts the web send request. + void acceptWebSendRequest(String sessionId) { + _sendController.acceptRequest(sessionId); + } + + /// Declines the web send request. + void declineWebSendRequest(String sessionId) { + _sendController.declineRequest(sessionId); + } +} + +// Below is a first prototype of mTLS (mutual TLS). +// Problem: +// - we cannot request client certificates while ignoring errors + +// Future _startServer({ +// required Router router, +// required int port, +// required SecurityContext? securityContext, +// }) async { +// const address = '0.0.0.0'; +// final server = await (securityContext == null +// ? HttpServer.bind(address, port) +// : HttpServer.bindSecure( +// address, +// port, +// securityContext, +// requestClientCertificate: true, +// )); +// +// final stream = server.map((request) { +// print('Request Cert: ${request.certificate?.pem}'); +// return request; +// }); +// +// serveRequests(stream, router); +// return server; +// } diff --git a/app/lib/provider/network/server/server_utils.dart b/app/lib/provider/network/server/server_utils.dart new file mode 100644 index 0000000..c64205b --- /dev/null +++ b/app/lib/provider/network/server/server_utils.dart @@ -0,0 +1,27 @@ +import 'package:localsend_app/model/state/server/server_state.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +/// Having this class allows us to have one parameter to access all relevant server methods. +class ServerUtils { + /// The ref to the provider. + Ref Function() refFunc; + Ref get ref => refFunc(); + + /// The current server state. + /// This should be used within route controllers because it is guaranteed to be online and therefore non-null. + ServerState Function() getState; + + /// The current server state or null. + /// This should be used outside of routes because the server may be offline. + ServerState? Function() getStateOrNull; + + /// Updates the server state. + void Function(ServerState? Function(ServerState? oldState) builder) setState; + + ServerUtils({ + required this.refFunc, + required this.getState, + required this.getStateOrNull, + required this.setState, + }); +} diff --git a/app/lib/provider/network/webrtc/signaling_provider.dart b/app/lib/provider/network/webrtc/signaling_provider.dart new file mode 100644 index 0000000..d3ffda3 --- /dev/null +++ b/app/lib/provider/network/webrtc/signaling_provider.dart @@ -0,0 +1,249 @@ +import 'dart:async'; + +import 'package:common/constants.dart'; +import 'package:common/model/device.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/provider/favorites_provider.dart'; +import 'package:localsend_app/provider/network/nearby_devices_provider.dart'; +import 'package:localsend_app/provider/network/webrtc/webrtc_receiver.dart'; +import 'package:localsend_app/provider/persistence_provider.dart'; +import 'package:localsend_app/provider/security_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/rust/api/crypto.dart' as crypto; +import 'package:localsend_app/rust/api/model.dart' as rust; +import 'package:localsend_app/rust/api/webrtc.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +part 'signaling_provider.mapper.dart'; + +@MappableClass() +class SignalingState with SignalingStateMappable { + final List signalingServers; + final List stunServers; + final Map connections; + + SignalingState({ + required this.signalingServers, + required this.stunServers, + required this.connections, + }); +} + +final signalingProvider = ReduxProvider((ref) { + return SignalingService( + persistence: ref.read(persistenceProvider), + ); +}); + +class SignalingService extends ReduxNotifier { + final PersistenceService _persistence; + + SignalingService({ + required PersistenceService persistence, + }) : _persistence = persistence; + + @override + SignalingState init() { + return SignalingState( + signalingServers: _persistence.getSignalingServers() ?? ['wss://public.localsend.org/v1/ws'], + stunServers: _persistence.getStunServers() ?? ['stun:stun.localsend.org:5349'], + connections: {}, + ); + } +} + +class SetupSignalingConnection extends ReduxAction with GlobalActions { + @override + SignalingState reduce() { + for (final signalingServer in state.signalingServers) { + // ignore: discarded_futures + global.dispatchAsync(_SetupSignalingConnection(signalingServer: signalingServer)); + } + return state; + } +} + +/// Starts an endless running action. +class _SetupSignalingConnection extends AsyncGlobalAction { + final String signalingServer; + + _SetupSignalingConnection({required this.signalingServer}); + + @override + Future reduce() async { + final settings = ref.read(settingsProvider); + final deviceInfo = ref.read(deviceInfoProvider); + + // TODO: Use persistent key + final key = await crypto.generateKeyPair(); + if (kDebugMode) { + print('private key: ${key.privateKey}'); + } + + LsSignalingConnection? connection; + final stream = connect( + uri: 'wss://public.localsend.org/v1/ws', + info: ProposingClientInfo( + alias: settings.alias, + version: protocolVersion, + deviceModel: deviceInfo.deviceModel, + deviceType: deviceInfo.deviceType.toRustDeviceType(), + ), + privateKey: key.privateKey, + onConnection: (c) { + connection = c; + + ref + .redux(signalingProvider) + .dispatch( + _SetConnectionAction( + signalingServer: signalingServer, + connection: c, + ), + ); + }, + ); + + try { + await for (final message in stream) { + switch (message) { + case WsServerMessage_Hello(): + for (final d in message.peers) { + ref + .redux(nearbyDevicesProvider) + .dispatch( + RegisterSignalingDeviceAction( + d.toDevice(signalingServer), + ), + ); + } + break; + case WsServerMessage_Join(peer: final peer): + case WsServerMessage_Update(peer: final peer): + ref + .redux(nearbyDevicesProvider) + .dispatch( + RegisterSignalingDeviceAction( + peer.toDevice(signalingServer), + ), + ); + break; + case WsServerMessage_Left(): + ref + .redux(nearbyDevicesProvider) + .dispatch( + UnregisterSignalingDeviceAction( + message.peerId.uuid, + ), + ); + break; + case WsServerMessage_Offer(): + final provider = ReduxProvider((ref) { + return WebRTCReceiveService( + signalingServer: signalingServer, + stunServers: ref.read(signalingProvider).stunServers, + connection: connection!, + offer: message.field0, + settings: ref.read(settingsProvider), + favorites: ref.read(favoritesProvider), + key: ref.read(securityProvider), + ); + }); + + await ref.redux(provider).dispatchAsync(AcceptOfferAction()); + break; + case WsServerMessage_Answer(): + case WsServerMessage_Error(): + } + } + } finally { + ref.redux(signalingProvider).dispatch(_RemoveConnectionAction(signalingServer: signalingServer)); + } + + return state; + } +} + +class _SetConnectionAction extends ReduxAction { + final String signalingServer; + final LsSignalingConnection connection; + + _SetConnectionAction({ + required this.signalingServer, + required this.connection, + }); + + @override + SignalingState reduce() { + return state.copyWith( + connections: { + ...state.connections, + signalingServer: connection, + }, + ); + } +} + +class _RemoveConnectionAction extends ReduxAction { + final String signalingServer; + + _RemoveConnectionAction({required this.signalingServer}); + + @override + SignalingState reduce() { + return state.copyWith( + connections: { + for (final entry in state.connections.entries) + if (entry.key != signalingServer) entry.key: entry.value, + }, + ); + } +} + +extension ClientInfoExt on ClientInfo { + Device toDevice(String signalingServer) { + return Device( + signalingId: id.uuid, + ip: null, + version: version, + port: -1, + https: false, + fingerprint: token, + alias: alias, + deviceModel: deviceModel, + deviceType: deviceType?.toDeviceType() ?? DeviceType.desktop, + download: false, + discoveryMethods: { + SignalingDiscovery( + signalingServer: signalingServer, + ), + }, + ); + } +} + +extension on rust.DeviceType { + DeviceType toDeviceType() { + return switch (this) { + rust.DeviceType.mobile => DeviceType.mobile, + rust.DeviceType.desktop => DeviceType.desktop, + rust.DeviceType.web => DeviceType.web, + rust.DeviceType.headless => DeviceType.headless, + rust.DeviceType.server => DeviceType.server, + }; + } +} + +extension on DeviceType { + rust.DeviceType toRustDeviceType() { + return switch (this) { + DeviceType.mobile => rust.DeviceType.mobile, + DeviceType.desktop => rust.DeviceType.desktop, + DeviceType.web => rust.DeviceType.web, + DeviceType.headless => rust.DeviceType.headless, + DeviceType.server => rust.DeviceType.server, + }; + } +} diff --git a/app/lib/provider/network/webrtc/signaling_provider.mapper.dart b/app/lib/provider/network/webrtc/signaling_provider.mapper.dart new file mode 100644 index 0000000..967e3b0 --- /dev/null +++ b/app/lib/provider/network/webrtc/signaling_provider.mapper.dart @@ -0,0 +1,196 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'signaling_provider.dart'; + +class SignalingStateMapper extends ClassMapperBase { + SignalingStateMapper._(); + + static SignalingStateMapper? _instance; + static SignalingStateMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = SignalingStateMapper._()); + } + return _instance!; + } + + @override + final String id = 'SignalingState'; + + static List _$signalingServers(SignalingState v) => + v.signalingServers; + static const Field> _f$signalingServers = Field( + 'signalingServers', + _$signalingServers, + ); + static List _$stunServers(SignalingState v) => v.stunServers; + static const Field> _f$stunServers = Field( + 'stunServers', + _$stunServers, + ); + static Map _$connections(SignalingState v) => + v.connections; + static const Field> + _f$connections = Field('connections', _$connections); + + @override + final MappableFields fields = const { + #signalingServers: _f$signalingServers, + #stunServers: _f$stunServers, + #connections: _f$connections, + }; + + static SignalingState _instantiate(DecodingData data) { + return SignalingState( + signalingServers: data.dec(_f$signalingServers), + stunServers: data.dec(_f$stunServers), + connections: data.dec(_f$connections), + ); + } + + @override + final Function instantiate = _instantiate; + + static SignalingState fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static SignalingState deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin SignalingStateMappable { + String serialize() { + return SignalingStateMapper.ensureInitialized().encodeJson( + this as SignalingState, + ); + } + + Map toJson() { + return SignalingStateMapper.ensureInitialized().encodeMap( + this as SignalingState, + ); + } + + SignalingStateCopyWith + get copyWith => _SignalingStateCopyWithImpl( + this as SignalingState, + $identity, + $identity, + ); + @override + String toString() { + return SignalingStateMapper.ensureInitialized().stringifyValue( + this as SignalingState, + ); + } + + @override + bool operator ==(Object other) { + return SignalingStateMapper.ensureInitialized().equalsValue( + this as SignalingState, + other, + ); + } + + @override + int get hashCode { + return SignalingStateMapper.ensureInitialized().hashValue( + this as SignalingState, + ); + } +} + +extension SignalingStateValueCopy<$R, $Out> + on ObjectCopyWith<$R, SignalingState, $Out> { + SignalingStateCopyWith<$R, SignalingState, $Out> get $asSignalingState => + $base.as((v, t, t2) => _SignalingStateCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class SignalingStateCopyWith<$R, $In extends SignalingState, $Out> + implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>> + get signalingServers; + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>> get stunServers; + MapCopyWith< + $R, + String, + LsSignalingConnection, + ObjectCopyWith<$R, LsSignalingConnection, LsSignalingConnection> + > + get connections; + $R call({ + List? signalingServers, + List? stunServers, + Map? connections, + }); + SignalingStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ); +} + +class _SignalingStateCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, SignalingState, $Out> + implements SignalingStateCopyWith<$R, SignalingState, $Out> { + _SignalingStateCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + SignalingStateMapper.ensureInitialized(); + @override + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>> + get signalingServers => ListCopyWith( + $value.signalingServers, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(signalingServers: v), + ); + @override + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>> + get stunServers => ListCopyWith( + $value.stunServers, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(stunServers: v), + ); + @override + MapCopyWith< + $R, + String, + LsSignalingConnection, + ObjectCopyWith<$R, LsSignalingConnection, LsSignalingConnection> + > + get connections => MapCopyWith( + $value.connections, + (v, t) => ObjectCopyWith(v, $identity, t), + (v) => call(connections: v), + ); + @override + $R call({ + List? signalingServers, + List? stunServers, + Map? connections, + }) => $apply( + FieldCopyWithData({ + if (signalingServers != null) #signalingServers: signalingServers, + if (stunServers != null) #stunServers: stunServers, + if (connections != null) #connections: connections, + }), + ); + @override + SignalingState $make(CopyWithData data) => SignalingState( + signalingServers: data.get(#signalingServers, or: $value.signalingServers), + stunServers: data.get(#stunServers, or: $value.stunServers), + connections: data.get(#connections, or: $value.connections), + ); + + @override + SignalingStateCopyWith<$R2, SignalingState, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _SignalingStateCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/provider/network/webrtc/webrtc_receiver.dart b/app/lib/provider/network/webrtc/webrtc_receiver.dart new file mode 100644 index 0000000..18efad3 --- /dev/null +++ b/app/lib/provider/network/webrtc/webrtc_receiver.dart @@ -0,0 +1,210 @@ +import 'package:common/model/dto/file_dto.dart' as dart_model; +import 'package:common/model/session_status.dart'; +import 'package:common/model/stored_security_context.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:localsend_app/model/persistence/favorite_device.dart'; +import 'package:localsend_app/model/state/server/receive_session_state.dart'; +import 'package:localsend_app/model/state/settings_state.dart'; +import 'package:localsend_app/pages/receive_page.dart'; +import 'package:localsend_app/provider/network/webrtc/signaling_provider.dart'; +import 'package:localsend_app/rust/api/model.dart'; +import 'package:localsend_app/rust/api/webrtc.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +part 'webrtc_receiver.mapper.dart'; + +@MappableClass() +class WebRTCReceiveState with WebRTCReceiveStateMappable { + final LsSignalingConnection connection; + final WsServerSdpMessage offer; + final RTCStatus? status; + final RtcReceiveController? controller; + final ReceiveSessionState? sessionState; + + const WebRTCReceiveState({ + required this.connection, + required this.offer, + required this.status, + required this.controller, + required this.sessionState, + }); +} + +class WebRTCReceiveService extends ReduxNotifier { + final String _signalingServer; + final List _stunServers; + final LsSignalingConnection _connection; + final WsServerSdpMessage _offer; + final StoredSecurityContext _key; + + WebRTCReceiveService({ + required String signalingServer, + required List stunServers, + required LsSignalingConnection connection, + required WsServerSdpMessage offer, + required SettingsState settings, + required List favorites, + required StoredSecurityContext key, + }) : _signalingServer = signalingServer, + _stunServers = stunServers, + _connection = connection, + _offer = offer, + _key = key; + + @override + WebRTCReceiveState init() { + return WebRTCReceiveState( + connection: _connection, + offer: _offer, + status: null, + controller: null, + sessionState: null, + ); + } +} + +class AcceptOfferAction extends AsyncReduxAction { + @override + Future reduce() async { + final controller = await state.connection.acceptOffer( + stunServers: notifier._stunServers, + offer: state.offer, + privateKey: notifier._key.privateKey, + ); + + controller.listenStatus().listen((status) { + dispatch(_SetStatusAction(status)); + }); + + return state.copyWith( + controller: controller, + ); + } + + @override + void after() { + // ignore: discarded_futures + dispatchAsync(_AcceptOfferAction()); + } +} + +class _AcceptOfferAction extends AsyncReduxAction { + @override + Future reduce() async { + final controller = state.controller; + if (controller == null) { + return state; + } + + final files = await controller.listenFiles(); + final convertedFiles = files.map((e) => e.toFileDto()).toList(); + dispatch(_InitSessionState(convertedFiles)); + + final vm = ViewProvider((ref) { + final state = ref.watch(notifier.provider as ReduxProvider); + return ReceivePageVm( + status: switch (state.status) { + null => SessionStatus.waiting, + RTCStatus_SdpExchanged() => SessionStatus.waiting, + RTCStatus_Connected() => SessionStatus.waiting, + RTCStatus_PinRequired() => SessionStatus.waiting, + RTCStatus_TooManyAttempts() => SessionStatus.tooManyAttempts, + RTCStatus_Declined() => SessionStatus.declined, + RTCStatus_Sending() => SessionStatus.sending, + RTCStatus_Finished() => SessionStatus.finished, + RTCStatus_Error() => SessionStatus.finishedWithErrors, + }, + sender: state.offer.peer.toDevice(notifier._signalingServer), + showSenderInfo: true, + files: convertedFiles, + message: files.length == 1 && files[0].fileType.startsWith('text/') ? files[0].preview : null, + onAccept: () {}, + onDecline: () {}, + onClose: () {}, + ); + }); + + // ignore: unawaited_futures, use_build_context_synchronously + Routerino.context.push(() => ReceivePage(vm)); + + return state.copyWith( + controller: controller, + ); + } +} + +class _InitSessionState extends ReduxAction { + final List files; + + _InitSessionState(this.files); + + @override + WebRTCReceiveState reduce() { + return state; + // TODO + // return state.copyWith( + // sessionState: ReceiveSessionState( + // sessionId: state.offer.sessionId, + // status: SessionStatus.waiting, + // sender: state.offer.peer.toDevice(notifier._signalingServer), + // senderAlias: notifier._favorites.firstWhereOrNull((e) => e.fingerprint == notifier.info.fingerprint)?.alias ?? dto.info.alias, + // files: { + // for (final file in files) + // file.id: ReceivingFile( + // file: file, + // status: FileStatus.queue, + // token: null, + // desiredName: null, + // path: null, + // savedToGallery: false, + // errorMessage: null, + // ), + // }, + // startTime: null, + // endTime: null, + // destinationDirectory: destinationDir, + // cacheDirectory: cacheDir, + // saveToGallery: checkPlatformWithGallery() && settings.saveToGallery && dto.files.values.every((f) => !f.fileName.contains('/')), + // createdDirectories: {}, + // responseHandler: streamController, + // ), + // ); + } +} + +class _SetStatusAction extends ReduxAction { + final RTCStatus status; + + _SetStatusAction(this.status); + + @override + WebRTCReceiveState reduce() { + return state.copyWith( + status: status, + ); + } +} + +extension on FileDto { + dart_model.FileDto toFileDto() { + return dart_model.FileDto( + id: id, + fileName: fileName, + size: size.toInt(), + fileType: dart_model.decodeFromMime(fileType), + hash: null, + preview: preview, + metadata: metadata?.toFileMetadata(), + ); + } +} + +extension on FileMetadata { + dart_model.FileMetadata toFileMetadata() { + return dart_model.FileMetadata( + lastModified: DateTime.tryParse(modified ?? ''), + lastAccessed: DateTime.tryParse(accessed ?? ''), + ); + } +} diff --git a/app/lib/provider/network/webrtc/webrtc_receiver.mapper.dart b/app/lib/provider/network/webrtc/webrtc_receiver.mapper.dart new file mode 100644 index 0000000..630e9d8 --- /dev/null +++ b/app/lib/provider/network/webrtc/webrtc_receiver.mapper.dart @@ -0,0 +1,195 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'webrtc_receiver.dart'; + +class WebRTCReceiveStateMapper extends ClassMapperBase { + WebRTCReceiveStateMapper._(); + + static WebRTCReceiveStateMapper? _instance; + static WebRTCReceiveStateMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = WebRTCReceiveStateMapper._()); + ReceiveSessionStateMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'WebRTCReceiveState'; + + static LsSignalingConnection _$connection(WebRTCReceiveState v) => + v.connection; + static const Field _f$connection = + Field('connection', _$connection); + static WsServerSdpMessage _$offer(WebRTCReceiveState v) => v.offer; + static const Field _f$offer = Field( + 'offer', + _$offer, + ); + static RTCStatus? _$status(WebRTCReceiveState v) => v.status; + static const Field _f$status = Field( + 'status', + _$status, + ); + static RtcReceiveController? _$controller(WebRTCReceiveState v) => + v.controller; + static const Field _f$controller = + Field('controller', _$controller); + static ReceiveSessionState? _$sessionState(WebRTCReceiveState v) => + v.sessionState; + static const Field _f$sessionState = + Field('sessionState', _$sessionState); + + @override + final MappableFields fields = const { + #connection: _f$connection, + #offer: _f$offer, + #status: _f$status, + #controller: _f$controller, + #sessionState: _f$sessionState, + }; + + static WebRTCReceiveState _instantiate(DecodingData data) { + return WebRTCReceiveState( + connection: data.dec(_f$connection), + offer: data.dec(_f$offer), + status: data.dec(_f$status), + controller: data.dec(_f$controller), + sessionState: data.dec(_f$sessionState), + ); + } + + @override + final Function instantiate = _instantiate; + + static WebRTCReceiveState fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static WebRTCReceiveState deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin WebRTCReceiveStateMappable { + String serialize() { + return WebRTCReceiveStateMapper.ensureInitialized() + .encodeJson(this as WebRTCReceiveState); + } + + Map toJson() { + return WebRTCReceiveStateMapper.ensureInitialized() + .encodeMap(this as WebRTCReceiveState); + } + + WebRTCReceiveStateCopyWith< + WebRTCReceiveState, + WebRTCReceiveState, + WebRTCReceiveState + > + get copyWith => + _WebRTCReceiveStateCopyWithImpl( + this as WebRTCReceiveState, + $identity, + $identity, + ); + @override + String toString() { + return WebRTCReceiveStateMapper.ensureInitialized().stringifyValue( + this as WebRTCReceiveState, + ); + } + + @override + bool operator ==(Object other) { + return WebRTCReceiveStateMapper.ensureInitialized().equalsValue( + this as WebRTCReceiveState, + other, + ); + } + + @override + int get hashCode { + return WebRTCReceiveStateMapper.ensureInitialized().hashValue( + this as WebRTCReceiveState, + ); + } +} + +extension WebRTCReceiveStateValueCopy<$R, $Out> + on ObjectCopyWith<$R, WebRTCReceiveState, $Out> { + WebRTCReceiveStateCopyWith<$R, WebRTCReceiveState, $Out> + get $asWebRTCReceiveState => $base.as( + (v, t, t2) => _WebRTCReceiveStateCopyWithImpl<$R, $Out>(v, t, t2), + ); +} + +abstract class WebRTCReceiveStateCopyWith< + $R, + $In extends WebRTCReceiveState, + $Out +> + implements ClassCopyWith<$R, $In, $Out> { + ReceiveSessionStateCopyWith<$R, ReceiveSessionState, ReceiveSessionState>? + get sessionState; + $R call({ + LsSignalingConnection? connection, + WsServerSdpMessage? offer, + RTCStatus? status, + RtcReceiveController? controller, + ReceiveSessionState? sessionState, + }); + WebRTCReceiveStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ); +} + +class _WebRTCReceiveStateCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, WebRTCReceiveState, $Out> + implements WebRTCReceiveStateCopyWith<$R, WebRTCReceiveState, $Out> { + _WebRTCReceiveStateCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + WebRTCReceiveStateMapper.ensureInitialized(); + @override + ReceiveSessionStateCopyWith<$R, ReceiveSessionState, ReceiveSessionState>? + get sessionState => + $value.sessionState?.copyWith.$chain((v) => call(sessionState: v)); + @override + $R call({ + LsSignalingConnection? connection, + WsServerSdpMessage? offer, + Object? status = $none, + Object? controller = $none, + Object? sessionState = $none, + }) => $apply( + FieldCopyWithData({ + if (connection != null) #connection: connection, + if (offer != null) #offer: offer, + if (status != $none) #status: status, + if (controller != $none) #controller: controller, + if (sessionState != $none) #sessionState: sessionState, + }), + ); + @override + WebRTCReceiveState $make(CopyWithData data) => WebRTCReceiveState( + connection: data.get(#connection, or: $value.connection), + offer: data.get(#offer, or: $value.offer), + status: data.get(#status, or: $value.status), + controller: data.get(#controller, or: $value.controller), + sessionState: data.get(#sessionState, or: $value.sessionState), + ); + + @override + WebRTCReceiveStateCopyWith<$R2, WebRTCReceiveState, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _WebRTCReceiveStateCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/provider/param/apk_provider_param.dart b/app/lib/provider/param/apk_provider_param.dart new file mode 100644 index 0000000..5b7fe65 --- /dev/null +++ b/app/lib/provider/param/apk_provider_param.dart @@ -0,0 +1,18 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +part 'apk_provider_param.mapper.dart'; + +@MappableClass() +class ApkProviderParam with ApkProviderParamMappable { + final String query; + final bool includeSystemApps; + final bool onlyAppsWithLaunchIntent; + bool selectMultipleApps; + + ApkProviderParam({ + required this.query, + required this.includeSystemApps, + required this.onlyAppsWithLaunchIntent, + this.selectMultipleApps = false, + }); +} diff --git a/app/lib/provider/param/apk_provider_param.mapper.dart b/app/lib/provider/param/apk_provider_param.mapper.dart new file mode 100644 index 0000000..9c6899a --- /dev/null +++ b/app/lib/provider/param/apk_provider_param.mapper.dart @@ -0,0 +1,182 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'apk_provider_param.dart'; + +class ApkProviderParamMapper extends ClassMapperBase { + ApkProviderParamMapper._(); + + static ApkProviderParamMapper? _instance; + static ApkProviderParamMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = ApkProviderParamMapper._()); + } + return _instance!; + } + + @override + final String id = 'ApkProviderParam'; + + static String _$query(ApkProviderParam v) => v.query; + static const Field _f$query = Field( + 'query', + _$query, + ); + static bool _$includeSystemApps(ApkProviderParam v) => v.includeSystemApps; + static const Field _f$includeSystemApps = Field( + 'includeSystemApps', + _$includeSystemApps, + ); + static bool _$onlyAppsWithLaunchIntent(ApkProviderParam v) => + v.onlyAppsWithLaunchIntent; + static const Field _f$onlyAppsWithLaunchIntent = + Field('onlyAppsWithLaunchIntent', _$onlyAppsWithLaunchIntent); + static bool _$selectMultipleApps(ApkProviderParam v) => v.selectMultipleApps; + static const Field _f$selectMultipleApps = Field( + 'selectMultipleApps', + _$selectMultipleApps, + opt: true, + def: false, + ); + + @override + final MappableFields fields = const { + #query: _f$query, + #includeSystemApps: _f$includeSystemApps, + #onlyAppsWithLaunchIntent: _f$onlyAppsWithLaunchIntent, + #selectMultipleApps: _f$selectMultipleApps, + }; + + static ApkProviderParam _instantiate(DecodingData data) { + return ApkProviderParam( + query: data.dec(_f$query), + includeSystemApps: data.dec(_f$includeSystemApps), + onlyAppsWithLaunchIntent: data.dec(_f$onlyAppsWithLaunchIntent), + selectMultipleApps: data.dec(_f$selectMultipleApps), + ); + } + + @override + final Function instantiate = _instantiate; + + static ApkProviderParam fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static ApkProviderParam deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin ApkProviderParamMappable { + String serialize() { + return ApkProviderParamMapper.ensureInitialized() + .encodeJson(this as ApkProviderParam); + } + + Map toJson() { + return ApkProviderParamMapper.ensureInitialized() + .encodeMap(this as ApkProviderParam); + } + + ApkProviderParamCopyWith + get copyWith => + _ApkProviderParamCopyWithImpl( + this as ApkProviderParam, + $identity, + $identity, + ); + @override + String toString() { + return ApkProviderParamMapper.ensureInitialized().stringifyValue( + this as ApkProviderParam, + ); + } + + @override + bool operator ==(Object other) { + return ApkProviderParamMapper.ensureInitialized().equalsValue( + this as ApkProviderParam, + other, + ); + } + + @override + int get hashCode { + return ApkProviderParamMapper.ensureInitialized().hashValue( + this as ApkProviderParam, + ); + } +} + +extension ApkProviderParamValueCopy<$R, $Out> + on ObjectCopyWith<$R, ApkProviderParam, $Out> { + ApkProviderParamCopyWith<$R, ApkProviderParam, $Out> + get $asApkProviderParam => + $base.as((v, t, t2) => _ApkProviderParamCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class ApkProviderParamCopyWith<$R, $In extends ApkProviderParam, $Out> + implements ClassCopyWith<$R, $In, $Out> { + $R call({ + String? query, + bool? includeSystemApps, + bool? onlyAppsWithLaunchIntent, + bool? selectMultipleApps, + }); + ApkProviderParamCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ); +} + +class _ApkProviderParamCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, ApkProviderParam, $Out> + implements ApkProviderParamCopyWith<$R, ApkProviderParam, $Out> { + _ApkProviderParamCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + ApkProviderParamMapper.ensureInitialized(); + @override + $R call({ + String? query, + bool? includeSystemApps, + bool? onlyAppsWithLaunchIntent, + bool? selectMultipleApps, + }) => $apply( + FieldCopyWithData({ + if (query != null) #query: query, + if (includeSystemApps != null) #includeSystemApps: includeSystemApps, + if (onlyAppsWithLaunchIntent != null) + #onlyAppsWithLaunchIntent: onlyAppsWithLaunchIntent, + if (selectMultipleApps != null) #selectMultipleApps: selectMultipleApps, + }), + ); + @override + ApkProviderParam $make(CopyWithData data) => ApkProviderParam( + query: data.get(#query, or: $value.query), + includeSystemApps: data.get( + #includeSystemApps, + or: $value.includeSystemApps, + ), + onlyAppsWithLaunchIntent: data.get( + #onlyAppsWithLaunchIntent, + or: $value.onlyAppsWithLaunchIntent, + ), + selectMultipleApps: data.get( + #selectMultipleApps, + or: $value.selectMultipleApps, + ), + ); + + @override + ApkProviderParamCopyWith<$R2, ApkProviderParam, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _ApkProviderParamCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/provider/param/cached_apk_provider_param.dart b/app/lib/provider/param/cached_apk_provider_param.dart new file mode 100644 index 0000000..2a9bfd8 --- /dev/null +++ b/app/lib/provider/param/cached_apk_provider_param.dart @@ -0,0 +1,16 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +part 'cached_apk_provider_param.mapper.dart'; + +@MappableClass() +class CachedApkProviderParam with CachedApkProviderParamMappable { + final bool includeSystemApps; + final bool onlyAppsWithLaunchIntent; + bool selectMultipleApps; + + CachedApkProviderParam({ + required this.includeSystemApps, + required this.onlyAppsWithLaunchIntent, + this.selectMultipleApps = false, + }); +} diff --git a/app/lib/provider/param/cached_apk_provider_param.mapper.dart b/app/lib/provider/param/cached_apk_provider_param.mapper.dart new file mode 100644 index 0000000..227da7b --- /dev/null +++ b/app/lib/provider/param/cached_apk_provider_param.mapper.dart @@ -0,0 +1,179 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'cached_apk_provider_param.dart'; + +class CachedApkProviderParamMapper + extends ClassMapperBase { + CachedApkProviderParamMapper._(); + + static CachedApkProviderParamMapper? _instance; + static CachedApkProviderParamMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = CachedApkProviderParamMapper._()); + } + return _instance!; + } + + @override + final String id = 'CachedApkProviderParam'; + + static bool _$includeSystemApps(CachedApkProviderParam v) => + v.includeSystemApps; + static const Field _f$includeSystemApps = Field( + 'includeSystemApps', + _$includeSystemApps, + ); + static bool _$onlyAppsWithLaunchIntent(CachedApkProviderParam v) => + v.onlyAppsWithLaunchIntent; + static const Field _f$onlyAppsWithLaunchIntent = + Field('onlyAppsWithLaunchIntent', _$onlyAppsWithLaunchIntent); + static bool _$selectMultipleApps(CachedApkProviderParam v) => + v.selectMultipleApps; + static const Field _f$selectMultipleApps = + Field('selectMultipleApps', _$selectMultipleApps, opt: true, def: false); + + @override + final MappableFields fields = const { + #includeSystemApps: _f$includeSystemApps, + #onlyAppsWithLaunchIntent: _f$onlyAppsWithLaunchIntent, + #selectMultipleApps: _f$selectMultipleApps, + }; + + static CachedApkProviderParam _instantiate(DecodingData data) { + return CachedApkProviderParam( + includeSystemApps: data.dec(_f$includeSystemApps), + onlyAppsWithLaunchIntent: data.dec(_f$onlyAppsWithLaunchIntent), + selectMultipleApps: data.dec(_f$selectMultipleApps), + ); + } + + @override + final Function instantiate = _instantiate; + + static CachedApkProviderParam fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static CachedApkProviderParam deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin CachedApkProviderParamMappable { + String serialize() { + return CachedApkProviderParamMapper.ensureInitialized() + .encodeJson(this as CachedApkProviderParam); + } + + Map toJson() { + return CachedApkProviderParamMapper.ensureInitialized() + .encodeMap(this as CachedApkProviderParam); + } + + CachedApkProviderParamCopyWith< + CachedApkProviderParam, + CachedApkProviderParam, + CachedApkProviderParam + > + get copyWith => + _CachedApkProviderParamCopyWithImpl< + CachedApkProviderParam, + CachedApkProviderParam + >(this as CachedApkProviderParam, $identity, $identity); + @override + String toString() { + return CachedApkProviderParamMapper.ensureInitialized().stringifyValue( + this as CachedApkProviderParam, + ); + } + + @override + bool operator ==(Object other) { + return CachedApkProviderParamMapper.ensureInitialized().equalsValue( + this as CachedApkProviderParam, + other, + ); + } + + @override + int get hashCode { + return CachedApkProviderParamMapper.ensureInitialized().hashValue( + this as CachedApkProviderParam, + ); + } +} + +extension CachedApkProviderParamValueCopy<$R, $Out> + on ObjectCopyWith<$R, CachedApkProviderParam, $Out> { + CachedApkProviderParamCopyWith<$R, CachedApkProviderParam, $Out> + get $asCachedApkProviderParam => $base.as( + (v, t, t2) => _CachedApkProviderParamCopyWithImpl<$R, $Out>(v, t, t2), + ); +} + +abstract class CachedApkProviderParamCopyWith< + $R, + $In extends CachedApkProviderParam, + $Out +> + implements ClassCopyWith<$R, $In, $Out> { + $R call({ + bool? includeSystemApps, + bool? onlyAppsWithLaunchIntent, + bool? selectMultipleApps, + }); + CachedApkProviderParamCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ); +} + +class _CachedApkProviderParamCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, CachedApkProviderParam, $Out> + implements + CachedApkProviderParamCopyWith<$R, CachedApkProviderParam, $Out> { + _CachedApkProviderParamCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + CachedApkProviderParamMapper.ensureInitialized(); + @override + $R call({ + bool? includeSystemApps, + bool? onlyAppsWithLaunchIntent, + bool? selectMultipleApps, + }) => $apply( + FieldCopyWithData({ + if (includeSystemApps != null) #includeSystemApps: includeSystemApps, + if (onlyAppsWithLaunchIntent != null) + #onlyAppsWithLaunchIntent: onlyAppsWithLaunchIntent, + if (selectMultipleApps != null) #selectMultipleApps: selectMultipleApps, + }), + ); + @override + CachedApkProviderParam $make(CopyWithData data) => CachedApkProviderParam( + includeSystemApps: data.get( + #includeSystemApps, + or: $value.includeSystemApps, + ), + onlyAppsWithLaunchIntent: data.get( + #onlyAppsWithLaunchIntent, + or: $value.onlyAppsWithLaunchIntent, + ), + selectMultipleApps: data.get( + #selectMultipleApps, + or: $value.selectMultipleApps, + ), + ); + + @override + CachedApkProviderParamCopyWith<$R2, CachedApkProviderParam, $Out2> + $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _CachedApkProviderParamCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/provider/persistence_provider.dart b/app/lib/provider/persistence_provider.dart new file mode 100644 index 0000000..7d776ba --- /dev/null +++ b/app/lib/provider/persistence_provider.dart @@ -0,0 +1,552 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:collection/collection.dart'; +import 'package:common/constants.dart'; +import 'package:common/model/device.dart'; +import 'package:common/model/stored_security_context.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/persistence/color_mode.dart'; +import 'package:localsend_app/model/persistence/favorite_device.dart'; +import 'package:localsend_app/model/persistence/receive_history_entry.dart'; +import 'package:localsend_app/model/send_mode.dart'; +import 'package:localsend_app/provider/window_dimensions_provider.dart'; +import 'package:localsend_app/util/alias_generator.dart'; +import 'package:localsend_app/util/native/autostart_helper.dart'; +import 'package:localsend_app/util/native/context_menu_helper.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/util/security_helper.dart'; +import 'package:localsend_app/util/shared_preferences/shared_preferences_file.dart'; +import 'package:localsend_app/util/shared_preferences/shared_preferences_portable.dart'; +import 'package:localsend_app/util/ui/animations_status.dart'; +import 'package:logging/logging.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart'; +import 'package:uuid/uuid.dart'; + +part 'persistence_provider_migrations.dart'; + +final _logger = Logger('PersistenceService'); + +String get _windowsFile { + final appData = Platform.environment['APPDATA']; + return '$appData\\LocalSend\\settings.json'; +} + +String get _windowsLegacyFile { + final appData = Platform.environment['APPDATA']; + return '$appData\\org.localsend\\localsend_app\\shared_preferences.json'; +} + +// Version of the storage +const _version = 'ls_version'; + +// Security keys (generated on first app start) +const _securityContext = 'ls_security_context'; + +// WebRTC +const _signalingServers = 'ls_signaling_servers'; +const _stunServers = 'ls_stun_servers'; + +// Received file history +const _receiveHistory = 'ls_receive_history'; + +// Favorites +const _favorites = 'ls_favorites'; + +// App Window Offset and Size info +const _windowOffsetX = 'ls_window_offset_x'; +const _windowOffsetY = 'ls_window_offset_y'; +const _windowWidth = 'ls_window_width'; +const _windowHeight = 'ls_window_height'; +const _saveWindowPlacement = 'ls_save_window_placement'; + +// Settings +const _showToken = 'ls_show_token'; +const _aliasKey = 'ls_alias'; +const _themeKey = 'ls_theme'; // now called brightness +const _colorKey = 'ls_color'; +const _localeKey = 'ls_locale'; +const _portKey = 'ls_port'; +const _networkWhitelistKey = 'ls_network_whitelist'; +const _networkBlacklistKey = 'ls_network_blacklist'; +const _timeoutKey = 'ls_timeout'; +const _multicastGroupKey = 'ls_multicast_group'; +const _destinationKey = 'ls_destination'; +const _saveToGallery = 'ls_save_to_gallery'; +const _saveToHistory = 'ls_save_to_history'; +const _quickSave = 'ls_quick_save'; +const _quickSaveFromFavorites = 'ls_quick_save_from_favorites'; +const _receivePin = 'ls_receive_pin'; +const _autoFinish = 'ls_auto_finish'; +const _minimizeToTray = 'ls_minimize_to_tray'; +const _https = 'ls_https'; +const _sendMode = 'ls_send_mode'; +const _enableAnimations = 'ls_enable_animations'; +const _deviceType = 'ls_device_type'; +const _deviceModel = 'ls_device_model'; +const _shareViaLinkAutoAccept = 'ls_share_via_link_auto_accept'; +const _advancedSettingsKey = 'ls_advanced_settings'; + +final persistenceProvider = Provider((ref) { + throw Exception('persistenceProvider not initialized'); +}); + +/// This service abstracts the persistence layer. +class PersistenceService { + final SharedPreferences _prefs; + final bool isFirstAppStart; + + PersistenceService._(this._prefs, this.isFirstAppStart); + + static Future initialize({ + required bool supportsDynamicColors, + }) async { + SharedPreferences prefs; + + final portableStore = SharedPreferencesPortable(); + bool usingLegacyStore = false; + if (checkPlatform(const [TargetPlatform.windows, TargetPlatform.linux, TargetPlatform.macOS]) && portableStore.exists()) { + _logger.info('Using portable settings.'); + SharedPreferencesStorePlatform.instance = portableStore; + } else if (defaultTargetPlatform == TargetPlatform.windows) { + final legacyStore = SharedPreferencesFile(filePath: _windowsLegacyFile); + if (legacyStore.exists()) { + _logger.info('Using legacy settings. Will migrate in the next step.'); + SharedPreferencesStorePlatform.instance = legacyStore; + usingLegacyStore = true; + } else { + SharedPreferencesStorePlatform.instance = SharedPreferencesFile(filePath: _windowsFile); + } + } + + final bool isFirstAppStart; + final existingVersion = (await SharedPreferencesStorePlatform.instance.getAll())['flutter.$_version'] as int?; + _logger.info('Existing version: $existingVersion'); + if (existingVersion == null && !usingLegacyStore) { + isFirstAppStart = true; + await SharedPreferencesStorePlatform.instance.setValue('Int', 'flutter.$_version', _latestVersion); + } else { + isFirstAppStart = false; + final fromVersion = existingVersion ?? 1; + if (fromVersion < _latestVersion) { + await _runMigrations(fromVersion); + } + } + + try { + prefs = await SharedPreferences.getInstance(); + } catch (e) { + if (checkPlatform([TargetPlatform.windows])) { + _logger.info('Could not initialize SharedPreferences, trying to delete corrupted settings file', e); + File(_windowsFile).deleteSync(); + prefs = await SharedPreferences.getInstance(); + } else { + throw Exception('Could not initialize SharedPreferences'); + } + } + + // Locale configuration upon persistence initialisation to prevent unlocalised Alias generation + final persistedLocale = prefs.getString(_localeKey); + if (persistedLocale == null) { + await LocaleSettings.useDeviceLocale(); + } else { + await LocaleSettings.setLocaleRaw(persistedLocale); + } + + if (prefs.getString(_showToken) == null) { + await prefs.setString(_showToken, const Uuid().v4()); + } + + if (prefs.getString(_aliasKey) == null) { + await prefs.setString(_aliasKey, generateRandomAlias()); + } + + if (prefs.getString(_securityContext) == null) { + await prefs.setString(_securityContext, jsonEncode(generateSecurityContext())); + } + + if (isFirstAppStart) { + final systemAnimations = await getSystemAnimationsStatus(); + if (!systemAnimations) { + _logger.info('System animations are disabled, disabling animations in the app.'); + await prefs.setBool(_enableAnimations, false); + } + } + + if (prefs.getString(_colorKey) == null) { + await _initColorSetting(prefs, supportsDynamicColors); + } else { + // fix when device does not support dynamic colors + final supported = supportsDynamicColors ? ColorMode.values : ColorMode.values.where((e) => e != ColorMode.system); + final colorMode = supported.firstWhereOrNull((color) => color.name == prefs.getString(_colorKey)); + if (colorMode == null) { + await _initColorSetting(prefs, supportsDynamicColors); + } + } + + // migrate legacy auto start settings (current implementation is stateless and relies on the Windows registry / file system) + const launchAtStartupLegacyKey = 'ls_launch_at_startup'; + const launchMinimizedLegacyKey = 'ls_auto_start_launch_minimized'; + if (prefs.getBool(launchAtStartupLegacyKey) == true) { + _logger.info('Enable auto start on legacy settings'); + await prefs.remove(launchAtStartupLegacyKey); + await enableAutoStart(startHidden: prefs.getBool(launchMinimizedLegacyKey) == true); + await prefs.remove(launchMinimizedLegacyKey); + } + + return PersistenceService._(prefs, isFirstAppStart); + } + + static Future _initColorSetting(SharedPreferences prefs, bool supportsDynamicColors) async { + await prefs.setString( + _colorKey, + checkPlatform([TargetPlatform.android]) && supportsDynamicColors ? ColorMode.system.name : ColorMode.localsend.name, + ); + } + + bool isPortableMode() { + return SharedPreferencesStorePlatform.instance is SharedPreferencesPortable; + } + + StoredSecurityContext getSecurityContext() { + final contextRaw = _prefs.getString(_securityContext)!; + return StoredSecurityContext.fromJson(jsonDecode(contextRaw)); + } + + Future setSecurityContext(StoredSecurityContext context) async { + await _prefs.setString(_securityContext, jsonEncode(context)); + } + + List? getSignalingServers() { + final serversRaw = _prefs.getString(_signalingServers); + if (serversRaw == null) { + return null; + } + + return (jsonDecode(serversRaw) as List).cast(); + } + + Future setSignalingServers(List servers) async { + await _prefs.setString(_signalingServers, jsonEncode(servers)); + } + + List? getStunServers() { + final serversRaw = _prefs.getString(_stunServers); + if (serversRaw == null) { + return null; + } + + return (jsonDecode(serversRaw) as List).cast(); + } + + Future setStunServers(List servers) async { + await _prefs.setString(_stunServers, jsonEncode(servers)); + } + + List getReceiveHistory() { + final historyRaw = _prefs.getStringList(_receiveHistory) ?? []; + return historyRaw.map((entry) => ReceiveHistoryEntry.fromJson(jsonDecode(entry))).toList(); + } + + Future setReceiveHistory(List entries) async { + final historyRaw = entries.map((entry) => jsonEncode(entry.toJson())).toList(); + await _prefs.setStringList(_receiveHistory, historyRaw); + } + + List getFavorites() { + final favoritesRaw = _prefs.getStringList(_favorites) ?? []; + return favoritesRaw.map((entry) => FavoriteDevice.fromJson(jsonDecode(entry))).toList(); + } + + Future setFavorites(List entries) async { + final favoritesRaw = entries.map((entry) => jsonEncode(entry.toJson())).toList(); + await _prefs.setStringList(_favorites, favoritesRaw); + } + + String getShowToken() { + return _prefs.getString(_showToken)!; + } + + String getAlias() { + return _prefs.getString(_aliasKey) ?? generateRandomAlias(); + } + + Future setAlias(String alias) async { + await _prefs.setString(_aliasKey, alias); + } + + ThemeMode getTheme() { + final value = _prefs.getString(_themeKey); + if (value == null) { + return ThemeMode.system; + } + return ThemeMode.values.firstWhereOrNull((theme) => theme.name == value) ?? ThemeMode.system; + } + + Future setTheme(ThemeMode theme) async { + await _prefs.setString(_themeKey, theme.name); + } + + ColorMode getColorMode() { + final value = _prefs.getString(_colorKey); + if (value == null) { + return ColorMode.system; + } + return ColorMode.values.firstWhereOrNull((color) => color.name == value) ?? ColorMode.system; + } + + Future setColorMode(ColorMode color) async { + await _prefs.setString(_colorKey, color.name); + } + + AppLocale? getLocale() { + final value = _prefs.getString(_localeKey); + if (value == null) { + return null; + } + return AppLocale.values.firstWhereOrNull((locale) => locale.languageTag == value); + } + + Future setLocale(AppLocale? locale) async { + if (locale == null) { + await _prefs.remove(_localeKey); + } else { + await _prefs.setString(_localeKey, locale.languageTag); + } + } + + int getPort() { + return _prefs.getInt(_portKey) ?? defaultPort; + } + + Future setPort(int port) async { + await _prefs.setInt(_portKey, port); + } + + List? getNetworkWhitelist() { + return _prefs.getStringList(_networkWhitelistKey); + } + + Future setNetworkWhitelist(List? whitelist) async { + if (whitelist == null) { + await _prefs.remove(_networkWhitelistKey); + } else { + await _prefs.setStringList(_networkWhitelistKey, whitelist); + } + } + + List? getNetworkBlacklist() { + return _prefs.getStringList(_networkBlacklistKey); + } + + Future setNetworkBlacklist(List? blacklist) async { + if (blacklist == null) { + await _prefs.remove(_networkBlacklistKey); + } else { + await _prefs.setStringList(_networkBlacklistKey, blacklist); + } + } + + int getDiscoveryTimeout() { + return _prefs.getInt(_timeoutKey) ?? defaultDiscoveryTimeout; + } + + Future setDiscoveryTimeout(int timeout) async { + await _prefs.setInt(_timeoutKey, timeout); + } + + bool getShareViaLinkAutoAccept() { + return _prefs.getBool(_shareViaLinkAutoAccept) ?? false; + } + + Future setShareViaLinkAutoAccept(bool shareViaLinkAutoAccept) async { + await _prefs.setBool(_shareViaLinkAutoAccept, shareViaLinkAutoAccept); + } + + String getMulticastGroup() { + return _prefs.getString(_multicastGroupKey) ?? defaultMulticastGroup; + } + + Future setMulticastGroup(String group) async { + await _prefs.setString(_multicastGroupKey, group); + } + + String? getDestination() { + return _prefs.getString(_destinationKey); + } + + Future setDestination(String? destination) async { + if (destination == null) { + await _prefs.remove(_destinationKey); + } else { + await _prefs.setString(_destinationKey, destination); + } + } + + bool isSaveToGallery() { + return _prefs.getBool(_saveToGallery) ?? true; + } + + Future setSaveToGallery(bool saveToGallery) async { + await _prefs.setBool(_saveToGallery, saveToGallery); + } + + bool isSaveToHistory() { + return _prefs.getBool(_saveToHistory) ?? true; + } + + Future setSaveToHistory(bool saveToHistory) async { + await _prefs.setBool(_saveToHistory, saveToHistory); + } + + bool getAdvancedSettingsEnabled() { + return _prefs.getBool(_advancedSettingsKey) ?? false; + } + + Future setAdvancedSettingsEnabled(bool isEnabled) async { + await _prefs.setBool(_advancedSettingsKey, isEnabled); + } + + bool isQuickSave() { + return _prefs.getBool(_quickSave) ?? false; + } + + Future setQuickSave(bool quickSave) async { + await _prefs.setBool(_quickSave, quickSave); + } + + bool isQuickSaveFromFavorites() { + return _prefs.getBool(_quickSaveFromFavorites) ?? false; + } + + Future setQuickSaveFromFavorites(bool quickSaveFromFavorites) async { + await _prefs.setBool(_quickSaveFromFavorites, quickSaveFromFavorites); + } + + String? getReceivePin() { + return _prefs.getString(_receivePin); + } + + Future setReceivePin(String? pin) async { + if (pin == null) { + await _prefs.remove(_receivePin); + } else { + await _prefs.setString(_receivePin, pin); + } + } + + bool isAutoFinish() { + return _prefs.getBool(_autoFinish) ?? false; + } + + Future setAutoFinish(bool autoFinish) async { + await _prefs.setBool(_autoFinish, autoFinish); + } + + bool isMinimizeToTray() { + return _prefs.getBool(_minimizeToTray) ?? false; + } + + Future setMinimizeToTray(bool minimizeToTray) async { + await _prefs.setBool(_minimizeToTray, minimizeToTray); + } + + bool isHttps() { + return _prefs.getBool(_https) ?? true; + } + + Future setHttps(bool https) async { + await _prefs.setBool(_https, https); + } + + SendMode getSendMode() { + return SendMode.values.firstWhereOrNull((m) => m.name == _prefs.getString(_sendMode)) ?? SendMode.single; + } + + Future setSendMode(SendMode mode) async { + await _prefs.setString(_sendMode, mode.name); + } + + Future setWindowOffsetX(double x) async { + await _prefs.setDouble(_windowOffsetX, x); + } + + Future setWindowOffsetY(double y) async { + await _prefs.setDouble(_windowOffsetY, y); + } + + Future setWindowHeight(double height) async { + await _prefs.setDouble(_windowHeight, height); + } + + Future setWindowWidth(double width) async { + await _prefs.setDouble(_windowWidth, width); + } + + WindowDimensions? getWindowLastDimensions() { + Size? size; + Offset? position; + final offsetX = _prefs.getDouble(_windowOffsetX); + final offsetY = _prefs.getDouble(_windowOffsetY); + final width = _prefs.getDouble(_windowWidth); + final height = _prefs.getDouble(_windowHeight); + + if (width != null && height != null) { + size = Size(width, height); + } + + if (offsetX != null && offsetY != null) { + position = Offset(offsetX, offsetY); + } + + if (size == null || position == null) { + return null; + } + + return WindowDimensions( + position: position, + size: size, + ); + } + + Future setSaveWindowPlacement(bool savePlacement) async { + await _prefs.setBool(_saveWindowPlacement, savePlacement); + } + + bool getSaveWindowPlacement() { + if (!checkPlatformIsNotWaylandDesktop()) return false; + return _prefs.getBool(_saveWindowPlacement) ?? true; + } + + Future setEnableAnimations(bool enableAnimations) async { + await _prefs.setBool(_enableAnimations, enableAnimations); + } + + bool getEnableAnimations() { + return _prefs.getBool(_enableAnimations) ?? true; + } + + DeviceType? getDeviceType() { + return DeviceType.values.firstWhereOrNull((m) => m.name == _prefs.getString(_deviceType)); + } + + Future setDeviceType(DeviceType deviceType) async { + await _prefs.setString(_deviceType, deviceType.name); + } + + String? getDeviceModel() { + return _prefs.getString(_deviceModel); + } + + Future setDeviceModel(String deviceModel) async { + await _prefs.setString(_deviceModel, deviceModel); + } + + Future clear() async { + await _prefs.clear(); + } +} diff --git a/app/lib/provider/persistence_provider_migrations.dart b/app/lib/provider/persistence_provider_migrations.dart new file mode 100644 index 0000000..29f8608 --- /dev/null +++ b/app/lib/provider/persistence_provider_migrations.dart @@ -0,0 +1,35 @@ +part of 'persistence_provider.dart'; + +const _latestVersion = 2; + +Future _runMigrations(int from) async { + switch (from) { + case 1: + await _migrate2(); + await SharedPreferencesStorePlatform.instance.setValue('Int', 'flutter.$_version', 2); + break; + } +} + +Future _migrate2() async { + _logger.info('Migrating to version 2'); + if (SharedPreferencesStorePlatform.instance is! SharedPreferencesPortable) { + await enableContextMenu(); + + if (defaultTargetPlatform == TargetPlatform.windows) { + final newFolder = File(_windowsFile).parent; + if (!newFolder.existsSync()) { + newFolder.createSync(recursive: true); + } + + final legacyFile = File(_windowsLegacyFile); + legacyFile.copySync(_windowsFile); + try { + legacyFile.parent.parent.deleteSync(recursive: true); + } catch (e) { + _logger.warning('Failed to delete legacy folder: $e'); + } + SharedPreferencesStorePlatform.instance = SharedPreferencesFile(filePath: _windowsFile); + } + } +} diff --git a/app/lib/provider/progress_provider.dart b/app/lib/provider/progress_provider.dart new file mode 100644 index 0000000..dd1e495 --- /dev/null +++ b/app/lib/provider/progress_provider.dart @@ -0,0 +1,38 @@ +import 'package:refena_flutter/refena_flutter.dart'; + +/// A provider holding the progress of the send process. +/// It is implemented as [ChangeNotifier] for performance reasons. +final progressProvider = ChangeNotifierProvider((ref) => ProgressNotifier()); + +class ProgressNotifier extends ChangeNotifier { + final _progressMap = >{}; // session id -> (file id -> 0..1) + + void setProgress({required String sessionId, required String fileId, required double progress}) { + Map? progressMap = _progressMap[sessionId]; + if (progressMap == null) { + progressMap = {}; + _progressMap[sessionId] = progressMap; + } + progressMap[fileId] = progress; + notifyListeners(); + } + + double getProgress({required String sessionId, required String fileId}) { + return _progressMap[sessionId]?[fileId] ?? 0.0; + } + + void removeSession(String sessionId) { + _progressMap.remove(sessionId); + notifyListeners(); + } + + void removeAllSessions() { + _progressMap.clear(); + notifyListeners(); + } + + /// Only for debug purposes + Map> getData() { + return _progressMap; + } +} diff --git a/app/lib/provider/purchase_provider.dart b/app/lib/provider/purchase_provider.dart new file mode 100644 index 0000000..ecc8b82 --- /dev/null +++ b/app/lib/provider/purchase_provider.dart @@ -0,0 +1,193 @@ +import 'dart:async'; + +import 'package:collection/collection.dart'; +import 'package:in_app_purchase/in_app_purchase.dart'; +import 'package:localsend_app/model/state/purchase_state.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +final purchaseProvider = ReduxProvider((ref) { + return PurchaseService(); +}); + +class PurchaseService extends ReduxNotifier { + @override + PurchaseState init() => const PurchaseState( + prices: {}, + purchases: {}, + pending: false, + ); +} + +class InitPurchaseStream extends AsyncReduxAction { + final listening = Completer(); + + @override + Future reduce() async { + Future.delayed(Duration.zero, () => listening.complete()); + await for (final event in InAppPurchase.instance.purchaseStream) { + for (final purchase in event) { + await dispatchAsync(_HandlePurchaseUpdate(purchase)); + } + } + return state; + } +} + +class FetchPricesAndPurchasesAction extends AsyncReduxAction { + @override + Future reduce() async { + if (!checkPlatformSupportPayment()) { + emitMessage('Platform does not support payments'); + return state; + } + + if (state.prices.isNotEmpty) { + emitMessage('Already fetched'); + return state; + } + + try { + await dispatchAsync(FetchPricesAction()); + } catch (_) {} + + try { + await dispatchAsync(PurchaseRestoreAction()); + } catch (_) {} + return state; + } +} + +/// Fetches prices for all products. +/// They come from the platform's store and vary by country. +class FetchPricesAction extends AsyncReduxAction { + @override + Future reduce() async { + final response = await InAppPurchase.instance.queryProductDetails(PurchaseItem.values.map((e) => e.platformProductId).toSet()); + final priceMap = {}; + for (final product in response.productDetails) { + final item = PurchaseItem.values.firstWhereOrNull((e) => e.platformProductId == product.id); + if (item == null) { + continue; + } + priceMap[item] = product.price; + } + return state.copyWith( + prices: priceMap, + ); + } +} + +/// Handles the update information triggered by the purchase flow of the platform. +class _HandlePurchaseUpdate extends AsyncReduxAction { + final PurchaseDetails purchase; + + _HandlePurchaseUpdate(this.purchase); + + @override + bool get trackOrigin => false; + + @override + Future reduce() async { + if (purchase.status == PurchaseStatus.pending) { + return state.copyWith(pending: true); + } else { + dispatch(_SetPendingAction(false)); + } + + if (purchase.status == PurchaseStatus.error) { + // ignore: avoid_print + throw 'Error purchasing: ${purchase.error?.message}'; + } else if (purchase.status == PurchaseStatus.purchased || purchase.status == PurchaseStatus.restored) { + final purchaseEnum = PurchaseItem.values.firstWhereOrNull((element) => element.platformProductId == purchase.productID); + if (purchaseEnum == null) { + throw 'Unknown product ID: ${purchase.productID}'; + } + dispatch(AddPurchaseAction(purchaseEnum, purchase)); + } + + if (purchase.pendingCompletePurchase) { + // No need to verify. It's just a donation... + await InAppPurchase.instance.completePurchase(purchase); + } + + return state; + } + + @override + String get debugLabel => 'HandlePurchaseUpdate(${purchase.status}, ${purchase.productID})'; +} + +class AddPurchaseAction extends ReduxAction { + final PurchaseItem item; + final PurchaseDetails purchase; + + AddPurchaseAction(this.item, this.purchase); + + @override + PurchaseState reduce() { + return state.copyWith( + purchases: { + ...state.purchases, + item, + }, + ); + } +} + +class _SetPendingAction extends ReduxAction { + final bool pending; + + _SetPendingAction(this.pending); + + @override + PurchaseState reduce() => state.copyWith(pending: pending); +} + +/// Action to restore purchases. +/// Dispatched on first app start or manually by the user. +class PurchaseRestoreAction extends AsyncReduxAction { + @override + Future reduce() async { + try { + await InAppPurchase.instance.restorePurchases(); + } catch (_) {} + return state; + } +} + +/// Action to reset the purchase state. +/// Only used for testing. +class PurchaseResetAction extends ReduxAction { + @override + PurchaseState reduce() => state.copyWith( + purchases: {}, + pending: false, + ); +} + +/// Initiate the purchase flow for a product. +/// The actual callbacks are handled by [_HandlePurchaseUpdate]. +class PurchaseAction extends AsyncReduxAction { + final PurchaseItem item; + + PurchaseAction(this.item); + + @override + Future reduce() async { + final response = await InAppPurchase.instance.queryProductDetails({item.platformProductId}); + final productDetails = response.productDetails.firstOrNull; + if (productDetails == null) { + throw Exception('Product not found: ${item.platformProductId}'); + } + + // TODO: Handle changing subscriptions if subscriptions would be added + await InAppPurchase.instance.buyNonConsumable( + purchaseParam: PurchaseParam(productDetails: productDetails), + ); + return state; + } + + @override + String get debugLabel => 'BuyAction(${item.name})'; +} diff --git a/app/lib/provider/receive_history_provider.dart b/app/lib/provider/receive_history_provider.dart new file mode 100644 index 0000000..797745f --- /dev/null +++ b/app/lib/provider/receive_history_provider.dart @@ -0,0 +1,97 @@ +import 'package:common/model/file_type.dart'; +import 'package:localsend_app/model/persistence/receive_history_entry.dart'; +import 'package:localsend_app/provider/persistence_provider.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +const _maxHistoryEntries = 30; + +/// This provider stores the history of received files. +/// It automatically saves the history to the device's storage. +final receiveHistoryProvider = ReduxProvider>((ref) { + return ReceiveHistoryService(ref.read(persistenceProvider)); +}); + +class ReceiveHistoryService extends ReduxNotifier> { + final PersistenceService _persistence; + + ReceiveHistoryService(this._persistence); + + @override + List init() => _persistence.getReceiveHistory(); +} + +/// Adds a history entry. +class AddHistoryEntryAction extends AsyncReduxAction> { + final String entryId; + final String fileName; + final FileType fileType; + final String? path; + final bool savedToGallery; + final bool isMessage; + final int fileSize; + final String senderAlias; + final DateTime timestamp; + + AddHistoryEntryAction({ + required this.entryId, + required this.fileName, + required this.fileType, + required this.path, + required this.savedToGallery, + required this.isMessage, + required this.fileSize, + required this.senderAlias, + required this.timestamp, + }); + + @override + Future> reduce() async { + if (!notifier._persistence.isSaveToHistory()) { + return state; + } + + final updated = [ + ReceiveHistoryEntry( + id: entryId, + fileName: fileName, + fileType: fileType, + path: path, + savedToGallery: savedToGallery, + isMessage: isMessage, + fileSize: fileSize, + senderAlias: senderAlias, + timestamp: timestamp, + ), + ...state, + ].take(_maxHistoryEntries).toList(); + await notifier._persistence.setReceiveHistory(updated); + return updated; + } +} + +/// Removes a history entry. +class RemoveHistoryEntryAction extends AsyncReduxAction> { + final String entryId; + + RemoveHistoryEntryAction(this.entryId); + + @override + Future> reduce() async { + final index = state.indexWhere((e) => e.id == entryId); + if (index == -1) { + return state; + } + final updated = [...state]..removeAt(index); + await notifier._persistence.setReceiveHistory(updated); + return updated; + } +} + +/// Removes all history entries. +class RemoveAllHistoryEntriesAction extends AsyncReduxAction> { + @override + Future> reduce() async { + await notifier._persistence.setReceiveHistory([]); + return []; + } +} diff --git a/app/lib/provider/security_provider.dart b/app/lib/provider/security_provider.dart new file mode 100644 index 0000000..c05fb59 --- /dev/null +++ b/app/lib/provider/security_provider.dart @@ -0,0 +1,37 @@ +import 'package:common/isolate.dart'; +import 'package:common/model/stored_security_context.dart'; +import 'package:localsend_app/provider/persistence_provider.dart'; +import 'package:localsend_app/util/security_helper.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +/// This provider manages the [StoredSecurityContext]. +/// It contains all the security related data for HTTPS communication. +final securityProvider = ReduxProvider( + (ref) { + return SecurityService(ref.read(persistenceProvider)); + }, + onChanged: (_, next, ref) { + ref.redux(parentIsolateProvider).dispatch(IsolateSyncSecurityContextAction(securityContext: next)); + }, +); + +class SecurityService extends ReduxNotifier { + final PersistenceService _persistence; + + SecurityService(this._persistence); + + @override + StoredSecurityContext init() { + return _persistence.getSecurityContext(); + } +} + +/// Generates a new [StoredSecurityContext] and persists it. +class ResetSecurityContextAction extends AsyncReduxAction { + @override + Future reduce() async { + final securityContext = generateSecurityContext(); + await notifier._persistence.setSecurityContext(securityContext); + return securityContext; + } +} diff --git a/app/lib/provider/selection/selected_receiving_files_provider.dart b/app/lib/provider/selection/selected_receiving_files_provider.dart new file mode 100644 index 0000000..861fbaa --- /dev/null +++ b/app/lib/provider/selection/selected_receiving_files_provider.dart @@ -0,0 +1,71 @@ +import 'package:collection/collection.dart'; +import 'package:common/model/dto/file_dto.dart'; +import 'package:localsend_app/util/file_path_helper.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:uuid/uuid.dart'; + +const _uuid = Uuid(); + +/// Manages files to be selected to receive. +/// Only alive during [ReceivePage], i.e. this provider gets disposed as soon as the actual file transfer begin. +/// Map: FileId -> FileName +final selectedReceivingFilesProvider = NotifierProvider>((ref) { + return SelectedReceivingFilesNotifier(); +}); + +class SelectedReceivingFilesNotifier extends Notifier> { + SelectedReceivingFilesNotifier(); + + @override + Map init() { + return {}; + } + + void setFiles(List files) { + state = { + for (final f in files) f.id: f.fileName, // by default, accept all files and take their original name + }; + } + + void unselect(String fileId) { + state = {...state}..remove(fileId); + } + + void select(FileDto file) { + state = { + ...state, + file.id: file.fileName, + }; + } + + void rename(String fileId, String fileName) { + state = {...state}..update(fileId, (_) => fileName); + } + + void applyRandom() { + state = { + for (final entry in state.entries) entry.key: entry.value.withFileNameKeepExtension(_uuid.v4()), + }; + } + + void applyCounter({ + required String prefix, + required bool padZero, + required bool sortFirst, + }) { + final files = state.entries.toList(); + if (sortFirst) { + files.sort((a, b) => a.value.compareTo(b.value)); + } + final maxKeyStringLength = files.length.toString().length; + state = Map.fromEntries( + files.mapIndexed((index, element) { + String number = (index + 1).toString(); + if (padZero) { + number.padLeft(maxKeyStringLength, '0'); + } + return MapEntry(element.key, element.value.withFileNameKeepExtension('$prefix$number')); + }), + ); + } +} diff --git a/app/lib/provider/selection/selected_sending_files_provider.dart b/app/lib/provider/selection/selected_sending_files_provider.dart new file mode 100644 index 0000000..0212814 --- /dev/null +++ b/app/lib/provider/selection/selected_sending_files_provider.dart @@ -0,0 +1,365 @@ +import 'dart:convert' show jsonDecode, utf8; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:common/model/file_type.dart'; +import 'package:localsend_app/model/cross_file.dart'; +import 'package:localsend_app/util/file_path_helper.dart'; +import 'package:localsend_app/util/native/cache_helper.dart'; +import 'package:localsend_app/util/native/channel/android_channel.dart' as android_channel; +import 'package:localsend_app/util/native/content_uri_helper.dart'; +import 'package:localsend_app/util/native/cross_file_converters.dart'; +import 'package:localsend_app/util/send_ignore.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as p; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:share_handler/share_handler.dart'; +import 'package:uuid/uuid.dart'; + +final _logger = Logger('SelectedSendingFiles'); +const _uuid = Uuid(); + +/// Manages files selected for sending. +/// Will stay alive even after a session has been completed to send the same files to another device. +final selectedSendingFilesProvider = ReduxProvider>((ref) { + return SelectedSendingFilesNotifier(); +}); + +class SelectedSendingFilesNotifier extends ReduxNotifier> { + @override + List init() => []; +} + +/// Adds a message. +class AddMessageAction extends ReduxAction> { + final String message; + final int? index; + + AddMessageAction({ + required this.message, + this.index, + }); + + @override + List reduce() { + final List bytes = utf8.encode(message); + final file = CrossFile( + name: '${_uuid.v4()}.txt', + fileType: FileType.text, + size: bytes.length, + thumbnail: null, + asset: null, + path: null, + bytes: bytes, + lastModified: null, + lastAccessed: null, + ); + + return List.unmodifiable( + [ + ...state, + ]..insert(index ?? state.length, file), + ); + } +} + +/// Updates a message. +class UpdateMessageAction extends ReduxAction> { + final String message; + final int index; + + UpdateMessageAction({ + required this.message, + required this.index, + }); + + @override + List reduce() { + dispatch(RemoveSelectedFileAction(index)); + dispatch(AddMessageAction(message: message, index: index)); + return state; + } +} + +/// Adds a binary file to the list. +/// During the sending process, the file will be read from the memory. +class AddBinaryAction extends ReduxAction> { + final Uint8List bytes; + final FileType fileType; + final String fileName; + + AddBinaryAction({ + required this.bytes, + required this.fileType, + required this.fileName, + }); + + @override + List reduce() { + final file = CrossFile( + name: fileName, + fileType: fileType, + size: bytes.length, + thumbnail: fileType == FileType.image ? bytes : null, + asset: null, + path: null, + bytes: bytes, + lastModified: null, + lastAccessed: null, + ); + + return List.unmodifiable([ + ...state, + file, + ]); + } +} + +/// Adds one or more files to the list. +class AddFilesAction extends AsyncReduxAction> { + final Iterable files; + final Future Function(T) converter; + + AddFilesAction({ + required this.files, + required this.converter, + }); + + @override + Future> reduce() async { + final newFiles = []; + for (final file in files) { + // we do it sequential because there are bugs + // https://github.com/fluttercandies/flutter_photo_manager/issues/589 + + final crossFile = await converter(file); + final isAlreadySelect = state.any((element) => element.isSameFile(otherFile: crossFile)); + if (!isAlreadySelect) { + newFiles.add(crossFile); + } + } + return List.unmodifiable([ + ...state, + ...newFiles, + ]); + } +} + +/// Adds files inside the directory recursively. +class AddDirectoryAction extends AsyncReduxAction> { + final String directoryPath; + + AddDirectoryAction(this.directoryPath); + + @override + Future> reduce() async { + _logger.info('Reading files in $directoryPath'); + final newFiles = []; + final directoryName = p.basename(directoryPath); + final sendIgnore = SendIgnore(); + await for (final entity in Directory(directoryPath).list(recursive: true)) { + if (entity is File) { + final innerRelative = p.relative(entity.path, from: directoryPath).replaceAll('\\', '/'); + final relative = '$directoryName/$innerRelative'; + if (sendIgnore.isIgnoreFile(p.basename(entity.path))) { + sendIgnore.loadIgnoreContent( + parentPath: innerRelative.contains('/') ? p.dirname(innerRelative) : null, + ignoreContents: await entity.readAsLines(), + ); + _logger.info('Loaded ignore file: $innerRelative'); + continue; + } else if (sendIgnore.isIgnored(innerRelative)) { + _logger.info('Ignored: $innerRelative'); + continue; + } + + _logger.info('Add file $relative'); + + final file = CrossFile( + name: relative, + fileType: relative.guessFileType(), + size: entity.lengthSync(), + thumbnail: null, + asset: null, + path: entity.path, + bytes: null, + lastModified: entity.lastModifiedSync().toUtc(), + lastAccessed: entity.lastAccessedSync().toUtc(), + ); + + final isAlreadySelect = state.any((element) => element.isSameFile(otherFile: file)); + if (!isAlreadySelect) { + newFiles.add(file); + } + } + } + + return List.unmodifiable([ + ...state, + ...newFiles, + ]); + } +} + +/// A special [AddDirectoryAction] specifically for Android. +class AddAndroidDirectoryAction extends AsyncReduxAction> { + final android_channel.PickDirectoryResult result; + + AddAndroidDirectoryAction(this.result); + + @override + Future> reduce() async { + final newFiles = []; + _logger.info('Reading files in ${result.directoryUri}'); + + final basePath = ContentUriHelper.getPathFromTreeUri(result.directoryUri); + if (basePath == null) { + _logger.warning('Could not get base path from ${result.directoryUri}'); + return state; + } + final folderName = ContentUriHelper.getEntityNameFromPath(basePath); + if (folderName == null) { + _logger.warning('Could not get folder name from $basePath'); + return state; + } + + for (final file in result.files) { + final relative = ContentUriHelper.guessRelativePathFromPickedFileContentUri( + folderContentUri: result.directoryUri, + basePath: basePath, + folderName: folderName, + uri: file.uri, + ); + if (relative == null) { + _logger.warning('Could not get relative path from ${file.uri}'); + continue; + } + _logger.info('Add file $relative (${file.uri})'); + + final crossFile = CrossFile( + name: relative, + fileType: file.name.guessFileType(), + size: file.size, + thumbnail: null, + asset: null, + path: file.uri, + bytes: null, + lastModified: DateTime.fromMillisecondsSinceEpoch(file.lastModified, isUtc: true), + lastAccessed: null, + ); + + final isAlreadySelect = state.any((element) => element.isSameFile(otherFile: crossFile)); + if (!isAlreadySelect) { + newFiles.add(crossFile); + } + } + + return List.unmodifiable([ + ...state, + ...newFiles, + ]); + } +} + +/// Removes a file at the given [index]. +class RemoveSelectedFileAction extends ReduxAction> with GlobalActions { + final int index; + + RemoveSelectedFileAction(this.index); + + @override + List reduce() { + return List.unmodifiable([...state]..removeAt(index)); + } + + @override + void after() { + if (state.isEmpty) { + global.dispatchAsync(ClearCacheAction()); // ignore: discarded_futures + } + } +} + +/// Loads the selection from the arguments of the app start. +/// Returns `true` if files were added. +class LoadSelectionFromArgsAction extends AsyncReduxActionWithResult, bool> { + final List args; + + LoadSelectionFromArgsAction(this.args); + + @override + Future<(List, bool)> reduce() async { + bool filesAdded = false; + bool nextShare = false; + bool nextText = false; + for (final arg in args) { + if (arg == '--share') { + nextShare = true; + continue; + } + if (arg == '--text' || arg == '-t') { + nextText = true; + continue; + } + if (nextShare) { + nextShare = false; + final json = jsonDecode(arg); + final SharedMedia payload = SharedMedia.decode(json); + final message = payload.content; + if (message != null && message.trim().isNotEmpty) { + dispatch(AddMessageAction(message: message)); + } + await dispatchAsync( + AddFilesAction( + files: payload.attachments?.where((a) => a != null).cast() ?? [], + converter: CrossFileConverters.convertSharedAttachment, + ), + ); + filesAdded = true; + continue; + } + if (nextText) { + nextText = false; + if (arg.trim().isNotEmpty) { + dispatch(AddMessageAction(message: arg.trim())); + filesAdded = true; + } + continue; + } + if (arg.startsWith('-')) { + continue; + } + + final file = File(arg); + final directory = Directory(arg); + + if (file.existsSync()) { + await dispatchAsync( + AddFilesAction( + files: [file], + converter: CrossFileConverters.convertFile, + ), + ); + filesAdded = true; + } else if (directory.existsSync()) { + await dispatchAsync(AddDirectoryAction(arg)); + filesAdded = true; + } + } + + return (state, filesAdded); + } +} + +/// Removes all files from the list. +class ClearSelectionAction extends ReduxAction> with GlobalActions { + @override + List reduce() { + return const []; + } + + @override + void after() { + global.dispatchAsync(ClearCacheAction()); // ignore: discarded_futures + } +} diff --git a/app/lib/provider/settings_provider.dart b/app/lib/provider/settings_provider.dart new file mode 100644 index 0000000..0ca87af --- /dev/null +++ b/app/lib/provider/settings_provider.dart @@ -0,0 +1,250 @@ +import 'package:collection/collection.dart'; +import 'package:common/isolate.dart'; +import 'package:common/model/device.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/persistence/color_mode.dart'; +import 'package:localsend_app/model/send_mode.dart'; +import 'package:localsend_app/model/state/settings_state.dart'; +import 'package:localsend_app/provider/persistence_provider.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +final _listEq = const ListEquality().equals; + +final settingsProvider = NotifierProvider( + (ref) { + return SettingsService(ref.read(persistenceProvider)); + }, + onChanged: (_, next, ref) { + final syncState = ref.read(parentIsolateProvider).syncState; + if (_listEq(syncState.networkWhitelist, next.networkWhitelist) && + _listEq(syncState.networkBlacklist, next.networkBlacklist) && + syncState.multicastGroup == next.multicastGroup && + syncState.discoveryTimeout == next.discoveryTimeout) { + return; + } + + ref + .redux(parentIsolateProvider) + .dispatch( + IsolateSyncSettingsAction( + networkWhitelist: next.networkWhitelist, + networkBlacklist: next.networkBlacklist, + multicastGroup: next.multicastGroup, + discoveryTimeout: next.discoveryTimeout, + ), + ); + }, +); + +class SettingsService extends PureNotifier { + final PersistenceService _persistence; + + SettingsService(this._persistence); + + @override + SettingsState init() => SettingsState( + showToken: _persistence.getShowToken(), + alias: _persistence.getAlias(), + theme: _persistence.getTheme(), + colorMode: _persistence.getColorMode(), + locale: _persistence.getLocale(), + port: _persistence.getPort(), + networkWhitelist: _persistence.getNetworkWhitelist(), + networkBlacklist: _persistence.getNetworkBlacklist(), + multicastGroup: _persistence.getMulticastGroup(), + destination: _persistence.getDestination(), + saveToGallery: _persistence.isSaveToGallery(), + saveToHistory: _persistence.isSaveToHistory(), + quickSave: _persistence.isQuickSave(), + quickSaveFromFavorites: _persistence.isQuickSaveFromFavorites(), + receivePin: _persistence.getReceivePin(), + autoFinish: _persistence.isAutoFinish(), + minimizeToTray: _persistence.isMinimizeToTray(), + https: _persistence.isHttps(), + sendMode: _persistence.getSendMode(), + saveWindowPlacement: _persistence.getSaveWindowPlacement(), + enableAnimations: _persistence.getEnableAnimations(), + deviceType: _persistence.getDeviceType(), + deviceModel: _persistence.getDeviceModel(), + shareViaLinkAutoAccept: _persistence.getShareViaLinkAutoAccept(), + discoveryTimeout: _persistence.getDiscoveryTimeout(), + advancedSettings: _persistence.getAdvancedSettingsEnabled(), + ); + + Future setAlias(String alias) async { + await _persistence.setAlias(alias); + state = state.copyWith( + alias: alias, + ); + } + + Future setTheme(ThemeMode theme) async { + await _persistence.setTheme(theme); + state = state.copyWith( + theme: theme, + ); + } + + Future setColorMode(ColorMode mode) async { + await _persistence.setColorMode(mode); + state = state.copyWith( + colorMode: mode, + ); + } + + Future setAdvancedSettingsEnabled(bool isEnabled) async { + await _persistence.setAdvancedSettingsEnabled(isEnabled); + state = state.copyWith( + advancedSettings: isEnabled, + ); + } + + Future setLocale(AppLocale? locale) async { + await _persistence.setLocale(locale); + state = state.copyWith( + locale: locale, + ); + } + + Future setPort(int port) async { + await _persistence.setPort(port); + state = state.copyWith( + port: port, + ); + } + + Future setNetworkWhitelist(List? whitelist) async { + await _persistence.setNetworkWhitelist(whitelist); + state = state.copyWith( + networkWhitelist: whitelist, + ); + } + + Future setNetworkBlacklist(List? blacklist) async { + await _persistence.setNetworkBlacklist(blacklist); + state = state.copyWith( + networkBlacklist: blacklist, + ); + } + + Future setDiscoveryTimeout(int timeout) async { + await _persistence.setDiscoveryTimeout(timeout); + state = state.copyWith( + discoveryTimeout: timeout, + ); + } + + Future setMulticastGroup(String group) async { + await _persistence.setMulticastGroup(group); + state = state.copyWith( + multicastGroup: group, + ); + } + + Future setDestination(String? destination) async { + await _persistence.setDestination(destination); + state = state.copyWith( + destination: destination, + ); + } + + Future setSaveToGallery(bool saveToGallery) async { + await _persistence.setSaveToGallery(saveToGallery); + state = state.copyWith( + saveToGallery: saveToGallery, + ); + } + + Future setSaveToHistory(bool saveToHistory) async { + await _persistence.setSaveToHistory(saveToHistory); + state = state.copyWith( + saveToHistory: saveToHistory, + ); + } + + Future setQuickSave(bool quickSave) async { + await _persistence.setQuickSave(quickSave); + state = state.copyWith( + quickSave: quickSave, + ); + } + + Future setQuickSaveFromFavorites(bool quickSaveFromFavorites) async { + await _persistence.setQuickSaveFromFavorites(quickSaveFromFavorites); + state = state.copyWith( + quickSaveFromFavorites: quickSaveFromFavorites, + ); + } + + Future setReceivePin(String? receivePin) async { + await _persistence.setReceivePin(receivePin); + state = state.copyWith( + receivePin: receivePin, + ); + } + + Future setAutoFinish(bool autoFinish) async { + await _persistence.setAutoFinish(autoFinish); + state = state.copyWith( + autoFinish: autoFinish, + ); + } + + Future setMinimizeToTray(bool minimizeToTray) async { + await _persistence.setMinimizeToTray(minimizeToTray); + state = state.copyWith( + minimizeToTray: minimizeToTray, + ); + } + + Future setHttps(bool https) async { + await _persistence.setHttps(https); + state = state.copyWith( + https: https, + ); + } + + Future setSendMode(SendMode mode) async { + await _persistence.setSendMode(mode); + state = state.copyWith( + sendMode: mode, + ); + } + + Future setSaveWindowPlacement(bool savePlacement) async { + await _persistence.setSaveWindowPlacement(savePlacement); + state = state.copyWith( + saveWindowPlacement: savePlacement, + ); + } + + Future setEnableAnimations(bool enableAnimations) async { + await _persistence.setEnableAnimations(enableAnimations); + state = state.copyWith( + enableAnimations: enableAnimations, + ); + } + + Future setDeviceType(DeviceType deviceType) async { + await _persistence.setDeviceType(deviceType); + state = state.copyWith( + deviceType: deviceType, + ); + } + + Future setDeviceModel(String deviceModel) async { + await _persistence.setDeviceModel(deviceModel); + state = state.copyWith( + deviceModel: deviceModel, + ); + } + + Future setShareViaLinkAutoAccept(bool shareViaLinkAutoAccept) async { + await _persistence.setShareViaLinkAutoAccept(shareViaLinkAutoAccept); + + state = state.copyWith( + shareViaLinkAutoAccept: shareViaLinkAutoAccept, + ); + } +} diff --git a/app/lib/provider/tv_provider.dart b/app/lib/provider/tv_provider.dart new file mode 100644 index 0000000..0d84915 --- /dev/null +++ b/app/lib/provider/tv_provider.dart @@ -0,0 +1,18 @@ +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/services.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +final tvProvider = Provider((_) => throw Exception('tvProvider not initialized'), debugLabel: 'tvProvider'); + +/// Returns true, if this device is a TV. +/// Currently, only supports Android TV. +Future checkIfTv() async { + if (checkPlatform([TargetPlatform.android])) { + DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); + AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; + return androidInfo.systemFeatures.contains('android.software.leanback'); + } else { + return false; + } +} diff --git a/app/lib/provider/version_provider.dart b/app/lib/provider/version_provider.dart new file mode 100644 index 0000000..21535d1 --- /dev/null +++ b/app/lib/provider/version_provider.dart @@ -0,0 +1,7 @@ +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +final versionProvider = FutureProvider((ref) async { + final info = await PackageInfo.fromPlatform(); + return '${info.version} (${info.buildNumber})'; +}, debugLabel: 'VersionProvider'); diff --git a/app/lib/provider/window_dimensions_provider.dart b/app/lib/provider/window_dimensions_provider.dart new file mode 100644 index 0000000..fd281af --- /dev/null +++ b/app/lib/provider/window_dimensions_provider.dart @@ -0,0 +1,96 @@ +import 'dart:ui'; +import 'package:localsend_app/provider/persistence_provider.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:screen_retriever/screen_retriever.dart'; +import 'package:window_manager/window_manager.dart'; + +class WindowDimensions { + final Offset position; + final Size size; + + WindowDimensions({ + required this.position, + required this.size, + }); +} + +final windowDimensionProvider = Provider((ref) { + return WindowDimensionsController(ref.read(persistenceProvider)); +}); + +const Size _minimalSize = Size(400, 500); +const Size _defaultSize = Size(900, 600); + +class WindowDimensionsController { + final PersistenceService _service; + + WindowDimensionsController(this._service); + + /// Sets window position & size according to saved settings. + Future initDimensionsConfiguration() async { + await WindowManager.instance.setMinimumSize(_minimalSize); + + // load saved Window placement and preferences + final useSavedPlacement = _service.getSaveWindowPlacement(); + final persistedDimensions = _service.getWindowLastDimensions(); + + if (useSavedPlacement && persistedDimensions != null && await isInScreenBounds(persistedDimensions.position, persistedDimensions.size)) { + await WindowManager.instance.setSize(persistedDimensions.size); + await WindowManager.instance.setPosition(persistedDimensions.position); + } else { + final primaryDisplay = await ScreenRetriever.instance.getPrimaryDisplay(); + final hasEnoughWidthForDefaultSize = primaryDisplay.digestedSize.width >= 1200; + await WindowManager.instance.setSize(hasEnoughWidthForDefaultSize ? _defaultSize : _minimalSize); + await WindowManager.instance.center(); + } + } + + Future isInScreenBounds(Offset windowPosition, [Size? windowSize]) async { + final displays = await ScreenRetriever.instance.getAllDisplays(); + final sumWidth = displays.fold(0.0, (previousValue, element) => previousValue + element.digestedSize.width); + final maxHeight = displays.fold( + 0.0, + (previousValue, element) => previousValue > element.digestedSize.height ? previousValue : element.digestedSize.height, + ); + final minX = displays.fold(0.0, (previousValue, element) { + final currX = element.visiblePosition?.dx ?? 0; + return currX < previousValue ? currX : previousValue; + }); + final minY = displays.fold(0.0, (previousValue, element) { + final currY = element.visiblePosition?.dy ?? 0; + return currY < previousValue ? currY : previousValue; + }); + final checkX = windowPosition.dx >= minX && windowPosition.dx + (windowSize?.width ?? 0) <= sumWidth; + final checkY = windowPosition.dy >= minY && windowPosition.dy + (windowSize?.height ?? 0) <= maxHeight; + + return checkX && checkY; + } + + Future storeDimensions({ + required Offset windowOffset, + required Size windowSize, + }) async { + if (await isInScreenBounds(windowOffset)) { + await _service.setWindowOffsetX(windowOffset.dx); + await _service.setWindowOffsetY(windowOffset.dy); + await _service.setWindowHeight(windowSize.height); + await _service.setWindowWidth(windowSize.width); + } + } + + Future storePosition({required Offset windowOffset}) async { + if (await isInScreenBounds(windowOffset)) { + await _service.setWindowOffsetX(windowOffset.dx); + await _service.setWindowOffsetY(windowOffset.dy); + } + } + + Future storeSize({required Size windowSize}) async { + await _service.setWindowHeight(windowSize.height); + await _service.setWindowWidth(windowSize.width); + } +} + +extension on Display { + Size get digestedSize => visibleSize ?? size; +} diff --git a/app/lib/rust/api/crypto.dart b/app/lib/rust/api/crypto.dart new file mode 100644 index 0000000..1509ea2 --- /dev/null +++ b/app/lib/rust/api/crypto.dart @@ -0,0 +1,32 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:localsend_app/rust/frb_generated.dart'; + +Future verifyCert({required String cert, required String publicKey}) => RustLib.instance.api.crateApiCryptoVerifyCert( + cert: cert, + publicKey: publicKey, +); + +Future generateKeyPair() => RustLib.instance.api.crateApiCryptoGenerateKeyPair(); + +class KeyPair { + final String privateKey; + final String publicKey; + + const KeyPair({ + required this.privateKey, + required this.publicKey, + }); + + @override + int get hashCode => privateKey.hashCode ^ publicKey.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is KeyPair && runtimeType == other.runtimeType && privateKey == other.privateKey && publicKey == other.publicKey; +} diff --git a/app/lib/rust/api/http.dart b/app/lib/rust/api/http.dart new file mode 100644 index 0000000..02e63cc --- /dev/null +++ b/app/lib/rust/api/http.dart @@ -0,0 +1,124 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +import 'package:localsend_app/rust/api/model.dart'; +import 'package:localsend_app/rust/api/stream.dart'; +import 'package:localsend_app/rust/frb_generated.dart'; + +part 'http.freezed.dart'; + +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `from` + +RsHttpClient createClient({ + required String privateKey, + required String cert, + required LsHttpClientVersion version, +}) => RustLib.instance.api.crateApiHttpCreateClient( + privateKey: privateKey, + cert: cert, + version: version, +); + +// Rust type: RustOpaqueMoi> +abstract class RsHttpClient implements RustOpaqueInterface { + Future cancel({ + required ProtocolType protocol, + required String ip, + required int port, + required String sessionId, + }); + + Future prepareUpload({ + required ProtocolType protocol, + required String ip, + required int port, + required PrepareUploadRequestDto payload, + String? publicKey, + String? pin, + }); + + Future register({ + required ProtocolType protocol, + required String ip, + required int port, + required RegisterDto payload, + }); + + Future upload({ + required ProtocolType protocol, + required String ip, + required int port, + String? publicKey, + required String sessionId, + required String fileId, + required String token, + required Dart2RustStreamReceiver binary, + }); +} + +enum LsHttpClientVersion { + v2, + v3, +} + +class PrepareUploadResult { + final int statusCode; + final PrepareUploadResponseDto? response; + + const PrepareUploadResult({ + required this.statusCode, + this.response, + }); + + @override + int get hashCode => statusCode.hashCode ^ response.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PrepareUploadResult && runtimeType == other.runtimeType && statusCode == other.statusCode && response == other.response; +} + +class ResultWithPublicKeyRegisterResponseDto { + final String? publicKey; + final RegisterResponseDto body; + + const ResultWithPublicKeyRegisterResponseDto({ + this.publicKey, + required this.body, + }); + + @override + int get hashCode => publicKey.hashCode ^ body.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ResultWithPublicKeyRegisterResponseDto && runtimeType == other.runtimeType && publicKey == other.publicKey && body == other.body; +} + +@freezed +sealed class RsHttpClientError with _$RsHttpClientError implements FrbException { + const RsHttpClientError._(); + + const factory RsHttpClientError.statusCode({ + required int status, + String? message, + }) = RsHttpClientError_StatusCode; + const factory RsHttpClientError.reqwest( + String field0, + ) = RsHttpClientError_Reqwest; + const factory RsHttpClientError.json( + String field0, + ) = RsHttpClientError_Json; + const factory RsHttpClientError.io( + String field0, + ) = RsHttpClientError_Io; + const factory RsHttpClientError.other( + String field0, + ) = RsHttpClientError_Other; +} diff --git a/app/lib/rust/api/http.freezed.dart b/app/lib/rust/api/http.freezed.dart new file mode 100644 index 0000000..b1da4f1 --- /dev/null +++ b/app/lib/rust/api/http.freezed.dart @@ -0,0 +1,524 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'http.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; +/// @nodoc +mixin _$RsHttpClientError { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RsHttpClientError); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RsHttpClientError()'; +} + + +} + +/// @nodoc +class $RsHttpClientErrorCopyWith<$Res> { +$RsHttpClientErrorCopyWith(RsHttpClientError _, $Res Function(RsHttpClientError) __); +} + + +/// Adds pattern-matching-related methods to [RsHttpClientError]. +extension RsHttpClientErrorPatterns on RsHttpClientError { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( RsHttpClientError_StatusCode value)? statusCode,TResult Function( RsHttpClientError_Reqwest value)? reqwest,TResult Function( RsHttpClientError_Json value)? json,TResult Function( RsHttpClientError_Io value)? io,TResult Function( RsHttpClientError_Other value)? other,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case RsHttpClientError_StatusCode() when statusCode != null: +return statusCode(_that);case RsHttpClientError_Reqwest() when reqwest != null: +return reqwest(_that);case RsHttpClientError_Json() when json != null: +return json(_that);case RsHttpClientError_Io() when io != null: +return io(_that);case RsHttpClientError_Other() when other != null: +return other(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( RsHttpClientError_StatusCode value) statusCode,required TResult Function( RsHttpClientError_Reqwest value) reqwest,required TResult Function( RsHttpClientError_Json value) json,required TResult Function( RsHttpClientError_Io value) io,required TResult Function( RsHttpClientError_Other value) other,}){ +final _that = this; +switch (_that) { +case RsHttpClientError_StatusCode(): +return statusCode(_that);case RsHttpClientError_Reqwest(): +return reqwest(_that);case RsHttpClientError_Json(): +return json(_that);case RsHttpClientError_Io(): +return io(_that);case RsHttpClientError_Other(): +return other(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( RsHttpClientError_StatusCode value)? statusCode,TResult? Function( RsHttpClientError_Reqwest value)? reqwest,TResult? Function( RsHttpClientError_Json value)? json,TResult? Function( RsHttpClientError_Io value)? io,TResult? Function( RsHttpClientError_Other value)? other,}){ +final _that = this; +switch (_that) { +case RsHttpClientError_StatusCode() when statusCode != null: +return statusCode(_that);case RsHttpClientError_Reqwest() when reqwest != null: +return reqwest(_that);case RsHttpClientError_Json() when json != null: +return json(_that);case RsHttpClientError_Io() when io != null: +return io(_that);case RsHttpClientError_Other() when other != null: +return other(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( int status, String? message)? statusCode,TResult Function( String field0)? reqwest,TResult Function( String field0)? json,TResult Function( String field0)? io,TResult Function( String field0)? other,required TResult orElse(),}) {final _that = this; +switch (_that) { +case RsHttpClientError_StatusCode() when statusCode != null: +return statusCode(_that.status,_that.message);case RsHttpClientError_Reqwest() when reqwest != null: +return reqwest(_that.field0);case RsHttpClientError_Json() when json != null: +return json(_that.field0);case RsHttpClientError_Io() when io != null: +return io(_that.field0);case RsHttpClientError_Other() when other != null: +return other(_that.field0);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( int status, String? message) statusCode,required TResult Function( String field0) reqwest,required TResult Function( String field0) json,required TResult Function( String field0) io,required TResult Function( String field0) other,}) {final _that = this; +switch (_that) { +case RsHttpClientError_StatusCode(): +return statusCode(_that.status,_that.message);case RsHttpClientError_Reqwest(): +return reqwest(_that.field0);case RsHttpClientError_Json(): +return json(_that.field0);case RsHttpClientError_Io(): +return io(_that.field0);case RsHttpClientError_Other(): +return other(_that.field0);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( int status, String? message)? statusCode,TResult? Function( String field0)? reqwest,TResult? Function( String field0)? json,TResult? Function( String field0)? io,TResult? Function( String field0)? other,}) {final _that = this; +switch (_that) { +case RsHttpClientError_StatusCode() when statusCode != null: +return statusCode(_that.status,_that.message);case RsHttpClientError_Reqwest() when reqwest != null: +return reqwest(_that.field0);case RsHttpClientError_Json() when json != null: +return json(_that.field0);case RsHttpClientError_Io() when io != null: +return io(_that.field0);case RsHttpClientError_Other() when other != null: +return other(_that.field0);case _: + return null; + +} +} + +} + +/// @nodoc + + +class RsHttpClientError_StatusCode extends RsHttpClientError { + const RsHttpClientError_StatusCode({required this.status, this.message}): super._(); + + + final int status; + final String? message; + +/// Create a copy of RsHttpClientError +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RsHttpClientError_StatusCodeCopyWith get copyWith => _$RsHttpClientError_StatusCodeCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RsHttpClientError_StatusCode&&(identical(other.status, status) || other.status == status)&&(identical(other.message, message) || other.message == message)); +} + + +@override +int get hashCode => Object.hash(runtimeType,status,message); + +@override +String toString() { + return 'RsHttpClientError.statusCode(status: $status, message: $message)'; +} + + +} + +/// @nodoc +abstract mixin class $RsHttpClientError_StatusCodeCopyWith<$Res> implements $RsHttpClientErrorCopyWith<$Res> { + factory $RsHttpClientError_StatusCodeCopyWith(RsHttpClientError_StatusCode value, $Res Function(RsHttpClientError_StatusCode) _then) = _$RsHttpClientError_StatusCodeCopyWithImpl; +@useResult +$Res call({ + int status, String? message +}); + + + + +} +/// @nodoc +class _$RsHttpClientError_StatusCodeCopyWithImpl<$Res> + implements $RsHttpClientError_StatusCodeCopyWith<$Res> { + _$RsHttpClientError_StatusCodeCopyWithImpl(this._self, this._then); + + final RsHttpClientError_StatusCode _self; + final $Res Function(RsHttpClientError_StatusCode) _then; + +/// Create a copy of RsHttpClientError +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? status = null,Object? message = freezed,}) { + return _then(RsHttpClientError_StatusCode( +status: null == status ? _self.status : status // ignore: cast_nullable_to_non_nullable +as int,message: freezed == message ? _self.message : message // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +/// @nodoc + + +class RsHttpClientError_Reqwest extends RsHttpClientError { + const RsHttpClientError_Reqwest(this.field0): super._(); + + + final String field0; + +/// Create a copy of RsHttpClientError +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RsHttpClientError_ReqwestCopyWith get copyWith => _$RsHttpClientError_ReqwestCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RsHttpClientError_Reqwest&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'RsHttpClientError.reqwest(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $RsHttpClientError_ReqwestCopyWith<$Res> implements $RsHttpClientErrorCopyWith<$Res> { + factory $RsHttpClientError_ReqwestCopyWith(RsHttpClientError_Reqwest value, $Res Function(RsHttpClientError_Reqwest) _then) = _$RsHttpClientError_ReqwestCopyWithImpl; +@useResult +$Res call({ + String field0 +}); + + + + +} +/// @nodoc +class _$RsHttpClientError_ReqwestCopyWithImpl<$Res> + implements $RsHttpClientError_ReqwestCopyWith<$Res> { + _$RsHttpClientError_ReqwestCopyWithImpl(this._self, this._then); + + final RsHttpClientError_Reqwest _self; + final $Res Function(RsHttpClientError_Reqwest) _then; + +/// Create a copy of RsHttpClientError +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(RsHttpClientError_Reqwest( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +/// @nodoc + + +class RsHttpClientError_Json extends RsHttpClientError { + const RsHttpClientError_Json(this.field0): super._(); + + + final String field0; + +/// Create a copy of RsHttpClientError +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RsHttpClientError_JsonCopyWith get copyWith => _$RsHttpClientError_JsonCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RsHttpClientError_Json&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'RsHttpClientError.json(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $RsHttpClientError_JsonCopyWith<$Res> implements $RsHttpClientErrorCopyWith<$Res> { + factory $RsHttpClientError_JsonCopyWith(RsHttpClientError_Json value, $Res Function(RsHttpClientError_Json) _then) = _$RsHttpClientError_JsonCopyWithImpl; +@useResult +$Res call({ + String field0 +}); + + + + +} +/// @nodoc +class _$RsHttpClientError_JsonCopyWithImpl<$Res> + implements $RsHttpClientError_JsonCopyWith<$Res> { + _$RsHttpClientError_JsonCopyWithImpl(this._self, this._then); + + final RsHttpClientError_Json _self; + final $Res Function(RsHttpClientError_Json) _then; + +/// Create a copy of RsHttpClientError +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(RsHttpClientError_Json( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +/// @nodoc + + +class RsHttpClientError_Io extends RsHttpClientError { + const RsHttpClientError_Io(this.field0): super._(); + + + final String field0; + +/// Create a copy of RsHttpClientError +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RsHttpClientError_IoCopyWith get copyWith => _$RsHttpClientError_IoCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RsHttpClientError_Io&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'RsHttpClientError.io(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $RsHttpClientError_IoCopyWith<$Res> implements $RsHttpClientErrorCopyWith<$Res> { + factory $RsHttpClientError_IoCopyWith(RsHttpClientError_Io value, $Res Function(RsHttpClientError_Io) _then) = _$RsHttpClientError_IoCopyWithImpl; +@useResult +$Res call({ + String field0 +}); + + + + +} +/// @nodoc +class _$RsHttpClientError_IoCopyWithImpl<$Res> + implements $RsHttpClientError_IoCopyWith<$Res> { + _$RsHttpClientError_IoCopyWithImpl(this._self, this._then); + + final RsHttpClientError_Io _self; + final $Res Function(RsHttpClientError_Io) _then; + +/// Create a copy of RsHttpClientError +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(RsHttpClientError_Io( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +/// @nodoc + + +class RsHttpClientError_Other extends RsHttpClientError { + const RsHttpClientError_Other(this.field0): super._(); + + + final String field0; + +/// Create a copy of RsHttpClientError +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RsHttpClientError_OtherCopyWith get copyWith => _$RsHttpClientError_OtherCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RsHttpClientError_Other&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'RsHttpClientError.other(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $RsHttpClientError_OtherCopyWith<$Res> implements $RsHttpClientErrorCopyWith<$Res> { + factory $RsHttpClientError_OtherCopyWith(RsHttpClientError_Other value, $Res Function(RsHttpClientError_Other) _then) = _$RsHttpClientError_OtherCopyWithImpl; +@useResult +$Res call({ + String field0 +}); + + + + +} +/// @nodoc +class _$RsHttpClientError_OtherCopyWithImpl<$Res> + implements $RsHttpClientError_OtherCopyWith<$Res> { + _$RsHttpClientError_OtherCopyWithImpl(this._self, this._then); + + final RsHttpClientError_Other _self; + final $Res Function(RsHttpClientError_Other) _then; + +/// Create a copy of RsHttpClientError +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(RsHttpClientError_Other( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +// dart format on diff --git a/app/lib/rust/api/logging.dart b/app/lib/rust/api/logging.dart new file mode 100644 index 0000000..2bf90ab --- /dev/null +++ b/app/lib/rust/api/logging.dart @@ -0,0 +1,9 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:localsend_app/rust/frb_generated.dart'; + +Future enableDebugLogging() => RustLib.instance.api.crateApiLoggingEnableDebugLogging(); diff --git a/app/lib/rust/api/model.dart b/app/lib/rust/api/model.dart new file mode 100644 index 0000000..753d7d8 --- /dev/null +++ b/app/lib/rust/api/model.dart @@ -0,0 +1,188 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:localsend_app/rust/frb_generated.dart'; + +enum DeviceType { + mobile, + desktop, + web, + headless, + server, +} + +class FileDto { + final String id; + final String fileName; + final BigInt size; + final String fileType; + final String? sha256; + final String? preview; + final FileMetadata? metadata; + + const FileDto({ + required this.id, + required this.fileName, + required this.size, + required this.fileType, + this.sha256, + this.preview, + this.metadata, + }); + + @override + int get hashCode => id.hashCode ^ fileName.hashCode ^ size.hashCode ^ fileType.hashCode ^ sha256.hashCode ^ preview.hashCode ^ metadata.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is FileDto && + runtimeType == other.runtimeType && + id == other.id && + fileName == other.fileName && + size == other.size && + fileType == other.fileType && + sha256 == other.sha256 && + preview == other.preview && + metadata == other.metadata; +} + +class FileMetadata { + final String? modified; + final String? accessed; + + const FileMetadata({ + this.modified, + this.accessed, + }); + + @override + int get hashCode => modified.hashCode ^ accessed.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || other is FileMetadata && runtimeType == other.runtimeType && modified == other.modified && accessed == other.accessed; +} + +class PrepareUploadRequestDto { + final RegisterDto info; + final Map files; + + const PrepareUploadRequestDto({ + required this.info, + required this.files, + }); + + @override + int get hashCode => info.hashCode ^ files.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || other is PrepareUploadRequestDto && runtimeType == other.runtimeType && info == other.info && files == other.files; +} + +class PrepareUploadResponseDto { + final String sessionId; + final Map files; + + const PrepareUploadResponseDto({ + required this.sessionId, + required this.files, + }); + + @override + int get hashCode => sessionId.hashCode ^ files.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PrepareUploadResponseDto && runtimeType == other.runtimeType && sessionId == other.sessionId && files == other.files; +} + +enum ProtocolType { + http, + https, +} + +class RegisterDto { + final String alias; + final String version; + final String? deviceModel; + final DeviceType? deviceType; + final String token; + final int port; + final ProtocolType protocol; + final bool hasWebInterface; + + const RegisterDto({ + required this.alias, + required this.version, + this.deviceModel, + this.deviceType, + required this.token, + required this.port, + required this.protocol, + required this.hasWebInterface, + }); + + @override + int get hashCode => + alias.hashCode ^ + version.hashCode ^ + deviceModel.hashCode ^ + deviceType.hashCode ^ + token.hashCode ^ + port.hashCode ^ + protocol.hashCode ^ + hasWebInterface.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is RegisterDto && + runtimeType == other.runtimeType && + alias == other.alias && + version == other.version && + deviceModel == other.deviceModel && + deviceType == other.deviceType && + token == other.token && + port == other.port && + protocol == other.protocol && + hasWebInterface == other.hasWebInterface; +} + +class RegisterResponseDto { + final String alias; + final String version; + final String? deviceModel; + final DeviceType? deviceType; + final String token; + final bool hasWebInterface; + + const RegisterResponseDto({ + required this.alias, + required this.version, + this.deviceModel, + this.deviceType, + required this.token, + required this.hasWebInterface, + }); + + @override + int get hashCode => alias.hashCode ^ version.hashCode ^ deviceModel.hashCode ^ deviceType.hashCode ^ token.hashCode ^ hasWebInterface.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is RegisterResponseDto && + runtimeType == other.runtimeType && + alias == other.alias && + version == other.version && + deviceModel == other.deviceModel && + deviceType == other.deviceType && + token == other.token && + hasWebInterface == other.hasWebInterface; +} diff --git a/app/lib/rust/api/stream.dart b/app/lib/rust/api/stream.dart new file mode 100644 index 0000000..77c28c6 --- /dev/null +++ b/app/lib/rust/api/stream.dart @@ -0,0 +1,17 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:localsend_app/rust/frb_generated.dart'; + +Future<(Dart2RustStreamSink, Dart2RustStreamReceiver)> createStream() => RustLib.instance.api.crateApiStreamCreateStream(); + +// Rust type: RustOpaqueMoi> +abstract class Dart2RustStreamReceiver implements RustOpaqueInterface {} + +// Rust type: RustOpaqueMoi> +abstract class Dart2RustStreamSink implements RustOpaqueInterface { + Future add({required List data}); +} diff --git a/app/lib/rust/api/webrtc.dart b/app/lib/rust/api/webrtc.dart new file mode 100644 index 0000000..f6996c2 --- /dev/null +++ b/app/lib/rust/api/webrtc.dart @@ -0,0 +1,319 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +import 'package:localsend_app/rust/api/model.dart'; +import 'package:localsend_app/rust/frb_generated.dart'; +import 'package:uuid/uuid.dart'; + +part 'webrtc.freezed.dart'; + +// These functions are ignored because they are not marked as `pub`: `sign` + +Stream connect({ + required String uri, + required ProposingClientInfo info, + required String privateKey, + required FutureOr Function(LsSignalingConnection) onConnection, +}) => RustLib.instance.api.crateApiWebrtcConnect( + uri: uri, + info: info, + privateKey: privateKey, + onConnection: onConnection, +); + +// Rust type: RustOpaqueMoi> +abstract class LsSignalingConnection implements RustOpaqueInterface { + Future acceptOffer({ + required List stunServers, + required WsServerSdpMessage offer, + required String privateKey, + ExpectingPublicKey? expectingPublicKey, + PinConfig? pin, + }); + + Future sendOffer({ + required List stunServers, + required UuidValue target, + required String privateKey, + ExpectingPublicKey? expectingPublicKey, + PinConfig? pin, + required List files, + }); + + Future updateInfo({required ClientInfoWithoutId info}); +} + +// Rust type: RustOpaqueMoi> +abstract class RtcFileReceiver implements RustOpaqueInterface { + Future getFileId(); + + Stream receive(); +} + +// Rust type: RustOpaqueMoi> +abstract class RtcFileSender implements RustOpaqueInterface { + Future send({required List data}); +} + +// Rust type: RustOpaqueMoi> +abstract class RtcReceiveController implements RustOpaqueInterface { + Future decline(); + + Stream listenError(); + + Future> listenFiles(); + + Stream listenReceiving(); + + Stream listenStatus(); + + Future sendFileStatus({required RTCSendFileResponse status}); + + Future sendPin({required String pin}); + + Future sendSelection({required Set selection}); +} + +// Rust type: RustOpaqueMoi> +abstract class RtcSendController implements RustOpaqueInterface { + Stream listenError(); + + Future> listenSelectedFiles(); + + Stream listenStatus(); + + Future sendFile({required String fileId}); + + Future sendPin({required String pin}); +} + +class ClientInfo { + final UuidValue id; + final String alias; + final String version; + final String? deviceModel; + final DeviceType? deviceType; + final String token; + + const ClientInfo({ + required this.id, + required this.alias, + required this.version, + this.deviceModel, + this.deviceType, + required this.token, + }); + + @override + int get hashCode => id.hashCode ^ alias.hashCode ^ version.hashCode ^ deviceModel.hashCode ^ deviceType.hashCode ^ token.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ClientInfo && + runtimeType == other.runtimeType && + id == other.id && + alias == other.alias && + version == other.version && + deviceModel == other.deviceModel && + deviceType == other.deviceType && + token == other.token; +} + +class ClientInfoWithoutId { + final String alias; + final String version; + final String? deviceModel; + final DeviceType? deviceType; + final String token; + + const ClientInfoWithoutId({ + required this.alias, + required this.version, + this.deviceModel, + this.deviceType, + required this.token, + }); + + @override + int get hashCode => alias.hashCode ^ version.hashCode ^ deviceModel.hashCode ^ deviceType.hashCode ^ token.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ClientInfoWithoutId && + runtimeType == other.runtimeType && + alias == other.alias && + version == other.version && + deviceModel == other.deviceModel && + deviceType == other.deviceType && + token == other.token; +} + +class ExpectingPublicKey { + final String publicKey; + + /// "ed25519" or "rsa-pss" + final String kind; + + const ExpectingPublicKey({ + required this.publicKey, + required this.kind, + }); + + @override + int get hashCode => publicKey.hashCode ^ kind.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || other is ExpectingPublicKey && runtimeType == other.runtimeType && publicKey == other.publicKey && kind == other.kind; +} + +class PinConfig { + final String pin; + final int maxTries; + + const PinConfig({ + required this.pin, + required this.maxTries, + }); + + @override + int get hashCode => pin.hashCode ^ maxTries.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || other is PinConfig && runtimeType == other.runtimeType && pin == other.pin && maxTries == other.maxTries; +} + +class ProposingClientInfo { + final String alias; + final String version; + final String? deviceModel; + final DeviceType? deviceType; + + const ProposingClientInfo({ + required this.alias, + required this.version, + this.deviceModel, + this.deviceType, + }); + + @override + int get hashCode => alias.hashCode ^ version.hashCode ^ deviceModel.hashCode ^ deviceType.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ProposingClientInfo && + runtimeType == other.runtimeType && + alias == other.alias && + version == other.version && + deviceModel == other.deviceModel && + deviceType == other.deviceType; +} + +class RTCFileError { + final String fileId; + final String error; + + const RTCFileError({ + required this.fileId, + required this.error, + }); + + @override + int get hashCode => fileId.hashCode ^ error.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || other is RTCFileError && runtimeType == other.runtimeType && fileId == other.fileId && error == other.error; +} + +class RTCSendFileResponse { + final String id; + final bool success; + final String? error; + + const RTCSendFileResponse({ + required this.id, + required this.success, + this.error, + }); + + @override + int get hashCode => id.hashCode ^ success.hashCode ^ error.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is RTCSendFileResponse && runtimeType == other.runtimeType && id == other.id && success == other.success && error == other.error; +} + +@freezed +sealed class RTCStatus with _$RTCStatus { + const RTCStatus._(); + + const factory RTCStatus.sdpExchanged() = RTCStatus_SdpExchanged; + const factory RTCStatus.connected() = RTCStatus_Connected; + const factory RTCStatus.pinRequired() = RTCStatus_PinRequired; + const factory RTCStatus.tooManyAttempts() = RTCStatus_TooManyAttempts; + const factory RTCStatus.declined() = RTCStatus_Declined; + const factory RTCStatus.sending() = RTCStatus_Sending; + const factory RTCStatus.finished() = RTCStatus_Finished; + const factory RTCStatus.error( + String field0, + ) = RTCStatus_Error; +} + +@freezed +sealed class WsServerMessage with _$WsServerMessage { + const WsServerMessage._(); + + const factory WsServerMessage.hello({ + required ClientInfo client, + required List peers, + }) = WsServerMessage_Hello; + const factory WsServerMessage.join({ + required ClientInfo peer, + }) = WsServerMessage_Join; + const factory WsServerMessage.update({ + required ClientInfo peer, + }) = WsServerMessage_Update; + const factory WsServerMessage.left({ + required UuidValue peerId, + }) = WsServerMessage_Left; + const factory WsServerMessage.offer( + WsServerSdpMessage field0, + ) = WsServerMessage_Offer; + const factory WsServerMessage.answer( + WsServerSdpMessage field0, + ) = WsServerMessage_Answer; + const factory WsServerMessage.error({ + required int code, + }) = WsServerMessage_Error; +} + +class WsServerSdpMessage { + final ClientInfo peer; + final String sessionId; + final String sdp; + + const WsServerSdpMessage({ + required this.peer, + required this.sessionId, + required this.sdp, + }); + + @override + int get hashCode => peer.hashCode ^ sessionId.hashCode ^ sdp.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is WsServerSdpMessage && runtimeType == other.runtimeType && peer == other.peer && sessionId == other.sessionId && sdp == other.sdp; +} diff --git a/app/lib/rust/api/webrtc.freezed.dart b/app/lib/rust/api/webrtc.freezed.dart new file mode 100644 index 0000000..34d6bc2 --- /dev/null +++ b/app/lib/rust/api/webrtc.freezed.dart @@ -0,0 +1,1160 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'webrtc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; +/// @nodoc +mixin _$RTCStatus { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RTCStatus); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RTCStatus()'; +} + + +} + +/// @nodoc +class $RTCStatusCopyWith<$Res> { +$RTCStatusCopyWith(RTCStatus _, $Res Function(RTCStatus) __); +} + + +/// Adds pattern-matching-related methods to [RTCStatus]. +extension RTCStatusPatterns on RTCStatus { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( RTCStatus_SdpExchanged value)? sdpExchanged,TResult Function( RTCStatus_Connected value)? connected,TResult Function( RTCStatus_PinRequired value)? pinRequired,TResult Function( RTCStatus_TooManyAttempts value)? tooManyAttempts,TResult Function( RTCStatus_Declined value)? declined,TResult Function( RTCStatus_Sending value)? sending,TResult Function( RTCStatus_Finished value)? finished,TResult Function( RTCStatus_Error value)? error,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case RTCStatus_SdpExchanged() when sdpExchanged != null: +return sdpExchanged(_that);case RTCStatus_Connected() when connected != null: +return connected(_that);case RTCStatus_PinRequired() when pinRequired != null: +return pinRequired(_that);case RTCStatus_TooManyAttempts() when tooManyAttempts != null: +return tooManyAttempts(_that);case RTCStatus_Declined() when declined != null: +return declined(_that);case RTCStatus_Sending() when sending != null: +return sending(_that);case RTCStatus_Finished() when finished != null: +return finished(_that);case RTCStatus_Error() when error != null: +return error(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( RTCStatus_SdpExchanged value) sdpExchanged,required TResult Function( RTCStatus_Connected value) connected,required TResult Function( RTCStatus_PinRequired value) pinRequired,required TResult Function( RTCStatus_TooManyAttempts value) tooManyAttempts,required TResult Function( RTCStatus_Declined value) declined,required TResult Function( RTCStatus_Sending value) sending,required TResult Function( RTCStatus_Finished value) finished,required TResult Function( RTCStatus_Error value) error,}){ +final _that = this; +switch (_that) { +case RTCStatus_SdpExchanged(): +return sdpExchanged(_that);case RTCStatus_Connected(): +return connected(_that);case RTCStatus_PinRequired(): +return pinRequired(_that);case RTCStatus_TooManyAttempts(): +return tooManyAttempts(_that);case RTCStatus_Declined(): +return declined(_that);case RTCStatus_Sending(): +return sending(_that);case RTCStatus_Finished(): +return finished(_that);case RTCStatus_Error(): +return error(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( RTCStatus_SdpExchanged value)? sdpExchanged,TResult? Function( RTCStatus_Connected value)? connected,TResult? Function( RTCStatus_PinRequired value)? pinRequired,TResult? Function( RTCStatus_TooManyAttempts value)? tooManyAttempts,TResult? Function( RTCStatus_Declined value)? declined,TResult? Function( RTCStatus_Sending value)? sending,TResult? Function( RTCStatus_Finished value)? finished,TResult? Function( RTCStatus_Error value)? error,}){ +final _that = this; +switch (_that) { +case RTCStatus_SdpExchanged() when sdpExchanged != null: +return sdpExchanged(_that);case RTCStatus_Connected() when connected != null: +return connected(_that);case RTCStatus_PinRequired() when pinRequired != null: +return pinRequired(_that);case RTCStatus_TooManyAttempts() when tooManyAttempts != null: +return tooManyAttempts(_that);case RTCStatus_Declined() when declined != null: +return declined(_that);case RTCStatus_Sending() when sending != null: +return sending(_that);case RTCStatus_Finished() when finished != null: +return finished(_that);case RTCStatus_Error() when error != null: +return error(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function()? sdpExchanged,TResult Function()? connected,TResult Function()? pinRequired,TResult Function()? tooManyAttempts,TResult Function()? declined,TResult Function()? sending,TResult Function()? finished,TResult Function( String field0)? error,required TResult orElse(),}) {final _that = this; +switch (_that) { +case RTCStatus_SdpExchanged() when sdpExchanged != null: +return sdpExchanged();case RTCStatus_Connected() when connected != null: +return connected();case RTCStatus_PinRequired() when pinRequired != null: +return pinRequired();case RTCStatus_TooManyAttempts() when tooManyAttempts != null: +return tooManyAttempts();case RTCStatus_Declined() when declined != null: +return declined();case RTCStatus_Sending() when sending != null: +return sending();case RTCStatus_Finished() when finished != null: +return finished();case RTCStatus_Error() when error != null: +return error(_that.field0);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function() sdpExchanged,required TResult Function() connected,required TResult Function() pinRequired,required TResult Function() tooManyAttempts,required TResult Function() declined,required TResult Function() sending,required TResult Function() finished,required TResult Function( String field0) error,}) {final _that = this; +switch (_that) { +case RTCStatus_SdpExchanged(): +return sdpExchanged();case RTCStatus_Connected(): +return connected();case RTCStatus_PinRequired(): +return pinRequired();case RTCStatus_TooManyAttempts(): +return tooManyAttempts();case RTCStatus_Declined(): +return declined();case RTCStatus_Sending(): +return sending();case RTCStatus_Finished(): +return finished();case RTCStatus_Error(): +return error(_that.field0);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function()? sdpExchanged,TResult? Function()? connected,TResult? Function()? pinRequired,TResult? Function()? tooManyAttempts,TResult? Function()? declined,TResult? Function()? sending,TResult? Function()? finished,TResult? Function( String field0)? error,}) {final _that = this; +switch (_that) { +case RTCStatus_SdpExchanged() when sdpExchanged != null: +return sdpExchanged();case RTCStatus_Connected() when connected != null: +return connected();case RTCStatus_PinRequired() when pinRequired != null: +return pinRequired();case RTCStatus_TooManyAttempts() when tooManyAttempts != null: +return tooManyAttempts();case RTCStatus_Declined() when declined != null: +return declined();case RTCStatus_Sending() when sending != null: +return sending();case RTCStatus_Finished() when finished != null: +return finished();case RTCStatus_Error() when error != null: +return error(_that.field0);case _: + return null; + +} +} + +} + +/// @nodoc + + +class RTCStatus_SdpExchanged extends RTCStatus { + const RTCStatus_SdpExchanged(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RTCStatus_SdpExchanged); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RTCStatus.sdpExchanged()'; +} + + +} + + + + +/// @nodoc + + +class RTCStatus_Connected extends RTCStatus { + const RTCStatus_Connected(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RTCStatus_Connected); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RTCStatus.connected()'; +} + + +} + + + + +/// @nodoc + + +class RTCStatus_PinRequired extends RTCStatus { + const RTCStatus_PinRequired(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RTCStatus_PinRequired); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RTCStatus.pinRequired()'; +} + + +} + + + + +/// @nodoc + + +class RTCStatus_TooManyAttempts extends RTCStatus { + const RTCStatus_TooManyAttempts(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RTCStatus_TooManyAttempts); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RTCStatus.tooManyAttempts()'; +} + + +} + + + + +/// @nodoc + + +class RTCStatus_Declined extends RTCStatus { + const RTCStatus_Declined(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RTCStatus_Declined); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RTCStatus.declined()'; +} + + +} + + + + +/// @nodoc + + +class RTCStatus_Sending extends RTCStatus { + const RTCStatus_Sending(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RTCStatus_Sending); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RTCStatus.sending()'; +} + + +} + + + + +/// @nodoc + + +class RTCStatus_Finished extends RTCStatus { + const RTCStatus_Finished(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RTCStatus_Finished); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RTCStatus.finished()'; +} + + +} + + + + +/// @nodoc + + +class RTCStatus_Error extends RTCStatus { + const RTCStatus_Error(this.field0): super._(); + + + final String field0; + +/// Create a copy of RTCStatus +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RTCStatus_ErrorCopyWith get copyWith => _$RTCStatus_ErrorCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RTCStatus_Error&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'RTCStatus.error(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $RTCStatus_ErrorCopyWith<$Res> implements $RTCStatusCopyWith<$Res> { + factory $RTCStatus_ErrorCopyWith(RTCStatus_Error value, $Res Function(RTCStatus_Error) _then) = _$RTCStatus_ErrorCopyWithImpl; +@useResult +$Res call({ + String field0 +}); + + + + +} +/// @nodoc +class _$RTCStatus_ErrorCopyWithImpl<$Res> + implements $RTCStatus_ErrorCopyWith<$Res> { + _$RTCStatus_ErrorCopyWithImpl(this._self, this._then); + + final RTCStatus_Error _self; + final $Res Function(RTCStatus_Error) _then; + +/// Create a copy of RTCStatus +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(RTCStatus_Error( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +/// @nodoc +mixin _$WsServerMessage { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is WsServerMessage); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'WsServerMessage()'; +} + + +} + +/// @nodoc +class $WsServerMessageCopyWith<$Res> { +$WsServerMessageCopyWith(WsServerMessage _, $Res Function(WsServerMessage) __); +} + + +/// Adds pattern-matching-related methods to [WsServerMessage]. +extension WsServerMessagePatterns on WsServerMessage { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( WsServerMessage_Hello value)? hello,TResult Function( WsServerMessage_Join value)? join,TResult Function( WsServerMessage_Update value)? update,TResult Function( WsServerMessage_Left value)? left,TResult Function( WsServerMessage_Offer value)? offer,TResult Function( WsServerMessage_Answer value)? answer,TResult Function( WsServerMessage_Error value)? error,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case WsServerMessage_Hello() when hello != null: +return hello(_that);case WsServerMessage_Join() when join != null: +return join(_that);case WsServerMessage_Update() when update != null: +return update(_that);case WsServerMessage_Left() when left != null: +return left(_that);case WsServerMessage_Offer() when offer != null: +return offer(_that);case WsServerMessage_Answer() when answer != null: +return answer(_that);case WsServerMessage_Error() when error != null: +return error(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( WsServerMessage_Hello value) hello,required TResult Function( WsServerMessage_Join value) join,required TResult Function( WsServerMessage_Update value) update,required TResult Function( WsServerMessage_Left value) left,required TResult Function( WsServerMessage_Offer value) offer,required TResult Function( WsServerMessage_Answer value) answer,required TResult Function( WsServerMessage_Error value) error,}){ +final _that = this; +switch (_that) { +case WsServerMessage_Hello(): +return hello(_that);case WsServerMessage_Join(): +return join(_that);case WsServerMessage_Update(): +return update(_that);case WsServerMessage_Left(): +return left(_that);case WsServerMessage_Offer(): +return offer(_that);case WsServerMessage_Answer(): +return answer(_that);case WsServerMessage_Error(): +return error(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( WsServerMessage_Hello value)? hello,TResult? Function( WsServerMessage_Join value)? join,TResult? Function( WsServerMessage_Update value)? update,TResult? Function( WsServerMessage_Left value)? left,TResult? Function( WsServerMessage_Offer value)? offer,TResult? Function( WsServerMessage_Answer value)? answer,TResult? Function( WsServerMessage_Error value)? error,}){ +final _that = this; +switch (_that) { +case WsServerMessage_Hello() when hello != null: +return hello(_that);case WsServerMessage_Join() when join != null: +return join(_that);case WsServerMessage_Update() when update != null: +return update(_that);case WsServerMessage_Left() when left != null: +return left(_that);case WsServerMessage_Offer() when offer != null: +return offer(_that);case WsServerMessage_Answer() when answer != null: +return answer(_that);case WsServerMessage_Error() when error != null: +return error(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( ClientInfo client, List peers)? hello,TResult Function( ClientInfo peer)? join,TResult Function( ClientInfo peer)? update,TResult Function( UuidValue peerId)? left,TResult Function( WsServerSdpMessage field0)? offer,TResult Function( WsServerSdpMessage field0)? answer,TResult Function( int code)? error,required TResult orElse(),}) {final _that = this; +switch (_that) { +case WsServerMessage_Hello() when hello != null: +return hello(_that.client,_that.peers);case WsServerMessage_Join() when join != null: +return join(_that.peer);case WsServerMessage_Update() when update != null: +return update(_that.peer);case WsServerMessage_Left() when left != null: +return left(_that.peerId);case WsServerMessage_Offer() when offer != null: +return offer(_that.field0);case WsServerMessage_Answer() when answer != null: +return answer(_that.field0);case WsServerMessage_Error() when error != null: +return error(_that.code);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( ClientInfo client, List peers) hello,required TResult Function( ClientInfo peer) join,required TResult Function( ClientInfo peer) update,required TResult Function( UuidValue peerId) left,required TResult Function( WsServerSdpMessage field0) offer,required TResult Function( WsServerSdpMessage field0) answer,required TResult Function( int code) error,}) {final _that = this; +switch (_that) { +case WsServerMessage_Hello(): +return hello(_that.client,_that.peers);case WsServerMessage_Join(): +return join(_that.peer);case WsServerMessage_Update(): +return update(_that.peer);case WsServerMessage_Left(): +return left(_that.peerId);case WsServerMessage_Offer(): +return offer(_that.field0);case WsServerMessage_Answer(): +return answer(_that.field0);case WsServerMessage_Error(): +return error(_that.code);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( ClientInfo client, List peers)? hello,TResult? Function( ClientInfo peer)? join,TResult? Function( ClientInfo peer)? update,TResult? Function( UuidValue peerId)? left,TResult? Function( WsServerSdpMessage field0)? offer,TResult? Function( WsServerSdpMessage field0)? answer,TResult? Function( int code)? error,}) {final _that = this; +switch (_that) { +case WsServerMessage_Hello() when hello != null: +return hello(_that.client,_that.peers);case WsServerMessage_Join() when join != null: +return join(_that.peer);case WsServerMessage_Update() when update != null: +return update(_that.peer);case WsServerMessage_Left() when left != null: +return left(_that.peerId);case WsServerMessage_Offer() when offer != null: +return offer(_that.field0);case WsServerMessage_Answer() when answer != null: +return answer(_that.field0);case WsServerMessage_Error() when error != null: +return error(_that.code);case _: + return null; + +} +} + +} + +/// @nodoc + + +class WsServerMessage_Hello extends WsServerMessage { + const WsServerMessage_Hello({required this.client, required final List peers}): _peers = peers,super._(); + + + final ClientInfo client; + final List _peers; + List get peers { + if (_peers is EqualUnmodifiableListView) return _peers; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_peers); +} + + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$WsServerMessage_HelloCopyWith get copyWith => _$WsServerMessage_HelloCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is WsServerMessage_Hello&&(identical(other.client, client) || other.client == client)&&const DeepCollectionEquality().equals(other._peers, _peers)); +} + + +@override +int get hashCode => Object.hash(runtimeType,client,const DeepCollectionEquality().hash(_peers)); + +@override +String toString() { + return 'WsServerMessage.hello(client: $client, peers: $peers)'; +} + + +} + +/// @nodoc +abstract mixin class $WsServerMessage_HelloCopyWith<$Res> implements $WsServerMessageCopyWith<$Res> { + factory $WsServerMessage_HelloCopyWith(WsServerMessage_Hello value, $Res Function(WsServerMessage_Hello) _then) = _$WsServerMessage_HelloCopyWithImpl; +@useResult +$Res call({ + ClientInfo client, List peers +}); + + + + +} +/// @nodoc +class _$WsServerMessage_HelloCopyWithImpl<$Res> + implements $WsServerMessage_HelloCopyWith<$Res> { + _$WsServerMessage_HelloCopyWithImpl(this._self, this._then); + + final WsServerMessage_Hello _self; + final $Res Function(WsServerMessage_Hello) _then; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? client = null,Object? peers = null,}) { + return _then(WsServerMessage_Hello( +client: null == client ? _self.client : client // ignore: cast_nullable_to_non_nullable +as ClientInfo,peers: null == peers ? _self._peers : peers // ignore: cast_nullable_to_non_nullable +as List, + )); +} + + +} + +/// @nodoc + + +class WsServerMessage_Join extends WsServerMessage { + const WsServerMessage_Join({required this.peer}): super._(); + + + final ClientInfo peer; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$WsServerMessage_JoinCopyWith get copyWith => _$WsServerMessage_JoinCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is WsServerMessage_Join&&(identical(other.peer, peer) || other.peer == peer)); +} + + +@override +int get hashCode => Object.hash(runtimeType,peer); + +@override +String toString() { + return 'WsServerMessage.join(peer: $peer)'; +} + + +} + +/// @nodoc +abstract mixin class $WsServerMessage_JoinCopyWith<$Res> implements $WsServerMessageCopyWith<$Res> { + factory $WsServerMessage_JoinCopyWith(WsServerMessage_Join value, $Res Function(WsServerMessage_Join) _then) = _$WsServerMessage_JoinCopyWithImpl; +@useResult +$Res call({ + ClientInfo peer +}); + + + + +} +/// @nodoc +class _$WsServerMessage_JoinCopyWithImpl<$Res> + implements $WsServerMessage_JoinCopyWith<$Res> { + _$WsServerMessage_JoinCopyWithImpl(this._self, this._then); + + final WsServerMessage_Join _self; + final $Res Function(WsServerMessage_Join) _then; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? peer = null,}) { + return _then(WsServerMessage_Join( +peer: null == peer ? _self.peer : peer // ignore: cast_nullable_to_non_nullable +as ClientInfo, + )); +} + + +} + +/// @nodoc + + +class WsServerMessage_Update extends WsServerMessage { + const WsServerMessage_Update({required this.peer}): super._(); + + + final ClientInfo peer; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$WsServerMessage_UpdateCopyWith get copyWith => _$WsServerMessage_UpdateCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is WsServerMessage_Update&&(identical(other.peer, peer) || other.peer == peer)); +} + + +@override +int get hashCode => Object.hash(runtimeType,peer); + +@override +String toString() { + return 'WsServerMessage.update(peer: $peer)'; +} + + +} + +/// @nodoc +abstract mixin class $WsServerMessage_UpdateCopyWith<$Res> implements $WsServerMessageCopyWith<$Res> { + factory $WsServerMessage_UpdateCopyWith(WsServerMessage_Update value, $Res Function(WsServerMessage_Update) _then) = _$WsServerMessage_UpdateCopyWithImpl; +@useResult +$Res call({ + ClientInfo peer +}); + + + + +} +/// @nodoc +class _$WsServerMessage_UpdateCopyWithImpl<$Res> + implements $WsServerMessage_UpdateCopyWith<$Res> { + _$WsServerMessage_UpdateCopyWithImpl(this._self, this._then); + + final WsServerMessage_Update _self; + final $Res Function(WsServerMessage_Update) _then; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? peer = null,}) { + return _then(WsServerMessage_Update( +peer: null == peer ? _self.peer : peer // ignore: cast_nullable_to_non_nullable +as ClientInfo, + )); +} + + +} + +/// @nodoc + + +class WsServerMessage_Left extends WsServerMessage { + const WsServerMessage_Left({required this.peerId}): super._(); + + + final UuidValue peerId; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$WsServerMessage_LeftCopyWith get copyWith => _$WsServerMessage_LeftCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is WsServerMessage_Left&&(identical(other.peerId, peerId) || other.peerId == peerId)); +} + + +@override +int get hashCode => Object.hash(runtimeType,peerId); + +@override +String toString() { + return 'WsServerMessage.left(peerId: $peerId)'; +} + + +} + +/// @nodoc +abstract mixin class $WsServerMessage_LeftCopyWith<$Res> implements $WsServerMessageCopyWith<$Res> { + factory $WsServerMessage_LeftCopyWith(WsServerMessage_Left value, $Res Function(WsServerMessage_Left) _then) = _$WsServerMessage_LeftCopyWithImpl; +@useResult +$Res call({ + UuidValue peerId +}); + + + + +} +/// @nodoc +class _$WsServerMessage_LeftCopyWithImpl<$Res> + implements $WsServerMessage_LeftCopyWith<$Res> { + _$WsServerMessage_LeftCopyWithImpl(this._self, this._then); + + final WsServerMessage_Left _self; + final $Res Function(WsServerMessage_Left) _then; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? peerId = null,}) { + return _then(WsServerMessage_Left( +peerId: null == peerId ? _self.peerId : peerId // ignore: cast_nullable_to_non_nullable +as UuidValue, + )); +} + + +} + +/// @nodoc + + +class WsServerMessage_Offer extends WsServerMessage { + const WsServerMessage_Offer(this.field0): super._(); + + + final WsServerSdpMessage field0; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$WsServerMessage_OfferCopyWith get copyWith => _$WsServerMessage_OfferCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is WsServerMessage_Offer&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'WsServerMessage.offer(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $WsServerMessage_OfferCopyWith<$Res> implements $WsServerMessageCopyWith<$Res> { + factory $WsServerMessage_OfferCopyWith(WsServerMessage_Offer value, $Res Function(WsServerMessage_Offer) _then) = _$WsServerMessage_OfferCopyWithImpl; +@useResult +$Res call({ + WsServerSdpMessage field0 +}); + + + + +} +/// @nodoc +class _$WsServerMessage_OfferCopyWithImpl<$Res> + implements $WsServerMessage_OfferCopyWith<$Res> { + _$WsServerMessage_OfferCopyWithImpl(this._self, this._then); + + final WsServerMessage_Offer _self; + final $Res Function(WsServerMessage_Offer) _then; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(WsServerMessage_Offer( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as WsServerSdpMessage, + )); +} + + +} + +/// @nodoc + + +class WsServerMessage_Answer extends WsServerMessage { + const WsServerMessage_Answer(this.field0): super._(); + + + final WsServerSdpMessage field0; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$WsServerMessage_AnswerCopyWith get copyWith => _$WsServerMessage_AnswerCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is WsServerMessage_Answer&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'WsServerMessage.answer(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $WsServerMessage_AnswerCopyWith<$Res> implements $WsServerMessageCopyWith<$Res> { + factory $WsServerMessage_AnswerCopyWith(WsServerMessage_Answer value, $Res Function(WsServerMessage_Answer) _then) = _$WsServerMessage_AnswerCopyWithImpl; +@useResult +$Res call({ + WsServerSdpMessage field0 +}); + + + + +} +/// @nodoc +class _$WsServerMessage_AnswerCopyWithImpl<$Res> + implements $WsServerMessage_AnswerCopyWith<$Res> { + _$WsServerMessage_AnswerCopyWithImpl(this._self, this._then); + + final WsServerMessage_Answer _self; + final $Res Function(WsServerMessage_Answer) _then; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(WsServerMessage_Answer( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as WsServerSdpMessage, + )); +} + + +} + +/// @nodoc + + +class WsServerMessage_Error extends WsServerMessage { + const WsServerMessage_Error({required this.code}): super._(); + + + final int code; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$WsServerMessage_ErrorCopyWith get copyWith => _$WsServerMessage_ErrorCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is WsServerMessage_Error&&(identical(other.code, code) || other.code == code)); +} + + +@override +int get hashCode => Object.hash(runtimeType,code); + +@override +String toString() { + return 'WsServerMessage.error(code: $code)'; +} + + +} + +/// @nodoc +abstract mixin class $WsServerMessage_ErrorCopyWith<$Res> implements $WsServerMessageCopyWith<$Res> { + factory $WsServerMessage_ErrorCopyWith(WsServerMessage_Error value, $Res Function(WsServerMessage_Error) _then) = _$WsServerMessage_ErrorCopyWithImpl; +@useResult +$Res call({ + int code +}); + + + + +} +/// @nodoc +class _$WsServerMessage_ErrorCopyWithImpl<$Res> + implements $WsServerMessage_ErrorCopyWith<$Res> { + _$WsServerMessage_ErrorCopyWithImpl(this._self, this._then); + + final WsServerMessage_Error _self; + final $Res Function(WsServerMessage_Error) _then; + +/// Create a copy of WsServerMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? code = null,}) { + return _then(WsServerMessage_Error( +code: null == code ? _self.code : code // ignore: cast_nullable_to_non_nullable +as int, + )); +} + + +} + +// dart format on diff --git a/app/lib/rust/frb_generated.dart b/app/lib/rust/frb_generated.dart new file mode 100644 index 0000000..3e88156 --- /dev/null +++ b/app/lib/rust/frb_generated.dart @@ -0,0 +1,4905 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field + +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:localsend_app/rust/api/crypto.dart'; +import 'package:localsend_app/rust/api/http.dart'; +import 'package:localsend_app/rust/api/logging.dart'; +import 'package:localsend_app/rust/api/model.dart'; +import 'package:localsend_app/rust/api/stream.dart'; +import 'package:localsend_app/rust/api/webrtc.dart'; +import 'package:localsend_app/rust/frb_generated.dart'; +import 'package:localsend_app/rust/frb_generated.io.dart' if (dart.library.js_interop) 'frb_generated.web.dart'; +import 'package:uuid/uuid.dart'; + +/// Main entrypoint of the Rust API +class RustLib extends BaseEntrypoint { + @internal + static final instance = RustLib._(); + + RustLib._(); + + /// Initialize flutter_rust_bridge + static Future init({ + RustLibApi? api, + BaseHandler? handler, + ExternalLibrary? externalLibrary, + bool forceSameCodegenVersion = true, + }) async { + await instance.initImpl( + api: api, + handler: handler, + externalLibrary: externalLibrary, + forceSameCodegenVersion: forceSameCodegenVersion, + ); + } + + /// Initialize flutter_rust_bridge in mock mode. + /// No libraries for FFI are loaded. + static void initMock({ + required RustLibApi api, + }) { + instance.initMockImpl( + api: api, + ); + } + + /// Dispose flutter_rust_bridge + /// + /// The call to this function is optional, since flutter_rust_bridge (and everything else) + /// is automatically disposed when the app stops. + static void dispose() => instance.disposeImpl(); + + @override + ApiImplConstructor get apiImplConstructor => RustLibApiImpl.new; + + @override + WireConstructor get wireConstructor => RustLibWire.fromExternalLibrary; + + @override + Future executeRustInitializers() async {} + + @override + ExternalLibraryLoaderConfig get defaultExternalLibraryLoaderConfig => kDefaultExternalLibraryLoaderConfig; + + @override + String get codegenVersion => '2.11.1'; + + @override + int get rustContentHash => -137920352; + + static const kDefaultExternalLibraryLoaderConfig = ExternalLibraryLoaderConfig( + stem: 'rust_lib_localsend_app', + ioDirectory: 'rust/target/release/', + webPrefix: 'pkg/', + ); +} + +abstract class RustLibApi extends BaseApi { + Future crateApiStreamDart2RustStreamSinkAdd({ + required Dart2RustStreamSink that, + required List data, + }); + + Future crateApiWebrtcLsSignalingConnectionAcceptOffer({ + required LsSignalingConnection that, + required List stunServers, + required WsServerSdpMessage offer, + required String privateKey, + ExpectingPublicKey? expectingPublicKey, + PinConfig? pin, + }); + + Future crateApiWebrtcLsSignalingConnectionSendOffer({ + required LsSignalingConnection that, + required List stunServers, + required UuidValue target, + required String privateKey, + ExpectingPublicKey? expectingPublicKey, + PinConfig? pin, + required List files, + }); + + Future crateApiWebrtcLsSignalingConnectionUpdateInfo({ + required LsSignalingConnection that, + required ClientInfoWithoutId info, + }); + + Future crateApiHttpRsHttpClientCancel({ + required RsHttpClient that, + required ProtocolType protocol, + required String ip, + required int port, + required String sessionId, + }); + + Future crateApiHttpRsHttpClientPrepareUpload({ + required RsHttpClient that, + required ProtocolType protocol, + required String ip, + required int port, + required PrepareUploadRequestDto payload, + String? publicKey, + String? pin, + }); + + Future crateApiHttpRsHttpClientRegister({ + required RsHttpClient that, + required ProtocolType protocol, + required String ip, + required int port, + required RegisterDto payload, + }); + + Future crateApiHttpRsHttpClientUpload({ + required RsHttpClient that, + required ProtocolType protocol, + required String ip, + required int port, + String? publicKey, + required String sessionId, + required String fileId, + required String token, + required Dart2RustStreamReceiver binary, + }); + + Future crateApiWebrtcRtcFileReceiverGetFileId({ + required RtcFileReceiver that, + }); + + Stream crateApiWebrtcRtcFileReceiverReceive({ + required RtcFileReceiver that, + }); + + Future crateApiWebrtcRtcFileSenderSend({ + required RtcFileSender that, + required List data, + }); + + Future crateApiWebrtcRtcReceiveControllerDecline({ + required RtcReceiveController that, + }); + + Stream crateApiWebrtcRtcReceiveControllerListenError({ + required RtcReceiveController that, + }); + + Future> crateApiWebrtcRtcReceiveControllerListenFiles({ + required RtcReceiveController that, + }); + + Stream crateApiWebrtcRtcReceiveControllerListenReceiving({ + required RtcReceiveController that, + }); + + Stream crateApiWebrtcRtcReceiveControllerListenStatus({ + required RtcReceiveController that, + }); + + Future crateApiWebrtcRtcReceiveControllerSendFileStatus({ + required RtcReceiveController that, + required RTCSendFileResponse status, + }); + + Future crateApiWebrtcRtcReceiveControllerSendPin({ + required RtcReceiveController that, + required String pin, + }); + + Future crateApiWebrtcRtcReceiveControllerSendSelection({ + required RtcReceiveController that, + required Set selection, + }); + + Stream crateApiWebrtcRtcSendControllerListenError({ + required RtcSendController that, + }); + + Future> crateApiWebrtcRtcSendControllerListenSelectedFiles({ + required RtcSendController that, + }); + + Stream crateApiWebrtcRtcSendControllerListenStatus({ + required RtcSendController that, + }); + + Future crateApiWebrtcRtcSendControllerSendFile({ + required RtcSendController that, + required String fileId, + }); + + Future crateApiWebrtcRtcSendControllerSendPin({ + required RtcSendController that, + required String pin, + }); + + Stream crateApiWebrtcConnect({ + required String uri, + required ProposingClientInfo info, + required String privateKey, + required FutureOr Function(LsSignalingConnection) onConnection, + }); + + RsHttpClient crateApiHttpCreateClient({ + required String privateKey, + required String cert, + required LsHttpClientVersion version, + }); + + Future<(Dart2RustStreamSink, Dart2RustStreamReceiver)> crateApiStreamCreateStream(); + + Future crateApiLoggingEnableDebugLogging(); + + Future crateApiCryptoGenerateKeyPair(); + + Future crateApiCryptoVerifyCert({ + required String cert, + required String publicKey, + }); + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_Dart2RustStreamReceiver; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_Dart2RustStreamReceiver; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_Dart2RustStreamReceiverPtr; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_Dart2RustStreamSink; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_Dart2RustStreamSink; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_Dart2RustStreamSinkPtr; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_LsSignalingConnection; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_LsSignalingConnection; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_LsSignalingConnectionPtr; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_RtcFileReceiver; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_RtcFileReceiver; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RtcFileReceiverPtr; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_RtcFileSender; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_RtcFileSender; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RtcFileSenderPtr; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_RtcReceiveController; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_RtcReceiveController; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RtcReceiveControllerPtr; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_RtcSendController; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_RtcSendController; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RtcSendControllerPtr; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_RsHttpClient; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_RsHttpClient; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RsHttpClientPtr; +} + +class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { + RustLibApiImpl({ + required super.handler, + required super.wire, + required super.generalizedFrbRustBinding, + required super.portManager, + }); + + @override + Future crateApiStreamDart2RustStreamSinkAdd({ + required Dart2RustStreamSink that, + required List data, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + that, + serializer, + ); + sse_encode_list_prim_u_8_loose(data, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 1, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_String, + ), + constMeta: kCrateApiStreamDart2RustStreamSinkAddConstMeta, + argValues: [that, data], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiStreamDart2RustStreamSinkAddConstMeta => const TaskConstMeta( + debugName: 'Dart2RustStreamSink_add', + argNames: ['that', 'data'], + ); + + @override + Future crateApiWebrtcLsSignalingConnectionAcceptOffer({ + required LsSignalingConnection that, + required List stunServers, + required WsServerSdpMessage offer, + required String privateKey, + ExpectingPublicKey? expectingPublicKey, + PinConfig? pin, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + that, + serializer, + ); + sse_encode_list_String(stunServers, serializer); + sse_encode_box_autoadd_ws_server_sdp_message(offer, serializer); + sse_encode_String(privateKey, serializer); + sse_encode_opt_box_autoadd_expecting_public_key( + expectingPublicKey, + serializer, + ); + sse_encode_opt_box_autoadd_pin_config(pin, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 2, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcLsSignalingConnectionAcceptOfferConstMeta, + argValues: [ + that, + stunServers, + offer, + privateKey, + expectingPublicKey, + pin, + ], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcLsSignalingConnectionAcceptOfferConstMeta => const TaskConstMeta( + debugName: 'LsSignalingConnection_accept_offer', + argNames: [ + 'that', + 'stunServers', + 'offer', + 'privateKey', + 'expectingPublicKey', + 'pin', + ], + ); + + @override + Future crateApiWebrtcLsSignalingConnectionSendOffer({ + required LsSignalingConnection that, + required List stunServers, + required UuidValue target, + required String privateKey, + ExpectingPublicKey? expectingPublicKey, + PinConfig? pin, + required List files, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + that, + serializer, + ); + sse_encode_list_String(stunServers, serializer); + sse_encode_Uuid(target, serializer); + sse_encode_String(privateKey, serializer); + sse_encode_opt_box_autoadd_expecting_public_key( + expectingPublicKey, + serializer, + ); + sse_encode_opt_box_autoadd_pin_config(pin, serializer); + sse_encode_list_file_dto(files, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 3, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcLsSignalingConnectionSendOfferConstMeta, + argValues: [ + that, + stunServers, + target, + privateKey, + expectingPublicKey, + pin, + files, + ], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcLsSignalingConnectionSendOfferConstMeta => const TaskConstMeta( + debugName: 'LsSignalingConnection_send_offer', + argNames: [ + 'that', + 'stunServers', + 'target', + 'privateKey', + 'expectingPublicKey', + 'pin', + 'files', + ], + ); + + @override + Future crateApiWebrtcLsSignalingConnectionUpdateInfo({ + required LsSignalingConnection that, + required ClientInfoWithoutId info, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + that, + serializer, + ); + sse_encode_box_autoadd_client_info_without_id(info, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 4, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcLsSignalingConnectionUpdateInfoConstMeta, + argValues: [that, info], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcLsSignalingConnectionUpdateInfoConstMeta => const TaskConstMeta( + debugName: 'LsSignalingConnection_update_info', + argNames: ['that', 'info'], + ); + + @override + Future crateApiHttpRsHttpClientCancel({ + required RsHttpClient that, + required ProtocolType protocol, + required String ip, + required int port, + required String sessionId, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + that, + serializer, + ); + sse_encode_protocol_type(protocol, serializer); + sse_encode_String(ip, serializer); + sse_encode_u_16(port, serializer); + sse_encode_String(sessionId, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 5, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_rs_http_client_error, + ), + constMeta: kCrateApiHttpRsHttpClientCancelConstMeta, + argValues: [that, protocol, ip, port, sessionId], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiHttpRsHttpClientCancelConstMeta => const TaskConstMeta( + debugName: 'RsHttpClient_cancel', + argNames: ['that', 'protocol', 'ip', 'port', 'sessionId'], + ); + + @override + Future crateApiHttpRsHttpClientPrepareUpload({ + required RsHttpClient that, + required ProtocolType protocol, + required String ip, + required int port, + required PrepareUploadRequestDto payload, + String? publicKey, + String? pin, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + that, + serializer, + ); + sse_encode_protocol_type(protocol, serializer); + sse_encode_String(ip, serializer); + sse_encode_u_16(port, serializer); + sse_encode_box_autoadd_prepare_upload_request_dto( + payload, + serializer, + ); + sse_encode_opt_String(publicKey, serializer); + sse_encode_opt_String(pin, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 6, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_prepare_upload_result, + decodeErrorData: sse_decode_rs_http_client_error, + ), + constMeta: kCrateApiHttpRsHttpClientPrepareUploadConstMeta, + argValues: [that, protocol, ip, port, payload, publicKey, pin], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiHttpRsHttpClientPrepareUploadConstMeta => const TaskConstMeta( + debugName: 'RsHttpClient_prepare_upload', + argNames: [ + 'that', + 'protocol', + 'ip', + 'port', + 'payload', + 'publicKey', + 'pin', + ], + ); + + @override + Future crateApiHttpRsHttpClientRegister({ + required RsHttpClient that, + required ProtocolType protocol, + required String ip, + required int port, + required RegisterDto payload, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + that, + serializer, + ); + sse_encode_protocol_type(protocol, serializer); + sse_encode_String(ip, serializer); + sse_encode_u_16(port, serializer); + sse_encode_box_autoadd_register_dto(payload, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 7, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_result_with_public_key_register_response_dto, + decodeErrorData: sse_decode_rs_http_client_error, + ), + constMeta: kCrateApiHttpRsHttpClientRegisterConstMeta, + argValues: [that, protocol, ip, port, payload], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiHttpRsHttpClientRegisterConstMeta => const TaskConstMeta( + debugName: 'RsHttpClient_register', + argNames: ['that', 'protocol', 'ip', 'port', 'payload'], + ); + + @override + Future crateApiHttpRsHttpClientUpload({ + required RsHttpClient that, + required ProtocolType protocol, + required String ip, + required int port, + String? publicKey, + required String sessionId, + required String fileId, + required String token, + required Dart2RustStreamReceiver binary, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + that, + serializer, + ); + sse_encode_protocol_type(protocol, serializer); + sse_encode_String(ip, serializer); + sse_encode_u_16(port, serializer); + sse_encode_opt_String(publicKey, serializer); + sse_encode_String(sessionId, serializer); + sse_encode_String(fileId, serializer); + sse_encode_String(token, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + binary, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 8, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_rs_http_client_error, + ), + constMeta: kCrateApiHttpRsHttpClientUploadConstMeta, + argValues: [ + that, + protocol, + ip, + port, + publicKey, + sessionId, + fileId, + token, + binary, + ], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiHttpRsHttpClientUploadConstMeta => const TaskConstMeta( + debugName: 'RsHttpClient_upload', + argNames: [ + 'that', + 'protocol', + 'ip', + 'port', + 'publicKey', + 'sessionId', + 'fileId', + 'token', + 'binary', + ], + ); + + @override + Future crateApiWebrtcRtcFileReceiverGetFileId({ + required RtcFileReceiver that, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + that, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 9, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, + ), + constMeta: kCrateApiWebrtcRtcFileReceiverGetFileIdConstMeta, + argValues: [that], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcRtcFileReceiverGetFileIdConstMeta => const TaskConstMeta( + debugName: 'RtcFileReceiver_get_file_id', + argNames: ['that'], + ); + + @override + Stream crateApiWebrtcRtcFileReceiverReceive({ + required RtcFileReceiver that, + }) { + final sink = RustStreamSink(); + unawaited( + handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + that, + serializer, + ); + sse_encode_StreamSink_list_prim_u_8_strict_Sse(sink, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 10, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcRtcFileReceiverReceiveConstMeta, + argValues: [that, sink], + apiImpl: this, + ), + ), + ); + return sink.stream; + } + + TaskConstMeta get kCrateApiWebrtcRtcFileReceiverReceiveConstMeta => const TaskConstMeta( + debugName: 'RtcFileReceiver_receive', + argNames: ['that', 'sink'], + ); + + @override + Future crateApiWebrtcRtcFileSenderSend({ + required RtcFileSender that, + required List data, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + that, + serializer, + ); + sse_encode_list_prim_u_8_loose(data, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 11, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcRtcFileSenderSendConstMeta, + argValues: [that, data], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcRtcFileSenderSendConstMeta => const TaskConstMeta( + debugName: 'RtcFileSender_send', + argNames: ['that', 'data'], + ); + + @override + Future crateApiWebrtcRtcReceiveControllerDecline({ + required RtcReceiveController that, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + that, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 12, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcRtcReceiveControllerDeclineConstMeta, + argValues: [that], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcRtcReceiveControllerDeclineConstMeta => const TaskConstMeta( + debugName: 'RtcReceiveController_decline', + argNames: ['that'], + ); + + @override + Stream crateApiWebrtcRtcReceiveControllerListenError({ + required RtcReceiveController that, + }) { + final sink = RustStreamSink(); + unawaited( + handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + that, + serializer, + ); + sse_encode_StreamSink_rtc_file_error_Sse(sink, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 13, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiWebrtcRtcReceiveControllerListenErrorConstMeta, + argValues: [that, sink], + apiImpl: this, + ), + ), + ); + return sink.stream; + } + + TaskConstMeta get kCrateApiWebrtcRtcReceiveControllerListenErrorConstMeta => const TaskConstMeta( + debugName: 'RtcReceiveController_listen_error', + argNames: ['that', 'sink'], + ); + + @override + Future> crateApiWebrtcRtcReceiveControllerListenFiles({ + required RtcReceiveController that, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + that, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 14, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_file_dto, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcRtcReceiveControllerListenFilesConstMeta, + argValues: [that], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcRtcReceiveControllerListenFilesConstMeta => const TaskConstMeta( + debugName: 'RtcReceiveController_listen_files', + argNames: ['that'], + ); + + @override + Stream crateApiWebrtcRtcReceiveControllerListenReceiving({ + required RtcReceiveController that, + }) { + final sink = RustStreamSink(); + unawaited( + handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + that, + serializer, + ); + sse_encode_StreamSink_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver_Sse( + sink, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 15, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiWebrtcRtcReceiveControllerListenReceivingConstMeta, + argValues: [that, sink], + apiImpl: this, + ), + ), + ); + return sink.stream; + } + + TaskConstMeta get kCrateApiWebrtcRtcReceiveControllerListenReceivingConstMeta => const TaskConstMeta( + debugName: 'RtcReceiveController_listen_receiving', + argNames: ['that', 'sink'], + ); + + @override + Stream crateApiWebrtcRtcReceiveControllerListenStatus({ + required RtcReceiveController that, + }) { + final sink = RustStreamSink(); + unawaited( + handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + that, + serializer, + ); + sse_encode_StreamSink_rtc_status_Sse(sink, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 16, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiWebrtcRtcReceiveControllerListenStatusConstMeta, + argValues: [that, sink], + apiImpl: this, + ), + ), + ); + return sink.stream; + } + + TaskConstMeta get kCrateApiWebrtcRtcReceiveControllerListenStatusConstMeta => const TaskConstMeta( + debugName: 'RtcReceiveController_listen_status', + argNames: ['that', 'sink'], + ); + + @override + Future crateApiWebrtcRtcReceiveControllerSendFileStatus({ + required RtcReceiveController that, + required RTCSendFileResponse status, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + that, + serializer, + ); + sse_encode_box_autoadd_rtc_send_file_response(status, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 17, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcRtcReceiveControllerSendFileStatusConstMeta, + argValues: [that, status], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcRtcReceiveControllerSendFileStatusConstMeta => const TaskConstMeta( + debugName: 'RtcReceiveController_send_file_status', + argNames: ['that', 'status'], + ); + + @override + Future crateApiWebrtcRtcReceiveControllerSendPin({ + required RtcReceiveController that, + required String pin, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + that, + serializer, + ); + sse_encode_String(pin, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 18, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcRtcReceiveControllerSendPinConstMeta, + argValues: [that, pin], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcRtcReceiveControllerSendPinConstMeta => const TaskConstMeta( + debugName: 'RtcReceiveController_send_pin', + argNames: ['that', 'pin'], + ); + + @override + Future crateApiWebrtcRtcReceiveControllerSendSelection({ + required RtcReceiveController that, + required Set selection, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + that, + serializer, + ); + sse_encode_Set_String_None(selection, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 19, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcRtcReceiveControllerSendSelectionConstMeta, + argValues: [that, selection], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcRtcReceiveControllerSendSelectionConstMeta => const TaskConstMeta( + debugName: 'RtcReceiveController_send_selection', + argNames: ['that', 'selection'], + ); + + @override + Stream crateApiWebrtcRtcSendControllerListenError({ + required RtcSendController that, + }) { + final sink = RustStreamSink(); + unawaited( + handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + that, + serializer, + ); + sse_encode_StreamSink_rtc_file_error_Sse(sink, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 20, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiWebrtcRtcSendControllerListenErrorConstMeta, + argValues: [that, sink], + apiImpl: this, + ), + ), + ); + return sink.stream; + } + + TaskConstMeta get kCrateApiWebrtcRtcSendControllerListenErrorConstMeta => const TaskConstMeta( + debugName: 'RtcSendController_listen_error', + argNames: ['that', 'sink'], + ); + + @override + Future> crateApiWebrtcRtcSendControllerListenSelectedFiles({ + required RtcSendController that, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + that, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 21, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_Set_String_None, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcRtcSendControllerListenSelectedFilesConstMeta, + argValues: [that], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcRtcSendControllerListenSelectedFilesConstMeta => const TaskConstMeta( + debugName: 'RtcSendController_listen_selected_files', + argNames: ['that'], + ); + + @override + Stream crateApiWebrtcRtcSendControllerListenStatus({ + required RtcSendController that, + }) { + final sink = RustStreamSink(); + unawaited( + handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + that, + serializer, + ); + sse_encode_StreamSink_rtc_status_Sse(sink, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 22, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiWebrtcRtcSendControllerListenStatusConstMeta, + argValues: [that, sink], + apiImpl: this, + ), + ), + ); + return sink.stream; + } + + TaskConstMeta get kCrateApiWebrtcRtcSendControllerListenStatusConstMeta => const TaskConstMeta( + debugName: 'RtcSendController_listen_status', + argNames: ['that', 'sink'], + ); + + @override + Future crateApiWebrtcRtcSendControllerSendFile({ + required RtcSendController that, + required String fileId, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + that, + serializer, + ); + sse_encode_String(fileId, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 23, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcRtcSendControllerSendFileConstMeta, + argValues: [that, fileId], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcRtcSendControllerSendFileConstMeta => const TaskConstMeta( + debugName: 'RtcSendController_send_file', + argNames: ['that', 'fileId'], + ); + + @override + Future crateApiWebrtcRtcSendControllerSendPin({ + required RtcSendController that, + required String pin, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + that, + serializer, + ); + sse_encode_String(pin, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 24, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiWebrtcRtcSendControllerSendPinConstMeta, + argValues: [that, pin], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiWebrtcRtcSendControllerSendPinConstMeta => const TaskConstMeta( + debugName: 'RtcSendController_send_pin', + argNames: ['that', 'pin'], + ); + + @override + Stream crateApiWebrtcConnect({ + required String uri, + required ProposingClientInfo info, + required String privateKey, + required FutureOr Function(LsSignalingConnection) onConnection, + }) { + final sink = RustStreamSink(); + unawaited( + handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_StreamSink_ws_server_message_Sse(sink, serializer); + sse_encode_String(uri, serializer); + sse_encode_box_autoadd_proposing_client_info(info, serializer); + sse_encode_String(privateKey, serializer); + sse_encode_DartFn_Inputs_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection_Output_unit_AnyhowException( + onConnection, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 25, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiWebrtcConnectConstMeta, + argValues: [sink, uri, info, privateKey, onConnection], + apiImpl: this, + ), + ), + ); + return sink.stream; + } + + TaskConstMeta get kCrateApiWebrtcConnectConstMeta => const TaskConstMeta( + debugName: 'connect', + argNames: ['sink', 'uri', 'info', 'privateKey', 'onConnection'], + ); + + @override + RsHttpClient crateApiHttpCreateClient({ + required String privateKey, + required String cert, + required LsHttpClientVersion version, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(privateKey, serializer); + sse_encode_String(cert, serializer); + sse_encode_ls_http_client_version(version, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 26)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient, + decodeErrorData: sse_decode_rs_http_client_error, + ), + constMeta: kCrateApiHttpCreateClientConstMeta, + argValues: [privateKey, cert, version], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiHttpCreateClientConstMeta => const TaskConstMeta( + debugName: 'create_client', + argNames: ['privateKey', 'cert', 'version'], + ); + + @override + Future<(Dart2RustStreamSink, Dart2RustStreamReceiver)> crateApiStreamCreateStream() { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 27, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_sink_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_receiver, + decodeErrorData: null, + ), + constMeta: kCrateApiStreamCreateStreamConstMeta, + argValues: [], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiStreamCreateStreamConstMeta => const TaskConstMeta( + debugName: 'create_stream', + argNames: [], + ); + + @override + Future crateApiLoggingEnableDebugLogging() { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 28, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiLoggingEnableDebugLoggingConstMeta, + argValues: [], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiLoggingEnableDebugLoggingConstMeta => const TaskConstMeta( + debugName: 'enable_debug_logging', + argNames: [], + ); + + @override + Future crateApiCryptoGenerateKeyPair() { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 29, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_key_pair, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiCryptoGenerateKeyPairConstMeta, + argValues: [], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiCryptoGenerateKeyPairConstMeta => const TaskConstMeta( + debugName: 'generate_key_pair', + argNames: [], + ); + + @override + Future crateApiCryptoVerifyCert({ + required String cert, + required String publicKey, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(cert, serializer); + sse_encode_String(publicKey, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 30, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiCryptoVerifyCertConstMeta, + argValues: [cert, publicKey], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiCryptoVerifyCertConstMeta => const TaskConstMeta( + debugName: 'verify_cert', + argNames: ['cert', 'publicKey'], + ); + + Future Function(int, dynamic) + encode_DartFn_Inputs_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection_Output_unit_AnyhowException( + FutureOr Function(LsSignalingConnection) raw, + ) { + return (callId, rawArg0) async { + final arg0 = dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + rawArg0, + ); + + Box? rawOutput; + Box? rawError; + try { + rawOutput = Box(await raw(arg0)); + } catch (e, s) { + rawError = Box(AnyhowException('$e\n\n$s')); + } + + final serializer = SseSerializer(generalizedFrbRustBinding); + assert((rawOutput != null) ^ (rawError != null)); + if (rawOutput != null) { + serializer.buffer.putUint8(0); + sse_encode_unit(rawOutput.value, serializer); + } else { + serializer.buffer.putUint8(1); + sse_encode_AnyhowException(rawError!.value, serializer); + } + final output = serializer.intoRaw(); + + generalizedFrbRustBinding.dartFnDeliverOutput( + callId: callId, + ptr: output.ptr, + rustVecLen: output.rustVecLen, + dataLen: output.dataLen, + ); + }; + } + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_Dart2RustStreamReceiver => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_Dart2RustStreamReceiver => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_Dart2RustStreamSink => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_Dart2RustStreamSink => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_LsSignalingConnection => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_LsSignalingConnection => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_RtcFileReceiver => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_RtcFileReceiver => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_RtcFileSender => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_RtcFileSender => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_RtcReceiveController => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_RtcReceiveController => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_RtcSendController => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_RtcSendController => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController; + + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_RsHttpClient => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient; + + RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_RsHttpClient => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient; + + @protected + AnyhowException dco_decode_AnyhowException(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return AnyhowException(raw as String); + } + + @protected + Dart2RustStreamReceiver dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return Dart2RustStreamReceiverImpl.frbInternalDcoDecode( + raw as List, + ); + } + + @protected + Dart2RustStreamSink dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return Dart2RustStreamSinkImpl.frbInternalDcoDecode(raw as List); + } + + @protected + LsSignalingConnection dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return LsSignalingConnectionImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcFileReceiver dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcFileReceiverImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcFileSender dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcFileSenderImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcReceiveController dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcReceiveControllerImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcSendController dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcSendControllerImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RsHttpClient dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RsHttpClientImpl.frbInternalDcoDecode(raw as List); + } + + @protected + Dart2RustStreamSink dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return Dart2RustStreamSinkImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcSendController dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcSendControllerImpl.frbInternalDcoDecode(raw as List); + } + + @protected + LsSignalingConnection dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return LsSignalingConnectionImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcFileReceiver dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcFileReceiverImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcFileSender dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcFileSenderImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcReceiveController dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcReceiveControllerImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcSendController dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcSendControllerImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RsHttpClient dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RsHttpClientImpl.frbInternalDcoDecode(raw as List); + } + + @protected + FutureOr Function(LsSignalingConnection) + dco_decode_DartFn_Inputs_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection_Output_unit_AnyhowException( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + throw UnimplementedError(''); + } + + @protected + Object dco_decode_DartOpaque(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return decodeDartOpaque(raw, generalizedFrbRustBinding); + } + + @protected + Map dco_decode_Map_String_String_None(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return Map.fromEntries( + dco_decode_list_record_string_string( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); + } + + @protected + Map dco_decode_Map_String_file_dto_None(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return Map.fromEntries( + dco_decode_list_record_string_file_dto( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); + } + + @protected + Dart2RustStreamReceiver dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return Dart2RustStreamReceiverImpl.frbInternalDcoDecode( + raw as List, + ); + } + + @protected + Dart2RustStreamSink dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return Dart2RustStreamSinkImpl.frbInternalDcoDecode(raw as List); + } + + @protected + LsSignalingConnection dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return LsSignalingConnectionImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcFileReceiver dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcFileReceiverImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcFileSender dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcFileSenderImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcReceiveController dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcReceiveControllerImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RtcSendController dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RtcSendControllerImpl.frbInternalDcoDecode(raw as List); + } + + @protected + RsHttpClient dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return RsHttpClientImpl.frbInternalDcoDecode(raw as List); + } + + @protected + Set dco_decode_Set_String_None(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return Set.from(dco_decode_list_String(raw)); + } + + @protected + RustStreamSink dco_decode_StreamSink_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver_Sse( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + throw UnimplementedError(); + } + + @protected + RustStreamSink dco_decode_StreamSink_list_prim_u_8_strict_Sse( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + throw UnimplementedError(); + } + + @protected + RustStreamSink dco_decode_StreamSink_rtc_file_error_Sse( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + throw UnimplementedError(); + } + + @protected + RustStreamSink dco_decode_StreamSink_rtc_status_Sse(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + throw UnimplementedError(); + } + + @protected + RustStreamSink dco_decode_StreamSink_ws_server_message_Sse( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + throw UnimplementedError(); + } + + @protected + String dco_decode_String(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as String; + } + + @protected + UuidValue dco_decode_Uuid(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return UuidValue.fromByteList(dco_decode_list_prim_u_8_strict(raw)); + } + + @protected + bool dco_decode_bool(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as bool; + } + + @protected + ClientInfo dco_decode_box_autoadd_client_info(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_client_info(raw); + } + + @protected + ClientInfoWithoutId dco_decode_box_autoadd_client_info_without_id( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_client_info_without_id(raw); + } + + @protected + DeviceType dco_decode_box_autoadd_device_type(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_device_type(raw); + } + + @protected + ExpectingPublicKey dco_decode_box_autoadd_expecting_public_key(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_expecting_public_key(raw); + } + + @protected + FileMetadata dco_decode_box_autoadd_file_metadata(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_file_metadata(raw); + } + + @protected + PinConfig dco_decode_box_autoadd_pin_config(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_pin_config(raw); + } + + @protected + PrepareUploadRequestDto dco_decode_box_autoadd_prepare_upload_request_dto( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_prepare_upload_request_dto(raw); + } + + @protected + PrepareUploadResponseDto dco_decode_box_autoadd_prepare_upload_response_dto( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_prepare_upload_response_dto(raw); + } + + @protected + ProposingClientInfo dco_decode_box_autoadd_proposing_client_info( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_proposing_client_info(raw); + } + + @protected + RegisterDto dco_decode_box_autoadd_register_dto(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_register_dto(raw); + } + + @protected + RTCSendFileResponse dco_decode_box_autoadd_rtc_send_file_response( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_rtc_send_file_response(raw); + } + + @protected + WsServerSdpMessage dco_decode_box_autoadd_ws_server_sdp_message(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_ws_server_sdp_message(raw); + } + + @protected + ClientInfo dco_decode_client_info(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 6) throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); + return ClientInfo( + id: dco_decode_Uuid(arr[0]), + alias: dco_decode_String(arr[1]), + version: dco_decode_String(arr[2]), + deviceModel: dco_decode_opt_String(arr[3]), + deviceType: dco_decode_opt_box_autoadd_device_type(arr[4]), + token: dco_decode_String(arr[5]), + ); + } + + @protected + ClientInfoWithoutId dco_decode_client_info_without_id(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 5) throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return ClientInfoWithoutId( + alias: dco_decode_String(arr[0]), + version: dco_decode_String(arr[1]), + deviceModel: dco_decode_opt_String(arr[2]), + deviceType: dco_decode_opt_box_autoadd_device_type(arr[3]), + token: dco_decode_String(arr[4]), + ); + } + + @protected + DeviceType dco_decode_device_type(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return DeviceType.values[raw as int]; + } + + @protected + ExpectingPublicKey dco_decode_expecting_public_key(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return ExpectingPublicKey( + publicKey: dco_decode_String(arr[0]), + kind: dco_decode_String(arr[1]), + ); + } + + @protected + FileDto dco_decode_file_dto(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 7) throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); + return FileDto( + id: dco_decode_String(arr[0]), + fileName: dco_decode_String(arr[1]), + size: dco_decode_u_64(arr[2]), + fileType: dco_decode_String(arr[3]), + sha256: dco_decode_opt_String(arr[4]), + preview: dco_decode_opt_String(arr[5]), + metadata: dco_decode_opt_box_autoadd_file_metadata(arr[6]), + ); + } + + @protected + FileMetadata dco_decode_file_metadata(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return FileMetadata( + modified: dco_decode_opt_String(arr[0]), + accessed: dco_decode_opt_String(arr[1]), + ); + } + + @protected + int dco_decode_i_32(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as int; + } + + @protected + PlatformInt64 dco_decode_isize(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dcoDecodeI64(raw); + } + + @protected + KeyPair dco_decode_key_pair(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return KeyPair( + privateKey: dco_decode_String(arr[0]), + publicKey: dco_decode_String(arr[1]), + ); + } + + @protected + List dco_decode_list_String(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List).map(dco_decode_String).toList(); + } + + @protected + List dco_decode_list_client_info(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List).map(dco_decode_client_info).toList(); + } + + @protected + List dco_decode_list_file_dto(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List).map(dco_decode_file_dto).toList(); + } + + @protected + List dco_decode_list_prim_u_8_loose(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as List; + } + + @protected + Uint8List dco_decode_list_prim_u_8_strict(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as Uint8List; + } + + @protected + List<(String, FileDto)> dco_decode_list_record_string_file_dto(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List).map(dco_decode_record_string_file_dto).toList(); + } + + @protected + List<(String, String)> dco_decode_list_record_string_string(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List).map(dco_decode_record_string_string).toList(); + } + + @protected + LsHttpClientVersion dco_decode_ls_http_client_version(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return LsHttpClientVersion.values[raw as int]; + } + + @protected + String? dco_decode_opt_String(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_String(raw); + } + + @protected + DeviceType? dco_decode_opt_box_autoadd_device_type(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_box_autoadd_device_type(raw); + } + + @protected + ExpectingPublicKey? dco_decode_opt_box_autoadd_expecting_public_key( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_box_autoadd_expecting_public_key(raw); + } + + @protected + FileMetadata? dco_decode_opt_box_autoadd_file_metadata(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_box_autoadd_file_metadata(raw); + } + + @protected + PinConfig? dco_decode_opt_box_autoadd_pin_config(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_box_autoadd_pin_config(raw); + } + + @protected + PrepareUploadResponseDto? dco_decode_opt_box_autoadd_prepare_upload_response_dto(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_box_autoadd_prepare_upload_response_dto(raw); + } + + @protected + PinConfig dco_decode_pin_config(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return PinConfig( + pin: dco_decode_String(arr[0]), + maxTries: dco_decode_u_8(arr[1]), + ); + } + + @protected + PrepareUploadRequestDto dco_decode_prepare_upload_request_dto(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return PrepareUploadRequestDto( + info: dco_decode_register_dto(arr[0]), + files: dco_decode_Map_String_file_dto_None(arr[1]), + ); + } + + @protected + PrepareUploadResponseDto dco_decode_prepare_upload_response_dto(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return PrepareUploadResponseDto( + sessionId: dco_decode_String(arr[0]), + files: dco_decode_Map_String_String_None(arr[1]), + ); + } + + @protected + PrepareUploadResult dco_decode_prepare_upload_result(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return PrepareUploadResult( + statusCode: dco_decode_u_16(arr[0]), + response: dco_decode_opt_box_autoadd_prepare_upload_response_dto(arr[1]), + ); + } + + @protected + ProposingClientInfo dco_decode_proposing_client_info(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 4) throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return ProposingClientInfo( + alias: dco_decode_String(arr[0]), + version: dco_decode_String(arr[1]), + deviceModel: dco_decode_opt_String(arr[2]), + deviceType: dco_decode_opt_box_autoadd_device_type(arr[3]), + ); + } + + @protected + ProtocolType dco_decode_protocol_type(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return ProtocolType.values[raw as int]; + } + + @protected + (Dart2RustStreamSink, Dart2RustStreamReceiver) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_sink_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_receiver( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + arr[0], + ), + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + arr[1], + ), + ); + } + + @protected + (String, FileDto) dco_decode_record_string_file_dto(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_file_dto(arr[1]), + ); + } + + @protected + (String, String) dco_decode_record_string_string(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_String(arr[1]), + ); + } + + @protected + RegisterDto dco_decode_register_dto(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 8) throw Exception('unexpected arr length: expect 8 but see ${arr.length}'); + return RegisterDto( + alias: dco_decode_String(arr[0]), + version: dco_decode_String(arr[1]), + deviceModel: dco_decode_opt_String(arr[2]), + deviceType: dco_decode_opt_box_autoadd_device_type(arr[3]), + token: dco_decode_String(arr[4]), + port: dco_decode_u_16(arr[5]), + protocol: dco_decode_protocol_type(arr[6]), + hasWebInterface: dco_decode_bool(arr[7]), + ); + } + + @protected + RegisterResponseDto dco_decode_register_response_dto(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 6) throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); + return RegisterResponseDto( + alias: dco_decode_String(arr[0]), + version: dco_decode_String(arr[1]), + deviceModel: dco_decode_opt_String(arr[2]), + deviceType: dco_decode_opt_box_autoadd_device_type(arr[3]), + token: dco_decode_String(arr[4]), + hasWebInterface: dco_decode_bool(arr[5]), + ); + } + + @protected + ResultWithPublicKeyRegisterResponseDto dco_decode_result_with_public_key_register_response_dto(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return ResultWithPublicKeyRegisterResponseDto( + publicKey: dco_decode_opt_String(arr[0]), + body: dco_decode_register_response_dto(arr[1]), + ); + } + + @protected + RsHttpClientError dco_decode_rs_http_client_error(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return RsHttpClientError_StatusCode( + status: dco_decode_u_16(raw[1]), + message: dco_decode_opt_String(raw[2]), + ); + case 1: + return RsHttpClientError_Reqwest( + dco_decode_String(raw[1]), + ); + case 2: + return RsHttpClientError_Json( + dco_decode_String(raw[1]), + ); + case 3: + return RsHttpClientError_Io( + dco_decode_String(raw[1]), + ); + case 4: + return RsHttpClientError_Other( + dco_decode_String(raw[1]), + ); + default: + throw Exception('unreachable'); + } + } + + @protected + RTCFileError dco_decode_rtc_file_error(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return RTCFileError( + fileId: dco_decode_String(arr[0]), + error: dco_decode_String(arr[1]), + ); + } + + @protected + RTCSendFileResponse dco_decode_rtc_send_file_response(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return RTCSendFileResponse( + id: dco_decode_String(arr[0]), + success: dco_decode_bool(arr[1]), + error: dco_decode_opt_String(arr[2]), + ); + } + + @protected + RTCStatus dco_decode_rtc_status(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return RTCStatus_SdpExchanged(); + case 1: + return RTCStatus_Connected(); + case 2: + return RTCStatus_PinRequired(); + case 3: + return RTCStatus_TooManyAttempts(); + case 4: + return RTCStatus_Declined(); + case 5: + return RTCStatus_Sending(); + case 6: + return RTCStatus_Finished(); + case 7: + return RTCStatus_Error( + dco_decode_String(raw[1]), + ); + default: + throw Exception('unreachable'); + } + } + + @protected + int dco_decode_u_16(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as int; + } + + @protected + BigInt dco_decode_u_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dcoDecodeU64(raw); + } + + @protected + int dco_decode_u_8(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as int; + } + + @protected + void dco_decode_unit(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return; + } + + @protected + BigInt dco_decode_usize(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dcoDecodeU64(raw); + } + + @protected + WsServerMessage dco_decode_ws_server_message(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return WsServerMessage_Hello( + client: dco_decode_box_autoadd_client_info(raw[1]), + peers: dco_decode_list_client_info(raw[2]), + ); + case 1: + return WsServerMessage_Join( + peer: dco_decode_box_autoadd_client_info(raw[1]), + ); + case 2: + return WsServerMessage_Update( + peer: dco_decode_box_autoadd_client_info(raw[1]), + ); + case 3: + return WsServerMessage_Left( + peerId: dco_decode_Uuid(raw[1]), + ); + case 4: + return WsServerMessage_Offer( + dco_decode_box_autoadd_ws_server_sdp_message(raw[1]), + ); + case 5: + return WsServerMessage_Answer( + dco_decode_box_autoadd_ws_server_sdp_message(raw[1]), + ); + case 6: + return WsServerMessage_Error( + code: dco_decode_u_16(raw[1]), + ); + default: + throw Exception('unreachable'); + } + } + + @protected + WsServerSdpMessage dco_decode_ws_server_sdp_message(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return WsServerSdpMessage( + peer: dco_decode_client_info(arr[0]), + sessionId: dco_decode_String(arr[1]), + sdp: dco_decode_String(arr[2]), + ); + } + + @protected + AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_String(deserializer); + return AnyhowException(inner); + } + + @protected + Dart2RustStreamReceiver sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return Dart2RustStreamReceiverImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + Dart2RustStreamSink sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return Dart2RustStreamSinkImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + LsSignalingConnection sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return LsSignalingConnectionImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcFileReceiver sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcFileReceiverImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcFileSender sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcFileSenderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcReceiveController sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcReceiveControllerImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcSendController sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcSendControllerImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RsHttpClient sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RsHttpClientImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + Dart2RustStreamSink sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return Dart2RustStreamSinkImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcSendController sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcSendControllerImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + LsSignalingConnection sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return LsSignalingConnectionImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcFileReceiver sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcFileReceiverImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcFileSender sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcFileSenderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcReceiveController sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcReceiveControllerImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcSendController sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcSendControllerImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RsHttpClient sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RsHttpClientImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + Object sse_decode_DartOpaque(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_isize(deserializer); + return decodeDartOpaque(inner, generalizedFrbRustBinding); + } + + @protected + Map sse_decode_Map_String_String_None( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_list_record_string_string(deserializer); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); + } + + @protected + Map sse_decode_Map_String_file_dto_None( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_list_record_string_file_dto(deserializer); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); + } + + @protected + Dart2RustStreamReceiver sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return Dart2RustStreamReceiverImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + Dart2RustStreamSink sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return Dart2RustStreamSinkImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + LsSignalingConnection sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return LsSignalingConnectionImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcFileReceiver sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcFileReceiverImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcFileSender sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcFileSenderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcReceiveController sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcReceiveControllerImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RtcSendController sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RtcSendControllerImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + RsHttpClient sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return RsHttpClientImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + Set sse_decode_Set_String_None(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_list_String(deserializer); + return Set.from(inner); + } + + @protected + RustStreamSink sse_decode_StreamSink_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver_Sse( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + throw UnimplementedError('Unreachable ()'); + } + + @protected + RustStreamSink sse_decode_StreamSink_list_prim_u_8_strict_Sse( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + throw UnimplementedError('Unreachable ()'); + } + + @protected + RustStreamSink sse_decode_StreamSink_rtc_file_error_Sse( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + throw UnimplementedError('Unreachable ()'); + } + + @protected + RustStreamSink sse_decode_StreamSink_rtc_status_Sse( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + throw UnimplementedError('Unreachable ()'); + } + + @protected + RustStreamSink sse_decode_StreamSink_ws_server_message_Sse( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + throw UnimplementedError('Unreachable ()'); + } + + @protected + String sse_decode_String(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_list_prim_u_8_strict(deserializer); + return utf8.decoder.convert(inner); + } + + @protected + UuidValue sse_decode_Uuid(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_list_prim_u_8_strict(deserializer); + return UuidValue.fromByteList(inner); + } + + @protected + bool sse_decode_bool(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getUint8() != 0; + } + + @protected + ClientInfo sse_decode_box_autoadd_client_info(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_client_info(deserializer)); + } + + @protected + ClientInfoWithoutId sse_decode_box_autoadd_client_info_without_id( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_client_info_without_id(deserializer)); + } + + @protected + DeviceType sse_decode_box_autoadd_device_type(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_device_type(deserializer)); + } + + @protected + ExpectingPublicKey sse_decode_box_autoadd_expecting_public_key( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_expecting_public_key(deserializer)); + } + + @protected + FileMetadata sse_decode_box_autoadd_file_metadata( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_file_metadata(deserializer)); + } + + @protected + PinConfig sse_decode_box_autoadd_pin_config(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_pin_config(deserializer)); + } + + @protected + PrepareUploadRequestDto sse_decode_box_autoadd_prepare_upload_request_dto( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_prepare_upload_request_dto(deserializer)); + } + + @protected + PrepareUploadResponseDto sse_decode_box_autoadd_prepare_upload_response_dto( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_prepare_upload_response_dto(deserializer)); + } + + @protected + ProposingClientInfo sse_decode_box_autoadd_proposing_client_info( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_proposing_client_info(deserializer)); + } + + @protected + RegisterDto sse_decode_box_autoadd_register_dto( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_register_dto(deserializer)); + } + + @protected + RTCSendFileResponse sse_decode_box_autoadd_rtc_send_file_response( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_rtc_send_file_response(deserializer)); + } + + @protected + WsServerSdpMessage sse_decode_box_autoadd_ws_server_sdp_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_ws_server_sdp_message(deserializer)); + } + + @protected + ClientInfo sse_decode_client_info(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_id = sse_decode_Uuid(deserializer); + var var_alias = sse_decode_String(deserializer); + var var_version = sse_decode_String(deserializer); + var var_deviceModel = sse_decode_opt_String(deserializer); + var var_deviceType = sse_decode_opt_box_autoadd_device_type(deserializer); + var var_token = sse_decode_String(deserializer); + return ClientInfo( + id: var_id, + alias: var_alias, + version: var_version, + deviceModel: var_deviceModel, + deviceType: var_deviceType, + token: var_token, + ); + } + + @protected + ClientInfoWithoutId sse_decode_client_info_without_id( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_alias = sse_decode_String(deserializer); + var var_version = sse_decode_String(deserializer); + var var_deviceModel = sse_decode_opt_String(deserializer); + var var_deviceType = sse_decode_opt_box_autoadd_device_type(deserializer); + var var_token = sse_decode_String(deserializer); + return ClientInfoWithoutId( + alias: var_alias, + version: var_version, + deviceModel: var_deviceModel, + deviceType: var_deviceType, + token: var_token, + ); + } + + @protected + DeviceType sse_decode_device_type(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return DeviceType.values[inner]; + } + + @protected + ExpectingPublicKey sse_decode_expecting_public_key( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_publicKey = sse_decode_String(deserializer); + var var_kind = sse_decode_String(deserializer); + return ExpectingPublicKey(publicKey: var_publicKey, kind: var_kind); + } + + @protected + FileDto sse_decode_file_dto(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_id = sse_decode_String(deserializer); + var var_fileName = sse_decode_String(deserializer); + var var_size = sse_decode_u_64(deserializer); + var var_fileType = sse_decode_String(deserializer); + var var_sha256 = sse_decode_opt_String(deserializer); + var var_preview = sse_decode_opt_String(deserializer); + var var_metadata = sse_decode_opt_box_autoadd_file_metadata(deserializer); + return FileDto( + id: var_id, + fileName: var_fileName, + size: var_size, + fileType: var_fileType, + sha256: var_sha256, + preview: var_preview, + metadata: var_metadata, + ); + } + + @protected + FileMetadata sse_decode_file_metadata(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_modified = sse_decode_opt_String(deserializer); + var var_accessed = sse_decode_opt_String(deserializer); + return FileMetadata(modified: var_modified, accessed: var_accessed); + } + + @protected + int sse_decode_i_32(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getInt32(); + } + + @protected + PlatformInt64 sse_decode_isize(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getPlatformInt64(); + } + + @protected + KeyPair sse_decode_key_pair(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_privateKey = sse_decode_String(deserializer); + var var_publicKey = sse_decode_String(deserializer); + return KeyPair(privateKey: var_privateKey, publicKey: var_publicKey); + } + + @protected + List sse_decode_list_String(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_String(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_client_info(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_client_info(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_file_dto(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_file_dto(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_prim_u_8_loose(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var len_ = sse_decode_i_32(deserializer); + return deserializer.buffer.getUint8List(len_); + } + + @protected + Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var len_ = sse_decode_i_32(deserializer); + return deserializer.buffer.getUint8List(len_); + } + + @protected + List<(String, FileDto)> sse_decode_list_record_string_file_dto( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, FileDto)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_file_dto(deserializer)); + } + return ans_; + } + + @protected + List<(String, String)> sse_decode_list_record_string_string( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, String)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_string(deserializer)); + } + return ans_; + } + + @protected + LsHttpClientVersion sse_decode_ls_http_client_version( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return LsHttpClientVersion.values[inner]; + } + + @protected + String? sse_decode_opt_String(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_String(deserializer)); + } else { + return null; + } + } + + @protected + DeviceType? sse_decode_opt_box_autoadd_device_type( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_device_type(deserializer)); + } else { + return null; + } + } + + @protected + ExpectingPublicKey? sse_decode_opt_box_autoadd_expecting_public_key( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_expecting_public_key(deserializer)); + } else { + return null; + } + } + + @protected + FileMetadata? sse_decode_opt_box_autoadd_file_metadata( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_file_metadata(deserializer)); + } else { + return null; + } + } + + @protected + PinConfig? sse_decode_opt_box_autoadd_pin_config( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_pin_config(deserializer)); + } else { + return null; + } + } + + @protected + PrepareUploadResponseDto? sse_decode_opt_box_autoadd_prepare_upload_response_dto( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_prepare_upload_response_dto(deserializer)); + } else { + return null; + } + } + + @protected + PinConfig sse_decode_pin_config(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_pin = sse_decode_String(deserializer); + var var_maxTries = sse_decode_u_8(deserializer); + return PinConfig(pin: var_pin, maxTries: var_maxTries); + } + + @protected + PrepareUploadRequestDto sse_decode_prepare_upload_request_dto( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_info = sse_decode_register_dto(deserializer); + var var_files = sse_decode_Map_String_file_dto_None(deserializer); + return PrepareUploadRequestDto(info: var_info, files: var_files); + } + + @protected + PrepareUploadResponseDto sse_decode_prepare_upload_response_dto( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_sessionId = sse_decode_String(deserializer); + var var_files = sse_decode_Map_String_String_None(deserializer); + return PrepareUploadResponseDto(sessionId: var_sessionId, files: var_files); + } + + @protected + PrepareUploadResult sse_decode_prepare_upload_result( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_statusCode = sse_decode_u_16(deserializer); + var var_response = sse_decode_opt_box_autoadd_prepare_upload_response_dto( + deserializer, + ); + return PrepareUploadResult( + statusCode: var_statusCode, + response: var_response, + ); + } + + @protected + ProposingClientInfo sse_decode_proposing_client_info( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_alias = sse_decode_String(deserializer); + var var_version = sse_decode_String(deserializer); + var var_deviceModel = sse_decode_opt_String(deserializer); + var var_deviceType = sse_decode_opt_box_autoadd_device_type(deserializer); + return ProposingClientInfo( + alias: var_alias, + version: var_version, + deviceModel: var_deviceModel, + deviceType: var_deviceType, + ); + } + + @protected + ProtocolType sse_decode_protocol_type(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return ProtocolType.values[inner]; + } + + @protected + (Dart2RustStreamSink, Dart2RustStreamReceiver) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_sink_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_receiver( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_field0 = sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + deserializer, + ); + var var_field1 = sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + deserializer, + ); + return (var_field0, var_field1); + } + + @protected + (String, FileDto) sse_decode_record_string_file_dto( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_file_dto(deserializer); + return (var_field0, var_field1); + } + + @protected + (String, String) sse_decode_record_string_string( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_String(deserializer); + return (var_field0, var_field1); + } + + @protected + RegisterDto sse_decode_register_dto(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_alias = sse_decode_String(deserializer); + var var_version = sse_decode_String(deserializer); + var var_deviceModel = sse_decode_opt_String(deserializer); + var var_deviceType = sse_decode_opt_box_autoadd_device_type(deserializer); + var var_token = sse_decode_String(deserializer); + var var_port = sse_decode_u_16(deserializer); + var var_protocol = sse_decode_protocol_type(deserializer); + var var_hasWebInterface = sse_decode_bool(deserializer); + return RegisterDto( + alias: var_alias, + version: var_version, + deviceModel: var_deviceModel, + deviceType: var_deviceType, + token: var_token, + port: var_port, + protocol: var_protocol, + hasWebInterface: var_hasWebInterface, + ); + } + + @protected + RegisterResponseDto sse_decode_register_response_dto( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_alias = sse_decode_String(deserializer); + var var_version = sse_decode_String(deserializer); + var var_deviceModel = sse_decode_opt_String(deserializer); + var var_deviceType = sse_decode_opt_box_autoadd_device_type(deserializer); + var var_token = sse_decode_String(deserializer); + var var_hasWebInterface = sse_decode_bool(deserializer); + return RegisterResponseDto( + alias: var_alias, + version: var_version, + deviceModel: var_deviceModel, + deviceType: var_deviceType, + token: var_token, + hasWebInterface: var_hasWebInterface, + ); + } + + @protected + ResultWithPublicKeyRegisterResponseDto sse_decode_result_with_public_key_register_response_dto( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_publicKey = sse_decode_opt_String(deserializer); + var var_body = sse_decode_register_response_dto(deserializer); + return ResultWithPublicKeyRegisterResponseDto( + publicKey: var_publicKey, + body: var_body, + ); + } + + @protected + RsHttpClientError sse_decode_rs_http_client_error( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_status = sse_decode_u_16(deserializer); + var var_message = sse_decode_opt_String(deserializer); + return RsHttpClientError_StatusCode( + status: var_status, + message: var_message, + ); + case 1: + var var_field0 = sse_decode_String(deserializer); + return RsHttpClientError_Reqwest(var_field0); + case 2: + var var_field0 = sse_decode_String(deserializer); + return RsHttpClientError_Json(var_field0); + case 3: + var var_field0 = sse_decode_String(deserializer); + return RsHttpClientError_Io(var_field0); + case 4: + var var_field0 = sse_decode_String(deserializer); + return RsHttpClientError_Other(var_field0); + default: + throw UnimplementedError(''); + } + } + + @protected + RTCFileError sse_decode_rtc_file_error(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_fileId = sse_decode_String(deserializer); + var var_error = sse_decode_String(deserializer); + return RTCFileError(fileId: var_fileId, error: var_error); + } + + @protected + RTCSendFileResponse sse_decode_rtc_send_file_response( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_id = sse_decode_String(deserializer); + var var_success = sse_decode_bool(deserializer); + var var_error = sse_decode_opt_String(deserializer); + return RTCSendFileResponse( + id: var_id, + success: var_success, + error: var_error, + ); + } + + @protected + RTCStatus sse_decode_rtc_status(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + return RTCStatus_SdpExchanged(); + case 1: + return RTCStatus_Connected(); + case 2: + return RTCStatus_PinRequired(); + case 3: + return RTCStatus_TooManyAttempts(); + case 4: + return RTCStatus_Declined(); + case 5: + return RTCStatus_Sending(); + case 6: + return RTCStatus_Finished(); + case 7: + var var_field0 = sse_decode_String(deserializer); + return RTCStatus_Error(var_field0); + default: + throw UnimplementedError(''); + } + } + + @protected + int sse_decode_u_16(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getUint16(); + } + + @protected + BigInt sse_decode_u_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getBigUint64(); + } + + @protected + int sse_decode_u_8(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getUint8(); + } + + @protected + void sse_decode_unit(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + BigInt sse_decode_usize(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getBigUint64(); + } + + @protected + WsServerMessage sse_decode_ws_server_message(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_client = sse_decode_box_autoadd_client_info(deserializer); + var var_peers = sse_decode_list_client_info(deserializer); + return WsServerMessage_Hello(client: var_client, peers: var_peers); + case 1: + var var_peer = sse_decode_box_autoadd_client_info(deserializer); + return WsServerMessage_Join(peer: var_peer); + case 2: + var var_peer = sse_decode_box_autoadd_client_info(deserializer); + return WsServerMessage_Update(peer: var_peer); + case 3: + var var_peerId = sse_decode_Uuid(deserializer); + return WsServerMessage_Left(peerId: var_peerId); + case 4: + var var_field0 = sse_decode_box_autoadd_ws_server_sdp_message( + deserializer, + ); + return WsServerMessage_Offer(var_field0); + case 5: + var var_field0 = sse_decode_box_autoadd_ws_server_sdp_message( + deserializer, + ); + return WsServerMessage_Answer(var_field0); + case 6: + var var_code = sse_decode_u_16(deserializer); + return WsServerMessage_Error(code: var_code); + default: + throw UnimplementedError(''); + } + } + + @protected + WsServerSdpMessage sse_decode_ws_server_sdp_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_peer = sse_decode_client_info(deserializer); + var var_sessionId = sse_decode_String(deserializer); + var var_sdp = sse_decode_String(deserializer); + return WsServerSdpMessage( + peer: var_peer, + sessionId: var_sessionId, + sdp: var_sdp, + ); + } + + @protected + void sse_encode_AnyhowException( + AnyhowException self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.message, serializer); + } + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + Dart2RustStreamReceiver self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as Dart2RustStreamReceiverImpl).frbInternalSseEncode(move: true), + serializer, + ); + } + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + Dart2RustStreamSink self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as Dart2RustStreamSinkImpl).frbInternalSseEncode(move: true), + serializer, + ); + } + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + LsSignalingConnection self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as LsSignalingConnectionImpl).frbInternalSseEncode(move: true), + serializer, + ); + } + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + RtcFileReceiver self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcFileReceiverImpl).frbInternalSseEncode(move: true), + serializer, + ); + } + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + RtcFileSender self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcFileSenderImpl).frbInternalSseEncode(move: true), + serializer, + ); + } + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + RtcReceiveController self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcReceiveControllerImpl).frbInternalSseEncode(move: true), + serializer, + ); + } + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + RtcSendController self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcSendControllerImpl).frbInternalSseEncode(move: true), + serializer, + ); + } + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + RsHttpClient self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RsHttpClientImpl).frbInternalSseEncode(move: true), + serializer, + ); + } + + @protected + void sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + Dart2RustStreamSink self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as Dart2RustStreamSinkImpl).frbInternalSseEncode(move: false), + serializer, + ); + } + + @protected + void sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + RtcSendController self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcSendControllerImpl).frbInternalSseEncode(move: false), + serializer, + ); + } + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + LsSignalingConnection self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as LsSignalingConnectionImpl).frbInternalSseEncode(move: false), + serializer, + ); + } + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + RtcFileReceiver self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcFileReceiverImpl).frbInternalSseEncode(move: false), + serializer, + ); + } + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + RtcFileSender self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcFileSenderImpl).frbInternalSseEncode(move: false), + serializer, + ); + } + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + RtcReceiveController self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcReceiveControllerImpl).frbInternalSseEncode(move: false), + serializer, + ); + } + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + RtcSendController self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcSendControllerImpl).frbInternalSseEncode(move: false), + serializer, + ); + } + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + RsHttpClient self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RsHttpClientImpl).frbInternalSseEncode(move: false), + serializer, + ); + } + + @protected + void + sse_encode_DartFn_Inputs_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection_Output_unit_AnyhowException( + FutureOr Function(LsSignalingConnection) self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_DartOpaque( + encode_DartFn_Inputs_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection_Output_unit_AnyhowException( + self, + ), + serializer, + ); + } + + @protected + void sse_encode_DartOpaque(Object self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_isize( + PlatformPointerUtil.ptrToPlatformInt64( + encodeDartOpaque( + self, + portManager.dartHandlerPort, + generalizedFrbRustBinding, + ), + ), + serializer, + ); + } + + @protected + void sse_encode_Map_String_String_None( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_string( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_file_dto_None( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_file_dto( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + Dart2RustStreamReceiver self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as Dart2RustStreamReceiverImpl).frbInternalSseEncode(move: null), + serializer, + ); + } + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + Dart2RustStreamSink self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as Dart2RustStreamSinkImpl).frbInternalSseEncode(move: null), + serializer, + ); + } + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + LsSignalingConnection self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as LsSignalingConnectionImpl).frbInternalSseEncode(move: null), + serializer, + ); + } + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + RtcFileReceiver self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcFileReceiverImpl).frbInternalSseEncode(move: null), + serializer, + ); + } + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + RtcFileSender self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcFileSenderImpl).frbInternalSseEncode(move: null), + serializer, + ); + } + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + RtcReceiveController self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcReceiveControllerImpl).frbInternalSseEncode(move: null), + serializer, + ); + } + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + RtcSendController self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RtcSendControllerImpl).frbInternalSseEncode(move: null), + serializer, + ); + } + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + RsHttpClient self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as RsHttpClientImpl).frbInternalSseEncode(move: null), + serializer, + ); + } + + @protected + void sse_encode_Set_String_None(Set self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_String(self.toList(), serializer); + } + + @protected + void sse_encode_StreamSink_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver_Sse( + RustStreamSink self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String( + self.setupAndSerialize( + codec: SseCodec( + decodeSuccessData: sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver, + decodeErrorData: sse_decode_AnyhowException, + ), + ), + serializer, + ); + } + + @protected + void sse_encode_StreamSink_list_prim_u_8_strict_Sse( + RustStreamSink self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String( + self.setupAndSerialize( + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_u_8_strict, + decodeErrorData: sse_decode_AnyhowException, + ), + ), + serializer, + ); + } + + @protected + void sse_encode_StreamSink_rtc_file_error_Sse( + RustStreamSink self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String( + self.setupAndSerialize( + codec: SseCodec( + decodeSuccessData: sse_decode_rtc_file_error, + decodeErrorData: sse_decode_AnyhowException, + ), + ), + serializer, + ); + } + + @protected + void sse_encode_StreamSink_rtc_status_Sse( + RustStreamSink self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String( + self.setupAndSerialize( + codec: SseCodec( + decodeSuccessData: sse_decode_rtc_status, + decodeErrorData: sse_decode_AnyhowException, + ), + ), + serializer, + ); + } + + @protected + void sse_encode_StreamSink_ws_server_message_Sse( + RustStreamSink self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String( + self.setupAndSerialize( + codec: SseCodec( + decodeSuccessData: sse_decode_ws_server_message, + decodeErrorData: sse_decode_AnyhowException, + ), + ), + serializer, + ); + } + + @protected + void sse_encode_String(String self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_prim_u_8_strict(utf8.encoder.convert(self), serializer); + } + + @protected + void sse_encode_Uuid(UuidValue self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_prim_u_8_strict(self.toBytes(), serializer); + } + + @protected + void sse_encode_bool(bool self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putUint8(self ? 1 : 0); + } + + @protected + void sse_encode_box_autoadd_client_info( + ClientInfo self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_client_info(self, serializer); + } + + @protected + void sse_encode_box_autoadd_client_info_without_id( + ClientInfoWithoutId self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_client_info_without_id(self, serializer); + } + + @protected + void sse_encode_box_autoadd_device_type( + DeviceType self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_device_type(self, serializer); + } + + @protected + void sse_encode_box_autoadd_expecting_public_key( + ExpectingPublicKey self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_expecting_public_key(self, serializer); + } + + @protected + void sse_encode_box_autoadd_file_metadata( + FileMetadata self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_file_metadata(self, serializer); + } + + @protected + void sse_encode_box_autoadd_pin_config( + PinConfig self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_pin_config(self, serializer); + } + + @protected + void sse_encode_box_autoadd_prepare_upload_request_dto( + PrepareUploadRequestDto self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_prepare_upload_request_dto(self, serializer); + } + + @protected + void sse_encode_box_autoadd_prepare_upload_response_dto( + PrepareUploadResponseDto self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_prepare_upload_response_dto(self, serializer); + } + + @protected + void sse_encode_box_autoadd_proposing_client_info( + ProposingClientInfo self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_proposing_client_info(self, serializer); + } + + @protected + void sse_encode_box_autoadd_register_dto( + RegisterDto self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_register_dto(self, serializer); + } + + @protected + void sse_encode_box_autoadd_rtc_send_file_response( + RTCSendFileResponse self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_rtc_send_file_response(self, serializer); + } + + @protected + void sse_encode_box_autoadd_ws_server_sdp_message( + WsServerSdpMessage self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_ws_server_sdp_message(self, serializer); + } + + @protected + void sse_encode_client_info(ClientInfo self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_Uuid(self.id, serializer); + sse_encode_String(self.alias, serializer); + sse_encode_String(self.version, serializer); + sse_encode_opt_String(self.deviceModel, serializer); + sse_encode_opt_box_autoadd_device_type(self.deviceType, serializer); + sse_encode_String(self.token, serializer); + } + + @protected + void sse_encode_client_info_without_id( + ClientInfoWithoutId self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.alias, serializer); + sse_encode_String(self.version, serializer); + sse_encode_opt_String(self.deviceModel, serializer); + sse_encode_opt_box_autoadd_device_type(self.deviceType, serializer); + sse_encode_String(self.token, serializer); + } + + @protected + void sse_encode_device_type(DeviceType self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.index, serializer); + } + + @protected + void sse_encode_expecting_public_key( + ExpectingPublicKey self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.publicKey, serializer); + sse_encode_String(self.kind, serializer); + } + + @protected + void sse_encode_file_dto(FileDto self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.id, serializer); + sse_encode_String(self.fileName, serializer); + sse_encode_u_64(self.size, serializer); + sse_encode_String(self.fileType, serializer); + sse_encode_opt_String(self.sha256, serializer); + sse_encode_opt_String(self.preview, serializer); + sse_encode_opt_box_autoadd_file_metadata(self.metadata, serializer); + } + + @protected + void sse_encode_file_metadata(FileMetadata self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_opt_String(self.modified, serializer); + sse_encode_opt_String(self.accessed, serializer); + } + + @protected + void sse_encode_i_32(int self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putInt32(self); + } + + @protected + void sse_encode_isize(PlatformInt64 self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putPlatformInt64(self); + } + + @protected + void sse_encode_key_pair(KeyPair self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.privateKey, serializer); + sse_encode_String(self.publicKey, serializer); + } + + @protected + void sse_encode_list_String(List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_String(item, serializer); + } + } + + @protected + void sse_encode_list_client_info( + List self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_client_info(item, serializer); + } + } + + @protected + void sse_encode_list_file_dto(List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_file_dto(item, serializer); + } + } + + @protected + void sse_encode_list_prim_u_8_loose( + List self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + serializer.buffer.putUint8List( + self is Uint8List ? self : Uint8List.fromList(self), + ); + } + + @protected + void sse_encode_list_prim_u_8_strict( + Uint8List self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + serializer.buffer.putUint8List(self); + } + + @protected + void sse_encode_list_record_string_file_dto( + List<(String, FileDto)> self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_record_string_file_dto(item, serializer); + } + } + + @protected + void sse_encode_list_record_string_string( + List<(String, String)> self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_record_string_string(item, serializer); + } + } + + @protected + void sse_encode_ls_http_client_version( + LsHttpClientVersion self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.index, serializer); + } + + @protected + void sse_encode_opt_String(String? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_String(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_device_type( + DeviceType? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_device_type(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_expecting_public_key( + ExpectingPublicKey? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_expecting_public_key(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_file_metadata( + FileMetadata? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_file_metadata(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_pin_config( + PinConfig? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_pin_config(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_prepare_upload_response_dto( + PrepareUploadResponseDto? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_prepare_upload_response_dto(self, serializer); + } + } + + @protected + void sse_encode_pin_config(PinConfig self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.pin, serializer); + sse_encode_u_8(self.maxTries, serializer); + } + + @protected + void sse_encode_prepare_upload_request_dto( + PrepareUploadRequestDto self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_register_dto(self.info, serializer); + sse_encode_Map_String_file_dto_None(self.files, serializer); + } + + @protected + void sse_encode_prepare_upload_response_dto( + PrepareUploadResponseDto self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.sessionId, serializer); + sse_encode_Map_String_String_None(self.files, serializer); + } + + @protected + void sse_encode_prepare_upload_result( + PrepareUploadResult self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_u_16(self.statusCode, serializer); + sse_encode_opt_box_autoadd_prepare_upload_response_dto( + self.response, + serializer, + ); + } + + @protected + void sse_encode_proposing_client_info( + ProposingClientInfo self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.alias, serializer); + sse_encode_String(self.version, serializer); + sse_encode_opt_String(self.deviceModel, serializer); + sse_encode_opt_box_autoadd_device_type(self.deviceType, serializer); + } + + @protected + void sse_encode_protocol_type(ProtocolType self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.index, serializer); + } + + @protected + void + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_sink_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_receiver( + (Dart2RustStreamSink, Dart2RustStreamReceiver) self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + self.$1, + serializer, + ); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + self.$2, + serializer, + ); + } + + @protected + void sse_encode_record_string_file_dto( + (String, FileDto) self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.$1, serializer); + sse_encode_file_dto(self.$2, serializer); + } + + @protected + void sse_encode_record_string_string( + (String, String) self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.$1, serializer); + sse_encode_String(self.$2, serializer); + } + + @protected + void sse_encode_register_dto(RegisterDto self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.alias, serializer); + sse_encode_String(self.version, serializer); + sse_encode_opt_String(self.deviceModel, serializer); + sse_encode_opt_box_autoadd_device_type(self.deviceType, serializer); + sse_encode_String(self.token, serializer); + sse_encode_u_16(self.port, serializer); + sse_encode_protocol_type(self.protocol, serializer); + sse_encode_bool(self.hasWebInterface, serializer); + } + + @protected + void sse_encode_register_response_dto( + RegisterResponseDto self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.alias, serializer); + sse_encode_String(self.version, serializer); + sse_encode_opt_String(self.deviceModel, serializer); + sse_encode_opt_box_autoadd_device_type(self.deviceType, serializer); + sse_encode_String(self.token, serializer); + sse_encode_bool(self.hasWebInterface, serializer); + } + + @protected + void sse_encode_result_with_public_key_register_response_dto( + ResultWithPublicKeyRegisterResponseDto self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_opt_String(self.publicKey, serializer); + sse_encode_register_response_dto(self.body, serializer); + } + + @protected + void sse_encode_rs_http_client_error( + RsHttpClientError self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + switch (self) { + case RsHttpClientError_StatusCode( + status: final status, + message: final message, + ): + sse_encode_i_32(0, serializer); + sse_encode_u_16(status, serializer); + sse_encode_opt_String(message, serializer); + case RsHttpClientError_Reqwest(field0: final field0): + sse_encode_i_32(1, serializer); + sse_encode_String(field0, serializer); + case RsHttpClientError_Json(field0: final field0): + sse_encode_i_32(2, serializer); + sse_encode_String(field0, serializer); + case RsHttpClientError_Io(field0: final field0): + sse_encode_i_32(3, serializer); + sse_encode_String(field0, serializer); + case RsHttpClientError_Other(field0: final field0): + sse_encode_i_32(4, serializer); + sse_encode_String(field0, serializer); + } + } + + @protected + void sse_encode_rtc_file_error(RTCFileError self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.fileId, serializer); + sse_encode_String(self.error, serializer); + } + + @protected + void sse_encode_rtc_send_file_response( + RTCSendFileResponse self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.id, serializer); + sse_encode_bool(self.success, serializer); + sse_encode_opt_String(self.error, serializer); + } + + @protected + void sse_encode_rtc_status(RTCStatus self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + switch (self) { + case RTCStatus_SdpExchanged(): + sse_encode_i_32(0, serializer); + case RTCStatus_Connected(): + sse_encode_i_32(1, serializer); + case RTCStatus_PinRequired(): + sse_encode_i_32(2, serializer); + case RTCStatus_TooManyAttempts(): + sse_encode_i_32(3, serializer); + case RTCStatus_Declined(): + sse_encode_i_32(4, serializer); + case RTCStatus_Sending(): + sse_encode_i_32(5, serializer); + case RTCStatus_Finished(): + sse_encode_i_32(6, serializer); + case RTCStatus_Error(field0: final field0): + sse_encode_i_32(7, serializer); + sse_encode_String(field0, serializer); + } + } + + @protected + void sse_encode_u_16(int self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putUint16(self); + } + + @protected + void sse_encode_u_64(BigInt self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putBigUint64(self); + } + + @protected + void sse_encode_u_8(int self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putUint8(self); + } + + @protected + void sse_encode_unit(void self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + void sse_encode_usize(BigInt self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putBigUint64(self); + } + + @protected + void sse_encode_ws_server_message( + WsServerMessage self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + switch (self) { + case WsServerMessage_Hello(client: final client, peers: final peers): + sse_encode_i_32(0, serializer); + sse_encode_box_autoadd_client_info(client, serializer); + sse_encode_list_client_info(peers, serializer); + case WsServerMessage_Join(peer: final peer): + sse_encode_i_32(1, serializer); + sse_encode_box_autoadd_client_info(peer, serializer); + case WsServerMessage_Update(peer: final peer): + sse_encode_i_32(2, serializer); + sse_encode_box_autoadd_client_info(peer, serializer); + case WsServerMessage_Left(peerId: final peerId): + sse_encode_i_32(3, serializer); + sse_encode_Uuid(peerId, serializer); + case WsServerMessage_Offer(field0: final field0): + sse_encode_i_32(4, serializer); + sse_encode_box_autoadd_ws_server_sdp_message(field0, serializer); + case WsServerMessage_Answer(field0: final field0): + sse_encode_i_32(5, serializer); + sse_encode_box_autoadd_ws_server_sdp_message(field0, serializer); + case WsServerMessage_Error(code: final code): + sse_encode_i_32(6, serializer); + sse_encode_u_16(code, serializer); + } + } + + @protected + void sse_encode_ws_server_sdp_message( + WsServerSdpMessage self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_client_info(self.peer, serializer); + sse_encode_String(self.sessionId, serializer); + sse_encode_String(self.sdp, serializer); + } +} + +@sealed +class Dart2RustStreamReceiverImpl extends RustOpaque implements Dart2RustStreamReceiver { + // Not to be used by end users + Dart2RustStreamReceiverImpl.frbInternalDcoDecode(List wire) : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + Dart2RustStreamReceiverImpl.frbInternalSseDecode( + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: RustLib.instance.api.rust_arc_increment_strong_count_Dart2RustStreamReceiver, + rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_Dart2RustStreamReceiver, + rustArcDecrementStrongCountPtr: RustLib.instance.api.rust_arc_decrement_strong_count_Dart2RustStreamReceiverPtr, + ); +} + +@sealed +class Dart2RustStreamSinkImpl extends RustOpaque implements Dart2RustStreamSink { + // Not to be used by end users + Dart2RustStreamSinkImpl.frbInternalDcoDecode(List wire) : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + Dart2RustStreamSinkImpl.frbInternalSseDecode( + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: RustLib.instance.api.rust_arc_increment_strong_count_Dart2RustStreamSink, + rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_Dart2RustStreamSink, + rustArcDecrementStrongCountPtr: RustLib.instance.api.rust_arc_decrement_strong_count_Dart2RustStreamSinkPtr, + ); + + Future add({required List data}) => RustLib.instance.api.crateApiStreamDart2RustStreamSinkAdd(that: this, data: data); +} + +@sealed +class LsSignalingConnectionImpl extends RustOpaque implements LsSignalingConnection { + // Not to be used by end users + LsSignalingConnectionImpl.frbInternalDcoDecode(List wire) : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + LsSignalingConnectionImpl.frbInternalSseDecode( + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: RustLib.instance.api.rust_arc_increment_strong_count_LsSignalingConnection, + rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_LsSignalingConnection, + rustArcDecrementStrongCountPtr: RustLib.instance.api.rust_arc_decrement_strong_count_LsSignalingConnectionPtr, + ); + + Future acceptOffer({ + required List stunServers, + required WsServerSdpMessage offer, + required String privateKey, + ExpectingPublicKey? expectingPublicKey, + PinConfig? pin, + }) => RustLib.instance.api.crateApiWebrtcLsSignalingConnectionAcceptOffer( + that: this, + stunServers: stunServers, + offer: offer, + privateKey: privateKey, + expectingPublicKey: expectingPublicKey, + pin: pin, + ); + + Future sendOffer({ + required List stunServers, + required UuidValue target, + required String privateKey, + ExpectingPublicKey? expectingPublicKey, + PinConfig? pin, + required List files, + }) => RustLib.instance.api.crateApiWebrtcLsSignalingConnectionSendOffer( + that: this, + stunServers: stunServers, + target: target, + privateKey: privateKey, + expectingPublicKey: expectingPublicKey, + pin: pin, + files: files, + ); + + Future updateInfo({required ClientInfoWithoutId info}) => + RustLib.instance.api.crateApiWebrtcLsSignalingConnectionUpdateInfo(that: this, info: info); +} + +@sealed +class RsHttpClientImpl extends RustOpaque implements RsHttpClient { + // Not to be used by end users + RsHttpClientImpl.frbInternalDcoDecode(List wire) : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + RsHttpClientImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: RustLib.instance.api.rust_arc_increment_strong_count_RsHttpClient, + rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_RsHttpClient, + rustArcDecrementStrongCountPtr: RustLib.instance.api.rust_arc_decrement_strong_count_RsHttpClientPtr, + ); + + Future cancel({ + required ProtocolType protocol, + required String ip, + required int port, + required String sessionId, + }) => RustLib.instance.api.crateApiHttpRsHttpClientCancel( + that: this, + protocol: protocol, + ip: ip, + port: port, + sessionId: sessionId, + ); + + Future prepareUpload({ + required ProtocolType protocol, + required String ip, + required int port, + required PrepareUploadRequestDto payload, + String? publicKey, + String? pin, + }) => RustLib.instance.api.crateApiHttpRsHttpClientPrepareUpload( + that: this, + protocol: protocol, + ip: ip, + port: port, + payload: payload, + publicKey: publicKey, + pin: pin, + ); + + Future register({ + required ProtocolType protocol, + required String ip, + required int port, + required RegisterDto payload, + }) => RustLib.instance.api.crateApiHttpRsHttpClientRegister( + that: this, + protocol: protocol, + ip: ip, + port: port, + payload: payload, + ); + + Future upload({ + required ProtocolType protocol, + required String ip, + required int port, + String? publicKey, + required String sessionId, + required String fileId, + required String token, + required Dart2RustStreamReceiver binary, + }) => RustLib.instance.api.crateApiHttpRsHttpClientUpload( + that: this, + protocol: protocol, + ip: ip, + port: port, + publicKey: publicKey, + sessionId: sessionId, + fileId: fileId, + token: token, + binary: binary, + ); +} + +@sealed +class RtcFileReceiverImpl extends RustOpaque implements RtcFileReceiver { + // Not to be used by end users + RtcFileReceiverImpl.frbInternalDcoDecode(List wire) : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + RtcFileReceiverImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: RustLib.instance.api.rust_arc_increment_strong_count_RtcFileReceiver, + rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_RtcFileReceiver, + rustArcDecrementStrongCountPtr: RustLib.instance.api.rust_arc_decrement_strong_count_RtcFileReceiverPtr, + ); + + Future getFileId() => RustLib.instance.api.crateApiWebrtcRtcFileReceiverGetFileId( + that: this, + ); + + Stream receive() => RustLib.instance.api.crateApiWebrtcRtcFileReceiverReceive( + that: this, + ); +} + +@sealed +class RtcFileSenderImpl extends RustOpaque implements RtcFileSender { + // Not to be used by end users + RtcFileSenderImpl.frbInternalDcoDecode(List wire) : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + RtcFileSenderImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: RustLib.instance.api.rust_arc_increment_strong_count_RtcFileSender, + rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_RtcFileSender, + rustArcDecrementStrongCountPtr: RustLib.instance.api.rust_arc_decrement_strong_count_RtcFileSenderPtr, + ); + + Future send({required List data}) => RustLib.instance.api.crateApiWebrtcRtcFileSenderSend(that: this, data: data); +} + +@sealed +class RtcReceiveControllerImpl extends RustOpaque implements RtcReceiveController { + // Not to be used by end users + RtcReceiveControllerImpl.frbInternalDcoDecode(List wire) : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + RtcReceiveControllerImpl.frbInternalSseDecode( + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: RustLib.instance.api.rust_arc_increment_strong_count_RtcReceiveController, + rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_RtcReceiveController, + rustArcDecrementStrongCountPtr: RustLib.instance.api.rust_arc_decrement_strong_count_RtcReceiveControllerPtr, + ); + + Future decline() => RustLib.instance.api.crateApiWebrtcRtcReceiveControllerDecline( + that: this, + ); + + Stream listenError() => RustLib.instance.api.crateApiWebrtcRtcReceiveControllerListenError( + that: this, + ); + + Future> listenFiles() => RustLib.instance.api.crateApiWebrtcRtcReceiveControllerListenFiles( + that: this, + ); + + Stream listenReceiving() => RustLib.instance.api.crateApiWebrtcRtcReceiveControllerListenReceiving( + that: this, + ); + + Stream listenStatus() => RustLib.instance.api.crateApiWebrtcRtcReceiveControllerListenStatus( + that: this, + ); + + Future sendFileStatus({required RTCSendFileResponse status}) => RustLib.instance.api.crateApiWebrtcRtcReceiveControllerSendFileStatus( + that: this, + status: status, + ); + + Future sendPin({required String pin}) => RustLib.instance.api.crateApiWebrtcRtcReceiveControllerSendPin(that: this, pin: pin); + + Future sendSelection({required Set selection}) => RustLib.instance.api.crateApiWebrtcRtcReceiveControllerSendSelection( + that: this, + selection: selection, + ); +} + +@sealed +class RtcSendControllerImpl extends RustOpaque implements RtcSendController { + // Not to be used by end users + RtcSendControllerImpl.frbInternalDcoDecode(List wire) : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + RtcSendControllerImpl.frbInternalSseDecode( + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: RustLib.instance.api.rust_arc_increment_strong_count_RtcSendController, + rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_RtcSendController, + rustArcDecrementStrongCountPtr: RustLib.instance.api.rust_arc_decrement_strong_count_RtcSendControllerPtr, + ); + + Stream listenError() => RustLib.instance.api.crateApiWebrtcRtcSendControllerListenError( + that: this, + ); + + Future> listenSelectedFiles() => RustLib.instance.api.crateApiWebrtcRtcSendControllerListenSelectedFiles( + that: this, + ); + + Stream listenStatus() => RustLib.instance.api.crateApiWebrtcRtcSendControllerListenStatus( + that: this, + ); + + Future sendFile({required String fileId}) => + RustLib.instance.api.crateApiWebrtcRtcSendControllerSendFile(that: this, fileId: fileId); + + Future sendPin({required String pin}) => RustLib.instance.api.crateApiWebrtcRtcSendControllerSendPin(that: this, pin: pin); +} diff --git a/app/lib/rust/frb_generated.io.dart b/app/lib/rust/frb_generated.io.dart new file mode 100644 index 0000000..9234505 --- /dev/null +++ b/app/lib/rust/frb_generated.io.dart @@ -0,0 +1,1587 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field + +import 'dart:async'; +import 'dart:convert'; +import 'dart:ffi' as ffi; + +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated_io.dart'; +import 'package:localsend_app/rust/api/crypto.dart'; +import 'package:localsend_app/rust/api/http.dart'; +import 'package:localsend_app/rust/api/logging.dart'; +import 'package:localsend_app/rust/api/model.dart'; +import 'package:localsend_app/rust/api/stream.dart'; +import 'package:localsend_app/rust/api/webrtc.dart'; +import 'package:localsend_app/rust/frb_generated.dart'; +import 'package:uuid/uuid.dart'; + +abstract class RustLibApiImplPlatform extends BaseApiImpl { + RustLibApiImplPlatform({ + required super.handler, + required super.wire, + required super.generalizedFrbRustBinding, + required super.portManager, + }); + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_Dart2RustStreamReceiverPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiverPtr; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_Dart2RustStreamSinkPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSinkPtr; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_LsSignalingConnectionPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnectionPtr; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RtcFileReceiverPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiverPtr; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RtcFileSenderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSenderPtr; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RtcReceiveControllerPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveControllerPtr; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RtcSendControllerPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendControllerPtr; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RsHttpClientPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClientPtr; + + @protected + AnyhowException dco_decode_AnyhowException(dynamic raw); + + @protected + Dart2RustStreamReceiver dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + dynamic raw, + ); + + @protected + Dart2RustStreamSink dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + dynamic raw, + ); + + @protected + LsSignalingConnection dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + dynamic raw, + ); + + @protected + RtcFileReceiver dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + dynamic raw, + ); + + @protected + RtcFileSender dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + dynamic raw, + ); + + @protected + RtcReceiveController dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + dynamic raw, + ); + + @protected + RtcSendController dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + dynamic raw, + ); + + @protected + RsHttpClient dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + dynamic raw, + ); + + @protected + Dart2RustStreamSink dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + dynamic raw, + ); + + @protected + RtcSendController dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + dynamic raw, + ); + + @protected + LsSignalingConnection dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + dynamic raw, + ); + + @protected + RtcFileReceiver dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + dynamic raw, + ); + + @protected + RtcFileSender dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + dynamic raw, + ); + + @protected + RtcReceiveController dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + dynamic raw, + ); + + @protected + RtcSendController dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + dynamic raw, + ); + + @protected + RsHttpClient dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + dynamic raw, + ); + + @protected + FutureOr Function(LsSignalingConnection) + dco_decode_DartFn_Inputs_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection_Output_unit_AnyhowException( + dynamic raw, + ); + + @protected + Object dco_decode_DartOpaque(dynamic raw); + + @protected + Map dco_decode_Map_String_String_None(dynamic raw); + + @protected + Map dco_decode_Map_String_file_dto_None(dynamic raw); + + @protected + Dart2RustStreamReceiver dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + dynamic raw, + ); + + @protected + Dart2RustStreamSink dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + dynamic raw, + ); + + @protected + LsSignalingConnection dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + dynamic raw, + ); + + @protected + RtcFileReceiver dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + dynamic raw, + ); + + @protected + RtcFileSender dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + dynamic raw, + ); + + @protected + RtcReceiveController dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + dynamic raw, + ); + + @protected + RtcSendController dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + dynamic raw, + ); + + @protected + RsHttpClient dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + dynamic raw, + ); + + @protected + Set dco_decode_Set_String_None(dynamic raw); + + @protected + RustStreamSink dco_decode_StreamSink_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver_Sse( + dynamic raw, + ); + + @protected + RustStreamSink dco_decode_StreamSink_list_prim_u_8_strict_Sse( + dynamic raw, + ); + + @protected + RustStreamSink dco_decode_StreamSink_rtc_file_error_Sse( + dynamic raw, + ); + + @protected + RustStreamSink dco_decode_StreamSink_rtc_status_Sse(dynamic raw); + + @protected + RustStreamSink dco_decode_StreamSink_ws_server_message_Sse( + dynamic raw, + ); + + @protected + String dco_decode_String(dynamic raw); + + @protected + UuidValue dco_decode_Uuid(dynamic raw); + + @protected + bool dco_decode_bool(dynamic raw); + + @protected + ClientInfo dco_decode_box_autoadd_client_info(dynamic raw); + + @protected + ClientInfoWithoutId dco_decode_box_autoadd_client_info_without_id( + dynamic raw, + ); + + @protected + DeviceType dco_decode_box_autoadd_device_type(dynamic raw); + + @protected + ExpectingPublicKey dco_decode_box_autoadd_expecting_public_key(dynamic raw); + + @protected + FileMetadata dco_decode_box_autoadd_file_metadata(dynamic raw); + + @protected + PinConfig dco_decode_box_autoadd_pin_config(dynamic raw); + + @protected + PrepareUploadRequestDto dco_decode_box_autoadd_prepare_upload_request_dto( + dynamic raw, + ); + + @protected + PrepareUploadResponseDto dco_decode_box_autoadd_prepare_upload_response_dto( + dynamic raw, + ); + + @protected + ProposingClientInfo dco_decode_box_autoadd_proposing_client_info(dynamic raw); + + @protected + RegisterDto dco_decode_box_autoadd_register_dto(dynamic raw); + + @protected + RTCSendFileResponse dco_decode_box_autoadd_rtc_send_file_response( + dynamic raw, + ); + + @protected + WsServerSdpMessage dco_decode_box_autoadd_ws_server_sdp_message(dynamic raw); + + @protected + ClientInfo dco_decode_client_info(dynamic raw); + + @protected + ClientInfoWithoutId dco_decode_client_info_without_id(dynamic raw); + + @protected + DeviceType dco_decode_device_type(dynamic raw); + + @protected + ExpectingPublicKey dco_decode_expecting_public_key(dynamic raw); + + @protected + FileDto dco_decode_file_dto(dynamic raw); + + @protected + FileMetadata dco_decode_file_metadata(dynamic raw); + + @protected + int dco_decode_i_32(dynamic raw); + + @protected + PlatformInt64 dco_decode_isize(dynamic raw); + + @protected + KeyPair dco_decode_key_pair(dynamic raw); + + @protected + List dco_decode_list_String(dynamic raw); + + @protected + List dco_decode_list_client_info(dynamic raw); + + @protected + List dco_decode_list_file_dto(dynamic raw); + + @protected + List dco_decode_list_prim_u_8_loose(dynamic raw); + + @protected + Uint8List dco_decode_list_prim_u_8_strict(dynamic raw); + + @protected + List<(String, FileDto)> dco_decode_list_record_string_file_dto(dynamic raw); + + @protected + List<(String, String)> dco_decode_list_record_string_string(dynamic raw); + + @protected + LsHttpClientVersion dco_decode_ls_http_client_version(dynamic raw); + + @protected + String? dco_decode_opt_String(dynamic raw); + + @protected + DeviceType? dco_decode_opt_box_autoadd_device_type(dynamic raw); + + @protected + ExpectingPublicKey? dco_decode_opt_box_autoadd_expecting_public_key( + dynamic raw, + ); + + @protected + FileMetadata? dco_decode_opt_box_autoadd_file_metadata(dynamic raw); + + @protected + PinConfig? dco_decode_opt_box_autoadd_pin_config(dynamic raw); + + @protected + PrepareUploadResponseDto? dco_decode_opt_box_autoadd_prepare_upload_response_dto(dynamic raw); + + @protected + PinConfig dco_decode_pin_config(dynamic raw); + + @protected + PrepareUploadRequestDto dco_decode_prepare_upload_request_dto(dynamic raw); + + @protected + PrepareUploadResponseDto dco_decode_prepare_upload_response_dto(dynamic raw); + + @protected + PrepareUploadResult dco_decode_prepare_upload_result(dynamic raw); + + @protected + ProposingClientInfo dco_decode_proposing_client_info(dynamic raw); + + @protected + ProtocolType dco_decode_protocol_type(dynamic raw); + + @protected + (Dart2RustStreamSink, Dart2RustStreamReceiver) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_sink_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_receiver( + dynamic raw, + ); + + @protected + (String, FileDto) dco_decode_record_string_file_dto(dynamic raw); + + @protected + (String, String) dco_decode_record_string_string(dynamic raw); + + @protected + RegisterDto dco_decode_register_dto(dynamic raw); + + @protected + RegisterResponseDto dco_decode_register_response_dto(dynamic raw); + + @protected + ResultWithPublicKeyRegisterResponseDto dco_decode_result_with_public_key_register_response_dto(dynamic raw); + + @protected + RsHttpClientError dco_decode_rs_http_client_error(dynamic raw); + + @protected + RTCFileError dco_decode_rtc_file_error(dynamic raw); + + @protected + RTCSendFileResponse dco_decode_rtc_send_file_response(dynamic raw); + + @protected + RTCStatus dco_decode_rtc_status(dynamic raw); + + @protected + int dco_decode_u_16(dynamic raw); + + @protected + BigInt dco_decode_u_64(dynamic raw); + + @protected + int dco_decode_u_8(dynamic raw); + + @protected + void dco_decode_unit(dynamic raw); + + @protected + BigInt dco_decode_usize(dynamic raw); + + @protected + WsServerMessage dco_decode_ws_server_message(dynamic raw); + + @protected + WsServerSdpMessage dco_decode_ws_server_sdp_message(dynamic raw); + + @protected + AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer); + + @protected + Dart2RustStreamReceiver sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + SseDeserializer deserializer, + ); + + @protected + Dart2RustStreamSink sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + SseDeserializer deserializer, + ); + + @protected + LsSignalingConnection sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + SseDeserializer deserializer, + ); + + @protected + RtcFileReceiver sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + SseDeserializer deserializer, + ); + + @protected + RtcFileSender sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + SseDeserializer deserializer, + ); + + @protected + RtcReceiveController sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + SseDeserializer deserializer, + ); + + @protected + RtcSendController sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + SseDeserializer deserializer, + ); + + @protected + RsHttpClient sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + SseDeserializer deserializer, + ); + + @protected + Dart2RustStreamSink sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + SseDeserializer deserializer, + ); + + @protected + RtcSendController sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + SseDeserializer deserializer, + ); + + @protected + LsSignalingConnection sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + SseDeserializer deserializer, + ); + + @protected + RtcFileReceiver sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + SseDeserializer deserializer, + ); + + @protected + RtcFileSender sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + SseDeserializer deserializer, + ); + + @protected + RtcReceiveController sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + SseDeserializer deserializer, + ); + + @protected + RtcSendController sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + SseDeserializer deserializer, + ); + + @protected + RsHttpClient sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + SseDeserializer deserializer, + ); + + @protected + Object sse_decode_DartOpaque(SseDeserializer deserializer); + + @protected + Map sse_decode_Map_String_String_None( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_file_dto_None( + SseDeserializer deserializer, + ); + + @protected + Dart2RustStreamReceiver sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + SseDeserializer deserializer, + ); + + @protected + Dart2RustStreamSink sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + SseDeserializer deserializer, + ); + + @protected + LsSignalingConnection sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + SseDeserializer deserializer, + ); + + @protected + RtcFileReceiver sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + SseDeserializer deserializer, + ); + + @protected + RtcFileSender sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + SseDeserializer deserializer, + ); + + @protected + RtcReceiveController sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + SseDeserializer deserializer, + ); + + @protected + RtcSendController sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + SseDeserializer deserializer, + ); + + @protected + RsHttpClient sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + SseDeserializer deserializer, + ); + + @protected + Set sse_decode_Set_String_None(SseDeserializer deserializer); + + @protected + RustStreamSink sse_decode_StreamSink_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver_Sse( + SseDeserializer deserializer, + ); + + @protected + RustStreamSink sse_decode_StreamSink_list_prim_u_8_strict_Sse( + SseDeserializer deserializer, + ); + + @protected + RustStreamSink sse_decode_StreamSink_rtc_file_error_Sse( + SseDeserializer deserializer, + ); + + @protected + RustStreamSink sse_decode_StreamSink_rtc_status_Sse( + SseDeserializer deserializer, + ); + + @protected + RustStreamSink sse_decode_StreamSink_ws_server_message_Sse( + SseDeserializer deserializer, + ); + + @protected + String sse_decode_String(SseDeserializer deserializer); + + @protected + UuidValue sse_decode_Uuid(SseDeserializer deserializer); + + @protected + bool sse_decode_bool(SseDeserializer deserializer); + + @protected + ClientInfo sse_decode_box_autoadd_client_info(SseDeserializer deserializer); + + @protected + ClientInfoWithoutId sse_decode_box_autoadd_client_info_without_id( + SseDeserializer deserializer, + ); + + @protected + DeviceType sse_decode_box_autoadd_device_type(SseDeserializer deserializer); + + @protected + ExpectingPublicKey sse_decode_box_autoadd_expecting_public_key( + SseDeserializer deserializer, + ); + + @protected + FileMetadata sse_decode_box_autoadd_file_metadata( + SseDeserializer deserializer, + ); + + @protected + PinConfig sse_decode_box_autoadd_pin_config(SseDeserializer deserializer); + + @protected + PrepareUploadRequestDto sse_decode_box_autoadd_prepare_upload_request_dto( + SseDeserializer deserializer, + ); + + @protected + PrepareUploadResponseDto sse_decode_box_autoadd_prepare_upload_response_dto( + SseDeserializer deserializer, + ); + + @protected + ProposingClientInfo sse_decode_box_autoadd_proposing_client_info( + SseDeserializer deserializer, + ); + + @protected + RegisterDto sse_decode_box_autoadd_register_dto(SseDeserializer deserializer); + + @protected + RTCSendFileResponse sse_decode_box_autoadd_rtc_send_file_response( + SseDeserializer deserializer, + ); + + @protected + WsServerSdpMessage sse_decode_box_autoadd_ws_server_sdp_message( + SseDeserializer deserializer, + ); + + @protected + ClientInfo sse_decode_client_info(SseDeserializer deserializer); + + @protected + ClientInfoWithoutId sse_decode_client_info_without_id( + SseDeserializer deserializer, + ); + + @protected + DeviceType sse_decode_device_type(SseDeserializer deserializer); + + @protected + ExpectingPublicKey sse_decode_expecting_public_key( + SseDeserializer deserializer, + ); + + @protected + FileDto sse_decode_file_dto(SseDeserializer deserializer); + + @protected + FileMetadata sse_decode_file_metadata(SseDeserializer deserializer); + + @protected + int sse_decode_i_32(SseDeserializer deserializer); + + @protected + PlatformInt64 sse_decode_isize(SseDeserializer deserializer); + + @protected + KeyPair sse_decode_key_pair(SseDeserializer deserializer); + + @protected + List sse_decode_list_String(SseDeserializer deserializer); + + @protected + List sse_decode_list_client_info(SseDeserializer deserializer); + + @protected + List sse_decode_list_file_dto(SseDeserializer deserializer); + + @protected + List sse_decode_list_prim_u_8_loose(SseDeserializer deserializer); + + @protected + Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer); + + @protected + List<(String, FileDto)> sse_decode_list_record_string_file_dto( + SseDeserializer deserializer, + ); + + @protected + List<(String, String)> sse_decode_list_record_string_string( + SseDeserializer deserializer, + ); + + @protected + LsHttpClientVersion sse_decode_ls_http_client_version( + SseDeserializer deserializer, + ); + + @protected + String? sse_decode_opt_String(SseDeserializer deserializer); + + @protected + DeviceType? sse_decode_opt_box_autoadd_device_type( + SseDeserializer deserializer, + ); + + @protected + ExpectingPublicKey? sse_decode_opt_box_autoadd_expecting_public_key( + SseDeserializer deserializer, + ); + + @protected + FileMetadata? sse_decode_opt_box_autoadd_file_metadata( + SseDeserializer deserializer, + ); + + @protected + PinConfig? sse_decode_opt_box_autoadd_pin_config( + SseDeserializer deserializer, + ); + + @protected + PrepareUploadResponseDto? sse_decode_opt_box_autoadd_prepare_upload_response_dto( + SseDeserializer deserializer, + ); + + @protected + PinConfig sse_decode_pin_config(SseDeserializer deserializer); + + @protected + PrepareUploadRequestDto sse_decode_prepare_upload_request_dto( + SseDeserializer deserializer, + ); + + @protected + PrepareUploadResponseDto sse_decode_prepare_upload_response_dto( + SseDeserializer deserializer, + ); + + @protected + PrepareUploadResult sse_decode_prepare_upload_result( + SseDeserializer deserializer, + ); + + @protected + ProposingClientInfo sse_decode_proposing_client_info( + SseDeserializer deserializer, + ); + + @protected + ProtocolType sse_decode_protocol_type(SseDeserializer deserializer); + + @protected + (Dart2RustStreamSink, Dart2RustStreamReceiver) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_sink_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_receiver( + SseDeserializer deserializer, + ); + + @protected + (String, FileDto) sse_decode_record_string_file_dto( + SseDeserializer deserializer, + ); + + @protected + (String, String) sse_decode_record_string_string( + SseDeserializer deserializer, + ); + + @protected + RegisterDto sse_decode_register_dto(SseDeserializer deserializer); + + @protected + RegisterResponseDto sse_decode_register_response_dto( + SseDeserializer deserializer, + ); + + @protected + ResultWithPublicKeyRegisterResponseDto sse_decode_result_with_public_key_register_response_dto( + SseDeserializer deserializer, + ); + + @protected + RsHttpClientError sse_decode_rs_http_client_error( + SseDeserializer deserializer, + ); + + @protected + RTCFileError sse_decode_rtc_file_error(SseDeserializer deserializer); + + @protected + RTCSendFileResponse sse_decode_rtc_send_file_response( + SseDeserializer deserializer, + ); + + @protected + RTCStatus sse_decode_rtc_status(SseDeserializer deserializer); + + @protected + int sse_decode_u_16(SseDeserializer deserializer); + + @protected + BigInt sse_decode_u_64(SseDeserializer deserializer); + + @protected + int sse_decode_u_8(SseDeserializer deserializer); + + @protected + void sse_decode_unit(SseDeserializer deserializer); + + @protected + BigInt sse_decode_usize(SseDeserializer deserializer); + + @protected + WsServerMessage sse_decode_ws_server_message(SseDeserializer deserializer); + + @protected + WsServerSdpMessage sse_decode_ws_server_sdp_message( + SseDeserializer deserializer, + ); + + @protected + void sse_encode_AnyhowException( + AnyhowException self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + Dart2RustStreamReceiver self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + Dart2RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + LsSignalingConnection self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + RtcFileReceiver self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + RtcFileSender self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + RtcReceiveController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + RtcSendController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + RsHttpClient self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + Dart2RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + RtcSendController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + LsSignalingConnection self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + RtcFileReceiver self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + RtcFileSender self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + RtcReceiveController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + RtcSendController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + RsHttpClient self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_DartFn_Inputs_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection_Output_unit_AnyhowException( + FutureOr Function(LsSignalingConnection) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_DartOpaque(Object self, SseSerializer serializer); + + @protected + void sse_encode_Map_String_String_None( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_file_dto_None( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + Dart2RustStreamReceiver self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + Dart2RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + LsSignalingConnection self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + RtcFileReceiver self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + RtcFileSender self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + RtcReceiveController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + RtcSendController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + RsHttpClient self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Set_String_None(Set self, SseSerializer serializer); + + @protected + void sse_encode_StreamSink_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver_Sse( + RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_StreamSink_list_prim_u_8_strict_Sse( + RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_StreamSink_rtc_file_error_Sse( + RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_StreamSink_rtc_status_Sse( + RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_StreamSink_ws_server_message_Sse( + RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_String(String self, SseSerializer serializer); + + @protected + void sse_encode_Uuid(UuidValue self, SseSerializer serializer); + + @protected + void sse_encode_bool(bool self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_client_info( + ClientInfo self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_client_info_without_id( + ClientInfoWithoutId self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_device_type( + DeviceType self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_expecting_public_key( + ExpectingPublicKey self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_file_metadata( + FileMetadata self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_pin_config( + PinConfig self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_prepare_upload_request_dto( + PrepareUploadRequestDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_prepare_upload_response_dto( + PrepareUploadResponseDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_proposing_client_info( + ProposingClientInfo self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_register_dto( + RegisterDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_rtc_send_file_response( + RTCSendFileResponse self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_ws_server_sdp_message( + WsServerSdpMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_client_info(ClientInfo self, SseSerializer serializer); + + @protected + void sse_encode_client_info_without_id( + ClientInfoWithoutId self, + SseSerializer serializer, + ); + + @protected + void sse_encode_device_type(DeviceType self, SseSerializer serializer); + + @protected + void sse_encode_expecting_public_key( + ExpectingPublicKey self, + SseSerializer serializer, + ); + + @protected + void sse_encode_file_dto(FileDto self, SseSerializer serializer); + + @protected + void sse_encode_file_metadata(FileMetadata self, SseSerializer serializer); + + @protected + void sse_encode_i_32(int self, SseSerializer serializer); + + @protected + void sse_encode_isize(PlatformInt64 self, SseSerializer serializer); + + @protected + void sse_encode_key_pair(KeyPair self, SseSerializer serializer); + + @protected + void sse_encode_list_String(List self, SseSerializer serializer); + + @protected + void sse_encode_list_client_info( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_file_dto(List self, SseSerializer serializer); + + @protected + void sse_encode_list_prim_u_8_loose(List self, SseSerializer serializer); + + @protected + void sse_encode_list_prim_u_8_strict( + Uint8List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_file_dto( + List<(String, FileDto)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_string( + List<(String, String)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_ls_http_client_version( + LsHttpClientVersion self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_String(String? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_device_type( + DeviceType? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_expecting_public_key( + ExpectingPublicKey? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_file_metadata( + FileMetadata? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_pin_config( + PinConfig? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_prepare_upload_response_dto( + PrepareUploadResponseDto? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_pin_config(PinConfig self, SseSerializer serializer); + + @protected + void sse_encode_prepare_upload_request_dto( + PrepareUploadRequestDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_prepare_upload_response_dto( + PrepareUploadResponseDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_prepare_upload_result( + PrepareUploadResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_proposing_client_info( + ProposingClientInfo self, + SseSerializer serializer, + ); + + @protected + void sse_encode_protocol_type(ProtocolType self, SseSerializer serializer); + + @protected + void + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_sink_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_receiver( + (Dart2RustStreamSink, Dart2RustStreamReceiver) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_file_dto( + (String, FileDto) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_string( + (String, String) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_register_dto(RegisterDto self, SseSerializer serializer); + + @protected + void sse_encode_register_response_dto( + RegisterResponseDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_result_with_public_key_register_response_dto( + ResultWithPublicKeyRegisterResponseDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_rs_http_client_error( + RsHttpClientError self, + SseSerializer serializer, + ); + + @protected + void sse_encode_rtc_file_error(RTCFileError self, SseSerializer serializer); + + @protected + void sse_encode_rtc_send_file_response( + RTCSendFileResponse self, + SseSerializer serializer, + ); + + @protected + void sse_encode_rtc_status(RTCStatus self, SseSerializer serializer); + + @protected + void sse_encode_u_16(int self, SseSerializer serializer); + + @protected + void sse_encode_u_64(BigInt self, SseSerializer serializer); + + @protected + void sse_encode_u_8(int self, SseSerializer serializer); + + @protected + void sse_encode_unit(void self, SseSerializer serializer); + + @protected + void sse_encode_usize(BigInt self, SseSerializer serializer); + + @protected + void sse_encode_ws_server_message( + WsServerMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_ws_server_sdp_message( + WsServerSdpMessage self, + SseSerializer serializer, + ); +} + +// Section: wire_class + +class RustLibWire implements BaseWire { + factory RustLibWire.fromExternalLibrary(ExternalLibrary lib) => RustLibWire(lib.ffiDynamicLibrary); + + /// Holds the symbol lookup function. + final ffi.Pointer Function(String symbolName) _lookup; + + /// The symbols are looked up in [dynamicLibrary]. + RustLibWire(ffi.DynamicLibrary dynamicLibrary) : _lookup = dynamicLibrary.lookup; + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiverPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver', + ); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiverPtr + .asFunction)>(); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiverPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver', + ); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiverPtr + .asFunction)>(); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSinkPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink', + ); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSinkPtr + .asFunction)>(); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSinkPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink', + ); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSinkPtr + .asFunction)>(); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnectionPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection', + ); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnectionPtr + .asFunction)>(); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnectionPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection', + ); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnectionPtr + .asFunction)>(); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiverPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver', + ); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiverPtr + .asFunction)>(); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiverPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver', + ); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiverPtr + .asFunction)>(); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSenderPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender', + ); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSenderPtr + .asFunction)>(); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSenderPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender', + ); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSenderPtr + .asFunction)>(); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveControllerPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController', + ); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveControllerPtr + .asFunction)>(); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveControllerPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController', + ); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveControllerPtr + .asFunction)>(); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendControllerPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController', + ); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendControllerPtr + .asFunction)>(); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendControllerPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController', + ); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendControllerPtr + .asFunction)>(); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClientPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient', + ); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClientPtr + .asFunction)>(); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClientPtr = + _lookup)>>( + 'frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient', + ); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClientPtr + .asFunction)>(); +} diff --git a/app/lib/rust/frb_generated.web.dart b/app/lib/rust/frb_generated.web.dart new file mode 100644 index 0000000..3b9a78b --- /dev/null +++ b/app/lib/rust/frb_generated.web.dart @@ -0,0 +1,1494 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field + +// Static analysis wrongly picks the IO variant, thus ignore this +// ignore_for_file: argument_type_not_assignable + +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated_web.dart'; +import 'package:localsend_app/rust/api/crypto.dart'; +import 'package:localsend_app/rust/api/http.dart'; +import 'package:localsend_app/rust/api/logging.dart'; +import 'package:localsend_app/rust/api/model.dart'; +import 'package:localsend_app/rust/api/stream.dart'; +import 'package:localsend_app/rust/api/webrtc.dart'; +import 'package:localsend_app/rust/frb_generated.dart'; +import 'package:uuid/uuid.dart'; + +abstract class RustLibApiImplPlatform extends BaseApiImpl { + RustLibApiImplPlatform({ + required super.handler, + required super.wire, + required super.generalizedFrbRustBinding, + required super.portManager, + }); + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_Dart2RustStreamReceiverPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_Dart2RustStreamSinkPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_LsSignalingConnectionPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RtcFileReceiverPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RtcFileSenderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RtcReceiveControllerPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RtcSendControllerPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RsHttpClientPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient; + + @protected + AnyhowException dco_decode_AnyhowException(dynamic raw); + + @protected + Dart2RustStreamReceiver dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + dynamic raw, + ); + + @protected + Dart2RustStreamSink dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + dynamic raw, + ); + + @protected + LsSignalingConnection dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + dynamic raw, + ); + + @protected + RtcFileReceiver dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + dynamic raw, + ); + + @protected + RtcFileSender dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + dynamic raw, + ); + + @protected + RtcReceiveController dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + dynamic raw, + ); + + @protected + RtcSendController dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + dynamic raw, + ); + + @protected + RsHttpClient dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + dynamic raw, + ); + + @protected + Dart2RustStreamSink dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + dynamic raw, + ); + + @protected + RtcSendController dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + dynamic raw, + ); + + @protected + LsSignalingConnection dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + dynamic raw, + ); + + @protected + RtcFileReceiver dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + dynamic raw, + ); + + @protected + RtcFileSender dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + dynamic raw, + ); + + @protected + RtcReceiveController dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + dynamic raw, + ); + + @protected + RtcSendController dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + dynamic raw, + ); + + @protected + RsHttpClient dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + dynamic raw, + ); + + @protected + FutureOr Function(LsSignalingConnection) + dco_decode_DartFn_Inputs_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection_Output_unit_AnyhowException( + dynamic raw, + ); + + @protected + Object dco_decode_DartOpaque(dynamic raw); + + @protected + Map dco_decode_Map_String_String_None(dynamic raw); + + @protected + Map dco_decode_Map_String_file_dto_None(dynamic raw); + + @protected + Dart2RustStreamReceiver dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + dynamic raw, + ); + + @protected + Dart2RustStreamSink dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + dynamic raw, + ); + + @protected + LsSignalingConnection dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + dynamic raw, + ); + + @protected + RtcFileReceiver dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + dynamic raw, + ); + + @protected + RtcFileSender dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + dynamic raw, + ); + + @protected + RtcReceiveController dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + dynamic raw, + ); + + @protected + RtcSendController dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + dynamic raw, + ); + + @protected + RsHttpClient dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + dynamic raw, + ); + + @protected + Set dco_decode_Set_String_None(dynamic raw); + + @protected + RustStreamSink dco_decode_StreamSink_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver_Sse( + dynamic raw, + ); + + @protected + RustStreamSink dco_decode_StreamSink_list_prim_u_8_strict_Sse( + dynamic raw, + ); + + @protected + RustStreamSink dco_decode_StreamSink_rtc_file_error_Sse( + dynamic raw, + ); + + @protected + RustStreamSink dco_decode_StreamSink_rtc_status_Sse(dynamic raw); + + @protected + RustStreamSink dco_decode_StreamSink_ws_server_message_Sse( + dynamic raw, + ); + + @protected + String dco_decode_String(dynamic raw); + + @protected + UuidValue dco_decode_Uuid(dynamic raw); + + @protected + bool dco_decode_bool(dynamic raw); + + @protected + ClientInfo dco_decode_box_autoadd_client_info(dynamic raw); + + @protected + ClientInfoWithoutId dco_decode_box_autoadd_client_info_without_id( + dynamic raw, + ); + + @protected + DeviceType dco_decode_box_autoadd_device_type(dynamic raw); + + @protected + ExpectingPublicKey dco_decode_box_autoadd_expecting_public_key(dynamic raw); + + @protected + FileMetadata dco_decode_box_autoadd_file_metadata(dynamic raw); + + @protected + PinConfig dco_decode_box_autoadd_pin_config(dynamic raw); + + @protected + PrepareUploadRequestDto dco_decode_box_autoadd_prepare_upload_request_dto( + dynamic raw, + ); + + @protected + PrepareUploadResponseDto dco_decode_box_autoadd_prepare_upload_response_dto( + dynamic raw, + ); + + @protected + ProposingClientInfo dco_decode_box_autoadd_proposing_client_info(dynamic raw); + + @protected + RegisterDto dco_decode_box_autoadd_register_dto(dynamic raw); + + @protected + RTCSendFileResponse dco_decode_box_autoadd_rtc_send_file_response( + dynamic raw, + ); + + @protected + WsServerSdpMessage dco_decode_box_autoadd_ws_server_sdp_message(dynamic raw); + + @protected + ClientInfo dco_decode_client_info(dynamic raw); + + @protected + ClientInfoWithoutId dco_decode_client_info_without_id(dynamic raw); + + @protected + DeviceType dco_decode_device_type(dynamic raw); + + @protected + ExpectingPublicKey dco_decode_expecting_public_key(dynamic raw); + + @protected + FileDto dco_decode_file_dto(dynamic raw); + + @protected + FileMetadata dco_decode_file_metadata(dynamic raw); + + @protected + int dco_decode_i_32(dynamic raw); + + @protected + PlatformInt64 dco_decode_isize(dynamic raw); + + @protected + KeyPair dco_decode_key_pair(dynamic raw); + + @protected + List dco_decode_list_String(dynamic raw); + + @protected + List dco_decode_list_client_info(dynamic raw); + + @protected + List dco_decode_list_file_dto(dynamic raw); + + @protected + List dco_decode_list_prim_u_8_loose(dynamic raw); + + @protected + Uint8List dco_decode_list_prim_u_8_strict(dynamic raw); + + @protected + List<(String, FileDto)> dco_decode_list_record_string_file_dto(dynamic raw); + + @protected + List<(String, String)> dco_decode_list_record_string_string(dynamic raw); + + @protected + LsHttpClientVersion dco_decode_ls_http_client_version(dynamic raw); + + @protected + String? dco_decode_opt_String(dynamic raw); + + @protected + DeviceType? dco_decode_opt_box_autoadd_device_type(dynamic raw); + + @protected + ExpectingPublicKey? dco_decode_opt_box_autoadd_expecting_public_key( + dynamic raw, + ); + + @protected + FileMetadata? dco_decode_opt_box_autoadd_file_metadata(dynamic raw); + + @protected + PinConfig? dco_decode_opt_box_autoadd_pin_config(dynamic raw); + + @protected + PrepareUploadResponseDto? dco_decode_opt_box_autoadd_prepare_upload_response_dto(dynamic raw); + + @protected + PinConfig dco_decode_pin_config(dynamic raw); + + @protected + PrepareUploadRequestDto dco_decode_prepare_upload_request_dto(dynamic raw); + + @protected + PrepareUploadResponseDto dco_decode_prepare_upload_response_dto(dynamic raw); + + @protected + PrepareUploadResult dco_decode_prepare_upload_result(dynamic raw); + + @protected + ProposingClientInfo dco_decode_proposing_client_info(dynamic raw); + + @protected + ProtocolType dco_decode_protocol_type(dynamic raw); + + @protected + (Dart2RustStreamSink, Dart2RustStreamReceiver) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_sink_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_receiver( + dynamic raw, + ); + + @protected + (String, FileDto) dco_decode_record_string_file_dto(dynamic raw); + + @protected + (String, String) dco_decode_record_string_string(dynamic raw); + + @protected + RegisterDto dco_decode_register_dto(dynamic raw); + + @protected + RegisterResponseDto dco_decode_register_response_dto(dynamic raw); + + @protected + ResultWithPublicKeyRegisterResponseDto dco_decode_result_with_public_key_register_response_dto(dynamic raw); + + @protected + RsHttpClientError dco_decode_rs_http_client_error(dynamic raw); + + @protected + RTCFileError dco_decode_rtc_file_error(dynamic raw); + + @protected + RTCSendFileResponse dco_decode_rtc_send_file_response(dynamic raw); + + @protected + RTCStatus dco_decode_rtc_status(dynamic raw); + + @protected + int dco_decode_u_16(dynamic raw); + + @protected + BigInt dco_decode_u_64(dynamic raw); + + @protected + int dco_decode_u_8(dynamic raw); + + @protected + void dco_decode_unit(dynamic raw); + + @protected + BigInt dco_decode_usize(dynamic raw); + + @protected + WsServerMessage dco_decode_ws_server_message(dynamic raw); + + @protected + WsServerSdpMessage dco_decode_ws_server_sdp_message(dynamic raw); + + @protected + AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer); + + @protected + Dart2RustStreamReceiver sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + SseDeserializer deserializer, + ); + + @protected + Dart2RustStreamSink sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + SseDeserializer deserializer, + ); + + @protected + LsSignalingConnection sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + SseDeserializer deserializer, + ); + + @protected + RtcFileReceiver sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + SseDeserializer deserializer, + ); + + @protected + RtcFileSender sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + SseDeserializer deserializer, + ); + + @protected + RtcReceiveController sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + SseDeserializer deserializer, + ); + + @protected + RtcSendController sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + SseDeserializer deserializer, + ); + + @protected + RsHttpClient sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + SseDeserializer deserializer, + ); + + @protected + Dart2RustStreamSink sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + SseDeserializer deserializer, + ); + + @protected + RtcSendController sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + SseDeserializer deserializer, + ); + + @protected + LsSignalingConnection sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + SseDeserializer deserializer, + ); + + @protected + RtcFileReceiver sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + SseDeserializer deserializer, + ); + + @protected + RtcFileSender sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + SseDeserializer deserializer, + ); + + @protected + RtcReceiveController sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + SseDeserializer deserializer, + ); + + @protected + RtcSendController sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + SseDeserializer deserializer, + ); + + @protected + RsHttpClient sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + SseDeserializer deserializer, + ); + + @protected + Object sse_decode_DartOpaque(SseDeserializer deserializer); + + @protected + Map sse_decode_Map_String_String_None( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_file_dto_None( + SseDeserializer deserializer, + ); + + @protected + Dart2RustStreamReceiver sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + SseDeserializer deserializer, + ); + + @protected + Dart2RustStreamSink sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + SseDeserializer deserializer, + ); + + @protected + LsSignalingConnection sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + SseDeserializer deserializer, + ); + + @protected + RtcFileReceiver sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + SseDeserializer deserializer, + ); + + @protected + RtcFileSender sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + SseDeserializer deserializer, + ); + + @protected + RtcReceiveController sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + SseDeserializer deserializer, + ); + + @protected + RtcSendController sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + SseDeserializer deserializer, + ); + + @protected + RsHttpClient sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + SseDeserializer deserializer, + ); + + @protected + Set sse_decode_Set_String_None(SseDeserializer deserializer); + + @protected + RustStreamSink sse_decode_StreamSink_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver_Sse( + SseDeserializer deserializer, + ); + + @protected + RustStreamSink sse_decode_StreamSink_list_prim_u_8_strict_Sse( + SseDeserializer deserializer, + ); + + @protected + RustStreamSink sse_decode_StreamSink_rtc_file_error_Sse( + SseDeserializer deserializer, + ); + + @protected + RustStreamSink sse_decode_StreamSink_rtc_status_Sse( + SseDeserializer deserializer, + ); + + @protected + RustStreamSink sse_decode_StreamSink_ws_server_message_Sse( + SseDeserializer deserializer, + ); + + @protected + String sse_decode_String(SseDeserializer deserializer); + + @protected + UuidValue sse_decode_Uuid(SseDeserializer deserializer); + + @protected + bool sse_decode_bool(SseDeserializer deserializer); + + @protected + ClientInfo sse_decode_box_autoadd_client_info(SseDeserializer deserializer); + + @protected + ClientInfoWithoutId sse_decode_box_autoadd_client_info_without_id( + SseDeserializer deserializer, + ); + + @protected + DeviceType sse_decode_box_autoadd_device_type(SseDeserializer deserializer); + + @protected + ExpectingPublicKey sse_decode_box_autoadd_expecting_public_key( + SseDeserializer deserializer, + ); + + @protected + FileMetadata sse_decode_box_autoadd_file_metadata( + SseDeserializer deserializer, + ); + + @protected + PinConfig sse_decode_box_autoadd_pin_config(SseDeserializer deserializer); + + @protected + PrepareUploadRequestDto sse_decode_box_autoadd_prepare_upload_request_dto( + SseDeserializer deserializer, + ); + + @protected + PrepareUploadResponseDto sse_decode_box_autoadd_prepare_upload_response_dto( + SseDeserializer deserializer, + ); + + @protected + ProposingClientInfo sse_decode_box_autoadd_proposing_client_info( + SseDeserializer deserializer, + ); + + @protected + RegisterDto sse_decode_box_autoadd_register_dto(SseDeserializer deserializer); + + @protected + RTCSendFileResponse sse_decode_box_autoadd_rtc_send_file_response( + SseDeserializer deserializer, + ); + + @protected + WsServerSdpMessage sse_decode_box_autoadd_ws_server_sdp_message( + SseDeserializer deserializer, + ); + + @protected + ClientInfo sse_decode_client_info(SseDeserializer deserializer); + + @protected + ClientInfoWithoutId sse_decode_client_info_without_id( + SseDeserializer deserializer, + ); + + @protected + DeviceType sse_decode_device_type(SseDeserializer deserializer); + + @protected + ExpectingPublicKey sse_decode_expecting_public_key( + SseDeserializer deserializer, + ); + + @protected + FileDto sse_decode_file_dto(SseDeserializer deserializer); + + @protected + FileMetadata sse_decode_file_metadata(SseDeserializer deserializer); + + @protected + int sse_decode_i_32(SseDeserializer deserializer); + + @protected + PlatformInt64 sse_decode_isize(SseDeserializer deserializer); + + @protected + KeyPair sse_decode_key_pair(SseDeserializer deserializer); + + @protected + List sse_decode_list_String(SseDeserializer deserializer); + + @protected + List sse_decode_list_client_info(SseDeserializer deserializer); + + @protected + List sse_decode_list_file_dto(SseDeserializer deserializer); + + @protected + List sse_decode_list_prim_u_8_loose(SseDeserializer deserializer); + + @protected + Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer); + + @protected + List<(String, FileDto)> sse_decode_list_record_string_file_dto( + SseDeserializer deserializer, + ); + + @protected + List<(String, String)> sse_decode_list_record_string_string( + SseDeserializer deserializer, + ); + + @protected + LsHttpClientVersion sse_decode_ls_http_client_version( + SseDeserializer deserializer, + ); + + @protected + String? sse_decode_opt_String(SseDeserializer deserializer); + + @protected + DeviceType? sse_decode_opt_box_autoadd_device_type( + SseDeserializer deserializer, + ); + + @protected + ExpectingPublicKey? sse_decode_opt_box_autoadd_expecting_public_key( + SseDeserializer deserializer, + ); + + @protected + FileMetadata? sse_decode_opt_box_autoadd_file_metadata( + SseDeserializer deserializer, + ); + + @protected + PinConfig? sse_decode_opt_box_autoadd_pin_config( + SseDeserializer deserializer, + ); + + @protected + PrepareUploadResponseDto? sse_decode_opt_box_autoadd_prepare_upload_response_dto( + SseDeserializer deserializer, + ); + + @protected + PinConfig sse_decode_pin_config(SseDeserializer deserializer); + + @protected + PrepareUploadRequestDto sse_decode_prepare_upload_request_dto( + SseDeserializer deserializer, + ); + + @protected + PrepareUploadResponseDto sse_decode_prepare_upload_response_dto( + SseDeserializer deserializer, + ); + + @protected + PrepareUploadResult sse_decode_prepare_upload_result( + SseDeserializer deserializer, + ); + + @protected + ProposingClientInfo sse_decode_proposing_client_info( + SseDeserializer deserializer, + ); + + @protected + ProtocolType sse_decode_protocol_type(SseDeserializer deserializer); + + @protected + (Dart2RustStreamSink, Dart2RustStreamReceiver) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_sink_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_receiver( + SseDeserializer deserializer, + ); + + @protected + (String, FileDto) sse_decode_record_string_file_dto( + SseDeserializer deserializer, + ); + + @protected + (String, String) sse_decode_record_string_string( + SseDeserializer deserializer, + ); + + @protected + RegisterDto sse_decode_register_dto(SseDeserializer deserializer); + + @protected + RegisterResponseDto sse_decode_register_response_dto( + SseDeserializer deserializer, + ); + + @protected + ResultWithPublicKeyRegisterResponseDto sse_decode_result_with_public_key_register_response_dto( + SseDeserializer deserializer, + ); + + @protected + RsHttpClientError sse_decode_rs_http_client_error( + SseDeserializer deserializer, + ); + + @protected + RTCFileError sse_decode_rtc_file_error(SseDeserializer deserializer); + + @protected + RTCSendFileResponse sse_decode_rtc_send_file_response( + SseDeserializer deserializer, + ); + + @protected + RTCStatus sse_decode_rtc_status(SseDeserializer deserializer); + + @protected + int sse_decode_u_16(SseDeserializer deserializer); + + @protected + BigInt sse_decode_u_64(SseDeserializer deserializer); + + @protected + int sse_decode_u_8(SseDeserializer deserializer); + + @protected + void sse_decode_unit(SseDeserializer deserializer); + + @protected + BigInt sse_decode_usize(SseDeserializer deserializer); + + @protected + WsServerMessage sse_decode_ws_server_message(SseDeserializer deserializer); + + @protected + WsServerSdpMessage sse_decode_ws_server_sdp_message( + SseDeserializer deserializer, + ); + + @protected + void sse_encode_AnyhowException( + AnyhowException self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + Dart2RustStreamReceiver self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + Dart2RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + LsSignalingConnection self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + RtcFileReceiver self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + RtcFileSender self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + RtcReceiveController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + RtcSendController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + RsHttpClient self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + Dart2RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + RtcSendController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + LsSignalingConnection self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + RtcFileReceiver self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + RtcFileSender self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + RtcReceiveController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + RtcSendController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + RsHttpClient self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_DartFn_Inputs_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection_Output_unit_AnyhowException( + FutureOr Function(LsSignalingConnection) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_DartOpaque(Object self, SseSerializer serializer); + + @protected + void sse_encode_Map_String_String_None( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_file_dto_None( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + Dart2RustStreamReceiver self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + Dart2RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + LsSignalingConnection self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + RtcFileReceiver self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + RtcFileSender self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + RtcReceiveController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + RtcSendController self, + SseSerializer serializer, + ); + + @protected + void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + RsHttpClient self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Set_String_None(Set self, SseSerializer serializer); + + @protected + void sse_encode_StreamSink_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver_Sse( + RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_StreamSink_list_prim_u_8_strict_Sse( + RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_StreamSink_rtc_file_error_Sse( + RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_StreamSink_rtc_status_Sse( + RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_StreamSink_ws_server_message_Sse( + RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_String(String self, SseSerializer serializer); + + @protected + void sse_encode_Uuid(UuidValue self, SseSerializer serializer); + + @protected + void sse_encode_bool(bool self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_client_info( + ClientInfo self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_client_info_without_id( + ClientInfoWithoutId self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_device_type( + DeviceType self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_expecting_public_key( + ExpectingPublicKey self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_file_metadata( + FileMetadata self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_pin_config( + PinConfig self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_prepare_upload_request_dto( + PrepareUploadRequestDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_prepare_upload_response_dto( + PrepareUploadResponseDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_proposing_client_info( + ProposingClientInfo self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_register_dto( + RegisterDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_rtc_send_file_response( + RTCSendFileResponse self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_ws_server_sdp_message( + WsServerSdpMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_client_info(ClientInfo self, SseSerializer serializer); + + @protected + void sse_encode_client_info_without_id( + ClientInfoWithoutId self, + SseSerializer serializer, + ); + + @protected + void sse_encode_device_type(DeviceType self, SseSerializer serializer); + + @protected + void sse_encode_expecting_public_key( + ExpectingPublicKey self, + SseSerializer serializer, + ); + + @protected + void sse_encode_file_dto(FileDto self, SseSerializer serializer); + + @protected + void sse_encode_file_metadata(FileMetadata self, SseSerializer serializer); + + @protected + void sse_encode_i_32(int self, SseSerializer serializer); + + @protected + void sse_encode_isize(PlatformInt64 self, SseSerializer serializer); + + @protected + void sse_encode_key_pair(KeyPair self, SseSerializer serializer); + + @protected + void sse_encode_list_String(List self, SseSerializer serializer); + + @protected + void sse_encode_list_client_info( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_file_dto(List self, SseSerializer serializer); + + @protected + void sse_encode_list_prim_u_8_loose(List self, SseSerializer serializer); + + @protected + void sse_encode_list_prim_u_8_strict( + Uint8List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_file_dto( + List<(String, FileDto)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_string( + List<(String, String)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_ls_http_client_version( + LsHttpClientVersion self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_String(String? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_device_type( + DeviceType? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_expecting_public_key( + ExpectingPublicKey? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_file_metadata( + FileMetadata? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_pin_config( + PinConfig? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_prepare_upload_response_dto( + PrepareUploadResponseDto? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_pin_config(PinConfig self, SseSerializer serializer); + + @protected + void sse_encode_prepare_upload_request_dto( + PrepareUploadRequestDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_prepare_upload_response_dto( + PrepareUploadResponseDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_prepare_upload_result( + PrepareUploadResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_proposing_client_info( + ProposingClientInfo self, + SseSerializer serializer, + ); + + @protected + void sse_encode_protocol_type(ProtocolType self, SseSerializer serializer); + + @protected + void + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_sink_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_dart_2_rust_stream_receiver( + (Dart2RustStreamSink, Dart2RustStreamReceiver) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_file_dto( + (String, FileDto) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_string( + (String, String) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_register_dto(RegisterDto self, SseSerializer serializer); + + @protected + void sse_encode_register_response_dto( + RegisterResponseDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_result_with_public_key_register_response_dto( + ResultWithPublicKeyRegisterResponseDto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_rs_http_client_error( + RsHttpClientError self, + SseSerializer serializer, + ); + + @protected + void sse_encode_rtc_file_error(RTCFileError self, SseSerializer serializer); + + @protected + void sse_encode_rtc_send_file_response( + RTCSendFileResponse self, + SseSerializer serializer, + ); + + @protected + void sse_encode_rtc_status(RTCStatus self, SseSerializer serializer); + + @protected + void sse_encode_u_16(int self, SseSerializer serializer); + + @protected + void sse_encode_u_64(BigInt self, SseSerializer serializer); + + @protected + void sse_encode_u_8(int self, SseSerializer serializer); + + @protected + void sse_encode_unit(void self, SseSerializer serializer); + + @protected + void sse_encode_usize(BigInt self, SseSerializer serializer); + + @protected + void sse_encode_ws_server_message( + WsServerMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_ws_server_sdp_message( + WsServerSdpMessage self, + SseSerializer serializer, + ); +} + +// Section: wire_class + +class RustLibWire implements BaseWire { + RustLibWire.fromExternalLibrary(ExternalLibrary lib); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + int ptr, + ) => wasmModule.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + ptr, + ); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + int ptr, + ) => wasmModule.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + ptr, + ); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + int ptr, + ) => wasmModule.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + ptr, + ); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + int ptr, + ) => wasmModule.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + ptr, + ); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + int ptr, + ) => wasmModule.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + ptr, + ); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + int ptr, + ) => wasmModule.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + ptr, + ); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + int ptr, + ) => wasmModule.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + ptr, + ); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + int ptr, + ) => wasmModule.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + ptr, + ); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + int ptr, + ) => wasmModule.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + ptr, + ); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + int ptr, + ) => wasmModule.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + ptr, + ); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + int ptr, + ) => wasmModule.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + ptr, + ); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + int ptr, + ) => wasmModule.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + ptr, + ); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + int ptr, + ) => wasmModule.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + ptr, + ); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + int ptr, + ) => wasmModule.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + ptr, + ); + + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + int ptr, + ) => wasmModule.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + ptr, + ); + + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + int ptr, + ) => wasmModule.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + ptr, + ); +} + +@JS('wasm_bindgen') +external RustLibWasmModule get wasmModule; + +@JS() +@anonymous +extension type RustLibWasmModule._(JSObject _) implements JSObject { + external void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + int ptr, + ); + + external void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + int ptr, + ); + + external void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + int ptr, + ); + + external void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + int ptr, + ); + + external void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + int ptr, + ); + + external void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + int ptr, + ); + + external void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + int ptr, + ); + + external void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + int ptr, + ); + + external void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + int ptr, + ); + + external void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + int ptr, + ); + + external void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + int ptr, + ); + + external void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + int ptr, + ); + + external void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + int ptr, + ); + + external void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + int ptr, + ); + + external void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + int ptr, + ); + + external void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + int ptr, + ); +} diff --git a/app/lib/util/alias_generator.dart b/app/lib/util/alias_generator.dart new file mode 100644 index 0000000..6fef585 --- /dev/null +++ b/app/lib/util/alias_generator.dart @@ -0,0 +1,15 @@ +import 'dart:math'; + +import 'package:localsend_app/gen/strings.g.dart'; + +String generateRandomAlias() { + final random = Random(); + final adj = t.aliasGenerator.adjectives; + final fruits = t.aliasGenerator.fruits; + + // The combination of both is locale dependent too. + return t.aliasGenerator.combination( + adjective: adj[random.nextInt(adj.length)], + fruit: fruits[random.nextInt(fruits.length)], + ); +} diff --git a/app/lib/util/determine_image_type.dart b/app/lib/util/determine_image_type.dart new file mode 100644 index 0000000..fc0f905 --- /dev/null +++ b/app/lib/util/determine_image_type.dart @@ -0,0 +1,21 @@ +import 'dart:typed_data'; + +/// Returns the image type (PNG, JPEG, GIF, etc) of the given image data. +/// Usually based on the first few bytes of the image. +String determineImageType(Uint8List bytes) { + if (bytes.lengthInBytes >= 2) { + if (bytes[0] == 0xFF && bytes[1] == 0xD8) { + return 'jpeg'; + } + if (bytes[0] == 0x89 && bytes[1] == 0x50) { + return 'png'; + } + if (bytes[0] == 0x47 && bytes[1] == 0x49) { + return 'gif'; + } + if (bytes[0] == 0x42 && bytes[1] == 0x4D) { + return 'bmp'; + } + } + return 'png'; +} diff --git a/app/lib/util/device_type_ext.dart b/app/lib/util/device_type_ext.dart new file mode 100644 index 0000000..9b6b5ed --- /dev/null +++ b/app/lib/util/device_type_ext.dart @@ -0,0 +1,14 @@ +import 'package:common/model/device.dart'; +import 'package:flutter/material.dart'; + +extension DeviceTypeExt on DeviceType { + IconData get icon { + return switch (this) { + DeviceType.mobile => Icons.smartphone, + DeviceType.desktop => Icons.computer, + DeviceType.web => Icons.language, + DeviceType.headless => Icons.terminal, + DeviceType.server => Icons.dns, + }; + } +} diff --git a/app/lib/util/favorites.dart b/app/lib/util/favorites.dart new file mode 100644 index 0000000..842f597 --- /dev/null +++ b/app/lib/util/favorites.dart @@ -0,0 +1,15 @@ +import 'package:collection/collection.dart'; +import 'package:common/model/device.dart'; +import 'package:localsend_app/model/persistence/favorite_device.dart'; + +extension FavoriteDevicesExt on Iterable { + /// Returns the favorite device with the given [device] or null if not found. + FavoriteDevice? findDevice(Device device) { + return firstWhereOrNull((e) => e.fingerprint == device.fingerprint); + } + + /// Returns true if the list contains the given [device]. + bool containsDevice(Device device) { + return any((e) => e.fingerprint == device.fingerprint); + } +} diff --git a/app/lib/util/file_path_helper.dart b/app/lib/util/file_path_helper.dart new file mode 100644 index 0000000..62211be --- /dev/null +++ b/app/lib/util/file_path_helper.dart @@ -0,0 +1,81 @@ +import 'package:common/model/file_type.dart'; + +/// Matches myFile (123) -> "myFile", " (123)" +final _fileNumberRegex = RegExp(r'^(.*)(?:(\s\(\d+\)))$'); + +extension FilePathStringExt on String { + String get extension { + final index = lastIndexOf('.'); + if (index != -1) { + return substring(index + 1).toLowerCase(); + } else { + return ''; + } + } + + String get fileName { + return replaceAll('\\', '/').split('/').last; + } + + String withFileNameKeepExtension(String fileNameWithoutExt) { + return '$fileNameWithoutExt.$extension'; + } + + String withExtension(String ext) { + if (ext == '') { + return this; + } else { + return '$this.$ext'; + } + } + + String withCount(int count) { + final index = lastIndexOf('.'); + final String fileName; + final String extension; + if (index != -1) { + fileName = substring(0, index); + extension = substring(index + 1).toLowerCase(); + } else { + fileName = this; + extension = ''; + } + + final match = _fileNumberRegex.firstMatch(fileName); + if (match != null) { + return '${match.group(1)} ($count)'.withExtension(extension); + } else { + return '$fileName ($count)'.withExtension(extension); + } + } + + String parentPath() { + final parts = replaceAll('\\', '/').split('/'); + return parts.take(parts.length - 1).join('/'); + } + + FileType guessFileType() { + switch (extension) { + case 'bmp': + case 'jpg': + case 'jpeg': + case 'heic': + case 'png': + case 'gif': + case 'svg': + case 'dng': + return FileType.image; + case 'mp4': + case 'mov': + return FileType.video; + case 'pdf': + return FileType.pdf; + case 'txt': + return FileType.text; + case 'apk': + return FileType.apk; + default: + return FileType.other; + } + } +} diff --git a/app/lib/util/file_size_helper.dart b/app/lib/util/file_size_helper.dart new file mode 100644 index 0000000..def5980 --- /dev/null +++ b/app/lib/util/file_size_helper.dart @@ -0,0 +1,14 @@ +extension IntFileSize on int { + /// Converts the integer representing bytes to a readable string + String get asReadableFileSize { + if (this < 1024) { + return '$this B'; + } else if (this < 1024 * 1024) { + return '${(this / 1024).toStringAsFixed(1)} KB'; + } else if (this < 1024 * 1024 * 1024) { + return '${(this / (1024 * 1024)).toStringAsFixed(1)} MB'; + } else { + return '${(this / (1024 * 1024 * 1024)).toStringAsFixed(1)} GB'; + } + } +} diff --git a/app/lib/util/file_speed_helper.dart b/app/lib/util/file_speed_helper.dart new file mode 100644 index 0000000..ad9544e --- /dev/null +++ b/app/lib/util/file_speed_helper.dart @@ -0,0 +1,51 @@ +import 'package:localsend_app/gen/strings.g.dart'; + +const _millisecondsPerSecond = 1000; +const _secondsPerMinute = 60; +const _secondsPerHour = 3600; +const _secondsPerDay = 86400; + +int getFileSpeed({ + required int start, + required int end, + required int bytes, +}) { + final deltaTime = end - start; + return (_millisecondsPerSecond * bytes) ~/ deltaTime; +} + +String getRemainingTime({ + required int bytesPerSeconds, + required int remainingBytes, +}) { + if (bytesPerSeconds == 0) { + return remainingBytes == 0 ? t.progressPage.remainingTime.seconds(n: 0, ss: '00') : '∞'; + } + + final remainingTimeInSeconds = _getRemainingTime(bytesPerSeconds: bytesPerSeconds, remainingBytes: remainingBytes); + + if (remainingTimeInSeconds < _secondsPerMinute) { + return t.progressPage.remainingTime.seconds(n: 0, ss: remainingTimeInSeconds.toString().padLeft(2, '0')); + } else if (remainingTimeInSeconds < _secondsPerHour) { + final minutes = remainingTimeInSeconds ~/ _secondsPerMinute; + final seconds = remainingTimeInSeconds % _secondsPerMinute; + return t.progressPage.remainingTime.minutes(n: minutes, ss: seconds.toString().padLeft(2, '0')); + } else if (remainingTimeInSeconds < _secondsPerDay) { + final hours = remainingTimeInSeconds ~/ _secondsPerHour; + final minutes = (remainingTimeInSeconds % _secondsPerHour) ~/ _secondsPerMinute; + return t.progressPage.remainingTime.hours(h: hours, m: minutes); + } else { + final days = remainingTimeInSeconds ~/ _secondsPerDay; + final remainingAfterDays = remainingTimeInSeconds % _secondsPerDay; + final hours = remainingAfterDays ~/ _secondsPerHour; + final minutes = (remainingAfterDays % _secondsPerHour) ~/ _secondsPerMinute; + return t.progressPage.remainingTime.days(d: days, h: hours, m: minutes); + } +} + +int _getRemainingTime({ + required int bytesPerSeconds, + required int remainingBytes, +}) { + return remainingBytes ~/ bytesPerSeconds; +} diff --git a/app/lib/util/file_type_ext.dart b/app/lib/util/file_type_ext.dart new file mode 100644 index 0000000..2881b30 --- /dev/null +++ b/app/lib/util/file_type_ext.dart @@ -0,0 +1,15 @@ +import 'package:common/model/file_type.dart'; +import 'package:flutter/material.dart'; + +extension FileTypeExt on FileType { + IconData get icon { + return switch (this) { + FileType.image => Icons.image, + FileType.video => Icons.movie, + FileType.pdf => Icons.description, + FileType.text => Icons.subject, + FileType.apk => Icons.android, + FileType.other => Icons.file_present_sharp, + }; + } +} diff --git a/app/lib/util/i18n.dart b/app/lib/util/i18n.dart new file mode 100644 index 0000000..ec87312 --- /dev/null +++ b/app/lib/util/i18n.dart @@ -0,0 +1,26 @@ +import 'package:localsend_app/gen/strings.g.dart'; + +Future initI18n() async { + // Register default plural resolver + for (final locale in AppLocale.values) { + if ([AppLocale.en, AppLocale.de].contains(locale)) { + continue; + } + + await LocaleSettings.setPluralResolver( + locale: locale, + cardinalResolver: (n, {zero, one, two, few, many, other}) { + if (n == 0) { + return zero ?? other ?? n.toString(); + } + if (n == 1) { + return one ?? other ?? n.toString(); + } + return other ?? n.toString(); + }, + ordinalResolver: (n, {zero, one, two, few, many, other}) { + return other ?? n.toString(); + }, + ); + } +} diff --git a/app/lib/util/image_converter.dart b/app/lib/util/image_converter.dart new file mode 100644 index 0000000..90426f0 --- /dev/null +++ b/app/lib/util/image_converter.dart @@ -0,0 +1,18 @@ +import 'dart:typed_data'; + +import 'package:image/image.dart'; + +/// Converts BMP image data to PNG image data. +Future convertBmpToPng(Uint8List bmp) async { + final pngImage = + await (Command() + ..decodeBmp(bmp) + ..encodePng()) + .getBytesThread(); + + if (pngImage == null) { + throw Exception('Failed to convert BMP to PNG'); + } + + return pngImage; +} diff --git a/app/lib/util/ip_helper.dart b/app/lib/util/ip_helper.dart new file mode 100644 index 0000000..763592d --- /dev/null +++ b/app/lib/util/ip_helper.dart @@ -0,0 +1,19 @@ +import 'package:collection/collection.dart'; + +extension StringIpExt on String { + String get visualId => split('.').last; +} + +class IpHelper { + /// Sorts Ip addresses with first being the most likely primary local address + /// Currently, + /// - sorts ending with ".1" last + /// - primary is always first + static List rankIpAddresses(List addresses, String primary) { + return addresses.sorted((a, b) { + int scoreA = a == primary ? 10 : (a.endsWith('.1') ? 0 : 1); + int scoreB = b == primary ? 10 : (b.endsWith('.1') ? 0 : 1); + return scoreB.compareTo(scoreA); + }); + } +} diff --git a/app/lib/util/native/autostart_helper.dart b/app/lib/util/native/autostart_helper.dart new file mode 100644 index 0000000..ddbf47d --- /dev/null +++ b/app/lib/util/native/autostart_helper.dart @@ -0,0 +1,122 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:localsend_app/util/native/macos_channel.dart'; +import 'package:logging/logging.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:win32_registry/win32_registry.dart'; + +const startHiddenFlag = '--hidden'; + +final _logger = Logger('AutoStartHelper'); + +Future enableAutoStart({required bool startHidden}) async { + try { + final packageInfo = await PackageInfo.fromPlatform(); + switch (defaultTargetPlatform) { + case TargetPlatform.linux: + String contents = + ''' +[Desktop Entry] +Type=Application +Name=${packageInfo.appName} +Comment=${packageInfo.appName} startup script +Exec=${Platform.resolvedExecutable}${startHidden ? ' $startHiddenFlag' : ''} +StartupNotify=false +Terminal=false +'''; + final file = File(_getLinuxFilePath(packageInfo.packageName)); + if (!file.parent.existsSync()) { + file.parent.createSync(recursive: true); + } + file.writeAsStringSync(contents); + return true; + case TargetPlatform.macOS: + await setLaunchAtLogin(true); + await setLaunchAtLoginMinimized(startHidden); + return true; + case TargetPlatform.windows: + _getWindowsRegistryKey().createValue( + RegistryValue.string( + _windowsRegistryKeyValue, + '"${Platform.resolvedExecutable}"${startHidden ? ' $startHiddenFlag' : ''}', + ), + ); + return true; + default: + return false; + } + } catch (e) { + _logger.warning('Could enable auto start', e); + return false; + } +} + +Future disableAutoStart() async { + try { + final packageInfo = await PackageInfo.fromPlatform(); + switch (defaultTargetPlatform) { + case TargetPlatform.linux: + File(_getLinuxFilePath(packageInfo.packageName)).deleteSync(); + break; + case TargetPlatform.macOS: + await setLaunchAtLogin(false); + break; + case TargetPlatform.windows: + _getWindowsRegistryKey().deleteValue(_windowsRegistryKeyValue); + break; + default: + break; + } + return true; + } catch (e) { + _logger.warning('Could disable auto start', e); + return false; + } +} + +Future isAutoStartEnabled() async { + final packageInfo = await PackageInfo.fromPlatform(); + switch (defaultTargetPlatform) { + case TargetPlatform.linux: + return File(_getLinuxFilePath(packageInfo.packageName)).existsSync(); + case TargetPlatform.macOS: + return await getLaunchAtLogin(); + case TargetPlatform.windows: + return _getWindowsRegistryKey().getStringValue(_windowsRegistryKeyValue)?.contains(Platform.resolvedExecutable) ?? false; + default: + return false; + } +} + +Future isAutoStartHidden() async { + final packageInfo = await PackageInfo.fromPlatform(); + switch (defaultTargetPlatform) { + case TargetPlatform.linux: + final file = File(_getLinuxFilePath(packageInfo.packageName)); + if (!file.existsSync()) { + return false; + } + return file.readAsStringSync().contains(startHiddenFlag); + case TargetPlatform.macOS: + return await getLaunchAtLoginMinimized(); + case TargetPlatform.windows: + return _getWindowsRegistryKey().getStringValue(_windowsRegistryKeyValue)?.contains(startHiddenFlag) ?? false; + default: + return false; + } +} + +const _windowsRegistryKeyValue = 'LocalSend'; + +RegistryKey _getWindowsRegistryKey() { + return Registry.openPath( + RegistryHive.currentUser, + path: r'Software\Microsoft\Windows\CurrentVersion\Run', + desiredAccessRights: AccessRights.allAccess, + ); +} + +String _getLinuxFilePath(String appName) { + return '${Platform.environment['HOME']}/.config/autostart/$appName.desktop'; +} diff --git a/app/lib/util/native/cache_helper.dart b/app/lib/util/native/cache_helper.dart new file mode 100644 index 0000000..67076d6 --- /dev/null +++ b/app/lib/util/native/cache_helper.dart @@ -0,0 +1,77 @@ +// ignore_for_file: discarded_futures, unawaited_futures + +import 'dart:io'; +import 'dart:isolate'; + +import 'package:common/util/logger.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/services.dart'; +import 'package:localsend_app/util/file_path_helper.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:logging/logging.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:path_provider_foundation/path_provider_foundation.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:wechat_assets_picker/wechat_assets_picker.dart'; + +final _logger = Logger('ClearCacheAction'); + +/// Clears the cache. +/// It runs on a separate isolate to avoid blocking the UI. +class ClearCacheAction extends AsyncGlobalAction { + @override + Future reduce() async { + // The token statement must be outside the lambda because it must be executed on the root isolate. + final token = ServicesBinding.rootIsolateToken!; + await Isolate.run(() => _clear(token)); + } +} + +Future _clear(RootIsolateToken token) async { + initLogger(Level.ALL); + BackgroundIsolateBinaryMessenger.ensureInitialized(token); + + final futures = ( + FilePicker.clearTemporaryFiles(), + PhotoManager.clearFileCache(), + checkPlatform([TargetPlatform.iOS, TargetPlatform.android]) + ? getTemporaryDirectory().then((cacheDir) { + cacheDir.list().listen((event) { + if (event is File) { + event.delete().then((_) {}).catchError((error) { + _logger.warning('Failed to delete file: $error'); + }); + } + }); + }) + : Future.value(), + checkPlatform([TargetPlatform.iOS]) + ? PathProviderFoundation() + .getContainerPath( + appGroupIdentifier: 'group.org.localsend.localsendApp', + ) + .then((directoryPath) async { + if (directoryPath == null) { + _logger.warning('Failed to get app group directory'); + return; + } + + final directory = Directory(directoryPath); + + // delete contents of the directory (only files, not directories) + await for (final entry in directory.list(recursive: false, followLinks: false)) { + if (entry is File && !entry.path.fileName.startsWith('.')) { + _logger.info('Deleting ${entry.path}'); + entry.deleteSync(); + } + } + }) + : Future.value(), + ).wait; + + try { + await futures; + } catch (e) { + _logger.warning('Failed to clear cache: $e'); + } +} diff --git a/app/lib/util/native/channel/android_channel.dart b/app/lib/util/native/channel/android_channel.dart new file mode 100644 index 0000000..081fcd4 --- /dev/null +++ b/app/lib/util/native/channel/android_channel.dart @@ -0,0 +1,119 @@ +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:flutter/services.dart'; +import 'package:localsend_app/util/native/content_uri_helper.dart'; +import 'package:logging/logging.dart'; + +part 'android_channel.mapper.dart'; + +const _methodChannel = MethodChannel('org.localsend.localsend_app/localsend'); +final _logger = Logger('AndroidSaf'); + +/// From Android 10 and above, we need to use the Storage Access Framework (SAF) to access files due to the scoped storage. +/// SAF itself is available from Android 4.4 (API level 19). +/// We implemented our own algorithm to build encode and decode content URIs. +/// Older versions might also work but the encoded content URI is not guaranteed to work with our algorithm. +const contentUriMinSdk = 27; + +Future pickDirectoryAndroid() async { + final result = await _methodChannel.invokeMethod('pickDirectory'); + if (result == null) { + return null; + } + + return PickDirectoryResultMapper.fromJson({ + 'directoryUri': result['directoryUri'], + 'files': (result['files'] as List).map((e) => FileInfoMapper.fromJson((e as Map).cast())).toList(), + }); +} + +Future pickDirectoryPathAndroid() async { + final result = await _methodChannel.invokeMethod('pickDirectoryPath'); + return result; +} + +Future?> pickFilesAndroid() async { + final result = await _methodChannel.invokeMethod('pickFiles'); + if (result == null) { + return null; + } + + return result.map((e) => FileInfoMapper.fromJson((e as Map).cast())).toList(); +} + +Future getSystemAnimationsStatusAndroid() async { + return await _methodChannel.invokeMethod('isAnimationsEnabled') ?? true; +} + +Future createDirectory({ + required String documentUri, + required String directoryName, +}) async { + _logger.info('Creating directory "$directoryName" in $documentUri'); + await _methodChannel.invokeMethod('createDirectory', { + 'documentUri': documentUri, + 'directoryName': directoryName, + }); +} + +Future createMissingDirectoriesAndroid({ + required String parentUri, + required String fileName, + required Set createdDirectories, +}) async { + final parts = fileName.split('/'); + for (int i = 0; i < parts.length - 1; i++) { + final subDirPath = parts.sublist(0, i + 1).join('/'); + if (createdDirectories.contains(subDirPath)) { + continue; + } + + await createDirectory( + documentUri: ContentUriHelper.convertTreeUriToDocumentUri( + treeUri: parentUri, + suffix: i == 0 ? null : parts.sublist(0, i).join('/'), + ), + directoryName: parts[i], + ); + createdDirectories.add(subDirPath); + } +} + +Future openContentUri({ + required String uri, +}) async { + _logger.info('Opening content URI: $uri'); + await _methodChannel.invokeMethod('openContentUri', { + 'uri': uri, + }); +} + +Future openGallery() async { + _logger.info('Opening gallery'); + await _methodChannel.invokeMethod('openGallery'); +} + +@MappableClass() +class PickDirectoryResult with PickDirectoryResultMappable { + final String directoryUri; + final List files; + + PickDirectoryResult({ + required this.directoryUri, + required this.files, + }); +} + +@MappableClass() +class FileInfo with FileInfoMappable { + final String name; + final int size; + final String uri; + final int lastModified; + + FileInfo({ + required this.name, + required this.size, + required this.uri, + required this.lastModified, + }); +} diff --git a/app/lib/util/native/channel/android_channel.mapper.dart b/app/lib/util/native/channel/android_channel.mapper.dart new file mode 100644 index 0000000..8437d9e --- /dev/null +++ b/app/lib/util/native/channel/android_channel.mapper.dart @@ -0,0 +1,296 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// dart format off +// ignore_for_file: type=lint +// ignore_for_file: invalid_use_of_protected_member +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'android_channel.dart'; + +class PickDirectoryResultMapper extends ClassMapperBase { + PickDirectoryResultMapper._(); + + static PickDirectoryResultMapper? _instance; + static PickDirectoryResultMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = PickDirectoryResultMapper._()); + FileInfoMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'PickDirectoryResult'; + + static String _$directoryUri(PickDirectoryResult v) => v.directoryUri; + static const Field _f$directoryUri = Field( + 'directoryUri', + _$directoryUri, + ); + static List _$files(PickDirectoryResult v) => v.files; + static const Field> _f$files = Field( + 'files', + _$files, + ); + + @override + final MappableFields fields = const { + #directoryUri: _f$directoryUri, + #files: _f$files, + }; + + static PickDirectoryResult _instantiate(DecodingData data) { + return PickDirectoryResult( + directoryUri: data.dec(_f$directoryUri), + files: data.dec(_f$files), + ); + } + + @override + final Function instantiate = _instantiate; + + static PickDirectoryResult fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static PickDirectoryResult deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin PickDirectoryResultMappable { + String serialize() { + return PickDirectoryResultMapper.ensureInitialized() + .encodeJson(this as PickDirectoryResult); + } + + Map toJson() { + return PickDirectoryResultMapper.ensureInitialized() + .encodeMap(this as PickDirectoryResult); + } + + PickDirectoryResultCopyWith< + PickDirectoryResult, + PickDirectoryResult, + PickDirectoryResult + > + get copyWith => + _PickDirectoryResultCopyWithImpl< + PickDirectoryResult, + PickDirectoryResult + >(this as PickDirectoryResult, $identity, $identity); + @override + String toString() { + return PickDirectoryResultMapper.ensureInitialized().stringifyValue( + this as PickDirectoryResult, + ); + } + + @override + bool operator ==(Object other) { + return PickDirectoryResultMapper.ensureInitialized().equalsValue( + this as PickDirectoryResult, + other, + ); + } + + @override + int get hashCode { + return PickDirectoryResultMapper.ensureInitialized().hashValue( + this as PickDirectoryResult, + ); + } +} + +extension PickDirectoryResultValueCopy<$R, $Out> + on ObjectCopyWith<$R, PickDirectoryResult, $Out> { + PickDirectoryResultCopyWith<$R, PickDirectoryResult, $Out> + get $asPickDirectoryResult => $base.as( + (v, t, t2) => _PickDirectoryResultCopyWithImpl<$R, $Out>(v, t, t2), + ); +} + +abstract class PickDirectoryResultCopyWith< + $R, + $In extends PickDirectoryResult, + $Out +> + implements ClassCopyWith<$R, $In, $Out> { + ListCopyWith<$R, FileInfo, FileInfoCopyWith<$R, FileInfo, FileInfo>> + get files; + $R call({String? directoryUri, List? files}); + PickDirectoryResultCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ); +} + +class _PickDirectoryResultCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, PickDirectoryResult, $Out> + implements PickDirectoryResultCopyWith<$R, PickDirectoryResult, $Out> { + _PickDirectoryResultCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + PickDirectoryResultMapper.ensureInitialized(); + @override + ListCopyWith<$R, FileInfo, FileInfoCopyWith<$R, FileInfo, FileInfo>> + get files => ListCopyWith( + $value.files, + (v, t) => v.copyWith.$chain(t), + (v) => call(files: v), + ); + @override + $R call({String? directoryUri, List? files}) => $apply( + FieldCopyWithData({ + if (directoryUri != null) #directoryUri: directoryUri, + if (files != null) #files: files, + }), + ); + @override + PickDirectoryResult $make(CopyWithData data) => PickDirectoryResult( + directoryUri: data.get(#directoryUri, or: $value.directoryUri), + files: data.get(#files, or: $value.files), + ); + + @override + PickDirectoryResultCopyWith<$R2, PickDirectoryResult, $Out2> + $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _PickDirectoryResultCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + +class FileInfoMapper extends ClassMapperBase { + FileInfoMapper._(); + + static FileInfoMapper? _instance; + static FileInfoMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = FileInfoMapper._()); + } + return _instance!; + } + + @override + final String id = 'FileInfo'; + + static String _$name(FileInfo v) => v.name; + static const Field _f$name = Field('name', _$name); + static int _$size(FileInfo v) => v.size; + static const Field _f$size = Field('size', _$size); + static String _$uri(FileInfo v) => v.uri; + static const Field _f$uri = Field('uri', _$uri); + static int _$lastModified(FileInfo v) => v.lastModified; + static const Field _f$lastModified = Field( + 'lastModified', + _$lastModified, + ); + + @override + final MappableFields fields = const { + #name: _f$name, + #size: _f$size, + #uri: _f$uri, + #lastModified: _f$lastModified, + }; + + static FileInfo _instantiate(DecodingData data) { + return FileInfo( + name: data.dec(_f$name), + size: data.dec(_f$size), + uri: data.dec(_f$uri), + lastModified: data.dec(_f$lastModified), + ); + } + + @override + final Function instantiate = _instantiate; + + static FileInfo fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static FileInfo deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin FileInfoMappable { + String serialize() { + return FileInfoMapper.ensureInitialized().encodeJson( + this as FileInfo, + ); + } + + Map toJson() { + return FileInfoMapper.ensureInitialized().encodeMap( + this as FileInfo, + ); + } + + FileInfoCopyWith get copyWith => + _FileInfoCopyWithImpl( + this as FileInfo, + $identity, + $identity, + ); + @override + String toString() { + return FileInfoMapper.ensureInitialized().stringifyValue(this as FileInfo); + } + + @override + bool operator ==(Object other) { + return FileInfoMapper.ensureInitialized().equalsValue( + this as FileInfo, + other, + ); + } + + @override + int get hashCode { + return FileInfoMapper.ensureInitialized().hashValue(this as FileInfo); + } +} + +extension FileInfoValueCopy<$R, $Out> on ObjectCopyWith<$R, FileInfo, $Out> { + FileInfoCopyWith<$R, FileInfo, $Out> get $asFileInfo => + $base.as((v, t, t2) => _FileInfoCopyWithImpl<$R, $Out>(v, t, t2)); +} + +abstract class FileInfoCopyWith<$R, $In extends FileInfo, $Out> + implements ClassCopyWith<$R, $In, $Out> { + $R call({String? name, int? size, String? uri, int? lastModified}); + FileInfoCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _FileInfoCopyWithImpl<$R, $Out> + extends ClassCopyWithBase<$R, FileInfo, $Out> + implements FileInfoCopyWith<$R, FileInfo, $Out> { + _FileInfoCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = + FileInfoMapper.ensureInitialized(); + @override + $R call({String? name, int? size, String? uri, int? lastModified}) => $apply( + FieldCopyWithData({ + if (name != null) #name: name, + if (size != null) #size: size, + if (uri != null) #uri: uri, + if (lastModified != null) #lastModified: lastModified, + }), + ); + @override + FileInfo $make(CopyWithData data) => FileInfo( + name: data.get(#name, or: $value.name), + size: data.get(#size, or: $value.size), + uri: data.get(#uri, or: $value.uri), + lastModified: data.get(#lastModified, or: $value.lastModified), + ); + + @override + FileInfoCopyWith<$R2, FileInfo, $Out2> $chain<$R2, $Out2>( + Then<$Out2, $R2> t, + ) => _FileInfoCopyWithImpl<$R2, $Out2>($value, $cast, t); +} + diff --git a/app/lib/util/native/cmd_helper.dart b/app/lib/util/native/cmd_helper.dart new file mode 100644 index 0000000..1b25f90 --- /dev/null +++ b/app/lib/util/native/cmd_helper.dart @@ -0,0 +1,21 @@ +import 'dart:io'; + +import 'package:logging/logging.dart'; + +final _logger = Logger('CmdHelper'); + +/// Runs [commands] in cmd having admin privileges. +Future runWindowsCommandAsAdmin(List commands) async { + try { + final joinedCommands = commands.join(' & '); + await Process.run( + 'powershell', + [ + '-Command', + "Start-Process -Verb RunAs cmd.exe -Args '/c', '$joinedCommands & echo. & pause'", + ], + ); + } catch (e) { + _logger.warning('Could not run command as admin', e); + } +} diff --git a/app/lib/util/native/content_uri_helper.dart b/app/lib/util/native/content_uri_helper.dart new file mode 100644 index 0000000..cc25fa5 --- /dev/null +++ b/app/lib/util/native/content_uri_helper.dart @@ -0,0 +1,105 @@ +import 'package:common/isolate.dart'; +import 'package:flutter/services.dart'; +import 'package:uri_content/uri_content.dart'; + +class ContentUriHelper { + /// Converts + /// content://com.android.externalstorage.documents/tree/primary%3ADocuments + /// to primary:Documents + static String? getPathFromTreeUri(String uri) { + final index = uri.indexOf('/tree/'); + if (index == -1) { + return null; + } + + return Uri.decodeComponent(uri.substring(index + 6)); + } + + /// Converts + /// primary:Documents to Documents + /// "primary:Documents/Some Folder" to "Some Folder" + static String? getEntityNameFromPath(String path) { + final parts = path.replaceAll(':', '/').split('/'); + for (int i = parts.length - 1; i >= 0; i--) { + if (parts[i].isNotEmpty) { + return parts[i]; + } + } + + return null; + } + + /// Converts + /// content://com.android.externalstorage.documents/tree/primary%3ADocuments%2FOffice%20Lens/document/primary%3ADocuments%2FOffice%20Lens%2FTest.pdf + /// to + /// Office Lens/Test.pdf + static String? guessRelativePathFromPickedFileContentUri({ + required String folderContentUri, + required String basePath, + required String folderName, + required String uri, + }) { + final withoutFolder = uri.replaceFirst(folderContentUri, ''); + String fileUri = withoutFolder; + if (withoutFolder.startsWith('/document/')) { + fileUri = withoutFolder.substring(10); + } + + final decoded = Uri.decodeComponent(fileUri); + final withoutBasePath = decoded.replaceFirst(basePath, ''); + if (withoutBasePath.startsWith('/')) { + return '$folderName$withoutBasePath'; + } else { + return '$folderName/$withoutBasePath'; + } + } + + /// Converts + /// content://com.android.externalstorage.documents/tree/primary%3ALocalSend + /// to + /// content://com.android.externalstorage.documents/tree/primary%3ALocalSend/document/primary%3ALocalSend + /// or + /// content://com.android.externalstorage.documents/tree/primary%3ALocalSend/document/primary%3ALocalSend%2FsubFolder + static String convertTreeUriToDocumentUri({ + required String treeUri, + String? suffix, + }) { + final index = treeUri.indexOf('/tree/'); + final treePath = treeUri.substring(index + 6); + + if (suffix == null) { + return '$treeUri/document/$treePath'; + } else { + return '$treeUri/document/$treePath%2F${Uri.encodeComponent(suffix)}'; + } + } + + /// Converts + /// content://com.android.externalstorage.documents/tree/primary%3ALocalSend/subFolder + /// to + /// content://com.android.externalstorage.documents/tree/primary%3ALocalSend%2FsubFolder + static String encodeTreeUri(String uri) { + final treeIndex = uri.indexOf('/tree/'); + if (treeIndex == -1) { + return uri; + } + + final encodedPath = Uri.encodeComponent(Uri.decodeComponent(uri.substring(treeIndex + 6))); + return uri.substring(0, treeIndex + 6) + encodedPath; + } +} + +class AndroidUriContentStreamResolver implements UriContentStreamResolver { + UriContent? _uriContent; + + @override + void init({required Object? rootIsolateToken}) { + BackgroundIsolateBinaryMessenger.ensureInitialized(rootIsolateToken as RootIsolateToken); + _uriContent = UriContent(); + } + + @override + Stream resolve(Uri uri) { + return _uriContent!.getContentStream(uri); + } +} diff --git a/app/lib/util/native/context_menu_helper.dart b/app/lib/util/native/context_menu_helper.dart new file mode 100644 index 0000000..5bdc6fa --- /dev/null +++ b/app/lib/util/native/context_menu_helper.dart @@ -0,0 +1,65 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:logging/logging.dart'; + +final _logger = Logger('ContextMenuHelper'); + +Future enableContextMenu() async { + if (defaultTargetPlatform != TargetPlatform.windows) { + return false; + } + + try { + final String script = + ''' +\$TargetPath = "${Platform.resolvedExecutable}" +\$ShortcutFile = "${_getWindowsFilePath(_windowsFileName)}" +\$WScriptShell = New-Object -ComObject WScript.Shell +\$Shortcut = \$WScriptShell.CreateShortcut(\$ShortcutFile) +\$Shortcut.TargetPath = \$TargetPath +\$Shortcut.Save() +'''; + final result = await Process.run('powershell', ['-Command', script]); + if (result.stderr != null && result.stderr!.isNotEmpty) { + throw Exception('Failed to create shortcut: ${result.stderr}'); + } + return await File(_getWindowsFilePath(_windowsFileName)).exists(); + } catch (e) { + _logger.severe('Failed to enable context menu: $e'); + return false; + } +} + +Future disableContextMenu() async { + try { + switch (defaultTargetPlatform) { + case TargetPlatform.windows: + final file = File(_getWindowsFilePath(_windowsFileName)); + if (await file.exists()) { + await file.delete(); + } + return true; + default: + return false; + } + } catch (e) { + return false; + } +} + +Future isContextMenuEnabled() async { + switch (defaultTargetPlatform) { + case TargetPlatform.windows: + return await File(_getWindowsFilePath(_windowsFileName)).exists(); + default: + return false; + } +} + +const _windowsFileName = 'LocalSend'; + +String _getWindowsFilePath(String appName) { + final appData = Platform.environment['APPDATA']; + return '$appData/Microsoft/Windows/SendTo/$appName.lnk'; +} diff --git a/app/lib/util/native/cross_file_converters.dart b/app/lib/util/native/cross_file_converters.dart new file mode 100644 index 0000000..aa43c4c --- /dev/null +++ b/app/lib/util/native/cross_file_converters.dart @@ -0,0 +1,108 @@ +import 'dart:io'; + +import 'package:common/model/file_type.dart'; +import 'package:device_apps/device_apps.dart'; +import 'package:flutter/foundation.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:localsend_app/model/cross_file.dart'; +import 'package:localsend_app/util/file_path_helper.dart'; +import 'package:localsend_app/util/native/channel/android_channel.dart' as android_channel; +import 'package:share_handler/share_handler.dart'; +import 'package:wechat_assets_picker/wechat_assets_picker.dart'; + +/// Utility functions to convert third party models to common [CrossFile] model. +class CrossFileConverters { + static Future convertAssetEntity(AssetEntity asset) async { + final file = (await asset.originFile)!; + return CrossFile( + name: await asset.titleAsync, + fileType: asset.type == AssetType.video ? FileType.video : FileType.image, + size: await file.length(), + thumbnail: null, + asset: asset, + path: file.path, + bytes: null, + lastModified: file.lastModifiedSync().toUtc(), + lastAccessed: file.lastAccessedSync().toUtc(), + ); + } + + static Future convertXFile(XFile file) async { + return CrossFile( + name: file.name, + fileType: file.name.guessFileType(), + size: await file.length(), + thumbnail: null, + asset: null, + path: kIsWeb ? null : file.path, + bytes: kIsWeb ? await file.readAsBytes() : null, // we can fetch it now because in Web it is already there + lastModified: kIsWeb ? null : await file.lastModified(), + lastAccessed: null, + ); + } + + static Future convertFile(File file) async { + return CrossFile( + name: file.path.fileName, + fileType: file.path.fileName.guessFileType(), + size: await file.length(), + thumbnail: null, + asset: null, + path: file.path, + bytes: null, + lastModified: file.lastModifiedSync().toUtc(), + lastAccessed: file.lastAccessedSync().toUtc(), + ); + } + + static Future convertFileInfo(android_channel.FileInfo file) async { + return CrossFile( + name: file.name, + fileType: file.name.guessFileType(), + size: file.size, + thumbnail: null, + asset: null, + path: file.uri, + bytes: null, + lastModified: DateTime.fromMillisecondsSinceEpoch(file.lastModified, isUtc: true), + lastAccessed: null, + ); + } + + static Future convertSharedAttachment(SharedAttachment attachment) async { + final file = File(attachment.path); + final fileName = attachment.path.fileName; + return CrossFile( + name: fileName, + fileType: fileName.guessFileType(), + size: await file.length(), + thumbnail: null, + asset: null, + path: file.path, + bytes: null, + lastModified: file.lastModifiedSync().toUtc(), + lastAccessed: file.lastAccessedSync().toUtc(), + ); + } + + static Future convertApplication(Application app) async { + final file = File(app.apkFilePath); + return CrossFile( + name: '${app.appName.trim()} - v${app.versionName}.apk', + fileType: FileType.apk, + thumbnail: app is ApplicationWithIcon ? app.icon : null, + size: await file.length(), + asset: null, + path: app.apkFilePath, + bytes: null, + lastModified: null, + lastAccessed: null, + ); + } +} + +extension CompareFile on CrossFile { + bool isSameFile({required CrossFile otherFile}) { + return (path ?? '') == (otherFile.path ?? ''); + } +} diff --git a/app/lib/util/native/device_info_helper.dart b/app/lib/util/native/device_info_helper.dart new file mode 100644 index 0000000..3a1dcec --- /dev/null +++ b/app/lib/util/native/device_info_helper.dart @@ -0,0 +1,88 @@ +import 'package:common/model/device.dart'; +import 'package:common/model/device_info_result.dart'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/foundation.dart'; +// ignore: implementation_imports +import 'package:slang/src/builder/model/enums.dart'; + +// ignore: implementation_imports +import 'package:slang/src/builder/utils/string_extensions.dart'; + +Future getDeviceInfo() async { + final plugin = DeviceInfoPlugin(); + final DeviceType deviceType; + final String? deviceModel; + int? androidSdkInt; + + if (kIsWeb) { + deviceType = DeviceType.web; + final deviceInfo = await plugin.webBrowserInfo; + deviceModel = deviceInfo.browserName.humanName; + } else { + switch (defaultTargetPlatform) { + case TargetPlatform.android: + case TargetPlatform.iOS: + deviceType = DeviceType.mobile; + break; + case TargetPlatform.linux: + case TargetPlatform.macOS: + case TargetPlatform.windows: + case TargetPlatform.fuchsia: + deviceType = DeviceType.desktop; + break; + } + + switch (defaultTargetPlatform) { + case TargetPlatform.android: + final deviceInfo = await plugin.androidInfo; + deviceModel = deviceInfo.brand.toCase(CaseStyle.pascal); + androidSdkInt = deviceInfo.version.sdkInt; + break; + case TargetPlatform.iOS: + final deviceInfo = await plugin.iosInfo; + deviceModel = deviceInfo.localizedModel; + break; + case TargetPlatform.linux: + deviceModel = 'Linux'; + break; + case TargetPlatform.macOS: + deviceModel = 'macOS'; + break; + case TargetPlatform.windows: + deviceModel = 'Windows'; + break; + case TargetPlatform.fuchsia: + deviceModel = 'Fuchsia'; + break; + } + } + + return DeviceInfoResult( + deviceType: deviceType, + deviceModel: deviceModel, + androidSdkInt: androidSdkInt, + ); +} + +extension on BrowserName { + String? get humanName { + switch (this) { + case BrowserName.firefox: + return 'Firefox'; + case BrowserName.samsungInternet: + return 'Samsung Internet'; + case BrowserName.opera: + return 'Opera'; + case BrowserName.msie: + return 'Internet Explorer'; + case BrowserName.edge: + return 'Microsoft Edge'; + case BrowserName.chrome: + return 'Google Chrome'; + case BrowserName.safari: + return 'Safari'; + case BrowserName.unknown: + return null; + } + } +} diff --git a/app/lib/util/native/directories.dart b/app/lib/util/native/directories.dart new file mode 100644 index 0000000..0ace8d3 --- /dev/null +++ b/app/lib/util/native/directories.dart @@ -0,0 +1,37 @@ +import 'dart:io' show Directory, Platform; + +import 'package:flutter/foundation.dart'; +import 'package:path_provider/path_provider.dart' as path; + +Future getDefaultDestinationDirectory() async { + switch (defaultTargetPlatform) { + case TargetPlatform.android: + final dir = await path.getDownloadsDirectory(); + return dir?.path ?? '/storage/emulated/0/Download'; + case TargetPlatform.iOS: + return (await path.getApplicationDocumentsDirectory()).path; + case TargetPlatform.linux: + case TargetPlatform.macOS: + case TargetPlatform.windows: + case TargetPlatform.fuchsia: + var downloadDir = await path.getDownloadsDirectory(); + if (downloadDir == null) { + if (defaultTargetPlatform == TargetPlatform.windows) { + downloadDir = Directory('${Platform.environment['HOMEPATH']}/Downloads'); + if (!downloadDir.existsSync()) { + downloadDir = Directory(Platform.environment['HOMEPATH']!); + } + } else { + downloadDir = Directory('${Platform.environment['HOME']}/Downloads'); + if (!downloadDir.existsSync()) { + downloadDir = Directory(Platform.environment['HOME']!); + } + } + } + return downloadDir.path.replaceAll('\\', '/'); + } +} + +Future getCacheDirectory() async { + return (await path.getTemporaryDirectory()).path; +} diff --git a/app/lib/util/native/file_picker.dart b/app/lib/util/native/file_picker.dart new file mode 100644 index 0000000..077049f --- /dev/null +++ b/app/lib/util/native/file_picker.dart @@ -0,0 +1,377 @@ +import 'dart:async'; + +import 'package:common/model/file_type.dart'; +import 'package:common/util/sleep.dart'; +import 'package:file_selector/file_selector.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/cross_file.dart'; +import 'package:localsend_app/pages/apk_picker_page.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/provider/selection/selected_sending_files_provider.dart'; +import 'package:localsend_app/util/determine_image_type.dart'; +import 'package:localsend_app/util/file_path_helper.dart'; +import 'package:localsend_app/util/image_converter.dart'; +import 'package:localsend_app/util/native/channel/android_channel.dart' as android_channel; +import 'package:localsend_app/util/native/cross_file_converters.dart'; +import 'package:localsend_app/util/native/pick_directory_path.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/util/ui/asset_picker_translated_text_delegate.dart'; +import 'package:localsend_app/widget/dialogs/loading_dialog.dart'; +import 'package:localsend_app/widget/dialogs/message_input_dialog.dart'; +import 'package:localsend_app/widget/dialogs/no_permission_dialog.dart'; +import 'package:logging/logging.dart'; +import 'package:pasteboard/pasteboard.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; +import 'package:uri_content/uri_content.dart'; +import 'package:wechat_assets_picker/wechat_assets_picker.dart'; + +final _logger = Logger('FilePickerHelper'); +final _uriContent = UriContent(); + +enum FilePickerOption { + file(Icons.description), + folder(Icons.folder), + media(Icons.image), + text(Icons.subject), + app(Icons.apps), + clipboard(Icons.paste); + + const FilePickerOption(this.icon); + + final IconData icon; + + String get label { + switch (this) { + case FilePickerOption.file: + return t.sendTab.picker.file; + case FilePickerOption.folder: + return t.sendTab.picker.folder; + case FilePickerOption.media: + return t.sendTab.picker.media; + case FilePickerOption.text: + return t.sendTab.picker.text; + case FilePickerOption.app: + return t.sendTab.picker.app; + case FilePickerOption.clipboard: + return t.sendTab.picker.clipboard; + } + } + + /// Returns the options for the current platform. + static List getOptionsForPlatform() { + if (checkPlatform([TargetPlatform.iOS])) { + // On iOS, picking from media is most common. + // The file app is very limited. + return [ + FilePickerOption.media, + FilePickerOption.text, + FilePickerOption.clipboard, + FilePickerOption.file, + FilePickerOption.folder, + ]; + } else if (checkPlatform([TargetPlatform.android])) { + // On android, the file app is most powerful. + // It actually also allows to pick media files. + return [ + FilePickerOption.file, + FilePickerOption.media, + FilePickerOption.clipboard, + FilePickerOption.text, + FilePickerOption.folder, + FilePickerOption.app, + ]; + } else { + // Desktop + return [ + FilePickerOption.file, + FilePickerOption.folder, + FilePickerOption.text, + FilePickerOption.clipboard, + ]; + } + } +} + +class PickFileAction extends AsyncGlobalAction { + final FilePickerOption option; + final BuildContext context; + + PickFileAction({ + required this.option, + required this.context, + }); + + @override + Future reduce() async { + switch (option) { + case FilePickerOption.file: + await _pickFiles(context, ref); + break; + case FilePickerOption.folder: + // ignore: use_build_context_synchronously + await _pickFolder(context, ref); + break; + case FilePickerOption.media: + // ignore: use_build_context_synchronously + await _pickMedia(context, ref); + break; + case FilePickerOption.text: + // ignore: use_build_context_synchronously + await _pickText(context, ref); + break; + case FilePickerOption.clipboard: + // ignore: use_build_context_synchronously + await _pickClipboard(context, ref); + break; + case FilePickerOption.app: + // ignore: use_build_context_synchronously + await _pickApp(context); + break; + } + } + + @override + String toString() { + return 'PickAction(option: $option)'; + } +} + +Future _pickFiles(BuildContext context, Ref ref) async { + if (checkPlatform([TargetPlatform.android])) { + // On android, the files are copied to the cache which takes some time. + // ignore: unawaited_futures + showDialog( + context: context, + barrierDismissible: false, + builder: (_) => const LoadingDialog(), + ); + } + try { + if (defaultTargetPlatform == TargetPlatform.android) { + final result = await android_channel.pickFilesAndroid(); + if (result != null) { + await ref + .redux(selectedSendingFilesProvider) + .dispatchAsync( + AddFilesAction( + files: result, + converter: CrossFileConverters.convertFileInfo, + ), + ); + } + } else { + final result = await openFiles(); + await ref + .redux(selectedSendingFilesProvider) + .dispatchAsync( + AddFilesAction( + files: result, + converter: CrossFileConverters.convertXFile, + ), + ); + } + } catch (e) { + if (e is PlatformException && e.code == 'CANCELED') { + // User canceled the file picker + _logger.info('User canceled file picker'); + return; + } + + // ignore: use_build_context_synchronously + await showDialog(context: context, builder: (_) => const NoPermissionDialog()); + _logger.warning('Failed to pick files', e); + } finally { + // ignore: use_build_context_synchronously + Routerino.context.popUntilRoot(); // remove loading dialog + } +} + +Future _pickFolder(BuildContext context, Ref ref) async { + if (checkPlatform([TargetPlatform.android])) { + try { + await Permission.storage.request(); + } catch (e) { + _logger.warning('Failed to request storage permission', e); + } + } + + if (!context.mounted) { + return; + } + + // ignore: unawaited_futures + showDialog( + context: context, + barrierDismissible: false, + builder: (_) => const LoadingDialog(), + ); + await sleepAsync(200); // Wait for the dialog to be shown + try { + if (defaultTargetPlatform == TargetPlatform.android && (ref.read(deviceInfoProvider).androidSdkInt ?? 0) >= android_channel.contentUriMinSdk) { + // Android 8 and above have more predictable content URIs that we can parse. + final result = await android_channel.pickDirectoryAndroid(); + if (result != null) { + await ref.redux(selectedSendingFilesProvider).dispatchAsync(AddAndroidDirectoryAction(result)); + } + } else { + final directoryPath = await pickDirectoryPath(); + if (directoryPath != null) { + await ref.redux(selectedSendingFilesProvider).dispatchAsync(AddDirectoryAction(directoryPath)); + } + } + } catch (e) { + if (e is PlatformException && e.code == 'CANCELED') { + // User canceled the file picker + _logger.info('User canceled file picker'); + return; + } + + _logger.warning('Failed to pick directory', e); + // ignore: use_build_context_synchronously + await showDialog(context: context, builder: (_) => const NoPermissionDialog()); + } finally { + // ignore: use_build_context_synchronously + Routerino.context.popUntilRoot(); // remove loading dialog + } +} + +Future _pickMedia(BuildContext context, Ref ref) async { + if (checkPlatform([TargetPlatform.android])) { + await PhotoManager.requestPermissionExtend( + requestOption: const PermissionRequestOption( + androidPermission: AndroidPermission( + type: RequestType.common, + mediaLocation: true, + ), + ), + ); + } + + if (!context.mounted) return; + + final oldBrightness = Theme.of(context).brightness; + final List? result = await AssetPicker.pickAssets( + context, + pickerConfig: const AssetPickerConfig(maxAssets: 999, textDelegate: TranslatedAssetPickerTextDelegate()), + ); + + WidgetsBinding.instance.addPostFrameCallback((_) async { + // restore brightness for Android + await sleepAsync(500); + if (context.mounted) { + await updateSystemOverlayStyleWithBrightness(oldBrightness); + } + }); + + if (result != null) { + await ref + .redux(selectedSendingFilesProvider) + .dispatchAsync( + AddFilesAction( + files: result, + converter: CrossFileConverters.convertAssetEntity, + ), + ); + } +} + +Future _pickText(BuildContext context, Ref ref) async { + final result = await showDialog(context: context, builder: (_) => const MessageInputDialog()); + if (result != null) { + ref.redux(selectedSendingFilesProvider).dispatch(AddMessageAction(message: result)); + } +} + +Future _pickClipboard(BuildContext context, Ref ref) async { + final data = await Clipboard.getData(Clipboard.kTextPlain); + if (data?.text != null) { + ref.redux(selectedSendingFilesProvider).dispatch(AddMessageAction(message: data!.text!)); + return; + } + + final image = await Pasteboard.image; + if (image != null) { + // Adding temporary variable because Dart analyzer somehow doesn't properly downcast Uint8List? to Uint8List + Uint8List currImage = image; + String imageType = determineImageType(image); + + // On Windows, Pasteboard read image from clipboard as BMP which is large and inefficient. Attempt to convert to PNG + if (imageType == 'bmp') { + try { + final pngImage = await convertBmpToPng(image); + currImage = pngImage; + imageType = 'png'; + } catch (e) { + // Fail to convert to png, proceed with existing bmp + } + } + + final now = DateTime.now(); + final fileName = + 'clipboard_${now.year}-${now.month.twoDigitString}-${now.day.twoDigitString}_${now.hour.twoDigitString}-${now.minute.twoDigitString}.$imageType'; + ref + .redux(selectedSendingFilesProvider) + .dispatch( + AddBinaryAction( + bytes: currImage, + fileType: FileType.image, + fileName: fileName, + ), + ); + return; + } + + final List files = await Pasteboard.files(); + if (files.isNotEmpty) { + await ref + .redux(selectedSendingFilesProvider) + .dispatchAsync( + AddFilesAction( + files: files.map((e) => XFile(e)).toList(), + converter: (file) async { + if (!file.path.startsWith('content://')) { + return CrossFileConverters.convertXFile(file); + } + // handle content uri + return CrossFile( + name: file.name, + fileType: file.name.guessFileType(), + size: await _uriContent.getContentLength(Uri.parse(file.path)) ?? -1, + path: file.path, + thumbnail: null, + asset: null, + bytes: null, + lastModified: null, + lastAccessed: null, + ); + }, + ), + ); + return; + } + + if (!context.mounted) { + return; + } + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(t.general.noItemInClipboard), + ), + ); +} + +Future _pickApp(BuildContext context) async { + // Currently, only Android APK + await context.push(() => const ApkPickerPage()); +} + +extension on int { + String get twoDigitString => toString().padLeft(2, '0'); +} diff --git a/app/lib/util/native/file_saver.dart b/app/lib/util/native/file_saver.dart new file mode 100644 index 0000000..b8d5352 --- /dev/null +++ b/app/lib/util/native/file_saver.dart @@ -0,0 +1,280 @@ +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:gal/gal.dart'; +import 'package:legalize/legalize.dart'; +import 'package:localsend_app/util/file_path_helper.dart'; +import 'package:localsend_app/util/native/channel/android_channel.dart' as android_channel; +import 'package:localsend_app/util/native/content_uri_helper.dart'; +import 'package:localsend_app/util/native/directories.dart'; +import 'package:logging/logging.dart'; +import 'package:mime/mime.dart'; +import 'package:path/path.dart' as p; +import 'package:saf_stream/saf_stream.dart'; +import 'package:saf_stream/saf_stream_platform_interface.dart'; + +final _logger = Logger('FileSaver'); + +final _saf = SafStream(); + +/// Saves file from [stream] to [destinationDirectory] with [fileName]. +/// +/// When [saveToGallery] is true: +/// - Saves to cache directory first, then transfers to OS gallery (Photos/Videos) +/// - If format is unsupported (see https://github.com/natsuk4ze/gal/wiki/Formats), +/// moves the cached file to [destinationDirectory] as fallback +/// +/// [onProgress] is called every 100ms with the number of bytes saved. +/// +/// Returns (savedToGallery, filePath): +/// - savedToGallery: true if saved to gallery, false if saved to directory +/// - filePath: absolute path to file (null when saved to gallery) +/// +/// Throws [GalException] for permission or I/O errors (file will be deleted on error) +Future<(bool, String?)> saveFile({ + required String destinationDirectory, + required String fileName, + required bool saveToGallery, + required bool isImage, + required Stream stream, + required void Function(int) onProgress, + required Set createdDirectories, + int? androidSdkInt, + DateTime? lastModified, + DateTime? lastAccessed, +}) async { + final parentDirectory = saveToGallery ? await getCacheDirectory() : destinationDirectory; + + final (destinationPath, documentUri, finalName) = await digestFilePathAndPrepareDirectory( + parentDirectory: parentDirectory, + fileName: fileName, + createdDirectories: createdDirectories, + ); + + // When saveToGallery is enabled, cache directory is used so SAF is not needed + if (!saveToGallery && androidSdkInt != null) { + SafWriteStreamInfo? safInfo; + + if (documentUri != null || destinationPath.startsWith('content://')) { + _logger.info('Using SAF to save file to ${documentUri ?? destinationPath} as $finalName'); + safInfo = await _saf.startWriteStream( + documentUri ?? destinationPath, + finalName, + lookupMimeType(finalName) ?? (isImage ? 'image/*' : '*/*'), + ); + } else { + final sdCardPath = getSdCardPath(destinationPath); + if (sdCardPath != null) { + final uriString = ContentUriHelper.encodeTreeUri(sdCardPath.path.parentPath()); + _logger.info('Using SAF to save file to $uriString'); + safInfo = await _saf.startWriteStream( + 'content://com.android.externalstorage.documents/tree/${sdCardPath.sdCardId}:$uriString', + finalName, + lookupMimeType(finalName) ?? (isImage ? 'image/*' : '*/*'), + ); + } + } + + if (safInfo != null) { + final sessionID = safInfo.session; + return await _saveFile( + destinationPath: destinationPath, + saveToGallery: saveToGallery, + destinationDirectory: destinationDirectory, + fileName: fileName, + createdDirectories: createdDirectories, + isImage: isImage, + stream: stream, + onProgress: onProgress, + write: null, + writeAsync: (data) async { + await _saf.writeChunk(sessionID, data); + }, + flush: null, + close: () async { + await _saf.endWriteStream(sessionID); + }, + ); + } + } + + final file = File(destinationPath); + final sink = file.openWrite(); + return await _saveFile( + destinationPath: destinationPath, + saveToGallery: saveToGallery, + destinationDirectory: destinationDirectory, + fileName: fileName, + createdDirectories: createdDirectories, + isImage: isImage, + stream: stream, + onProgress: onProgress, + write: sink.add, + writeAsync: null, + flush: sink.flush, + close: () async { + await sink.close(); + if (lastModified != null) { + try { + await file.setLastModified(lastModified); + } catch (_) {} + } + if (lastAccessed != null) { + try { + await file.setLastAccessed(lastAccessed); + } catch (_) {} + } + }, + ); +} + +Future<(bool, String?)> _saveFile({ + required String destinationPath, + required bool saveToGallery, + required String destinationDirectory, + required String fileName, + required Set createdDirectories, + required bool isImage, + required Stream stream, + required void Function(int) onProgress, + required void Function(Uint8List data)? write, + required Future Function(Uint8List data)? writeAsync, + required Future Function()? flush, + required Future Function() close, +}) async { + try { + int savedBytes = 0; + int lastFlushedBytes = 0; + final stopwatch = Stopwatch()..start(); + await for (final event in stream) { + if (writeAsync != null) { + await writeAsync(event); + } else { + write!(event); + } + + savedBytes += event.length; + if (stopwatch.elapsedMilliseconds >= 100) { + stopwatch.reset(); + onProgress(savedBytes); + } + + const tenMB = 10 * 1024 * 1024; + if (flush != null && savedBytes >= lastFlushedBytes + tenMB) { + await flush(); + lastFlushedBytes = savedBytes; + } + } + + await flush?.call(); + await close(); + + if (saveToGallery) { + try { + isImage ? await Gal.putImage(destinationPath) : await Gal.putVideo(destinationPath); + await File(destinationPath).delete(); + onProgress(savedBytes); + return (true, null); + } on GalException catch (e) { + if (e.type == GalExceptionType.notSupportedFormat) { + _logger.info('File format not supported by gallery, moving to destination directory'); + + final (fallbackPath, _, _) = await digestFilePathAndPrepareDirectory( + parentDirectory: destinationDirectory, + fileName: fileName, + createdDirectories: createdDirectories, + ); + + _logger.info('Moving file from $destinationPath to $fallbackPath'); + await File(destinationPath).rename(fallbackPath); + onProgress(savedBytes); + return (false, fallbackPath); + } + rethrow; + } + } + + onProgress(savedBytes); // always emit final event + return (false, destinationPath); // Saved to destination (not gallery) + } catch (_) { + try { + await close(); + await File(destinationPath).delete(); + } catch (e) { + _logger.warning('Could not delete file', e); + } + rethrow; + } +} + +/// If there is a file with the same name, then it appends a number to its file name +Future<(String, String?, String)> digestFilePathAndPrepareDirectory({ + required String parentDirectory, + required String fileName, + required Set createdDirectories, +}) async { + if (parentDirectory.startsWith('content://')) { + final String documentUri; + if (fileName.contains('/')) { + try { + await android_channel.createMissingDirectoriesAndroid(parentUri: parentDirectory, fileName: fileName, createdDirectories: createdDirectories); + } catch (e) { + _logger.warning('Could not create missing directories', e); + } + documentUri = ContentUriHelper.convertTreeUriToDocumentUri(treeUri: parentDirectory, suffix: fileName.parentPath()); + } else { + // root directory + documentUri = ContentUriHelper.convertTreeUriToDocumentUri(treeUri: parentDirectory, suffix: null); + } + + // destinationUri is for the history + // documentUri is for SAF to save the file, it should point to the parent directory + final destinationUri = ContentUriHelper.convertTreeUriToDocumentUri(treeUri: parentDirectory, suffix: fileName); + return (destinationUri, documentUri, p.basename(fileName)); + } + + final actualFileName = legalizeFilename(p.basename(fileName), os: Platform.operatingSystem); + final fileNameParts = p.split(fileName); + final dir = p.joinAll([parentDirectory, ...fileNameParts.take(fileNameParts.length - 1)]); + + if (fileNameParts.length > 1) { + // Check path traversal + if (!p.isWithin(parentDirectory, dir)) { + throw 'Path traversal detected'; + } + + try { + Directory(dir).createSync(recursive: true); + } catch (e) { + _logger.warning('Could not create directory', e); + } + } + + String destinationPath; + int counter = 1; + do { + destinationPath = counter == 1 ? p.join(dir, actualFileName) : p.join(dir, actualFileName.withCount(counter)); + counter++; + } while (await File(destinationPath).exists()); + return (destinationPath, null, p.basename(destinationPath)); +} + +final _sdCardPathRegex = RegExp(r'^/storage/([A-Fa-f0-9]{4}-[A-Fa-f0-9]{4})/(.*)$'); + +class SdCardPath { + final String sdCardId; + final String path; + + SdCardPath(this.sdCardId, this.path); +} + +/// Checks if the [path] is on the SD card and returns the SD card path. +/// Returns `null` if the [path] is not on the SD card. +/// Only works on Android. +SdCardPath? getSdCardPath(String path) { + final match = _sdCardPathRegex.firstMatch(path); + if (match == null) { + return null; + } + return SdCardPath(match.group(1)!, match.group(2)!); +} diff --git a/app/lib/util/native/ios_channel.dart b/app/lib/util/native/ios_channel.dart new file mode 100644 index 0000000..239be47 --- /dev/null +++ b/app/lib/util/native/ios_channel.dart @@ -0,0 +1,9 @@ +import 'dart:async'; + +import 'package:flutter/services.dart'; + +const _methodChannel = MethodChannel('ios-delegate-channel'); + +Future isReduceMotionEnabledIOS() async { + return await _methodChannel.invokeMethod('isReduceMotionEnabled') ?? false; +} diff --git a/app/lib/util/native/macos_channel.dart b/app/lib/util/native/macos_channel.dart new file mode 100644 index 0000000..29662d1 --- /dev/null +++ b/app/lib/util/native/macos_channel.dart @@ -0,0 +1,93 @@ +import 'dart:async'; + +import 'package:flutter/services.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/util/native/taskbar_helper.dart'; +import 'package:localsend_app/util/native/tray_helper.dart'; + +const _methodChannel = MethodChannel('main-delegate-channel'); + +Future setupStatusBar() async { + await _methodChannel.invokeMethod('setupStatusBar', { + 'open': t.tray.open, + 'quit': t.tray.close, + }); +} + +Future removeExistingDestinationAccess() async { + await _methodChannel.invokeMethod('removeExistingDestinationAccess'); +} + +Future persistDestinationFolderAccess(String path) async { + await _methodChannel.invokeMethod('persistDestinationFolderAccess', path); +} + +Future updateDockProgress(double progress) async { + await _methodChannel.invokeMethod('updateDockProgress', progress); +} + +Future setLaunchAtLogin(bool value) async { + await _methodChannel.invokeMethod('setLaunchAtLogin', value); +} + +Future getLaunchAtLogin() async { + return await _methodChannel.invokeMethod('getLaunchAtLogin'); +} + +Future setLaunchAtLoginMinimized(bool value) async { + await _methodChannel.invokeMethod('setLaunchAtLoginMinimized', value); +} + +Future getLaunchAtLoginMinimized() async { + return await _methodChannel.invokeMethod('getLaunchAtLoginMinimized'); +} + +Future isLaunchedAsLoginItem() async { + return await _methodChannel.invokeMethod('isLaunchedAsLoginItem'); +} + +Future setDockIcon(TaskbarIcon icon) async { + await _methodChannel.invokeMethod('setDockIcon', icon.index); +} + +Future isReduceMotionEnabledMacOs() async { + return await _methodChannel.invokeMethod('isReduceMotionEnabled') ?? false; +} + +Future openFirewallSettings() async { + await _methodChannel.invokeMethod('openFirewallSettings'); +} + +// This happens: +/// - on macOS when text is dropped onto the app Dock icon +/// - on macOS when text is dropped onto the app menu bar icon +/// - on macOS when text\web link are shared to the app using the share extension (i.e. the system share menu) +final _pendingFilesStreamController = StreamController>.broadcast(); +Stream> get pendingFilesStream => _pendingFilesStreamController.stream; + +/// This happens: +/// - on macOS when text is dropped onto the app Dock icon +/// - on macOS when text is dropped onto the app menu bar icon +/// - on macOS when text\web link are shared to the app using the share extension (i.e. the system share menu) +final _pendingStringsStreamController = StreamController>.broadcast(); +Stream> get pendingStringsStream => _pendingStringsStreamController.stream; + +/// Sets up the method call handler. +/// Any call from swift native code is dropped until this method is called. +Future setupMethodCallHandler() async { + _methodChannel.setMethodCallHandler((call) async { + switch (call.method) { + case 'onPendingFiles': + _pendingFilesStreamController.add((call.arguments as List).cast()); + break; + case 'onPendingStrings': + _pendingStringsStreamController.add((call.arguments as List).cast()); + break; + case 'showLocalSendFromMenuBar': + await showFromTray(); + break; + } + }); + + await _methodChannel.invokeMethod('methodChannelInitialized'); +} diff --git a/app/lib/util/native/open_file.dart b/app/lib/util/native/open_file.dart new file mode 100644 index 0000000..0edd9e5 --- /dev/null +++ b/app/lib/util/native/open_file.dart @@ -0,0 +1,29 @@ +import 'package:common/model/file_type.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/util/native/channel/android_channel.dart' as android_channel; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/dialogs/cannot_open_file_dialog.dart'; +import 'package:open_filex/open_filex.dart'; +import 'package:permission_handler/permission_handler.dart'; + +/// Opens the selected file which is stored on the device. +Future openFile( + BuildContext context, + FileType fileType, + String filePath, { + void Function()? onDeleteTap, +}) async { + if ((fileType == FileType.apk || filePath.toLowerCase().endsWith('.apk')) && checkPlatform([TargetPlatform.android])) { + await Permission.requestInstallPackages.request(); + } + + if (filePath.startsWith('content://')) { + await android_channel.openContentUri(uri: filePath); + return; + } + + final fileOpenResult = await OpenFilex.open(filePath); + if (fileOpenResult.type != ResultType.done && context.mounted) { + await CannotOpenFileDialog.open(context, filePath, onDeleteTap); + } +} diff --git a/app/lib/util/native/open_folder.dart b/app/lib/util/native/open_folder.dart new file mode 100644 index 0000000..1f05a6a --- /dev/null +++ b/app/lib/util/native/open_folder.dart @@ -0,0 +1,39 @@ +import 'package:flutter/foundation.dart'; +import 'package:localsend_app/util/native/channel/android_channel.dart' as android_channel; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:logging/logging.dart'; +import 'package:open_dir/open_dir.dart'; +import 'package:open_filex/open_filex.dart'; + +final _logger = Logger('OpenFolder'); + +/// Opens the folder and optionally selects the file in the folder. +Future openFolder({ + required String folderPath, + String? fileName, +}) async { + if (folderPath.startsWith('content://')) { + await android_channel.openContentUri(uri: folderPath); + return; + } + + if (fileName != null && checkPlatform([TargetPlatform.windows, TargetPlatform.linux, TargetPlatform.macOS])) { + // open folder and select file + + if (defaultTargetPlatform == TargetPlatform.windows) { + folderPath = folderPath.replaceAll('/', '\\'); + } + + final result = await OpenDir().openNativeDir(path: folderPath, highlightedFileName: fileName); + _logger.info('Open folder result: $result, path: $folderPath, file: $fileName'); + } else { + // only open folder + + if (!folderPath.endsWith('/')) { + folderPath = '$folderPath/'; + } + + final result = await OpenFilex.open(folderPath); + _logger.info('Open folder result: ${result.message}, path: $folderPath'); + } +} diff --git a/app/lib/util/native/pick_directory_path.dart b/app/lib/util/native/pick_directory_path.dart new file mode 100644 index 0000000..d5a5f76 --- /dev/null +++ b/app/lib/util/native/pick_directory_path.dart @@ -0,0 +1,26 @@ +import 'package:file_picker/file_picker.dart'; +import 'package:file_selector/file_selector.dart' as file_selector; +import 'package:flutter/foundation.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/util/native/channel/android_channel.dart' as android_channel; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +/// Opens a file picker to select a directory. +/// Returns null if the user cancels the selection. +Future pickDirectoryPath() async { + if (defaultTargetPlatform == TargetPlatform.android && + (RefenaScope.defaultRef.read(deviceRawInfoProvider).androidSdkInt ?? 0) >= android_channel.contentUriMinSdk) { + return await android_channel.pickDirectoryPathAndroid(); + } + + if (checkPlatform([TargetPlatform.android, TargetPlatform.iOS])) { + /// We need to use the file_picker package because file_selector does not expose the raw path. + /// We need the raw path to properly manipulate the path to save new files, or + /// to list files recursively. + /// Also, on iOS, file_selector does not work with directories. + return await FilePicker.getDirectoryPath(); + } else { + return await file_selector.getDirectoryPath(); + } +} diff --git a/app/lib/util/native/platform_check.dart b/app/lib/util/native/platform_check.dart new file mode 100644 index 0000000..782923b --- /dev/null +++ b/app/lib/util/native/platform_check.dart @@ -0,0 +1,61 @@ +import 'dart:io' show Platform; +import 'package:flutter/foundation.dart'; + +bool checkPlatform(List platforms, {bool web = false}) { + if (web && kIsWeb) { + return true; + } + return platforms.contains(defaultTargetPlatform); +} + +bool checkPlatformIsNot(List platforms, {bool web = false}) { + return !checkPlatform(platforms, web: web); +} + +/// This platform runs on a "traditional" computer +bool checkPlatformIsDesktop() { + return checkPlatform([TargetPlatform.linux, TargetPlatform.windows, TargetPlatform.macOS]); +} + +/// This platform supports tray +bool checkPlatformHasTray() { + return checkPlatform([TargetPlatform.windows, TargetPlatform.macOS, TargetPlatform.linux]); +} + +/// This platform can receive share intents +bool checkPlatformCanReceiveShareIntent() { + return checkPlatform([TargetPlatform.android, TargetPlatform.iOS]); +} + +/// This platform can select folders +bool checkPlatformWithFolderSelect() { + return checkPlatform([TargetPlatform.android, TargetPlatform.iOS, TargetPlatform.linux, TargetPlatform.windows, TargetPlatform.macOS]); +} + +/// This platform has a gallery +bool checkPlatformWithGallery() { + return checkPlatform([TargetPlatform.android, TargetPlatform.iOS]); +} + +/// This platform has access to file system +/// On android, do not allow to change +bool checkPlatformWithFileSystem() { + return checkPlatform([TargetPlatform.linux, TargetPlatform.windows, TargetPlatform.android, TargetPlatform.macOS]); +} + +/// Convenience function to check if the app is not running on a Linux device with the Wayland display manager +bool checkPlatformIsNotWaylandDesktop() { + if (checkPlatform([TargetPlatform.linux])) { + if (Platform.environment['XDG_SESSION_TYPE'] == 'wayland') { + return false; + } else { + return true; + } + } + return true; +} + +/// This platform supports payment (in-app purchase) +bool checkPlatformSupportPayment() { + return checkPlatform([TargetPlatform.android, TargetPlatform.iOS, TargetPlatform.macOS]); +} diff --git a/app/lib/util/native/taskbar_helper.dart b/app/lib/util/native/taskbar_helper.dart new file mode 100644 index 0000000..f04e5bc --- /dev/null +++ b/app/lib/util/native/taskbar_helper.dart @@ -0,0 +1,88 @@ +import 'package:common/model/session_status.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/util/native/macos_channel.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:windows_taskbar/windows_taskbar.dart'; + +enum TaskbarIcon { regular, error, success } + +class TaskbarHelper { + static final _isWindows = checkPlatform([TargetPlatform.windows]); + static final _isMacos = checkPlatform([TargetPlatform.macOS]); + + static Future clearProgressBar() async { + if (_isWindows) { + await WindowsTaskbar.setProgressMode(TaskbarProgressMode.noProgress); + } else if (_isMacos) { + await updateDockProgress(1.0); + } + } + + static Future setProgressBar(int progress, int total) async { + // Scale down to 0-100 range because Windows Taskbar only supports 32-bit integers + // This ensures that files with a size of 2^32 bytes or greater can still be displayed correctly + final (digestedProgress, digestedTotal) = _scaleRange(progress, total); + if (total != double.minPositive.toInt() && total != double.maxFinite.toInt()) { + if (_isWindows) { + await WindowsTaskbar.setProgress(digestedProgress, digestedTotal); + } else if (_isMacos) { + await updateDockProgress(progress / total); + } + } else { + if (_isWindows) { + await WindowsTaskbar.setProgressMode(TaskbarProgressMode.indeterminate); + } + } + } + + static Future setProgressBarMode(int mode) async { + if (_isWindows) { + await WindowsTaskbar.setProgressMode(mode); + } + } + + static Future setTaskbarIcon(TaskbarIcon icon) async { + if (_isMacos) { + await setDockIcon(icon); + } + } + + static Future visualizeStatus(SessionStatus? status) async { + // macOS handling + switch (status) { + case SessionStatus.finished: + await TaskbarHelper.setTaskbarIcon(TaskbarIcon.success); + break; + case SessionStatus.declined: + case SessionStatus.recipientBusy: + case SessionStatus.finishedWithErrors: + case SessionStatus.canceledBySender: + case SessionStatus.canceledByReceiver: + await TaskbarHelper.setTaskbarIcon(TaskbarIcon.error); + break; + default: + await TaskbarHelper.setTaskbarIcon(TaskbarIcon.regular); + } + + // Windows handling + switch (status) { + case SessionStatus.waiting: + await TaskbarHelper.setProgressBarMode(TaskbarProgressMode.indeterminate); + break; + case SessionStatus.declined: + case SessionStatus.recipientBusy: + case SessionStatus.finishedWithErrors: + case SessionStatus.canceledBySender: + case SessionStatus.canceledByReceiver: + await TaskbarHelper.setProgressBarMode(TaskbarProgressMode.error); + break; + default: + await TaskbarHelper.setProgressBarMode(TaskbarProgressMode.normal); + } + } +} + +(int, int) _scaleRange(int progress, int total) { + final percentage = progress / total; + return ((percentage * 100).toInt(), 100); +} diff --git a/app/lib/util/native/tray_helper.dart b/app/lib/util/native/tray_helper.dart new file mode 100644 index 0000000..43b8860 --- /dev/null +++ b/app/lib/util/native/tray_helper.dart @@ -0,0 +1,104 @@ +import 'dart:io'; + +import 'package:bitsdojo_window/bitsdojo_window.dart'; +import 'package:flutter/foundation.dart'; +import 'package:localsend_app/gen/assets.gen.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/provider/animation_provider.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:logging/logging.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:tray_manager/tray_manager.dart' as tm; +import 'package:window_manager/window_manager.dart'; + +final _logger = Logger('TrayHelper'); + +enum TrayEntry { + open, + close, +} + +Future initTray() async { + if (!checkPlatformHasTray()) { + return; + } + try { + if (checkPlatform([TargetPlatform.windows])) { + await tm.trayManager.setIcon(Assets.img.logo); + } else if (checkPlatform([TargetPlatform.macOS])) { + // The menu bar icon will created in AppDelegate.swift + return; + } else if (checkPlatform([TargetPlatform.linux])) { + String icon; + if (await File('/.flatpak-info').exists()) { + // Icon for Flatpak, which must exist in /app/share/icons/hicolor/*x*/apps. + icon = 'org.localsend.localsend_app-tray'; + } else { + icon = Assets.img.logo32White.path; + } + _logger.info('Using "$icon" as path of system tray icon'); + await tm.trayManager.setIcon(icon); + } else { + await tm.trayManager.setIcon(Assets.img.logo32.path); + } + + final items = [ + tm.MenuItem( + key: TrayEntry.open.name, + label: t.tray.open, + ), + tm.MenuItem( + key: TrayEntry.close.name, + label: defaultTargetPlatform == TargetPlatform.windows ? t.tray.closeWindows : t.tray.close, + ), + ]; + await tm.trayManager.setContextMenu(tm.Menu(items: items)); + // No Linux implementation for setToolTip available as of tray_manager 0.2.2 + // https://pub.dev/packages/tray_manager#api + if (!checkPlatform([TargetPlatform.linux])) { + await tm.trayManager.setToolTip(t.appName); + } + } catch (e) { + _logger.warning('Failed to init tray', e); + } +} + +Future hideToTray() async { + await windowManager.hide(); + if (checkPlatform([TargetPlatform.macOS])) { + // This will crash on Windows + // https://github.com/localsend/localsend/issues/32 + await windowManager.setSkipTaskbar(true); + } + + // Disable animations + try { + RefenaScope.defaultRef.notifier(sleepProvider).setState((_) => true); + } catch (e) { + _logger.warning('Failed to update sleep state (Refena not yet initialized)', e); + } +} + +Future showFromTray() async { + await windowManager.show(); + await windowManager.focus(); + if (checkPlatform([TargetPlatform.macOS])) { + // This will crash on Windows + // https://github.com/localsend/localsend/issues/32 + await windowManager.setSkipTaskbar(false); + appWindow.show(); + } + + // Enable animations + try { + RefenaScope.defaultRef.notifier(sleepProvider).setState((_) => false); + } catch (e) { + _logger.warning('Failed to update sleep state (Refena not yet initialized)', e); + } +} + +Future destroyTray() async { + if (!checkPlatform([TargetPlatform.linux])) { + await tm.trayManager.destroy(); + } +} diff --git a/app/lib/util/platform_strings.dart b/app/lib/util/platform_strings.dart new file mode 100644 index 0000000..ca5c064 --- /dev/null +++ b/app/lib/util/platform_strings.dart @@ -0,0 +1,20 @@ +import 'package:flutter/foundation.dart'; + +extension TargetPlatformExt on TargetPlatform { + String get humanName { + switch (this) { + case TargetPlatform.android: + return 'Android'; + case TargetPlatform.fuchsia: + return 'Fuchsia'; + case TargetPlatform.iOS: + return 'iOS'; + case TargetPlatform.linux: + return 'Linux'; + case TargetPlatform.macOS: + return 'macOS'; + case TargetPlatform.windows: + return 'Windows'; + } + } +} diff --git a/app/lib/util/rhttp.dart b/app/lib/util/rhttp.dart new file mode 100644 index 0000000..ebf96ff --- /dev/null +++ b/app/lib/util/rhttp.dart @@ -0,0 +1,86 @@ +import 'package:common/isolate.dart'; +import 'package:common/model/stored_security_context.dart'; +import 'package:rhttp/rhttp.dart'; + +class RhttpWrapper implements CustomHttpClient { + final RhttpClient _client; + + RhttpWrapper._(this._client); + + factory RhttpWrapper.create(Duration timeout, StoredSecurityContext securityContext) { + final client = createRhttpClient(timeout, securityContext); + return RhttpWrapper._(client); + } + + @override + Future get({ + required String uri, + required Map query, + }) async { + final response = await _client.get( + uri, + query: query, + ); + return response.body; + } + + @override + Future post({ + required String uri, + Map query = const {}, + required Map json, + }) async { + final response = await _client.post( + uri, + query: query, + body: HttpBody.json(json), + ); + return response.body; + } + + @override + Future postStream({ + required String uri, + required Map query, + required Map headers, + required Stream> stream, + required void Function(double progress) onSendProgress, + required CustomCancelToken cancelToken, + }) async { + final token = CancelToken(); + cancelToken.setCancel(token.cancel); + await _client.request( + method: HttpMethod.post, + expectBody: HttpExpectBody.bytes, + url: uri, + query: query, + headers: HttpHeaders.rawMap(headers), + body: HttpBody.stream( + stream, + length: int.parse(headers['Content-Length']!), + ), + onSendProgress: (curr, total) { + onSendProgress(curr / total); + }, + cancelToken: token, + ); + } +} + +RhttpClient createRhttpClient(Duration timeout, StoredSecurityContext securityContext, {Interceptor? interceptor}) { + return RhttpClient.createSync( + settings: ClientSettings( + timeoutSettings: TimeoutSettings( + timeout: timeout, + ), + tlsSettings: TlsSettings( + verifyCertificates: false, + clientCertificate: ClientCertificate( + certificate: securityContext.certificate, + privateKey: securityContext.privateKey, + ), + ), + ), + interceptors: interceptor != null ? [interceptor] : [], + ); +} diff --git a/app/lib/util/rust.dart b/app/lib/util/rust.dart new file mode 100644 index 0000000..18004fa --- /dev/null +++ b/app/lib/util/rust.dart @@ -0,0 +1,97 @@ +import 'package:common/model/device.dart'; +import 'package:common/model/dto/file_dto.dart'; +import 'package:common/model/dto/multicast_dto.dart'; +import 'package:localsend_app/rust/api/model.dart' as rust_model; +import 'package:mime/mime.dart'; + +extension ProtocolTypeExt on ProtocolType { + rust_model.ProtocolType toRust() { + return switch (this) { + ProtocolType.http => rust_model.ProtocolType.http, + ProtocolType.https => rust_model.ProtocolType.https, + }; + } +} + +extension DeviceExt on Device { + rust_model.ProtocolType getProtocolType() { + return switch (https) { + false => rust_model.ProtocolType.http, + true => rust_model.ProtocolType.https, + }; + } + + rust_model.RegisterDto toRegisterDto() { + return rust_model.RegisterDto( + alias: alias, + version: version, + deviceModel: deviceModel, + deviceType: deviceType.toRust(), + token: fingerprint, + port: port, + protocol: getProtocolType(), + hasWebInterface: download, + ); + } +} + +extension DeviceTypeExt on DeviceType { + rust_model.DeviceType toRust() { + return switch (this) { + DeviceType.mobile => rust_model.DeviceType.mobile, + DeviceType.desktop => rust_model.DeviceType.desktop, + DeviceType.web => rust_model.DeviceType.web, + DeviceType.headless => rust_model.DeviceType.headless, + DeviceType.server => rust_model.DeviceType.server, + }; + } +} + +extension FileDtoExt on FileDto { + rust_model.FileDto toRust() { + return rust_model.FileDto( + id: id, + fileName: fileName, + size: BigInt.from(size), + fileType: lookupMimeType(fileName) ?? 'application/octet-stream', + sha256: hash, + preview: preview, + metadata: metadata != null + ? rust_model.FileMetadata( + modified: metadata!.lastModified?.toUtc().toIso8601String(), + accessed: metadata!.lastAccessed?.toUtc().toIso8601String(), + ) + : null, + ); + } +} + +extension RustDeviceTypeExt on rust_model.DeviceType { + DeviceType toDart() { + return switch (this) { + rust_model.DeviceType.mobile => DeviceType.mobile, + rust_model.DeviceType.desktop => DeviceType.desktop, + rust_model.DeviceType.web => DeviceType.web, + rust_model.DeviceType.headless => DeviceType.headless, + rust_model.DeviceType.server => DeviceType.server, + }; + } +} + +extension RegisterResponseDtoExt on rust_model.RegisterResponseDto { + Device toDevice(String ip, int port, bool https, DiscoveryMethod method) { + return Device( + signalingId: null, + ip: ip, + version: version, + port: port, + https: https, + fingerprint: token, + alias: alias, + deviceModel: deviceModel, + deviceType: deviceType?.toDart() ?? DeviceType.desktop, + download: hasWebInterface, + discoveryMethods: {method}, + ); + } +} diff --git a/app/lib/util/security_helper.dart b/app/lib/util/security_helper.dart new file mode 100644 index 0000000..e97f50e --- /dev/null +++ b/app/lib/util/security_helper.dart @@ -0,0 +1,72 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:basic_utils/basic_utils.dart'; +import 'package:common/model/stored_security_context.dart'; +import 'package:convert/convert.dart'; +import 'package:localsend_app/rust/api/crypto.dart' as rust; + +/// Generates a random [SecurityContextResult]. +StoredSecurityContext generateSecurityContext([AsymmetricKeyPair? keyPair]) { + keyPair ??= CryptoUtils.generateRSAKeyPair(); + final privateKey = keyPair.privateKey as RSAPrivateKey; + final publicKey = keyPair.publicKey as RSAPublicKey; + final dn = { + 'CN': 'LocalSend User', + 'O': '', + 'OU': '', + 'L': '', + 'S': '', + 'C': '', + }; + final csr = X509Utils.generateRsaCsrPem(dn, privateKey, publicKey); + final certificate = X509Utils.generateSelfSignedCertificate(keyPair.privateKey, csr, 365 * 10); + + final hash = calculateHashOfCertificate(certificate); + final spki = extractPublicKeyFromCertificate(certificate); + + return StoredSecurityContext( + privateKey: CryptoUtils.encodeRSAPrivateKeyToPemPkcs1(privateKey), + publicKey: spki, + certificate: certificate, + certificateHash: hash, + ); +} + +/// Calculates the hash of a certificate. +String calculateHashOfCertificate(String certificate) { + // Convert PEM to DER + final pemContent = certificate.replaceAll('\r\n', '\n').split('\n').where((line) => line.isNotEmpty && !line.startsWith('---')).join(); + final der = base64Decode(pemContent); + + // Calculate hash + return CryptoUtils.getHash( + Uint8List.fromList(der), + algorithmName: 'SHA-256', + ); +} + +String extractPublicKeyFromCertificate(String certificate) { + final cert = X509Utils.x509CertificateFromPem(certificate); + final publicHex = cert.tbsCertificate!.subjectPublicKeyInfo.bytes!; + return _hexToSpkiPem(publicHex); +} + +String _hexToSpkiPem(String hexBytes) { + final publicBytes = hex.decode(hexBytes); + final publicBase64 = base64Encode(publicBytes); + final temp = + '''-----BEGIN PUBLIC KEY----- +$publicBase64 +-----END PUBLIC KEY-----'''; + return X509Utils.fixPem(temp); +} + +/// Verifies a certificate with a public key. +/// Throws an exception if the certificate is invalid. +Future verifyCertificate({ + required String cert, + required String publicKey, +}) async { + await rust.verifyCert(cert: cert, publicKey: publicKey); +} diff --git a/app/lib/util/send_ignore.dart b/app/lib/util/send_ignore.dart new file mode 100644 index 0000000..8bb31de --- /dev/null +++ b/app/lib/util/send_ignore.dart @@ -0,0 +1,38 @@ +import 'package:glob/glob.dart'; + +// const _ignoreFileName = '.sendignore'; + +class SendIgnore { + final List _globs = []; + + SendIgnore(); + + bool isIgnoreFile(String fileName) { + // TODO: Glob does not provide the same gitignore experience + return false; + // return fileName == _ignoreFileName; + } + + void loadIgnoreContent({ + required String? parentPath, + required List ignoreContents, + }) { + _globs.addAll( + ignoreContents.map((line) { + if (line.startsWith('/')) { + return Glob('$parentPath$line'); + } else { + if (parentPath == null) { + return Glob(line); + } else { + return Glob('$parentPath/**/$line'); + } + } + }), + ); + } + + bool isIgnored(String relativePath) { + return _globs.any((glob) => glob.matches('/$relativePath')); + } +} diff --git a/app/lib/util/shared_preferences/shared_preferences_file.dart b/app/lib/util/shared_preferences/shared_preferences_file.dart new file mode 100644 index 0000000..ba061aa --- /dev/null +++ b/app/lib/util/shared_preferences/shared_preferences_file.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart'; + +const _beautyEncoder = JsonEncoder.withIndent(' '); +const _encoder = JsonEncoder(); + +/// Custom implementation of SharedPreferencesStorePlatform +/// that uses a custom file. +class SharedPreferencesFile extends SharedPreferencesStorePlatform { + final File _file; + final bool beautify; + + SharedPreferencesFile({ + required String filePath, + this.beautify = false, + }) : _file = File(filePath); + + late final Map _cache = _getAll(); + + bool exists() { + return _file.existsSync(); + } + + String getPath() { + return _file.path; + } + + @override + Future clear() { + _write({}); + return Future.value(true); + } + + @override + Future> getAll() async { + return _cache; + } + + Map _getAll() { + if (!_file.existsSync()) { + _file.createSync(recursive: true); + } + + try { + return json.decode(_file.readAsStringSync()).cast(); + } catch (e) { + return {}; + } + } + + @override + Future remove(String key) { + _cache.remove(key); + _write(_cache); + return Future.value(true); + } + + @override + Future setValue(String valueType, String key, Object value) { + _cache[key] = value; + _write(_cache); + return Future.value(true); + } + + void _write(Map data) { + if (!_file.existsSync()) { + _file.createSync(recursive: true); + } + + _file.writeAsStringSync((beautify ? _beautyEncoder : _encoder).convert(data)); + } +} diff --git a/app/lib/util/shared_preferences/shared_preferences_portable.dart b/app/lib/util/shared_preferences/shared_preferences_portable.dart new file mode 100644 index 0000000..ad77b80 --- /dev/null +++ b/app/lib/util/shared_preferences/shared_preferences_portable.dart @@ -0,0 +1,18 @@ +import 'dart:io'; + +import 'package:localsend_app/util/shared_preferences/shared_preferences_file.dart'; +import 'package:path/path.dart' as path; + +/// Custom implementation of SharedPreferencesStorePlatform +/// that uses a file named settings.json located next to the executable. +/// This is used to for portable mode. +class SharedPreferencesPortable extends SharedPreferencesFile { + SharedPreferencesPortable() : super(filePath: _getSettingsPathFromExecutable(), beautify: true); +} + +/// Returns the absolute path to the settings.json file next to the executable. +String _getSettingsPathFromExecutable() { + final executablePath = Platform.resolvedExecutable; + final executableParentPath = File(executablePath).parent.path; + return path.join(executableParentPath, 'settings.json'); +} diff --git a/app/lib/util/simple_server.dart b/app/lib/util/simple_server.dart new file mode 100644 index 0000000..593fd53 --- /dev/null +++ b/app/lib/util/simple_server.dart @@ -0,0 +1,142 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/services.dart'; +import 'package:localsend_app/util/user_agent_analyzer.dart'; + +/// A very light layer on top of the HttpServer class. +class SimpleServer { + final HttpServer _server; + + SimpleServer.start({ + required HttpServer server, + required SimpleServerRouteBuilder routes, + }) : _server = server { + _server.listen((request) async { + final handler = + routes._routes[Route( + HttpMethod.values.firstWhere((e) => e.methodName == request.method), + request.uri.path, + )]; + + if (handler != null) { + handler.call(request); + } else { + request.response.statusCode = HttpStatus.notFound; + request.response.write('Not found'); + await request.response.flush(); + await request.response.close(); + } + }); + } + + Future close() async { + await _server.close(force: true); + } +} + +typedef HttpRequestHandler = void Function(HttpRequest request); + +enum HttpMethod { + get('GET'), + post('POST'); + + const HttpMethod(this.methodName); + + final String methodName; +} + +class Route { + final HttpMethod method; + final String path; + + Route(this.method, this.path); + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is Route && other.method == method && other.path == path; + } + + @override + int get hashCode => method.hashCode ^ path.hashCode; +} + +class SimpleServerRouteBuilder { + final Map _routes = {}; + + void addRoute(HttpMethod method, String path, HttpRequestHandler handler) { + _routes[Route( + method, + path, + )] = + handler; + } + + void get(String path, HttpRequestHandler handler) { + addRoute(HttpMethod.get, path, handler); + } + + void post(String path, HttpRequestHandler handler) { + addRoute(HttpMethod.post, path, handler); + } +} + +extension RequestExt on HttpRequest { + Future readAsString() async { + return utf8.decodeStream(this); + } + + /// Syntax sugar for creating an API response. + /// + /// Usage: + /// respondJson(200, message: 'Hello World') + Future respondJson(int code, {String? message, Map? body}) async { + response + ..statusCode = code + ..headers.contentType = ContentType.json + ..write(jsonEncode(message != null ? {'message': message} : (body ?? {}))); + + await response.close(); + } + + /// Syntax sugar for creating an HTML response. + /// + /// Usage: + /// respondAsset(200, 'assets/web/index.html') + Future respondAsset(int code, String asset, [String type = 'text/html; charset=utf-8']) async { + response + ..statusCode = code + ..headers.contentType = ContentType.parse(type) + ..write(await rootBundle.loadString(asset)); + + await response.close(); + } + + /// The IP address of the client. + String get ip { + return connectionInfo!.remoteAddress.address; + } + + /// Client's device info parsed from the user agent. + String get deviceInfo { + final userAgent = headers['user-agent']?.first; + if (userAgent == null) { + return 'Unknown'; + } + + final userAgentAnalyzer = UserAgentAnalyzer(); + final browser = userAgentAnalyzer.getBrowser(userAgent); + final os = userAgentAnalyzer.getOS(userAgent); + if (browser != null && os != null) { + return '$browser ($os)'; + } else if (browser != null) { + return browser; + } else if (os != null) { + return os; + } else { + return 'Unknown'; + } + } +} diff --git a/app/lib/util/ui/animations_status.dart b/app/lib/util/ui/animations_status.dart new file mode 100644 index 0000000..3e8fbad --- /dev/null +++ b/app/lib/util/ui/animations_status.dart @@ -0,0 +1,18 @@ +import 'dart:io'; +import 'package:localsend_app/util/native/channel/android_channel.dart'; +import 'package:localsend_app/util/native/ios_channel.dart'; +import 'package:localsend_app/util/native/macos_channel.dart'; + +Future getSystemAnimationsStatus() async { + if (Platform.isAndroid) { + return await getSystemAnimationsStatusAndroid(); + } else if (Platform.isIOS) { + bool isReduceMotionEnabledBool = await isReduceMotionEnabledIOS(); + return !isReduceMotionEnabledBool; + } else if (Platform.isMacOS) { + bool isReduceMotionEnabledBool = await isReduceMotionEnabledMacOs(); + return !isReduceMotionEnabledBool; + } + + return true; // Default to true for other platforms. +} diff --git a/app/lib/util/ui/asset_picker_translated_text_delegate.dart b/app/lib/util/ui/asset_picker_translated_text_delegate.dart new file mode 100644 index 0000000..fb0ef42 --- /dev/null +++ b/app/lib/util/ui/asset_picker_translated_text_delegate.dart @@ -0,0 +1,93 @@ +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:wechat_assets_picker/wechat_assets_picker.dart'; + +class TranslatedAssetPickerTextDelegate extends AssetPickerTextDelegate { + const TranslatedAssetPickerTextDelegate(); + + @override + String get languageCode => LocaleSettings.currentLocale.languageCode; + + @override + String get confirm => t.assetPicker.confirm; + + @override + String get cancel => t.assetPicker.cancel; + + @override + String get edit => t.assetPicker.edit; + + @override + String get gifIndicator => t.assetPicker.gifIndicator; + + @override + String get loadFailed => t.assetPicker.loadFailed; + + @override + String get original => t.assetPicker.original; + + @override + String get preview => t.assetPicker.preview; + + @override + String get select => t.assetPicker.select; + + @override + String get emptyList => t.assetPicker.emptyList; + + @override + String get unSupportedAssetType => t.assetPicker.unSupportedAssetType; + + @override + String get unableToAccessAll => t.assetPicker.unableToAccessAll; + + @override + String get viewingLimitedAssetsTip => t.assetPicker.viewingLimitedAssetsTip; + + @override + String get changeAccessibleLimitedAssets => t.assetPicker.changeAccessibleLimitedAssets; + + @override + String get accessAllTip => t.assetPicker.accessAllTip; + + @override + String get goToSystemSettings => t.assetPicker.goToSystemSettings; + + @override + String get accessLimitedAssets => t.assetPicker.accessLimitedAssets; + + @override + String get accessiblePathName => t.assetPicker.accessiblePathName; + + @override + String get sTypeAudioLabel => t.assetPicker.sTypeAudioLabel; + + @override + String get sTypeImageLabel => t.assetPicker.sTypeImageLabel; + + @override + String get sTypeVideoLabel => t.assetPicker.sTypeVideoLabel; + + @override + String get sTypeOtherLabel => t.assetPicker.sTypeOtherLabel; + + @override + String get sActionPlayHint => t.assetPicker.sActionPlayHint; + + @override + String get sActionPreviewHint => t.assetPicker.sActionPreviewHint; + + @override + String get sActionSelectHint => t.assetPicker.sActionSelectHint; + + @override + String get sActionSwitchPathLabel => t.assetPicker.sActionSwitchPathLabel; + + @override + String get sActionUseCameraHint => t.assetPicker.sActionUseCameraHint; + + @override + String get sNameDurationLabel => t.assetPicker.sNameDurationLabel; + + @override + String get sUnitAssetCountLabel => t.assetPicker.sUnitAssetCountLabel; +} diff --git a/app/lib/util/ui/dynamic_colors.dart b/app/lib/util/ui/dynamic_colors.dart new file mode 100644 index 0000000..b016bc7 --- /dev/null +++ b/app/lib/util/ui/dynamic_colors.dart @@ -0,0 +1,54 @@ +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:flutter/material.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +class DynamicColors { + final ColorScheme light; + final ColorScheme dark; + + const DynamicColors({ + required this.light, + required this.dark, + }); +} + +final dynamicColorsProvider = Provider((ref) => throw 'not initialized'); + +/// Returns the dynamic colors. +/// A copy of the dynamic_color_plugin implementation to retrieve the dynamic colors without a widget. +/// We need to replace [PlatformException] with a generic exception because on Windows 7 it is somehow not a [PlatformException]. +Future getDynamicColors() async { + try { + final corePalette = await DynamicColorPlugin.getCorePalette(); + if (corePalette != null) { + debugPrint('dynamic_color: Core palette detected.'); + return DynamicColors( + light: corePalette.toColorScheme(), + dark: corePalette.toColorScheme(brightness: Brightness.dark), + ); + } + } catch (e) { + debugPrint('dynamic_color: Failed to obtain core palette.'); + } + + try { + final accentColor = await DynamicColorPlugin.getAccentColor(); + if (accentColor != null) { + debugPrint('dynamic_color: Accent color detected.'); + return DynamicColors( + light: ColorScheme.fromSeed( + seedColor: accentColor, + brightness: Brightness.light, + ), + dark: ColorScheme.fromSeed( + seedColor: accentColor, + brightness: Brightness.dark, + ), + ); + } + } catch (e) { + debugPrint('dynamic_color: Failed to obtain accent color.'); + } + + return null; +} diff --git a/app/lib/util/ui/nav_bar_padding.dart b/app/lib/util/ui/nav_bar_padding.dart new file mode 100644 index 0000000..fac6187 --- /dev/null +++ b/app/lib/util/ui/nav_bar_padding.dart @@ -0,0 +1,6 @@ +import 'package:flutter/material.dart'; + +/// Since we use edge-to-edge mode on Android, the widgets may be hidden behind the navigation bar. +double getNavBarPadding(BuildContext context) { + return MediaQuery.of(context).padding.bottom; +} diff --git a/app/lib/util/ui/snackbar.dart b/app/lib/util/ui/snackbar.dart new file mode 100644 index 0000000..e7a8541 --- /dev/null +++ b/app/lib/util/ui/snackbar.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +extension SnackbarExt on BuildContext { + void showSnackBar(String text) { + final scaffold = ScaffoldMessenger.of(this); + scaffold.removeCurrentSnackBar(); + scaffold.showSnackBar( + SnackBar( + content: Text(text), + ), + ); + } +} diff --git a/app/lib/util/user_agent_analyzer.dart b/app/lib/util/user_agent_analyzer.dart new file mode 100644 index 0000000..e060e05 --- /dev/null +++ b/app/lib/util/user_agent_analyzer.dart @@ -0,0 +1,37 @@ +class UserAgentAnalyzer { + String? getBrowser(String userAgent) { + if (userAgent.contains('Firefox')) { + return 'Firefox'; + } else if (userAgent.contains('Chrome')) { + return 'Chrome'; + } else if (userAgent.contains('Safari')) { + return 'Safari'; + } else if (userAgent.contains('Opera') || userAgent.contains('OPR')) { + return 'Opera'; + } else if (userAgent.contains('Edg')) { + return 'Edge'; + } else if (userAgent.contains('MSIE') || userAgent.contains('Trident')) { + return 'Internet Explorer'; + } else if (userAgent.contains('insomnia')) { + return 'Insomnia'; + } else { + return null; + } + } + + String? getOS(String userAgent) { + if (userAgent.contains('Win')) { + return 'Windows'; + } else if (userAgent.contains('Android')) { + return 'Android'; + } else if (userAgent.contains('Macintosh')) { + return 'macOS'; + } else if (userAgent.contains('iPhone') || userAgent.contains('iPad') || userAgent.contains('iPod')) { + return 'iOS'; + } else if (userAgent.contains('X11')) { + return 'Linux'; + } else { + return null; + } + } +} diff --git a/app/lib/widget/animated_opacity_cross_fade.dart b/app/lib/widget/animated_opacity_cross_fade.dart new file mode 100644 index 0000000..b353f06 --- /dev/null +++ b/app/lib/widget/animated_opacity_cross_fade.dart @@ -0,0 +1,59 @@ +import 'package:common/util/sleep.dart'; +import 'package:flutter/material.dart'; + +/// The same as AnimatedCrossFade but with an opacity animation +class AnimatedOpacityCrossFade extends StatefulWidget { + final CrossFadeState crossFadeState; + final int durationMillis; + final Widget firstChild; + final Widget secondChild; + + const AnimatedOpacityCrossFade({ + required this.crossFadeState, + required this.durationMillis, + required this.firstChild, + required this.secondChild, + }); + + @override + State createState() => _AnimatedOpacityCrossFadeState(); +} + +class _AnimatedOpacityCrossFadeState extends State { + late CrossFadeState _internalState; + double _opacity = 1; + + @override + void initState() { + super.initState(); + _internalState = widget.crossFadeState; + } + + @override + void didUpdateWidget(AnimatedOpacityCrossFade oldWidget) async { + super.didUpdateWidget(oldWidget); + + if (oldWidget.crossFadeState != widget.crossFadeState) { + setState(() { + _opacity = 0; + }); + final targetState = widget.crossFadeState; + await sleepAsync(widget.durationMillis); + if (mounted && targetState == widget.crossFadeState) { + setState(() { + _internalState = widget.crossFadeState; + _opacity = 1; + }); + } + } + } + + @override + Widget build(BuildContext context) { + return AnimatedOpacity( + opacity: _opacity, + duration: Duration(milliseconds: widget.durationMillis ~/ 2), + child: _internalState == CrossFadeState.showFirst ? widget.firstChild : widget.secondChild, + ); + } +} diff --git a/app/lib/widget/animations/initial_fade_transition.dart b/app/lib/widget/animations/initial_fade_transition.dart new file mode 100644 index 0000000..bb24a75 --- /dev/null +++ b/app/lib/widget/animations/initial_fade_transition.dart @@ -0,0 +1,45 @@ +import 'package:common/util/sleep.dart'; +import 'package:flutter/material.dart'; + +class InitialFadeTransition extends StatefulWidget { + final Widget child; + final Duration duration; + final Duration delay; + + const InitialFadeTransition({ + required this.child, + required this.duration, + this.delay = Duration.zero, + super.key, + }); + + @override + State createState() => _InitialFadeTransitionState(); +} + +class _InitialFadeTransitionState extends State { + double _opacity = 0; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) async { + await sleepAsync(widget.delay.inMilliseconds); + if (!mounted) { + return; + } + setState(() { + _opacity = 1; + }); + }); + } + + @override + Widget build(BuildContext context) { + return AnimatedOpacity( + opacity: _opacity, + duration: widget.duration, + child: widget.child, + ); + } +} diff --git a/app/lib/widget/animations/initial_slide_transition.dart b/app/lib/widget/animations/initial_slide_transition.dart new file mode 100644 index 0000000..2bafcc4 --- /dev/null +++ b/app/lib/widget/animations/initial_slide_transition.dart @@ -0,0 +1,53 @@ +import 'package:common/util/sleep.dart'; +import 'package:flutter/material.dart'; + +class InitialSlideTransition extends StatefulWidget { + final Widget child; + final Offset origin; + final Offset destination; + final Curve curve; + final Duration duration; + final Duration delay; + + const InitialSlideTransition({ + required this.child, + this.origin = Offset.zero, + this.destination = Offset.zero, + this.curve = Curves.easeOutCubic, + required this.duration, + this.delay = Duration.zero, + super.key, + }); + + @override + State createState() => _InitialSlideTransitionState(); +} + +class _InitialSlideTransitionState extends State { + late Offset _offset; + + @override + void initState() { + super.initState(); + _offset = widget.origin; + WidgetsBinding.instance.addPostFrameCallback((_) async { + await sleepAsync(widget.delay.inMilliseconds); + if (!mounted) { + return; + } + setState(() { + _offset = widget.destination; + }); + }); + } + + @override + Widget build(BuildContext context) { + return AnimatedSlide( + offset: _offset, + curve: widget.curve, + duration: widget.duration, + child: widget.child, + ); + } +} diff --git a/app/lib/widget/big_button.dart b/app/lib/widget/big_button.dart new file mode 100644 index 0000000..c957cf3 --- /dev/null +++ b/app/lib/widget/big_button.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/widget/responsive_builder.dart'; + +class BigButton extends StatelessWidget { + static const double desktopWidth = 100.0; + static const double mobileWidth = 90.0; + + final IconData icon; + final String label; + final bool filled; + final VoidCallback onTap; + + const BigButton({ + required this.icon, + required this.label, + required this.filled, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final sizingInformation = SizingInformation(MediaQuery.sizeOf(context).width); + final buttonWidth = sizingInformation.isDesktop ? desktopWidth : mobileWidth; + return SizedBox( + width: buttonWidth, + height: 65.0, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: filled ? colorScheme.primary : colorScheme.secondaryContainerIfDark, + foregroundColor: filled ? colorScheme.onPrimary : colorScheme.onSecondaryContainerIfDark, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + padding: EdgeInsets.only(left: 2, right: 2, top: 10 + desktopPaddingFix, bottom: 8 + desktopPaddingFix), + ), + onPressed: onTap, + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Icon(icon), + FittedBox( + alignment: Alignment.bottomCenter, + child: Text(label, maxLines: 1), + ), + ], + ), + ), + ); + } +} diff --git a/app/lib/widget/column_list_view.dart b/app/lib/widget/column_list_view.dart new file mode 100644 index 0000000..9a2b542 --- /dev/null +++ b/app/lib/widget/column_list_view.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +/// Behaves like a [Column] if there is enough space, otherwise like a [ListView]. +class ColumnListView extends StatelessWidget { + final CrossAxisAlignment crossAxisAlignment; + final List children; + + const ColumnListView({ + required this.children, + this.crossAxisAlignment = CrossAxisAlignment.center, + }); + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + return SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: constraints.maxHeight, + ), + child: IntrinsicHeight( + child: Column( + crossAxisAlignment: crossAxisAlignment, + mainAxisSize: MainAxisSize.min, + children: children, + ), + ), + ), + ); + }, + ); + } +} diff --git a/app/lib/widget/copyable_text.dart b/app/lib/widget/copyable_text.dart new file mode 100644 index 0000000..083d2ad --- /dev/null +++ b/app/lib/widget/copyable_text.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:localsend_app/util/ui/snackbar.dart'; + +class CopyableText extends StatelessWidget { + final TextSpan? prefix; + final String name; + final String? value; + + const CopyableText({ + this.prefix, + required this.name, + required this.value, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: value == null + ? null + : () async { + await Clipboard.setData(ClipboardData(text: value!)); + if (context.mounted) { + context.showSnackBar('Copied $name to clipboard!'); + } + }, + child: Text.rich( + TextSpan( + children: [ + ?prefix, + TextSpan(text: value ?? '-'), + ], + ), + ), + ); + } +} diff --git a/app/lib/widget/custom_basic_appbar.dart b/app/lib/widget/custom_basic_appbar.dart new file mode 100644 index 0000000..2d1c7ec --- /dev/null +++ b/app/lib/widget/custom_basic_appbar.dart @@ -0,0 +1,75 @@ +import 'dart:io'; +import 'dart:ui'; + +import 'package:bitsdojo_window/bitsdojo_window.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; + +class CustomBackButton extends StatelessWidget { + final Color? color; + + const CustomBackButton({super.key, this.color}); + + @override + Widget build(BuildContext context) { + final isRtl = Directionality.of(context) == TextDirection.rtl; + return IconButton( + icon: Icon( + isRtl ? Icons.arrow_forward_ios_rounded : Icons.arrow_back_ios_new_rounded, + color: color ?? IconTheme.of(context).color, + ), + tooltip: MaterialLocalizations.of(context).backButtonTooltip, + onPressed: () async { + await Navigator.maybePop(context); + }, + ); + } +} + +PreferredSizeWidget basicLocalSendAppbar(String title) { + // Creates a very simple new appBar to support bitsdojo_windows on mac and make them draggable + // if you want have more items on here for a specific page, make sure to add it here as an option + // so that mac users can still appreciate this near native new design + return checkPlatform([TargetPlatform.macOS]) + ? PreferredSize( + preferredSize: const Size.fromHeight(kToolbarHeight), + child: ClipRRect( + child: BackdropFilter( + filter: ImageFilter.blur( + sigmaX: 20.0, + sigmaY: 20.0, + ), + child: MoveWindow( + child: Container( + color: Colors.transparent, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // Padding space for macOS traffic lights + if (!kIsWeb && Platform.isMacOS) const SizedBox(width: 60), + // Originally leading Icon + CustomBackButton(), + // Center Title + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: FittedBox( + fit: BoxFit.scaleDown, + child: Text(title, style: TextStyle(fontSize: 100, fontWeight: FontWeight.normal)), + ), + ), + ), + ), + // For true centering of the icon since it shifted + const SizedBox(width: 60), + ], + ), + ), + ), + ), + ), + ) + : AppBar(title: Text(title)); +} diff --git a/app/lib/widget/custom_dropdown_button.dart b/app/lib/widget/custom_dropdown_button.dart new file mode 100644 index 0000000..2ceea0b --- /dev/null +++ b/app/lib/widget/custom_dropdown_button.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; + +/// A [DropdownButton] with a custom theme. +/// Currently, there is no easy way to apply color and border radius to all [DropdownButton]. +class CustomDropdownButton extends StatelessWidget { + final T value; + final List> items; + final ValueChanged? onChanged; + final bool expanded; + + const CustomDropdownButton({ + required this.value, + required this.items, + this.onChanged, + this.expanded = true, + }); + + @override + Widget build(BuildContext context) { + return Material( + color: Theme.of(context).inputDecorationTheme.fillColor, + shape: RoundedRectangleBorder(borderRadius: Theme.of(context).inputDecorationTheme.borderRadius), + child: DropdownButton( + value: value, + isExpanded: expanded, + underline: Container(), + borderRadius: Theme.of(context).inputDecorationTheme.borderRadius, + items: items, + onChanged: onChanged == null + ? null + : (value) { + if (value != null) { + onChanged!(value); + } + }, + ), + ); + } +} diff --git a/app/lib/widget/custom_icon_button.dart b/app/lib/widget/custom_icon_button.dart new file mode 100644 index 0000000..d22ffb0 --- /dev/null +++ b/app/lib/widget/custom_icon_button.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; + +class CustomIconButton extends StatelessWidget { + final VoidCallback? onPressed; + final Widget child; + + const CustomIconButton({ + required this.onPressed, + required this.child, + super.key, + }); + + @override + Widget build(BuildContext context) { + return TextButton( + style: TextButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onSurface, + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + minimumSize: Size.zero, + shape: const CircleBorder(), + padding: checkPlatformIsDesktop() ? const EdgeInsets.symmetric(horizontal: 8, vertical: 16) : const EdgeInsets.all(8), + ), + onPressed: onPressed, + child: child, + ); + } +} diff --git a/app/lib/widget/custom_progress_bar.dart b/app/lib/widget/custom_progress_bar.dart new file mode 100644 index 0000000..4dbfd7e --- /dev/null +++ b/app/lib/widget/custom_progress_bar.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +class CustomProgressBar extends StatelessWidget { + final double? progress; + final double borderRadius; + final Color? color; + + const CustomProgressBar({required this.progress, this.borderRadius = 10, this.color}); + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: BorderRadius.circular(borderRadius), + child: LinearProgressIndicator( + value: progress, + color: color ?? Theme.of(context).colorScheme.primary, + minHeight: 10, + ), + ); + } +} diff --git a/app/lib/widget/debug_entry.dart b/app/lib/widget/debug_entry.dart new file mode 100644 index 0000000..ae2ea2d --- /dev/null +++ b/app/lib/widget/debug_entry.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/widget/copyable_text.dart'; + +class DebugEntry extends StatelessWidget { + static const headerStyle = TextStyle(fontWeight: FontWeight.bold); + + final String name; + final String? value; + + const DebugEntry({ + required this.name, + required this.value, + }); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 20), + Text(name, style: headerStyle), + CopyableText( + name: name, + value: value, + ), + ], + ); + } +} diff --git a/app/lib/widget/device_bage.dart b/app/lib/widget/device_bage.dart new file mode 100644 index 0000000..a3ee94e --- /dev/null +++ b/app/lib/widget/device_bage.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class DeviceBadge extends StatelessWidget { + final Color backgroundColor; + final Color foregroundColor; + final String label; + + const DeviceBadge({ + required this.backgroundColor, + required this.foregroundColor, + required this.label, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(5), + ), + child: Text(label, style: TextStyle(color: foregroundColor)), + ); + } +} diff --git a/app/lib/widget/dialogs/add_file_dialog.dart b/app/lib/widget/dialogs/add_file_dialog.dart new file mode 100644 index 0000000..5136a0e --- /dev/null +++ b/app/lib/widget/dialogs/add_file_dialog.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/util/native/file_picker.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/big_button.dart'; +import 'package:localsend_app/widget/dialogs/custom_bottom_sheet.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +class AddFileDialog extends StatelessWidget { + final List options; + + const AddFileDialog({required this.options}); + + static Future open({required BuildContext context, required List options}) async { + if (checkPlatformIsDesktop()) { + await showDialog( + context: context, + builder: (_) => AlertDialog( + title: Text(t.dialogs.addFile.title), + content: ConstrainedBox( + constraints: const BoxConstraints(minWidth: 300), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(t.dialogs.addFile.content), + const SizedBox(height: 20), + AddFileDialog(options: options), + ], + ), + ), + actions: [ + TextButton( + onPressed: () { + context.pop(); + }, + child: Text(t.general.close), + ), + ], + ), + ); + } else { + await context.pushBottomSheet( + () => CustomBottomSheet( + title: t.dialogs.addFile.title, + description: t.dialogs.addFile.content, + child: AddFileDialog(options: options), + ), + ); + } + } + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 15, + runSpacing: 15, + children: [ + ...options.map((option) { + return BigButton( + icon: option.icon, + label: option.label, + filled: true, + onTap: () async { + context.popUntilRoot(); + await context.global.dispatchAsync(PickFileAction(option: option, context: context)); + }, + ); + }), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/address_input_dialog.dart b/app/lib/widget/dialogs/address_input_dialog.dart new file mode 100644 index 0000000..59df189 --- /dev/null +++ b/app/lib/widget/dialogs/address_input_dialog.dart @@ -0,0 +1,265 @@ +import 'dart:async'; + +import 'package:collection/collection.dart'; +import 'package:common/model/device.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/provider/http_provider.dart'; +import 'package:localsend_app/provider/last_devices.provider.dart'; +import 'package:localsend_app/provider/local_ip_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/rust/api/model.dart'; +import 'package:localsend_app/util/rust.dart'; +import 'package:localsend_app/widget/dialogs/error_dialog.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +enum _InputMode { + hashtag, + ip; + + String get label { + return switch (this) { + _InputMode.hashtag => t.dialogs.addressInput.hashtag, + _InputMode.ip => t.dialogs.addressInput.ip, + }; + } +} + +/// A dialog to input an hash or address. +/// Pops the dialog with the device if found. +class AddressInputDialog extends StatefulWidget { + const AddressInputDialog(); + + @override + State createState() => _AddressInputDialogState(); +} + +class _AddressInputDialogState extends State with Refena { + final _selected = List.generate(_InputMode.values.length, (index) => index == 0); + _InputMode _mode = _InputMode.hashtag; + String _input = ''; + bool _fetching = false; + String? _error; + + Future _submit(List localIps, int port, [String? candidate]) async { + final List candidates; + final String input = _input.trim(); + if (candidate != null) { + candidates = [candidate]; + } else if (_mode == _InputMode.ip) { + candidates = [input]; + } else { + candidates = localIps.map((ip) => '${ip.ipPrefix}.$input').toList(); + } + + setState(() { + _fetching = true; + }); + + final https = ref.read(settingsProvider).https; + + final deviceCompleter = Completer(); + Device? foundDevice; + String? error; + + final payload = ref.read(deviceFullInfoProvider).toRegisterDto(); + + final List> futures = [ + for (final ip in candidates) + () async { + try { + final response = await ref + .read(httpProvider) + .v2 + .register( + protocol: https ? ProtocolType.https : ProtocolType.http, + ip: ip, + port: port, + payload: payload, + ); + + foundDevice = response.body.toDevice(ip, port, https, HttpDiscovery(ip: ip)); + deviceCompleter.complete(); + } catch (e) { + error = e.toString(); + rethrow; + } + }(), + ]; + + // Wait until, + // - a device is found + // - all candidates are checked + try { + await Future.any([ + deviceCompleter.future, + Future.wait(futures), + ]); + } catch (_) {} + + if (!mounted) { + return; + } + + if (foundDevice != null) { + ref.redux(lastDevicesProvider).dispatch(AddLastDeviceAction(foundDevice!)); + context.pop(foundDevice); + } else { + setState(() { + _fetching = false; + _error = error; + }); + } + } + + @override + Widget build(BuildContext context) { + final localIps = (ref.watch(localIpProvider.select((info) => info.localIps))).uniqueIpPrefix; + final settings = ref.watch(settingsProvider); + final lastDevices = ref.watch(lastDevicesProvider); + + return AlertDialog( + title: Text(t.dialogs.addressInput.title), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ToggleButtons( + isSelected: _selected, + onPressed: (int index) { + setState(() { + for (int i = 0; i < _selected.length; i++) { + _selected[i] = i == index; + } + _mode = _InputMode.values[index]; + }); + }, + borderRadius: BorderRadius.circular(10), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + constraints: const BoxConstraints(minWidth: 0, minHeight: 0), + children: _InputMode.values.map((mode) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + child: Text(mode.label), + ); + }).toList(), + ), + const SizedBox(height: 15), + TextFormField( + key: ValueKey('input-$_mode'), + autofocus: true, + enabled: !_fetching, + keyboardType: _mode == _InputMode.hashtag ? TextInputType.number : TextInputType.text, + decoration: InputDecoration( + prefixText: _mode == _InputMode.hashtag ? '# ' : 'IP: ', + ), + onChanged: (s) { + setState(() => _input = s); + }, + onFieldSubmitted: (s) async => _submit(localIps, settings.port), + ), + const SizedBox(height: 10), + if (_mode == _InputMode.hashtag) ...[ + Text( + '${t.general.example}: 123', + style: const TextStyle(color: Colors.grey), + ), + if (localIps.length <= 1) + Text( + '${t.dialogs.addressInput.ip}: ${localIps.firstOrNull?.ipPrefix ?? '192.168.2'}.$_input', + style: const TextStyle(color: Colors.grey), + ) + else ...[ + Text( + '${t.dialogs.addressInput.ip}:', + style: const TextStyle(color: Colors.grey), + ), + for (final ip in localIps) + Text( + '- ${ip.ipPrefix}.$_input', + style: const TextStyle(color: Colors.grey), + ), + ], + ] else ...[ + if (lastDevices.isEmpty) + Text( + '${t.general.example}: ${localIps.firstOrNull?.ipPrefix ?? '192.168.2'}.123', + style: const TextStyle(color: Colors.grey), + ) + else + Text.rich( + TextSpan( + children: [ + TextSpan(text: t.dialogs.addressInput.recentlyUsed), + ...lastDevices + .mapIndexed((index, device) { + return [ + if (index != 0) const TextSpan(text: ', '), + TextSpan( + text: device.ip, + style: TextStyle(color: Theme.of(context).colorScheme.primary), + recognizer: TapGestureRecognizer()..onTap = () async => _submit(localIps, settings.port, device.ip), + ), + ]; + }) + .expand((e) => e), + ], + ), + ), + ], + if (_error != null) + Padding( + padding: const EdgeInsets.only(top: 10), + child: Row( + children: [ + Text(t.general.error, style: TextStyle(color: Theme.of(context).colorScheme.warning)), + if (_error != null) ...[ + const SizedBox(width: 5), + InkWell( + onTap: () async { + await showDialog( + context: context, + builder: (_) => ErrorDialog(error: _error!), + ); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 5), + child: Icon(Icons.info, color: Theme.of(context).colorScheme.warning, size: 20), + ), + ), + ], + ], + ), + ), + ], + ), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.cancel), + ), + FilledButton( + onPressed: _fetching ? null : () async => _submit(localIps, settings.port), + child: Text(t.general.confirm), + ), + ], + ); + } +} + +extension on String { + String get ipPrefix { + return split('.').take(3).join('.'); + } +} + +extension on List { + List get uniqueIpPrefix { + final seen = {}; + return where((s) => seen.add(s.ipPrefix)).toList(); + } +} diff --git a/app/lib/widget/dialogs/cancel_session_dialog.dart b/app/lib/widget/dialogs/cancel_session_dialog.dart new file mode 100644 index 0000000..a046e84 --- /dev/null +++ b/app/lib/widget/dialogs/cancel_session_dialog.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/widget/dialogs/custom_bottom_sheet.dart'; +import 'package:routerino/routerino.dart'; + +class CancelSessionDialog extends StatelessWidget { + const CancelSessionDialog(); + + @override + Widget build(BuildContext context) { + return CustomBottomSheet( + title: t.dialogs.cancelSession.title, + description: t.dialogs.cancelSession.content, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + TextButton( + onPressed: () => context.pop(false), + child: Text(t.general.continueStr), + ), + ElevatedButton.icon( + onPressed: () => context.pop(true), + icon: const Icon(Icons.close), + label: Text(t.general.cancel), + ), + ], + ), + ); + } +} diff --git a/app/lib/widget/dialogs/cannot_open_file_dialog.dart b/app/lib/widget/dialogs/cannot_open_file_dialog.dart new file mode 100644 index 0000000..de41b94 --- /dev/null +++ b/app/lib/widget/dialogs/cannot_open_file_dialog.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/dialogs/custom_bottom_sheet.dart'; +import 'package:routerino/routerino.dart'; + +class CannotOpenFileDialog extends StatelessWidget { + final String path; + + const CannotOpenFileDialog({required this.path, super.key}); + + static Future open(BuildContext context, String path, void Function()? onDeleteTap) async { + if (checkPlatformIsDesktop()) { + await showDialog( + context: context, + builder: (_) => AlertDialog( + title: Text(t.dialogs.cannotOpenFile.title), + content: Text(t.dialogs.cannotOpenFile.content(file: path)), + actions: [ + if (onDeleteTap != null) + TextButton( + onPressed: () { + onDeleteTap(); + context.pop(); + }, + child: Text(t.receiveHistoryPage.entryActions.deleteFromHistory), + ), + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.close), + ), + ], + ), + ); + } else { + await context.pushBottomSheet(() => CannotOpenFileDialog(path: path)); + } + } + + @override + Widget build(BuildContext context) { + return CustomBottomSheet( + title: t.dialogs.cannotOpenFile.title, + description: t.dialogs.cannotOpenFile.content(file: path), + child: Center( + child: ElevatedButton( + onPressed: () => context.popUntilRoot(), + child: Text(t.general.close), + ), + ), + ); + } +} diff --git a/app/lib/widget/dialogs/custom_bottom_sheet.dart b/app/lib/widget/dialogs/custom_bottom_sheet.dart new file mode 100644 index 0000000..70083da --- /dev/null +++ b/app/lib/widget/dialogs/custom_bottom_sheet.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:routerino/routerino.dart'; + +class CustomBottomSheet extends StatelessWidget { + final String title; + final String? description; + final Widget child; + const CustomBottomSheet({ + required this.title, + required this.description, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return RouterinoBottomSheet( + title: title, + description: description, + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + borderRadius: 20, + child: child, + ); + } +} diff --git a/app/lib/widget/dialogs/encryption_disabled_notice.dart b/app/lib/widget/dialogs/encryption_disabled_notice.dart new file mode 100644 index 0000000..92ea5f0 --- /dev/null +++ b/app/lib/widget/dialogs/encryption_disabled_notice.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/dialogs/custom_bottom_sheet.dart'; +import 'package:routerino/routerino.dart'; + +class EncryptionDisabledNotice extends StatelessWidget { + const EncryptionDisabledNotice({super.key}); + + static Future open(BuildContext context) async { + if (checkPlatformIsDesktop()) { + await showDialog( + context: context, + builder: (_) => AlertDialog( + title: Text(t.dialogs.encryptionDisabledNotice.title), + content: Text(t.dialogs.encryptionDisabledNotice.content), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.close), + ), + ], + ), + ); + } else { + await context.pushBottomSheet(() => const EncryptionDisabledNotice()); + } + } + + @override + Widget build(BuildContext context) { + return CustomBottomSheet( + title: t.dialogs.encryptionDisabledNotice.title, + description: t.dialogs.encryptionDisabledNotice.content, + child: Center( + child: ElevatedButton( + onPressed: () => context.popUntilRoot(), + child: Text(t.general.close), + ), + ), + ); + } +} diff --git a/app/lib/widget/dialogs/error_dialog.dart b/app/lib/widget/dialogs/error_dialog.dart new file mode 100644 index 0000000..cd605bb --- /dev/null +++ b/app/lib/widget/dialogs/error_dialog.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:routerino/routerino.dart'; + +class ErrorDialog extends StatelessWidget { + final String error; + + const ErrorDialog({required this.error, super.key}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.dialogs.errorDialog.title), + content: SelectableText(error), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.close), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/favorite_delete_dialog.dart b/app/lib/widget/dialogs/favorite_delete_dialog.dart new file mode 100644 index 0000000..9291b4f --- /dev/null +++ b/app/lib/widget/dialogs/favorite_delete_dialog.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/persistence/favorite_device.dart'; +import 'package:routerino/routerino.dart'; + +class FavoriteDeleteDialog extends StatelessWidget { + final FavoriteDevice favorite; + + const FavoriteDeleteDialog(this.favorite); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.dialogs.favoriteDeleteDialog.title), + content: Text(t.dialogs.favoriteDeleteDialog.content(name: favorite.alias)), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.cancel), + ), + FilledButton( + onPressed: () => context.pop(true), + child: Text(t.general.delete), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/favorite_dialog.dart b/app/lib/widget/dialogs/favorite_dialog.dart new file mode 100644 index 0000000..4b8b79a --- /dev/null +++ b/app/lib/widget/dialogs/favorite_dialog.dart @@ -0,0 +1,142 @@ +import 'package:common/model/device.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/persistence/favorite_device.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/provider/favorites_provider.dart'; +import 'package:localsend_app/provider/http_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/rust/api/model.dart'; +import 'package:localsend_app/util/rust.dart'; +import 'package:localsend_app/widget/dialogs/error_dialog.dart'; +import 'package:localsend_app/widget/dialogs/favorite_edit_dialog.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +/// A dialog showing a list of favorites +class FavoritesDialog extends StatefulWidget { + const FavoritesDialog(); + + @override + State createState() => _FavoritesDialogState(); +} + +class _FavoritesDialogState extends State with Refena { + bool _fetching = false; + String? _error; + + /// Checks if the device is reachable and pops the dialog with the result if it is. + Future _checkConnectionToDevice(FavoriteDevice favorite) async { + setState(() { + _fetching = true; + }); + + final https = ref.read(settingsProvider).https; + + try { + final payload = ref.read(deviceFullInfoProvider).toRegisterDto(); + final response = await ref + .read(httpProvider) + .v2 + .register( + protocol: https ? ProtocolType.https : ProtocolType.http, + ip: favorite.ip, + port: favorite.port, + payload: payload, + ); + + final device = response.body.toDevice(favorite.ip, favorite.port, https, HttpDiscovery(ip: favorite.ip)); + + if (mounted) { + context.pop(device); + } + } catch (e) { + setState(() { + _fetching = false; + _error = e.toString(); + }); + } + } + + Future _showDeviceDialog([FavoriteDevice? favorite]) async { + await showDialog( + context: context, + builder: (_) => FavoriteEditDialog(favorite: favorite), + ); + } + + @override + Widget build(BuildContext context) { + final favorites = ref.watch(favoritesProvider); + + return AlertDialog( + title: Text(t.dialogs.favoriteDialog.title), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (favorites.isEmpty) + Text( + t.dialogs.favoriteDialog.noFavorites, + style: const TextStyle(color: Colors.grey), + ), + for (final favorite in favorites) + Row( + children: [ + Expanded( + child: TextButton( + style: TextButton.styleFrom(foregroundColor: Theme.of(context).colorScheme.onSurface), + onPressed: _fetching ? null : () async => await _checkConnectionToDevice(favorite), + child: Align( + alignment: Alignment.centerLeft, + child: Text('${favorite.alias}\n(${favorite.ip})'), + ), + ), + ), + TextButton( + style: TextButton.styleFrom(foregroundColor: Theme.of(context).colorScheme.onSurface), + onPressed: _fetching ? null : () async => await _showDeviceDialog(favorite), + child: const Icon(Icons.edit), + ), + ], + ), + if (_error != null) + Padding( + padding: const EdgeInsets.only(top: 10), + child: Row( + children: [ + Text(t.general.error, style: TextStyle(color: Theme.of(context).colorScheme.warning)), + if (_error != null) ...[ + const SizedBox(width: 5), + InkWell( + onTap: () async { + await showDialog( + context: context, + builder: (_) => ErrorDialog(error: _error!), + ); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 5), + child: Icon(Icons.info, color: Theme.of(context).colorScheme.warning, size: 20), + ), + ), + ], + ], + ), + ), + ], + ), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.cancel), + ), + FilledButton( + onPressed: _showDeviceDialog, + child: Text(t.dialogs.favoriteDialog.addFavorite), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/favorite_edit_dialog.dart b/app/lib/widget/dialogs/favorite_edit_dialog.dart new file mode 100644 index 0000000..f303970 --- /dev/null +++ b/app/lib/widget/dialogs/favorite_edit_dialog.dart @@ -0,0 +1,233 @@ +import 'package:common/model/device.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/persistence/favorite_device.dart'; +import 'package:localsend_app/provider/device_info_provider.dart'; +import 'package:localsend_app/provider/favorites_provider.dart'; +import 'package:localsend_app/provider/http_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/rust/api/model.dart'; +import 'package:localsend_app/util/rust.dart'; +import 'package:localsend_app/widget/dialogs/error_dialog.dart'; +import 'package:localsend_app/widget/dialogs/favorite_delete_dialog.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +/// A dialog to add or edit a favorite device. +class FavoriteEditDialog extends StatefulWidget { + final FavoriteDevice? favorite; + final Device? prefilledDevice; + + const FavoriteEditDialog({ + this.favorite, + this.prefilledDevice, + }); + + @override + State createState() => _FavoriteEditDialogState(); +} + +class _FavoriteEditDialogState extends State with Refena { + final _ipController = TextEditingController(); + final _portController = TextEditingController(); + final _aliasController = TextEditingController(); + bool _fetching = false; + String? _error; + + @override + void initState() { + super.initState(); + + _ipController.text = widget.prefilledDevice?.ip ?? widget.favorite?.ip ?? ''; + _aliasController.text = widget.prefilledDevice?.alias ?? widget.favorite?.alias ?? ''; + + ensureRef((ref) { + _portController.text = + widget.prefilledDevice?.port.toString() ?? widget.favorite?.port.toString() ?? ref.read(settingsProvider).port.toString(); + }); + } + + @override + void dispose() { + _ipController.dispose(); + _portController.dispose(); + _aliasController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(widget.favorite != null ? t.dialogs.favoriteEditDialog.titleEdit : t.dialogs.favoriteEditDialog.titleAdd), + content: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(t.dialogs.favoriteEditDialog.name), + const SizedBox(height: 5), + TextFormField( + controller: _aliasController, + decoration: InputDecoration( + hintText: t.dialogs.favoriteEditDialog.auto, + ), + enabled: !_fetching, + ), + const SizedBox(height: 16), + Text(t.dialogs.favoriteEditDialog.ip), + const SizedBox(height: 5), + TextFormField( + controller: _ipController, + autofocus: widget.favorite == null && widget.prefilledDevice == null, + enabled: !_fetching, + ), + const SizedBox(height: 16), + Text(t.dialogs.favoriteEditDialog.port), + const SizedBox(height: 5), + TextFormField( + controller: _portController, + enabled: !_fetching, + keyboardType: TextInputType.number, + ), + if (widget.favorite != null) ...[ + const SizedBox(height: 16), + TextButton.icon( + style: TextButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.warning, + ), + onPressed: () async { + final result = await showDialog( + context: context, + builder: (_) => FavoriteDeleteDialog(widget.favorite!), + ); + + if (context.mounted && result == true) { + await context.ref.redux(favoritesProvider).dispatchAsync(RemoveFavoriteAction(deviceFingerprint: widget.favorite!.fingerprint)); + if (context.mounted) { + context.pop(); + } + } + }, + icon: const Icon(Icons.delete), + label: Text(t.general.delete), + ), + ], + if (_error != null) + Padding( + padding: const EdgeInsets.only(top: 10), + child: Row( + children: [ + Text(t.general.error, style: TextStyle(color: Theme.of(context).colorScheme.warning)), + if (_error != null) ...[ + const SizedBox(width: 5), + InkWell( + onTap: () async { + await showDialog( + context: context, + builder: (_) => ErrorDialog(error: _error!), + ); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 5), + child: Icon(Icons.info, color: Theme.of(context).colorScheme.warning, size: 20), + ), + ), + ], + ], + ), + ), + ], + ), + ), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.cancel), + ), + FilledButton( + onPressed: _fetching + ? null + : () async { + if (_ipController.text.isEmpty) { + return; + } + + if (_portController.text.isEmpty) { + return; + } + + if (widget.favorite != null) { + // Update existing favorite + final existingFavorite = widget.favorite!; + final trimmedNewAlias = _aliasController.text.trim(); + if (trimmedNewAlias.isEmpty) { + return; + } + + await ref + .redux(favoritesProvider) + .dispatchAsync( + UpdateFavoriteAction( + existingFavorite.copyWith( + ip: _ipController.text, + port: int.parse(_portController.text), + alias: trimmedNewAlias, + customAlias: existingFavorite.customAlias || trimmedNewAlias != existingFavorite.alias, + ), + ), + ); + } else { + // Add new favorite + final ip = _ipController.text; + final port = int.parse(_portController.text); + final https = ref.read(settingsProvider).https; + setState(() { + _fetching = true; + }); + + try { + final payload = ref.read(deviceFullInfoProvider).toRegisterDto(); + final response = await ref + .read(httpProvider) + .v2 + .register( + protocol: https ? ProtocolType.https : ProtocolType.http, + ip: ip, + port: port, + payload: payload, + ); + + final name = _aliasController.text.trim(); + + await ref + .redux(favoritesProvider) + .dispatchAsync( + AddFavoriteAction( + FavoriteDevice.fromValues( + fingerprint: response.body.token, + ip: _ipController.text, + port: int.parse(_portController.text), + alias: name.isEmpty ? response.body.alias : name, + ), + ), + ); + + if (context.mounted) { + context.pop(); + } + } catch (e) { + setState(() { + _fetching = false; + _error = e.toString(); + }); + } + } + }, + child: Text(t.general.confirm), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/file_info_dialog.dart b/app/lib/widget/dialogs/file_info_dialog.dart new file mode 100644 index 0000000..8a085d5 --- /dev/null +++ b/app/lib/widget/dialogs/file_info_dialog.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/persistence/receive_history_entry.dart'; +import 'package:localsend_app/util/file_size_helper.dart'; +import 'package:routerino/routerino.dart'; + +class FileInfoDialog extends StatelessWidget { + final ReceiveHistoryEntry entry; + + const FileInfoDialog({required this.entry, super.key}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.dialogs.fileInfo.title), + content: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Table( + columnWidths: const { + 0: IntrinsicColumnWidth(), + 1: IntrinsicColumnWidth(), + 2: IntrinsicColumnWidth(), + }, + children: [ + if (!entry.isMessage) ...[ + TableRow( + children: [ + Text(t.dialogs.fileInfo.fileName, maxLines: 1), + const SizedBox(width: 10), + SelectableText(entry.fileName), + ], + ), + TableRow( + children: [ + Text(t.dialogs.fileInfo.path), + const SizedBox(width: 10), + SelectableText(entry.savedToGallery ? t.progressPage.savedToGallery : (entry.path ?? '')), + ], + ), + ], + TableRow( + children: [ + Text(t.dialogs.fileInfo.size), + const SizedBox(width: 10), + SelectableText(entry.fileSize.asReadableFileSize), + ], + ), + TableRow( + children: [ + Text(t.dialogs.fileInfo.sender), + const SizedBox(width: 10), + SelectableText(entry.senderAlias), + ], + ), + TableRow( + children: [ + Text(t.dialogs.fileInfo.time), + const SizedBox(width: 10), + SelectableText(entry.timestampString), + ], + ), + ], + ), + if (entry.isMessage) + Padding( + padding: const EdgeInsets.only(top: 10), + child: SelectableText(entry.fileName), + ), + ], + ), + ), + ), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.close), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/file_name_input_dialog.dart b/app/lib/widget/dialogs/file_name_input_dialog.dart new file mode 100644 index 0000000..7a12a1d --- /dev/null +++ b/app/lib/widget/dialogs/file_name_input_dialog.dart @@ -0,0 +1,117 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:legalize/legalize.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/util/file_path_helper.dart'; +import 'package:routerino/routerino.dart'; + +class FileNameInputDialog extends StatefulWidget { + final String originalName; + final String initialName; + + const FileNameInputDialog({ + required this.originalName, + required this.initialName, + }); + + @override + State createState() => _FileNameInputDialogState(); +} + +class _FileNameInputDialogState extends State { + final _textController = TextEditingController(); + String _errorMessage = ''; + + @override + void initState() { + super.initState(); + _textController.text = widget.initialName; + } + + bool _validate(String input) { + if (_textController.text.isEmpty) { + setState(() { + _errorMessage = t.sanitization.empty; + }); + return false; + } + + if (!isValidFilename(input, os: Platform.operatingSystem)) { + setState(() { + _errorMessage = t.sanitization.invalid; + }); + return false; + } + + if (_errorMessage.isNotEmpty) { + setState(() { + _errorMessage = ''; + }); + } + + return true; + } + + void _submit() { + if (mounted) { + String input = _textController.text.trim(); + + if (!_validate(_textController.text)) { + return; + } + + if (!input.contains('.') && widget.originalName.contains('.')) { + // user forgot extension, we fix it + input = input.withExtension(widget.originalName.extension); + } + context.pop(input); + } + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.dialogs.fileNameInput.title), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(t.dialogs.fileNameInput.original(original: widget.originalName)), + const SizedBox(height: 10), + TextFormField( + controller: _textController, + autofocus: true, + onChanged: (value) => _validate(value.trim()), + onFieldSubmitted: (_) => _submit, + ), + const SizedBox(height: 5), + Visibility( + visible: _errorMessage.isNotEmpty, + child: Text( + _errorMessage, + style: TextStyle( + color: Theme.of(context).colorScheme.warning, + ), + ), + ), + ], + ), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.cancel), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of(context).colorScheme.onPrimary, + ), + onPressed: _submit, + child: Text(t.general.confirm), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/history_clear_dialog.dart b/app/lib/widget/dialogs/history_clear_dialog.dart new file mode 100644 index 0000000..bb9b8cc --- /dev/null +++ b/app/lib/widget/dialogs/history_clear_dialog.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:routerino/routerino.dart'; + +class HistoryClearDialog extends StatelessWidget { + const HistoryClearDialog({super.key}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.dialogs.historyClearDialog.title), + content: Text(t.dialogs.historyClearDialog.content), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.cancel), + ), + FilledButton( + onPressed: () => context.pop(true), + child: Text(t.general.delete), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/ios_network_permission_dialog.dart b/app/lib/widget/dialogs/ios_network_permission_dialog.dart new file mode 100644 index 0000000..1b33cde --- /dev/null +++ b/app/lib/widget/dialogs/ios_network_permission_dialog.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/widget/dialogs/custom_bottom_sheet.dart'; +import 'package:routerino/routerino.dart'; +import 'package:system_settings_2/system_settings_2.dart'; + +class IosLocalNetworkDialog extends StatelessWidget { + const IosLocalNetworkDialog({super.key}); + + @override + Widget build(BuildContext context) { + return CustomBottomSheet( + title: t.dialogs.localNetworkUnauthorized.title, + description: t.dialogs.localNetworkUnauthorized.description, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.close), + ), + ElevatedButton.icon( + onPressed: () async => SystemSettings.app(), + icon: const Icon(Icons.settings), + label: Text(t.dialogs.localNetworkUnauthorized.gotoSettings), + ), + ], + ), + ); + } +} diff --git a/app/lib/widget/dialogs/loading_dialog.dart b/app/lib/widget/dialogs/loading_dialog.dart new file mode 100644 index 0000000..b8ef3c1 --- /dev/null +++ b/app/lib/widget/dialogs/loading_dialog.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class LoadingDialog extends StatelessWidget { + const LoadingDialog(); + + @override + Widget build(BuildContext context) { + return const PopScope( + canPop: false, + child: Center( + child: CircularProgressIndicator(), + ), + ); + } +} diff --git a/app/lib/widget/dialogs/message_input_dialog.dart b/app/lib/widget/dialogs/message_input_dialog.dart new file mode 100644 index 0000000..f1d89fc --- /dev/null +++ b/app/lib/widget/dialogs/message_input_dialog.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:routerino/routerino.dart'; + +class MessageInputDialog extends StatefulWidget { + final String? initialText; + + const MessageInputDialog({this.initialText}); + + @override + State createState() => _MessageInputDialogState(); +} + +class _MessageInputDialogState extends State { + final _textController = TextEditingController(); + + @override + void initState() { + super.initState(); + _textController.text = widget.initialText ?? ''; + } + + @override + void dispose() { + _textController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.dialogs.messageInput.title), + content: TextFormField( + controller: _textController, + keyboardType: TextInputType.multiline, + maxLines: null, + autofocus: true, + ), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.cancel), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of(context).colorScheme.onPrimary, + ), + onPressed: () => context.pop(_textController.text), + child: Text(t.general.confirm), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/no_files_dialog.dart b/app/lib/widget/dialogs/no_files_dialog.dart new file mode 100644 index 0000000..dd20ca2 --- /dev/null +++ b/app/lib/widget/dialogs/no_files_dialog.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/widget/dialogs/custom_bottom_sheet.dart'; +import 'package:routerino/routerino.dart'; + +class NoFilesDialog extends StatelessWidget { + const NoFilesDialog({super.key}); + + @override + Widget build(BuildContext context) { + return CustomBottomSheet( + title: t.dialogs.noFiles.title, + description: t.dialogs.noFiles.content, + child: Center( + child: FilledButton( + onPressed: () => context.popUntilRoot(), + child: Text(t.general.close), + ), + ), + ); + } +} diff --git a/app/lib/widget/dialogs/no_permission_dialog.dart b/app/lib/widget/dialogs/no_permission_dialog.dart new file mode 100644 index 0000000..39c0e50 --- /dev/null +++ b/app/lib/widget/dialogs/no_permission_dialog.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:routerino/routerino.dart'; + +class NoPermissionDialog extends StatelessWidget { + const NoPermissionDialog({super.key}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.dialogs.noPermission.title), + content: Text(t.dialogs.noPermission.content), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.close), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/not_available_on_platform_dialog.dart b/app/lib/widget/dialogs/not_available_on_platform_dialog.dart new file mode 100644 index 0000000..cf0202f --- /dev/null +++ b/app/lib/widget/dialogs/not_available_on_platform_dialog.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/util/platform_strings.dart'; +import 'package:routerino/routerino.dart'; + +class NotAvailableOnPlatformDialog extends StatelessWidget { + final List platforms; + + const NotAvailableOnPlatformDialog({required this.platforms}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.dialogs.notAvailableOnPlatform.title), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(t.dialogs.notAvailableOnPlatform.content), + const SizedBox(height: 10), + ...platforms.map((p) { + return Text('- ${p.humanName}'); + }), + ], + ), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.close), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/open_file_dialog.dart b/app/lib/widget/dialogs/open_file_dialog.dart new file mode 100644 index 0000000..07768d7 --- /dev/null +++ b/app/lib/widget/dialogs/open_file_dialog.dart @@ -0,0 +1,108 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:common/model/file_type.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/util/native/channel/android_channel.dart' as android_channel; +import 'package:localsend_app/util/native/open_file.dart'; +import 'package:localsend_app/util/native/open_folder.dart'; +import 'package:path/path.dart' as path; +import 'package:routerino/routerino.dart'; + +class OpenFileDialog extends StatefulWidget { + final String filePath; + final FileType fileType; + final bool openGallery; + + const OpenFileDialog({ + super.key, + required this.filePath, + required this.fileType, + required this.openGallery, + }); + + static Future open( + BuildContext context, { + required String filePath, + required FileType fileType, + required bool openGallery, + }) async { + await showDialog( + context: context, + builder: (context) => OpenFileDialog( + filePath: filePath, + fileType: fileType, + openGallery: openGallery, + ), + ); + } + + @override + State createState() => _OpenFileDialogState(); +} + +class _OpenFileDialogState extends State { + late Timer _timer; + int _countdown = 5; // Starting countdown value + + @override + void dispose() { + _timer.cancel(); + super.dispose(); + } + + @override + void initState() { + super.initState(); + + _timer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (_countdown > 1) { + setState(() { + _countdown--; + }); + } else { + timer.cancel(); + if (context.mounted) { + context.pop(); // Automatically close the dialog + } + } + }); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.dialogs.openFile.title), + content: Text(t.dialogs.openFile.content), + actions: [ + TextButton( + onPressed: () async { + if (widget.openGallery && defaultTargetPlatform == TargetPlatform.android) { + await android_channel.openGallery(); + } else { + await openFile(context, widget.fileType, widget.filePath); + } + }, + child: Text(t.general.open), + ), + if (!widget.openGallery) + TextButton( + onPressed: () async => await openFolder( + folderPath: File(widget.filePath).parent.path, + fileName: path.basename(widget.filePath), + ), + child: Text(t.receiveHistoryPage.entryActions.showInFolder), + ), + TextButton( + onPressed: () { + _timer.cancel(); + context.pop(); + }, + child: Text('${t.general.close} ($_countdown)'), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/pin_dialog.dart b/app/lib/widget/dialogs/pin_dialog.dart new file mode 100644 index 0000000..a0787f9 --- /dev/null +++ b/app/lib/widget/dialogs/pin_dialog.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:nanoid2/nanoid2.dart'; +import 'package:routerino/routerino.dart'; + +class PinDialog extends StatefulWidget { + final String? pin; + final bool showInvalidPin; + final bool obscureText; + final bool generateRandom; + + const PinDialog({ + this.pin, + required this.obscureText, + this.showInvalidPin = false, + this.generateRandom = false, + super.key, + }); + + @override + State createState() => _PinDialogState(); +} + +class _PinDialogState extends State { + final _textController = TextEditingController(); + + @override + void initState() { + super.initState(); + _textController.text = widget.pin ?? (widget.generateRandom ? nanoid(alphabet: Alphabet.noDoppelganger, length: 6) : ''); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.dialogs.pin.title), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextFormField( + controller: _textController, + autofocus: true, + obscureText: widget.obscureText, + onFieldSubmitted: (value) => context.pop(value), + ), + if (widget.showInvalidPin) + Padding( + padding: const EdgeInsets.only(top: 8), + child: Text( + t.web.invalidPin, + style: TextStyle(color: Theme.of(context).colorScheme.warning), + ), + ), + ], + ), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.cancel), + ), + FilledButton( + onPressed: () => context.pop(_textController.text), + child: Text(t.general.confirm), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/qr_dialog.dart b/app/lib/widget/dialogs/qr_dialog.dart new file mode 100644 index 0000000..4db3dab --- /dev/null +++ b/app/lib/widget/dialogs/qr_dialog.dart @@ -0,0 +1,96 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/state/send/web/web_send_state.dart'; +import 'package:localsend_app/provider/network/server/server_provider.dart'; +import 'package:pretty_qr_code/pretty_qr_code.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +class QrDialog extends StatelessWidget { + final String data; + final String? label; + final bool listenIncomingWebSendRequests; + final String? pin; + + const QrDialog({ + required this.data, + this.label, + this.listenIncomingWebSendRequests = false, + this.pin, + }); + + @override + Widget build(BuildContext context) { + final WebSendState? webSendState; + if (listenIncomingWebSendRequests) { + webSendState = context.ref.watch(serverProvider.select((s) => s?.webSendState)); + } else { + webSendState = null; + } + + return AlertDialog( + title: Text(t.dialogs.qr.title), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + width: 200, + height: 200, + child: PrettyQrView.data( + errorCorrectLevel: QrErrorCorrectLevel.Q, + data: data, + decoration: PrettyQrDecoration( + shape: PrettyQrSmoothSymbol( + roundFactor: 0, + color: Theme.of(context).colorScheme.onSurface, + ), + ), + ), + ), + ), + const SizedBox(height: 10), + Text(label ?? data, textAlign: TextAlign.center), + if (listenIncomingWebSendRequests && webSendState != null) + Builder( + builder: (context) { + final pending = webSendState?.sessions.values.fold(0, (prev, curr) => prev + (curr.responseHandler != null ? 1 : 0)) ?? 0; + if (pending != 0) { + return Padding( + padding: const EdgeInsets.only(top: 5), + child: Text( + t.webSharePage.pendingRequests(n: pending), + style: TextStyle(color: Theme.of(context).colorScheme.warning), + textAlign: TextAlign.center, + ), + ); + } else { + return Container(); + } + }, + ), + if (pin != null) + Padding( + padding: const EdgeInsets.only(top: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.vpn_key), + const SizedBox(width: 5), + Text(pin!), + ], + ), + ), + ], + ), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.close), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/quick_actions_dialog.dart b/app/lib/widget/dialogs/quick_actions_dialog.dart new file mode 100644 index 0000000..f95fb53 --- /dev/null +++ b/app/lib/widget/dialogs/quick_actions_dialog.dart @@ -0,0 +1,176 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:legalize/legalize.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/provider/selection/selected_receiving_files_provider.dart'; +import 'package:localsend_app/widget/labeled_checkbox.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; +import 'package:uuid/uuid.dart'; + +enum _QuickAction { + counter, + random; + + String get label { + switch (this) { + case _QuickAction.counter: + return t.dialogs.quickActions.counter; + case _QuickAction.random: + return t.dialogs.quickActions.random; + } + } +} + +class QuickActionsDialog extends StatefulWidget { + const QuickActionsDialog({super.key}); + + @override + State createState() => _QuickActionsDialogState(); +} + +class _QuickActionsDialogState extends State with Refena { + _QuickAction _action = _QuickAction.counter; + + // counter + String _prefix = ''; + bool _padZero = false; + bool _sortBeforehand = false; + + // random + final _randomUuid = const Uuid().v4(); + + // sanity check + bool _isValid = true; + + bool _validate(String input) { + if (!isValidFilename(input, os: Platform.operatingSystem) && input.isNotEmpty) { + setState(() { + _isValid = false; + }); + return false; + } + + if (!_isValid) { + setState(() { + _isValid = true; + }); + } + + return true; + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.dialogs.quickActions.title), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ToggleButtons( + isSelected: [_action == _QuickAction.counter, _action == _QuickAction.random], + onPressed: (int index) { + setState(() { + if (index == 0) { + _action = _QuickAction.counter; + } else { + _action = _QuickAction.random; + } + }); + }, + borderRadius: BorderRadius.circular(10), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + constraints: const BoxConstraints(minWidth: 0, minHeight: 0), + children: _QuickAction.values.map((mode) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + child: Text(mode.label), + ); + }).toList(), + ), + const SizedBox(height: 10), + if (_action == _QuickAction.counter) ...[ + Text(t.dialogs.quickActions.prefix), + const SizedBox(height: 5), + TextField( + autofocus: true, + onChanged: (s) { + _validate(s); + setState(() { + _prefix = s; + }); + }, + ), + const SizedBox(height: 5), + Visibility( + visible: !_isValid, + child: Text( + t.sanitization.invalid, + style: TextStyle(color: Theme.of(context).colorScheme.warning), + ), + ), + const SizedBox(height: 10), + LabeledCheckbox( + label: t.dialogs.quickActions.padZero, + value: _padZero, + onChanged: (b) { + setState(() { + _padZero = b == true; + }); + }, + ), + const SizedBox(height: 5), + LabeledCheckbox( + label: t.dialogs.quickActions.sortBeforeCount, + value: _sortBeforehand, + onChanged: (b) { + setState(() { + _sortBeforehand = b == true; + }); + }, + ), + const SizedBox(height: 10), + if (_padZero) Text('${t.general.example}: ${_prefix}04.jpg') else Text('${t.general.example}: ${_prefix}4.jpg'), + ], + if (_action == _QuickAction.random) Text('${t.general.example}: $_randomUuid.jpg'), + ], + ), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.cancel), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of(context).colorScheme.onPrimary, + ), + onPressed: () { + switch (_action) { + case _QuickAction.counter: + if (!_isValid) { + return; + } + ref + .notifier(selectedReceivingFilesProvider) + .applyCounter( + prefix: _prefix, + padZero: _padZero, + sortFirst: _sortBeforehand, + ); + break; + case _QuickAction.random: + ref.notifier(selectedReceivingFilesProvider).applyRandom(); + break; + } + context.pop(); + }, + child: Text(t.general.confirm), + ), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/quick_save_from_favorites_notice.dart b/app/lib/widget/dialogs/quick_save_from_favorites_notice.dart new file mode 100644 index 0000000..e3e91e0 --- /dev/null +++ b/app/lib/widget/dialogs/quick_save_from_favorites_notice.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/dialogs/custom_bottom_sheet.dart'; +import 'package:routerino/routerino.dart'; + +class QuickSaveFromFavoritesNotice extends StatelessWidget { + const QuickSaveFromFavoritesNotice({super.key}); + + static Future open(BuildContext context) async { + if (checkPlatformIsDesktop()) { + await showDialog( + context: context, + builder: (_) => AlertDialog( + title: Text(t.dialogs.quickSaveFromFavoritesNotice.title), + content: Text(t.dialogs.quickSaveFromFavoritesNotice.content.join('\n')), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.close), + ), + ], + ), + ); + } else { + await context.pushBottomSheet(() => const QuickSaveFromFavoritesNotice()); + } + } + + @override + Widget build(BuildContext context) { + return CustomBottomSheet( + title: t.dialogs.quickSaveFromFavoritesNotice.title, + description: t.dialogs.quickSaveFromFavoritesNotice.content.join('\n'), + child: Center( + child: ElevatedButton( + onPressed: () => context.popUntilRoot(), + child: Text(t.general.close), + ), + ), + ); + } +} diff --git a/app/lib/widget/dialogs/quick_save_notice.dart b/app/lib/widget/dialogs/quick_save_notice.dart new file mode 100644 index 0000000..829a54f --- /dev/null +++ b/app/lib/widget/dialogs/quick_save_notice.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/dialogs/custom_bottom_sheet.dart'; +import 'package:routerino/routerino.dart'; + +class QuickSaveNotice extends StatelessWidget { + const QuickSaveNotice({super.key}); + + static Future open(BuildContext context) async { + if (checkPlatformIsDesktop()) { + await showDialog( + context: context, + builder: (_) => AlertDialog( + title: Text(t.dialogs.quickSaveNotice.title), + content: Text(t.dialogs.quickSaveNotice.content), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.close), + ), + ], + ), + ); + } else { + await context.pushBottomSheet(() => const QuickSaveNotice()); + } + } + + @override + Widget build(BuildContext context) { + return CustomBottomSheet( + title: t.dialogs.quickSaveNotice.title, + description: t.dialogs.quickSaveNotice.content, + child: Center( + child: ElevatedButton( + onPressed: () => context.popUntilRoot(), + child: Text(t.general.close), + ), + ), + ); + } +} diff --git a/app/lib/widget/dialogs/send_mode_help_dialog.dart b/app/lib/widget/dialogs/send_mode_help_dialog.dart new file mode 100644 index 0000000..78c7f13 --- /dev/null +++ b/app/lib/widget/dialogs/send_mode_help_dialog.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:routerino/routerino.dart'; + +class SendModeHelpDialog extends StatelessWidget { + const SendModeHelpDialog(); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(t.dialogs.sendModeHelp.title), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _SendModeItem( + mode: t.sendTab.sendModes.single, + explanation: t.dialogs.sendModeHelp.single, + ), + const SizedBox(height: 10), + _SendModeItem( + mode: t.sendTab.sendModes.multiple, + explanation: t.dialogs.sendModeHelp.multiple, + ), + const SizedBox(height: 10), + _SendModeItem( + mode: t.sendTab.sendModes.link, + explanation: t.dialogs.sendModeHelp.link, + ), + ], + ), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.close), + ), + ], + ); + } +} + +class _SendModeItem extends StatelessWidget { + final String mode; + final String explanation; + const _SendModeItem({ + required this.mode, + required this.explanation, + }); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(mode, style: const TextStyle(fontWeight: FontWeight.bold)), + Text(explanation), + ], + ); + } +} diff --git a/app/lib/widget/dialogs/text_field_tv.dart b/app/lib/widget/dialogs/text_field_tv.dart new file mode 100644 index 0000000..7c14ab3 --- /dev/null +++ b/app/lib/widget/dialogs/text_field_tv.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/provider/tv_provider.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +/// A normal [TextFormField] on mobile and desktop. +/// A button which opens a dialog on Android TV +class TextFieldTv extends StatefulWidget { + final String name; + final TextEditingController controller; + final ValueChanged? onChanged; + final VoidCallback? onDelete; + + const TextFieldTv({ + required this.name, + required this.controller, + this.onChanged, + this.onDelete, + }); + + @override + State createState() => _TextFieldTvState(); +} + +class _TextFieldTvState extends State with Refena { + @override + Widget build(BuildContext context) { + final isTv = ref.watch(tvProvider); + + if (isTv) { + return TextButton( + style: TextButton.styleFrom( + backgroundColor: Theme.of(context).inputDecorationTheme.fillColor, + shape: RoundedRectangleBorder(borderRadius: Theme.of(context).inputDecorationTheme.borderRadius), + foregroundColor: Theme.of(context).colorScheme.onSurface, + ), + onPressed: () async { + await showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(widget.name), + content: TextFormField( + controller: widget.controller, + textAlign: TextAlign.center, + onChanged: widget.onChanged, + autofocus: true, + onFieldSubmitted: (_) => context.pop(), + ), + actions: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of(context).colorScheme.onPrimary, + ), + onPressed: () => context.pop(), + child: Text(t.general.confirm), + ), + ], + ); + }, + ); + }, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 5), + child: Text(widget.controller.text, style: Theme.of(context).textTheme.titleMedium), + ), + ); + } else { + return TextFormField( + controller: widget.controller, + textAlign: TextAlign.center, + onChanged: widget.onChanged, + decoration: InputDecoration( + suffixIcon: widget.onDelete != null + ? IconButton( + icon: Icon(Icons.clear), + onPressed: () { + widget.onDelete?.call(); + }, + ) + : null, + ), + ); + } + } +} diff --git a/app/lib/widget/dialogs/text_field_with_actions.dart b/app/lib/widget/dialogs/text_field_with_actions.dart new file mode 100644 index 0000000..7804e66 --- /dev/null +++ b/app/lib/widget/dialogs/text_field_with_actions.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:routerino/routerino.dart'; + +/// A [AlertDialog] on all devices. +/// The button opens a dialog box with actions. +class TextFieldWithActions extends StatefulWidget { + final String name; + final TextEditingController controller; + final ValueChanged onChanged; + final List actions; + + const TextFieldWithActions({ + required this.name, + required this.controller, + required this.onChanged, + required this.actions, + }); + + @override + State createState() => _TextFieldWithActionsState(); +} + +class _TextFieldWithActionsState extends State { + @override + Widget build(BuildContext context) { + return TextButton( + style: TextButton.styleFrom( + backgroundColor: Theme.of(context).inputDecorationTheme.fillColor, + shape: RoundedRectangleBorder(borderRadius: Theme.of(context).inputDecorationTheme.borderRadius), + foregroundColor: Theme.of(context).colorScheme.onSurface, + ), + onPressed: () async { + await showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(widget.name), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // Display actions inside the dialog + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: widget.actions, + ), + const SizedBox(height: 10), + TextFormField( + controller: widget.controller, + textAlign: TextAlign.center, + onChanged: widget.onChanged, + autofocus: true, + onFieldSubmitted: (_) => context.pop(), + ), + ], + ), + actions: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of(context).colorScheme.onPrimary, + ), + onPressed: () => context.pop(), + child: Text(t.general.confirm), + ), + ], + ); + }, + ); + }, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 5), + child: Text( + widget.controller.text, + style: Theme.of(context).textTheme.titleMedium, + overflow: TextOverflow.ellipsis, + ), + ), + ); + } +} diff --git a/app/lib/widget/dialogs/zoom_dialog.dart b/app/lib/widget/dialogs/zoom_dialog.dart new file mode 100644 index 0000000..22496bf --- /dev/null +++ b/app/lib/widget/dialogs/zoom_dialog.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:localsend_app/model/state/send/web/web_send_state.dart'; +import 'package:localsend_app/provider/network/server/server_provider.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +class ZoomDialog extends StatelessWidget { + final String label; + final bool listenIncomingWebSendRequests; + final String? pin; + + const ZoomDialog({ + required this.label, + this.listenIncomingWebSendRequests = false, + this.pin, + }); + + @override + Widget build(BuildContext context) { + final width = MediaQuery.of(context).size.width * .80; + final fontSize = width / 400 * 48; + + final WebSendState? webSendState; + if (listenIncomingWebSendRequests) { + webSendState = context.ref.watch(serverProvider.select((s) => s?.webSendState)); + } else { + webSendState = null; + } + + return AlertDialog( + title: Text(t.dialogs.zoom.title), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: FittedBox( + fit: BoxFit.fill, + clipBehavior: Clip.antiAlias, + child: Text( + label, + textAlign: TextAlign.center, + style: TextStyle(fontSize: fontSize), + ), + ), + ), + const SizedBox(height: 10), + if (pin != null) + Padding( + padding: const EdgeInsets.all(8.0), + child: FittedBox( + fit: BoxFit.fill, + clipBehavior: Clip.antiAlias, + child: Text('🔑 $pin', textAlign: TextAlign.center, style: const TextStyle(fontSize: 100)), + ), + ), + if (listenIncomingWebSendRequests && webSendState != null) + Builder( + builder: (context) { + final pending = webSendState?.sessions.values.fold(0, (prev, curr) => prev + (curr.responseHandler != null ? 1 : 0)) ?? 0; + if (pending != 0) { + return Padding( + padding: const EdgeInsets.only(top: 5), + child: Text( + t.webSharePage.pendingRequests(n: pending), + style: TextStyle(color: Theme.of(context).colorScheme.warning), + textAlign: TextAlign.center, + ), + ); + } else { + return Container(); + } + }, + ), + ], + ), + actions: [ + TextButton( + onPressed: () => context.pop(), + child: Text(t.general.close), + ), + ], + ); + } +} diff --git a/app/lib/widget/file_thumbnail.dart b/app/lib/widget/file_thumbnail.dart new file mode 100644 index 0000000..f8a4d50 --- /dev/null +++ b/app/lib/widget/file_thumbnail.dart @@ -0,0 +1,222 @@ +import 'dart:io'; +import 'dart:ui'; + +import 'package:common/model/file_type.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/model/cross_file.dart'; +import 'package:localsend_app/util/file_type_ext.dart'; +import 'package:uri_content/uri_content.dart'; +import 'package:wechat_assets_picker/wechat_assets_picker.dart'; + +const double defaultThumbnailSize = 50; + +class SmartFileThumbnail extends StatelessWidget { + final Uint8List? bytes; + final AssetEntity? asset; + final String? path; + final FileType fileType; + + const SmartFileThumbnail({ + required this.bytes, + required this.asset, + required this.path, + required this.fileType, + }); + + factory SmartFileThumbnail.fromCrossFile(CrossFile file) { + return SmartFileThumbnail( + bytes: file.thumbnail, + asset: file.asset, + path: file.path, + fileType: file.fileType, + ); + } + + @override + Widget build(BuildContext context) { + if (bytes != null) { + return MemoryThumbnail( + bytes: bytes, + fileType: fileType, + ); + } else if (asset != null) { + return AssetThumbnail( + asset: asset!, + fileType: fileType, + ); + } else { + return FilePathThumbnail( + path: path, + fileType: fileType, + ); + } + } +} + +class AssetThumbnail extends StatelessWidget { + final AssetEntity asset; + final FileType fileType; + + const AssetThumbnail({ + required this.asset, + required this.fileType, + }); + + @override + Widget build(BuildContext context) { + return _Thumbnail( + thumbnail: AssetEntityImage( + asset, + isOriginal: false, + thumbnailSize: const ThumbnailSize.square(64), + thumbnailFormat: ThumbnailFormat.jpeg, + ), + icon: fileType.icon, + ); + } +} + +class FilePathThumbnail extends StatelessWidget { + final String? path; + final FileType fileType; + + const FilePathThumbnail({ + required this.path, + required this.fileType, + }); + + @override + Widget build(BuildContext context) { + final Widget? thumbnail; + if (path != null && fileType == FileType.image) { + if (path!.startsWith('content://')) { + thumbnail = Image( + image: ResizeImage.resizeIfNeeded( + 64, + null, + _ContentUriImage(Uri.parse(path!)), + ), + errorBuilder: (_, _, _) => Padding( + padding: const EdgeInsets.all(10), + child: Icon(fileType.icon, size: 32), + ), + ); + } else { + thumbnail = Image.file( + File(path!), + cacheWidth: 64, // reduce memory with low cached size; do not set cacheHeight because the image must keep its ratio + errorBuilder: (_, _, _) => Padding( + padding: const EdgeInsets.all(10), + child: Icon(fileType.icon, size: 32), + ), + ); + } + } else { + thumbnail = null; + } + + return _Thumbnail( + thumbnail: thumbnail, + icon: fileType.icon, + ); + } +} + +class MemoryThumbnail extends StatelessWidget { + final Uint8List? bytes; + final FileType fileType; + final double size; + + const MemoryThumbnail({ + required this.bytes, + required this.fileType, + this.size = defaultThumbnailSize, + }); + + @override + Widget build(BuildContext context) { + final Widget? thumbnail; + if (bytes != null) { + thumbnail = Padding( + padding: fileType == FileType.apk ? const EdgeInsets.all(50) : EdgeInsets.zero, + child: Image.memory( + bytes!, + errorBuilder: (_, _, _) => Padding( + padding: const EdgeInsets.all(10), + child: Icon(fileType.icon, size: 32), + ), + ), + ); + } else { + thumbnail = null; + } + + return _Thumbnail( + thumbnail: thumbnail, + icon: fileType.icon, + size: size, + ); + } +} + +class _Thumbnail extends StatelessWidget { + final Widget? thumbnail; + final IconData? icon; + final double size; + + const _Thumbnail({ + required this.thumbnail, + required this.icon, + this.size = defaultThumbnailSize, + }); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: size, + height: size, + child: ClipRRect( + borderRadius: BorderRadius.circular(10), + child: ColoredBox( + color: Theme.of(context).inputDecorationTheme.fillColor!, + child: thumbnail == null + ? Icon(icon!, size: 32) + : FittedBox( + fit: BoxFit.cover, + clipBehavior: Clip.hardEdge, + child: thumbnail, + ), + ), + ), + ); + } +} + +class _ContentUriImage extends ImageProvider { + final Uri uri; + + _ContentUriImage(this.uri); + + @override + Future obtainKey(ImageConfiguration configuration) { + return SynchronousFuture(uri); + } + + @override + ImageStreamCompleter loadImage(Uri key, ImageDecoderCallback decode) { + return MultiFrameImageStreamCompleter( + // ignore: discarded_futures + codec: _loadAsync(key, decode), + scale: 1, + informationCollector: () sync* { + yield ErrorDescription('ContentUriImage: $uri'); + }, + ); + } + + Future _loadAsync(Uri key, ImageDecoderCallback decode) async { + final bytes = await UriContent().from(key); + return decode(await ImmutableBuffer.fromUint8List(bytes)); + } +} diff --git a/app/lib/widget/labeled_checkbox.dart b/app/lib/widget/labeled_checkbox.dart new file mode 100644 index 0000000..bcc09b0 --- /dev/null +++ b/app/lib/widget/labeled_checkbox.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +class LabeledCheckbox extends StatelessWidget { + final String label; + final bool value; + final ValueChanged onChanged; + final bool labelFirst; + + const LabeledCheckbox({ + required this.label, + required this.value, + required this.onChanged, + this.labelFirst = false, + }); + + @override + Widget build(BuildContext context) { + return Row( + children: labelFirst + ? [ + Text(label), + const SizedBox(width: 5), + Checkbox( + value: value, + onChanged: onChanged, + ), + ] + : [ + Checkbox( + value: value, + onChanged: onChanged, + ), + const SizedBox(width: 5), + Text(label), + ], + ); + } +} diff --git a/app/lib/widget/list_tile/custom_list_tile.dart b/app/lib/widget/list_tile/custom_list_tile.dart new file mode 100644 index 0000000..bc30380 --- /dev/null +++ b/app/lib/widget/list_tile/custom_list_tile.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/config/theme.dart'; + +class CustomListTile extends StatelessWidget { + final Widget? icon; + final Widget title; + final Widget subTitle; + final Widget? trailing; + final EdgeInsets padding; + final VoidCallback? onTap; + + const CustomListTile({ + this.icon, + required this.title, + required this.subTitle, + this.trailing, + this.padding = const EdgeInsets.all(15), + this.onTap, + }); + + @override + Widget build(BuildContext context) { + return Card( + margin: EdgeInsets.zero, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + color: Theme.of(context).colorScheme.secondaryContainerIfDark, + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(10), + child: Padding( + padding: padding, + child: Row( + children: [ + if (icon != null) ...[ + icon!, + const SizedBox(width: 15), + ], + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + FittedBox( + child: title, + ), + const SizedBox(height: 5), + subTitle, + ], + ), + ), + ?trailing, + ], + ), + ), + ), + ); + } +} diff --git a/app/lib/widget/list_tile/device_list_tile.dart b/app/lib/widget/list_tile/device_list_tile.dart new file mode 100644 index 0000000..31a4c11 --- /dev/null +++ b/app/lib/widget/list_tile/device_list_tile.dart @@ -0,0 +1,79 @@ +import 'package:common/model/device.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/util/device_type_ext.dart'; +import 'package:localsend_app/widget/custom_progress_bar.dart'; +import 'package:localsend_app/widget/device_bage.dart'; +import 'package:localsend_app/widget/list_tile/custom_list_tile.dart'; + +class DeviceListTile extends StatelessWidget { + final Device device; + final bool isFavorite; + + /// If not null, this name is used instead of [Device.alias]. + /// This is the case when the device is marked as favorite. + final String? nameOverride; + + final String? info; + final double? progress; + final VoidCallback? onTap; + final VoidCallback? onFavoriteTap; + + const DeviceListTile({ + required this.device, + this.isFavorite = false, + this.nameOverride, + this.info, + this.progress, + this.onTap, + this.onFavoriteTap, + }); + + @override + Widget build(BuildContext context) { + final badgeColor = Color.lerp(Theme.of(context).colorScheme.secondaryContainer, Colors.white, 0.3)!; + return CustomListTile( + icon: Icon(device.deviceType.icon, size: 46), + title: Text(nameOverride ?? device.alias, style: const TextStyle(fontSize: 20)), + trailing: onFavoriteTap != null + ? IconButton( + icon: Icon(isFavorite ? Icons.favorite : Icons.favorite_border), + onPressed: onFavoriteTap, + ) + : null, + subTitle: Wrap( + runSpacing: 10, + spacing: 10, + children: [ + if (info != null) + Text(info!, style: const TextStyle(color: Colors.grey)) + else if (progress != null) + Padding( + padding: const EdgeInsets.symmetric(vertical: 5), + child: CustomProgressBar(progress: progress!), + ) + else ...[ + if (device.ip != null) + DeviceBadge( + backgroundColor: badgeColor, + foregroundColor: Theme.of(context).colorScheme.onSecondaryContainer, + label: 'LAN • HTTP', + ) + else + DeviceBadge( + backgroundColor: badgeColor, + foregroundColor: Theme.of(context).colorScheme.onSecondaryContainer, + label: 'WebRTC', + ), + if (device.deviceModel != null) + DeviceBadge( + backgroundColor: badgeColor, + foregroundColor: Theme.of(context).colorScheme.onSecondaryContainer, + label: device.deviceModel!, + ), + ], + ], + ), + onTap: onTap, + ); + } +} diff --git a/app/lib/widget/list_tile/device_placeholder_list_tile.dart b/app/lib/widget/list_tile/device_placeholder_list_tile.dart new file mode 100644 index 0000000..8018939 --- /dev/null +++ b/app/lib/widget/list_tile/device_placeholder_list_tile.dart @@ -0,0 +1,50 @@ +import 'package:common/model/device.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/provider/animation_provider.dart'; +import 'package:localsend_app/util/device_type_ext.dart'; +import 'package:localsend_app/widget/device_bage.dart'; +import 'package:localsend_app/widget/list_tile/custom_list_tile.dart'; +import 'package:localsend_app/widget/opacity_slideshow.dart'; +import 'package:refena_flutter/refena_flutter.dart'; + +class DevicePlaceholderListTile extends StatelessWidget { + const DevicePlaceholderListTile(); + + @override + Widget build(BuildContext context) { + final animations = context.ref.watch(animationProvider); + return CustomListTile( + icon: OpacitySlideshow( + durationMillis: 3000, + running: animations, + children: [ + ...DeviceType.values.map((d) => Icon(d.icon, size: 46)), + ], + ), + title: const Visibility( + visible: false, + maintainSize: true, + maintainAnimation: true, + maintainState: true, + // A workaround to have an implicit height + child: Text('A', style: TextStyle(fontSize: 20)), + ), + subTitle: Wrap( + runSpacing: 10, + spacing: 10, + children: [ + DeviceBadge( + backgroundColor: Theme.of(context).colorScheme.onSecondaryContainer.withValues(alpha: 0.5), + foregroundColor: Colors.transparent, + label: ' ', + ), + DeviceBadge( + backgroundColor: Theme.of(context).colorScheme.onSecondaryContainer.withValues(alpha: 0.5), + foregroundColor: Colors.transparent, + label: ' ', + ), + ], + ), + ); + } +} diff --git a/app/lib/widget/local_send_logo.dart b/app/lib/widget/local_send_logo.dart new file mode 100644 index 0000000..5febff2 --- /dev/null +++ b/app/lib/widget/local_send_logo.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/gen/assets.gen.dart'; + +class LocalSendLogo extends StatelessWidget { + final bool withText; + + const LocalSendLogo({required this.withText}); + + @override + Widget build(BuildContext context) { + final logo = ColorFiltered( + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.primary, + BlendMode.srcATop, + ), + child: Assets.img.logo512.image( + width: 200, + height: 200, + ), + ); + + if (withText) { + return Column( + children: [ + logo, + const Text( + 'LocalSend', + style: TextStyle(fontSize: 36, fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + ], + ); + } else { + return logo; + } + } +} diff --git a/app/lib/widget/opacity_slideshow.dart b/app/lib/widget/opacity_slideshow.dart new file mode 100644 index 0000000..290d5f6 --- /dev/null +++ b/app/lib/widget/opacity_slideshow.dart @@ -0,0 +1,79 @@ +import 'dart:async'; + +import 'package:common/util/sleep.dart'; +import 'package:flutter/material.dart'; + +/// A slideshow of widgets using [AnimatedOpacity] as transition. +class OpacitySlideshow extends StatefulWidget { + final List children; + final int durationMillis; + final int switchDurationMillis; + final bool running; + + const OpacitySlideshow({ + required this.children, + required this.durationMillis, + this.switchDurationMillis = 300, + this.running = true, + super.key, + }); + + @override + State createState() => _OpacitySlideshowState(); +} + +class _OpacitySlideshowState extends State { + Timer? _timer; + int _index = 0; + double _opacity = 1; + + @override + void initState() { + super.initState(); + _startTimer(); + } + + @override + void dispose() { + super.dispose(); + _timer?.cancel(); + } + + @override + void didUpdateWidget(OpacitySlideshow oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.running && !widget.running) { + _timer?.cancel(); + } else if (!oldWidget.running && widget.running) { + _startTimer(); + } + } + + void _startTimer() { + if (widget.children.length <= 1) { + return; + } + + _timer = Timer.periodic(Duration(milliseconds: widget.durationMillis), (_) async { + if (!mounted) return; + setState(() { + _opacity = 0; + }); + await sleepAsync(widget.switchDurationMillis); + if (!mounted) return; + setState(() { + _index = (_index + 1) % widget.children.length; + _opacity = 1; + }); + }); + } + + @override + Widget build(BuildContext context) { + return AnimatedOpacity( + opacity: _opacity, + duration: Duration(milliseconds: widget.switchDurationMillis), + child: widget.children[_index], + ); + } +} diff --git a/app/lib/widget/responsive_builder.dart b/app/lib/widget/responsive_builder.dart new file mode 100644 index 0000000..3e84036 --- /dev/null +++ b/app/lib/widget/responsive_builder.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +class SizingInformation { + final bool isMobile; + final bool isTabletOrDesktop; + final bool isDesktop; + + const SizingInformation(double width) : isMobile = width < 700, isTabletOrDesktop = width >= 700, isDesktop = width >= 800; +} + +class ResponsiveBuilder extends StatelessWidget { + final Widget Function(SizingInformation sizingInformation) builder; + + const ResponsiveBuilder({required this.builder}); + + @override + Widget build(BuildContext context) { + final width = MediaQuery.of(context).size.width; + return builder(SizingInformation(width)); + } +} diff --git a/app/lib/widget/responsive_list_view.dart b/app/lib/widget/responsive_list_view.dart new file mode 100644 index 0000000..76ba3a5 --- /dev/null +++ b/app/lib/widget/responsive_list_view.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:localsend_app/util/ui/nav_bar_padding.dart'; +import 'package:localsend_app/widget/responsive_builder.dart'; + +class ResponsiveListView extends StatelessWidget { + static const defaultMaxWidth = 600.0; + + final double maxWidth; + final ScrollController? controller; + final EdgeInsets padding; + final EdgeInsets desktopPadding; + final List? children; + final Widget? child; + + const ResponsiveListView.single({ + this.maxWidth = defaultMaxWidth, + this.controller, + required this.padding, + EdgeInsets? tabletPadding, + required Widget this.child, + super.key, + }) : desktopPadding = tabletPadding ?? const EdgeInsets.symmetric(horizontal: 10, vertical: 30), + children = null; + + const ResponsiveListView({ + this.maxWidth = defaultMaxWidth, + this.controller, + required this.padding, + EdgeInsets? tabletPadding, + required List this.children, + super.key, + }) : desktopPadding = tabletPadding ?? const EdgeInsets.symmetric(horizontal: 10, vertical: 30), + child = null; + + @override + Widget build(BuildContext context) { + if (children != null) { + return SingleChildScrollView( + controller: controller, + child: Center( + child: ConstrainedBox( + constraints: BoxConstraints(maxWidth: maxWidth), + child: ResponsiveBuilder( + builder: (sizingInformation) { + final bottom = sizingInformation.isDesktop ? desktopPadding.bottom : padding.bottom; + return Padding( + padding: (sizingInformation.isDesktop ? desktopPadding : padding).copyWith( + bottom: bottom + getNavBarPadding(context), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: children!, + ), + ); + }, + ), + ), + ), + ); + } else { + return Center( + child: ConstrainedBox( + constraints: BoxConstraints(maxWidth: maxWidth), + child: ResponsiveBuilder( + builder: (sizingInformation) { + return Padding( + padding: sizingInformation.isDesktop ? desktopPadding : padding, + child: child!, + ); + }, + ), + ), + ); + } + } +} diff --git a/app/lib/widget/responsive_wrap_view.dart b/app/lib/widget/responsive_wrap_view.dart new file mode 100644 index 0000000..4354357 --- /dev/null +++ b/app/lib/widget/responsive_wrap_view.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; + +/// A widget that displays a list of children in a responsive, wrapping grid. +/// +/// It lays out children horizontally, and when a row is full, it wraps +/// to the next line. It calculates an optimal, equal width for all children +/// to make them fill the available width, while ensuring they are never +/// smaller than [minChildWidth]. +class ResponsiveWrapView extends StatelessWidget { + final double outerHorizontalPadding; + final double outerVerticalPadding; + final double childPadding; + final double minChildWidth; + final List children; + + const ResponsiveWrapView({ + super.key, + required this.outerHorizontalPadding, + required this.outerVerticalPadding, + required this.childPadding, + required this.minChildWidth, + required this.children, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric( + horizontal: outerHorizontalPadding, + vertical: outerVerticalPadding, + ), + child: LayoutBuilder( + builder: (context, constraints) { + final double availableWidth = constraints.maxWidth; + + if (availableWidth < minChildWidth) { + return Wrap( + runSpacing: childPadding, + children: children + .map( + (child) => SizedBox( + width: availableWidth, + child: child, + ), + ) + .toList(), + ); + } + + // Calculate how many items *can* fit in a row at their minimum size. + // Formula: n * minChildWidth + (n - 1) * childPadding <= availableWidth + // This simplifies to: n <= (availableWidth + childPadding) / (minChildWidth + childPadding) + final int numItemsPerRow = ((availableWidth + childPadding) / (minChildWidth + childPadding)).floor(); + + // Calculate the *actual* width to make `numItemsPerRow` items + // fill the `availableWidth` perfectly. + // Formula: numItemsPerRow * actualWidth + (numItemsPerRow - 1) * childPadding = availableWidth + final double actualChildWidth = (availableWidth - (numItemsPerRow - 1) * childPadding) / numItemsPerRow; + + return Wrap( + spacing: childPadding, + runSpacing: childPadding, + children: children + .map( + (child) => SizedBox( + width: actualChildWidth, + child: child, + ), + ) + .toList(), + ); + }, + ), + ); + } +} diff --git a/app/lib/widget/rotating_widget.dart b/app/lib/widget/rotating_widget.dart new file mode 100644 index 0000000..db11a18 --- /dev/null +++ b/app/lib/widget/rotating_widget.dart @@ -0,0 +1,68 @@ +import 'package:common/util/sleep.dart'; +import 'package:flutter/material.dart'; + +class RotatingWidget extends StatefulWidget { + final Duration duration; + final bool spinning; + final bool reverse; + final Widget child; + + const RotatingWidget({ + required this.duration, + this.spinning = true, + this.reverse = false, + required this.child, + super.key, + }); + + @override + State createState() => RotatingWidgetState(); +} + +class RotatingWidgetState extends State { + static const _fps = 30; + static const _tickDuration = 1000 ~/ _fps; // in milliseconds + static const _maxRadians = 6.28; // 360 degrees in radians + double _angle = 0; // in radians + double _anglePerTick = 0; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _updateAnglePerTick(); + _loop(); + }); + } + + void _updateAnglePerTick() { + _anglePerTick = _maxRadians / (widget.duration.inMilliseconds / _tickDuration); + if (widget.reverse) { + _anglePerTick = -_anglePerTick; + } + } + + /// This loop has a much greater performance than using [AnimationController]. + void _loop() async { + while (true) { + await sleepAsync(_tickDuration); + if (!mounted) { + return; + } + if (!widget.spinning) { + continue; + } + setState(() { + _angle = (_angle + _anglePerTick) % _maxRadians; + }); + } + } + + @override + Widget build(BuildContext context) { + return Transform.rotate( + angle: _angle, + child: widget.child, + ); + } +} diff --git a/app/lib/widget/sliver/sliver_pinned_header.dart b/app/lib/widget/sliver/sliver_pinned_header.dart new file mode 100644 index 0000000..540f209 --- /dev/null +++ b/app/lib/widget/sliver/sliver_pinned_header.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +class SliverPinnedHeader extends StatelessWidget { + final double height; + final Widget child; + + const SliverPinnedHeader({required this.height, required this.child}); + + @override + Widget build(BuildContext context) { + return SliverPersistentHeader( + pinned: true, + delegate: _SliverPersistentHeaderDelegate( + height: height, + child: child, + ), + ); + } +} + +class _SliverPersistentHeaderDelegate extends SliverPersistentHeaderDelegate { + final double height; + final Widget child; + + _SliverPersistentHeaderDelegate({ + required this.height, + required this.child, + }); + + @override + double get minExtent => height; + + @override + double get maxExtent => height; + + @override + Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) { + return SizedBox.expand(child: child); + } + + @override + bool shouldRebuild(_SliverPersistentHeaderDelegate oldDelegate) { + return true; + } +} diff --git a/app/lib/widget/watcher/life_cycle_watcher.dart b/app/lib/widget/watcher/life_cycle_watcher.dart new file mode 100644 index 0000000..728fea7 --- /dev/null +++ b/app/lib/widget/watcher/life_cycle_watcher.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +class LifeCycleWatcher extends StatefulWidget { + final Widget child; + final void Function(AppLifecycleState state) onChangedState; + + const LifeCycleWatcher({required this.child, required this.onChangedState, super.key}); + + @override + State createState() => _LifeCycleWatcherState(); +} + +class _LifeCycleWatcherState extends State with WidgetsBindingObserver { + @override + Widget build(BuildContext context) { + return widget.child; + } + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addObserver(this); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + widget.onChangedState(state); + } +} diff --git a/app/lib/widget/watcher/shortcut_watcher.dart b/app/lib/widget/watcher/shortcut_watcher.dart new file mode 100644 index 0000000..3f155a6 --- /dev/null +++ b/app/lib/widget/watcher/shortcut_watcher.dart @@ -0,0 +1,108 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:localsend_app/pages/home_page.dart'; +import 'package:localsend_app/pages/home_page_controller.dart'; +import 'package:localsend_app/util/native/file_picker.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/widget/watcher/window_watcher.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:routerino/routerino.dart'; + +class ShortcutWatcher extends StatelessWidget { + final Widget child; + + const ShortcutWatcher({required this.child}); + + @override + Widget build(BuildContext context) { + return Shortcuts( + shortcuts: { + // The select button on AndroidTV needs this to work + LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(), + + // Add Control+Q binding for Linux + // https://github.com/localsend/localsend/issues/194 + if (checkPlatform([TargetPlatform.linux])) LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.keyQ): _ExitAppIntent(), + // Add Command+W to close the window for macOS + if (checkPlatform([TargetPlatform.macOS])) LogicalKeySet(LogicalKeyboardKey.meta, LogicalKeyboardKey.keyW): _CloseWindowIntent(), + // Add Control+, to open settings for macOS + if (checkPlatform([TargetPlatform.macOS])) LogicalKeySet(LogicalKeyboardKey.meta, LogicalKeyboardKey.comma): _OpenSettingsIntent(), + + LogicalKeySet(LogicalKeyboardKey.escape): _PopPageIntent(), + + // Control+V and Command+V + LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.keyV): _PasteIntent(), + LogicalKeySet(LogicalKeyboardKey.meta, LogicalKeyboardKey.keyV): _PasteIntent(), + }, + child: Actions( + actions: { + _ExitAppIntent: CallbackAction(onInvoke: (_) => exit(0)), + _PopPageIntent: CallbackAction(onInvoke: (_) async => Navigator.of(Routerino.context).maybePop()), + _PasteIntent: CallbackAction( + onInvoke: (_) async { + await context.global.dispatchAsync(PickFileAction(option: FilePickerOption.clipboard, context: context)); + if (context.mounted) { + context.redux(homePageControllerProvider).dispatch(ChangeTabAction(HomeTab.send)); + } + return null; + }, + ), + _CloseWindowIntent: CallbackAction<_CloseWindowIntent>( + onInvoke: (_) async { + if (_isFakeMetaKey()) { + return null; + } + + await WindowWatcher.closeWindow(context); + return null; + }, + ), + _OpenSettingsIntent: CallbackAction( + onInvoke: (_) async { + context.redux(homePageControllerProvider).dispatch(ChangeTabAction(HomeTab.settings)); + return null; + }, + ), + }, + child: child, + ), + ); + } +} + +class _ExitAppIntent extends Intent {} + +class _PopPageIntent extends Intent {} + +class _PasteIntent extends Intent {} + +class _CloseWindowIntent extends Intent {} + +class _OpenSettingsIntent extends Intent {} + +bool _ignoreMetaLast = false; +bool _isFakeMetaKey() { + // https://github.com/localsend/localsend/issues/2037 + // We can detect the "fake" meta key by checking if the last key was a meta key + // because the real meta key should be the first key pressed. + if (_ignoreMetaLast) { + final lastKey = HardwareKeyboard.instance.logicalKeysPressed.lastOrNull; + if (lastKey?.isMeta ?? false) { + return true; + } + } else { + final firstKey = HardwareKeyboard.instance.logicalKeysPressed.firstOrNull; + + if (firstKey?.isMeta ?? false) { + _ignoreMetaLast = true; + } + } + + return false; +} + +extension on LogicalKeyboardKey { + bool get isMeta => this == LogicalKeyboardKey.meta || this == LogicalKeyboardKey.metaLeft || this == LogicalKeyboardKey.metaRight; +} diff --git a/app/lib/widget/watcher/tray_watcher.dart b/app/lib/widget/watcher/tray_watcher.dart new file mode 100644 index 0000000..d0982e1 --- /dev/null +++ b/app/lib/widget/watcher/tray_watcher.dart @@ -0,0 +1,62 @@ +import 'dart:io'; + +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/util/native/tray_helper.dart'; +import 'package:tray_manager/tray_manager.dart'; + +class TrayWatcher extends StatefulWidget { + final Widget child; + + const TrayWatcher({required this.child, super.key}); + + @override + State createState() => _TrayWatcherState(); +} + +class _TrayWatcherState extends State with TrayListener { + @override + Widget build(BuildContext context) { + return widget.child; + } + + @override + void initState() { + super.initState(); + trayManager.addListener(this); + } + + @override + void dispose() { + trayManager.removeListener(this); + super.dispose(); + } + + @override + void onTrayIconMouseDown() async { + if (checkPlatform([TargetPlatform.macOS])) { + await trayManager.popUpContextMenu(); + } else { + await showFromTray(); + } + } + + @override + void onTrayIconRightMouseDown() async { + await trayManager.popUpContextMenu(); + } + + @override + void onTrayMenuItemClick(MenuItem menuItem) async { + final entry = TrayEntry.values.firstWhereOrNull((e) => e.name == menuItem.key); + switch (entry) { + case TrayEntry.open: + await showFromTray(); + break; + case TrayEntry.close: + exit(0); + default: + } + } +} diff --git a/app/lib/widget/watcher/window_watcher.dart b/app/lib/widget/watcher/window_watcher.dart new file mode 100644 index 0000000..5615cf1 --- /dev/null +++ b/app/lib/widget/watcher/window_watcher.dart @@ -0,0 +1,127 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:localsend_app/provider/animation_provider.dart'; +import 'package:localsend_app/provider/settings_provider.dart'; +import 'package:localsend_app/provider/window_dimensions_provider.dart'; +import 'package:localsend_app/util/native/platform_check.dart'; +import 'package:localsend_app/util/native/tray_helper.dart'; +import 'package:logging/logging.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:window_manager/window_manager.dart'; + +final _logger = Logger('WindowWatcher'); + +class WindowWatcher extends StatefulWidget { + final Widget child; + + const WindowWatcher({ + required this.child, + super.key, + }); + + @override + State createState() => _WindowWatcherState(); + + static Future closeWindow(BuildContext context) async { + final state = context.findAncestorStateOfType<_WindowWatcherState>(); + await state?.onWindowClose(); + } +} + +class _WindowWatcherState extends State with WindowListener, Refena { + static WindowDimensionsController? _dimensionsController; + static Stopwatch s = Stopwatch(); + + WindowDimensionsController _ensureDimensionsProvider() => ref.watch(windowDimensionProvider); + + @override + Widget build(BuildContext context) { + _dimensionsController ??= _ensureDimensionsProvider(); + s.start(); + return widget.child; + } + + @override + void initState() { + super.initState(); + windowManager.addListener(this); + if (checkPlatformIsDesktop()) { + WidgetsBinding.instance.addPostFrameCallback((_) async { + try { + // always handle close actions manually + await windowManager.setPreventClose(true); + } catch (e) { + _logger.warning('Failed to set prevent close', e); + } + }); + } + } + + @override + void dispose() { + windowManager.removeListener(this); + super.dispose(); + } + + //Linux alternative for onWindowMoved and onWindowResized + @override + Future onWindowMove() async { + if (checkPlatform([TargetPlatform.linux]) && s.elapsedMilliseconds >= 600) { + s.reset(); + final windowOffset = await windowManager.getPosition(); + final windowSize = await windowManager.getSize(); + await _dimensionsController?.storeDimensions(windowOffset: windowOffset, windowSize: windowSize); + } + } + + @override + Future onWindowMoved() async { + final windowOffset = await windowManager.getPosition(); + await _dimensionsController?.storePosition(windowOffset: windowOffset); + } + + @override + Future onWindowResized() async { + final windowSize = await windowManager.getSize(); + await _dimensionsController?.storeSize(windowSize: windowSize); + } + + @override + Future onWindowClose() async { + final windowOffset = await windowManager.getPosition(); + final windowSize = await windowManager.getSize(); + await _dimensionsController?.storeDimensions(windowOffset: windowOffset, windowSize: windowSize); + + if (!checkPlatformIsDesktop()) { + return; + } + + try { + if (ref.read(settingsProvider).minimizeToTray) { + await hideToTray(); + } else { + await destroyTray(); + exit(0); + } + } catch (e) { + _logger.warning('Failed to close window', e); + } + } + + @override + void onWindowFocus() { + // call set state according to window_manager README + setState(() {}); + } + + @override + void onWindowMinimize() { + ref.notifier(sleepProvider).setState((_) => true); + } + + @override + void onWindowRestore() { + ref.notifier(sleepProvider).setState((_) => false); + } +} diff --git a/app/linux/.gitignore b/app/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/app/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/app/linux/CMakeLists.txt b/app/linux/CMakeLists.txt new file mode 100644 index 0000000..857775b --- /dev/null +++ b/app/linux/CMakeLists.txt @@ -0,0 +1,139 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY") +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "localsend_app") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "org.localsend.localsend_app") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/app/linux/flutter/CMakeLists.txt b/app/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/app/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/app/linux/flutter/generated_plugin_registrant.cc b/app/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..7ec0cb2 --- /dev/null +++ b/app/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,63 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) bitsdojo_window_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "BitsdojoWindowPlugin"); + bitsdojo_window_plugin_register_with_registrar(bitsdojo_window_linux_registrar); + g_autoptr(FlPluginRegistrar) desktop_drop_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopDropPlugin"); + desktop_drop_plugin_register_with_registrar(desktop_drop_registrar); + g_autoptr(FlPluginRegistrar) dynamic_color_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); + dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) gtk_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin"); + gtk_plugin_register_with_registrar(gtk_registrar); + g_autoptr(FlPluginRegistrar) open_dir_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "OpenDirLinuxPlugin"); + open_dir_linux_plugin_register_with_registrar(open_dir_linux_registrar); + g_autoptr(FlPluginRegistrar) pasteboard_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "PasteboardPlugin"); + pasteboard_plugin_register_with_registrar(pasteboard_registrar); + g_autoptr(FlPluginRegistrar) screen_retriever_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverLinuxPlugin"); + screen_retriever_linux_plugin_register_with_registrar(screen_retriever_linux_registrar); + g_autoptr(FlPluginRegistrar) tray_manager_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "TrayManagerPlugin"); + tray_manager_plugin_register_with_registrar(tray_manager_registrar); + g_autoptr(FlPluginRegistrar) uri_content_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UriContentPlugin"); + uri_content_plugin_register_with_registrar(uri_content_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); + g_autoptr(FlPluginRegistrar) window_manager_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "WindowManagerPlugin"); + window_manager_plugin_register_with_registrar(window_manager_registrar); + g_autoptr(FlPluginRegistrar) yaru_window_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "YaruWindowLinuxPlugin"); + yaru_window_linux_plugin_register_with_registrar(yaru_window_linux_registrar); +} diff --git a/app/linux/flutter/generated_plugin_registrant.h b/app/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/app/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/app/linux/flutter/generated_plugins.cmake b/app/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..7dc9f5e --- /dev/null +++ b/app/linux/flutter/generated_plugins.cmake @@ -0,0 +1,39 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + bitsdojo_window_linux + desktop_drop + dynamic_color + file_selector_linux + gtk + open_dir_linux + pasteboard + screen_retriever_linux + tray_manager + uri_content + url_launcher_linux + window_manager + yaru_window_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni + rhttp + rust_lib_localsend_app +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/app/linux/main.cc b/app/linux/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/app/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/app/linux/my_application.cc b/app/linux/my_application.cc new file mode 100644 index 0000000..c87def2 --- /dev/null +++ b/app/linux/my_application.cc @@ -0,0 +1,120 @@ +#include "my_application.h" + +#include +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +#include +#include + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Check if --hidden is present in arguments + bool start_hidden = false; + if (self->dart_entrypoint_arguments != nullptr) { + for (int i = 0; self->dart_entrypoint_arguments[i] != nullptr; i++) { + if (strcmp(self->dart_entrypoint_arguments[i], "--hidden") == 0) { + start_hidden = true; + break; + } + } + } + + // If have GTK_CSD in env and it is equal to 1 then add the gtk header bar + // to always use client side decorations + const char* GTK_CSD = getenv("GTK_CSD"); + if (GTK_CSD && strcmp(GTK_CSD, "1") == 0) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "LocalSend"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "LocalSend"); + } + + gtk_window_set_default_size(window, 400, 500); + + if (!start_hidden) { + gtk_widget_show(GTK_WIDGET(window)); + } else { + // Realize the window so plugins (like tray) can initialize, + // but don't map it to the screen. + gtk_widget_realize(GTK_WIDGET(window)); + } + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + if (!start_hidden) { + gtk_widget_grab_focus(GTK_WIDGET(view)); + } +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/app/linux/my_application.h b/app/linux/my_application.h new file mode 100644 index 0000000..72271d5 --- /dev/null +++ b/app/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/app/linux/packaging/deb/make_config.yaml b/app/linux/packaging/deb/make_config.yaml new file mode 100644 index 0000000..c831246 --- /dev/null +++ b/app/linux/packaging/deb/make_config.yaml @@ -0,0 +1,41 @@ +display_name: LocalSend +package_name: localsend +maintainer: + name: Tienisto + email: dev.tien.donam@gmail.com +co_authors: + - name: TheGB0077 + email: gb.lima.dev@gmail.com +priority: optional +section: x11 +installed_size: 30600 +essential: false +icon: assets/img/logo-512.png + +pre_dependencies: + - libc6 (>= 2.31) + +dependencies: + - libappindicator3-1 | libayatana-appindicator3-1 + - gir1.2-appindicator3-0.1 | gir1.2-ayatanaappindicator3-0.1 + - libayatana-ido3-0.4-0 + - xdg-user-dirs + +postinstall_scripts: + - echo "Installed Localsend successfully" +postuninstall_scripts: + - echo "Sorry to see you go :(" + +keywords: + - Sharing + - LAN + - Files + +generic_name: An open source cross-platform alternative to AirDrop + +categories: + - GTK + - FileTransfer + - Utility + +startup_notify: true diff --git a/app/linux/packaging/rpm/make_config.yaml b/app/linux/packaging/rpm/make_config.yaml new file mode 100644 index 0000000..97fa592 --- /dev/null +++ b/app/linux/packaging/rpm/make_config.yaml @@ -0,0 +1,28 @@ +display_name: LocalSend +packager: Tienisto +packagerEmail: dev.tien.donam@gmail.com +url: https://localsend.org +buildArch: x86_64 +license: MIT + +icon: assets/img/logo-512.png + +requires: + - libappindicator + - xdg-user-dirs + +keywords: + - Sharing + - LAN + - Files + +generic_name: An open source cross-platform alternative to AirDrop +summary: Share files easily with LocalSend +group: Applications/Utilities + +categories: + - GTK + - FileTransfer + - Utility + +startup_notify: true diff --git a/app/macos/.gitignore b/app/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/app/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/app/macos/Flutter/Flutter-Debug.xcconfig b/app/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..4b81f9b --- /dev/null +++ b/app/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/app/macos/Flutter/Flutter-Release.xcconfig b/app/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..5caa9d1 --- /dev/null +++ b/app/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/app/macos/Flutter/GeneratedPluginRegistrant.swift b/app/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..697ca79 --- /dev/null +++ b/app/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,54 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import bitsdojo_window_macos +import connectivity_plus +import desktop_drop +import device_info_plus +import dynamic_color +import file_picker +import file_selector_macos +import gal +import in_app_purchase_storekit +import network_info_plus +import open_dir_macos +import package_info_plus +import pasteboard +import photo_manager +import screen_retriever_macos +import shared_preferences_foundation +import tray_manager +import uri_content +import url_launcher_macos +import video_player_avfoundation +import wakelock_plus +import window_manager + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + BitsdojoWindowPlugin.register(with: registry.registrar(forPlugin: "BitsdojoWindowPlugin")) + ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) + DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin")) + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + GalPlugin.register(with: registry.registrar(forPlugin: "GalPlugin")) + InAppPurchasePlugin.register(with: registry.registrar(forPlugin: "InAppPurchasePlugin")) + NetworkInfoPlusPlugin.register(with: registry.registrar(forPlugin: "NetworkInfoPlusPlugin")) + OpenDirMacosPlugin.register(with: registry.registrar(forPlugin: "OpenDirMacosPlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) + PasteboardPlugin.register(with: registry.registrar(forPlugin: "PasteboardPlugin")) + PhotoManagerPlugin.register(with: registry.registrar(forPlugin: "PhotoManagerPlugin")) + ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin")) + UriContentPlugin.register(with: registry.registrar(forPlugin: "UriContentPlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + VideoPlayerPlugin.register(with: registry.registrar(forPlugin: "VideoPlayerPlugin")) + WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) + WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) +} diff --git a/app/macos/Podfile b/app/macos/Podfile new file mode 100644 index 0000000..b061b61 --- /dev/null +++ b/app/macos/Podfile @@ -0,0 +1,45 @@ +platform :osx, '11.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + + pod 'Defaults', '~> 4.2' +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + target.build_configurations.each do |config| + config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '11.0' + end + end +end diff --git a/app/macos/Podfile.lock b/app/macos/Podfile.lock new file mode 100644 index 0000000..2c83216 --- /dev/null +++ b/app/macos/Podfile.lock @@ -0,0 +1,174 @@ +PODS: + - bitsdojo_window_macos (0.0.1): + - FlutterMacOS + - connectivity_plus (0.0.1): + - Flutter + - FlutterMacOS + - Defaults (4.2.2) + - desktop_drop (0.0.1): + - FlutterMacOS + - device_info_plus (0.0.1): + - FlutterMacOS + - dynamic_color (0.0.2): + - FlutterMacOS + - file_selector_macos (0.0.1): + - FlutterMacOS + - FlutterMacOS (1.0.0) + - gal (1.0.0): + - Flutter + - FlutterMacOS + - in_app_purchase_storekit (0.0.1): + - Flutter + - FlutterMacOS + - network_info_plus (0.0.1): + - FlutterMacOS + - open_dir_macos (0.0.1): + - FlutterMacOS + - package_info_plus (0.0.1): + - FlutterMacOS + - pasteboard (0.0.1): + - FlutterMacOS + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - photo_manager (2.0.0): + - Flutter + - FlutterMacOS + - rhttp (0.0.1): + - FlutterMacOS + - rust_lib_localsend_app (0.0.1): + - FlutterMacOS + - screen_retriever_macos (0.0.1): + - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - tray_manager (0.0.1): + - FlutterMacOS + - uri_content (0.0.1): + - FlutterMacOS + - url_launcher_macos (0.0.1): + - FlutterMacOS + - video_player_avfoundation (0.0.1): + - Flutter + - FlutterMacOS + - wakelock_plus (0.0.1): + - FlutterMacOS + - window_manager (0.5.0): + - FlutterMacOS + +DEPENDENCIES: + - bitsdojo_window_macos (from `Flutter/ephemeral/.symlinks/plugins/bitsdojo_window_macos/macos`) + - connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/darwin`) + - Defaults (~> 4.2) + - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - dynamic_color (from `Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos`) + - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) + - FlutterMacOS (from `Flutter/ephemeral`) + - gal (from `Flutter/ephemeral/.symlinks/plugins/gal/darwin`) + - in_app_purchase_storekit (from `Flutter/ephemeral/.symlinks/plugins/in_app_purchase_storekit/darwin`) + - network_info_plus (from `Flutter/ephemeral/.symlinks/plugins/network_info_plus/macos`) + - open_dir_macos (from `Flutter/ephemeral/.symlinks/plugins/open_dir_macos/macos`) + - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) + - pasteboard (from `Flutter/ephemeral/.symlinks/plugins/pasteboard/macos`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - photo_manager (from `Flutter/ephemeral/.symlinks/plugins/photo_manager/macos`) + - rhttp (from `Flutter/ephemeral/.symlinks/plugins/rhttp/macos`) + - rust_lib_localsend_app (from `Flutter/ephemeral/.symlinks/plugins/rust_lib_localsend_app/macos`) + - screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) + - tray_manager (from `Flutter/ephemeral/.symlinks/plugins/tray_manager/macos`) + - uri_content (from `Flutter/ephemeral/.symlinks/plugins/uri_content/macos`) + - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + - video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`) + - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) + - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`) + +SPEC REPOS: + trunk: + - Defaults + +EXTERNAL SOURCES: + bitsdojo_window_macos: + :path: Flutter/ephemeral/.symlinks/plugins/bitsdojo_window_macos/macos + connectivity_plus: + :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/darwin + desktop_drop: + :path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + dynamic_color: + :path: Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos + file_selector_macos: + :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos + FlutterMacOS: + :path: Flutter/ephemeral + gal: + :path: Flutter/ephemeral/.symlinks/plugins/gal/darwin + in_app_purchase_storekit: + :path: Flutter/ephemeral/.symlinks/plugins/in_app_purchase_storekit/darwin + network_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/network_info_plus/macos + open_dir_macos: + :path: Flutter/ephemeral/.symlinks/plugins/open_dir_macos/macos + package_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos + pasteboard: + :path: Flutter/ephemeral/.symlinks/plugins/pasteboard/macos + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + photo_manager: + :path: Flutter/ephemeral/.symlinks/plugins/photo_manager/macos + rhttp: + :path: Flutter/ephemeral/.symlinks/plugins/rhttp/macos + rust_lib_localsend_app: + :path: Flutter/ephemeral/.symlinks/plugins/rust_lib_localsend_app/macos + screen_retriever_macos: + :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos + shared_preferences_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin + tray_manager: + :path: Flutter/ephemeral/.symlinks/plugins/tray_manager/macos + uri_content: + :path: Flutter/ephemeral/.symlinks/plugins/uri_content/macos + url_launcher_macos: + :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + video_player_avfoundation: + :path: Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin + wakelock_plus: + :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos + window_manager: + :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos + +SPEC CHECKSUMS: + bitsdojo_window_macos: 7959fb0ca65a3ccda30095c181ecb856fae48ea9 + connectivity_plus: b21496ab28d1324eb59885d888a4d83b98531f01 + Defaults: d785e56c0fb8890dc40351603f05c8e1df1bdd45 + desktop_drop: e0b672a7d84c0a6cbc378595e82cdb15f2970a43 + device_info_plus: 4fb280989f669696856f8b129e4a5e3cd6c48f76 + dynamic_color: cb7c2a300ee67ed3bd96c3e852df3af0300bf610 + file_selector_macos: 6280b52b459ae6c590af5d78fc35c7267a3c4b31 + FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1 + gal: 44e5b10dbd347c8247a2851acee6c1fbe282c1d3 + in_app_purchase_storekit: e126ef1b89e4a9fdf07e28f005f82632b4609437 + network_info_plus: 21d1cd6a015ccb2fdff06a1fbfa88d54b4e92f61 + open_dir_macos: 79810d7921d777f8732bf6358b3a0839a8fad9b5 + package_info_plus: f0052d280d17aa382b932f399edf32507174e870 + pasteboard: 278d8100149f940fb795d6b3a74f0720c890ecb7 + path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 + photo_manager: d2fbcc0f2d82458700ee6256a15018210a81d413 + rhttp: 08d791d6373089de796318f4cfb172cbcf34e78b + rust_lib_localsend_app: 293779a82668308386129c9669c081d201d3e278 + screen_retriever_macos: 452e51764a9e1cdb74b3c541238795849f21557f + shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 + tray_manager: a104b5c81b578d83f3c3d0f40a997c8b10810166 + uri_content: 6c7c098bcc83078659b4d274f42db92691eb9123 + url_launcher_macos: 0fba8ddabfc33ce0a9afe7c5fef5aab3d8d2d673 + video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b + wakelock_plus: 21ddc249ac4b8d018838dbdabd65c5976c308497 + window_manager: b729e31d38fb04905235df9ea896128991cad99e + +PODFILE CHECKSUM: 5c6550f5101fcba381ddb97e2135e4cacca4f31f + +COCOAPODS: 1.16.2 diff --git a/app/macos/Runner.xcodeproj/project.pbxproj b/app/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..fe9308a --- /dev/null +++ b/app/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,1002 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 05251DB32EA03617008503F6 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05251DB22EA03615008503F6 /* Utilities.swift */; }; + 053DADDD2C8945EF00C3B4DE /* icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 053DADDC2C8945EF00C3B4DE /* icon.icns */; }; + 053DADE72C8945EF00C3B4DE /* ShareExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 053DADDA2C8945EF00C3B4DE /* ShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 053DADF32C8947A500C3B4DE /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053DADF12C8947A500C3B4DE /* Utilities.swift */; }; + 053DADF62C89486500C3B4DE /* ShareController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053DADF42C89486500C3B4DE /* ShareController.swift */; }; + 053DADFD2C89F83400C3B4DE /* Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053DADFA2C89F25E00C3B4DE /* Shared.swift */; }; + 053DADFE2C89F83500C3B4DE /* Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053DADFA2C89F25E00C3B4DE /* Shared.swift */; }; + 0543E87B2C8A93A9004AA8B7 /* ContentDropView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E87A2C8A93A9004AA8B7 /* ContentDropView.swift */; }; + 05BAA8D02C8CE248003CFCF1 /* SecurityScopedResourceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BAA8CF2C8CE248003CFCF1 /* SecurityScopedResourceManager.swift */; }; + 05CD1E642C98F2220044F24D /* DockProgress in Frameworks */ = {isa = PBXBuildFile; productRef = 05CD1E632C98F2220044F24D /* DockProgress */; }; + 05F86B372C9B80BD000EB4BA /* LaunchAtLogin in Frameworks */ = {isa = PBXBuildFile; productRef = 05F86B362C9B80BD000EB4BA /* LaunchAtLogin */; }; + 0F663CE30FCD07225E44A808 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F8CCFF0FAB783405F067709 /* Pods_Runner.framework */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 053DADE52C8945EF00C3B4DE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 053DADD92C8945EF00C3B4DE; + remoteInfo = ShareExtension; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 053DADE82C8945EF00C3B4DE /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 053DADE72C8945EF00C3B4DE /* ShareExtension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 05251DB22EA03615008503F6 /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; + 053DADDA2C8945EF00C3B4DE /* ShareExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ShareExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 053DADDC2C8945EF00C3B4DE /* icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = icon.icns; sourceTree = ""; }; + 053DADE32C8945EF00C3B4DE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 053DADE42C8945EF00C3B4DE /* ShareExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ShareExtension.entitlements; sourceTree = ""; }; + 053DADF12C8947A500C3B4DE /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; + 053DADF42C89486500C3B4DE /* ShareController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareController.swift; sourceTree = ""; }; + 053DADFA2C89F25E00C3B4DE /* Shared.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shared.swift; sourceTree = ""; }; + 0543E87A2C8A93A9004AA8B7 /* ContentDropView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentDropView.swift; sourceTree = ""; }; + 05BAA8CF2C8CE248003CFCF1 /* SecurityScopedResourceManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityScopedResourceManager.swift; sourceTree = ""; }; + 2F8CCFF0FAB783405F067709 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* LocalSend.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LocalSend.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 6304C4E0107ED201F1E21C89 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + C3B8682D6499CC218E0523B9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + CBF4462C3F5FC50BF6BF2B97 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 053DADD72C8945EF00C3B4DE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 05F86B372C9B80BD000EB4BA /* LaunchAtLogin in Frameworks */, + 05CD1E642C98F2220044F24D /* DockProgress in Frameworks */, + 0F663CE30FCD07225E44A808 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 053DADDB2C8945EF00C3B4DE /* ShareExtension */ = { + isa = PBXGroup; + children = ( + 053DADDC2C8945EF00C3B4DE /* icon.icns */, + 053DADE32C8945EF00C3B4DE /* Info.plist */, + 053DADF42C89486500C3B4DE /* ShareController.swift */, + 053DADF12C8947A500C3B4DE /* Utilities.swift */, + 053DADE42C8945EF00C3B4DE /* ShareExtension.entitlements */, + ); + path = ShareExtension; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 053DADDB2C8945EF00C3B4DE /* ShareExtension */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + D56CB2F58F756550B9F5851D /* Pods */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* LocalSend.app */, + 053DADDA2C8945EF00C3B4DE /* ShareExtension.appex */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 0543E87A2C8A93A9004AA8B7 /* ContentDropView.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 05BAA8CF2C8CE248003CFCF1 /* SecurityScopedResourceManager.swift */, + 05251DB22EA03615008503F6 /* Utilities.swift */, + 053DADFA2C89F25E00C3B4DE /* Shared.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D56CB2F58F756550B9F5851D /* Pods */ = { + isa = PBXGroup; + children = ( + 6304C4E0107ED201F1E21C89 /* Pods-Runner.debug.xcconfig */, + CBF4462C3F5FC50BF6BF2B97 /* Pods-Runner.release.xcconfig */, + C3B8682D6499CC218E0523B9 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 2F8CCFF0FAB783405F067709 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 053DADD92C8945EF00C3B4DE /* ShareExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 053DADEC2C8945EF00C3B4DE /* Build configuration list for PBXNativeTarget "ShareExtension" */; + buildPhases = ( + 053DADD62C8945EF00C3B4DE /* Sources */, + 053DADD72C8945EF00C3B4DE /* Frameworks */, + 053DADD82C8945EF00C3B4DE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ShareExtension; + productName = ShareExtension; + productReference = 053DADDA2C8945EF00C3B4DE /* ShareExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 468129DD9C9B6CCEBFC139AB /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 05F86B382C9B8118000EB4BA /* Copy “Launch at Login Helper” */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + 2DA7D291A0AEEC0A0C7CE5C0 /* [CP] Embed Pods Frameworks */, + 053DADE82C8945EF00C3B4DE /* Embed Foundation Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + 053DADE62C8945EF00C3B4DE /* PBXTargetDependency */, + ); + name = Runner; + packageProductDependencies = ( + 05CD1E632C98F2220044F24D /* DockProgress */, + 05F86B362C9B80BD000EB4BA /* LaunchAtLogin */, + ); + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* LocalSend.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1540; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 053DADD92C8945EF00C3B4DE = { + CreatedOnToolsVersion = 15.4; + LastSwiftMigration = 1540; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1540; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + packageReferences = ( + 05CD1E622C98F2220044F24D /* XCRemoteSwiftPackageReference "DockProgress" */, + 05F86B352C9B80BD000EB4BA /* XCRemoteSwiftPackageReference "LaunchAtLogin-Legacy" */, + ); + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + 053DADD92C8945EF00C3B4DE /* ShareExtension */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 053DADD82C8945EF00C3B4DE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 053DADDD2C8945EF00C3B4DE /* icon.icns in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 05F86B382C9B8118000EB4BA /* Copy “Launch at Login Helper” */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Copy “Launch at Login Helper”"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${BUILT_PRODUCTS_DIR}/LaunchAtLogin_LaunchAtLogin.bundle/Contents/Resources/copy-helper-swiftpm.sh\"\n"; + }; + 2DA7D291A0AEEC0A0C7CE5C0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; + 468129DD9C9B6CCEBFC139AB /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 053DADD62C8945EF00C3B4DE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 053DADF32C8947A500C3B4DE /* Utilities.swift in Sources */, + 053DADFE2C89F83500C3B4DE /* Shared.swift in Sources */, + 053DADF62C89486500C3B4DE /* ShareController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0543E87B2C8A93A9004AA8B7 /* ContentDropView.swift in Sources */, + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 05251DB32EA03617008503F6 /* Utilities.swift in Sources */, + 053DADFD2C89F83400C3B4DE /* Shared.swift in Sources */, + 05BAA8D02C8CE248003CFCF1 /* SecurityScopedResourceManager.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 053DADE62C8945EF00C3B4DE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 053DADD92C8945EF00C3B4DE /* ShareExtension */; + targetProxy = 053DADE52C8945EF00C3B4DE /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 053DADE92C8945EF00C3B4DE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 3W7H4PYMCV; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = ShareExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = LocalSend; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 11.0; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.localsend.localsendApp.ShareExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 053DADEA2C8945EF00C3B4DE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 3W7H4PYMCV; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = ShareExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = LocalSend; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 11.0; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.localsend.localsendApp.ShareExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 053DADEB2C8945EF00C3B4DE /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 3W7H4PYMCV; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = ShareExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = LocalSend; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 11.0; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.localsend.localsendApp.ShareExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 3W7H4PYMCV; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 11.0; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "ShareExtension/Flutter Assemble-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 3W7H4PYMCV; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 11.0; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + AUTOMATION_APPLE_EVENTS = NO; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 3W7H4PYMCV; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO; + ENABLE_RESOURCE_ACCESS_CALENDARS = NO; + ENABLE_RESOURCE_ACCESS_CAMERA = NO; + ENABLE_RESOURCE_ACCESS_CONTACTS = NO; + ENABLE_RESOURCE_ACCESS_LOCATION = NO; + ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 11.0; + PROVISIONING_PROFILE_SPECIFIER = ""; + RUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO; + RUNTIME_EXCEPTION_ALLOW_JIT = NO; + RUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO; + RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO; + RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO; + RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "ShareExtension/Flutter Assemble-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "ShareExtension/Flutter Assemble-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 053DADEC2C8945EF00C3B4DE /* Build configuration list for PBXNativeTarget "ShareExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 053DADE92C8945EF00C3B4DE /* Debug */, + 053DADEA2C8945EF00C3B4DE /* Release */, + 053DADEB2C8945EF00C3B4DE /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 05CD1E622C98F2220044F24D /* XCRemoteSwiftPackageReference "DockProgress" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/sindresorhus/DockProgress"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.3.1; + }; + }; + 05F86B352C9B80BD000EB4BA /* XCRemoteSwiftPackageReference "LaunchAtLogin-Legacy" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/sindresorhus/LaunchAtLogin-Legacy"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.0.2; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 05CD1E632C98F2220044F24D /* DockProgress */ = { + isa = XCSwiftPackageProductDependency; + package = 05CD1E622C98F2220044F24D /* XCRemoteSwiftPackageReference "DockProgress" */; + productName = DockProgress; + }; + 05F86B362C9B80BD000EB4BA /* LaunchAtLogin */ = { + isa = XCSwiftPackageProductDependency; + package = 05F86B352C9B80BD000EB4BA /* XCRemoteSwiftPackageReference "LaunchAtLogin-Legacy" */; + productName = LaunchAtLogin; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..b94c2df --- /dev/null +++ b/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,24 @@ +{ + "originHash" : "72ae1b64a4d55b124e5d523ea3b7e7432749772550fc8b66a0f17a2caa5d4dc1", + "pins" : [ + { + "identity" : "dockprogress", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sindresorhus/DockProgress", + "state" : { + "revision" : "d4f23b5a8f5ca0fac393eb7ba78c2fe3e32e52da", + "version" : "4.3.1" + } + }, + { + "identity" : "launchatlogin-legacy", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sindresorhus/LaunchAtLogin-Legacy", + "state" : { + "revision" : "9a894d799269cb591037f9f9cb0961510d4dca81", + "version" : "5.0.2" + } + } + ], + "version" : 3 +} diff --git a/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..1ec5088 --- /dev/null +++ b/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/ShareExtension.xcscheme b/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/ShareExtension.xcscheme new file mode 100644 index 0000000..afecfae --- /dev/null +++ b/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/ShareExtension.xcscheme @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/macos/Runner.xcworkspace/contents.xcworkspacedata b/app/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..4536ec1 --- /dev/null +++ b/app/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/app/macos/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved b/app/macos/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..b94c2df --- /dev/null +++ b/app/macos/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,24 @@ +{ + "originHash" : "72ae1b64a4d55b124e5d523ea3b7e7432749772550fc8b66a0f17a2caa5d4dc1", + "pins" : [ + { + "identity" : "dockprogress", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sindresorhus/DockProgress", + "state" : { + "revision" : "d4f23b5a8f5ca0fac393eb7ba78c2fe3e32e52da", + "version" : "4.3.1" + } + }, + { + "identity" : "launchatlogin-legacy", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sindresorhus/LaunchAtLogin-Legacy", + "state" : { + "revision" : "9a894d799269cb591037f9f9cb0961510d4dca81", + "version" : "5.0.2" + } + } + ], + "version" : 3 +} diff --git a/app/macos/Runner/AppDelegate.swift b/app/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..35591ac --- /dev/null +++ b/app/macos/Runner/AppDelegate.swift @@ -0,0 +1,268 @@ +import Cocoa +import FlutterMacOS +import Defaults +import DockProgress +import LaunchAtLogin +import bitsdojo_window_macos + +enum DockIcon: CaseIterable { + case regular + case error + case success +} + +@main +class AppDelegate: FlutterAppDelegate { + private var statusItem: NSStatusItem? + private var channel: FlutterMethodChannel? + private var pendingFilesObservation: Defaults.Observation? + private var pendingStringsObservation: Defaults.Observation? + private var isLaunchedAsLoginItem: Bool? + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } + + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + // LocalSend handles the close event manually + return false + } + + override func applicationDidFinishLaunching(_ notification: Notification) { + let controller = mainFlutterWindow?.contentViewController as! FlutterViewController + channel = FlutterMethodChannel(name: "main-delegate-channel", binaryMessenger: controller.engine.binaryMessenger) + channel?.setMethodCallHandler(handleFlutterCall) + + NSApplication.shared.servicesProvider = self + + let localsendBrandColor = NSColor(red: 0, green: 0.392, blue: 0.353, alpha: 0.8) // #00645a + DockProgress.style = .squircle(color: localsendBrandColor) + + isLaunchedAsLoginItem = LaunchAtLogin.wasLaunchedAtLogin + + restoreDestinationFolderAccess() + } + + override func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { + showLocalSendFromMenuBar() + return false + } + + private func setupPendingItemsObservation() { + self.pendingFilesObservation = Defaults.observe(.pendingFiles) { change in + guard !Defaults[.pendingFiles].isEmpty else { return } + self.sendPendingItemsToFlutter() + } + + self.pendingStringsObservation = Defaults.observe(.pendingStrings) { change in + guard !Defaults[.pendingStrings].isEmpty else { return } + self.sendPendingItemsToFlutter() + } + } + + private func setDockIcon(icon: DockIcon) { + switch icon { + case .regular: + NSApplication.shared.applicationIconImage = NSImage(named: NSImage.applicationIconName) + case .error: + NSApplication.shared.applicationIconImage = NSImage(named: "AppIconWithErrorMark")! + case .success: + NSApplication.shared.applicationIconImage = NSImage(named: "AppIconWithSuccessMark")! + } + } + + private func setupStatusBarItem(i18n: [String: String]) { + statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength) + if let button = statusItem?.button { + let image = NSImage(named: "StatusBarItemIcon") + image!.size = NSSize(width: 18, height: 18) + image!.isTemplate = true + button.image = image + + let menu = NSMenu() + + let openString = i18n["open"]! + let openItem = NSMenuItem(title: openString, action: #selector(showLocalSendFromMenuBar), keyEquivalent: "o") + menu.addItem(openItem) + + let quitString = i18n["quit"]! + let quitItem = NSMenuItem(title: quitString, action: #selector(quitApp), keyEquivalent: "q") + menu.addItem(quitItem) + + statusItem?.menu = menu + + let dragView = ContentDropView(frame: button.bounds) + button.addSubview(dragView) + + dragView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + dragView.topAnchor.constraint(equalTo: button.topAnchor), + dragView.leadingAnchor.constraint(equalTo: button.leadingAnchor), + dragView.trailingAnchor.constraint(equalTo: button.trailingAnchor), + dragView.bottomAnchor.constraint(equalTo: button.bottomAnchor) + ]) + } + } + + @objc func showLocalSendFromMenuBar() { + channel?.invokeMethod("showLocalSendFromMenuBar", arguments: nil) + } + + @objc private func quitApp() { + NSApp.terminate(nil) + } + + func sendPendingItemsToFlutter() { + let pendingFileBookmarks = Defaults[.pendingFiles] + let pendingStrings = Defaults[.pendingStrings] + var filePaths: [String] = [] + + for bookmark in pendingFileBookmarks { + if let url = SecurityScopedResourceManager.shared.startAccessing(bookmark: bookmark) { + filePaths.append(url.path) + } + } + + if !filePaths.isEmpty { + channel?.invokeMethod("onPendingFiles", arguments: filePaths) + } + if !pendingStrings.isEmpty { + channel?.invokeMethod("onPendingStrings", arguments: pendingStrings) + } + + Defaults[.pendingFiles] = [] + Defaults[.pendingStrings] = [] + + self.showLocalSendFromMenuBar() + } + + // START: handle opened files + @MainActor private func handleFlutterCall(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + switch call.method { + case "methodChannelInitialized": + /// Any call to the channel is dropped until methodChannelInitialized is called from Flutter + setupPendingItemsObservation() + result(nil) + case "setupStatusBar": + let i18n = call.arguments as! [String: String] + setupStatusBarItem(i18n: i18n) + result(nil) + case "removeDestinationFolderAccess": + removeExistingDestinationAccess() + result(nil) + case "persistDestinationFolderAccess": + let folderPath = call.arguments as! String + do { + try saveDestinationFolderAccess(folderPath) + result(nil) + } catch { + result(FlutterError(code: "REQUEST_FOLDER_ACCESS_FAILED", message: "An error occurred while requesting folder access", details: nil)) + } + case "updateDockProgress": + let progress = call.arguments as! Double + DockProgress.progress = progress + result(nil) + case "setDockIcon": + let newIconIndex = call.arguments as! Int + let newIcon = DockIcon.allCases[newIconIndex] + setDockIcon(icon: newIcon) + case "getLaunchAtLogin": + result(LaunchAtLogin.isEnabled) + case "setLaunchAtLogin": + if let launchAtLogin = call.arguments as? Bool { + LaunchAtLogin.isEnabled = launchAtLogin + result(nil) + } else { + result(FlutterError(code: "INVALID_ARGUMENT", message: "Expected a boolean value", details: nil)) + } + case "getLaunchAtLoginMinimized": + result(UserDefaults.standard.bool(forKey: "launchAtLoginMinimized")) + case "setLaunchAtLoginMinimized": + if let launchAtLoginMinimized = call.arguments as? Bool { + UserDefaults.standard.set(launchAtLoginMinimized, forKey: "launchAtLoginMinimized") + result(nil) + } else { + result(FlutterError(code: "INVALID_ARGUMENT", message: "Expected a boolean value", details: nil)) + } + case "isLaunchedAsLoginItem": + result(isLaunchedAsLoginItem) + case "isReduceMotionEnabled": + result(NSWorkspace.shared.accessibilityDisplayShouldReduceMotion) + case "openFirewallSettings": + openFirewallSettings() + result(nil) + default: + result(FlutterMethodNotImplemented) + } + } + + private func saveDestinationFolderAccess(_ folderPath: String) throws { + let folderURL = URL(fileURLWithPath: folderPath) + let bookmarkData = try folderURL.bookmarkData( + options: [.withSecurityScope], + includingResourceValuesForKeys: nil, + relativeTo: nil + ) + Defaults[.destinationFolderBookmark] = bookmarkData + } + + private func removeExistingDestinationAccess() { + guard let existingBookmarkData = Defaults[.destinationFolderBookmark] else { return } + if let url = SecurityScopedResourceManager.shared.startAccessing(bookmark: existingBookmarkData) { + SecurityScopedResourceManager.shared.stopAccessing(url: url) + Defaults[.destinationFolderBookmark] = nil + } + } + + private func restoreDestinationFolderAccess() { + guard let bookmarkData = Defaults[.destinationFolderBookmark] else { return } + do { + var isStale = false + let url = try URL(resolvingBookmarkData: bookmarkData, options: .withSecurityScope, bookmarkDataIsStale: &isStale) + if !isStale { + let _ = url.startAccessingSecurityScopedResource() + } + } catch { + print("Failed to restore folder access: \(error)") + } + } + + override func application(_ sender: NSApplication, openFile filename: String) -> Bool { + /** + Although file URLs shared via the dock icon or the "open with" file menu item already contain access permission, we pass this through the bookmark mechanism for uniformity and readability of the code with URLs shared from the share extension. + - SeeAlso: [Enabling App Sandbox#Enabling User-Selected File Access](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple_ref/doc/uid/TP40011195-CH4-SW6) + - SeeAlso: [``Shared/createBookmarkForFile(at:)``](x-source-tag://create-bookmark-func) + */ + if let fileBookmark = createBookmarkForFile(at: URL(fileURLWithPath: filename)) { + Defaults[.pendingFiles].append(fileBookmark) + } + return true + } + + override func application(_ sender: NSApplication, openFiles filenames: [String]) { + for filename in filenames { + if let fileBookmark = createBookmarkForFile(at: URL(fileURLWithPath: filename)) { + Defaults[.pendingFiles].append(fileBookmark) + } + } + } + + override func application(_ application: NSApplication, open urls: [URL]) { + for url in urls { + if url.isFileURL { + if let fileBookmark = createBookmarkForFile(at: url) { + Defaults[.pendingFiles].append(fileBookmark) + } + } else { + Defaults[.pendingStrings].append(url.absoluteString) + } + } + } + // END: handle opened files + + /// Also handles text dropped on the Dock icon + @objc func handleSendTextService(_ pasteboard: NSPasteboard, userData: String, error: NSErrorPointer) { + guard let string = pasteboard.string(forType: .string) else { return } + Defaults[.pendingStrings].append(string) + } +} diff --git a/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..464cbfa --- /dev/null +++ b/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images": [ + { + "size": "16x16", + "idiom": "mac", + "filename": "logo-1024-mac-16.png", + "scale": "1x" + }, + { + "size": "16x16", + "idiom": "mac", + "filename": "logo-1024-mac-32.png", + "scale": "2x" + }, + { + "size": "32x32", + "idiom": "mac", + "filename": "logo-1024-mac-32.png", + "scale": "1x" + }, + { + "size": "32x32", + "idiom": "mac", + "filename": "logo-1024-mac-64.png", + "scale": "2x" + }, + { + "size": "128x128", + "idiom": "mac", + "filename": "logo-1024-mac-128.png", + "scale": "1x" + }, + { + "size": "128x128", + "idiom": "mac", + "filename": "logo-1024-mac-256.png", + "scale": "2x" + }, + { + "size": "256x256", + "idiom": "mac", + "filename": "logo-1024-mac-256.png", + "scale": "1x" + }, + { + "size": "256x256", + "idiom": "mac", + "filename": "logo-1024-mac-512.png", + "scale": "2x" + }, + { + "size": "512x512", + "idiom": "mac", + "filename": "logo-1024-mac-512.png", + "scale": "1x" + }, + { + "size": "512x512", + "idiom": "mac", + "filename": "logo-1024-mac-1024.png", + "scale": "2x" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +} diff --git a/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-1024.png b/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..aadfb459e29a0a1093f1f1760cdbef263244bc83 GIT binary patch literal 78803 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%0Ahl3&oe-fZgT#`v} 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 NU$y(I{EGYY{{df*?8N{8 literal 0 HcmV?d00001 diff --git a/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-128.png b/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-128.png new file mode 100644 index 0000000000000000000000000000000000000000..6e387f2b149356614f7e1d0a4814dde580d52f3f GIT binary patch literal 5485 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 P00000NkvXXu0mjfwX6Ri literal 0 HcmV?d00001 diff --git a/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-256.png b/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-256.png new file mode 100644 index 0000000000000000000000000000000000000000..abe66d4fdd5421b055970e988a4d60e26f3a3d20 GIT binary patch literal 12532 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 literal 0 HcmV?d00001 diff --git a/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-512.png b/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-512.png new file mode 100644 index 0000000000000000000000000000000000000000..3bbde95a63c49cfa829987bbaf47ec9e381722f4 GIT binary patch literal 33535 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≠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 V*%grA#s7QTYk8Fy6|#uH{{xs>xo!Xe literal 0 HcmV?d00001 diff --git a/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-64.png b/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/logo-1024-mac-64.png new file mode 100644 index 0000000000000000000000000000000000000000..a4dfb5a5fd58e9d5d7c99ec3ae76a2455f4dca6a GIT binary patch literal 2655 zcmX|>2{@G7AID#V!B{Ix=2m3MQX&$GDO8dh6In83onaWuwUddWuD_-1QlzZeyO!dP zWHdxvL)jY43^SH6V=Lk&CvenAgqVAnF#>sr=-|Admplu zL_BS-Kd#glH&|MlF2>c(Y`|F$#8c+D=z72L6B)P$y?mLR^Q zXVCXhM3tjHm8>Ly$5c}sU@sljZjaB9;D zR5n!^aspnXG5vX}{=*E3WDr8c_lx5DHI6^bQqMZZ^Bbf69fh?d-$@-=f3vaYwNQgJ z<4KsfKU$^#QDF)VaHTrxoMZWnce;c|+&6_t=Wu!QQ~TdH0`>==i7(fYbJMgFTrQnZ ztw`pQ#u5Z(71tg41cH~x9vbSttX5O#xzv58@`#urtRB^C;U#Ij zP3t-8LD`dkN)*^K$3qfoPh#skB=*qFSfLd~z?sl;KM1yhAbHr{ZaFj;QeL4q(006R zFxN|h78empH2m1fzQ}1j<&p;ry88lPY%F;@54l_5y>< zW}lxcIF)`@Mi`!~tZCP{V$v03->6b7;qp2p=F!x6*R`>Xk30qM3gFYo47m)J6M`i5 zIHmgnF+OrpO3U@Y#Z-B5Y&6QXs0;?5^L{Z`;{9TCh`vZ`SKHzOZ*KT-yB6jKv`k9( z6qoxe+Lyd-69+Aq_8c&{DyI7( zTOrtUt$AQDl1I_HKrg8!X)fHjlk4UAnBG9{xLTkmF-jgK`+m$C@xNt&_qR_XT(&D9 z3Bd=U$^&CaG0(W?07RKz}=q{Y@wS(dR4nUF2){HDY z5hWV7IJf$u!kfBw+Yq@P0N)%z5cGngILwXi^Xb0b8|iY#Vi;5=VzMu|AgJIET5Ojy z{bZ0!kjo!(!3AbMgON+8ec81|f5B$3IoHPvOdLlw3{^ev8@0c0_q4E@lX?&@uvq*Sa3Dsbp+^L*tYA#P{7y zhC8fQTU}aYy6w5@!rya*Lj$E^jXB=az^mKZ`t1Sc++CTm$P#pL0aTx(a&E)%^;vOx z6>tBJch8wvFUH#?pbAkMv2GoqLUN};^oQc!6YZ_wDHn#Ky*gT1Q9cm-9PfRN4NhUtE;OV4hI}jsZ=mkR8&Nx(ZI5)sVO?0&R{SmCnxLb>S}9i zcXxMpc6PdcMpIMM^3NcVNbT+I1OlP8wUtODj*pL1C=_so|Fz%T+yvW#CYQ?v9dLy# z77Ns1tM&DDFuS+62hI+*1vTjZmjX@h4}K20Tn=}a15W(|&Nhd$xwEtJgYAv&?e*>L zxz*LV)s?xGmFeYW=F$=agw390vFI!oZE}ef<9OQA1w3--cYPJpSKsU z7Y6bJGz5d@!Jq-OC*bMPs!&-2{(ILDYfBq|2g1w8$IlNH5EK#?5s{FRmXVQ_m4zRX zS5`l+si$|=z{unp5^3$=h;njvadmZb^YHZa#`^f;`~m}mgM&lDBftX`eJ3V9KIKtr z>Wjkm54~hMb9Qc?y|fJO{FS;>t^mM$-Tb2QjR*>B*w+3xV@ZK!{&{vyM3R(7$yI)e z32J=Wxrq~`V7Ta_@W{E z5E;xgl*?>_|m0aU1w+w?V|ET7Qq}-+?A}#VheGj(lo;Fial?IUTKsiXtwb? z3qD}WzrA6lw=@|j))?23Y%&0@Hr!qWVcuzZ@O*AGh{ zusfsPlGmY^Nh63(3&7}pSeBE;j(J0a7%_XMW$ec6Nc_|J`8=de=ziL8J~Gyb>Hyz5 zlYOk^uhAkvxTUfBO~>5_qpw9<8gD)aY>*b-5)`L}p?RVt|G`8WRrGpW3NpIQ+j7Xz zwYZVadwEV&GLRx8*z7UB&&yCou(eE$$t#gaXgFMlupX_J|Kmf;^QV%S<^2~U(HGpJ zyxzqM-tzjcD!Ogoa&gdQs7w$#ONHLEgwXOC(AWc(6W^DGllZC?-g6AudDcT7QD$VP zcL6iYgG2x98i|MNjd+P+HfjsbCU!phDu)Q;kj#x$9?G4ovO2su!i5YwxDRZvwA}u2 O%bQ=ayjWx6dhcIP;K70uAh?9!?*5b4&U?;x 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 literal 0 HcmV?d00001 diff --git a/app/macos/Runner/Assets.xcassets/AppIconWithSuccessMark.imageset/Contents.json b/app/macos/Runner/Assets.xcassets/AppIconWithSuccessMark.imageset/Contents.json new file mode 100644 index 0000000..04a20a5 --- /dev/null +++ b/app/macos/Runner/Assets.xcassets/AppIconWithSuccessMark.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "logo-1024-mac-256.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/app/macos/Runner/Assets.xcassets/AppIconWithSuccessMark.imageset/logo-1024-mac-256.png b/app/macos/Runner/Assets.xcassets/AppIconWithSuccessMark.imageset/logo-1024-mac-256.png new file mode 100644 index 0000000000000000000000000000000000000000..27ad1a86bdc64f7774b2ca6c7b435897a96fa233 GIT binary patch literal 30324 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 Gp$P!Z0L0(` literal 0 HcmV?d00001 diff --git a/app/macos/Runner/Base.lproj/MainMenu.xib b/app/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 0000000..403eaa1 --- /dev/null +++ b/app/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/macos/Runner/Configs/AppInfo.xcconfig b/app/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..071a798 --- /dev/null +++ b/app/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = LocalSend + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = org.localsend.localsendApp + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 org.localsend. All rights reserved. diff --git a/app/macos/Runner/Configs/Debug.xcconfig b/app/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/app/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/app/macos/Runner/Configs/Release.xcconfig b/app/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/app/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/app/macos/Runner/Configs/Warnings.xcconfig b/app/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/app/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/app/macos/Runner/ContentDropView.swift b/app/macos/Runner/ContentDropView.swift new file mode 100644 index 0000000..075c2c3 --- /dev/null +++ b/app/macos/Runner/ContentDropView.swift @@ -0,0 +1,54 @@ +import Defaults + +class ContentDropView: NSView { + override init(frame frameRect: NSRect) { + super.init(frame: frameRect) + setup() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setup() + } + + private func setup() { + registerForDraggedTypes([.fileURL, .URL, .string]) + } + + override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation { + return .copy + } + + override func performDragOperation(_ sender: NSDraggingInfo) -> Bool { + let pasteboard = sender.draggingPasteboard + var success = false + + // File URLs + if let fileUrls = pasteboard.readObjects(forClasses: [NSURL.self], options: [.urlReadingFileURLsOnly: true]) as? [URL] { + /** + Although file URLs shared via dragging already contain access permission, we pass this through the bookmark mechanism for uniformity and readability of the code with URLs shared from the share extension. + - SeeAlso: [Enabling App Sandbox#Enabling User-Selected File Access](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple_ref/doc/uid/TP40011195-CH4-SW6) + - SeeAlso: [``Shared/createBookmarkForFile(at:)``](x-source-tag://create-bookmark-func) + */ + let bookmarks: [Data] = fileUrls.compactMap { createBookmarkForFile(at: $0) } + Defaults[.pendingFiles].append(contentsOf: bookmarks) + success = true + } + + // Web URLs and text + if let items = pasteboard.readObjects(forClasses: [NSURL.self, NSString.self], options: nil) { + let strings = items.compactMap { item -> String? in + if let url = item as? URL, !url.isFileURL { + return url.absoluteString + } else if let string = item as? String { + return string + } + return nil + } + Defaults[.pendingStrings].append(contentsOf: strings) + success = true + } + + return success + } +} diff --git a/app/macos/Runner/DebugProfile.entitlements b/app/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..096b72c --- /dev/null +++ b/app/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,22 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + $(AppIdentifierPrefix)localsend.shared_group + + com.apple.security.cs.allow-jit + + com.apple.security.files.downloads.read-write + + com.apple.security.files.user-selected.read-write + + com.apple.security.network.client + + com.apple.security.network.server + + + diff --git a/app/macos/Runner/Info.plist b/app/macos/Runner/Info.plist new file mode 100644 index 0000000..1477186 --- /dev/null +++ b/app/macos/Runner/Info.plist @@ -0,0 +1,158 @@ + + + + + LSUIElement + + AppIdentifierPrefix + $(AppIdentifierPrefix) + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + LocalSend + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + LSApplicationCategoryType + public.app-category.utilities + + + ITSAppUsesNonExemptEncryption + + + CFBundleLocalizations + + ar + az + bg + bn + ca + cs + da + de + el + en + en-IN + es-ES + et + eu + fa + fi + fil-PH + fr + gl + gu + he + hi + hu + id + it + ja + km + ko + ml + mn + ms + ne + nl + pl + pt-BR + pt-PT + ro + ru + si + sk + sl + sr + sr-Cyrl + sv + ta + th + tr + uk + ur + vi + zh-CN + zh-HK + zh-TW + + + NSPhotoLibraryUsageDescription + The app needs photo library access so that the user can select photos to share. + NSPhotoLibraryAddUsageDescription + The app saves received media to the photo library. + NSLocationAlwaysAndWhenInUseUsageDescription + The app requires the local IP to communicate. + NSLocationWhenInUseUsageDescription + The app requires the local IP to communicate. + NSLocalNetworkUsageDescription + The app uses the local network to find and connect to nearby devices. + NSBonjourServices + + _http._tcp + _bonjour._tcp + _lnp._tcp. + + + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + * + + CFBundleTypeName + Any File + LSHandlerRank + Alternate + CFBundleTypeRole + Viewer + LSItemContentTypes + + public.data + public.content + + + + + NSServices + + + NSMenuItem + + default + Send to LocalSend + + NSMessage + handleSendTextService + NSPortName + LocalSend + NSSendTypes + + public.plain-text + + + + + diff --git a/app/macos/Runner/MainFlutterWindow.swift b/app/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..b717453 --- /dev/null +++ b/app/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,23 @@ +import Cocoa +import FlutterMacOS +import window_manager +import bitsdojo_window_macos // used to make custom window bars on macOS (or any desktop operating system for that matter) + +class MainFlutterWindow: BitsdojoWindow { + // just following intructions from https://pub.dev/packages/bitsdojo_window + override func bitsdojo_window_configure() -> UInt { + return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP + } + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + // window_manager: start window hidden + hiddenWindowAtLaunch() + + super.awakeFromNib() + } +} diff --git a/app/macos/Runner/Release.entitlements b/app/macos/Runner/Release.entitlements new file mode 100644 index 0000000..dd4aa2a --- /dev/null +++ b/app/macos/Runner/Release.entitlements @@ -0,0 +1,22 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + $(AppIdentifierPrefix)localsend.shared_group + + com.apple.security.files.bookmarks.app-scope + + com.apple.security.files.downloads.read-write + + com.apple.security.files.user-selected.read-write + + com.apple.security.network.client + + com.apple.security.network.server + + + diff --git a/app/macos/Runner/SecurityScopedResourceManager.swift b/app/macos/Runner/SecurityScopedResourceManager.swift new file mode 100644 index 0000000..8c9b2a8 --- /dev/null +++ b/app/macos/Runner/SecurityScopedResourceManager.swift @@ -0,0 +1,34 @@ +import Foundation + +class SecurityScopedResourceManager { + static let shared = SecurityScopedResourceManager() + private var openResources: [URL: Data] = [:] + + private init() {} + + func startAccessing(bookmark: Data) -> URL? { + do { + var isStale = false + let url = try URL(resolvingBookmarkData: bookmark, options: .withoutUI, relativeTo: nil, bookmarkDataIsStale: &isStale) + + if url.startAccessingSecurityScopedResource() { + openResources[url] = bookmark + return url + } else { + print("Failed to start accessing security-scoped resource: \(url)") + return nil + } + } catch { + print("Failed to resolve security-scoped bookmark: \(error)") + return nil + } + } + + func stopAccessing(url: URL) { + // TODO: stop accessing when file is not needed anymore! See: https://developer.apple.com/documentation/foundation/url/1779698-startaccessingsecurityscopedreso#:~:text=resource%20in%20question.-,Warning,-If%20you%20fail + if openResources.keys.contains(url) { + url.stopAccessingSecurityScopedResource() + openResources.removeValue(forKey: url) + } + } +} diff --git a/app/macos/Runner/Shared.swift b/app/macos/Runner/Shared.swift new file mode 100644 index 0000000..af2e001 --- /dev/null +++ b/app/macos/Runner/Shared.swift @@ -0,0 +1,41 @@ +import Foundation +import Defaults + +let teamIdentifierPrefix = Bundle.main.infoDictionary!["AppIdentifierPrefix"] as! String +let sharedDefaults = UserDefaults(suiteName: "\(teamIdentifierPrefix)localsend.shared_group")! + +typealias FileBookmarkData = Data +extension Defaults.Keys { + static let pendingFiles = Key<[FileBookmarkData]>("pendingFiles", default: [], suite: sharedDefaults) + static let pendingStrings = Key<[String]>("pendingStrings", default: [], suite: sharedDefaults) + static let destinationFolderBookmark = Key("destinationFolderBookmark", default: nil, suite: .standard) +} + +/** + Creates a minimal bookmark for a given file URL. + + That allows the main app to access the file as a "User Selected File" later. Otherwise, the file will be successfully selected but an attempt to send it (that is, actually read it) will fail. + + - Important: We intentionally avoid creating a security-scoped bookmark (`.withSecurityScope` option) here, as security-scoped bookmarks cannot be transferred between apps or app extensions. + - See: + - - [Open Radar: Security scoped bookmarks don't work with app groups](https://openradar.appspot.com/43055392) + - - [Reply from Apple DTS in Apple Developer Forums: Share security scoped bookmark in app group? (Alternative Answer)](https://developer.apple.com/forums/thread/66259?answerId=336402022#336402022) + - - [Detailed instructions in Apple Developer Forums: Share security scoped bookmark in app group? (Alternative Answer)](https://developer.apple.com/forums/thread/66259?answerId=278355022#278355022) + + - Note: The main app and the sharing plugin must have + The same level of "User Selected File" permission (Read Only or Read/Write) + + - Tag: create-bookmark-func + */ +func createBookmarkForFile(at url: URL) -> FileBookmarkData? { + do { + return try (url as NSURL).bookmarkData( + options: .minimalBookmark, + includingResourceValuesForKeys: nil, + relativeTo: nil + ) + } catch { + print("Failed to create bookmark for \(url): \(error)") + return nil + } +} diff --git a/app/macos/Runner/Utilities.swift b/app/macos/Runner/Utilities.swift new file mode 100644 index 0000000..f7684e2 --- /dev/null +++ b/app/macos/Runner/Utilities.swift @@ -0,0 +1,26 @@ +import Cocoa +import LaunchAtLogin + +extension LaunchAtLogin { + /** + Whether the app was launched at login (i.e. as login items). + - Important: This property must only be checked in `NSApplicationDelegate#applicationDidFinishLaunching` method, otherwise the `NSAppleEventManager.shared().currentAppleEvent` will be `nil`. + - Source: https://stackoverflow.com/a/19890943 + - Note: When we drop macOS 12 support and move to LaunchAtLogin-Modern package, this extension should be removed as it's already included - https://github.com/sindresorhus/LaunchAtLogin-Modern/blob/a04ec1c363be3627734f6dad757d82f5d4fa8fcc/Sources/LaunchAtLogin/LaunchAtLogin.swift#L34-L44 + */ + public static var wasLaunchedAtLogin: Bool { + guard let event = NSAppleEventManager.shared().currentAppleEvent else { return false } + return (event.eventID == kAEOpenApplication) + && (event.paramDescriptor(forKeyword: keyAEPropData)?.enumCodeValue == keyAELaunchedAsLogInItem) + } +} + +func openFirewallSettings() { + if #available(macOS 13, *) { + let url = URL(string: "x-apple.systempreferences:com.apple.Network-Settings.extension?Firewall")! + NSWorkspace.shared.open(url) + } else { + let url = URL(string: "x-apple.systempreferences:com.apple.preference.security?Firewall")! + NSWorkspace.shared.open(url) + } +} diff --git a/app/macos/ShareExtension/Info.plist b/app/macos/ShareExtension/Info.plist new file mode 100644 index 0000000..812d8d7 --- /dev/null +++ b/app/macos/ShareExtension/Info.plist @@ -0,0 +1,43 @@ + + + + + AppIdentifierPrefix + $(AppIdentifierPrefix) + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + CFBundleIconFile + icon + CFBundleDisplayName + LocalSend + NSExtension + + NSExtensionAttributes + + NSExtensionActivationRule + + NSExtensionActivationDictionaryVersion + 2 + NSExtensionActivationSupportsAttachmentsWithMaxCount + 999 + NSExtensionActivationSupportsFileWithMaxCount + 999 + NSExtensionActivationSupportsImageWithMaxCount + 999 + NSExtensionActivationSupportsMovieWithMaxCount + 999 + NSExtensionActivationSupportsText + + NSExtensionActivationSupportsWebURLWithMaxCount + 1 + + + NSExtensionPointIdentifier + com.apple.share-services + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).ShareController + + + diff --git a/app/macos/ShareExtension/ShareController.swift b/app/macos/ShareExtension/ShareController.swift new file mode 100644 index 0000000..41a8883 --- /dev/null +++ b/app/macos/ShareExtension/ShareController.swift @@ -0,0 +1,56 @@ +import SwiftUI +import Defaults + +final class ShareController: ExtensionController { + override func run(_ context: NSExtensionContext) async throws -> [NSExtensionItem] { + var urls: [URL] = [] + var string: String? + + for attachment in context.attachments { + if attachment.hasItemConforming(to: .url) { + do { + let url = try await attachment.loadItem(ofClass: NSURL.self) as URL + if url.isFileURL { + urls.append(url) + } else { + string = url.absoluteString + } + } catch { + print("Failed to load URL: \(error)") + } + } else { + print("This attachment type are not supported yet") + } + } + + if let text = context.textContent.body { + string = text + } + + if urls.isEmpty && string == nil { + context.cancel() + return [] + } + + /// - SeeAlso: [``Shared/createBookmarkForFile(at:)``](x-source-tag://create-bookmark-func) + let bookmarks: [Data] = urls.compactMap { createBookmarkForFile(at: $0) } + + // Save the file bookmarks to a shared UserDefaults + // This is Apple's recommended way to share data from App Extension to the Containing App + // See: https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW6 + Defaults[.pendingFiles].append(contentsOf: bookmarks) + + if let string { + Defaults[.pendingStrings].append(string) + } + + // Launch localsend app if it's not running + let localsendAppURL = getParentAppURL() + launchAppIfNeeded(appURL: localsendAppURL) + + // Close the share extension + context.completeRequest(returningItems: [], completionHandler: nil) + + return [] + } +} diff --git a/app/macos/ShareExtension/ShareExtension.entitlements b/app/macos/ShareExtension/ShareExtension.entitlements new file mode 100644 index 0000000..7b5b523 --- /dev/null +++ b/app/macos/ShareExtension/ShareExtension.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + + $(TeamIdentifierPrefix)localsend.shared_group + + com.apple.security.files.user-selected.read-write + + + diff --git a/app/macos/ShareExtension/Utilities.swift b/app/macos/ShareExtension/Utilities.swift new file mode 100644 index 0000000..5195d19 --- /dev/null +++ b/app/macos/ShareExtension/Utilities.swift @@ -0,0 +1,124 @@ +import SwiftUI +import UniformTypeIdentifiers + + +extension Sequence where Element: Sequence { + func flatten() -> [Element.Element] { + // TODO: Make this `flatMap(\.self)` when https://github.com/apple/swift/issues/55343 is fixed. + flatMap { $0 } + } +} + +struct TextContent { + var title: String? + var body: String? +} + +extension NSExtensionContext { + var inputItemsTyped: [NSExtensionItem] { inputItems as! [NSExtensionItem] } + + var attachments: [NSItemProvider] { + inputItemsTyped.compactMap(\.attachments).flatten() + } + + var textContent: TextContent { + TextContent( + title: inputItemsTyped.first?.attributedTitle?.string, + body: inputItemsTyped.first?.attributedContentText?.string + ) + } +} + + +// Strongly-typed versions of some of the methods. +extension NSItemProvider { + func hasItemConforming(to contentType: UTType) -> Bool { + hasItemConformingToTypeIdentifier(contentType.identifier) + } +} + + +extension NSError { + static let userCancelled = NSError(domain: NSCocoaErrorDomain, code: NSUserCancelledError, userInfo: nil) +} + + +extension NSExtensionContext { + func cancel() { + cancelRequest(withError: NSError.userCancelled) + } +} + +@MainActor +extension NSItemProvider { + func loadItem(ofClass cls: T.Type) async throws -> T where T: NSItemProviderReading { + try await withCheckedThrowingContinuation { continuation in + _ = self.loadObject(ofClass: cls) { (item, error) in + if let error = error { + continuation.resume(throwing: error) + } else if let item = item as? T { + continuation.resume(returning: item) + } else { + continuation.resume(throwing: NSError(domain: "ItemProviderError", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to load item of expected type"])) + } + } + } + } +} + + +@MainActor +class ExtensionController: NSViewController { + @MainActor + init() { + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError() + } + + override func loadView() { + Task { @MainActor in // Not sure if this is needed, but added just in case. + do { + extensionContext!.completeRequest( + returningItems: try await run(extensionContext!), + completionHandler: nil + ) + } catch { + extensionContext!.cancelRequest(withError: error) + } + } + } + + func run(_ context: NSExtensionContext) async throws -> [NSExtensionItem] { [] } +} + +extension NSItemProvider: @unchecked Sendable {} + +fileprivate func isAppRunning(at url: URL) -> Bool { + NSWorkspace.shared.runningApplications.contains { $0.bundleURL == url } +} + +func launchAppIfNeeded(appURL: URL) { + guard !isAppRunning(at: appURL) else { return } + NSWorkspace.shared.openApplication(at: appURL, configuration: NSWorkspace.OpenConfiguration()) { (app, error) in + if let error = error { + print("Error opening the application: \(error.localizedDescription)") + } else if let app = app { + print("Application opened successfully: \(app.bundleIdentifier ?? "")") + } else { + print("Failed to open the application for an unknown reason") + } + } +} + +/// Peel off 3 directory levels to get the containing app URL from the app extension +/// MY_APP.app/Contents/PlugIns/MY_APP_EXTENSION.appex +func getParentAppURL() -> URL { + Bundle.main.bundleURL + .deletingLastPathComponent() + .deletingLastPathComponent() + .deletingLastPathComponent() +} diff --git a/app/macos/ShareExtension/icon.icns b/app/macos/ShareExtension/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..84ae85cdf5d9a60126f992e226b9fd9ca6e9d5cc GIT binary patch literal 495508 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 z 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 %9vnbho?7kE=tDY?K+k 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%0D3)DTxOns|HBI-W(S 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.11.0 <4.0.0" + flutter: ">=3.41.0 <4.0.0" diff --git a/app/pubspec.yaml b/app/pubspec.yaml new file mode 100644 index 0000000..764b002 --- /dev/null +++ b/app/pubspec.yaml @@ -0,0 +1,123 @@ +name: localsend_app +description: An open source cross-platform alternative to AirDrop +homepage: https://localsend.org/ +publish_to: "none" + +version: 1.17.0+58 + +environment: + flutter: ^3.41.0 + sdk: ^3.11.0 + +dependencies: + basic_utils: 5.8.2 + bitsdojo_window: ^0.1.6 + collection: ^1.17.2 # allow newer versions, so it can compile with newer Flutter versions + common: + path: ../common + connectivity_plus: 7.2.0 + convert: 3.1.2 + dart_mappable: 4.8.0 + desktop_drop: 0.7.1 + device_apps: 2.2.0 + device_info_plus: 12.4.0 + dynamic_color: 1.8.1 + file_picker: 11.0.2 + file_selector: 1.1.0 + flutter: + sdk: flutter + flutter_displaymode: 0.7.0 + flutter_localizations: + sdk: flutter + flutter_markdown: 0.7.7+1 + flutter_rust_bridge: 2.11.1 + freezed_annotation: 3.1.0 + gal: 2.3.2 + glob: 2.1.3 + image: 4.8.0 + image_picker: 1.2.3 + in_app_purchase: 3.3.0 # [FOSS_REMOVE] + intl: ^0.20.2 # allow newer versions, so it can compile with newer Flutter versions + legalize: 1.2.2 + local_hero: 0.3.0 + logging: 1.3.0 + # https://github.com/NightFeather0615/macos_dock_progress/issues/1 + # macos_dock_progress: 1.1.0 + mime: 2.0.0 + moform: 0.2.11 + nanoid2: 2.0.1 + network_info_plus: 7.0.0 + open_dir: 0.0.2+1 + open_filex: 4.7.0 + package_info_plus: 9.0.1 + pasteboard: 0.3.0 + path: 1.9.1 + path_provider: 2.1.6 + path_provider_foundation: 2.6.0 + permission_handler: 12.0.3 + pretty_qr_code: 3.6.0 + refena_flutter: 3.2.1 + refena_inspector_client: 2.1.1 + rhttp: 0.13.0 + routerino: 0.8.1 + rust_lib_localsend_app: + path: rust_builder + saf_stream: 2.0.0 + screen_retriever: 0.2.2 + share_handler: 0.0.22 + shared_preferences: 2.5.5 + shared_preferences_platform_interface: any + slang: 4.18.0 + slang_flutter: 4.18.0 + system_settings_2: 3.0.2 + tray_manager: 0.5.3 + uri_content: 3.1.1 + url_launcher: 6.3.2 + uuid: 4.5.3 + wakelock_plus: 1.5.2 + wechat_assets_picker: 10.1.2 + win32_registry: 2.1.0 + window_manager: 0.5.2 + windows_taskbar: 1.1.2 + yaru: 10.2.0 + +dev_dependencies: + build_runner: 2.15.1 + dart_mappable_builder: 4.8.0 + flutter_gen_runner: 5.14.1 + flutter_lints: 6.0.0 + freezed: 3.2.5 + mockito: any + refena_inspector: 2.1.1 + slang_build_runner: 4.18.0 + test: ^1.30.0 + +dependency_overrides: + device_apps: + # Migrate to another maintained package to fetch installed apps on Android + git: + url: https://github.com/Tienisto/device_apps.git + ref: 5dc7956d938541254d2e175766b3b84ea38bb85b + pasteboard: + # This is temporary workaround, wait upstream for update + git: + url: https://github.com/Seidko/flutter-plugins.git + ref: 58748dae405df5e68a131e4905d48e75d0624be2 + path: packages/pasteboard + permission_handler_windows: + # Remove windows support as it causes trouble with Windows 7 + # https://github.com/Baseflow/flutter-permission-handler/issues/1034 + git: + url: https://github.com/localsend/permission_handler_windows_noop.git + ref: 2dadd8afbf81e0e3e4791d7144e689555e58f649 + +flutter: + uses-material-design: true + + assets: + - assets/img/ + - assets/web/ + - assets/CHANGELOG.md + +flutter_gen: + line_length: 150 diff --git a/app/rust-toolchain.toml b/app/rust-toolchain.toml new file mode 100644 index 0000000..05472af --- /dev/null +++ b/app/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "1.93.1" +targets = ["aarch64-linux-android", "armv7-linux-androideabi", "x86_64-linux-android", "aarch64-apple-darwin", "x86_64-apple-darwin"] diff --git a/app/rust/.gitignore b/app/rust/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/app/rust/.gitignore @@ -0,0 +1 @@ +/target diff --git a/app/rust/Cargo.lock b/app/rust/Cargo.lock new file mode 100644 index 0000000..4b2b1d0 --- /dev/null +++ b/app/rust/Cargo.lock @@ -0,0 +1,3956 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "allo-isolate" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f67642eb6773fb42a95dd3b348c305ee18dee6642274c6b412d67e985e3befc" +dependencies = [ + "anyhow", + "atomic", + "backtrace", + "uuid", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_log-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" + +[[package]] +name = "android_logger" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb4e440d04be07da1f1bf44fb4495ebd58669372fe0cffa6e48595ac5bd88a3" +dependencies = [ + "android_log-sys", + "env_filter", + "log", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "asn1-rs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" +dependencies = [ + "asn1-rs-derive 0.5.1", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "asn1-rs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "607495ec7113b178fbba7a6166a27f99e774359ef4823adbefd756b5b81d7970" +dependencies = [ + "asn1-rs-derive 0.6.0", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-trait" +version = "0.1.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.7.1", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "build-target" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "832133bbabbbaa9fbdba793456a2827627a7d2b8fb96032fa1e7666d7895832b" + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "bytemuck" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e" +dependencies = [ + "shlex", +] + +[[package]] +name = "ccm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae3c82e4355234767756212c570e29833699ab63e6ffd161887314cc5b43847" +dependencies = [ + "aead", + "cipher", + "ctr", + "subtle", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dart-sys" +version = "4.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57967e4b200d767d091b961d6ab42cc7d0cc14fe9e052e75d0d3cf9eb732d895" +dependencies = [ + "cc", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "delegate-attr" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51aac4c99b2e6775164b412ea33ae8441b2fde2dbf05a20bc0052a63d08c475b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" +dependencies = [ + "asn1-rs 0.6.2", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der-parser" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs 0.7.0", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dtls" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f531dd7c181beaf3cebab3716afa4d0d41ab888be85232583f56bbaf07ca208a" +dependencies = [ + "aes", + "aes-gcm", + "async-trait", + "bincode", + "byteorder", + "cbc", + "ccm", + "chacha20poly1305", + "der-parser 9.0.0", + "hmac", + "log", + "p256", + "p384", + "portable-atomic", + "rand 0.9.2", + "rand_core 0.6.4", + "rcgen", + "ring", + "rustls", + "sec1", + "serde", + "sha1", + "sha2", + "thiserror 1.0.69", + "tokio", + "webrtc-util", + "x25519-dalek", + "x509-parser 0.16.0", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "flate2" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" +dependencies = [ + "crc32fast", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "flutter_rust_bridge" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde126295b2acc5f0a712e265e91b6fdc0ed38767496483e592ae7134db83725" +dependencies = [ + "allo-isolate", + "android_logger", + "anyhow", + "build-target", + "bytemuck", + "byteorder", + "console_error_panic_hook", + "dart-sys", + "delegate-attr", + "flutter_rust_bridge_macros", + "futures", + "js-sys", + "lazy_static", + "log", + "oslog", + "portable-atomic", + "threadpool", + "tokio", + "uuid", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "flutter_rust_bridge_macros" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f0420326b13675321b194928bb7830043b68cf8b810e1c651285c747abb080" +dependencies = [ + "hex", + "md-5", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.0", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "interceptor" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea51375727680dc15f06e8ad90fa31df75d79dd030100e8ad60eef1c27fe2c98" +dependencies = [ + "async-trait", + "bytes", + "futures", + "log", + "portable-atomic", + "rand 0.9.2", + "rtcp", + "rtp", + "thiserror 1.0.69", + "tokio", + "waitgroup", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "ipnet" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.175" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + +[[package]] +name = "localsend" +version = "0.1.0" +dependencies = [ + "anyhow", + "base64", + "bytes", + "ed25519-dalek", + "flate2", + "futures-util", + "http-body-util", + "hyper", + "hyper-util", + "lru", + "pem", + "rand 0.9.2", + "reqwest", + "rsa", + "rustls", + "serde", + "serde_json", + "sha2", + "thiserror 2.0.18", + "tokio", + "tokio-rustls", + "tokio-stream", + "tokio-tungstenite", + "tracing", + "tracing-subscriber", + "tungstenite", + "uuid", + "webrtc", + "x509-parser 0.18.1", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "lru" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" +dependencies = [ + "hashbrown 0.16.1", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset", + "pin-utils", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + +[[package]] +name = "oid-registry" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" +dependencies = [ + "asn1-rs 0.6.2", +] + +[[package]] +name = "oid-registry" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" +dependencies = [ + "asn1-rs 0.7.0", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "oslog" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d2043d1f61d77cb2f4b1f7b7b2295f40507f5f8e9d1c8bf10a1ca5f97a3969" +dependencies = [ + "cc", + "dashmap", + "log", +] + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[package]] +name = "rcgen" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" +dependencies = [ + "pem", + "ring", + "rustls-pki-types", + "time", + "x509-parser 0.16.0", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "reqwest" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "mime", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 1.0.2", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rtcp" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81d30d1c4091644431c22acf9f8be6191b56805e0e977f15ca7104b4a6d6eaec" +dependencies = [ + "bytes", + "thiserror 1.0.69", + "webrtc-util", +] + +[[package]] +name = "rtp" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f126f38ea84c02480e32e547c1459a939052f74fb92117ac3eef23fdac6b023" +dependencies = [ + "bytes", + "memchr", + "portable-atomic", + "rand 0.9.2", + "serde", + "thiserror 1.0.69", + "webrtc-util", +] + +[[package]] +name = "rust_lib_localsend_app" +version = "0.1.0" +dependencies = [ + "anyhow", + "bytes", + "flutter_rust_bridge", + "localsend", + "tokio", + "tracing", + "tracing-subscriber", + "uuid", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustls" +version = "0.23.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.103.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sdp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32c374dceda16965d541c8800ce9cc4e1c14acfd661ddf7952feeedc3411e5c6" +dependencies = [ + "rand 0.9.2", + "substring", + "thiserror 1.0.69", + "url", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "stun" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a512c5d501e3e3b5a4bb3e8e31462d56d54a66b95a28b8596e14422bf21c32b" +dependencies = [ + "base64", + "crc", + "lazy_static", + "md-5", + "rand 0.9.2", + "ring", + "subtle", + "thiserror 1.0.69", + "tokio", + "url", + "webrtc-util", +] + +[[package]] +name = "substring" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" +dependencies = [ + "autocfg", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.0", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.7", +] + +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.11.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.2", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + +[[package]] +name = "turn" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ed995882f66ab94238de77c62e5e778389698ab700afa4696f4754da8f457cb" +dependencies = [ + "async-trait", + "base64", + "futures", + "log", + "md-5", + "portable-atomic", + "rand 0.9.2", + "ring", + "stun", + "thiserror 1.0.69", + "tokio", + "tokio-util", + "webrtc-util", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +dependencies = [ + "getrandom 0.4.1", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "waitgroup" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" +dependencies = [ + "atomic-waker", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.2", + "indexmap", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "0.26.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webrtc" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08fd686c0920ac08f3a57eacc48e31f0e4ca1ffefba4478784606f78c14e83ad" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "dtls", + "hex", + "interceptor", + "lazy_static", + "log", + "portable-atomic", + "rand 0.9.2", + "rcgen", + "regex", + "ring", + "rtcp", + "rtp", + "sdp", + "serde", + "serde_json", + "sha2", + "smol_str", + "stun", + "thiserror 1.0.69", + "tokio", + "turn", + "unicase", + "url", + "waitgroup", + "webrtc-data", + "webrtc-ice", + "webrtc-mdns", + "webrtc-media", + "webrtc-sctp", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "webrtc-data" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "062a5438d63bb0756a221693d76cc0dd6119affee1dfdfe57abe3a2a8c8b3eea" +dependencies = [ + "bytes", + "log", + "portable-atomic", + "thiserror 1.0.69", + "tokio", + "webrtc-sctp", + "webrtc-util", +] + +[[package]] +name = "webrtc-ice" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cb13fd1a373e68addc4bba0c8ca058627518e54342583d024bdcbb8ae5d97d" +dependencies = [ + "arc-swap", + "async-trait", + "crc", + "log", + "portable-atomic", + "rand 0.9.2", + "serde", + "serde_json", + "stun", + "thiserror 1.0.69", + "tokio", + "turn", + "url", + "uuid", + "waitgroup", + "webrtc-mdns", + "webrtc-util", +] + +[[package]] +name = "webrtc-mdns" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17279a067e75df72ce923fdeb7f04cd808f6f5aa4910dc6bcb4fbe66b396ace" +dependencies = [ + "log", + "socket2 0.5.8", + "thiserror 1.0.69", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-media" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94a84c910fec0848fd5a0d8a5651e0ddbdedaf25a7d3ae3f0b15f71ac73a1773" +dependencies = [ + "byteorder", + "bytes", + "rand 0.9.2", + "rtp", + "thiserror 1.0.69", +] + +[[package]] +name = "webrtc-sctp" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f985465467d8910c1f8ac4382cd64f83b1f6a1a75021a82b221546f6fb3b856f" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "crc", + "log", + "portable-atomic", + "rand 0.9.2", + "thiserror 1.0.69", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-srtp" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d8cdc33413f1d0192670a80ce93d17cb78d57fe3a2414be30d6f6dff121123" +dependencies = [ + "aead", + "aes", + "aes-gcm", + "byteorder", + "bytes", + "ctr", + "hmac", + "log", + "rtcp", + "rtp", + "sha1", + "subtle", + "thiserror 1.0.69", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-util" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c0c7e0c8f280f2bbfae442701465777ac07adaf46ce0c5863cd58e13fe472a" +dependencies = [ + "async-trait", + "bitflags 1.3.2", + "bytes", + "ipnet", + "lazy_static", + "log", + "nix", + "portable-atomic", + "rand 0.9.2", + "thiserror 1.0.69", + "tokio", + "winapi", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core 0.6.4", + "serde", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" +dependencies = [ + "asn1-rs 0.6.2", + "data-encoding", + "der-parser 9.0.0", + "lazy_static", + "nom", + "oid-registry 0.7.1", + "ring", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "x509-parser" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" +dependencies = [ + "asn1-rs 0.7.0", + "data-encoding", + "der-parser 10.0.0", + "lazy_static", + "nom", + "oid-registry 0.8.1", + "ring", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/app/rust/Cargo.toml b/app/rust/Cargo.toml new file mode 100644 index 0000000..c2bd840 --- /dev/null +++ b/app/rust/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "rust_lib_localsend_app" +version = "0.1.0" +edition = "2024" + +[lib] +crate-type = ["cdylib", "staticlib"] + +[dependencies] +anyhow = "1.0" +bytes = "1.9" +flutter_rust_bridge = { version = "=2.11.1", features = ["uuid"] } +localsend = { path = "../../core", features = ["full"] } +tokio = { version = "1.49", features = ["full"] } +tracing = "0.1.44" +tracing-subscriber = { version = "0.3.22" } +uuid = { version = "1.11.1", features = ["v4"] } diff --git a/app/rust/src/api/crypto.rs b/app/rust/src/api/crypto.rs new file mode 100644 index 0000000..c3a7e87 --- /dev/null +++ b/app/rust/src/api/crypto.rs @@ -0,0 +1,21 @@ +pub fn verify_cert(cert: String, public_key: String) -> anyhow::Result<()> { + localsend::crypto::cert::verify_cert_from_pem(cert, Some(&public_key)) +} + +pub fn generate_key_pair() -> anyhow::Result { + let signing_key = localsend::crypto::token::generate_key(); + let private_key = localsend::crypto::token::export_private_key(&signing_key)?; + let public_key = localsend::crypto::token::export_public_key(&signing_key)?; + + Ok( + KeyPair { + private_key: private_key.to_string(), + public_key, + } + ) +} + +pub struct KeyPair { + pub private_key: String, + pub public_key: String, +} diff --git a/app/rust/src/api/http.rs b/app/rust/src/api/http.rs new file mode 100644 index 0000000..3605f00 --- /dev/null +++ b/app/rust/src/api/http.rs @@ -0,0 +1,148 @@ +use crate::api::stream; +use flutter_rust_bridge::frb; +pub use localsend::http::client::{ClientError, LsHttpClientVersion}; +pub use localsend::http::dto::{ + PrepareUploadRequestDto, PrepareUploadResponseDto, PrepareUploadResult, ProtocolType, + RegisterDto, RegisterResponseDto, +}; + +pub struct RsHttpClient { + inner: localsend::http::client::LsHttpClient, +} + +#[frb(sync)] +pub fn create_client( + private_key: String, + cert: String, + version: LsHttpClientVersion, +) -> Result { + let inner = localsend::http::client::LsHttpClient::new(&private_key, &cert, version) + .map_err(RsHttpClientError::from)?; + + Ok(RsHttpClient { inner }) +} + +impl RsHttpClient { + pub async fn register( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + payload: RegisterDto, + ) -> Result { + let response = self + .inner + .register(protocol, ip, port, payload) + .await + .map_err(RsHttpClientError::from)?; + + Ok(ResultWithPublicKeyRegisterResponseDto { + public_key: response.public_key, + body: response.body, + }) + } + + pub async fn prepare_upload( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + payload: PrepareUploadRequestDto, + public_key: Option, + pin: Option, + ) -> Result { + let response = self + .inner + .prepare_upload(protocol, ip, port, public_key, payload, pin.as_deref()) + .await + .map_err(RsHttpClientError::from)?; + + Ok(response) + } + + pub async fn upload( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + public_key: Option, + session_id: &str, + file_id: &str, + token: &str, + binary: stream::Dart2RustStreamReceiver, + ) -> Result<(), RsHttpClientError> { + self.inner + .upload( + protocol, + ip, + port, + public_key, + session_id, + file_id, + token, + binary.receiver, + ) + .await + .map_err(RsHttpClientError::from)?; + + Ok(()) + } + + pub async fn cancel( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + session_id: &str, + ) -> Result<(), RsHttpClientError> { + self.inner + .cancel(protocol, ip, port, session_id) + .await + .map_err(RsHttpClientError::from)?; + + Ok(()) + } +} + +pub enum RsHttpClientError { + StatusCode { + status: u16, + message: Option, + }, + Reqwest(String), + Json(String), + Io(String), + Other(String), +} + +impl From for RsHttpClientError { + fn from(e: ClientError) -> Self { + match e { + ClientError::StatusCode(e) => RsHttpClientError::StatusCode { + status: e.status, + message: e.message, + }, + ClientError::Reqwest(e) => RsHttpClientError::Reqwest(e.to_string()), + ClientError::Json(e) => RsHttpClientError::Json(e.to_string()), + ClientError::Io(e) => RsHttpClientError::Io(e.to_string()), + ClientError::Other(e) => RsHttpClientError::Other(e.to_string()), + } + } +} + +#[frb(mirror(LsHttpClientVersion))] +pub enum _LsHttpClientVersion { + V2, + V3, +} + +#[frb(mirror(PrepareUploadResult))] +pub struct _PrepareUploadResult { + pub status_code: u16, + pub response: Option, +} + +pub struct ResultWithPublicKeyRegisterResponseDto { + pub public_key: Option, + pub body: RegisterResponseDto, +} diff --git a/app/rust/src/api/logging.rs b/app/rust/src/api/logging.rs new file mode 100644 index 0000000..124507f --- /dev/null +++ b/app/rust/src/api/logging.rs @@ -0,0 +1,11 @@ +use anyhow::Result; +use tracing::Level; + +pub fn enable_debug_logging() -> Result<()> { + tracing_subscriber::fmt() + .with_max_level(Level::DEBUG) + .try_init() + .map_err(|e| anyhow::anyhow!(e.to_string()))?; + + Ok(()) +} diff --git a/app/rust/src/api/mod.rs b/app/rust/src/api/mod.rs new file mode 100644 index 0000000..9896d74 --- /dev/null +++ b/app/rust/src/api/mod.rs @@ -0,0 +1,6 @@ +pub mod crypto; +pub mod http; +pub mod logging; +pub mod model; +pub mod stream; +pub mod webrtc; diff --git a/app/rust/src/api/model.rs b/app/rust/src/api/model.rs new file mode 100644 index 0000000..cdbe39d --- /dev/null +++ b/app/rust/src/api/model.rs @@ -0,0 +1,73 @@ +use flutter_rust_bridge::frb; +pub use localsend::http::dto::{ProtocolType, RegisterDto, RegisterResponseDto, PrepareUploadRequestDto, PrepareUploadResponseDto}; +pub use localsend::model::discovery::{DeviceType}; +pub use localsend::model::transfer::{ + FileDto, FileMetadata +}; +use std::collections::HashMap; + +#[frb(mirror(RegisterDto))] +pub struct _RegisterDto { + pub alias: String, + pub version: String, + pub device_model: Option, + pub device_type: Option, + pub token: String, + pub port: u16, + pub protocol: ProtocolType, + pub has_web_interface: bool, +} + +#[frb(mirror(RegisterResponseDto))] +pub struct _RegisterResponseDto { + pub alias: String, + pub version: String, + pub device_model: Option, + pub device_type: Option, + pub token: String, + pub has_web_interface: bool, +} + +#[frb(mirror(DeviceType))] +pub enum _DeviceType { + Mobile, + Desktop, + Web, + Headless, + Server, +} + +#[frb(mirror(ProtocolType))] +pub enum _ProtocolType { + Http, + Https, +} + +#[frb(mirror(FileDto))] +pub struct _FileDto { + pub id: String, + pub file_name: String, + pub size: u64, + pub file_type: String, + pub sha256: Option, + pub preview: Option, + pub metadata: Option, +} + +#[frb(mirror(FileMetadata))] +pub struct _FileMetadata { + pub modified: Option, + pub accessed: Option, +} + +#[frb(mirror(PrepareUploadRequestDto))] +pub struct _PrepareUploadRequestDto { + pub info: RegisterDto, + pub files: HashMap, +} + +#[frb(mirror(PrepareUploadResponseDto))] +pub struct _PrepareUploadResponseDto { + pub session_id: String, + pub files: HashMap, +} diff --git a/app/rust/src/api/stream.rs b/app/rust/src/api/stream.rs new file mode 100644 index 0000000..ba7ce7e --- /dev/null +++ b/app/rust/src/api/stream.rs @@ -0,0 +1,28 @@ +use tokio::sync::mpsc; + +pub struct Dart2RustStreamSink { + sender: mpsc::Sender>, +} + +pub struct Dart2RustStreamReceiver { + pub(crate) receiver: mpsc::Receiver>, +} + +pub fn create_stream() -> (Dart2RustStreamSink, Dart2RustStreamReceiver) { + // We don't need to have a buffer because we already buffer on Dart side. + // However, a buffer of 1 seems to improve performance. + let (sender, receiver) = mpsc::channel(1); + ( + Dart2RustStreamSink { sender }, + Dart2RustStreamReceiver { receiver }, + ) +} + +impl Dart2RustStreamSink { + pub async fn add(&mut self, data: Vec) -> Result<(), String> { + self.sender + .send(data) + .await + .map_err(|_| "Failed to send data".to_string()) + } +} diff --git a/app/rust/src/api/webrtc.rs b/app/rust/src/api/webrtc.rs new file mode 100644 index 0000000..1f8b08a --- /dev/null +++ b/app/rust/src/api/webrtc.rs @@ -0,0 +1,514 @@ +use crate::frb_generated::StreamSink; +use bytes::Bytes; +use flutter_rust_bridge::{frb, DartFnFuture}; +use localsend::crypto::token::SigningTokenKey; +use localsend::model::discovery::DeviceType; +use localsend::model::transfer::FileDto; +pub use localsend::webrtc::signaling::{ + ClientInfo, ClientInfoWithoutId, ManagedSignalingConnection, SignalingConnection, + WsServerMessage, WsServerSdpMessage, +}; +pub use localsend::webrtc::webrtc::{ + PinConfig, RTCFile, RTCFileError, RTCSendFileResponse, RTCStatus, +}; +use std::collections::HashSet; +use std::sync::Arc; +use std::time::Duration; +use tokio::sync::{mpsc, oneshot, Mutex}; +use tokio::time; +use uuid::Uuid; + +pub struct ProposingClientInfo { + pub alias: String, + pub version: String, + pub device_model: Option, + pub device_type: Option, +} + +impl ProposingClientInfo { + fn sign(&self, signing_key: &SigningTokenKey) -> anyhow::Result { + Ok(ClientInfoWithoutId { + alias: self.alias.clone(), + version: self.version.clone(), + device_model: self.device_model.clone(), + device_type: self.device_type.clone(), + token: localsend::crypto::token::generate_token_timestamp(&signing_key)?, + }) + } +} + +pub async fn connect( + sink: StreamSink, + uri: String, + info: ProposingClientInfo, + private_key: String, + on_connection: impl Fn(LsSignalingConnection) -> DartFnFuture<()>, +) { + let Ok(signing_key) = localsend::crypto::token::parse_private_key(&private_key) else { + let _ = sink.add_error(anyhow::anyhow!("Invalid private key")); + return; + }; + + let Ok(client_info) = info.sign(&signing_key) else { + let _ = sink.add_error(anyhow::anyhow!("Invalid client info")); + return; + }; + + let connection = match SignalingConnection::connect(uri, &client_info).await { + Ok(connection) => connection, + Err(e) => { + let _ = sink.add_error(e.to_string()); + return; + } + }; + + let (managed_connection, mut rx) = connection.start_listener(); + on_connection(LsSignalingConnection { + inner: Arc::new(managed_connection), + }) + .await; + + while let Some(message) = rx.recv().await { + let _ = sink.add(message.into()); + } +} + +pub struct LsSignalingConnection { + inner: Arc, +} + +impl LsSignalingConnection { + pub async fn update_info(&self, info: ClientInfoWithoutId) -> anyhow::Result<()> { + self.inner.send_update(info).await?; + Ok(()) + } + + pub async fn send_offer( + &self, + stun_servers: Vec, + target: Uuid, + private_key: &str, + expecting_public_key: Option, + pin: Option, + files: Vec, + ) -> anyhow::Result { + let (status_tx, status_rx) = mpsc::channel::(1); + let (selected_tx, selected_rx) = oneshot::channel::>(); + let (error_tx, error_rx) = mpsc::channel::(1); + let (pin_tx, mut pin_rx) = mpsc::channel::>(1); + let (pair_tx, pair_rx) = oneshot::channel::>(); + let (send_tx, send_rx) = mpsc::channel::(1); + + let managed_connection = self.inner.clone(); + + let signing_key = localsend::crypto::token::parse_private_key(private_key)?; + let expecting_public_key = match expecting_public_key { + Some(key) => Some(localsend::crypto::token::parse_public_key( + &key.public_key, + &key.kind, + )?), + None => None, + }; + + tokio::spawn(async move { + let result = localsend::webrtc::webrtc::send_offer( + &managed_connection, + stun_servers, + target, + signing_key, + expecting_public_key, + pin, + files, + status_tx.clone(), + selected_tx, + error_tx, + pin_tx, + pair_tx, + send_rx, + ) + .await; + + if let Err(e) = result { + let _ = status_tx.send(RTCStatus::Error(e.to_string())).await; + } + }); + + tokio::spawn(async move { + // TODO: support pairing + let Ok(pair_tx) = pair_rx.await else { + return; + }; + + let _ = pair_tx.send(false); + }); + + let pin_sender = Arc::new(Mutex::new(None)); + + tokio::spawn({ + let pin_sender = Arc::clone(&pin_sender); + async move { + while let Some(pin_tx) = pin_rx.recv().await { + *pin_sender.lock().await = Some(pin_tx); + } + } + }); + + Ok(RTCSendController { + status_rx, + selected_rx: Arc::new(Mutex::new(Some(selected_rx))), + error_rx, + pin_tx: pin_sender, + send_tx, + }) + } + + pub async fn accept_offer( + &self, + stun_servers: Vec, + offer: WsServerSdpMessage, + private_key: &str, + expecting_public_key: Option, + pin: Option, + ) -> anyhow::Result { + let (status_tx, status_rx) = mpsc::channel::(1); + let (files_tx, files_rx) = oneshot::channel::>(); + let (selected_tx, selected_rx) = oneshot::channel::>>(); + let (error_tx, error_rx) = mpsc::channel::(1); + let (receiving_tx, receiving_rx) = mpsc::channel::(1); + let (pin_tx, mut pin_rx) = mpsc::channel::>(1); + let (file_status_tx, file_status_rx) = mpsc::channel::(1); + + let managed_connection = self.inner.clone(); + + let signing_key = localsend::crypto::token::parse_private_key(private_key)?; + let expecting_public_key = match expecting_public_key { + Some(key) => Some(localsend::crypto::token::parse_public_key( + &key.public_key, + &key.kind, + )?), + None => None, + }; + + tokio::spawn(async move { + let result = localsend::webrtc::webrtc::accept_offer( + &managed_connection, + stun_servers, + &offer, + signing_key, + expecting_public_key, + pin, + status_tx.clone(), + files_tx, + selected_rx, + error_tx, + pin_tx, + receiving_tx, + file_status_rx, + ) + .await; + + if let Err(e) = result { + let _ = status_tx.send(RTCStatus::Error(e.to_string())).await; + } + }); + + let pin_sender = Arc::new(Mutex::new(None)); + + tokio::spawn({ + let pin_sender = Arc::clone(&pin_sender); + async move { + while let Some(pin_tx) = pin_rx.recv().await { + *pin_sender.lock().await = Some(pin_tx); + } + } + }); + + Ok(RTCReceiveController { + status_rx: Arc::new(Mutex::new(Some(status_rx))), + files_rx: Arc::new(Mutex::new(Some(files_rx))), + selected_tx: Arc::new(Mutex::new(Some(selected_tx))), + error_rx: Arc::new(Mutex::new(Some(error_rx))), + pin_tx: pin_sender, + receiving_rx: Arc::new(Mutex::new(Some(receiving_rx))), + file_status_tx, + }) + } +} + +pub struct ExpectingPublicKey { + pub public_key: String, + + /// "ed25519" or "rsa-pss" + pub kind: String, +} + +pub struct RTCSendController { + status_rx: mpsc::Receiver, + selected_rx: Arc>>>>, + error_rx: mpsc::Receiver, + pin_tx: Arc>>>, + send_tx: mpsc::Sender, +} + +impl RTCSendController { + pub async fn listen_status(&mut self, sink: StreamSink) { + while let Some(status) = self.status_rx.recv().await { + let _ = sink.add(status); + } + } + + pub async fn listen_selected_files(&self) -> anyhow::Result> { + let Some(selected_rx) = self.selected_rx.lock().await.take() else { + return Err(anyhow::anyhow!("Selected files already received")); + }; + + let Ok(selected) = selected_rx.await else { + return Err(anyhow::anyhow!("Selected files channel closed")); + }; + + Ok(selected) + } + + pub async fn listen_error(&mut self, sink: StreamSink) { + while let Some(error) = self.error_rx.recv().await { + let _ = sink.add(error); + } + } + + pub async fn send_pin(&self, pin: String) -> anyhow::Result<()> { + let Some(pin_tx) = self.pin_tx.lock().await.take() else { + return Err(anyhow::anyhow!("Pin already sent")); + }; + + pin_tx + .send(pin) + .map_err(|_| anyhow::anyhow!("Pin channel closed"))?; + + Ok(()) + } + + pub async fn send_file(&self, file_id: String) -> anyhow::Result { + let (tx, rx) = mpsc::channel::(1); + self.send_tx + .send(RTCFile { + file_id, + binary_rx: rx, + }) + .await?; + + Ok(RTCFileSender { binary_tx: tx }) + } +} + +pub struct RTCFileSender { + binary_tx: mpsc::Sender, +} + +impl RTCFileSender { + pub async fn send(&self, data: Vec) -> anyhow::Result<()> { + self.binary_tx.send(Bytes::from(data)).await?; + Ok(()) + } +} + +pub struct RTCReceiveController { + status_rx: Arc>>>, + files_rx: Arc>>>>, + selected_tx: Arc>>>>>, + error_rx: Arc>>>, + pin_tx: Arc>>>, + receiving_rx: Arc>>>, + file_status_tx: mpsc::Sender, +} + +impl RTCReceiveController { + pub async fn listen_status(&self, sink: StreamSink) { + let Some(mut status_rx) = self.status_rx.lock().await.take() else { + let _ = sink.add_error(anyhow::anyhow!("Status stream already listened to")); + return; + }; + while let Some(status) = status_rx.recv().await { + let _ = sink.add(status); + } + } + + pub async fn listen_files(&self) -> anyhow::Result> { + let Some(files_rx) = self.files_rx.lock().await.take() else { + return Err(anyhow::anyhow!("Files already received")); + }; + + let Ok(files) = files_rx.await else { + return Err(anyhow::anyhow!("Files channel closed")); + }; + + Ok(files) + } + + pub async fn send_pin(&self, pin: String) -> anyhow::Result<()> { + let Some(pin_tx) = self.pin_tx.lock().await.take() else { + return Err(anyhow::anyhow!("Pin already sent")); + }; + + pin_tx + .send(pin) + .map_err(|_| anyhow::anyhow!("Pin channel closed"))?; + + Ok(()) + } + + pub async fn send_selection(&self, selection: HashSet) -> anyhow::Result<()> { + let Some(selected_tx) = self.selected_tx.lock().await.take() else { + return Err(anyhow::anyhow!("Selected files already sent")); + }; + + selected_tx + .send(Some(selection)) + .map_err(|_| anyhow::anyhow!("Selected files channel closed"))?; + + Ok(()) + } + + pub async fn decline(&self) -> anyhow::Result<()> { + let Some(selected_tx) = self.selected_tx.lock().await.take() else { + return Err(anyhow::anyhow!("Selected files already sent")); + }; + + selected_tx + .send(None) + .map_err(|_| anyhow::anyhow!("Selected files channel closed"))?; + + Ok(()) + } + + pub async fn listen_error(&self, sink: StreamSink) { + let Some(mut error_rx) = self.error_rx.lock().await.take() else { + let _ = sink.add_error(anyhow::anyhow!("Error stream already listened to")); + return; + }; + while let Some(error) = error_rx.recv().await { + let _ = sink.add(error); + } + } + + pub async fn listen_receiving(&self, sink: StreamSink) { + let Some(mut receiving_rx) = self.receiving_rx.lock().await.take() else { + let _ = sink.add_error(anyhow::anyhow!("Receiving stream already listened to")); + return; + }; + while let Some(file) = receiving_rx.recv().await { + let _ = sink.add(RTCFileReceiver { + file_id: file.file_id, + binary_rx: Arc::new(Mutex::new(Some(file.binary_rx))), + }); + } + } + + pub async fn send_file_status(&self, status: RTCSendFileResponse) -> anyhow::Result<()> { + self.file_status_tx.send(status).await?; + Ok(()) + } +} + +pub struct RTCFileReceiver { + file_id: String, + binary_rx: Arc>>>, +} + +impl RTCFileReceiver { + pub fn get_file_id(&self) -> String { + self.file_id.to_owned() + } + + pub async fn receive(&self, sink: StreamSink>) -> anyhow::Result<()> { + let Some(rx) = self.binary_rx.lock().await.take() else { + return Err(anyhow::anyhow!("File receiver listened to")); + }; + + let mut rx = crate::util::bytes::buffer_receiver(rx).await; + + while let Some(data) = rx.recv().await { + let _ = sink.add(data); + } + + Ok(()) + } +} + +#[frb(mirror(PinConfig))] +pub struct _PinConfig { + pub pin: String, + pub max_tries: u8, +} + +#[frb(mirror(WsServerMessage))] +pub enum _WsServerMessage { + Hello { + client: ClientInfo, + peers: Vec, + }, + Join { + peer: ClientInfo, + }, + Update { + peer: ClientInfo, + }, + Left { + peer_id: Uuid, + }, + Offer(WsServerSdpMessage), + Answer(WsServerSdpMessage), + Error { + code: u16, + }, +} + +#[frb(mirror(ClientInfo))] +pub struct _ClientInfo { + pub id: Uuid, + pub alias: String, + pub version: String, + pub device_model: Option, + pub device_type: Option, + pub token: String, +} + +#[frb(mirror(ClientInfoWithoutId))] +pub struct _ClientInfoWithoutId { + pub alias: String, + pub version: String, + pub device_model: Option, + pub device_type: Option, + pub token: String, +} + +#[frb(mirror(WsServerSdpMessage))] +pub struct _WsServerSdpMessage { + pub peer: ClientInfo, + pub session_id: String, + pub sdp: String, +} + +#[frb(mirror(RTCStatus))] +pub enum _RTCStatus { + SdpExchanged, + Connected, + PinRequired, + TooManyAttempts, + Declined, + Sending, + Finished, + Error(String), +} + +#[frb(mirror(RTCFileError))] +pub struct _RTCFileError { + pub file_id: String, + pub error: String, +} + +#[frb(mirror(RTCSendFileResponse))] +pub struct _RTCSendFileResponse { + pub id: String, + pub success: bool, + pub error: Option, +} diff --git a/app/rust/src/frb_generated.rs b/app/rust/src/frb_generated.rs new file mode 100644 index 0000000..72c8814 --- /dev/null +++ b/app/rust/src/frb_generated.rs @@ -0,0 +1,4776 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +#![allow( + non_camel_case_types, + unused, + non_snake_case, + clippy::needless_return, + clippy::redundant_closure_call, + clippy::redundant_closure, + clippy::useless_conversion, + clippy::unit_arg, + clippy::unused_unit, + clippy::double_parens, + clippy::let_and_return, + clippy::too_many_arguments, + clippy::match_single_binding, + clippy::clone_on_copy, + clippy::let_unit_value, + clippy::deref_addrof, + clippy::explicit_auto_deref, + clippy::borrow_deref_ref, + clippy::needless_borrow +)] + +// Section: imports + +use crate::api::http::*; +use crate::api::stream::*; +use crate::api::webrtc::*; +use flutter_rust_bridge::for_generated::byteorder::{NativeEndian, ReadBytesExt, WriteBytesExt}; +use flutter_rust_bridge::for_generated::{transform_result_dco, Lifetimeable, Lockable}; +use flutter_rust_bridge::{Handler, IntoIntoDart}; + +// Section: boilerplate + +flutter_rust_bridge::frb_generated_boilerplate!( + default_stream_sink_codec = SseCodec, + default_rust_opaque = RustOpaqueMoi, + default_rust_auto_opaque = RustAutoOpaqueMoi, +); +pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.11.1"; +pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = -137920352; + +// Section: executor + +flutter_rust_bridge::frb_generated_default_handler!(); + +// Section: wire_funcs + +fn wire__crate__api__stream__Dart2RustStreamSink_add_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "Dart2RustStreamSink_add", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_data = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, String>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, true, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref_mut().await) + } + _ => unreachable!(), + } + } + let mut api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::stream::Dart2RustStreamSink::add( + &mut *api_that_guard, + api_data, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__LsSignalingConnection_accept_offer_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "LsSignalingConnection_accept_offer", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_stun_servers = >::sse_decode(&mut deserializer); + let api_offer = ::sse_decode(&mut deserializer); + let api_private_key = ::sse_decode(&mut deserializer); + let api_expecting_public_key = + >::sse_decode(&mut deserializer); + let api_pin = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::webrtc::LsSignalingConnection::accept_offer( + &*api_that_guard, + api_stun_servers, + api_offer, + &api_private_key, + api_expecting_public_key, + api_pin, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__LsSignalingConnection_send_offer_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "LsSignalingConnection_send_offer", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_stun_servers = >::sse_decode(&mut deserializer); + let api_target = ::sse_decode(&mut deserializer); + let api_private_key = ::sse_decode(&mut deserializer); + let api_expecting_public_key = + >::sse_decode(&mut deserializer); + let api_pin = >::sse_decode(&mut deserializer); + let api_files = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::webrtc::LsSignalingConnection::send_offer( + &*api_that_guard, + api_stun_servers, + api_target, + &api_private_key, + api_expecting_public_key, + api_pin, + api_files, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__LsSignalingConnection_update_info_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "LsSignalingConnection_update_info", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_info = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::webrtc::LsSignalingConnection::update_info( + &*api_that_guard, + api_info, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__http__RsHttpClient_cancel_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RsHttpClient_cancel", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_protocol = ::sse_decode(&mut deserializer); + let api_ip = ::sse_decode(&mut deserializer); + let api_port = ::sse_decode(&mut deserializer); + let api_session_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, crate::api::http::RsHttpClientError>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::http::RsHttpClient::cancel( + &*api_that_guard, + api_protocol, + &api_ip, + api_port, + &api_session_id, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__http__RsHttpClient_prepare_upload_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RsHttpClient_prepare_upload", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_protocol = ::sse_decode(&mut deserializer); + let api_ip = ::sse_decode(&mut deserializer); + let api_port = ::sse_decode(&mut deserializer); + let api_payload = + ::sse_decode(&mut deserializer); + let api_public_key = >::sse_decode(&mut deserializer); + let api_pin = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, crate::api::http::RsHttpClientError>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::http::RsHttpClient::prepare_upload( + &*api_that_guard, + api_protocol, + &api_ip, + api_port, + api_payload, + api_public_key, + api_pin, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__http__RsHttpClient_register_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RsHttpClient_register", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_protocol = ::sse_decode(&mut deserializer); + let api_ip = ::sse_decode(&mut deserializer); + let api_port = ::sse_decode(&mut deserializer); + let api_payload = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, crate::api::http::RsHttpClientError>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::http::RsHttpClient::register( + &*api_that_guard, + api_protocol, + &api_ip, + api_port, + api_payload, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__http__RsHttpClient_upload_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RsHttpClient_upload", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_protocol = ::sse_decode(&mut deserializer); + let api_ip = ::sse_decode(&mut deserializer); + let api_port = ::sse_decode(&mut deserializer); + let api_public_key = >::sse_decode(&mut deserializer); + let api_session_id = ::sse_decode(&mut deserializer); + let api_file_id = ::sse_decode(&mut deserializer); + let api_token = ::sse_decode(&mut deserializer); + let api_binary = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, crate::api::http::RsHttpClientError>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::http::RsHttpClient::upload( + &*api_that_guard, + api_protocol, + &api_ip, + api_port, + api_public_key, + &api_session_id, + &api_file_id, + &api_token, + api_binary, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcFileReceiver_get_file_id_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcFileReceiver_get_file_id", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { + transform_result_sse::<_, ()>((move || { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_that_guard = Some(api_that.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::webrtc::RTCFileReceiver::get_file_id(&*api_that_guard), + )?; + Ok(output_ok) + })()) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcFileReceiver_receive_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcFileReceiver_receive", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_sink = + , flutter_rust_bridge::for_generated::SseCodec>>::sse_decode( + &mut deserializer, + ); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::webrtc::RTCFileReceiver::receive( + &*api_that_guard, + api_sink, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcFileSender_send_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcFileSender_send", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_data = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = + crate::api::webrtc::RTCFileSender::send(&*api_that_guard, api_data) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcReceiveController_decline_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcReceiveController_decline", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = + crate::api::webrtc::RTCReceiveController::decline(&*api_that_guard) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcReceiveController_listen_error_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcReceiveController_listen_error", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_sink = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::webrtc::RTCReceiveController::listen_error( + &*api_that_guard, + api_sink, + ) + .await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcReceiveController_listen_files_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcReceiveController_listen_files", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::webrtc::RTCReceiveController::listen_files( + &*api_that_guard, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcReceiveController_listen_receiving_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcReceiveController_listen_receiving", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_sink = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::webrtc::RTCReceiveController::listen_receiving( + &*api_that_guard, + api_sink, + ) + .await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcReceiveController_listen_status_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcReceiveController_listen_status", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_sink = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::webrtc::RTCReceiveController::listen_status( + &*api_that_guard, + api_sink, + ) + .await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcReceiveController_send_file_status_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcReceiveController_send_file_status", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_status = + ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::webrtc::RTCReceiveController::send_file_status( + &*api_that_guard, + api_status, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcReceiveController_send_pin_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcReceiveController_send_pin", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_pin = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::webrtc::RTCReceiveController::send_pin( + &*api_that_guard, + api_pin, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcReceiveController_send_selection_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcReceiveController_send_selection", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_selection = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::webrtc::RTCReceiveController::send_selection( + &*api_that_guard, + api_selection, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcSendController_listen_error_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcSendController_listen_error", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_sink = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, true, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref_mut().await) + } + _ => unreachable!(), + } + } + let mut api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::webrtc::RTCSendController::listen_error( + &mut *api_that_guard, + api_sink, + ) + .await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcSendController_listen_selected_files_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcSendController_listen_selected_files", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = + crate::api::webrtc::RTCSendController::listen_selected_files( + &*api_that_guard, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcSendController_listen_status_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcSendController_listen_status", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_sink = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, true, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref_mut().await) + } + _ => unreachable!(), + } + } + let mut api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::webrtc::RTCSendController::listen_status( + &mut *api_that_guard, + api_sink, + ) + .await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcSendController_send_file_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcSendController_send_file", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_file_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::webrtc::RTCSendController::send_file( + &*api_that_guard, + api_file_id, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__RtcSendController_send_pin_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "RtcSendController_send_pin", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_pin = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::webrtc::RTCSendController::send_pin( + &*api_that_guard, + api_pin, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__webrtc__connect_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::(flutter_rust_bridge::for_generated::TaskInfo{ debug_name: "connect", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal }, move || { + let message = unsafe { flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_, rust_vec_len_, data_len_) }; + let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_sink = >::sse_decode(&mut deserializer); +let api_uri = ::sse_decode(&mut deserializer); +let api_info = ::sse_decode(&mut deserializer); +let api_private_key = ::sse_decode(&mut deserializer); +let api_on_connection = decode_DartFn_Inputs_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection_Output_unit_AnyhowException(::sse_decode(&mut deserializer));deserializer.end(); move |context| async move { + transform_result_sse::<_, ()>((move || async move { + let output_ok = Result::<_,()>::Ok({ crate::api::webrtc::connect(api_sink, api_uri, api_info, api_private_key, api_on_connection).await; })?; Ok(output_ok) + })().await) + } }) +} +fn wire__crate__api__http__create_client_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "create_client", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_private_key = ::sse_decode(&mut deserializer); + let api_cert = ::sse_decode(&mut deserializer); + let api_version = + ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, crate::api::http::RsHttpClientError>((move || { + let output_ok = + crate::api::http::create_client(api_private_key, api_cert, api_version)?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__stream__create_stream_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "create_stream", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + deserializer.end(); + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::stream::create_stream())?; + Ok(output_ok) + })()) + } + }, + ) +} +fn wire__crate__api__logging__enable_debug_logging_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "enable_debug_logging", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + deserializer.end(); + move |context| { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::logging::enable_debug_logging()?; + Ok(output_ok) + })(), + ) + } + }, + ) +} +fn wire__crate__api__crypto__generate_key_pair_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "generate_key_pair", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + deserializer.end(); + move |context| { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::crypto::generate_key_pair()?; + Ok(output_ok) + })(), + ) + } + }, + ) +} +fn wire__crate__api__crypto__verify_cert_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "verify_cert", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_cert = ::sse_decode(&mut deserializer); + let api_public_key = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::crypto::verify_cert(api_cert, api_public_key)?; + Ok(output_ok) + })(), + ) + } + }, + ) +} + +// Section: static_checks + +#[allow(clippy::unnecessary_literal_unwrap)] +const _: fn() = || { + { + let ClientInfo = None::.unwrap(); + let _: uuid::Uuid = ClientInfo.id; + let _: String = ClientInfo.alias; + let _: String = ClientInfo.version; + let _: Option = ClientInfo.device_model; + let _: Option = ClientInfo.device_type; + let _: String = ClientInfo.token; + } + { + let ClientInfoWithoutId = None::.unwrap(); + let _: String = ClientInfoWithoutId.alias; + let _: String = ClientInfoWithoutId.version; + let _: Option = ClientInfoWithoutId.device_model; + let _: Option = ClientInfoWithoutId.device_type; + let _: String = ClientInfoWithoutId.token; + } + { + let FileDto = None::.unwrap(); + let _: String = FileDto.id; + let _: String = FileDto.file_name; + let _: u64 = FileDto.size; + let _: String = FileDto.file_type; + let _: Option = FileDto.sha256; + let _: Option = FileDto.preview; + let _: Option = FileDto.metadata; + } + { + let FileMetadata = None::.unwrap(); + let _: Option = FileMetadata.modified; + let _: Option = FileMetadata.accessed; + } + { + let PinConfig = None::.unwrap(); + let _: String = PinConfig.pin; + let _: u8 = PinConfig.max_tries; + } + { + let PrepareUploadRequestDto = None::.unwrap(); + let _: crate::api::model::RegisterDto = PrepareUploadRequestDto.info; + let _: std::collections::HashMap = + PrepareUploadRequestDto.files; + } + { + let PrepareUploadResponseDto = None::.unwrap(); + let _: String = PrepareUploadResponseDto.session_id; + let _: std::collections::HashMap = PrepareUploadResponseDto.files; + } + { + let PrepareUploadResult = None::.unwrap(); + let _: u16 = PrepareUploadResult.status_code; + let _: Option = PrepareUploadResult.response; + } + { + let RegisterDto = None::.unwrap(); + let _: String = RegisterDto.alias; + let _: String = RegisterDto.version; + let _: Option = RegisterDto.device_model; + let _: Option = RegisterDto.device_type; + let _: String = RegisterDto.token; + let _: u16 = RegisterDto.port; + let _: crate::api::model::ProtocolType = RegisterDto.protocol; + let _: bool = RegisterDto.has_web_interface; + } + { + let RegisterResponseDto = None::.unwrap(); + let _: String = RegisterResponseDto.alias; + let _: String = RegisterResponseDto.version; + let _: Option = RegisterResponseDto.device_model; + let _: Option = RegisterResponseDto.device_type; + let _: String = RegisterResponseDto.token; + let _: bool = RegisterResponseDto.has_web_interface; + } + { + let RTCFileError = None::.unwrap(); + let _: String = RTCFileError.file_id; + let _: String = RTCFileError.error; + } + { + let RTCSendFileResponse = None::.unwrap(); + let _: String = RTCSendFileResponse.id; + let _: bool = RTCSendFileResponse.success; + let _: Option = RTCSendFileResponse.error; + } + match None::.unwrap() { + crate::api::webrtc::RTCStatus::SdpExchanged => {} + crate::api::webrtc::RTCStatus::Connected => {} + crate::api::webrtc::RTCStatus::PinRequired => {} + crate::api::webrtc::RTCStatus::TooManyAttempts => {} + crate::api::webrtc::RTCStatus::Declined => {} + crate::api::webrtc::RTCStatus::Sending => {} + crate::api::webrtc::RTCStatus::Finished => {} + crate::api::webrtc::RTCStatus::Error(field0) => { + let _: String = field0; + } + } + match None::.unwrap() { + crate::api::webrtc::WsServerMessage::Hello { client, peers } => { + let _: crate::api::webrtc::ClientInfo = client; + let _: Vec = peers; + } + crate::api::webrtc::WsServerMessage::Join { peer } => { + let _: crate::api::webrtc::ClientInfo = peer; + } + crate::api::webrtc::WsServerMessage::Update { peer } => { + let _: crate::api::webrtc::ClientInfo = peer; + } + crate::api::webrtc::WsServerMessage::Left { peer_id } => { + let _: uuid::Uuid = peer_id; + } + crate::api::webrtc::WsServerMessage::Offer(field0) => { + let _: crate::api::webrtc::WsServerSdpMessage = field0; + } + crate::api::webrtc::WsServerMessage::Answer(field0) => { + let _: crate::api::webrtc::WsServerSdpMessage = field0; + } + crate::api::webrtc::WsServerMessage::Error { code } => { + let _: u16 = code; + } + } + { + let WsServerSdpMessage = None::.unwrap(); + let _: crate::api::webrtc::ClientInfo = WsServerSdpMessage.peer; + let _: String = WsServerSdpMessage.session_id; + let _: String = WsServerSdpMessage.sdp; + } +}; + +// Section: related_funcs + +fn decode_DartFn_Inputs_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection_Output_unit_AnyhowException( + dart_opaque: flutter_rust_bridge::DartOpaque, +) -> impl Fn(LsSignalingConnection) -> flutter_rust_bridge::DartFnFuture<()> { + use flutter_rust_bridge::IntoDart; + + async fn body(dart_opaque: flutter_rust_bridge::DartOpaque, arg0: LsSignalingConnection) -> () { + let args = vec![arg0.into_into_dart().into_dart()]; + let message = FLUTTER_RUST_BRIDGE_HANDLER + .dart_fn_invoke(dart_opaque, args) + .await; + + let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let action = deserializer.cursor.read_u8().unwrap(); + let ans = match action { + 0 => std::result::Result::Ok(<()>::sse_decode(&mut deserializer)), + 1 => std::result::Result::Err( + ::sse_decode(&mut deserializer), + ), + _ => unreachable!(), + }; + deserializer.end(); + let ans = ans.expect("Dart throws exception but Rust side assume it is not failable"); + ans + } + + move |arg0: LsSignalingConnection| { + flutter_rust_bridge::for_generated::convert_into_dart_fn_future(body( + dart_opaque.clone(), + arg0, + )) + } +} +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); + +// Section: dart2rust + +impl SseDecode for flutter_rust_bridge::for_generated::anyhow::Error { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::anyhow::anyhow!("{}", inner); + } +} + +impl SseDecode for Dart2RustStreamReceiver { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Dart2RustStreamSink { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for LsSignalingConnection { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for RTCFileReceiver { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for RTCFileSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for RTCReceiveController { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for RTCSendController { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for RsHttpClient { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for flutter_rust_bridge::DartOpaque { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return unsafe { flutter_rust_bridge::for_generated::sse_decode_dart_opaque(inner) }; + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode for std::collections::HashSet { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for StreamSink { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return StreamSink::deserialize(inner); + } +} + +impl SseDecode for StreamSink, flutter_rust_bridge::for_generated::SseCodec> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return StreamSink::deserialize(inner); + } +} + +impl SseDecode + for StreamSink +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return StreamSink::deserialize(inner); + } +} + +impl SseDecode + for StreamSink +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return StreamSink::deserialize(inner); + } +} + +impl SseDecode + for StreamSink< + crate::api::webrtc::WsServerMessage, + flutter_rust_bridge::for_generated::SseCodec, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return StreamSink::deserialize(inner); + } +} + +impl SseDecode for String { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return String::from_utf8(inner).unwrap(); + } +} + +impl SseDecode for uuid::Uuid { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return uuid::Uuid::from_slice(&inner).expect("fail to decode uuid"); + } +} + +impl SseDecode for bool { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_u8().unwrap() != 0 + } +} + +impl SseDecode for crate::api::webrtc::ClientInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_id = ::sse_decode(deserializer); + let mut var_alias = ::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + let mut var_deviceModel = >::sse_decode(deserializer); + let mut var_deviceType = >::sse_decode(deserializer); + let mut var_token = ::sse_decode(deserializer); + return crate::api::webrtc::ClientInfo { + id: var_id, + alias: var_alias, + version: var_version, + device_model: var_deviceModel, + device_type: var_deviceType, + token: var_token, + }; + } +} + +impl SseDecode for crate::api::webrtc::ClientInfoWithoutId { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_alias = ::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + let mut var_deviceModel = >::sse_decode(deserializer); + let mut var_deviceType = >::sse_decode(deserializer); + let mut var_token = ::sse_decode(deserializer); + return crate::api::webrtc::ClientInfoWithoutId { + alias: var_alias, + version: var_version, + device_model: var_deviceModel, + device_type: var_deviceType, + token: var_token, + }; + } +} + +impl SseDecode for crate::api::model::DeviceType { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::model::DeviceType::Mobile, + 1 => crate::api::model::DeviceType::Desktop, + 2 => crate::api::model::DeviceType::Web, + 3 => crate::api::model::DeviceType::Headless, + 4 => crate::api::model::DeviceType::Server, + _ => unreachable!("Invalid variant for DeviceType: {}", inner), + }; + } +} + +impl SseDecode for crate::api::webrtc::ExpectingPublicKey { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_publicKey = ::sse_decode(deserializer); + let mut var_kind = ::sse_decode(deserializer); + return crate::api::webrtc::ExpectingPublicKey { + public_key: var_publicKey, + kind: var_kind, + }; + } +} + +impl SseDecode for crate::api::model::FileDto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_id = ::sse_decode(deserializer); + let mut var_fileName = ::sse_decode(deserializer); + let mut var_size = ::sse_decode(deserializer); + let mut var_fileType = ::sse_decode(deserializer); + let mut var_sha256 = >::sse_decode(deserializer); + let mut var_preview = >::sse_decode(deserializer); + let mut var_metadata = >::sse_decode(deserializer); + return crate::api::model::FileDto { + id: var_id, + file_name: var_fileName, + size: var_size, + file_type: var_fileType, + sha256: var_sha256, + preview: var_preview, + metadata: var_metadata, + }; + } +} + +impl SseDecode for crate::api::model::FileMetadata { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_modified = >::sse_decode(deserializer); + let mut var_accessed = >::sse_decode(deserializer); + return crate::api::model::FileMetadata { + modified: var_modified, + accessed: var_accessed, + }; + } +} + +impl SseDecode for i32 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_i32::().unwrap() + } +} + +impl SseDecode for isize { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_i64::().unwrap() as _ + } +} + +impl SseDecode for crate::api::crypto::KeyPair { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_privateKey = ::sse_decode(deserializer); + let mut var_publicKey = ::sse_decode(deserializer); + return crate::api::crypto::KeyPair { + private_key: var_privateKey, + public_key: var_publicKey, + }; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for Vec<(String, crate::api::model::FileDto)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, crate::api::model::FileDto)>::sse_decode( + deserializer, + )); + } + return ans_; + } +} + +impl SseDecode for Vec<(String, String)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, String)>::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for crate::api::http::LsHttpClientVersion { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::http::LsHttpClientVersion::V2, + 1 => crate::api::http::LsHttpClientVersion::V3, + _ => unreachable!("Invalid variant for LsHttpClientVersion: {}", inner), + }; + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } + } +} + +impl SseDecode for crate::api::webrtc::PinConfig { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_pin = ::sse_decode(deserializer); + let mut var_maxTries = ::sse_decode(deserializer); + return crate::api::webrtc::PinConfig { + pin: var_pin, + max_tries: var_maxTries, + }; + } +} + +impl SseDecode for crate::api::model::PrepareUploadRequestDto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_info = ::sse_decode(deserializer); + let mut var_files = + >::sse_decode( + deserializer, + ); + return crate::api::model::PrepareUploadRequestDto { + info: var_info, + files: var_files, + }; + } +} + +impl SseDecode for crate::api::model::PrepareUploadResponseDto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_sessionId = ::sse_decode(deserializer); + let mut var_files = >::sse_decode(deserializer); + return crate::api::model::PrepareUploadResponseDto { + session_id: var_sessionId, + files: var_files, + }; + } +} + +impl SseDecode for crate::api::http::PrepareUploadResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_statusCode = ::sse_decode(deserializer); + let mut var_response = + >::sse_decode(deserializer); + return crate::api::http::PrepareUploadResult { + status_code: var_statusCode, + response: var_response, + }; + } +} + +impl SseDecode for crate::api::webrtc::ProposingClientInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_alias = ::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + let mut var_deviceModel = >::sse_decode(deserializer); + let mut var_deviceType = >::sse_decode(deserializer); + return crate::api::webrtc::ProposingClientInfo { + alias: var_alias, + version: var_version, + device_model: var_deviceModel, + device_type: var_deviceType, + }; + } +} + +impl SseDecode for crate::api::model::ProtocolType { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::model::ProtocolType::Http, + 1 => crate::api::model::ProtocolType::Https, + _ => unreachable!("Invalid variant for ProtocolType: {}", inner), + }; + } +} + +impl SseDecode for (Dart2RustStreamSink, Dart2RustStreamReceiver) { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); + } +} + +impl SseDecode for (String, crate::api::model::FileDto) { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); + } +} + +impl SseDecode for (String, String) { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); + } +} + +impl SseDecode for crate::api::model::RegisterDto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_alias = ::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + let mut var_deviceModel = >::sse_decode(deserializer); + let mut var_deviceType = >::sse_decode(deserializer); + let mut var_token = ::sse_decode(deserializer); + let mut var_port = ::sse_decode(deserializer); + let mut var_protocol = ::sse_decode(deserializer); + let mut var_hasWebInterface = ::sse_decode(deserializer); + return crate::api::model::RegisterDto { + alias: var_alias, + version: var_version, + device_model: var_deviceModel, + device_type: var_deviceType, + token: var_token, + port: var_port, + protocol: var_protocol, + has_web_interface: var_hasWebInterface, + }; + } +} + +impl SseDecode for crate::api::model::RegisterResponseDto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_alias = ::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + let mut var_deviceModel = >::sse_decode(deserializer); + let mut var_deviceType = >::sse_decode(deserializer); + let mut var_token = ::sse_decode(deserializer); + let mut var_hasWebInterface = ::sse_decode(deserializer); + return crate::api::model::RegisterResponseDto { + alias: var_alias, + version: var_version, + device_model: var_deviceModel, + device_type: var_deviceType, + token: var_token, + has_web_interface: var_hasWebInterface, + }; + } +} + +impl SseDecode for crate::api::http::ResultWithPublicKeyRegisterResponseDto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_publicKey = >::sse_decode(deserializer); + let mut var_body = ::sse_decode(deserializer); + return crate::api::http::ResultWithPublicKeyRegisterResponseDto { + public_key: var_publicKey, + body: var_body, + }; + } +} + +impl SseDecode for crate::api::http::RsHttpClientError { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_status = ::sse_decode(deserializer); + let mut var_message = >::sse_decode(deserializer); + return crate::api::http::RsHttpClientError::StatusCode { + status: var_status, + message: var_message, + }; + } + 1 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::http::RsHttpClientError::Reqwest(var_field0); + } + 2 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::http::RsHttpClientError::Json(var_field0); + } + 3 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::http::RsHttpClientError::Io(var_field0); + } + 4 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::http::RsHttpClientError::Other(var_field0); + } + _ => { + unimplemented!(""); + } + } + } +} + +impl SseDecode for crate::api::webrtc::RTCFileError { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_fileId = ::sse_decode(deserializer); + let mut var_error = ::sse_decode(deserializer); + return crate::api::webrtc::RTCFileError { + file_id: var_fileId, + error: var_error, + }; + } +} + +impl SseDecode for crate::api::webrtc::RTCSendFileResponse { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_id = ::sse_decode(deserializer); + let mut var_success = ::sse_decode(deserializer); + let mut var_error = >::sse_decode(deserializer); + return crate::api::webrtc::RTCSendFileResponse { + id: var_id, + success: var_success, + error: var_error, + }; + } +} + +impl SseDecode for crate::api::webrtc::RTCStatus { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + return crate::api::webrtc::RTCStatus::SdpExchanged; + } + 1 => { + return crate::api::webrtc::RTCStatus::Connected; + } + 2 => { + return crate::api::webrtc::RTCStatus::PinRequired; + } + 3 => { + return crate::api::webrtc::RTCStatus::TooManyAttempts; + } + 4 => { + return crate::api::webrtc::RTCStatus::Declined; + } + 5 => { + return crate::api::webrtc::RTCStatus::Sending; + } + 6 => { + return crate::api::webrtc::RTCStatus::Finished; + } + 7 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::webrtc::RTCStatus::Error(var_field0); + } + _ => { + unimplemented!(""); + } + } + } +} + +impl SseDecode for u16 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_u16::().unwrap() + } +} + +impl SseDecode for u64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_u64::().unwrap() + } +} + +impl SseDecode for u8 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_u8().unwrap() + } +} + +impl SseDecode for () { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {} +} + +impl SseDecode for usize { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_u64::().unwrap() as _ + } +} + +impl SseDecode for crate::api::webrtc::WsServerMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_client = ::sse_decode(deserializer); + let mut var_peers = >::sse_decode(deserializer); + return crate::api::webrtc::WsServerMessage::Hello { + client: var_client, + peers: var_peers, + }; + } + 1 => { + let mut var_peer = ::sse_decode(deserializer); + return crate::api::webrtc::WsServerMessage::Join { peer: var_peer }; + } + 2 => { + let mut var_peer = ::sse_decode(deserializer); + return crate::api::webrtc::WsServerMessage::Update { peer: var_peer }; + } + 3 => { + let mut var_peerId = ::sse_decode(deserializer); + return crate::api::webrtc::WsServerMessage::Left { + peer_id: var_peerId, + }; + } + 4 => { + let mut var_field0 = + ::sse_decode(deserializer); + return crate::api::webrtc::WsServerMessage::Offer(var_field0); + } + 5 => { + let mut var_field0 = + ::sse_decode(deserializer); + return crate::api::webrtc::WsServerMessage::Answer(var_field0); + } + 6 => { + let mut var_code = ::sse_decode(deserializer); + return crate::api::webrtc::WsServerMessage::Error { code: var_code }; + } + _ => { + unimplemented!(""); + } + } + } +} + +impl SseDecode for crate::api::webrtc::WsServerSdpMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_peer = ::sse_decode(deserializer); + let mut var_sessionId = ::sse_decode(deserializer); + let mut var_sdp = ::sse_decode(deserializer); + return crate::api::webrtc::WsServerSdpMessage { + peer: var_peer, + session_id: var_sessionId, + sdp: var_sdp, + }; + } +} + +fn pde_ffi_dispatcher_primary_impl( + func_id: i32, + port: flutter_rust_bridge::for_generated::MessagePort, + ptr: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len: i32, + data_len: i32, +) { + // Codec=Pde (Serialization + dispatch), see doc to use other codecs + match func_id { + 1 => wire__crate__api__stream__Dart2RustStreamSink_add_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 2 => wire__crate__api__webrtc__LsSignalingConnection_accept_offer_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 3 => wire__crate__api__webrtc__LsSignalingConnection_send_offer_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 4 => wire__crate__api__webrtc__LsSignalingConnection_update_info_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 5 => wire__crate__api__http__RsHttpClient_cancel_impl(port, ptr, rust_vec_len, data_len), + 6 => wire__crate__api__http__RsHttpClient_prepare_upload_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 7 => wire__crate__api__http__RsHttpClient_register_impl(port, ptr, rust_vec_len, data_len), + 8 => wire__crate__api__http__RsHttpClient_upload_impl(port, ptr, rust_vec_len, data_len), + 9 => wire__crate__api__webrtc__RtcFileReceiver_get_file_id_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 10 => wire__crate__api__webrtc__RtcFileReceiver_receive_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 11 => wire__crate__api__webrtc__RtcFileSender_send_impl(port, ptr, rust_vec_len, data_len), + 12 => wire__crate__api__webrtc__RtcReceiveController_decline_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 13 => wire__crate__api__webrtc__RtcReceiveController_listen_error_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 14 => wire__crate__api__webrtc__RtcReceiveController_listen_files_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 15 => wire__crate__api__webrtc__RtcReceiveController_listen_receiving_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 16 => wire__crate__api__webrtc__RtcReceiveController_listen_status_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 17 => wire__crate__api__webrtc__RtcReceiveController_send_file_status_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 18 => wire__crate__api__webrtc__RtcReceiveController_send_pin_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 19 => wire__crate__api__webrtc__RtcReceiveController_send_selection_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 20 => wire__crate__api__webrtc__RtcSendController_listen_error_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 21 => wire__crate__api__webrtc__RtcSendController_listen_selected_files_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 22 => wire__crate__api__webrtc__RtcSendController_listen_status_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 23 => wire__crate__api__webrtc__RtcSendController_send_file_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 24 => wire__crate__api__webrtc__RtcSendController_send_pin_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 25 => wire__crate__api__webrtc__connect_impl(port, ptr, rust_vec_len, data_len), + 27 => wire__crate__api__stream__create_stream_impl(port, ptr, rust_vec_len, data_len), + 28 => { + wire__crate__api__logging__enable_debug_logging_impl(port, ptr, rust_vec_len, data_len) + } + 29 => wire__crate__api__crypto__generate_key_pair_impl(port, ptr, rust_vec_len, data_len), + 30 => wire__crate__api__crypto__verify_cert_impl(port, ptr, rust_vec_len, data_len), + _ => unreachable!(), + } +} + +fn pde_ffi_dispatcher_sync_impl( + func_id: i32, + ptr: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len: i32, + data_len: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + // Codec=Pde (Serialization + dispatch), see doc to use other codecs + match func_id { + 26 => wire__crate__api__http__create_client_impl(ptr, rust_vec_len, data_len), + _ => unreachable!(), + } +} + +// Section: rust2dart + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} + +impl flutter_rust_bridge::IntoIntoDart> + for Dart2RustStreamReceiver +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} + +impl flutter_rust_bridge::IntoIntoDart> for Dart2RustStreamSink { + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} + +impl flutter_rust_bridge::IntoIntoDart> + for LsSignalingConnection +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} + +impl flutter_rust_bridge::IntoIntoDart> for RTCFileReceiver { + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} + +impl flutter_rust_bridge::IntoIntoDart> for RTCFileSender { + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} + +impl flutter_rust_bridge::IntoIntoDart> for RTCReceiveController { + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} + +impl flutter_rust_bridge::IntoIntoDart> for RTCSendController { + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} + +impl flutter_rust_bridge::IntoIntoDart> for RsHttpClient { + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.id.into_into_dart().into_dart(), + self.0.alias.into_into_dart().into_dart(), + self.0.version.into_into_dart().into_dart(), + self.0.device_model.into_into_dart().into_dart(), + self.0.device_type.into_into_dart().into_dart(), + self.0.token.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::webrtc::ClientInfo +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.alias.into_into_dart().into_dart(), + self.0.version.into_into_dart().into_dart(), + self.0.device_model.into_into_dart().into_dart(), + self.0.device_type.into_into_dart().into_dart(), + self.0.token.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::webrtc::ClientInfoWithoutId +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self.0 { + crate::api::model::DeviceType::Mobile => 0.into_dart(), + crate::api::model::DeviceType::Desktop => 1.into_dart(), + crate::api::model::DeviceType::Web => 2.into_dart(), + crate::api::model::DeviceType::Headless => 3.into_dart(), + crate::api::model::DeviceType::Server => 4.into_dart(), + _ => unreachable!(), + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::model::DeviceType +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::webrtc::ExpectingPublicKey { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.public_key.into_into_dart().into_dart(), + self.kind.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::webrtc::ExpectingPublicKey +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::webrtc::ExpectingPublicKey +{ + fn into_into_dart(self) -> crate::api::webrtc::ExpectingPublicKey { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.id.into_into_dart().into_dart(), + self.0.file_name.into_into_dart().into_dart(), + self.0.size.into_into_dart().into_dart(), + self.0.file_type.into_into_dart().into_dart(), + self.0.sha256.into_into_dart().into_dart(), + self.0.preview.into_into_dart().into_dart(), + self.0.metadata.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::model::FileDto +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.modified.into_into_dart().into_dart(), + self.0.accessed.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::model::FileMetadata +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::crypto::KeyPair { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.private_key.into_into_dart().into_dart(), + self.public_key.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::crypto::KeyPair {} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::crypto::KeyPair +{ + fn into_into_dart(self) -> crate::api::crypto::KeyPair { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self.0 { + crate::api::http::LsHttpClientVersion::V2 => 0.into_dart(), + crate::api::http::LsHttpClientVersion::V3 => 1.into_dart(), + _ => unreachable!(), + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::http::LsHttpClientVersion +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.pin.into_into_dart().into_dart(), + self.0.max_tries.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::webrtc::PinConfig +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.info.into_into_dart().into_dart(), + self.0.files.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::model::PrepareUploadRequestDto +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.session_id.into_into_dart().into_dart(), + self.0.files.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::model::PrepareUploadResponseDto +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.status_code.into_into_dart().into_dart(), + self.0.response.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::http::PrepareUploadResult +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::webrtc::ProposingClientInfo { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.alias.into_into_dart().into_dart(), + self.version.into_into_dart().into_dart(), + self.device_model.into_into_dart().into_dart(), + self.device_type.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::webrtc::ProposingClientInfo +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::webrtc::ProposingClientInfo +{ + fn into_into_dart(self) -> crate::api::webrtc::ProposingClientInfo { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self.0 { + crate::api::model::ProtocolType::Http => 0.into_dart(), + crate::api::model::ProtocolType::Https => 1.into_dart(), + _ => unreachable!(), + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::model::ProtocolType +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.alias.into_into_dart().into_dart(), + self.0.version.into_into_dart().into_dart(), + self.0.device_model.into_into_dart().into_dart(), + self.0.device_type.into_into_dart().into_dart(), + self.0.token.into_into_dart().into_dart(), + self.0.port.into_into_dart().into_dart(), + self.0.protocol.into_into_dart().into_dart(), + self.0.has_web_interface.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::model::RegisterDto +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.alias.into_into_dart().into_dart(), + self.0.version.into_into_dart().into_dart(), + self.0.device_model.into_into_dart().into_dart(), + self.0.device_type.into_into_dart().into_dart(), + self.0.token.into_into_dart().into_dart(), + self.0.has_web_interface.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::model::RegisterResponseDto +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::http::ResultWithPublicKeyRegisterResponseDto { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.public_key.into_into_dart().into_dart(), + self.body.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::http::ResultWithPublicKeyRegisterResponseDto +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::http::ResultWithPublicKeyRegisterResponseDto +{ + fn into_into_dart(self) -> crate::api::http::ResultWithPublicKeyRegisterResponseDto { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::http::RsHttpClientError { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + crate::api::http::RsHttpClientError::StatusCode { status, message } => [ + 0.into_dart(), + status.into_into_dart().into_dart(), + message.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::http::RsHttpClientError::Reqwest(field0) => { + [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::http::RsHttpClientError::Json(field0) => { + [2.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::http::RsHttpClientError::Io(field0) => { + [3.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::http::RsHttpClientError::Other(field0) => { + [4.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::http::RsHttpClientError +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::http::RsHttpClientError +{ + fn into_into_dart(self) -> crate::api::http::RsHttpClientError { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.file_id.into_into_dart().into_dart(), + self.0.error.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::webrtc::RTCFileError +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.id.into_into_dart().into_dart(), + self.0.success.into_into_dart().into_dart(), + self.0.error.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::webrtc::RTCSendFileResponse +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self.0 { + crate::api::webrtc::RTCStatus::SdpExchanged => [0.into_dart()].into_dart(), + crate::api::webrtc::RTCStatus::Connected => [1.into_dart()].into_dart(), + crate::api::webrtc::RTCStatus::PinRequired => [2.into_dart()].into_dart(), + crate::api::webrtc::RTCStatus::TooManyAttempts => [3.into_dart()].into_dart(), + crate::api::webrtc::RTCStatus::Declined => [4.into_dart()].into_dart(), + crate::api::webrtc::RTCStatus::Sending => [5.into_dart()].into_dart(), + crate::api::webrtc::RTCStatus::Finished => [6.into_dart()].into_dart(), + crate::api::webrtc::RTCStatus::Error(field0) => { + [7.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::webrtc::RTCStatus +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self.0 { + crate::api::webrtc::WsServerMessage::Hello { client, peers } => [ + 0.into_dart(), + client.into_into_dart().into_dart(), + peers.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::webrtc::WsServerMessage::Join { peer } => { + [1.into_dart(), peer.into_into_dart().into_dart()].into_dart() + } + crate::api::webrtc::WsServerMessage::Update { peer } => { + [2.into_dart(), peer.into_into_dart().into_dart()].into_dart() + } + crate::api::webrtc::WsServerMessage::Left { peer_id } => { + [3.into_dart(), peer_id.into_into_dart().into_dart()].into_dart() + } + crate::api::webrtc::WsServerMessage::Offer(field0) => { + [4.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::webrtc::WsServerMessage::Answer(field0) => { + [5.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::webrtc::WsServerMessage::Error { code } => { + [6.into_dart(), code.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::webrtc::WsServerMessage +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.peer.into_into_dart().into_dart(), + self.0.session_id.into_into_dart().into_dart(), + self.0.sdp.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::webrtc::WsServerSdpMessage +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +impl SseEncode for flutter_rust_bridge::for_generated::anyhow::Error { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(format!("{:?}", self), serializer); + } +} + +impl SseEncode for Dart2RustStreamReceiver { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); + } +} + +impl SseEncode for Dart2RustStreamSink { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } +} + +impl SseEncode for LsSignalingConnection { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); + } +} + +impl SseEncode for RTCFileReceiver { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } +} + +impl SseEncode for RTCFileSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } +} + +impl SseEncode for RTCReceiveController { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); + } +} + +impl SseEncode for RTCSendController { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } +} + +impl SseEncode for RsHttpClient { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } +} + +impl SseEncode for flutter_rust_bridge::DartOpaque { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.encode(), serializer); + } +} + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.into_iter().collect(), serializer); + } +} + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.into_iter().collect(), + serializer, + ); + } +} + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + +impl SseEncode for std::collections::HashSet { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.into_iter().collect(), serializer); + } +} + +impl SseEncode for StreamSink { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + unimplemented!("") + } +} + +impl SseEncode for StreamSink, flutter_rust_bridge::for_generated::SseCodec> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + unimplemented!("") + } +} + +impl SseEncode + for StreamSink +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + unimplemented!("") + } +} + +impl SseEncode + for StreamSink +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + unimplemented!("") + } +} + +impl SseEncode + for StreamSink< + crate::api::webrtc::WsServerMessage, + flutter_rust_bridge::for_generated::SseCodec, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + unimplemented!("") + } +} + +impl SseEncode for String { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.into_bytes(), serializer); + } +} + +impl SseEncode for uuid::Uuid { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.as_bytes().to_vec(), serializer); + } +} + +impl SseEncode for bool { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u8(self as _).unwrap(); + } +} + +impl SseEncode for crate::api::webrtc::ClientInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.id, serializer); + ::sse_encode(self.alias, serializer); + ::sse_encode(self.version, serializer); + >::sse_encode(self.device_model, serializer); + >::sse_encode(self.device_type, serializer); + ::sse_encode(self.token, serializer); + } +} + +impl SseEncode for crate::api::webrtc::ClientInfoWithoutId { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.alias, serializer); + ::sse_encode(self.version, serializer); + >::sse_encode(self.device_model, serializer); + >::sse_encode(self.device_type, serializer); + ::sse_encode(self.token, serializer); + } +} + +impl SseEncode for crate::api::model::DeviceType { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode( + match self { + crate::api::model::DeviceType::Mobile => 0, + crate::api::model::DeviceType::Desktop => 1, + crate::api::model::DeviceType::Web => 2, + crate::api::model::DeviceType::Headless => 3, + crate::api::model::DeviceType::Server => 4, + _ => { + unimplemented!(""); + } + }, + serializer, + ); + } +} + +impl SseEncode for crate::api::webrtc::ExpectingPublicKey { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.public_key, serializer); + ::sse_encode(self.kind, serializer); + } +} + +impl SseEncode for crate::api::model::FileDto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.id, serializer); + ::sse_encode(self.file_name, serializer); + ::sse_encode(self.size, serializer); + ::sse_encode(self.file_type, serializer); + >::sse_encode(self.sha256, serializer); + >::sse_encode(self.preview, serializer); + >::sse_encode(self.metadata, serializer); + } +} + +impl SseEncode for crate::api::model::FileMetadata { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.modified, serializer); + >::sse_encode(self.accessed, serializer); + } +} + +impl SseEncode for i32 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_i32::(self).unwrap(); + } +} + +impl SseEncode for isize { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer + .cursor + .write_i64::(self as _) + .unwrap(); + } +} + +impl SseEncode for crate::api::crypto::KeyPair { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.private_key, serializer); + ::sse_encode(self.public_key, serializer); + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode for Vec<(String, crate::api::model::FileDto)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, crate::api::model::FileDto)>::sse_encode(item, serializer); + } + } +} + +impl SseEncode for Vec<(String, String)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, String)>::sse_encode(item, serializer); + } + } +} + +impl SseEncode for crate::api::http::LsHttpClientVersion { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode( + match self { + crate::api::http::LsHttpClientVersion::V2 => 0, + crate::api::http::LsHttpClientVersion::V3 => 1, + _ => { + unimplemented!(""); + } + }, + serializer, + ); + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for crate::api::webrtc::PinConfig { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.pin, serializer); + ::sse_encode(self.max_tries, serializer); + } +} + +impl SseEncode for crate::api::model::PrepareUploadRequestDto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.info, serializer); + >::sse_encode( + self.files, serializer, + ); + } +} + +impl SseEncode for crate::api::model::PrepareUploadResponseDto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.session_id, serializer); + >::sse_encode(self.files, serializer); + } +} + +impl SseEncode for crate::api::http::PrepareUploadResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.status_code, serializer); + >::sse_encode( + self.response, + serializer, + ); + } +} + +impl SseEncode for crate::api::webrtc::ProposingClientInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.alias, serializer); + ::sse_encode(self.version, serializer); + >::sse_encode(self.device_model, serializer); + >::sse_encode(self.device_type, serializer); + } +} + +impl SseEncode for crate::api::model::ProtocolType { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode( + match self { + crate::api::model::ProtocolType::Http => 0, + crate::api::model::ProtocolType::Https => 1, + _ => { + unimplemented!(""); + } + }, + serializer, + ); + } +} + +impl SseEncode for (Dart2RustStreamSink, Dart2RustStreamReceiver) { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); + } +} + +impl SseEncode for (String, crate::api::model::FileDto) { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); + } +} + +impl SseEncode for (String, String) { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); + } +} + +impl SseEncode for crate::api::model::RegisterDto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.alias, serializer); + ::sse_encode(self.version, serializer); + >::sse_encode(self.device_model, serializer); + >::sse_encode(self.device_type, serializer); + ::sse_encode(self.token, serializer); + ::sse_encode(self.port, serializer); + ::sse_encode(self.protocol, serializer); + ::sse_encode(self.has_web_interface, serializer); + } +} + +impl SseEncode for crate::api::model::RegisterResponseDto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.alias, serializer); + ::sse_encode(self.version, serializer); + >::sse_encode(self.device_model, serializer); + >::sse_encode(self.device_type, serializer); + ::sse_encode(self.token, serializer); + ::sse_encode(self.has_web_interface, serializer); + } +} + +impl SseEncode for crate::api::http::ResultWithPublicKeyRegisterResponseDto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.public_key, serializer); + ::sse_encode(self.body, serializer); + } +} + +impl SseEncode for crate::api::http::RsHttpClientError { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self { + crate::api::http::RsHttpClientError::StatusCode { status, message } => { + ::sse_encode(0, serializer); + ::sse_encode(status, serializer); + >::sse_encode(message, serializer); + } + crate::api::http::RsHttpClientError::Reqwest(field0) => { + ::sse_encode(1, serializer); + ::sse_encode(field0, serializer); + } + crate::api::http::RsHttpClientError::Json(field0) => { + ::sse_encode(2, serializer); + ::sse_encode(field0, serializer); + } + crate::api::http::RsHttpClientError::Io(field0) => { + ::sse_encode(3, serializer); + ::sse_encode(field0, serializer); + } + crate::api::http::RsHttpClientError::Other(field0) => { + ::sse_encode(4, serializer); + ::sse_encode(field0, serializer); + } + _ => { + unimplemented!(""); + } + } + } +} + +impl SseEncode for crate::api::webrtc::RTCFileError { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.file_id, serializer); + ::sse_encode(self.error, serializer); + } +} + +impl SseEncode for crate::api::webrtc::RTCSendFileResponse { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.id, serializer); + ::sse_encode(self.success, serializer); + >::sse_encode(self.error, serializer); + } +} + +impl SseEncode for crate::api::webrtc::RTCStatus { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self { + crate::api::webrtc::RTCStatus::SdpExchanged => { + ::sse_encode(0, serializer); + } + crate::api::webrtc::RTCStatus::Connected => { + ::sse_encode(1, serializer); + } + crate::api::webrtc::RTCStatus::PinRequired => { + ::sse_encode(2, serializer); + } + crate::api::webrtc::RTCStatus::TooManyAttempts => { + ::sse_encode(3, serializer); + } + crate::api::webrtc::RTCStatus::Declined => { + ::sse_encode(4, serializer); + } + crate::api::webrtc::RTCStatus::Sending => { + ::sse_encode(5, serializer); + } + crate::api::webrtc::RTCStatus::Finished => { + ::sse_encode(6, serializer); + } + crate::api::webrtc::RTCStatus::Error(field0) => { + ::sse_encode(7, serializer); + ::sse_encode(field0, serializer); + } + _ => { + unimplemented!(""); + } + } + } +} + +impl SseEncode for u16 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u16::(self).unwrap(); + } +} + +impl SseEncode for u64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u64::(self).unwrap(); + } +} + +impl SseEncode for u8 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u8(self).unwrap(); + } +} + +impl SseEncode for () { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} +} + +impl SseEncode for usize { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer + .cursor + .write_u64::(self as _) + .unwrap(); + } +} + +impl SseEncode for crate::api::webrtc::WsServerMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self { + crate::api::webrtc::WsServerMessage::Hello { client, peers } => { + ::sse_encode(0, serializer); + ::sse_encode(client, serializer); + >::sse_encode(peers, serializer); + } + crate::api::webrtc::WsServerMessage::Join { peer } => { + ::sse_encode(1, serializer); + ::sse_encode(peer, serializer); + } + crate::api::webrtc::WsServerMessage::Update { peer } => { + ::sse_encode(2, serializer); + ::sse_encode(peer, serializer); + } + crate::api::webrtc::WsServerMessage::Left { peer_id } => { + ::sse_encode(3, serializer); + ::sse_encode(peer_id, serializer); + } + crate::api::webrtc::WsServerMessage::Offer(field0) => { + ::sse_encode(4, serializer); + ::sse_encode(field0, serializer); + } + crate::api::webrtc::WsServerMessage::Answer(field0) => { + ::sse_encode(5, serializer); + ::sse_encode(field0, serializer); + } + crate::api::webrtc::WsServerMessage::Error { code } => { + ::sse_encode(6, serializer); + ::sse_encode(code, serializer); + } + _ => { + unimplemented!(""); + } + } + } +} + +impl SseEncode for crate::api::webrtc::WsServerSdpMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.peer, serializer); + ::sse_encode(self.session_id, serializer); + ::sse_encode(self.sdp, serializer); + } +} + +#[cfg(not(target_family = "wasm"))] +mod io { + // This file is automatically generated, so please do not edit it. + // @generated by `flutter_rust_bridge`@ 2.11.1. + + // Section: imports + + use super::*; + use crate::api::http::*; + use crate::api::stream::*; + use crate::api::webrtc::*; + use flutter_rust_bridge::for_generated::byteorder::{ + NativeEndian, ReadBytesExt, WriteBytesExt, + }; + use flutter_rust_bridge::for_generated::{transform_result_dco, Lifetimeable, Lockable}; + use flutter_rust_bridge::{Handler, IntoIntoDart}; + + // Section: boilerplate + + flutter_rust_bridge::frb_generated_boilerplate_io!(); + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_localsend_app_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } +} +#[cfg(not(target_family = "wasm"))] +pub use io::*; + +/// cbindgen:ignore +#[cfg(target_family = "wasm")] +mod web { + // This file is automatically generated, so please do not edit it. + // @generated by `flutter_rust_bridge`@ 2.11.1. + + // Section: imports + + use super::*; + use crate::api::http::*; + use crate::api::stream::*; + use crate::api::webrtc::*; + use flutter_rust_bridge::for_generated::byteorder::{ + NativeEndian, ReadBytesExt, WriteBytesExt, + }; + use flutter_rust_bridge::for_generated::wasm_bindgen; + use flutter_rust_bridge::for_generated::wasm_bindgen::prelude::*; + use flutter_rust_bridge::for_generated::{transform_result_dco, Lifetimeable, Lockable}; + use flutter_rust_bridge::{Handler, IntoIntoDart}; + + // Section: boilerplate + + flutter_rust_bridge::frb_generated_boilerplate_web!(); + + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamReceiver( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDart2RustStreamSink( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLsSignalingConnection( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileReceiver( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCFileSender( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCReceiveController( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRTCSendController( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerRsHttpClient( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } +} +#[cfg(target_family = "wasm")] +pub use web::*; diff --git a/app/rust/src/lib.rs b/app/rust/src/lib.rs new file mode 100644 index 0000000..0f7ab0a --- /dev/null +++ b/app/rust/src/lib.rs @@ -0,0 +1,3 @@ +pub mod api; +mod frb_generated; +mod util; diff --git a/app/rust/src/util/bytes.rs b/app/rust/src/util/bytes.rs new file mode 100644 index 0000000..1e6f745 --- /dev/null +++ b/app/rust/src/util/bytes.rs @@ -0,0 +1,35 @@ +use bytes::{Bytes, BytesMut}; +use tokio::sync::mpsc; + +/// Converts a stream of Bytes into a stream of Vec. +/// Also buffers the incoming data to reduce the number of +/// messages sent to the receiver. +pub(crate) async fn buffer_receiver( + mut rx_input: mpsc::Receiver, +) -> mpsc::Receiver> { + const BUFFER_SIZE: usize = 1024 * 1024; // 1 MB + let mut buffer = BytesMut::with_capacity(BUFFER_SIZE); + + let (tx, rx) = mpsc::channel(1); + + tokio::spawn(async move { + while let Some(data) = rx_input.recv().await { + buffer.extend_from_slice(&data); + + if buffer.len() >= BUFFER_SIZE { + let data = buffer.to_vec(); + buffer.clear(); + tx.send(data).await?; + } + } + + if !buffer.is_empty() { + let data = buffer.to_vec(); + tx.send(data).await?; + } + + Ok::<(), anyhow::Error>(()) + }); + + rx +} diff --git a/app/rust/src/util/mod.rs b/app/rust/src/util/mod.rs new file mode 100644 index 0000000..14e4949 --- /dev/null +++ b/app/rust/src/util/mod.rs @@ -0,0 +1 @@ +pub(crate) mod bytes; diff --git a/app/rust_builder/.gitignore b/app/rust_builder/.gitignore new file mode 100644 index 0000000..ac5aa98 --- /dev/null +++ b/app/rust_builder/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/app/rust_builder/README.md b/app/rust_builder/README.md new file mode 100644 index 0000000..922615f --- /dev/null +++ b/app/rust_builder/README.md @@ -0,0 +1 @@ +Please ignore this folder, which is just glue to build Rust with Flutter. \ No newline at end of file diff --git a/app/rust_builder/android/.gitignore b/app/rust_builder/android/.gitignore new file mode 100644 index 0000000..161bdcd --- /dev/null +++ b/app/rust_builder/android/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.cxx diff --git a/app/rust_builder/android/build.gradle b/app/rust_builder/android/build.gradle new file mode 100644 index 0000000..da27609 --- /dev/null +++ b/app/rust_builder/android/build.gradle @@ -0,0 +1,56 @@ +// The Android Gradle Plugin builds the native code with the Android NDK. + +group 'com.flutter_rust_bridge.rust_lib_localsend_app' +version '1.0' + +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + // The Android Gradle Plugin knows how to build native code with the NDK. + classpath 'com.android.tools.build:gradle:7.3.0' + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: 'com.android.library' + +android { + if (project.android.hasProperty("namespace")) { + namespace 'com.flutter_rust_bridge.rust_lib_localsend_app' + } + + // Bumping the plugin compileSdkVersion requires all clients of this plugin + // to bump the version in their app. + compileSdkVersion 33 + + // Use the NDK version + // declared in /android/app/build.gradle file of the Flutter project. + // Replace it with a version number if this plugin requires a specfic NDK version. + // (e.g. ndkVersion "23.1.7779620") + ndkVersion android.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + minSdkVersion 19 + } +} + +apply from: "../cargokit/gradle/plugin.gradle" +cargokit { + manifestDir = "../../rust" + libname = "rust_lib_localsend_app" +} diff --git a/app/rust_builder/android/settings.gradle b/app/rust_builder/android/settings.gradle new file mode 100644 index 0000000..0e797a3 --- /dev/null +++ b/app/rust_builder/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'rust_lib_localsend_app' diff --git a/app/rust_builder/android/src/main/AndroidManifest.xml b/app/rust_builder/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..3329401 --- /dev/null +++ b/app/rust_builder/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/app/rust_builder/cargokit/.gitignore b/app/rust_builder/cargokit/.gitignore new file mode 100644 index 0000000..cf7bb86 --- /dev/null +++ b/app/rust_builder/cargokit/.gitignore @@ -0,0 +1,4 @@ +target +.dart_tool +*.iml +!pubspec.lock diff --git a/app/rust_builder/cargokit/LICENSE b/app/rust_builder/cargokit/LICENSE new file mode 100644 index 0000000..d33a5fe --- /dev/null +++ b/app/rust_builder/cargokit/LICENSE @@ -0,0 +1,42 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +Copyright 2022 Matej Knopp + +================================================================================ + +MIT LICENSE + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +================================================================================ + +APACHE LICENSE, VERSION 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + diff --git a/app/rust_builder/cargokit/README b/app/rust_builder/cargokit/README new file mode 100644 index 0000000..398474d --- /dev/null +++ b/app/rust_builder/cargokit/README @@ -0,0 +1,11 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +Experimental repository to provide glue for seamlessly integrating cargo build +with flutter plugins and packages. + +See https://matejknopp.com/post/flutter_plugin_in_rust_with_no_prebuilt_binaries/ +for a tutorial on how to use Cargokit. + +Example plugin available at https://github.com/irondash/hello_rust_ffi_plugin. + diff --git a/app/rust_builder/cargokit/build_pod.sh b/app/rust_builder/cargokit/build_pod.sh new file mode 100644 index 0000000..ed0e0d9 --- /dev/null +++ b/app/rust_builder/cargokit/build_pod.sh @@ -0,0 +1,58 @@ +#!/bin/sh +set -e + +BASEDIR=$(dirname "$0") + +# Workaround for https://github.com/dart-lang/pub/issues/4010 +BASEDIR=$(cd "$BASEDIR" ; pwd -P) + +# Remove XCode SDK from path. Otherwise this breaks tool compilation when building iOS project +NEW_PATH=`echo $PATH | tr ":" "\n" | grep -v "Contents/Developer/" | tr "\n" ":"` + +export PATH=${NEW_PATH%?} # remove trailing : + +env + +# Platform name (macosx, iphoneos, iphonesimulator) +export CARGOKIT_DARWIN_PLATFORM_NAME=$PLATFORM_NAME + +# Arctive architectures (arm64, armv7, x86_64), space separated. +export CARGOKIT_DARWIN_ARCHS=$ARCHS + +# Current build configuration (Debug, Release) +export CARGOKIT_CONFIGURATION=$CONFIGURATION + +# Path to directory containing Cargo.toml. +export CARGOKIT_MANIFEST_DIR=$PODS_TARGET_SRCROOT/$1 + +# Temporary directory for build artifacts. +export CARGOKIT_TARGET_TEMP_DIR=$TARGET_TEMP_DIR + +# Output directory for final artifacts. +export CARGOKIT_OUTPUT_DIR=$PODS_CONFIGURATION_BUILD_DIR/$PRODUCT_NAME + +# Directory to store built tool artifacts. +export CARGOKIT_TOOL_TEMP_DIR=$TARGET_TEMP_DIR/build_tool + +# Directory inside root project. Not necessarily the top level directory of root project. +export CARGOKIT_ROOT_PROJECT_DIR=$SRCROOT + +FLUTTER_EXPORT_BUILD_ENVIRONMENT=( + "$PODS_ROOT/../Flutter/ephemeral/flutter_export_environment.sh" # macOS + "$PODS_ROOT/../Flutter/flutter_export_environment.sh" # iOS +) + +for path in "${FLUTTER_EXPORT_BUILD_ENVIRONMENT[@]}" +do + if [[ -f "$path" ]]; then + source "$path" + fi +done + +sh "$BASEDIR/run_build_tool.sh" build-pod "$@" + +# Make a symlink from built framework to phony file, which will be used as input to +# build script. This should force rebuild (podspec currently doesn't support alwaysOutOfDate +# attribute on custom build phase) +ln -fs "$OBJROOT/XCBuildData/build.db" "${BUILT_PRODUCTS_DIR}/cargokit_phony" +ln -fs "${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}" "${BUILT_PRODUCTS_DIR}/cargokit_phony_out" diff --git a/app/rust_builder/cargokit/build_tool/README.md b/app/rust_builder/cargokit/build_tool/README.md new file mode 100644 index 0000000..a878c27 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/README.md @@ -0,0 +1,5 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +A sample command-line application with an entrypoint in `bin/`, library code +in `lib/`, and example unit test in `test/`. diff --git a/app/rust_builder/cargokit/build_tool/analysis_options.yaml b/app/rust_builder/cargokit/build_tool/analysis_options.yaml new file mode 100644 index 0000000..0e16a8b --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/analysis_options.yaml @@ -0,0 +1,34 @@ +# This is copied from Cargokit (which is the official way to use it currently) +# Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +# This file configures the static analysis results for your project (errors, +# warnings, and lints). +# +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml + +# Uncomment the following section to specify additional rules. + +linter: + rules: + - prefer_relative_imports + - directives_ordering + +# analyzer: +# exclude: +# - path/to/excluded/files/** + +# For more information about the core and recommended set of lints, see +# https://dart.dev/go/core-lints + +# For additional information about configuring this file, see +# https://dart.dev/guides/language/analysis-options diff --git a/app/rust_builder/cargokit/build_tool/bin/build_tool.dart b/app/rust_builder/cargokit/build_tool/bin/build_tool.dart new file mode 100644 index 0000000..268eb52 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/bin/build_tool.dart @@ -0,0 +1,8 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'package:build_tool/build_tool.dart' as build_tool; + +void main(List arguments) { + build_tool.runMain(arguments); +} diff --git a/app/rust_builder/cargokit/build_tool/lib/build_tool.dart b/app/rust_builder/cargokit/build_tool/lib/build_tool.dart new file mode 100644 index 0000000..7c1bb75 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/build_tool.dart @@ -0,0 +1,8 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'src/build_tool.dart' as build_tool; + +Future runMain(List args) async { + return build_tool.runMain(args); +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/android_environment.dart b/app/rust_builder/cargokit/build_tool/lib/src/android_environment.dart new file mode 100644 index 0000000..15fc9ee --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/android_environment.dart @@ -0,0 +1,195 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; +import 'dart:isolate'; +import 'dart:math' as math; + +import 'package:collection/collection.dart'; +import 'package:path/path.dart' as path; +import 'package:version/version.dart'; + +import 'target.dart'; +import 'util.dart'; + +class AndroidEnvironment { + AndroidEnvironment({ + required this.sdkPath, + required this.ndkVersion, + required this.minSdkVersion, + required this.targetTempDir, + required this.target, + }); + + static void clangLinkerWrapper(List args) { + final clang = Platform.environment['_CARGOKIT_NDK_LINK_CLANG']; + if (clang == null) { + throw Exception( + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var"); + } + final target = Platform.environment['_CARGOKIT_NDK_LINK_TARGET']; + if (target == null) { + throw Exception( + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var"); + } + + runCommand(clang, [ + target, + ...args, + ]); + } + + /// Full path to Android SDK. + final String sdkPath; + + /// Full version of Android NDK. + final String ndkVersion; + + /// Minimum supported SDK version. + final int minSdkVersion; + + /// Target directory for build artifacts. + final String targetTempDir; + + /// Target being built. + final Target target; + + bool ndkIsInstalled() { + final ndkPath = path.join(sdkPath, 'ndk', ndkVersion); + final ndkPackageXml = File(path.join(ndkPath, 'package.xml')); + return ndkPackageXml.existsSync(); + } + + void installNdk({ + required String javaHome, + }) { + final sdkManagerExtension = Platform.isWindows ? '.bat' : ''; + final sdkManager = path.join( + sdkPath, + 'cmdline-tools', + 'latest', + 'bin', + 'sdkmanager$sdkManagerExtension', + ); + + log.info('Installing NDK $ndkVersion'); + runCommand(sdkManager, [ + '--install', + 'ndk;$ndkVersion', + ], environment: { + 'JAVA_HOME': javaHome, + }); + } + + Future> buildEnvironment() async { + final hostArch = Platform.isMacOS + ? "darwin-x86_64" + : (Platform.isLinux ? "linux-x86_64" : "windows-x86_64"); + + final ndkPath = path.join(sdkPath, 'ndk', ndkVersion); + final toolchainPath = path.join( + ndkPath, + 'toolchains', + 'llvm', + 'prebuilt', + hostArch, + 'bin', + ); + + final minSdkVersion = + math.max(target.androidMinSdkVersion!, this.minSdkVersion); + + final exe = Platform.isWindows ? '.exe' : ''; + + final arKey = 'AR_${target.rust}'; + final arValue = ['${target.rust}-ar', 'llvm-ar', 'llvm-ar.exe'] + .map((e) => path.join(toolchainPath, e)) + .firstWhereOrNull((element) => File(element).existsSync()); + if (arValue == null) { + throw Exception('Failed to find ar for $target in $toolchainPath'); + } + + final targetArg = '--target=${target.rust}$minSdkVersion'; + + final ccKey = 'CC_${target.rust}'; + final ccValue = path.join(toolchainPath, 'clang$exe'); + final cfFlagsKey = 'CFLAGS_${target.rust}'; + final cFlagsValue = targetArg; + + final cxxKey = 'CXX_${target.rust}'; + final cxxValue = path.join(toolchainPath, 'clang++$exe'); + final cxxFlagsKey = 'CXXFLAGS_${target.rust}'; + final cxxFlagsValue = targetArg; + + final linkerKey = + 'cargo_target_${target.rust.replaceAll('-', '_')}_linker'.toUpperCase(); + + final ranlibKey = 'RANLIB_${target.rust}'; + final ranlibValue = path.join(toolchainPath, 'llvm-ranlib$exe'); + + final ndkVersionParsed = Version.parse(ndkVersion); + final rustFlagsKey = 'CARGO_ENCODED_RUSTFLAGS'; + final rustFlagsValue = _libGccWorkaround(targetTempDir, ndkVersionParsed); + + final runRustTool = + Platform.isWindows ? 'run_build_tool.cmd' : 'run_build_tool.sh'; + + final packagePath = (await Isolate.resolvePackageUri( + Uri.parse('package:build_tool/buildtool.dart')))! + .toFilePath(); + final selfPath = path.canonicalize(path.join( + packagePath, + '..', + '..', + '..', + runRustTool, + )); + + // Make sure that run_build_tool is working properly even initially launched directly + // through dart run. + final toolTempDir = + Platform.environment['CARGOKIT_TOOL_TEMP_DIR'] ?? targetTempDir; + + return { + arKey: arValue, + ccKey: ccValue, + cfFlagsKey: cFlagsValue, + cxxKey: cxxValue, + cxxFlagsKey: cxxFlagsValue, + ranlibKey: ranlibValue, + rustFlagsKey: rustFlagsValue, + linkerKey: selfPath, + // Recognized by main() so we know when we're acting as a wrapper + '_CARGOKIT_NDK_LINK_TARGET': targetArg, + '_CARGOKIT_NDK_LINK_CLANG': ccValue, + 'CARGOKIT_TOOL_TEMP_DIR': toolTempDir, + }; + } + + // Workaround for libgcc missing in NDK23, inspired by cargo-ndk + String _libGccWorkaround(String buildDir, Version ndkVersion) { + final workaroundDir = path.join( + buildDir, + 'cargokit', + 'libgcc_workaround', + '${ndkVersion.major}', + ); + Directory(workaroundDir).createSync(recursive: true); + if (ndkVersion.major >= 23) { + File(path.join(workaroundDir, 'libgcc.a')) + .writeAsStringSync('INPUT(-lunwind)'); + } else { + // Other way around, untested, forward libgcc.a from libunwind once Rust + // gets updated for NDK23+. + File(path.join(workaroundDir, 'libunwind.a')) + .writeAsStringSync('INPUT(-lgcc)'); + } + + var rustFlags = Platform.environment['CARGO_ENCODED_RUSTFLAGS'] ?? ''; + if (rustFlags.isNotEmpty) { + rustFlags = '$rustFlags\x1f'; + } + rustFlags = '$rustFlags-L\x1f$workaroundDir'; + return rustFlags; + } +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart b/app/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart new file mode 100644 index 0000000..e608cec --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/artifacts_provider.dart @@ -0,0 +1,266 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:ed25519_edwards/ed25519_edwards.dart'; +import 'package:http/http.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; + +import 'builder.dart'; +import 'crate_hash.dart'; +import 'options.dart'; +import 'precompile_binaries.dart'; +import 'rustup.dart'; +import 'target.dart'; + +class Artifact { + /// File system location of the artifact. + final String path; + + /// Actual file name that the artifact should have in destination folder. + final String finalFileName; + + AritifactType get type { + if (finalFileName.endsWith('.dll') || + finalFileName.endsWith('.dll.lib') || + finalFileName.endsWith('.pdb') || + finalFileName.endsWith('.so') || + finalFileName.endsWith('.dylib')) { + return AritifactType.dylib; + } else if (finalFileName.endsWith('.lib') || finalFileName.endsWith('.a')) { + return AritifactType.staticlib; + } else { + throw Exception('Unknown artifact type for $finalFileName'); + } + } + + Artifact({ + required this.path, + required this.finalFileName, + }); +} + +final _log = Logger('artifacts_provider'); + +class ArtifactProvider { + ArtifactProvider({ + required this.environment, + required this.userOptions, + }); + + final BuildEnvironment environment; + final CargokitUserOptions userOptions; + + Future>> getArtifacts(List targets) async { + final result = await _getPrecompiledArtifacts(targets); + + final pendingTargets = List.of(targets); + pendingTargets.removeWhere((element) => result.containsKey(element)); + + if (pendingTargets.isEmpty) { + return result; + } + + final rustup = Rustup(); + for (final target in targets) { + final builder = RustBuilder(target: target, environment: environment); + builder.prepare(rustup); + _log.info('Building ${environment.crateInfo.packageName} for $target'); + final targetDir = await builder.build(); + // For local build accept both static and dynamic libraries. + final artifactNames = { + ...getArtifactNames( + target: target, + libraryName: environment.crateInfo.packageName, + aritifactType: AritifactType.dylib, + remote: false, + ), + ...getArtifactNames( + target: target, + libraryName: environment.crateInfo.packageName, + aritifactType: AritifactType.staticlib, + remote: false, + ) + }; + final artifacts = artifactNames + .map((artifactName) => Artifact( + path: path.join(targetDir, artifactName), + finalFileName: artifactName, + )) + .where((element) => File(element.path).existsSync()) + .toList(); + result[target] = artifacts; + } + return result; + } + + Future>> _getPrecompiledArtifacts( + List targets) async { + if (userOptions.usePrecompiledBinaries == false) { + _log.info('Precompiled binaries are disabled'); + return {}; + } + if (environment.crateOptions.precompiledBinaries == null) { + _log.fine('Precompiled binaries not enabled for this crate'); + return {}; + } + + final start = Stopwatch()..start(); + final crateHash = CrateHash.compute(environment.manifestDir, + tempStorage: environment.targetTempDir); + _log.fine( + 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms'); + + final downloadedArtifactsDir = + path.join(environment.targetTempDir, 'precompiled', crateHash); + Directory(downloadedArtifactsDir).createSync(recursive: true); + + final res = >{}; + + for (final target in targets) { + final requiredArtifacts = getArtifactNames( + target: target, + libraryName: environment.crateInfo.packageName, + remote: true, + ); + final artifactsForTarget = []; + + for (final artifact in requiredArtifacts) { + final fileName = PrecompileBinaries.fileName(target, artifact); + final downloadedPath = path.join(downloadedArtifactsDir, fileName); + if (!File(downloadedPath).existsSync()) { + final signatureFileName = + PrecompileBinaries.signatureFileName(target, artifact); + await _tryDownloadArtifacts( + crateHash: crateHash, + fileName: fileName, + signatureFileName: signatureFileName, + finalPath: downloadedPath, + ); + } + if (File(downloadedPath).existsSync()) { + artifactsForTarget.add(Artifact( + path: downloadedPath, + finalFileName: artifact, + )); + } else { + break; + } + } + + // Only provide complete set of artifacts. + if (artifactsForTarget.length == requiredArtifacts.length) { + _log.fine('Found precompiled artifacts for $target'); + res[target] = artifactsForTarget; + } + } + + return res; + } + + static Future _get(Uri url, {Map? headers}) async { + int attempt = 0; + const maxAttempts = 10; + while (true) { + try { + return await get(url, headers: headers); + } on SocketException catch (e) { + // Try to detect reset by peer error and retry. + if (attempt++ < maxAttempts && + (e.osError?.errorCode == 54 || e.osError?.errorCode == 10054)) { + _log.severe( + 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...'); + await Future.delayed(Duration(seconds: 1)); + continue; + } else { + rethrow; + } + } + } + } + + Future _tryDownloadArtifacts({ + required String crateHash, + required String fileName, + required String signatureFileName, + required String finalPath, + }) async { + final precompiledBinaries = environment.crateOptions.precompiledBinaries!; + final prefix = precompiledBinaries.uriPrefix; + final url = Uri.parse('$prefix$crateHash/$fileName'); + final signatureUrl = Uri.parse('$prefix$crateHash/$signatureFileName'); + _log.fine('Downloading signature from $signatureUrl'); + final signature = await _get(signatureUrl); + if (signature.statusCode == 404) { + _log.warning( + 'Precompiled binaries not available for crate hash $crateHash ($fileName)'); + return; + } + if (signature.statusCode != 200) { + _log.severe( + 'Failed to download signature $signatureUrl: status ${signature.statusCode}'); + return; + } + _log.fine('Downloading binary from $url'); + final res = await _get(url); + if (res.statusCode != 200) { + _log.severe('Failed to download binary $url: status ${res.statusCode}'); + return; + } + if (verify( + precompiledBinaries.publicKey, res.bodyBytes, signature.bodyBytes)) { + File(finalPath).writeAsBytesSync(res.bodyBytes); + } else { + _log.shout('Signature verification failed! Ignoring binary.'); + } + } +} + +enum AritifactType { + staticlib, + dylib, +} + +AritifactType artifactTypeForTarget(Target target) { + if (target.darwinPlatform != null) { + return AritifactType.staticlib; + } else { + return AritifactType.dylib; + } +} + +List getArtifactNames({ + required Target target, + required String libraryName, + required bool remote, + AritifactType? aritifactType, +}) { + aritifactType ??= artifactTypeForTarget(target); + if (target.darwinArch != null) { + if (aritifactType == AritifactType.staticlib) { + return ['lib$libraryName.a']; + } else { + return ['lib$libraryName.dylib']; + } + } else if (target.rust.contains('-windows-')) { + if (aritifactType == AritifactType.staticlib) { + return ['$libraryName.lib']; + } else { + return [ + '$libraryName.dll', + '$libraryName.dll.lib', + if (!remote) '$libraryName.pdb' + ]; + } + } else if (target.rust.contains('-linux-')) { + if (aritifactType == AritifactType.staticlib) { + return ['lib$libraryName.a']; + } else { + return ['lib$libraryName.so']; + } + } else { + throw Exception("Unsupported target: ${target.rust}"); + } +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart b/app/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart new file mode 100644 index 0000000..6f3b2a4 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/build_cmake.dart @@ -0,0 +1,40 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:path/path.dart' as path; + +import 'artifacts_provider.dart'; +import 'builder.dart'; +import 'environment.dart'; +import 'options.dart'; +import 'target.dart'; + +class BuildCMake { + final CargokitUserOptions userOptions; + + BuildCMake({required this.userOptions}); + + Future build() async { + final targetPlatform = Environment.targetPlatform; + final target = Target.forFlutterName(Environment.targetPlatform); + if (target == null) { + throw Exception("Unknown target platform: $targetPlatform"); + } + + final environment = BuildEnvironment.fromEnvironment(isAndroid: false); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); + final artifacts = await provider.getArtifacts([target]); + + final libs = artifacts[target]!; + + for (final lib in libs) { + if (lib.type == AritifactType.dylib) { + File(lib.path) + .copySync(path.join(Environment.outputDir, lib.finalFileName)); + } + } + } +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart b/app/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart new file mode 100644 index 0000000..7e61fcb --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/build_gradle.dart @@ -0,0 +1,49 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; + +import 'artifacts_provider.dart'; +import 'builder.dart'; +import 'environment.dart'; +import 'options.dart'; +import 'target.dart'; + +final log = Logger('build_gradle'); + +class BuildGradle { + BuildGradle({required this.userOptions}); + + final CargokitUserOptions userOptions; + + Future build() async { + final targets = Environment.targetPlatforms.map((arch) { + final target = Target.forFlutterName(arch); + if (target == null) { + throw Exception( + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); + } + return target; + }).toList(); + + final environment = BuildEnvironment.fromEnvironment(isAndroid: true); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); + final artifacts = await provider.getArtifacts(targets); + + for (final target in targets) { + final libs = artifacts[target]!; + final outputDir = path.join(Environment.outputDir, target.android!); + Directory(outputDir).createSync(recursive: true); + + for (final lib in libs) { + if (lib.type == AritifactType.dylib) { + File(lib.path).copySync(path.join(outputDir, lib.finalFileName)); + } + } + } + } +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/build_pod.dart b/app/rust_builder/cargokit/build_tool/lib/src/build_pod.dart new file mode 100644 index 0000000..8a9c0db --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/build_pod.dart @@ -0,0 +1,89 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:path/path.dart' as path; + +import 'artifacts_provider.dart'; +import 'builder.dart'; +import 'environment.dart'; +import 'options.dart'; +import 'target.dart'; +import 'util.dart'; + +class BuildPod { + BuildPod({required this.userOptions}); + + final CargokitUserOptions userOptions; + + Future build() async { + final targets = Environment.darwinArchs.map((arch) { + final target = Target.forDarwin( + platformName: Environment.darwinPlatformName, darwinAarch: arch); + if (target == null) { + throw Exception( + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); + } + return target; + }).toList(); + + final environment = BuildEnvironment.fromEnvironment(isAndroid: false); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); + final artifacts = await provider.getArtifacts(targets); + + void performLipo(String targetFile, Iterable sourceFiles) { + runCommand("lipo", [ + '-create', + ...sourceFiles, + '-output', + targetFile, + ]); + } + + final outputDir = Environment.outputDir; + + Directory(outputDir).createSync(recursive: true); + + final staticLibs = artifacts.values + .expand((element) => element) + .where((element) => element.type == AritifactType.staticlib) + .toList(); + final dynamicLibs = artifacts.values + .expand((element) => element) + .where((element) => element.type == AritifactType.dylib) + .toList(); + + final libName = environment.crateInfo.packageName; + + // If there is static lib, use it and link it with pod + if (staticLibs.isNotEmpty) { + final finalTargetFile = path.join(outputDir, "lib$libName.a"); + performLipo(finalTargetFile, staticLibs.map((e) => e.path)); + } else { + // Otherwise try to replace bundle dylib with our dylib + final bundlePaths = [ + '$libName.framework/Versions/A/$libName', + '$libName.framework/$libName', + ]; + + for (final bundlePath in bundlePaths) { + final targetFile = path.join(outputDir, bundlePath); + if (File(targetFile).existsSync()) { + performLipo(targetFile, dynamicLibs.map((e) => e.path)); + + // Replace absolute id with @rpath one so that it works properly + // when moved to Frameworks. + runCommand("install_name_tool", [ + '-id', + '@rpath/$bundlePath', + targetFile, + ]); + return; + } + } + throw Exception('Unable to find bundle for dynamic library'); + } + } +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/build_tool.dart b/app/rust_builder/cargokit/build_tool/lib/src/build_tool.dart new file mode 100644 index 0000000..c8f3698 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/build_tool.dart @@ -0,0 +1,271 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:args/command_runner.dart'; +import 'package:ed25519_edwards/ed25519_edwards.dart'; +import 'package:github/github.dart'; +import 'package:hex/hex.dart'; +import 'package:logging/logging.dart'; + +import 'android_environment.dart'; +import 'build_cmake.dart'; +import 'build_gradle.dart'; +import 'build_pod.dart'; +import 'logging.dart'; +import 'options.dart'; +import 'precompile_binaries.dart'; +import 'target.dart'; +import 'util.dart'; +import 'verify_binaries.dart'; + +final log = Logger('build_tool'); + +abstract class BuildCommand extends Command { + Future runBuildCommand(CargokitUserOptions options); + + @override + Future run() async { + final options = CargokitUserOptions.load(); + + if (options.verboseLogging || + Platform.environment['CARGOKIT_VERBOSE'] == '1') { + enableVerboseLogging(); + } + + await runBuildCommand(options); + } +} + +class BuildPodCommand extends BuildCommand { + @override + final name = 'build-pod'; + + @override + final description = 'Build cocoa pod library'; + + @override + Future runBuildCommand(CargokitUserOptions options) async { + final build = BuildPod(userOptions: options); + await build.build(); + } +} + +class BuildGradleCommand extends BuildCommand { + @override + final name = 'build-gradle'; + + @override + final description = 'Build android library'; + + @override + Future runBuildCommand(CargokitUserOptions options) async { + final build = BuildGradle(userOptions: options); + await build.build(); + } +} + +class BuildCMakeCommand extends BuildCommand { + @override + final name = 'build-cmake'; + + @override + final description = 'Build CMake library'; + + @override + Future runBuildCommand(CargokitUserOptions options) async { + final build = BuildCMake(userOptions: options); + await build.build(); + } +} + +class GenKeyCommand extends Command { + @override + final name = 'gen-key'; + + @override + final description = 'Generate key pair for signing precompiled binaries'; + + @override + void run() { + final kp = generateKey(); + final private = HEX.encode(kp.privateKey.bytes); + final public = HEX.encode(kp.publicKey.bytes); + print("Private Key: $private"); + print("Public Key: $public"); + } +} + +class PrecompileBinariesCommand extends Command { + PrecompileBinariesCommand() { + argParser + ..addOption( + 'repository', + mandatory: true, + help: 'Github repository slug in format owner/name', + ) + ..addOption( + 'manifest-dir', + mandatory: true, + help: 'Directory containing Cargo.toml', + ) + ..addMultiOption('target', + help: 'Rust target triple of artifact to build.\n' + 'Can be specified multiple times or omitted in which case\n' + 'all targets for current platform will be built.') + ..addOption( + 'android-sdk-location', + help: 'Location of Android SDK (if available)', + ) + ..addOption( + 'android-ndk-version', + help: 'Android NDK version (if available)', + ) + ..addOption( + 'android-min-sdk-version', + help: 'Android minimum rquired version (if available)', + ) + ..addOption( + 'temp-dir', + help: 'Directory to store temporary build artifacts', + ) + ..addFlag( + "verbose", + abbr: "v", + defaultsTo: false, + help: "Enable verbose logging", + ); + } + + @override + final name = 'precompile-binaries'; + + @override + final description = 'Prebuild and upload binaries\n' + 'Private key must be passed through PRIVATE_KEY environment variable. ' + 'Use gen_key through generate priave key.\n' + 'Github token must be passed as GITHUB_TOKEN environment variable.\n'; + + @override + Future run() async { + final verbose = argResults!['verbose'] as bool; + if (verbose) { + enableVerboseLogging(); + } + + final privateKeyString = Platform.environment['PRIVATE_KEY']; + if (privateKeyString == null) { + throw ArgumentError('Missing PRIVATE_KEY environment variable'); + } + final githubToken = Platform.environment['GITHUB_TOKEN']; + if (githubToken == null) { + throw ArgumentError('Missing GITHUB_TOKEN environment variable'); + } + final privateKey = HEX.decode(privateKeyString); + if (privateKey.length != 64) { + throw ArgumentError('Private key must be 64 bytes long'); + } + final manifestDir = argResults!['manifest-dir'] as String; + if (!Directory(manifestDir).existsSync()) { + throw ArgumentError('Manifest directory does not exist: $manifestDir'); + } + String? androidMinSdkVersionString = + argResults!['android-min-sdk-version'] as String?; + int? androidMinSdkVersion; + if (androidMinSdkVersionString != null) { + androidMinSdkVersion = int.tryParse(androidMinSdkVersionString); + if (androidMinSdkVersion == null) { + throw ArgumentError( + 'Invalid android-min-sdk-version: $androidMinSdkVersionString'); + } + } + final targetStrigns = argResults!['target'] as List; + final targets = targetStrigns.map((target) { + final res = Target.forRustTriple(target); + if (res == null) { + throw ArgumentError('Invalid target: $target'); + } + return res; + }).toList(growable: false); + final precompileBinaries = PrecompileBinaries( + privateKey: PrivateKey(privateKey), + githubToken: githubToken, + manifestDir: manifestDir, + repositorySlug: RepositorySlug.full(argResults!['repository'] as String), + targets: targets, + androidSdkLocation: argResults!['android-sdk-location'] as String?, + androidNdkVersion: argResults!['android-ndk-version'] as String?, + androidMinSdkVersion: androidMinSdkVersion, + tempDir: argResults!['temp-dir'] as String?, + ); + + await precompileBinaries.run(); + } +} + +class VerifyBinariesCommand extends Command { + VerifyBinariesCommand() { + argParser.addOption( + 'manifest-dir', + mandatory: true, + help: 'Directory containing Cargo.toml', + ); + } + + @override + final name = "verify-binaries"; + + @override + final description = 'Verifies published binaries\n' + 'Checks whether there is a binary published for each targets\n' + 'and checks the signature.'; + + @override + Future run() async { + final manifestDir = argResults!['manifest-dir'] as String; + final verifyBinaries = VerifyBinaries( + manifestDir: manifestDir, + ); + await verifyBinaries.run(); + } +} + +Future runMain(List args) async { + try { + // Init logging before options are loaded + initLogging(); + + if (Platform.environment['_CARGOKIT_NDK_LINK_TARGET'] != null) { + return AndroidEnvironment.clangLinkerWrapper(args); + } + + final runner = CommandRunner('build_tool', 'Cargokit built_tool') + ..addCommand(BuildPodCommand()) + ..addCommand(BuildGradleCommand()) + ..addCommand(BuildCMakeCommand()) + ..addCommand(GenKeyCommand()) + ..addCommand(PrecompileBinariesCommand()) + ..addCommand(VerifyBinariesCommand()); + + await runner.run(args); + } on ArgumentError catch (e) { + stderr.writeln(e.toString()); + exit(1); + } catch (e, s) { + log.severe(kDoubleSeparator); + log.severe('Cargokit BuildTool failed with error:'); + log.severe(kSeparator); + log.severe(e); + // This tells user to install Rust, there's no need to pollute the log with + // stack trace. + if (e is! RustupNotFoundException) { + log.severe(kSeparator); + log.severe(s); + log.severe(kSeparator); + log.severe('BuildTool arguments: $args'); + } + log.severe(kDoubleSeparator); + exit(1); + } +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/builder.dart b/app/rust_builder/cargokit/build_tool/lib/src/builder.dart new file mode 100644 index 0000000..84c46e4 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/builder.dart @@ -0,0 +1,198 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'package:collection/collection.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; + +import 'android_environment.dart'; +import 'cargo.dart'; +import 'environment.dart'; +import 'options.dart'; +import 'rustup.dart'; +import 'target.dart'; +import 'util.dart'; + +final _log = Logger('builder'); + +enum BuildConfiguration { + debug, + release, + profile, +} + +extension on BuildConfiguration { + bool get isDebug => this == BuildConfiguration.debug; + String get rustName => switch (this) { + BuildConfiguration.debug => 'debug', + BuildConfiguration.release => 'release', + BuildConfiguration.profile => 'release', + }; +} + +class BuildException implements Exception { + final String message; + + BuildException(this.message); + + @override + String toString() { + return 'BuildException: $message'; + } +} + +class BuildEnvironment { + final BuildConfiguration configuration; + final CargokitCrateOptions crateOptions; + final String targetTempDir; + final String manifestDir; + final CrateInfo crateInfo; + + final bool isAndroid; + final String? androidSdkPath; + final String? androidNdkVersion; + final int? androidMinSdkVersion; + final String? javaHome; + + BuildEnvironment({ + required this.configuration, + required this.crateOptions, + required this.targetTempDir, + required this.manifestDir, + required this.crateInfo, + required this.isAndroid, + this.androidSdkPath, + this.androidNdkVersion, + this.androidMinSdkVersion, + this.javaHome, + }); + + static BuildConfiguration parseBuildConfiguration(String value) { + // XCode configuration adds the flavor to configuration name. + final firstSegment = value.split('-').first; + final buildConfiguration = BuildConfiguration.values.firstWhereOrNull( + (e) => e.name == firstSegment, + ); + if (buildConfiguration == null) { + _log.warning('Unknown build configuraiton $value, will assume release'); + return BuildConfiguration.release; + } + return buildConfiguration; + } + + static BuildEnvironment fromEnvironment({ + required bool isAndroid, + }) { + final buildConfiguration = + parseBuildConfiguration(Environment.configuration); + final manifestDir = Environment.manifestDir; + final crateOptions = CargokitCrateOptions.load( + manifestDir: manifestDir, + ); + final crateInfo = CrateInfo.load(manifestDir); + return BuildEnvironment( + configuration: buildConfiguration, + crateOptions: crateOptions, + targetTempDir: Environment.targetTempDir, + manifestDir: manifestDir, + crateInfo: crateInfo, + isAndroid: isAndroid, + androidSdkPath: isAndroid ? Environment.sdkPath : null, + androidNdkVersion: isAndroid ? Environment.ndkVersion : null, + androidMinSdkVersion: + isAndroid ? int.parse(Environment.minSdkVersion) : null, + javaHome: isAndroid ? Environment.javaHome : null, + ); + } +} + +class RustBuilder { + final Target target; + final BuildEnvironment environment; + + RustBuilder({ + required this.target, + required this.environment, + }); + + void prepare( + Rustup rustup, + ) { + final toolchain = _toolchain; + if (rustup.installedTargets(toolchain) == null) { + rustup.installToolchain(toolchain); + } + if (toolchain == 'nightly') { + rustup.installRustSrcForNightly(); + } + if (!rustup.installedTargets(toolchain)!.contains(target.rust)) { + rustup.installTarget(target.rust, toolchain: toolchain); + } + } + + CargoBuildOptions? get _buildOptions => + environment.crateOptions.cargo[environment.configuration]; + + String get _toolchain => _buildOptions?.toolchain.name ?? 'stable'; + + /// Returns the path of directory containing build artifacts. + Future build() async { + final extraArgs = _buildOptions?.flags ?? []; + final manifestPath = path.join(environment.manifestDir, 'Cargo.toml'); + runCommand( + 'rustup', + [ + 'run', + _toolchain, + 'cargo', + 'build', + ...extraArgs, + '--manifest-path', + manifestPath, + '-p', + environment.crateInfo.packageName, + if (!environment.configuration.isDebug) '--release', + '--target', + target.rust, + '--target-dir', + environment.targetTempDir, + ], + environment: await _buildEnvironment(), + ); + return path.join( + environment.targetTempDir, + target.rust, + environment.configuration.rustName, + ); + } + + Future> _buildEnvironment() async { + if (target.android == null) { + return {}; + } else { + final sdkPath = environment.androidSdkPath; + final ndkVersion = environment.androidNdkVersion; + final minSdkVersion = environment.androidMinSdkVersion; + if (sdkPath == null) { + throw BuildException('androidSdkPath is not set'); + } + if (ndkVersion == null) { + throw BuildException('androidNdkVersion is not set'); + } + if (minSdkVersion == null) { + throw BuildException('androidMinSdkVersion is not set'); + } + final env = AndroidEnvironment( + sdkPath: sdkPath, + ndkVersion: ndkVersion, + minSdkVersion: minSdkVersion, + targetTempDir: environment.targetTempDir, + target: target, + ); + if (!env.ndkIsInstalled() && environment.javaHome != null) { + env.installNdk(javaHome: environment.javaHome!); + } + return env.buildEnvironment(); + } + } +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/cargo.dart b/app/rust_builder/cargokit/build_tool/lib/src/cargo.dart new file mode 100644 index 0000000..0d8958f --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/cargo.dart @@ -0,0 +1,48 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:path/path.dart' as path; +import 'package:toml/toml.dart'; + +class ManifestException { + ManifestException(this.message, {required this.fileName}); + + final String? fileName; + final String message; + + @override + String toString() { + if (fileName != null) { + return 'Failed to parse package manifest at $fileName: $message'; + } else { + return 'Failed to parse package manifest: $message'; + } + } +} + +class CrateInfo { + CrateInfo({required this.packageName}); + + final String packageName; + + static CrateInfo parseManifest(String manifest, {final String? fileName}) { + final toml = TomlDocument.parse(manifest); + final package = toml.toMap()['package']; + if (package == null) { + throw ManifestException('Missing package section', fileName: fileName); + } + final name = package['name']; + if (name == null) { + throw ManifestException('Missing package name', fileName: fileName); + } + return CrateInfo(packageName: name); + } + + static CrateInfo load(String manifestDir) { + final manifestFile = File(path.join(manifestDir, 'Cargo.toml')); + final manifest = manifestFile.readAsStringSync(); + return parseManifest(manifest, fileName: manifestFile.path); + } +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart b/app/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart new file mode 100644 index 0000000..0c4d88d --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/crate_hash.dart @@ -0,0 +1,124 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:collection/collection.dart'; +import 'package:convert/convert.dart'; +import 'package:crypto/crypto.dart'; +import 'package:path/path.dart' as path; + +class CrateHash { + /// Computes a hash uniquely identifying crate content. This takes into account + /// content all all .rs files inside the src directory, as well as Cargo.toml, + /// Cargo.lock, build.rs and cargokit.yaml. + /// + /// If [tempStorage] is provided, computed hash is stored in a file in that directory + /// and reused on subsequent calls if the crate content hasn't changed. + static String compute(String manifestDir, {String? tempStorage}) { + return CrateHash._( + manifestDir: manifestDir, + tempStorage: tempStorage, + )._compute(); + } + + CrateHash._({ + required this.manifestDir, + required this.tempStorage, + }); + + String _compute() { + final files = getFiles(); + final tempStorage = this.tempStorage; + if (tempStorage != null) { + final quickHash = _computeQuickHash(files); + final quickHashFolder = Directory(path.join(tempStorage, 'crate_hash')); + quickHashFolder.createSync(recursive: true); + final quickHashFile = File(path.join(quickHashFolder.path, quickHash)); + if (quickHashFile.existsSync()) { + return quickHashFile.readAsStringSync(); + } + final hash = _computeHash(files); + quickHashFile.writeAsStringSync(hash); + return hash; + } else { + return _computeHash(files); + } + } + + /// Computes a quick hash based on files stat (without reading contents). This + /// is used to cache the real hash, which is slower to compute since it involves + /// reading every single file. + String _computeQuickHash(List files) { + final output = AccumulatorSink(); + final input = sha256.startChunkedConversion(output); + + final data = ByteData(8); + for (final file in files) { + input.add(utf8.encode(file.path)); + final stat = file.statSync(); + data.setUint64(0, stat.size); + input.add(data.buffer.asUint8List()); + data.setUint64(0, stat.modified.millisecondsSinceEpoch); + input.add(data.buffer.asUint8List()); + } + + input.close(); + return base64Url.encode(output.events.single.bytes); + } + + String _computeHash(List files) { + final output = AccumulatorSink(); + final input = sha256.startChunkedConversion(output); + + void addTextFile(File file) { + // text Files are hashed by lines in case we're dealing with github checkout + // that auto-converts line endings. + final splitter = LineSplitter(); + if (file.existsSync()) { + final data = file.readAsStringSync(); + final lines = splitter.convert(data); + for (final line in lines) { + input.add(utf8.encode(line)); + } + } + } + + for (final file in files) { + addTextFile(file); + } + + input.close(); + final res = output.events.single; + + // Truncate to 128bits. + final hash = res.bytes.sublist(0, 16); + return hex.encode(hash); + } + + List getFiles() { + final src = Directory(path.join(manifestDir, 'src')); + final files = src + .listSync(recursive: true, followLinks: false) + .whereType() + .toList(); + files.sortBy((element) => element.path); + void addFile(String relative) { + final file = File(path.join(manifestDir, relative)); + if (file.existsSync()) { + files.add(file); + } + } + + addFile('Cargo.toml'); + addFile('Cargo.lock'); + addFile('build.rs'); + addFile('cargokit.yaml'); + return files; + } + + final String manifestDir; + final String? tempStorage; +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/environment.dart b/app/rust_builder/cargokit/build_tool/lib/src/environment.dart new file mode 100644 index 0000000..996483a --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/environment.dart @@ -0,0 +1,68 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +extension on String { + String resolveSymlink() => File(this).resolveSymbolicLinksSync(); +} + +class Environment { + /// Current build configuration (debug or release). + static String get configuration => + _getEnv("CARGOKIT_CONFIGURATION").toLowerCase(); + + static bool get isDebug => configuration == 'debug'; + static bool get isRelease => configuration == 'release'; + + /// Temporary directory where Rust build artifacts are placed. + static String get targetTempDir => _getEnv("CARGOKIT_TARGET_TEMP_DIR"); + + /// Final output directory where the build artifacts are placed. + static String get outputDir => _getEnvPath('CARGOKIT_OUTPUT_DIR'); + + /// Path to the crate manifest (containing Cargo.toml). + static String get manifestDir => _getEnvPath('CARGOKIT_MANIFEST_DIR'); + + /// Directory inside root project. Not necessarily root folder. Symlinks are + /// not resolved on purpose. + static String get rootProjectDir => _getEnv('CARGOKIT_ROOT_PROJECT_DIR'); + + // Pod + + /// Platform name (macosx, iphoneos, iphonesimulator). + static String get darwinPlatformName => + _getEnv("CARGOKIT_DARWIN_PLATFORM_NAME"); + + /// List of architectures to build for (arm64, armv7, x86_64). + static List get darwinArchs => + _getEnv("CARGOKIT_DARWIN_ARCHS").split(' '); + + // Gradle + static String get minSdkVersion => _getEnv("CARGOKIT_MIN_SDK_VERSION"); + static String get ndkVersion => _getEnv("CARGOKIT_NDK_VERSION"); + static String get sdkPath => _getEnvPath("CARGOKIT_SDK_DIR"); + static String get javaHome => _getEnvPath("CARGOKIT_JAVA_HOME"); + static List get targetPlatforms => + _getEnv("CARGOKIT_TARGET_PLATFORMS").split(','); + + // CMAKE + static String get targetPlatform => _getEnv("CARGOKIT_TARGET_PLATFORM"); + + static String _getEnv(String key) { + final res = Platform.environment[key]; + if (res == null) { + throw Exception("Missing environment variable $key"); + } + return res; + } + + static String _getEnvPath(String key) { + final res = _getEnv(key); + if (Directory(res).existsSync()) { + return res.resolveSymlink(); + } else { + return res; + } + } +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/logging.dart b/app/rust_builder/cargokit/build_tool/lib/src/logging.dart new file mode 100644 index 0000000..5edd4fd --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/logging.dart @@ -0,0 +1,52 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:logging/logging.dart'; + +const String kSeparator = "--"; +const String kDoubleSeparator = "=="; + +bool _lastMessageWasSeparator = false; + +void _log(LogRecord rec) { + final prefix = '${rec.level.name}: '; + final out = rec.level == Level.SEVERE ? stderr : stdout; + if (rec.message == kSeparator) { + if (!_lastMessageWasSeparator) { + out.write(prefix); + out.writeln('-' * 80); + _lastMessageWasSeparator = true; + } + return; + } else if (rec.message == kDoubleSeparator) { + out.write(prefix); + out.writeln('=' * 80); + _lastMessageWasSeparator = true; + return; + } + out.write(prefix); + out.writeln(rec.message); + _lastMessageWasSeparator = false; +} + +void initLogging() { + Logger.root.level = Level.INFO; + Logger.root.onRecord.listen((LogRecord rec) { + final lines = rec.message.split('\n'); + for (final line in lines) { + if (line.isNotEmpty || lines.length == 1 || line != lines.last) { + _log(LogRecord( + rec.level, + line, + rec.loggerName, + )); + } + } + }); +} + +void enableVerboseLogging() { + Logger.root.level = Level.ALL; +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/options.dart b/app/rust_builder/cargokit/build_tool/lib/src/options.dart new file mode 100644 index 0000000..22aef1d --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/options.dart @@ -0,0 +1,309 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:collection/collection.dart'; +import 'package:ed25519_edwards/ed25519_edwards.dart'; +import 'package:hex/hex.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; +import 'package:source_span/source_span.dart'; +import 'package:yaml/yaml.dart'; + +import 'builder.dart'; +import 'environment.dart'; +import 'rustup.dart'; + +final _log = Logger('options'); + +/// A class for exceptions that have source span information attached. +class SourceSpanException implements Exception { + // This is a getter so that subclasses can override it. + /// A message describing the exception. + String get message => _message; + final String _message; + + // This is a getter so that subclasses can override it. + /// The span associated with this exception. + /// + /// This may be `null` if the source location can't be determined. + SourceSpan? get span => _span; + final SourceSpan? _span; + + SourceSpanException(this._message, this._span); + + /// Returns a string representation of `this`. + /// + /// [color] may either be a [String], a [bool], or `null`. If it's a string, + /// it indicates an ANSI terminal color escape that should be used to + /// highlight the span's text. If it's `true`, it indicates that the text + /// should be highlighted using the default color. If it's `false` or `null`, + /// it indicates that the text shouldn't be highlighted. + @override + String toString({Object? color}) { + if (span == null) return message; + return 'Error on ${span!.message(message, color: color)}'; + } +} + +enum Toolchain { + stable, + beta, + nightly, +} + +class CargoBuildOptions { + final Toolchain toolchain; + final List flags; + + CargoBuildOptions({ + required this.toolchain, + required this.flags, + }); + + static Toolchain _toolchainFromNode(YamlNode node) { + if (node case YamlScalar(value: String name)) { + final toolchain = + Toolchain.values.firstWhereOrNull((element) => element.name == name); + if (toolchain != null) { + return toolchain; + } + } + throw SourceSpanException( + 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', + node.span); + } + + static CargoBuildOptions parse(YamlNode node) { + if (node is! YamlMap) { + throw SourceSpanException('Cargo options must be a map', node.span); + } + Toolchain toolchain = Toolchain.stable; + List flags = []; + for (final MapEntry(:key, :value) in node.nodes.entries) { + if (key case YamlScalar(value: 'toolchain')) { + toolchain = _toolchainFromNode(value); + } else if (key case YamlScalar(value: 'extra_flags')) { + if (value case YamlList(nodes: List list)) { + if (list.every((element) { + if (element case YamlScalar(value: String _)) { + return true; + } + return false; + })) { + flags = list.map((e) => e.value as String).toList(); + continue; + } + } + throw SourceSpanException( + 'Extra flags must be a list of strings', value.span); + } else { + throw SourceSpanException( + 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', + key.span); + } + } + return CargoBuildOptions(toolchain: toolchain, flags: flags); + } +} + +extension on YamlMap { + /// Map that extracts keys so that we can do map case check on them. + Map get valueMap => + nodes.map((key, value) => MapEntry(key.value, value)); +} + +class PrecompiledBinaries { + final String uriPrefix; + final PublicKey publicKey; + + PrecompiledBinaries({ + required this.uriPrefix, + required this.publicKey, + }); + + static PublicKey _publicKeyFromHex(String key, SourceSpan? span) { + final bytes = HEX.decode(key); + if (bytes.length != 32) { + throw SourceSpanException( + 'Invalid public key. Must be 32 bytes long.', span); + } + return PublicKey(bytes); + } + + static PrecompiledBinaries parse(YamlNode node) { + if (node case YamlMap(valueMap: Map map)) { + if (map + case { + 'url_prefix': YamlNode urlPrefixNode, + 'public_key': YamlNode publicKeyNode, + }) { + final urlPrefix = switch (urlPrefixNode) { + YamlScalar(value: String urlPrefix) => urlPrefix, + _ => throw SourceSpanException( + 'Invalid URL prefix value.', urlPrefixNode.span), + }; + final publicKey = switch (publicKeyNode) { + YamlScalar(value: String publicKey) => + _publicKeyFromHex(publicKey, publicKeyNode.span), + _ => throw SourceSpanException( + 'Invalid public key value.', publicKeyNode.span), + }; + return PrecompiledBinaries( + uriPrefix: urlPrefix, + publicKey: publicKey, + ); + } + } + throw SourceSpanException( + 'Invalid precompiled binaries value. ' + 'Expected Map with "url_prefix" and "public_key".', + node.span); + } +} + +/// Cargokit options specified for Rust crate. +class CargokitCrateOptions { + CargokitCrateOptions({ + this.cargo = const {}, + this.precompiledBinaries, + }); + + final Map cargo; + final PrecompiledBinaries? precompiledBinaries; + + static CargokitCrateOptions parse(YamlNode node) { + if (node is! YamlMap) { + throw SourceSpanException('Cargokit options must be a map', node.span); + } + final options = {}; + PrecompiledBinaries? precompiledBinaries; + + for (final entry in node.nodes.entries) { + if (entry + case MapEntry( + key: YamlScalar(value: 'cargo'), + value: YamlNode node, + )) { + if (node is! YamlMap) { + throw SourceSpanException('Cargo options must be a map', node.span); + } + for (final MapEntry(:YamlNode key, :value) in node.nodes.entries) { + if (key case YamlScalar(value: String name)) { + final configuration = BuildConfiguration.values + .firstWhereOrNull((element) => element.name == name); + if (configuration != null) { + options[configuration] = CargoBuildOptions.parse(value); + continue; + } + } + throw SourceSpanException( + 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', + key.span); + } + } else if (entry.key case YamlScalar(value: 'precompiled_binaries')) { + precompiledBinaries = PrecompiledBinaries.parse(entry.value); + } else { + throw SourceSpanException( + 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', + entry.key.span); + } + } + return CargokitCrateOptions( + cargo: options, + precompiledBinaries: precompiledBinaries, + ); + } + + static CargokitCrateOptions load({ + required String manifestDir, + }) { + final uri = Uri.file(path.join(manifestDir, "cargokit.yaml")); + final file = File.fromUri(uri); + if (file.existsSync()) { + final contents = loadYamlNode(file.readAsStringSync(), sourceUrl: uri); + return parse(contents); + } else { + return CargokitCrateOptions(); + } + } +} + +class CargokitUserOptions { + // When Rustup is installed always build locally unless user opts into + // using precompiled binaries. + static bool defaultUsePrecompiledBinaries() { + return Rustup.executablePath() == null; + } + + CargokitUserOptions({ + required this.usePrecompiledBinaries, + required this.verboseLogging, + }); + + CargokitUserOptions._() + : usePrecompiledBinaries = defaultUsePrecompiledBinaries(), + verboseLogging = false; + + static CargokitUserOptions parse(YamlNode node) { + if (node is! YamlMap) { + throw SourceSpanException('Cargokit options must be a map', node.span); + } + bool usePrecompiledBinaries = defaultUsePrecompiledBinaries(); + bool verboseLogging = false; + + for (final entry in node.nodes.entries) { + if (entry.key case YamlScalar(value: 'use_precompiled_binaries')) { + if (entry.value case YamlScalar(value: bool value)) { + usePrecompiledBinaries = value; + continue; + } + throw SourceSpanException( + 'Invalid value for "use_precompiled_binaries". Must be a boolean.', + entry.value.span); + } else if (entry.key case YamlScalar(value: 'verbose_logging')) { + if (entry.value case YamlScalar(value: bool value)) { + verboseLogging = value; + continue; + } + throw SourceSpanException( + 'Invalid value for "verbose_logging". Must be a boolean.', + entry.value.span); + } else { + throw SourceSpanException( + 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', + entry.key.span); + } + } + return CargokitUserOptions( + usePrecompiledBinaries: usePrecompiledBinaries, + verboseLogging: verboseLogging, + ); + } + + static CargokitUserOptions load() { + String fileName = "cargokit_options.yaml"; + var userProjectDir = Directory(Environment.rootProjectDir); + + while (userProjectDir.parent.path != userProjectDir.path) { + final configFile = File(path.join(userProjectDir.path, fileName)); + if (configFile.existsSync()) { + final contents = loadYamlNode( + configFile.readAsStringSync(), + sourceUrl: configFile.uri, + ); + final res = parse(contents); + if (res.verboseLogging) { + _log.info('Found user options file at ${configFile.path}'); + } + return res; + } + userProjectDir = userProjectDir.parent; + } + return CargokitUserOptions._(); + } + + final bool usePrecompiledBinaries; + final bool verboseLogging; +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart b/app/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart new file mode 100644 index 0000000..c27f419 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/precompile_binaries.dart @@ -0,0 +1,202 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:ed25519_edwards/ed25519_edwards.dart'; +import 'package:github/github.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; + +import 'artifacts_provider.dart'; +import 'builder.dart'; +import 'cargo.dart'; +import 'crate_hash.dart'; +import 'options.dart'; +import 'rustup.dart'; +import 'target.dart'; + +final _log = Logger('precompile_binaries'); + +class PrecompileBinaries { + PrecompileBinaries({ + required this.privateKey, + required this.githubToken, + required this.repositorySlug, + required this.manifestDir, + required this.targets, + this.androidSdkLocation, + this.androidNdkVersion, + this.androidMinSdkVersion, + this.tempDir, + }); + + final PrivateKey privateKey; + final String githubToken; + final RepositorySlug repositorySlug; + final String manifestDir; + final List targets; + final String? androidSdkLocation; + final String? androidNdkVersion; + final int? androidMinSdkVersion; + final String? tempDir; + + static String fileName(Target target, String name) { + return '${target.rust}_$name'; + } + + static String signatureFileName(Target target, String name) { + return '${target.rust}_$name.sig'; + } + + Future run() async { + final crateInfo = CrateInfo.load(manifestDir); + + final targets = List.of(this.targets); + if (targets.isEmpty) { + targets.addAll([ + ...Target.buildableTargets(), + if (androidSdkLocation != null) ...Target.androidTargets(), + ]); + } + + _log.info('Precompiling binaries for $targets'); + + final hash = CrateHash.compute(manifestDir); + _log.info('Computed crate hash: $hash'); + + final String tagName = 'precompiled_$hash'; + + final github = GitHub(auth: Authentication.withToken(githubToken)); + final repo = github.repositories; + final release = await _getOrCreateRelease( + repo: repo, + tagName: tagName, + packageName: crateInfo.packageName, + hash: hash, + ); + + final tempDir = this.tempDir != null + ? Directory(this.tempDir!) + : Directory.systemTemp.createTempSync('precompiled_'); + + tempDir.createSync(recursive: true); + + final crateOptions = CargokitCrateOptions.load( + manifestDir: manifestDir, + ); + + final buildEnvironment = BuildEnvironment( + configuration: BuildConfiguration.release, + crateOptions: crateOptions, + targetTempDir: tempDir.path, + manifestDir: manifestDir, + crateInfo: crateInfo, + isAndroid: androidSdkLocation != null, + androidSdkPath: androidSdkLocation, + androidNdkVersion: androidNdkVersion, + androidMinSdkVersion: androidMinSdkVersion, + ); + + final rustup = Rustup(); + + for (final target in targets) { + final artifactNames = getArtifactNames( + target: target, + libraryName: crateInfo.packageName, + remote: true, + ); + + if (artifactNames.every((name) { + final fileName = PrecompileBinaries.fileName(target, name); + return (release.assets ?? []).any((e) => e.name == fileName); + })) { + _log.info("All artifacts for $target already exist - skipping"); + continue; + } + + _log.info('Building for $target'); + + final builder = + RustBuilder(target: target, environment: buildEnvironment); + builder.prepare(rustup); + final res = await builder.build(); + + final assets = []; + for (final name in artifactNames) { + final file = File(path.join(res, name)); + if (!file.existsSync()) { + throw Exception('Missing artifact: ${file.path}'); + } + + final data = file.readAsBytesSync(); + final create = CreateReleaseAsset( + name: PrecompileBinaries.fileName(target, name), + contentType: "application/octet-stream", + assetData: data, + ); + final signature = sign(privateKey, data); + final signatureCreate = CreateReleaseAsset( + name: signatureFileName(target, name), + contentType: "application/octet-stream", + assetData: signature, + ); + bool verified = verify(public(privateKey), data, signature); + if (!verified) { + throw Exception('Signature verification failed'); + } + assets.add(create); + assets.add(signatureCreate); + } + _log.info('Uploading assets: ${assets.map((e) => e.name)}'); + for (final asset in assets) { + // This seems to be failing on CI so do it one by one + int retryCount = 0; + while (true) { + try { + await repo.uploadReleaseAssets(release, [asset]); + break; + } on Exception catch (e) { + if (retryCount == 10) { + rethrow; + } + ++retryCount; + _log.shout( + 'Upload failed (attempt $retryCount, will retry): ${e.toString()}'); + await Future.delayed(Duration(seconds: 2)); + } + } + } + } + + _log.info('Cleaning up'); + tempDir.deleteSync(recursive: true); + } + + Future _getOrCreateRelease({ + required RepositoriesService repo, + required String tagName, + required String packageName, + required String hash, + }) async { + Release release; + try { + _log.info('Fetching release $tagName'); + release = await repo.getReleaseByTagName(repositorySlug, tagName); + } on ReleaseNotFound { + _log.info('Release not found - creating release $tagName'); + release = await repo.createRelease( + repositorySlug, + CreateRelease.from( + tagName: tagName, + name: 'Precompiled binaries ${hash.substring(0, 8)}', + targetCommitish: null, + isDraft: false, + isPrerelease: false, + body: 'Precompiled binaries for crate $packageName, ' + 'crate hash $hash.', + )); + } + return release; + } +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/rustup.dart b/app/rust_builder/cargokit/build_tool/lib/src/rustup.dart new file mode 100644 index 0000000..0ac8d08 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/rustup.dart @@ -0,0 +1,136 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:collection/collection.dart'; +import 'package:path/path.dart' as path; + +import 'util.dart'; + +class _Toolchain { + _Toolchain( + this.name, + this.targets, + ); + + final String name; + final List targets; +} + +class Rustup { + List? installedTargets(String toolchain) { + final targets = _installedTargets(toolchain); + return targets != null ? List.unmodifiable(targets) : null; + } + + void installToolchain(String toolchain) { + log.info("Installing Rust toolchain: $toolchain"); + runCommand("rustup", ['toolchain', 'install', toolchain]); + _installedToolchains + .add(_Toolchain(toolchain, _getInstalledTargets(toolchain))); + } + + void installTarget( + String target, { + required String toolchain, + }) { + log.info("Installing Rust target: $target"); + runCommand("rustup", [ + 'target', + 'add', + '--toolchain', + toolchain, + target, + ]); + _installedTargets(toolchain)?.add(target); + } + + final List<_Toolchain> _installedToolchains; + + Rustup() : _installedToolchains = _getInstalledToolchains(); + + List? _installedTargets(String toolchain) => _installedToolchains + .firstWhereOrNull( + (e) => e.name == toolchain || e.name.startsWith('$toolchain-')) + ?.targets; + + static List<_Toolchain> _getInstalledToolchains() { + String extractToolchainName(String line) { + // ignore (default) after toolchain name + final parts = line.split(' '); + return parts[0]; + } + + final res = runCommand("rustup", ['toolchain', 'list']); + + // To list all non-custom toolchains, we need to filter out lines that + // don't start with "stable", "beta", or "nightly". + Pattern nonCustom = RegExp(r"^(stable|beta|nightly)"); + final lines = res.stdout + .toString() + .split('\n') + .where((e) => e.isNotEmpty && e.startsWith(nonCustom)) + .map(extractToolchainName) + .toList(growable: true); + + return lines + .map( + (name) => _Toolchain( + name, + _getInstalledTargets(name), + ), + ) + .toList(growable: true); + } + + static List _getInstalledTargets(String toolchain) { + final res = runCommand("rustup", [ + 'target', + 'list', + '--toolchain', + toolchain, + '--installed', + ]); + final lines = res.stdout + .toString() + .split('\n') + .where((e) => e.isNotEmpty) + .toList(growable: true); + return lines; + } + + bool _didInstallRustSrcForNightly = false; + + void installRustSrcForNightly() { + if (_didInstallRustSrcForNightly) { + return; + } + // Useful for -Z build-std + runCommand( + "rustup", + ['component', 'add', 'rust-src', '--toolchain', 'nightly'], + ); + _didInstallRustSrcForNightly = true; + } + + static String? executablePath() { + final envPath = Platform.environment['PATH']; + final envPathSeparator = Platform.isWindows ? ';' : ':'; + final home = Platform.isWindows + ? Platform.environment['USERPROFILE'] + : Platform.environment['HOME']; + final paths = [ + if (home != null) path.join(home, '.cargo', 'bin'), + if (envPath != null) ...envPath.split(envPathSeparator), + ]; + for (final p in paths) { + final rustup = Platform.isWindows ? 'rustup.exe' : 'rustup'; + final rustupPath = path.join(p, rustup); + if (File(rustupPath).existsSync()) { + return rustupPath; + } + } + return null; + } +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/target.dart b/app/rust_builder/cargokit/build_tool/lib/src/target.dart new file mode 100644 index 0000000..1159e41 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/target.dart @@ -0,0 +1,144 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:collection/collection.dart'; + +import 'util.dart'; + +class Target { + Target({ + required this.rust, + this.flutter, + this.android, + this.androidMinSdkVersion, + this.darwinPlatform, + this.darwinArch, + }); + + static final all = [ + Target( + rust: 'armv7-linux-androideabi', + flutter: 'android-arm', + android: 'armeabi-v7a', + androidMinSdkVersion: 16, + ), + Target( + rust: 'aarch64-linux-android', + flutter: 'android-arm64', + android: 'arm64-v8a', + androidMinSdkVersion: 21, + ), + Target( + rust: 'i686-linux-android', + flutter: 'android-x86', + android: 'x86', + androidMinSdkVersion: 16, + ), + Target( + rust: 'x86_64-linux-android', + flutter: 'android-x64', + android: 'x86_64', + androidMinSdkVersion: 21, + ), + Target( + rust: 'x86_64-pc-windows-msvc', + flutter: 'windows-x64', + ), + Target( + rust: 'aarch64-pc-windows-msvc', + flutter: 'windows-arm64', + ), + Target( + rust: 'x86_64-unknown-linux-gnu', + flutter: 'linux-x64', + ), + Target( + rust: 'aarch64-unknown-linux-gnu', + flutter: 'linux-arm64', + ), + Target( + rust: 'x86_64-apple-darwin', + darwinPlatform: 'macosx', + darwinArch: 'x86_64', + ), + Target( + rust: 'aarch64-apple-darwin', + darwinPlatform: 'macosx', + darwinArch: 'arm64', + ), + Target( + rust: 'aarch64-apple-ios', + darwinPlatform: 'iphoneos', + darwinArch: 'arm64', + ), + Target( + rust: 'aarch64-apple-ios-sim', + darwinPlatform: 'iphonesimulator', + darwinArch: 'arm64', + ), + Target( + rust: 'x86_64-apple-ios', + darwinPlatform: 'iphonesimulator', + darwinArch: 'x86_64', + ), + ]; + + static Target? forFlutterName(String flutterName) { + return all.firstWhereOrNull((element) => element.flutter == flutterName); + } + + static Target? forDarwin({ + required String platformName, + required String darwinAarch, + }) { + return all.firstWhereOrNull((element) => // + element.darwinPlatform == platformName && + element.darwinArch == darwinAarch); + } + + static Target? forRustTriple(String triple) { + return all.firstWhereOrNull((element) => element.rust == triple); + } + + static List androidTargets() { + return all + .where((element) => element.android != null) + .toList(growable: false); + } + + /// Returns buildable targets on current host platform ignoring Android targets. + static List buildableTargets() { + if (Platform.isLinux) { + // Right now we don't support cross-compiling on Linux. So we just return + // the host target. + final arch = runCommand('arch', []).stdout as String; + if (arch.trim() == 'aarch64') { + return [Target.forRustTriple('aarch64-unknown-linux-gnu')!]; + } else { + return [Target.forRustTriple('x86_64-unknown-linux-gnu')!]; + } + } + return all.where((target) { + if (Platform.isWindows) { + return target.rust.contains('-windows-'); + } else if (Platform.isMacOS) { + return target.darwinPlatform != null; + } + return false; + }).toList(growable: false); + } + + @override + String toString() { + return rust; + } + + final String? flutter; + final String rust; + final String? android; + final int? androidMinSdkVersion; + final String? darwinPlatform; + final String? darwinArch; +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/util.dart b/app/rust_builder/cargokit/build_tool/lib/src/util.dart new file mode 100644 index 0000000..8bb6a87 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/util.dart @@ -0,0 +1,172 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:convert'; +import 'dart:io'; + +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; + +import 'logging.dart'; +import 'rustup.dart'; + +final log = Logger("process"); + +class CommandFailedException implements Exception { + final String executable; + final List arguments; + final ProcessResult result; + + CommandFailedException({ + required this.executable, + required this.arguments, + required this.result, + }); + + @override + String toString() { + final stdout = result.stdout.toString().trim(); + final stderr = result.stderr.toString().trim(); + return [ + "External Command: $executable ${arguments.map((e) => '"$e"').join(' ')}", + "Returned Exit Code: ${result.exitCode}", + kSeparator, + "STDOUT:", + if (stdout.isNotEmpty) stdout, + kSeparator, + "STDERR:", + if (stderr.isNotEmpty) stderr, + ].join('\n'); + } +} + +class TestRunCommandArgs { + final String executable; + final List arguments; + final String? workingDirectory; + final Map? environment; + final bool includeParentEnvironment; + final bool runInShell; + final Encoding? stdoutEncoding; + final Encoding? stderrEncoding; + + TestRunCommandArgs({ + required this.executable, + required this.arguments, + this.workingDirectory, + this.environment, + this.includeParentEnvironment = true, + this.runInShell = false, + this.stdoutEncoding, + this.stderrEncoding, + }); +} + +class TestRunCommandResult { + TestRunCommandResult({ + this.pid = 1, + this.exitCode = 0, + this.stdout = '', + this.stderr = '', + }); + + final int pid; + final int exitCode; + final String stdout; + final String stderr; +} + +TestRunCommandResult Function(TestRunCommandArgs args)? testRunCommandOverride; + +ProcessResult runCommand( + String executable, + List arguments, { + String? workingDirectory, + Map? environment, + bool includeParentEnvironment = true, + bool runInShell = false, + Encoding? stdoutEncoding = systemEncoding, + Encoding? stderrEncoding = systemEncoding, +}) { + if (testRunCommandOverride != null) { + final result = testRunCommandOverride!(TestRunCommandArgs( + executable: executable, + arguments: arguments, + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + stdoutEncoding: stdoutEncoding, + stderrEncoding: stderrEncoding, + )); + return ProcessResult( + result.pid, + result.exitCode, + result.stdout, + result.stderr, + ); + } + log.finer('Running command $executable ${arguments.join(' ')}'); + final res = Process.runSync( + _resolveExecutable(executable), + arguments, + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + stderrEncoding: stderrEncoding, + stdoutEncoding: stdoutEncoding, + ); + if (res.exitCode != 0) { + throw CommandFailedException( + executable: executable, + arguments: arguments, + result: res, + ); + } else { + return res; + } +} + +class RustupNotFoundException implements Exception { + @override + String toString() { + return [ + ' ', + 'rustup not found in PATH.', + ' ', + 'Maybe you need to install Rust? It only takes a minute:', + ' ', + if (Platform.isWindows) 'https://www.rust-lang.org/tools/install', + if (hasHomebrewRustInPath()) ...[ + '\$ brew unlink rust # Unlink homebrew Rust from PATH', + ], + if (!Platform.isWindows) + "\$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh", + ' ', + ].join('\n'); + } + + static bool hasHomebrewRustInPath() { + if (!Platform.isMacOS) { + return false; + } + final envPath = Platform.environment['PATH'] ?? ''; + final paths = envPath.split(':'); + return paths.any((p) { + return p.contains('homebrew') && File(path.join(p, 'rustc')).existsSync(); + }); + } +} + +String _resolveExecutable(String executable) { + if (executable == 'rustup') { + final resolved = Rustup.executablePath(); + if (resolved != null) { + return resolved; + } + throw RustupNotFoundException(); + } else { + return executable; + } +} diff --git a/app/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart b/app/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart new file mode 100644 index 0000000..2366b57 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/lib/src/verify_binaries.dart @@ -0,0 +1,84 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:ed25519_edwards/ed25519_edwards.dart'; +import 'package:http/http.dart'; + +import 'artifacts_provider.dart'; +import 'cargo.dart'; +import 'crate_hash.dart'; +import 'options.dart'; +import 'precompile_binaries.dart'; +import 'target.dart'; + +class VerifyBinaries { + VerifyBinaries({ + required this.manifestDir, + }); + + final String manifestDir; + + Future run() async { + final crateInfo = CrateInfo.load(manifestDir); + + final config = CargokitCrateOptions.load(manifestDir: manifestDir); + final precompiledBinaries = config.precompiledBinaries; + if (precompiledBinaries == null) { + stdout.writeln('Crate does not support precompiled binaries.'); + } else { + final crateHash = CrateHash.compute(manifestDir); + stdout.writeln('Crate hash: $crateHash'); + + for (final target in Target.all) { + final message = 'Checking ${target.rust}...'; + stdout.write(message.padRight(40)); + stdout.flush(); + + final artifacts = getArtifactNames( + target: target, + libraryName: crateInfo.packageName, + remote: true, + ); + + final prefix = precompiledBinaries.uriPrefix; + + bool ok = true; + + for (final artifact in artifacts) { + final fileName = PrecompileBinaries.fileName(target, artifact); + final signatureFileName = + PrecompileBinaries.signatureFileName(target, artifact); + + final url = Uri.parse('$prefix$crateHash/$fileName'); + final signatureUrl = + Uri.parse('$prefix$crateHash/$signatureFileName'); + + final signature = await get(signatureUrl); + if (signature.statusCode != 200) { + stdout.writeln('MISSING'); + ok = false; + break; + } + final asset = await get(url); + if (asset.statusCode != 200) { + stdout.writeln('MISSING'); + ok = false; + break; + } + + if (!verify(precompiledBinaries.publicKey, asset.bodyBytes, + signature.bodyBytes)) { + stdout.writeln('INVALID SIGNATURE'); + ok = false; + } + } + + if (ok) { + stdout.writeln('OK'); + } + } + } + } +} diff --git a/app/rust_builder/cargokit/build_tool/pubspec.lock b/app/rust_builder/cargokit/build_tool/pubspec.lock new file mode 100644 index 0000000..343bdd3 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/pubspec.lock @@ -0,0 +1,453 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051 + url: "https://pub.dev" + source: hosted + version: "64.0.0" + adaptive_number: + dependency: transitive + description: + name: adaptive_number + sha256: "3a567544e9b5c9c803006f51140ad544aedc79604fd4f3f2c1380003f97c1d77" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + args: + dependency: "direct main" + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + collection: + dependency: "direct main" + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + convert: + dependency: "direct main" + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + coverage: + dependency: transitive + description: + name: coverage + sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" + url: "https://pub.dev" + source: hosted + version: "1.6.3" + crypto: + dependency: "direct main" + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + ed25519_edwards: + dependency: "direct main" + description: + name: ed25519_edwards + sha256: "6ce0112d131327ec6d42beede1e5dfd526069b18ad45dcf654f15074ad9276cd" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + file: + dependency: transitive + description: + name: file + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" + source: hosted + version: "6.1.4" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + github: + dependency: "direct main" + description: + name: github + sha256: "9966bc13bf612342e916b0a343e95e5f046c88f602a14476440e9b75d2295411" + url: "https://pub.dev" + source: hosted + version: "9.17.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + hex: + dependency: "direct main" + description: + name: hex + sha256: "4e7cd54e4b59ba026432a6be2dd9d96e4c5205725194997193bf871703b82c4a" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + http: + dependency: "direct main" + description: + name: http + sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.dev" + source: hosted + version: "4.8.1" + lints: + dependency: "direct dev" + description: + name: lints + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + logging: + dependency: "direct main" + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.dev" + source: hosted + version: "0.12.16" + meta: + dependency: transitive + description: + name: meta + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + mime: + dependency: transitive + description: + name: mime + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" + source: hosted + version: "1.0.4" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: "direct main" + description: + name: path + sha256: "2ad4cddff7f5cc0e2d13069f2a3f7a73ca18f66abd6f5ecf215219cdb3638edb" + url: "https://pub.dev" + source: hosted + version: "1.8.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 + url: "https://pub.dev" + source: hosted + version: "5.4.0" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e + url: "https://pub.dev" + source: hosted + version: "1.1.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" + source: hosted + version: "0.10.12" + source_span: + dependency: "direct main" + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test: + dependency: "direct dev" + description: + name: test + sha256: "9b0dd8e36af4a5b1569029949d50a52cb2a2a2fdaa20cebb96e6603b9ae241f9" + url: "https://pub.dev" + source: hosted + version: "1.24.6" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + test_core: + dependency: transitive + description: + name: test_core + sha256: "4bef837e56375537055fdbbbf6dd458b1859881f4c7e6da936158f77d61ab265" + url: "https://pub.dev" + source: hosted + version: "0.5.6" + toml: + dependency: "direct main" + description: + name: toml + sha256: "157c5dca5160fced243f3ce984117f729c788bb5e475504f3dbcda881accee44" + url: "https://pub.dev" + source: hosted + version: "0.14.0" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + version: + dependency: "direct main" + description: + name: version + sha256: "2307e23a45b43f96469eeab946208ed63293e8afca9c28cd8b5241ff31c55f55" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "0fae432c85c4ea880b33b497d32824b97795b04cdaa74d270219572a1f50268d" + url: "https://pub.dev" + source: hosted + version: "11.9.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + yaml: + dependency: "direct main" + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.0.0 <4.0.0" diff --git a/app/rust_builder/cargokit/build_tool/pubspec.yaml b/app/rust_builder/cargokit/build_tool/pubspec.yaml new file mode 100644 index 0000000..18c61e3 --- /dev/null +++ b/app/rust_builder/cargokit/build_tool/pubspec.yaml @@ -0,0 +1,33 @@ +# This is copied from Cargokit (which is the official way to use it currently) +# Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +name: build_tool +description: Cargokit build_tool. Facilitates the build of Rust crate during Flutter application build. +publish_to: none +version: 1.0.0 + +environment: + sdk: ">=3.0.0 <4.0.0" + +# Add regular dependencies here. +dependencies: + # these are pinned on purpose because the bundle_tool_runner doesn't have + # pubspec.lock. See run_build_tool.sh + logging: 1.2.0 + path: 1.8.0 + version: 3.0.0 + collection: 1.18.0 + ed25519_edwards: 0.3.1 + hex: 0.2.0 + yaml: 3.1.2 + source_span: 1.10.0 + github: 9.17.0 + args: 2.4.2 + crypto: 3.0.3 + convert: 3.1.1 + http: 1.1.0 + toml: 0.14.0 + +dev_dependencies: + lints: ^2.1.0 + test: ^1.24.0 diff --git a/app/rust_builder/cargokit/cmake/cargokit.cmake b/app/rust_builder/cargokit/cmake/cargokit.cmake new file mode 100644 index 0000000..ddd05df --- /dev/null +++ b/app/rust_builder/cargokit/cmake/cargokit.cmake @@ -0,0 +1,99 @@ +SET(cargokit_cmake_root "${CMAKE_CURRENT_LIST_DIR}/..") + +# Workaround for https://github.com/dart-lang/pub/issues/4010 +get_filename_component(cargokit_cmake_root "${cargokit_cmake_root}" REALPATH) + +if(WIN32) + # REALPATH does not properly resolve symlinks on windows :-/ + execute_process(COMMAND powershell -ExecutionPolicy Bypass -File "${CMAKE_CURRENT_LIST_DIR}/resolve_symlinks.ps1" "${cargokit_cmake_root}" OUTPUT_VARIABLE cargokit_cmake_root OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() + +# Arguments +# - target: CMAKE target to which rust library is linked +# - manifest_dir: relative path from current folder to directory containing cargo manifest +# - lib_name: cargo package name +# - any_symbol_name: name of any exported symbol from the library. +# used on windows to force linking with library. +function(apply_cargokit target manifest_dir lib_name any_symbol_name) + + set(CARGOKIT_LIB_NAME "${lib_name}") + set(CARGOKIT_LIB_FULL_NAME "${CMAKE_SHARED_MODULE_PREFIX}${CARGOKIT_LIB_NAME}${CMAKE_SHARED_MODULE_SUFFIX}") + if (CMAKE_CONFIGURATION_TYPES) + set(CARGOKIT_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/$") + set(OUTPUT_LIB "${CMAKE_CURRENT_BINARY_DIR}/$/${CARGOKIT_LIB_FULL_NAME}") + else() + set(CARGOKIT_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}") + set(OUTPUT_LIB "${CMAKE_CURRENT_BINARY_DIR}/${CARGOKIT_LIB_FULL_NAME}") + endif() + set(CARGOKIT_TEMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/cargokit_build") + + if (FLUTTER_TARGET_PLATFORM) + set(CARGOKIT_TARGET_PLATFORM "${FLUTTER_TARGET_PLATFORM}") + else() + set(CARGOKIT_TARGET_PLATFORM "windows-x64") + endif() + + set(CARGOKIT_ENV + "CARGOKIT_CMAKE=${CMAKE_COMMAND}" + "CARGOKIT_CONFIGURATION=$" + "CARGOKIT_MANIFEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/${manifest_dir}" + "CARGOKIT_TARGET_TEMP_DIR=${CARGOKIT_TEMP_DIR}" + "CARGOKIT_OUTPUT_DIR=${CARGOKIT_OUTPUT_DIR}" + "CARGOKIT_TARGET_PLATFORM=${CARGOKIT_TARGET_PLATFORM}" + "CARGOKIT_TOOL_TEMP_DIR=${CARGOKIT_TEMP_DIR}/tool" + "CARGOKIT_ROOT_PROJECT_DIR=${CMAKE_SOURCE_DIR}" + ) + + if (WIN32) + set(SCRIPT_EXTENSION ".cmd") + set(IMPORT_LIB_EXTENSION ".lib") + else() + set(SCRIPT_EXTENSION ".sh") + set(IMPORT_LIB_EXTENSION "") + execute_process(COMMAND chmod +x "${cargokit_cmake_root}/run_build_tool${SCRIPT_EXTENSION}") + endif() + + # Using generators in custom command is only supported in CMake 3.20+ + if (CMAKE_CONFIGURATION_TYPES AND ${CMAKE_VERSION} VERSION_LESS "3.20.0") + foreach(CONFIG IN LISTS CMAKE_CONFIGURATION_TYPES) + add_custom_command( + OUTPUT + "${CMAKE_CURRENT_BINARY_DIR}/${CONFIG}/${CARGOKIT_LIB_FULL_NAME}" + "${CMAKE_CURRENT_BINARY_DIR}/_phony_" + COMMAND ${CMAKE_COMMAND} -E env ${CARGOKIT_ENV} + "${cargokit_cmake_root}/run_build_tool${SCRIPT_EXTENSION}" build-cmake + VERBATIM + ) + endforeach() + else() + add_custom_command( + OUTPUT + ${OUTPUT_LIB} + "${CMAKE_CURRENT_BINARY_DIR}/_phony_" + COMMAND ${CMAKE_COMMAND} -E env ${CARGOKIT_ENV} + "${cargokit_cmake_root}/run_build_tool${SCRIPT_EXTENSION}" build-cmake + VERBATIM + ) + endif() + + + set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/_phony_" PROPERTIES SYMBOLIC TRUE) + + if (TARGET ${target}) + # If we have actual cmake target provided create target and make existing + # target depend on it + add_custom_target("${target}_cargokit" DEPENDS ${OUTPUT_LIB}) + add_dependencies("${target}" "${target}_cargokit") + target_link_libraries("${target}" PRIVATE "${OUTPUT_LIB}${IMPORT_LIB_EXTENSION}") + if(WIN32) + target_link_options(${target} PRIVATE "/INCLUDE:${any_symbol_name}") + endif() + else() + # Otherwise (FFI) just use ALL to force building always + add_custom_target("${target}_cargokit" ALL DEPENDS ${OUTPUT_LIB}) + endif() + + # Allow adding the output library to plugin bundled libraries + set("${target}_cargokit_lib" ${OUTPUT_LIB} PARENT_SCOPE) + +endfunction() diff --git a/app/rust_builder/cargokit/cmake/resolve_symlinks.ps1 b/app/rust_builder/cargokit/cmake/resolve_symlinks.ps1 new file mode 100644 index 0000000..3d10d28 --- /dev/null +++ b/app/rust_builder/cargokit/cmake/resolve_symlinks.ps1 @@ -0,0 +1,27 @@ +function Resolve-Symlinks { + [CmdletBinding()] + [OutputType([string])] + param( + [Parameter(Position = 0, Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] + [string] $Path + ) + + [string] $separator = '/' + [string[]] $parts = $Path.Split($separator) + + [string] $realPath = '' + foreach ($part in $parts) { + if ($realPath -and !$realPath.EndsWith($separator)) { + $realPath += $separator + } + $realPath += $part + $item = Get-Item $realPath + if ($item.Target) { + $realPath = $item.Target.Replace('\', '/') + } + } + $realPath +} + +$path=Resolve-Symlinks -Path $args[0] +Write-Host $path diff --git a/app/rust_builder/cargokit/gradle/plugin.gradle b/app/rust_builder/cargokit/gradle/plugin.gradle new file mode 100644 index 0000000..d139d04 --- /dev/null +++ b/app/rust_builder/cargokit/gradle/plugin.gradle @@ -0,0 +1,179 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import java.nio.file.Paths +import org.apache.tools.ant.taskdefs.condition.Os + +CargoKitPlugin.file = buildscript.sourceFile + +apply plugin: CargoKitPlugin + +class CargoKitExtension { + String manifestDir; // Relative path to folder containing Cargo.toml + String libname; // Library name within Cargo.toml. Must be a cdylib +} + +abstract class CargoKitBuildTask extends DefaultTask { + + @Input + String buildMode + + @Input + String buildDir + + @Input + String outputDir + + @Input + String ndkVersion + + @Input + String sdkDirectory + + @Input + int compileSdkVersion; + + @Input + int minSdkVersion; + + @Input + String pluginFile + + @Input + List targetPlatforms + + @TaskAction + def build() { + if (project.cargokit.manifestDir == null) { + throw new GradleException("Property 'manifestDir' must be set on cargokit extension"); + } + + if (project.cargokit.libname == null) { + throw new GradleException("Property 'libname' must be set on cargokit extension"); + } + + def executableName = Os.isFamily(Os.FAMILY_WINDOWS) ? "run_build_tool.cmd" : "run_build_tool.sh" + def path = Paths.get(new File(pluginFile).parent, "..", executableName); + + def manifestDir = Paths.get(project.buildscript.sourceFile.parent, project.cargokit.manifestDir) + + def rootProjectDir = project.rootProject.projectDir + + if (!Os.isFamily(Os.FAMILY_WINDOWS)) { + project.exec { + commandLine 'chmod', '+x', path + } + } + + project.exec { + executable path + args "build-gradle" + environment "CARGOKIT_ROOT_PROJECT_DIR", rootProjectDir + environment "CARGOKIT_TOOL_TEMP_DIR", "${buildDir}/build_tool" + environment "CARGOKIT_MANIFEST_DIR", manifestDir + environment "CARGOKIT_CONFIGURATION", buildMode + environment "CARGOKIT_TARGET_TEMP_DIR", buildDir + environment "CARGOKIT_OUTPUT_DIR", outputDir + environment "CARGOKIT_NDK_VERSION", ndkVersion + environment "CARGOKIT_SDK_DIR", sdkDirectory + environment "CARGOKIT_COMPILE_SDK_VERSION", compileSdkVersion + environment "CARGOKIT_MIN_SDK_VERSION", minSdkVersion + environment "CARGOKIT_TARGET_PLATFORMS", targetPlatforms.join(",") + environment "CARGOKIT_JAVA_HOME", System.properties['java.home'] + } + } +} + +class CargoKitPlugin implements Plugin { + + static String file; + + private Plugin findFlutterPlugin(Project rootProject) { + _findFlutterPlugin(rootProject.childProjects) + } + + private Plugin _findFlutterPlugin(Map projects) { + for (project in projects) { + for (plugin in project.value.getPlugins()) { + if (plugin.class.name == "com.flutter.gradle.FlutterPlugin") { + return plugin; + } + } + def plugin = _findFlutterPlugin(project.value.childProjects); + if (plugin != null) { + return plugin; + } + } + return null; + } + + @Override + void apply(Project project) { + def plugin = findFlutterPlugin(project.rootProject); + + project.extensions.create("cargokit", CargoKitExtension) + + if (plugin == null) { + print("Flutter plugin not found, CargoKit plugin will not be applied.") + return; + } + + def cargoBuildDir = "${project.buildDir}/build" + + // Determine if the project is an application or library + def isApplication = plugin.project.plugins.hasPlugin('com.android.application') + def variants = isApplication ? plugin.project.android.applicationVariants : plugin.project.android.libraryVariants + + variants.all { variant -> + + final buildType = variant.buildType.name + + def cargoOutputDir = "${project.buildDir}/jniLibs/${buildType}"; + def jniLibs = project.android.sourceSets.maybeCreate(buildType).jniLibs; + jniLibs.srcDir(new File(cargoOutputDir)) + + def platforms = com.flutter.gradle.FlutterPluginUtils.getTargetPlatforms(project).collect() + + // Same thing addFlutterDependencies does in flutter.gradle + if (buildType == "debug") { + platforms.add("android-x86") + platforms.add("android-x64") + } + + // The task name depends on plugin properties, which are not available + // at this point + project.getGradle().afterProject { + def taskName = "cargokitCargoBuild${project.cargokit.libname.capitalize()}${buildType.capitalize()}"; + + if (project.tasks.findByName(taskName)) { + return + } + + if (plugin.project.android.ndkVersion == null) { + throw new GradleException("Please set 'android.ndkVersion' in 'app/build.gradle'.") + } + + def task = project.tasks.create(taskName, CargoKitBuildTask.class) { + buildMode = variant.buildType.name + buildDir = cargoBuildDir + outputDir = cargoOutputDir + ndkVersion = plugin.project.android.ndkVersion + sdkDirectory = plugin.project.android.sdkDirectory + minSdkVersion = plugin.project.android.defaultConfig.minSdkVersion.apiLevel as int + compileSdkVersion = plugin.project.android.compileSdkVersion.substring(8) as int + targetPlatforms = platforms + pluginFile = CargoKitPlugin.file + } + def onTask = { newTask -> + if (newTask.name == "merge${buildType.capitalize()}NativeLibs") { + newTask.dependsOn task + // Fix gradle 7.4.2 not picking up JNI library changes + newTask.outputs.upToDateWhen { false } + } + } + project.tasks.each onTask + project.tasks.whenTaskAdded onTask + } + } + } +} diff --git a/app/rust_builder/cargokit/run_build_tool.cmd b/app/rust_builder/cargokit/run_build_tool.cmd new file mode 100644 index 0000000..c45d0aa --- /dev/null +++ b/app/rust_builder/cargokit/run_build_tool.cmd @@ -0,0 +1,91 @@ +@echo off +setlocal + +setlocal ENABLEDELAYEDEXPANSION + +SET BASEDIR=%~dp0 + +if not exist "%CARGOKIT_TOOL_TEMP_DIR%" ( + mkdir "%CARGOKIT_TOOL_TEMP_DIR%" +) +cd /D "%CARGOKIT_TOOL_TEMP_DIR%" + +SET BUILD_TOOL_PKG_DIR=%BASEDIR%build_tool +SET DART=%FLUTTER_ROOT%\bin\cache\dart-sdk\bin\dart + +set BUILD_TOOL_PKG_DIR_POSIX=%BUILD_TOOL_PKG_DIR:\=/% + +( + echo name: build_tool_runner + echo version: 1.0.0 + echo publish_to: none + echo. + echo environment: + echo sdk: '^>=3.0.0 ^<4.0.0' + echo. + echo dependencies: + echo build_tool: + echo path: %BUILD_TOOL_PKG_DIR_POSIX% +) >pubspec.yaml + +if not exist bin ( + mkdir bin +) + +( + echo import 'package:build_tool/build_tool.dart' as build_tool; + echo void main^(List^ args^) ^{ + echo build_tool.runMain^(args^); + echo ^} +) >bin\build_tool_runner.dart + +SET PRECOMPILED=bin\build_tool_runner.dill + +REM To detect changes in package we compare output of DIR /s (recursive) +set PREV_PACKAGE_INFO=.dart_tool\package_info.prev +set CUR_PACKAGE_INFO=.dart_tool\package_info.cur + +DIR "%BUILD_TOOL_PKG_DIR%" /s > "%CUR_PACKAGE_INFO%_orig" + +REM Last line in dir output is free space on harddrive. That is bound to +REM change between invocation so we need to remove it +( + Set "Line=" + For /F "UseBackQ Delims=" %%A In ("%CUR_PACKAGE_INFO%_orig") Do ( + SetLocal EnableDelayedExpansion + If Defined Line Echo !Line! + EndLocal + Set "Line=%%A") +) >"%CUR_PACKAGE_INFO%" +DEL "%CUR_PACKAGE_INFO%_orig" + +REM Compare current directory listing with previous +FC /B "%CUR_PACKAGE_INFO%" "%PREV_PACKAGE_INFO%" > nul 2>&1 + +If %ERRORLEVEL% neq 0 ( + REM Changed - copy current to previous and remove precompiled kernel + if exist "%PREV_PACKAGE_INFO%" ( + DEL "%PREV_PACKAGE_INFO%" + ) + MOVE /Y "%CUR_PACKAGE_INFO%" "%PREV_PACKAGE_INFO%" + if exist "%PRECOMPILED%" ( + DEL "%PRECOMPILED%" + ) +) + +REM There is no CUR_PACKAGE_INFO it was renamed in previous step to %PREV_PACKAGE_INFO% +REM which means we need to do pub get and precompile +if not exist "%PRECOMPILED%" ( + echo Running pub get in "%cd%" + "%DART%" pub get --no-precompile + "%DART%" compile kernel bin/build_tool_runner.dart +) + +"%DART%" "%PRECOMPILED%" %* + +REM 253 means invalid snapshot version. +If %ERRORLEVEL% equ 253 ( + "%DART%" pub get --no-precompile + "%DART%" compile kernel bin/build_tool_runner.dart + "%DART%" "%PRECOMPILED%" %* +) diff --git a/app/rust_builder/cargokit/run_build_tool.sh b/app/rust_builder/cargokit/run_build_tool.sh new file mode 100755 index 0000000..6e594a2 --- /dev/null +++ b/app/rust_builder/cargokit/run_build_tool.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash + +set -e + +BASEDIR=$(dirname "$0") + +mkdir -p "$CARGOKIT_TOOL_TEMP_DIR" + +cd "$CARGOKIT_TOOL_TEMP_DIR" + +# Write a very simple bin package in temp folder that depends on build_tool package +# from Cargokit. This is done to ensure that we don't pollute Cargokit folder +# with .dart_tool contents. + +BUILD_TOOL_PKG_DIR="$BASEDIR/build_tool" + +if [[ -z $FLUTTER_ROOT ]]; then # not defined + DART=dart +else + DART="$FLUTTER_ROOT/bin/cache/dart-sdk/bin/dart" +fi + +cat << EOF > "pubspec.yaml" +name: build_tool_runner +version: 1.0.0 +publish_to: none + +environment: + sdk: '>=3.0.0 <4.0.0' + +dependencies: + build_tool: + path: "$BUILD_TOOL_PKG_DIR" +EOF + +mkdir -p "bin" + +cat << EOF > "bin/build_tool_runner.dart" +import 'package:build_tool/build_tool.dart' as build_tool; +void main(List args) { + build_tool.runMain(args); +} +EOF + +# Create alias for `shasum` if it does not exist and `sha1sum` exists +if ! [ -x "$(command -v shasum)" ] && [ -x "$(command -v sha1sum)" ]; then + shopt -s expand_aliases + alias shasum="sha1sum" +fi + +# Dart run will not cache any package that has a path dependency, which +# is the case for our build_tool_runner. So instead we precompile the package +# ourselves. +# To invalidate the cached kernel we use the hash of ls -LR of the build_tool +# package directory. This should be good enough, as the build_tool package +# itself is not meant to have any path dependencies. + +if [[ "$OSTYPE" == "darwin"* ]]; then + PACKAGE_HASH=$(ls -lTR "$BUILD_TOOL_PKG_DIR" | shasum) +else + PACKAGE_HASH=$(ls -lR --full-time "$BUILD_TOOL_PKG_DIR" | shasum) +fi + +PACKAGE_HASH_FILE=".package_hash" + +if [ -f "$PACKAGE_HASH_FILE" ]; then + EXISTING_HASH=$(cat "$PACKAGE_HASH_FILE") + if [ "$PACKAGE_HASH" != "$EXISTING_HASH" ]; then + rm "$PACKAGE_HASH_FILE" + fi +fi + +# Run pub get if needed. +if [ ! -f "$PACKAGE_HASH_FILE" ]; then + "$DART" pub get --no-precompile + "$DART" compile kernel bin/build_tool_runner.dart + echo "$PACKAGE_HASH" > "$PACKAGE_HASH_FILE" +fi + +set +e + +"$DART" bin/build_tool_runner.dill "$@" + +exit_code=$? + +# 253 means invalid snapshot version. +if [ $exit_code == 253 ]; then + "$DART" pub get --no-precompile + "$DART" compile kernel bin/build_tool_runner.dart + "$DART" bin/build_tool_runner.dill "$@" + exit_code=$? +fi + +exit $exit_code diff --git a/app/rust_builder/ios/Classes/dummy_file.c b/app/rust_builder/ios/Classes/dummy_file.c new file mode 100644 index 0000000..e06dab9 --- /dev/null +++ b/app/rust_builder/ios/Classes/dummy_file.c @@ -0,0 +1 @@ +// This is an empty file to force CocoaPods to create a framework. diff --git a/app/rust_builder/ios/rust_lib_localsend_app.podspec b/app/rust_builder/ios/rust_lib_localsend_app.podspec new file mode 100644 index 0000000..4c31b7e --- /dev/null +++ b/app/rust_builder/ios/rust_lib_localsend_app.podspec @@ -0,0 +1,45 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint rust_lib_localsend_app.podspec` to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'rust_lib_localsend_app' + s.version = '0.0.1' + s.summary = 'A new Flutter FFI plugin project.' + s.description = <<-DESC +A new Flutter FFI plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + + # This will ensure the source files in Classes/ are included in the native + # builds of apps using this FFI plugin. Podspec does not support relative + # paths, so Classes contains a forwarder C file that relatively imports + # `../src/*` so that the C sources can be shared among all target platforms. + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.dependency 'Flutter' + s.platform = :ios, '11.0' + + # Flutter.framework does not contain a i386 slice. + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } + s.swift_version = '5.0' + + s.script_phase = { + :name => 'Build Rust library', + # First argument is relative path to the `rust` folder, second is name of rust library + :script => 'sh "$PODS_TARGET_SRCROOT/../cargokit/build_pod.sh" ../../rust rust_lib_localsend_app', + :execution_position => :before_compile, + :input_files => ['${BUILT_PRODUCTS_DIR}/cargokit_phony'], + # Let XCode know that the static library referenced in -force_load below is + # created by this build step. + :output_files => ["${BUILT_PRODUCTS_DIR}/librust_lib_localsend_app.a"], + } + s.pod_target_xcconfig = { + 'DEFINES_MODULE' => 'YES', + # Flutter.framework does not contain a i386 slice. + 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386', + 'OTHER_LDFLAGS' => '-force_load ${BUILT_PRODUCTS_DIR}/librust_lib_localsend_app.a', + } +end \ No newline at end of file diff --git a/app/rust_builder/linux/CMakeLists.txt b/app/rust_builder/linux/CMakeLists.txt new file mode 100644 index 0000000..83ae241 --- /dev/null +++ b/app/rust_builder/linux/CMakeLists.txt @@ -0,0 +1,19 @@ +# The Flutter tooling requires that developers have CMake 3.10 or later +# installed. You should not increase this version, as doing so will cause +# the plugin to fail to compile for some customers of the plugin. +cmake_minimum_required(VERSION 3.10) + +# Project-level configuration. +set(PROJECT_NAME "rust_lib_localsend_app") +project(${PROJECT_NAME} LANGUAGES CXX) + +include("../cargokit/cmake/cargokit.cmake") +apply_cargokit(${PROJECT_NAME} ../../rust rust_lib_localsend_app "") + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(rust_lib_localsend_app_bundled_libraries + "${${PROJECT_NAME}_cargokit_lib}" + PARENT_SCOPE +) diff --git a/app/rust_builder/macos/Classes/dummy_file.c b/app/rust_builder/macos/Classes/dummy_file.c new file mode 100644 index 0000000..e06dab9 --- /dev/null +++ b/app/rust_builder/macos/Classes/dummy_file.c @@ -0,0 +1 @@ +// This is an empty file to force CocoaPods to create a framework. diff --git a/app/rust_builder/macos/rust_lib_localsend_app.podspec b/app/rust_builder/macos/rust_lib_localsend_app.podspec new file mode 100644 index 0000000..3aa0ead --- /dev/null +++ b/app/rust_builder/macos/rust_lib_localsend_app.podspec @@ -0,0 +1,45 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint rust_lib_localsend_app.podspec` to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'rust_lib_localsend_app' + s.version = '0.0.1' + s.summary = 'A new Flutter FFI plugin project.' + s.description = <<-DESC +A new Flutter FFI plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + + # This will ensure the source files in Classes/ are included in the native + # builds of apps using this FFI plugin. Podspec does not support relative + # paths, so Classes contains a forwarder C file that relatively imports + # `../src/*` so that the C sources can be shared among all target platforms. + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.dependency 'FlutterMacOS' + + s.platform = :osx, '10.11' + s.framework = 'SystemConfiguration' + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } + s.swift_version = '5.0' + + s.script_phase = { + :name => 'Build Rust library', + # First argument is relative path to the `rust` folder, second is name of rust library + :script => 'sh "$PODS_TARGET_SRCROOT/../cargokit/build_pod.sh" ../../rust rust_lib_localsend_app', + :execution_position => :before_compile, + :input_files => ['${BUILT_PRODUCTS_DIR}/cargokit_phony'], + # Let XCode know that the static library referenced in -force_load below is + # created by this build step. + :output_files => ["${BUILT_PRODUCTS_DIR}/librust_lib_localsend_app.a"], + } + s.pod_target_xcconfig = { + 'DEFINES_MODULE' => 'YES', + # Flutter.framework does not contain a i386 slice. + 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386', + 'OTHER_LDFLAGS' => '-force_load ${BUILT_PRODUCTS_DIR}/librust_lib_localsend_app.a', + } +end \ No newline at end of file diff --git a/app/rust_builder/pubspec.yaml b/app/rust_builder/pubspec.yaml new file mode 100644 index 0000000..aca6b91 --- /dev/null +++ b/app/rust_builder/pubspec.yaml @@ -0,0 +1,34 @@ +name: rust_lib_localsend_app +description: "Bindings for the core Rust library" +version: 0.0.1 +publish_to: none + +environment: + sdk: '>=3.3.0 <4.0.0' + flutter: '>=3.3.0' + +dependencies: + flutter: + sdk: flutter + plugin_platform_interface: ^2.0.2 + +dev_dependencies: + ffi: ^2.0.2 + ffigen: ^11.0.0 + flutter_lints: ^2.0.0 + flutter_test: + sdk: flutter + +flutter: + plugin: + platforms: + android: + ffiPlugin: true + ios: + ffiPlugin: true + linux: + ffiPlugin: true + macos: + ffiPlugin: true + windows: + ffiPlugin: true diff --git a/app/rust_builder/windows/.gitignore b/app/rust_builder/windows/.gitignore new file mode 100644 index 0000000..b3eb2be --- /dev/null +++ b/app/rust_builder/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/app/rust_builder/windows/CMakeLists.txt b/app/rust_builder/windows/CMakeLists.txt new file mode 100644 index 0000000..864ef61 --- /dev/null +++ b/app/rust_builder/windows/CMakeLists.txt @@ -0,0 +1,20 @@ +# The Flutter tooling requires that developers have a version of Visual Studio +# installed that includes CMake 3.14 or later. You should not increase this +# version, as doing so will cause the plugin to fail to compile for some +# customers of the plugin. +cmake_minimum_required(VERSION 3.14) + +# Project-level configuration. +set(PROJECT_NAME "rust_lib_localsend_app") +project(${PROJECT_NAME} LANGUAGES CXX) + +include("../cargokit/cmake/cargokit.cmake") +apply_cargokit(${PROJECT_NAME} ../../../../../../rust rust_lib_localsend_app "") + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(rust_lib_localsend_app_bundled_libraries + "${${PROJECT_NAME}_cargokit_lib}" + PARENT_SCOPE +) diff --git a/app/test/mocks.dart b/app/test/mocks.dart new file mode 100644 index 0000000..c06cc46 --- /dev/null +++ b/app/test/mocks.dart @@ -0,0 +1,9 @@ +import 'package:localsend_app/provider/persistence_provider.dart'; +import 'package:mockito/annotations.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +@GenerateNiceMocks([ + MockSpec(), + MockSpec(), +]) +void main() {} diff --git a/app/test/mocks.mocks.dart b/app/test/mocks.mocks.dart new file mode 100644 index 0000000..562dbee --- /dev/null +++ b/app/test/mocks.mocks.dart @@ -0,0 +1,758 @@ +// Mocks generated by Mockito 5.4.6 from annotations +// in localsend_app/test/mocks.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; + +import 'package:common/model/device.dart' as _i12; +import 'package:common/model/stored_security_context.dart' as _i2; +import 'package:flutter/material.dart' as _i8; +import 'package:localsend_app/gen/strings.g.dart' as _i10; +import 'package:localsend_app/model/persistence/color_mode.dart' as _i9; +import 'package:localsend_app/model/persistence/favorite_device.dart' as _i6; +import 'package:localsend_app/model/persistence/receive_history_entry.dart' + as _i5; +import 'package:localsend_app/model/send_mode.dart' as _i11; +import 'package:localsend_app/provider/persistence_provider.dart' as _i3; +import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i7; +import 'package:shared_preferences/shared_preferences.dart' as _i13; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: must_be_immutable +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class +// ignore_for_file: invalid_use_of_internal_member + +class _FakeStoredSecurityContext_0 extends _i1.SmartFake + implements _i2.StoredSecurityContext { + _FakeStoredSecurityContext_0(Object parent, Invocation parentInvocation) + : super(parent, parentInvocation); +} + +/// A class which mocks [PersistenceService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPersistenceService extends _i1.Mock + implements _i3.PersistenceService { + @override + bool get isFirstAppStart => + (super.noSuchMethod( + Invocation.getter(#isFirstAppStart), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + bool isPortableMode() => + (super.noSuchMethod( + Invocation.method(#isPortableMode, []), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + _i2.StoredSecurityContext getSecurityContext() => + (super.noSuchMethod( + Invocation.method(#getSecurityContext, []), + returnValue: _FakeStoredSecurityContext_0( + this, + Invocation.method(#getSecurityContext, []), + ), + returnValueForMissingStub: _FakeStoredSecurityContext_0( + this, + Invocation.method(#getSecurityContext, []), + ), + ) + as _i2.StoredSecurityContext); + + @override + _i4.Future setSecurityContext(_i2.StoredSecurityContext? context) => + (super.noSuchMethod( + Invocation.method(#setSecurityContext, [context]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setSignalingServers(List? servers) => + (super.noSuchMethod( + Invocation.method(#setSignalingServers, [servers]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setStunServers(List? servers) => + (super.noSuchMethod( + Invocation.method(#setStunServers, [servers]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + List<_i5.ReceiveHistoryEntry> getReceiveHistory() => + (super.noSuchMethod( + Invocation.method(#getReceiveHistory, []), + returnValue: <_i5.ReceiveHistoryEntry>[], + returnValueForMissingStub: <_i5.ReceiveHistoryEntry>[], + ) + as List<_i5.ReceiveHistoryEntry>); + + @override + _i4.Future setReceiveHistory(List<_i5.ReceiveHistoryEntry>? entries) => + (super.noSuchMethod( + Invocation.method(#setReceiveHistory, [entries]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + List<_i6.FavoriteDevice> getFavorites() => + (super.noSuchMethod( + Invocation.method(#getFavorites, []), + returnValue: <_i6.FavoriteDevice>[], + returnValueForMissingStub: <_i6.FavoriteDevice>[], + ) + as List<_i6.FavoriteDevice>); + + @override + _i4.Future setFavorites(List<_i6.FavoriteDevice>? entries) => + (super.noSuchMethod( + Invocation.method(#setFavorites, [entries]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + String getShowToken() => + (super.noSuchMethod( + Invocation.method(#getShowToken, []), + returnValue: _i7.dummyValue( + this, + Invocation.method(#getShowToken, []), + ), + returnValueForMissingStub: _i7.dummyValue( + this, + Invocation.method(#getShowToken, []), + ), + ) + as String); + + @override + String getAlias() => + (super.noSuchMethod( + Invocation.method(#getAlias, []), + returnValue: _i7.dummyValue( + this, + Invocation.method(#getAlias, []), + ), + returnValueForMissingStub: _i7.dummyValue( + this, + Invocation.method(#getAlias, []), + ), + ) + as String); + + @override + _i4.Future setAlias(String? alias) => + (super.noSuchMethod( + Invocation.method(#setAlias, [alias]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i8.ThemeMode getTheme() => + (super.noSuchMethod( + Invocation.method(#getTheme, []), + returnValue: _i8.ThemeMode.system, + returnValueForMissingStub: _i8.ThemeMode.system, + ) + as _i8.ThemeMode); + + @override + _i4.Future setTheme(_i8.ThemeMode? theme) => + (super.noSuchMethod( + Invocation.method(#setTheme, [theme]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i9.ColorMode getColorMode() => + (super.noSuchMethod( + Invocation.method(#getColorMode, []), + returnValue: _i9.ColorMode.system, + returnValueForMissingStub: _i9.ColorMode.system, + ) + as _i9.ColorMode); + + @override + _i4.Future setColorMode(_i9.ColorMode? color) => + (super.noSuchMethod( + Invocation.method(#setColorMode, [color]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setLocale(_i10.AppLocale? locale) => + (super.noSuchMethod( + Invocation.method(#setLocale, [locale]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + int getPort() => + (super.noSuchMethod( + Invocation.method(#getPort, []), + returnValue: 0, + returnValueForMissingStub: 0, + ) + as int); + + @override + _i4.Future setPort(int? port) => + (super.noSuchMethod( + Invocation.method(#setPort, [port]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setNetworkWhitelist(List? whitelist) => + (super.noSuchMethod( + Invocation.method(#setNetworkWhitelist, [whitelist]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setNetworkBlacklist(List? blacklist) => + (super.noSuchMethod( + Invocation.method(#setNetworkBlacklist, [blacklist]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + int getDiscoveryTimeout() => + (super.noSuchMethod( + Invocation.method(#getDiscoveryTimeout, []), + returnValue: 0, + returnValueForMissingStub: 0, + ) + as int); + + @override + _i4.Future setDiscoveryTimeout(int? timeout) => + (super.noSuchMethod( + Invocation.method(#setDiscoveryTimeout, [timeout]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + bool getShareViaLinkAutoAccept() => + (super.noSuchMethod( + Invocation.method(#getShareViaLinkAutoAccept, []), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + _i4.Future setShareViaLinkAutoAccept(bool? shareViaLinkAutoAccept) => + (super.noSuchMethod( + Invocation.method(#setShareViaLinkAutoAccept, [ + shareViaLinkAutoAccept, + ]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + String getMulticastGroup() => + (super.noSuchMethod( + Invocation.method(#getMulticastGroup, []), + returnValue: _i7.dummyValue( + this, + Invocation.method(#getMulticastGroup, []), + ), + returnValueForMissingStub: _i7.dummyValue( + this, + Invocation.method(#getMulticastGroup, []), + ), + ) + as String); + + @override + _i4.Future setMulticastGroup(String? group) => + (super.noSuchMethod( + Invocation.method(#setMulticastGroup, [group]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setDestination(String? destination) => + (super.noSuchMethod( + Invocation.method(#setDestination, [destination]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + bool isSaveToGallery() => + (super.noSuchMethod( + Invocation.method(#isSaveToGallery, []), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + _i4.Future setSaveToGallery(bool? saveToGallery) => + (super.noSuchMethod( + Invocation.method(#setSaveToGallery, [saveToGallery]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + bool isSaveToHistory() => + (super.noSuchMethod( + Invocation.method(#isSaveToHistory, []), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + _i4.Future setSaveToHistory(bool? saveToHistory) => + (super.noSuchMethod( + Invocation.method(#setSaveToHistory, [saveToHistory]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + bool getAdvancedSettingsEnabled() => + (super.noSuchMethod( + Invocation.method(#getAdvancedSettingsEnabled, []), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + _i4.Future setAdvancedSettingsEnabled(bool? isEnabled) => + (super.noSuchMethod( + Invocation.method(#setAdvancedSettingsEnabled, [isEnabled]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + bool isQuickSave() => + (super.noSuchMethod( + Invocation.method(#isQuickSave, []), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + _i4.Future setQuickSave(bool? quickSave) => + (super.noSuchMethod( + Invocation.method(#setQuickSave, [quickSave]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + bool isQuickSaveFromFavorites() => + (super.noSuchMethod( + Invocation.method(#isQuickSaveFromFavorites, []), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + _i4.Future setQuickSaveFromFavorites(bool? quickSaveFromFavorites) => + (super.noSuchMethod( + Invocation.method(#setQuickSaveFromFavorites, [ + quickSaveFromFavorites, + ]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setReceivePin(String? pin) => + (super.noSuchMethod( + Invocation.method(#setReceivePin, [pin]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + bool isAutoFinish() => + (super.noSuchMethod( + Invocation.method(#isAutoFinish, []), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + _i4.Future setAutoFinish(bool? autoFinish) => + (super.noSuchMethod( + Invocation.method(#setAutoFinish, [autoFinish]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + bool isMinimizeToTray() => + (super.noSuchMethod( + Invocation.method(#isMinimizeToTray, []), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + _i4.Future setMinimizeToTray(bool? minimizeToTray) => + (super.noSuchMethod( + Invocation.method(#setMinimizeToTray, [minimizeToTray]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + bool isHttps() => + (super.noSuchMethod( + Invocation.method(#isHttps, []), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + _i4.Future setHttps(bool? https) => + (super.noSuchMethod( + Invocation.method(#setHttps, [https]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i11.SendMode getSendMode() => + (super.noSuchMethod( + Invocation.method(#getSendMode, []), + returnValue: _i11.SendMode.single, + returnValueForMissingStub: _i11.SendMode.single, + ) + as _i11.SendMode); + + @override + _i4.Future setSendMode(_i11.SendMode? mode) => + (super.noSuchMethod( + Invocation.method(#setSendMode, [mode]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setWindowOffsetX(double? x) => + (super.noSuchMethod( + Invocation.method(#setWindowOffsetX, [x]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setWindowOffsetY(double? y) => + (super.noSuchMethod( + Invocation.method(#setWindowOffsetY, [y]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setWindowHeight(double? height) => + (super.noSuchMethod( + Invocation.method(#setWindowHeight, [height]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setWindowWidth(double? width) => + (super.noSuchMethod( + Invocation.method(#setWindowWidth, [width]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setSaveWindowPlacement(bool? savePlacement) => + (super.noSuchMethod( + Invocation.method(#setSaveWindowPlacement, [savePlacement]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + bool getSaveWindowPlacement() => + (super.noSuchMethod( + Invocation.method(#getSaveWindowPlacement, []), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + _i4.Future setEnableAnimations(bool? enableAnimations) => + (super.noSuchMethod( + Invocation.method(#setEnableAnimations, [enableAnimations]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + bool getEnableAnimations() => + (super.noSuchMethod( + Invocation.method(#getEnableAnimations, []), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + _i4.Future setDeviceType(_i12.DeviceType? deviceType) => + (super.noSuchMethod( + Invocation.method(#setDeviceType, [deviceType]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future setDeviceModel(String? deviceModel) => + (super.noSuchMethod( + Invocation.method(#setDeviceModel, [deviceModel]), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); + + @override + _i4.Future clear() => + (super.noSuchMethod( + Invocation.method(#clear, []), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); +} + +/// A class which mocks [SharedPreferences]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSharedPreferences extends _i1.Mock implements _i13.SharedPreferences { + @override + Set getKeys() => + (super.noSuchMethod( + Invocation.method(#getKeys, []), + returnValue: {}, + returnValueForMissingStub: {}, + ) + as Set); + + @override + Object? get(String? key) => + (super.noSuchMethod( + Invocation.method(#get, [key]), + returnValueForMissingStub: null, + ) + as Object?); + + @override + bool? getBool(String? key) => + (super.noSuchMethod( + Invocation.method(#getBool, [key]), + returnValueForMissingStub: null, + ) + as bool?); + + @override + int? getInt(String? key) => + (super.noSuchMethod( + Invocation.method(#getInt, [key]), + returnValueForMissingStub: null, + ) + as int?); + + @override + double? getDouble(String? key) => + (super.noSuchMethod( + Invocation.method(#getDouble, [key]), + returnValueForMissingStub: null, + ) + as double?); + + @override + String? getString(String? key) => + (super.noSuchMethod( + Invocation.method(#getString, [key]), + returnValueForMissingStub: null, + ) + as String?); + + @override + bool containsKey(String? key) => + (super.noSuchMethod( + Invocation.method(#containsKey, [key]), + returnValue: false, + returnValueForMissingStub: false, + ) + as bool); + + @override + List? getStringList(String? key) => + (super.noSuchMethod( + Invocation.method(#getStringList, [key]), + returnValueForMissingStub: null, + ) + as List?); + + @override + _i4.Future setBool(String? key, bool? value) => + (super.noSuchMethod( + Invocation.method(#setBool, [key, value]), + returnValue: _i4.Future.value(false), + returnValueForMissingStub: _i4.Future.value(false), + ) + as _i4.Future); + + @override + _i4.Future setInt(String? key, int? value) => + (super.noSuchMethod( + Invocation.method(#setInt, [key, value]), + returnValue: _i4.Future.value(false), + returnValueForMissingStub: _i4.Future.value(false), + ) + as _i4.Future); + + @override + _i4.Future setDouble(String? key, double? value) => + (super.noSuchMethod( + Invocation.method(#setDouble, [key, value]), + returnValue: _i4.Future.value(false), + returnValueForMissingStub: _i4.Future.value(false), + ) + as _i4.Future); + + @override + _i4.Future setString(String? key, String? value) => + (super.noSuchMethod( + Invocation.method(#setString, [key, value]), + returnValue: _i4.Future.value(false), + returnValueForMissingStub: _i4.Future.value(false), + ) + as _i4.Future); + + @override + _i4.Future setStringList(String? key, List? value) => + (super.noSuchMethod( + Invocation.method(#setStringList, [key, value]), + returnValue: _i4.Future.value(false), + returnValueForMissingStub: _i4.Future.value(false), + ) + as _i4.Future); + + @override + _i4.Future remove(String? key) => + (super.noSuchMethod( + Invocation.method(#remove, [key]), + returnValue: _i4.Future.value(false), + returnValueForMissingStub: _i4.Future.value(false), + ) + as _i4.Future); + + @override + _i4.Future commit() => + (super.noSuchMethod( + Invocation.method(#commit, []), + returnValue: _i4.Future.value(false), + returnValueForMissingStub: _i4.Future.value(false), + ) + as _i4.Future); + + @override + _i4.Future clear() => + (super.noSuchMethod( + Invocation.method(#clear, []), + returnValue: _i4.Future.value(false), + returnValueForMissingStub: _i4.Future.value(false), + ) + as _i4.Future); + + @override + _i4.Future reload() => + (super.noSuchMethod( + Invocation.method(#reload, []), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) + as _i4.Future); +} diff --git a/app/test/unit/i18n_test.dart b/app/test/unit/i18n_test.dart new file mode 100644 index 0000000..4dd074c --- /dev/null +++ b/app/test/unit/i18n_test.dart @@ -0,0 +1,19 @@ +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:localsend_app/gen/strings.g.dart'; +import 'package:test/test.dart'; + +void main() { + group('i18n', () { + test('Should compile', () { + // The following test will fail if the i18n file is either not compiled + // or there are compile-time errors. + expect(AppLocale.en.translations.general.accept, 'Accept'); + }); + + test('All locales should be supported by Flutter', () { + for (final locale in AppLocale.values) { + expect(kMaterialSupportedLanguages, contains(locale.languageCode)); + } + }); + }); +} diff --git a/app/test/unit/model/dto/prepare_upload_request_dto_test.dart b/app/test/unit/model/dto/prepare_upload_request_dto_test.dart new file mode 100644 index 0000000..5f7ec71 --- /dev/null +++ b/app/test/unit/model/dto/prepare_upload_request_dto_test.dart @@ -0,0 +1,207 @@ +import 'package:common/model/device.dart'; +import 'package:common/model/dto/file_dto.dart'; +import 'package:common/model/dto/info_register_dto.dart'; +import 'package:common/model/dto/multicast_dto.dart'; +import 'package:common/model/dto/prepare_upload_request_dto.dart'; +import 'package:common/model/dto/prepare_upload_response_dto.dart'; +import 'package:common/model/file_type.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:test/test.dart'; + +void main() { + MapperContainer.globals.use(const FileDtoMapper()); + + group('parse PrepareUploadRequestDto', () { + test('should parse valid enums', () { + final dto = { + 'info': { + 'alias': 'Nice Banana', + 'deviceModel': 'Samsung', + 'deviceType': 'mobile', + }, + 'files': { + 'some id': { + 'id': 'some id', + 'fileName': 'another image.jpg', + 'size': 1234, + 'fileType': 'image', + 'preview': '*preview data*', + }, + }, + }; + final parsed = PrepareUploadRequestDto.fromJson(dto); + expect(parsed.info.deviceType, DeviceType.mobile); + expect(parsed.files.length, 1); + expect(parsed.files.values.first.fileType, FileType.image); + }); + + test('Should fallback deviceType (simple)', () { + final dto = { + 'alias': 'Nice Banana', + 'deviceModel': 'Samsung', + 'deviceType': 'invalidType', + }; + + final parsed = InfoRegisterDto.fromJson(dto); + expect(parsed.deviceType, DeviceType.desktop); + }); + + test('should fallback deviceType', () { + final dto = { + 'info': { + 'alias': 'Nice Banana', + 'deviceModel': 'Samsung', + 'deviceType': 'invalidType', + }, + 'files': { + 'some id': { + 'id': 'some id', + 'fileName': 'another image.jpg', + 'size': 1234, + 'fileType': 'image', + 'preview': '*preview data*', + }, + }, + }; + final parsed = PrepareUploadRequestDto.fromJson(dto); + expect(parsed.info.deviceType, DeviceType.desktop); + expect(parsed.files.length, 1); + expect(parsed.files.values.first.fileType, FileType.image); + }); + + test('should fallback fileType', () { + final dto = { + 'info': { + 'alias': 'Nice Banana', + 'deviceModel': 'Samsung', + 'deviceType': 'mobile', + }, + 'files': { + 'some id': { + 'id': 'some id', + 'fileName': 'another image.jpg', + 'size': 1234, + 'fileType': 'superBigImage', + 'preview': '*preview data*', + }, + }, + }; + final parsed = PrepareUploadRequestDto.fromJson(dto); + expect(parsed.info.deviceType, DeviceType.mobile); + expect(parsed.files.length, 1); + expect(parsed.files.values.first.fileType, FileType.other); + }); + + test('should parse mime type', () { + final dto = { + 'info': { + 'alias': 'Nice Banana', + 'deviceModel': 'Samsung', + 'deviceType': 'mobile', + }, + 'files': { + 'some id': { + 'id': 'some id', + 'fileName': 'another image.jpg', + 'size': 1234, + 'fileType': 'image/jpeg', + 'preview': '*preview data*', + }, + }, + }; + final parsed = PrepareUploadRequestDto.fromJson(dto); + expect(parsed.info.deviceType, DeviceType.mobile); + expect(parsed.files.length, 1); + expect(parsed.files.values.first.fileType, FileType.image); + }); + + test('should parse apk mime type', () { + final dto = { + 'info': { + 'alias': 'Nice Banana', + 'deviceModel': 'Samsung', + 'deviceType': 'mobile', + }, + 'files': { + 'some id': { + 'id': 'some id', + 'fileName': 'myApk.apk', + 'size': 1234, + 'fileType': 'application/vnd.android.package-archive', + }, + }, + }; + final parsed = PrepareUploadRequestDto.fromJson(dto); + expect(parsed.info.deviceType, DeviceType.mobile); + expect(parsed.files.length, 1); + expect(parsed.files.values.first.fileType, FileType.apk); + }); + }); + + group('serialize PrepareUploadRequestDto', () { + const info = InfoRegisterDto( + alias: 'Nice Banana', + version: '2.0', + deviceModel: 'Samsung', + deviceType: DeviceType.mobile, + fingerprint: '123', + port: 123, + protocol: ProtocolType.http, + download: false, + ); + + test('should serialize in mime mode', () { + final dto = PrepareUploadRequestDto( + info: info, + files: { + 'some id': const FileDto( + id: 'some id', + fileName: 'another image.jpg', + size: 1234, + fileType: FileType.image, + hash: '*hash*', + preview: '*preview data*', + metadata: null, + ), + 'some id 2': FileDto( + id: 'some id 2', + fileName: 'my apk.apk', + size: 1234, + fileType: FileType.apk, + hash: '*hash*', + preview: '*preview data*', + metadata: FileMetadata( + lastModified: DateTime.utc(2020), + lastAccessed: DateTime.utc(2021), + ), + ), + }, + ); + final serialized = dto.toJson(); + + expect(serialized['info']['deviceType'], 'mobile'); + expect(serialized['files'].length, 2); + expect(serialized['files']['some id']['fileType'], 'image/jpeg'); + expect(serialized['files']['some id 2']['fileType'], 'application/vnd.android.package-archive'); + expect(serialized['files']['some id 2']['metadata'], { + 'modified': '2020-01-01T00:00:00.000Z', + 'accessed': '2021-01-01T00:00:00.000Z', + }); + }); + }); + + test('PrepareUploadResponseDto', () { + final parsed = PrepareUploadResponseDto.fromJson({ + 'sessionId': 'some session id', + 'files': { + 'some id': 'some url', + 'some id 2': 'some url 2', + }, + }); + + expect(parsed.sessionId, 'some session id'); + expect(parsed.files.length, 2); + expect(parsed.files['some id'], 'some url'); + expect(parsed.files['some id 2'], 'some url 2'); + }); +} diff --git a/app/test/unit/provider/favorites_provider_test.dart b/app/test/unit/provider/favorites_provider_test.dart new file mode 100644 index 0000000..ffcc3e0 --- /dev/null +++ b/app/test/unit/provider/favorites_provider_test.dart @@ -0,0 +1,114 @@ +import 'package:localsend_app/model/persistence/favorite_device.dart'; +import 'package:localsend_app/provider/favorites_provider.dart'; +import 'package:mockito/mockito.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:test/test.dart'; + +import '../../mocks.mocks.dart'; + +void main() { + late MockPersistenceService persistenceService; + + setUp(() { + persistenceService = MockPersistenceService(); + }); + + test('Should add a favorite device', () async { + final service = ReduxNotifier.test( + redux: FavoritesService(persistenceService), + ); + + expect(service.state, []); + + final device = _createDevice('1'); + + await service.dispatchAsync(AddFavoriteAction(device)); + + expect(service.state, [device]); + verify(persistenceService.setFavorites([device])); + }); + + test('Should update a favorite device', () async { + final initialDevice = _createDevice('1', alias: 'A'); + final service = ReduxNotifier.test( + redux: FavoritesService(persistenceService), + initialState: [initialDevice], + ); + + // Sanity check + expect(service.state, [initialDevice]); + expect(service.state.first.alias, 'A'); + + final updatedDevice = _createDevice('1', alias: 'B'); + await service.dispatchAsync(UpdateFavoriteAction(updatedDevice)); + + expect(service.state, [updatedDevice]); + expect(service.state.first.alias, 'B'); + verify(persistenceService.setFavorites([updatedDevice])); + }); + + test('Should not update a favorite device if unknown id', () async { + final initialDevice = _createDevice('1', alias: 'A'); + final service = ReduxNotifier.test( + redux: FavoritesService(persistenceService), + initialState: [initialDevice], + ); + + // Sanity check + expect(service.state, [initialDevice]); + expect(service.state.first.alias, 'A'); + + final updatedDevice = _createDevice('2', alias: 'B'); + await service.dispatchAsync(UpdateFavoriteAction(updatedDevice)); + + expect(service.state, [initialDevice]); + expect(service.state.first.alias, 'A'); + verifyNever(persistenceService.setFavorites(any)); + }); + + test('Should delete favorite device', () async { + final initialDevice = _createDevice('1', fingerprint: '111'); + final service = ReduxNotifier.test( + redux: FavoritesService(persistenceService), + initialState: [initialDevice], + ); + + // Sanity check + expect(service.state, [initialDevice]); + + await service.dispatchAsync(RemoveFavoriteAction(deviceFingerprint: '111')); + + expect(service.state, []); + verify(persistenceService.setFavorites([])); + }); + + test('Should not delete favorite device if unknown fingerprint', () async { + final initialDevice = _createDevice('1', fingerprint: '111'); + final service = ReduxNotifier.test( + redux: FavoritesService(persistenceService), + initialState: [initialDevice], + ); + + // Sanity check + expect(service.state, [initialDevice]); + + await service.dispatchAsync(RemoveFavoriteAction(deviceFingerprint: '222')); + + expect(service.state, [initialDevice]); + verifyNever(persistenceService.setFavorites(any)); + }); +} + +FavoriteDevice _createDevice( + String id, { + String fingerprint = '123', + String alias = 'A', +}) { + return FavoriteDevice( + id: id, + fingerprint: fingerprint, + ip: '1.2.3.4', + port: 123, + alias: alias, + ); +} diff --git a/app/test/unit/provider/last_devices_provider_test.dart b/app/test/unit/provider/last_devices_provider_test.dart new file mode 100644 index 0000000..2068ec0 --- /dev/null +++ b/app/test/unit/provider/last_devices_provider_test.dart @@ -0,0 +1,67 @@ +import 'package:common/model/device.dart'; +import 'package:localsend_app/provider/last_devices.provider.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:test/test.dart'; + +void main() { + test('Should add a device', () { + final service = ReduxNotifier.test( + redux: LastDevicesService(), + ); + + expect(service.state, []); + + final device = _createDevice('123.123'); + service.dispatch(AddLastDeviceAction(device)); + + expect(service.state, [device]); + }); + + test('Should remove the 5th device', () { + final service = ReduxNotifier.test( + redux: LastDevicesService(), + ); + + service.dispatch(AddLastDeviceAction(_createDevice('1'))); + service.dispatch(AddLastDeviceAction(_createDevice('2'))); + service.dispatch(AddLastDeviceAction(_createDevice('3'))); + service.dispatch(AddLastDeviceAction(_createDevice('4'))); + service.dispatch(AddLastDeviceAction(_createDevice('5'))); + + expect(service.state.length, 5); + expect(service.state, [ + _createDevice('5'), + _createDevice('4'), + _createDevice('3'), + _createDevice('2'), + _createDevice('1'), + ]); + + service.dispatch(AddLastDeviceAction(_createDevice('6'))); + + expect(service.state.length, 5); + expect(service.state, [ + _createDevice('6'), + _createDevice('5'), + _createDevice('4'), + _createDevice('3'), + _createDevice('2'), // 5th device removed + ]); + }); +} + +Device _createDevice(String ip) { + return Device( + signalingId: null, + ip: ip, + version: '1', + port: 123, + https: true, + fingerprint: '123', + alias: 'A', + deviceModel: 'A', + deviceType: DeviceType.mobile, + download: false, + discoveryMethods: {}, + ); +} diff --git a/app/test/unit/provider/network_info_provider_test.dart b/app/test/unit/provider/network_info_provider_test.dart new file mode 100644 index 0000000..6c47bd4 --- /dev/null +++ b/app/test/unit/provider/network_info_provider_test.dart @@ -0,0 +1,22 @@ +import 'package:localsend_app/provider/local_ip_provider.dart'; +import 'package:test/test.dart'; + +void main() { + group('rankIpAddresses', () { + test('should only sort list if no primary', () { + expect(rankIpAddresses(['123.456', '222.1', '321.222'], null), ['123.456', '321.222', '222.1']); + }); + + test('should only take primary', () { + expect(rankIpAddresses([], '123.123'), ['123.123']); + }); + + test('should sort primary first', () { + expect(rankIpAddresses(['123.456', '222.1', '321.222'], '123.123'), ['123.123', '123.456', '321.222', '222.1']); + }); + + test('should sort primary first and remove duplicates', () { + expect(rankIpAddresses(['123.456', '123.123', '222.1', '222.1', '321.222'], '123.123'), ['123.123', '123.456', '321.222', '222.1']); + }); + }); +} diff --git a/app/test/unit/provider/receive_history_provider_test.dart b/app/test/unit/provider/receive_history_provider_test.dart new file mode 100644 index 0000000..edb413f --- /dev/null +++ b/app/test/unit/provider/receive_history_provider_test.dart @@ -0,0 +1,189 @@ +import 'package:common/model/file_type.dart'; +import 'package:intl/date_symbol_data_local.dart'; +import 'package:localsend_app/model/persistence/receive_history_entry.dart'; +import 'package:localsend_app/provider/receive_history_provider.dart'; +import 'package:mockito/mockito.dart'; +import 'package:refena_flutter/refena_flutter.dart'; +import 'package:test/test.dart'; + +import '../../mocks.mocks.dart'; + +void main() { + late MockPersistenceService persistenceService; + + setUpAll(() async { + await initializeDateFormatting(); + }); + + setUp(() { + persistenceService = MockPersistenceService(); + when(persistenceService.isSaveToHistory()).thenReturn(true); + }); + + test('Should add an entry', () async { + final service = ReduxNotifier.test( + redux: ReceiveHistoryService(persistenceService), + ); + + final entry = _createEntry('1'); + + await service.dispatchAsync( + AddHistoryEntryAction( + entryId: entry.id, + fileName: entry.fileName, + fileType: entry.fileType, + path: entry.path, + savedToGallery: entry.savedToGallery, + isMessage: entry.isMessage, + fileSize: entry.fileSize, + senderAlias: entry.senderAlias, + timestamp: entry.timestamp, + ), + ); + + expect(service.state, [entry]); + verify(persistenceService.setReceiveHistory([entry])); + }); + + test('Should not add an entry if disabled', () async { + when(persistenceService.isSaveToHistory()).thenReturn(false); + + final service = ReduxNotifier.test( + redux: ReceiveHistoryService(persistenceService), + ); + + final entry = _createEntry('1'); + + await service.dispatchAsync( + AddHistoryEntryAction( + entryId: entry.id, + fileName: entry.fileName, + fileType: entry.fileType, + path: entry.path, + savedToGallery: entry.savedToGallery, + isMessage: entry.isMessage, + fileSize: entry.fileSize, + senderAlias: entry.senderAlias, + timestamp: entry.timestamp, + ), + ); + + expect(service.state, []); + verifyNever(persistenceService.setReceiveHistory(any)); + }); + + test('Should remove the 30th entry when adding another', () async { + final service = ReduxNotifier.test( + redux: ReceiveHistoryService(persistenceService), + initialState: List.generate(30, (index) => _createEntry(index.toString())), + ); + + expect(service.state.length, 30); + expect(service.state.first, _createEntry('0')); + expect(service.state.last, _createEntry('29')); + + final entry = _createEntry('AAA'); + + await service.dispatchAsync( + AddHistoryEntryAction( + entryId: entry.id, + fileName: entry.fileName, + fileType: entry.fileType, + path: entry.path, + savedToGallery: entry.savedToGallery, + isMessage: entry.isMessage, + fileSize: entry.fileSize, + senderAlias: entry.senderAlias, + timestamp: entry.timestamp, + ), + ); + + expect(service.state.length, 30); + expect(service.state.first, entry); + expect(service.state.first, _createEntry('AAA')); + expect(service.state[1], _createEntry('0')); + expect(service.state.last, _createEntry('28')); + }); + + test('Should remove an entry', () async { + final service = ReduxNotifier.test( + redux: ReceiveHistoryService(persistenceService), + initialState: [ + _createEntry('1'), + _createEntry('2'), + _createEntry('3'), + ], + ); + + expect(service.state.length, 3); + + await service.dispatchAsync(RemoveHistoryEntryAction('2')); + + expect(service.state.length, 2); + expect(service.state, [ + _createEntry('1'), + _createEntry('3'), + ]); + verify( + persistenceService.setReceiveHistory([ + _createEntry('1'), + _createEntry('3'), + ]), + ); + }); + + test('Should not remove an entry if not found', () async { + final service = ReduxNotifier.test( + redux: ReceiveHistoryService(persistenceService), + initialState: [ + _createEntry('1'), + _createEntry('2'), + _createEntry('3'), + ], + ); + + expect(service.state.length, 3); + + await service.dispatchAsync(RemoveHistoryEntryAction('4')); + + expect(service.state.length, 3); + expect(service.state, [ + _createEntry('1'), + _createEntry('2'), + _createEntry('3'), + ]); + verifyNever(persistenceService.setReceiveHistory(any)); + }); + + test('Should remove all entries', () async { + final service = ReduxNotifier.test( + redux: ReceiveHistoryService(persistenceService), + initialState: [ + _createEntry('1'), + _createEntry('2'), + _createEntry('3'), + ], + ); + + expect(service.state.length, 3); + + await service.dispatchAsync(RemoveAllHistoryEntriesAction()); + + expect(service.state.length, 0); + verify(persistenceService.setReceiveHistory([])); + }); +} + +ReceiveHistoryEntry _createEntry(String id) { + return ReceiveHistoryEntry( + id: id, + fileName: 'fileName', + fileType: FileType.image, + path: 'path', + savedToGallery: true, + isMessage: false, + fileSize: 123, + senderAlias: 'senderAlias', + timestamp: DateTime(2021, 1, 1), + ); +} diff --git a/app/test/unit/util/api_route_builder_test.dart b/app/test/unit/util/api_route_builder_test.dart new file mode 100644 index 0000000..e99073c --- /dev/null +++ b/app/test/unit/util/api_route_builder_test.dart @@ -0,0 +1,61 @@ +import 'package:common/api_route_builder.dart'; +import 'package:common/model/device.dart'; +import 'package:test/test.dart'; + +void main() { + group('ApiRoute server urls', () { + test('register', () { + expect(ApiRoute.register.v1, '/api/localsend/v1/register'); + expect(ApiRoute.register.v2, '/api/localsend/v2/register'); + }); + + test('prepareUpload', () { + expect(ApiRoute.prepareUpload.v1, '/api/localsend/v1/send-request'); + expect(ApiRoute.prepareUpload.v2, '/api/localsend/v2/prepare-upload'); + }); + }); + + group('ApiRoute typed client urls', () { + test('register', () { + expect(ApiRoute.register.target(_target(version: '1.0', https: false)), 'http://0.0.0.0:8080/api/localsend/v1/register'); + expect(ApiRoute.register.target(_target(version: '1.0', https: true)), 'https://0.0.0.0:8080/api/localsend/v1/register'); + expect(ApiRoute.register.target(_target(version: '2.0', https: false)), 'http://0.0.0.0:8080/api/localsend/v2/register'); + expect(ApiRoute.register.target(_target(version: '2.0', https: true)), 'https://0.0.0.0:8080/api/localsend/v2/register'); + }); + + test('prepareUpload', () { + expect(ApiRoute.prepareUpload.target(_target(version: '1.0', https: false)), 'http://0.0.0.0:8080/api/localsend/v1/send-request'); + expect(ApiRoute.prepareUpload.target(_target(version: '1.0', https: true)), 'https://0.0.0.0:8080/api/localsend/v1/send-request'); + expect(ApiRoute.prepareUpload.target(_target(version: '2.0', https: false)), 'http://0.0.0.0:8080/api/localsend/v2/prepare-upload'); + expect(ApiRoute.prepareUpload.target(_target(version: '2.0', https: true)), 'https://0.0.0.0:8080/api/localsend/v2/prepare-upload'); + }); + }); + + group('ApiRoute raw client urls', () { + test('register', () { + expect(ApiRoute.register.targetRaw('0.0.0.0', 8080, false, '1.0'), 'http://0.0.0.0:8080/api/localsend/v1/register'); + expect(ApiRoute.register.targetRaw('0.0.0.0', 8080, true, '1.0'), 'https://0.0.0.0:8080/api/localsend/v1/register'); + expect(ApiRoute.register.targetRaw('0.0.0.0', 8080, false, '2.0'), 'http://0.0.0.0:8080/api/localsend/v2/register'); + expect(ApiRoute.register.targetRaw('0.0.0.0', 8080, true, '2.0'), 'https://0.0.0.0:8080/api/localsend/v2/register'); + }); + }); +} + +Device _target({ + required String version, + required bool https, +}) { + return Device( + signalingId: null, + ip: '0.0.0.0', + version: version, + port: 8080, + https: https, + fingerprint: 'fingerprint', + alias: 'alias', + deviceModel: 'deviceModel', + deviceType: DeviceType.desktop, + download: false, + discoveryMethods: {}, + ); +} diff --git a/app/test/unit/util/file_path_helper_test.dart b/app/test/unit/util/file_path_helper_test.dart new file mode 100644 index 0000000..dc9812f --- /dev/null +++ b/app/test/unit/util/file_path_helper_test.dart @@ -0,0 +1,9 @@ +import 'package:localsend_app/util/file_path_helper.dart'; +import 'package:test/test.dart'; + +void main() { + test('fileName with counter', () async { + expect('myFile'.withCount(1), 'myFile (1)'); + expect('myFile (1)'.withCount(2), 'myFile (2)'); + }); +} diff --git a/app/test/unit/util/file_speed_helper_test.dart b/app/test/unit/util/file_speed_helper_test.dart new file mode 100644 index 0000000..09b5fc4 --- /dev/null +++ b/app/test/unit/util/file_speed_helper_test.dart @@ -0,0 +1,57 @@ +import 'package:localsend_app/util/file_speed_helper.dart'; +import 'package:test/test.dart'; + +void main() { + group('getRemainingTime', () { + test('shows seconds for duration less than 1 minute', () { + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 30000), '0:30'); + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 45000), '0:45'); + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 5000), '0:05'); + }); + + test('shows minutes and seconds for duration less than 1 hour', () { + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 90000), '1:30'); + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 600000), '10:00'); + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 3540000), '59:00'); + }); + + test('shows hours and minutes for duration 1 hour or more but less than 1 day', () { + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 3600000), '1h 0m'); + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 3660000), '1h 1m'); + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 7200000), '2h 0m'); + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 12000000), '3h 20m'); + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 86340000), '23h 59m'); + }); + + test('shows days, hours and minutes for duration 1 day or more', () { + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 86400000), '1d 0h 0m'); + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 90000000), '1d 1h 0m'); + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 93660000), '1d 2h 1m'); + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 172800000), '2d 0h 0m'); + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 183780000), '2d 3h 3m'); + }); + + test('handles zero remaining bytes', () { + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 0), '0:00'); + expect(getRemainingTime(bytesPerSeconds: 0, remainingBytes: 0), '0:00'); + }); + + test('handles zero speed with remaining bytes', () { + expect(getRemainingTime(bytesPerSeconds: 0, remainingBytes: 1000), '∞'); + expect(getRemainingTime(bytesPerSeconds: 0, remainingBytes: 1000000), '∞'); + }); + + test('handles edge cases', () { + expect(getRemainingTime(bytesPerSeconds: 1000, remainingBytes: 1000), '0:01'); + expect(getRemainingTime(bytesPerSeconds: 1, remainingBytes: 1), '0:01'); + }); + }); + + group('getFileSpeed', () { + test('calculates bytes per second correctly', () { + expect(getFileSpeed(start: 0, end: 1000, bytes: 1000), 1000); + expect(getFileSpeed(start: 0, end: 2000, bytes: 4000), 2000); + expect(getFileSpeed(start: 1000, end: 3000, bytes: 10000), 5000); + }); + }); +} diff --git a/app/test/unit/util/native/content_uri_helper_test.dart b/app/test/unit/util/native/content_uri_helper_test.dart new file mode 100644 index 0000000..9120a1f --- /dev/null +++ b/app/test/unit/util/native/content_uri_helper_test.dart @@ -0,0 +1,136 @@ +import 'package:localsend_app/util/native/content_uri_helper.dart'; +import 'package:test/test.dart'; + +void main() { + group('getPathFromTreeUri', () { + test('should return the root folder path from the content uri', () { + expect( + ContentUriHelper.getPathFromTreeUri('content://com.android.externalstorage.documents/tree/primary%3ADocuments'), + 'primary:Documents', + ); + }); + + test('should return the folder path from the content uri', () { + expect( + ContentUriHelper.getPathFromTreeUri('content://com.android.externalstorage.documents/tree/primary%3ADocuments%2FOffice%20Lens'), + 'primary:Documents/Office Lens', + ); + }); + + test('should return folder path from content uri in SD card', () { + expect( + ContentUriHelper.getPathFromTreeUri('content://com.android.externalstorage.documents/tree/1234-5678:Documents'), + '1234-5678:Documents', + ); + }); + }); + + group('getEntityNameFromPath', () { + test('should return the entity name from the path', () { + expect( + ContentUriHelper.getEntityNameFromPath('primary:Documents'), + 'Documents', + ); + }); + + test('should return the entity name from the path with a folder', () { + expect( + ContentUriHelper.getEntityNameFromPath('primary:Documents/Office Lens'), + 'Office Lens', + ); + }); + + test('should return the entity name from the path with a folder in SD card', () { + expect( + ContentUriHelper.getEntityNameFromPath('1234-5678:Documents/Office Lens'), + 'Office Lens', + ); + }); + }); + + group('guessRelativePathFromPickedFileContentUri', () { + test('should return the relative path from the picked file content uri', () { + expect( + ContentUriHelper.guessRelativePathFromPickedFileContentUri( + folderContentUri: 'content://com.android.externalstorage.documents/tree/primary%3ADocuments%2FOffice%20Lens', + basePath: 'primary:Documents/Office Lens', + folderName: 'Office Lens', + uri: + 'content://com.android.externalstorage.documents/tree/primary%3ADocuments%2FOffice%20Lens/document/primary%3ADocuments%2FOffice%20Lens%2FTest.pdf', + ), + 'Office Lens/Test.pdf', + ); + }); + + test('should return the relative path from the picked file content uri without the folder', () { + expect( + ContentUriHelper.guessRelativePathFromPickedFileContentUri( + folderContentUri: 'content://com.android.externalstorage.documents/tree/primary%3ADocuments', + basePath: 'primary:Documents', + folderName: 'Documents', + uri: 'content://com.android.externalstorage.documents/tree/primary%3ADocuments/document/primary%3ADocuments%2FTest.pdf', + ), + 'Documents/Test.pdf', + ); + }); + + test('should return the relative path from the picked file content uri in SD card', () { + expect( + ContentUriHelper.guessRelativePathFromPickedFileContentUri( + folderContentUri: 'content://com.android.externalstorage.documents/tree/1234-5678:Documents', + basePath: '1234-5678:Documents', + folderName: 'Documents', + uri: 'content://com.android.externalstorage.documents/tree/1234-5678:Documents/document/1234-5678:Documents%2FTest.pdf', + ), + 'Documents/Test.pdf', + ); + }); + + test('should return the relative path from the picked file content uri in SD card root', () { + expect( + ContentUriHelper.guessRelativePathFromPickedFileContentUri( + folderContentUri: 'content://com.android.externalstorage.documents/tree/1234-5678%3A', + basePath: '1234-5678:', + folderName: '1234-5678', + uri: 'content://com.android.externalstorage.documents/tree/1234-5678%3A/document/1234-5678%3ATest.pdf', + ), + '1234-5678/Test.pdf', + ); + }); + }); + + group('convertTreeUriToDocumentUri', () { + test('should return the document uri from the tree uri', () { + expect( + ContentUriHelper.convertTreeUriToDocumentUri(treeUri: 'content://com.android.externalstorage.documents/tree/primary%3ALocalSend'), + 'content://com.android.externalstorage.documents/tree/primary%3ALocalSend/document/primary%3ALocalSend', + ); + }); + + test('should return the document uri from the tree uri with a folder', () { + expect( + ContentUriHelper.convertTreeUriToDocumentUri( + treeUri: 'content://com.android.externalstorage.documents/tree/primary%3ALocalSend', + suffix: 'subFolder', + ), + 'content://com.android.externalstorage.documents/tree/primary%3ALocalSend/document/primary%3ALocalSend%2FsubFolder', + ); + }); + }); + + group('encodeTreeUri', () { + test('should return the encoded tree uri', () { + expect( + ContentUriHelper.encodeTreeUri('content://com.android.externalstorage.documents/tree/primary%3ALocalSend/subFolder'), + 'content://com.android.externalstorage.documents/tree/primary%3ALocalSend%2FsubFolder', + ); + }); + + test('should return the encoded tree uri with a folder in SD card', () { + expect( + ContentUriHelper.encodeTreeUri('content://com.android.externalstorage.documents/tree/1234-5678:LocalSend/subFolder'), + 'content://com.android.externalstorage.documents/tree/1234-5678%3ALocalSend%2FsubFolder', + ); + }); + }); +} diff --git a/app/test/unit/util/security_helper_test.dart b/app/test/unit/util/security_helper_test.dart new file mode 100644 index 0000000..8a88ba3 --- /dev/null +++ b/app/test/unit/util/security_helper_test.dart @@ -0,0 +1,105 @@ +import 'package:basic_utils/basic_utils.dart'; +import 'package:localsend_app/util/security_helper.dart'; +import 'package:test/test.dart'; + +void main() { + group('generateSecurityContext', () { + // certificate is dependent on time, so we skip this test + test('should generate a security context', () { + const modulus = + '17655370025740741038113156454854199388193503449104440877037318492305460691763108986359629213738068251658702764711191809795804339624629386590749322066892437190139062703234048708020881575102122778994526543290880868262952627726488977960776519938694907994518427540419624537894956809241753063372413058294447378662255052300193831939738828105579615087656442141880311261067266950751778487270744852541404898857201772242498437323791185553734672978477936608290952211534467577849886694581791190994405933665028620559373744808123499229584489594678456882464781972729864955090923226165749030219906764402228914184366893373631422503021'; + const privateExponent = + '14421008176265737041842552728760854897987189421761902811979258986703749275840685218255600827633436556136869519473805770330945910011841184271318521744401163544644005150782334580299156378790480712915696482733480991790654395453357362699213084041660086971551428119477591606848878236042545176547425781216107887562053872086603693550866169434312772263069345523523039280590638079481520003143359443743141464111595442124530326974852967024986370324441963907065113439224776888067662971143404975436160178871895218249902778285379960904695389191962540588337134680308483675532942364276364403564632886857709821444086544738315317174145'; + const privateP = + '178524065934350447993678840182944627942309006340524319909851831752106332954026000610471033106817833873729348468467401050633468292518369706764968836071362023882930741070266054692417392199462715540565991951570137107225695543150432250384310373010291328019775467135529294964213555809388513634733256540639643918349'; + const privateQ = + '98896302486373120089171491460892017227056533661820429564718404666288200233919205658787592871460875274200632466484814562010402123837563042503616158962868253836369412258319855713924996179145010239261725685588005640861685432715579085801665010203646507394652948031357507454692937609788924433344012456182622364129'; + const publicExponent = '65537'; + + final keyPair = AsymmetricKeyPair( + RSAPublicKey( + BigInt.parse(modulus), + BigInt.parse(publicExponent), + ), + RSAPrivateKey( + BigInt.parse(modulus), + BigInt.parse(privateExponent), + BigInt.parse(privateP), + BigInt.parse(privateQ), + ), + ); + + final context = generateSecurityContext(keyPair); + expect( + context.privateKey, + '''-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAi9uDMYRn63SZtEPGRogZGdu5XXBAoQeMO60mycoinqLKDWyZ +dpMo+XWY3wYVhoAyxgzDOcPjIf+Uq1oEy/0K4WwfpbK8SCy851qgYkfMCT9D9mFv +XwWoULJCUHFF7f947ArDE1nmuK1nNx2RodN2wJCXyzPjw0jn06bwGeg0EqfUC8wv +W4FTZ6t1tErzmRqRdMUWuCJwsk1IMbDbFePhiK5jecOBG0RVVWLuw+TkuX8TUgrp +IktH2+qEM1KdLyAMnL71hx2wMvE+lDKFKK9p37zXK8omjl+VgTC8ocjGeYDDsl43 +ZtW09V0pb7Vz2FM8b7BgM06kvJl48PIe5puYbQIDAQABAoIBAHI8hAW/TA7j9+Rp +c5wK8M3RTrCGzxN5Ec9w2Hz80ZhYCcg7S4KyI0bYCl0pIA3zywVASXp2iaEsnSf1 +aHOipe+JHLSAsRAXEtm6icSdNojbF005OvoXqer4H/iK/X6wLPpItByrUyzH3sYD +LgBLtPUHZiWBpenONCYKdpYCt/3/uyAeC4qj+sBlfN5Fio2A86qIgntg3n6he8Cd +Yq0cjyEGzRnIa9EUDHoHUU30oPPj16LkK0uZxR7H+UKZkYNXQUGtPt0cnAvgS/2f +UnOAIZop1r9NkS7sntg4l9iuDqI4xYMg9wtBStrgLx65nV1l4HDNZGq/LDo3msam +NQoeX4ECgYEA/joJk42iTF3D2IJjFzMf539V9D/1OaXcxmiLMODsIW8ZcyKRRmzD +NIBfMxX/0+X8IgkMwkcnZWOFMWw+2FDgfz2l+PMACJvGEGokxFDiJe68W4KAy8dr +uB0M0ydhRWLG4ZD6U+gvwyqqlMNpEosCH0fJilag+tW/fx6ti2MBYA0CgYEAjNVA +HItnlpnOmzOuyQob9kqE/8eDTSeX5ZFD/OZOypvLPukdg6qWnzaBzUgSJg/Tl9RD +XWE9WgKc2Gpki7/EYvtRW4YwBcoZKBTkAio4t8WBRmLT6L3PUKKdJHOtFbmwlUPw +mfw9HdJG/TgDiTlyAdTbuGhGY/unuUdPMvt2oeECgYEApthqHoeOo3XKKZbw93Hb +F3AvdhxfkVT0ftZvu0VyU0L5veFK3KBWwGcbk4h1nJjMj33G/N370gOtj1EOMaNq +ordP7QF13TB2naE7vgejU+fJgHk2lAauAGg4WX/3y7TW94TRdS3l4r1mtDlHBR9r +5iGT+JGAFv8fLYtxtA/nACUCgYAb6Gpi/bESY/pQQSaiyjEOVmgSs7uuP2lXYbkC +VbVJayQUnGdv3w8oD8obHuwRxNMeZD7RM2LQAnKIZFT2aJMHNlxB8c50Zz8i9TjV +wP4qVKYwh4cMuQhrJz5SqeWjx39ZpPP538VQsonExiPVPp/8Au1jlq5UQ9tR2PK1 +3KT+oQKBgQCkmNd8ZHKBoIbG3oV0T4f4IFk8424QD5hQX7Zmb7gxwnCgQScOPBM/ +tk4v/rwNoiO9EUW4w4zZZIlvcFJu38+9pPX+rTFxGh6TZ6aRvw7962m2RBmqgYcq +IWwwBbDLI6KuU/iqqvk/1syLDHqeaCdDqTmmyoaKKa7kUhkZkhIlLw== +-----END RSA PRIVATE KEY-----''', + ); + + expect( + context.publicKey, + '''-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi9uDMYRn63SZtEPGRogZ +Gdu5XXBAoQeMO60mycoinqLKDWyZdpMo+XWY3wYVhoAyxgzDOcPjIf+Uq1oEy/0K +4WwfpbK8SCy851qgYkfMCT9D9mFvXwWoULJCUHFF7f947ArDE1nmuK1nNx2RodN2 +wJCXyzPjw0jn06bwGeg0EqfUC8wvW4FTZ6t1tErzmRqRdMUWuCJwsk1IMbDbFePh +iK5jecOBG0RVVWLuw+TkuX8TUgrpIktH2+qEM1KdLyAMnL71hx2wMvE+lDKFKK9p +37zXK8omjl+VgTC8ocjGeYDDsl43ZtW09V0pb7Vz2FM8b7BgM06kvJl48PIe5puY +bQIDAQAB +-----END PUBLIC KEY-----''', + ); + }); + }); + + group('calculateHashOfCertificate', () { + test('should calculate hash of certificate', () { + const certificate = '''-----BEGIN CERTIFICATE----- +MIIDGTCCAgGgAwIBAgIBATANBgkqhkiG9w0BAQsFADBQMRcwFQYDVQQDEw5Mb2Nh +bFNlbmQgVXNlcjEJMAcGA1UEChMAMQkwBwYDVQQLEwAxCTAHBgNVBAcTADEJMAcG +A1UECBMAMQkwBwYDVQQGEwAwHhcNMjMwNDIxMjM0NTM3WhcNMzMwNDE4MjM0NTM3 +WjBQMRcwFQYDVQQDEw5Mb2NhbFNlbmQgVXNlcjEJMAcGA1UEChMAMQkwBwYDVQQL +EwAxCTAHBgNVBAcTADEJMAcGA1UECBMAMQkwBwYDVQQGEwAwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCL24MxhGfrdJm0Q8ZGiBkZ27ldcEChB4w7rSbJ +yiKeosoNbJl2kyj5dZjfBhWGgDLGDMM5w+Mh/5SrWgTL/QrhbB+lsrxILLznWqBi +R8wJP0P2YW9fBahQskJQcUXt/3jsCsMTWea4rWc3HZGh03bAkJfLM+PDSOfTpvAZ +6DQSp9QLzC9bgVNnq3W0SvOZGpF0xRa4InCyTUgxsNsV4+GIrmN5w4EbRFVVYu7D +5OS5fxNSCukiS0fb6oQzUp0vIAycvvWHHbAy8T6UMoUor2nfvNcryiaOX5WBMLyh +yMZ5gMOyXjdm1bT1XSlvtXPYUzxvsGAzTqS8mXjw8h7mm5htAgMBAAEwDQYJKoZI +hvcNAQELBQADggEBAIs+T8Nkbl0gecT22CKW9/jMvUS1PGAyMqlwP8fNTsyv2xE9 +hLsyUrxsscuv+HGJu6Cz1R3hLI8YY5jEShmaelI0stlLahH9Fbm43EZuadGXOVKZ +gMrNzQqLY5lec55rmS17GJlkm5opidkq4OlsCHfrBJitX6071atb0B1cdAjysWwV +x40mnwq0TmYgBLDhWaM4/ZfZQRJQpPCtBJO06Nk7gTPiqJGJU5iEaz1PLvARq69o +bJobSekf9tx3uwOIfioaoQvX0khkZ3ljFuNUpW3IE87OfPnYJQhu5xsTx00wi+Ce +x64ghD4CzRa7wYsOjeb8cUUDMSj030NO9fBGVtA= +-----END CERTIFICATE-----'''; + + final hash = calculateHashOfCertificate(certificate); + expect(hash, '247E5F7CF21DE14438EAE733E07AC5440593D0612570C7413674130608DF69A9'); + }); + }); +} diff --git a/app/web/favicon.png b/app/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe0bf63e696c6683b273b0bc126f85b4e80508d GIT binary patch literal 470 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 literal 0 HcmV?d00001 diff --git a/app/web/icons/Icon-maskable-192.png b/app/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..d9504b38b279a684696e6c1a76287cdded9dcff0 GIT binary patch literal 3457 zcmcha`9IWa*vG#!WGM`#!Z5a?P9brKd>PBJ9b4rPWlffpIc6-Gu}q7tI+iRYjIl(R z2xFTGCrhSMGqQyyO2Zh&k{M(7IIq|9Cp@p`hwHws`}6)>_kI0(rMfuTNbXnI4*-Cq zovqcyz5MTgAqL$$neCe{d%CTimAUKfvH7t#PUA>fYrk)Y4j!!3I(Bp8#!F8&e3ERQ zV;{|I@*5>;`)8f2NxhyVZm{|@y6g)kt)`@gvJugG=$w7Z{j`H>KxQbQb`r>x#oO*j z9^0q#7%FWCNht&NzWu+IMf)ua`jqEWhXo&a%AHno>koJRWHgiI@lmKcd($m%@2^%t z155MctFKQLH6LHmD6HMLvV-Hz`6$+AX$WOJtC^wymWVbM-!xz5*-!smznV{-s|t5PcZ{%%376>0HPhB!j3q0nP@g7RHM!!81ldO|3y8l}N!; zN&S!jp+*N7zJMPa`}xq%BKgA9SfNH282&3SmT-$pc#9(D&i>c_3Pt>1!kJ688D1Fe zl_d9LCNw~xs#a4$P8ZjD$9nHk;tjAUusT9ehLs>rqlgZ4N+cF=b*ESEv+cMu&m3r? ziXxq`ee>T%ZZso+wvwRM{zG7YWy_trV|e2-QRH)-sM21CE<*;pJjY!R&ta!NB7A0+ zZfTQVqO^gbku1j*QJ307X03oLapp7oWP5zyQ|4470`S1T9S9EQ5~d9qEmyEW0GCkA zDxa48`5&TcDwS3YZ=6i%+AQvkMy@*7oY{=!itMjK5ed%N*CON?Odd09HXN6*uThE^ z?(RJg)bq3F3HIR71h8I*+uBF&Z|LLwJS3%nOOQuSImM1hs8s(^Fe|QS7zU@c-`Thh zr@_H*5PSaBZ!ghcrY?DV=Rvl>eF6@~L*Db{47-j}ZFZ$76a4DYOUQI=V0caMGxMI! z4_tu4-WZx!C!TStiTVbbk8U0S)e<=i9UFSre*`3Yn>m22BavBr`#)2YEoUlDK;D~hOA~sox2s0qD zu8Wx!XKdQe81OL=JKnzsLE04&iJ#ScC<6Es0}xMOF?7`*l|s9pG*=ZUO(j$ zo^kH#uVadD^If9uNFQ|^kqr4tCbN!ZJT0$7xcwd^s-qE`3GWRrR6AeCcXtgL3fmay z@F^f4t}S}DaKueH8?)~PPTI-XyPSOqgtm24Yj#%`@q{nN2L3O zCW_yD@dosvw#LZP5VgH)Cj6_@si@E+2M^~O+=^KxeqH-;o#V*gQ^dpDOqzj9hn z5K!X@L3dig5|hS_%W;>hP4P5&T#2Zf?p$_E;VG+K^&30io{QigZzF6dk!vHZrcQ}` z(%oRPSaO3(PDVgRz&V?)m^DK^<9m%Hv-JU!tyYOa{W5(bnUMSU#H+>7q|$7{0T>96 z5o|hbs+^Ce)!ED#7)?*R9o%vzAaE517aQ&k?z4)7-3lJS=MzYTnQO2Pis8%G`qY?^ zR~RA9_@$rsHm{`)l9VGM$1&+GFgE;Cw|aFDxx6Bu4}am-lplytVyvvu*5ixW`A;Z# zsB9Z3Y3>|icQl=Zh!=Frun}VH^(Gh3^b&lmEVrnee~ra|utpM!X!;Dgc?*zeCZ1q9 zGxyc~>YigKZkr{PdJqb>o#nrt>;rFt((wWlV{%8|7BU9pK=10NET|5rNp(d2t#tj@UB z7sJ0#JJLV*VqZ7$z7F(p5nCh4ak$u;EQBO*AxRErl+$1A3Rvid1(%Wu&;>RC!BkcJA$7lWxR0$P{7T4a?Wf1a{7xD|Qr2iNFz z_di>j~(3wm;arp5k2UM3KraU(5oy36AtGt!)Uo6sC*+ZWl z%(Fn_#g4a$J|UCdb&(GJRM7aeyiHviFTN=le~V1lwccaSvk(g}gUDm8Uv55d3R4^A`U; zKdy>lyleg72K2}Hy-6m7G0CLNFMhIAuu zW0!p#(-pP8G|v2+N-S0#7s6Um(c)sXYJ#hW5%&us+ETACBNTUk*it6L!}&{TzFkun z8s8P3J$3T!9%Oow(vKNwMTe+Nev_>DuihS7BO62WQG%?y{>=f#QOblD(TP zTUGc)ZPl)9xoCCQVT3^HIgMQm4JO)%fCWQuR^{|E^;X5XJ$=$ISEZqYuH@ai^dm4Y zCB;FZ^AfLFSM5A+>tuemgt|~G0y`o;X;UADqtY)ZH6RLRN2nthpJ-N%eMl-Sg*g=2 zP+o8nVRw6;@6bMG#3#o8;ykqA=6_ZVND)@K{4r`bN=YKdbj}w?3L{~iPMaL?zN*+! z?@CIjxR$bCrOU;!NkJhBpZ1V|^q0|i%8<}9j6YFGu=kaL2FO))M(YNAj~}iJg{9fi z#Q=r*soCeB$E@@5s-Ae?Tc_Ht{AJ|Hb5X(>19PlTyzMbItHS)AloN8%Wp3VgHhp;T2bAFDo(p;3#L{)>UiPHROrY7vStzfi! z@3eBVf1dB@LjW?oLDhg{c^6(Hw#S!AQ(p;{=X2`1OBpvc&TYB~2|prQ>M~tS4n(Yu zQKO5>JI|y|rM_>>&doRfJ5u9;uGG!}l_wX+?+G=FIfZqb;U~R3gt24qhu)Z<=@-}R zg8G+b`C%?h`MT;~z9k)t^`1QZtG#XM3{NqB!X(CWjGr}g)s{#EJ$(xkpOgj!e``&W zI!RQr+(u2!_*5-K@~9Q@!Ih*qQrX9d^)7AbF^N>r>KYeOocwk&(`EgDp*!v z9OFryd2`WYDRVrC5?lPZ>D336h9G0YL190Gb=p(<(M^@pD2=gK}sGyiGc1+vZON@6hvvpd_`<}&J!g(I*ENldNMo?Q6yGn*6r9GPn`-kK)?wtj5N z^%P!#2KZ6cc_8IO&=GkVbDQSKUyWC6oCq@S8k{y-o9N)$8)J-uj{rHHc;0j%-n$8OZu3k&zw5a;;aRV!- zinyU-c=GmIj$DC94JS`cQQjnI_GmhqmLaDeLTev63)qL8AhhVht2ueDC3YQ=!Ln3M zbYF>Og`6L)yaTh3sK5P4Gb}_>930g_nD@#g0VmWg?={rfpA883p`peXW-Z8E37T`2 zjEgTBiQl7Bp?PP@`b&LGa#d%o&)dwBi&cU5os7wO^mRdi0o?;F2xg|}A!?W(;i0hkUKgK24U<>T!Qt9Sw1>X zXnSbm@Wna_NC{2R*1zs`h~;(Y`pMpLqwhHtiq11F=fL5U73xOMm8QO>rCu5#obK5D zCGg!%*8^A<%iS9ls8Hn&#J{l&SlnhD*V$=fR9Gbpt`8rj2S#NzB-HQ6O9RF8LMq*R n#VNpo1c=o^{~s4Jk+9i=)Ir9!IRP8UfiDmtZAsjXC$TWrj9)m6GGVU^@o zgmR79uE;eh6uSeW_x9@j<+4X+CU$5uu^?Y6CJ!UR#c5#?A z;g1ObfJu%U*17?pMgP+ByHN#^{S2Jf7K+%B= zGe-cnXn~8r1Kw=_9%%#pSpb;>fwkj-*~b5eMdI9$g-*weJq#mUcQUHXhi1C%-_zAT zyzQ4(wp;W5I}dI>)&7vwebaeb+RfXS=O0=YRk?p+oBo<&mdeECfq9*+bE2ixBc;f5 zG9e?yVVJctyK=Pa)v#s)`#%k{pknfE#+TN}YMe@yQcv#& zc$VacFaLVIulDB)-)wyFdevM}vHRggFKY5!=MEY~j6NR8*>RR*1(0ZcHB}MnwKb?P z^-5;C!o=O;a#2zm>j7IC;lcjUX#b>2Iymt8XM5jNnbg=2h~fgB_F9<1$-&kOl=SY@G2GFw;vWVpI;1Rdb{K=Ula~Ea06+& zlQmi9_)bBDHIk`FByS)PNVVrqOw&IA+$0Bp54D80ecPR1fe&HG$paunuNst-6=xuD z)g7)Ng}w?S@uhqt(9CtFjkSId%u0!1ZeDB8uv{`y>$1orr`GE* zL1G2@waY{RQsGy$I4LCJ9+XHPKMMg}cdFLXFN13h8n|I}yo<2Wf?6;W)w>uknnJsA zVLx1ff360XH;*a*K`Tc#P}hT{A|qtPm%F#adOWSfi0Aa)%}*16b)ME>3uW_4aZ{Tn zxm1o8`R1UHZa#qGwyG^TNu-PpRbEBj)mSqMw!o4gSC%gD_8a219$apX^wzMOxpuU< z>1qKJ(WFdZ0`Ck;_V>pwUGLvIb=!PiH`wf;#mX<#omBXc3ueT-^Gz3t7rmhUoUc}1 zHsX0j6YeYq(vqD^>8rEqMbIt*HLFLo%nqcae1cTo*`OAp6xzwbb)EM!88`4GO^pbf^sa)#b zBj;}%5_K4ZX1dKPHbPG#6og2`uz+tAoVy8Dt0O;aB+45@rm~gA?SXe>h zEuwR9EmzBPlL3{ydCUrDzBJ{L!zGPo73!eYw^ZR{K#&Qs*QQF zAm-+70niX4V|CXB0S&olzS?H#d>pGfEw~4DujHjK>5;xl+cM_OmarUjFO`C(`};xj z<}F)An|a)PhbXQkaBdkfPW%)@?i#E8Zj9}9mdmq-nTaP^o~wK@c!e6C&_Hv!;Q^zW zI#MII+&1R`_(M(E^^9>|rI2%bbrbJ}GR=CZp1!GLi;pYrYMkukRC(9(A0fz_Nsf zI`nf+QfcFN)NOyNA4nvh8|#9bdpw4&AHw+f7+xlAj7g90E8(@*yIQG3QecL!S>g?> z3?7lzK5!?&mC*BpYfCqU{74!lnZU*IPzDmu@z-J?sfF9Agi`bXCQUz4uA3O!L2@E` zC;mx0yn8KSsv&nP31!W51@+rl9&L4*;70u|LeNBrD3T+?;j@~zzzSUaEs5l|U>J%^ z*De7~Zqzh& zPjHG<#8fHR+e}#CZ#U4}&M#0a7laS_{X9fiw&Zf%`G%92U`yTAYErO$h%LbQFvYg# zCTcT~{zKo?e9M2fP;)h8wRSP}b88Fb9!rmW&J@}W+ehTbQh2nO8rRGjrAwgvNE+I3 z&j{Hkg)czjGx3~@Q+2`C?p&0t;Y7;0eKghbQG{;=bS87d;TSpRy@K1!Iduj?1ZQNp z(~xVY1kT}}8_xu1*lNCW6J{V|hhkD6I5rJ__R8iAp4ei&-igZ{W6(3z|Y zPNk!zO8Dnp;sGh=zEz+;6q~bvYk{vx^#*Ngh|aq<>aXap8c{_sWkB>$uertzoWGe2 z!0)kKig{6PohHT9BQh|;?1&Yp%Rn=gS+(ShKJtntcaZV=EQGib;TWL~Au3tQVk(tu zK8^_vs~eSgZD7}RqHrd@W;b0E>j^6OQ_Ux=kvp6$B^-zurgWGi2_hp6ncVU7dMfp2 z17{|K0lMVMP${=bN+_DfcFm>J(V4(ehLEZts)CGOZU_nvP&2mSJ$ObwscxnDFrUZ- zGcW>IXhiZF(YPM=_%o0=T8{n-K;iyy%6UgP#poHUjEk=U4=zh7Rc4{RQlf^F!}Vb^ z!RZ#IrD*D3RK$P2>oGyP91eRb=l`Y9c(jbH8H$V(gSI&sensJsGnkA2hcK6pdM4iM zPV=gyYB&v?6A%OJB)EM_9Iqwaa@7Rws;MFH3^|pD)!<=7NmkhVI?U25hl;#@^83W! z>C*X*4lNH+s__canHNscZtp-K#A%58Pmd^D$-ha=pid&va&AN!w|DBvfv%Y#Hkb%WB8whpDb;^1A8QH6F;k1zHt=us63XF>Gbou!w+vuxh<72B zmo=P$7wIPTSd1G+wB}MyyF*UPUxSAcpglF=c;;Z8&uAFgHhuo1}TY$}?vkUCNlK@^vsctiq2Ue9nj`BH87D2l?I z>4eaFMjbh*`<>DpI4DjSK~v%lj2@Mf_5GKU8&R)y>!fs0<%V=`=WUG1UC|Row{s$c zfrR7a+sL9tLmC;*c)AFwY8KXBFNSUxl|)b_5gHOiz6K}OH%Mpwbokbb&fNmjONP9J zi<;h`7Ini`+NyXm{kPnm+FCpsT+F>$N_Bn-Yjz8M)_=gy8;s1zDz;TArZ$h!EA0!g z!YS1rUJs={OyDsY($a!g)TvM^G=LgOPNOmvs8!0yU^V6AvOheB81Y}(n?9mw8U5=% z7ad*eB2{ndv8la_3bRl7XTM>rI1TxHxTZ<@CgldEz$?P3tc6(-gs4*}`XbEXEujD;JJBthS>~r^VmbTH`LvYNi_E4X}diaX?V&$S#YFY!C8CzrN@utFJ@4g*mWgiRwM~2ua2)cm*fYd0B&65ThNN15xaV)6|0Nlp zoUC3EG8&o`!kBh0@+^v!QrR$(Q1`oI|cgB*0W^^qKuuT8qP z^4}1JIuOsXhn|t&UzDT0AqhmIlK3LC{zizNQ^daKT#Fe%=g^WU31O;yp;=O~vg`xD z%JN7H|1J5UBje%AVdef@YUL7c%Q=u}HWm0$R}Vj1_w`8xdvTLAPICuGyFQRX)hjKA zunFFjTmoYS6ET5>Hds($71lbvaDahi_M&+>rqee%r5+#LN3|v?4zbxp|71GMDr@n@ zUUkZafyTrL7X=!!*ryT4gPZtD(sSg;9Bt(2ze*6^SX)cfMs{>rjD}IKLMX-z<@BI7 z@)Vt%d3PX37mK1wzm0?=ru-ZT7ni_ytZ?5DY9Gec#s{ZqA(=jgB^uMOu?;b2wDvTq zQ(pZV%5^Fy_*2AWP?4Np;Z4~`#(&Mw$qq>$= zfKL1yY>v@Qia{@u(-TAAc8N_f^bMID+6%98#8`OoOl`nO)Ah_KZVb_E4-q!ZH8~Ey zCr4hX{c6aF)g|0mPUAVy_R!H_N&3?982*Q(v4C2Tt`G^7wFt3NMY>Fc#Opm4o1K?B z7f9kT=T^!gaw`4+BY!Hxr{V3?-RS&JxIIm)MMeLalHBH_?GxVi7r7N)+1@&v`P-jU zk3HP)FnQC~w0Sa4-xIft3+ukPbw7#Od}88@bgM;yYm&|Ec=cWeykfHj^SID&Wx*zq zM)m_S_lJKBpF9v3P_yFtD${G8X6BEv(AqMeru3^l)BV?5XSZNhgu_cLA7kn}Qe0ox z-qEL7erBLdpXF1B)f!^q%6h6akoxQ>#qx=r)JK?MMg%al{MpCFR?;7rxK1&g(UH4d zGXBR*wdG?eVPUNxW9~L?fcdL|OMQ^Isy#Kf^js+_gZ(_P{2(RwqaWd<8N6cyuLhYj zF(h15T9FC|H)1Nk^+RNe*LPf?YKQNUPLI(pGY~0jWteBV+geY*@|oX?5hL7)r9!x# zD=-83vJRx?9=Gg*!cQ&XCixMrIU^NDI^xg^C9JD~kMYJMj?_yNCGlsWtES6PyNzMW zI#M%#nMNHJYAe2xum1MWqFKeo)GjGT z7{rB2;bA|rj-Z8(ZOAWlfzZUPm5SOXL%%q}6$3ZqM4uNCxkl49Rl9BKGTTIRfmLua zRrwtEJ10}p?Q*$(6x9r4Z_f1V?JVX$zUj4#zKg0p{rLjCLe^6hEHJfRXQ{Emlwrj8#ytHisE zwA-wcP}ZiM_sOz1Dy2@Mbvr`S+h;-t!C_i>UXr zipDVA{4Oyr9MbftC_#0)$|DdqI?tFXguSqkJxY|=q+w`*<6>`W_O27liT%nf1B9He ze|*gg+_H{%y^Tg|>Y8rW5vIXpq-O2~Ju5jm(MA4Wl+P=n&O2W>1zA*^x>ATBy9Av{ zOqMX79Q#DP{!5?dB3s^efDj^Qren^Y3imNrwyuYQ3)kTQn4od$hI*w5ZHmhi$vcP(20dBCkk34aiA^Ch{)V&qIMb?d@ zB^xw?yk1wu*@03F6mbja3=5-G)TU+J`z0M&O8l1zcmI#+(O)DY1zSi1%!*Yt4x8ca zmP!7gmD57oUb;cEb1dBTePD=eo1z2e^Xk!KEri3;jvaP9DS>u4vGo}c;z}cx_S#7C zj3*|-X{^Wj82d9tEv@G~G6VfgN7yNt(5Pz3={(KbRrCsDKjslHiyHaBhuQZGScXbM zMq26UfE8vNsDON9Mi4ylE3qC!LbOJ{-X*VsQ9dXA)sQvXECKEye0zbo#e(%F0 zUXtGCM6tWx0aVDlRL#D328b6VEdAc42>i^&Pc_CZmMMs2yt3K2khOuX%ssaHz;>-A z@fH~>7%qEaBD$nli743PX|^ZqNTE(XQjVB6;k`T2dMITByg^F~Se%p`fsdzbX?Z|S zgKHgZ7I8L6V_5MF7s)PaXrYY#mPU+-eXuh|c{HvdThW^-O~fnDq5od`)$@#%VZ5N7 zb3qG2CciqEhweURl5w&`VdF%-{L>@hRZ!`v(a|h6DJ(6##1NZkgUsjOj=)owi*I?s zuhb7xs0X&=b=5)hYn?Y8C_Wryn(j&QLqr{)z6Dr;!@B_p zG+d`UtZB?Ab##^OZleA8ynmb*d5U&;_t{*8wH zJ(gDB*93s<{j(bBbq(>=J$ceLm{3Ug_1vIK_2}Vg>F*G2Yvl0T7R&8k0?eepV)VmA zT15vS?T`OpB>cu$p5J?Yc%`V{K-7Y}YYftt8Z=*qv=D!TPM%Ax#NGxS&*UwneXjDc zMuJzjmiA_0<1GkOx^b$-wbc0& z*Zrreahof6gQWZFm2d0$37o2-oG!<6D)LAbwAmSehKax88E?>k-@crDSH-E?k+#Y1 z{@eguX;snOL6|CV_R$X%; zdxOtkH73#J+jP^1OvGT$2Bq}X^(j*rKVJj7)b=jeBTkBXIST38hEi&w&9Vz}RpT9y zXq0Fg!7;OW+d^9WN}twLg+!~^_Zh>*5533uUUb)2@8Uh>9wD5kAc8cm9`(19RX--A za7}jwAkuK&ddT}i7ufft>W&5Y>-CDZ@w`RijZ+G~=^jkOLcaWv_ZV5x4{H-oI$3)w z(yYAEK4)s*a>6n*`aHCl_2LAF$C?S{J!!-uyyC-WTO6@#EZZj5_!({WtN-pj`ghKDbEah9~3;(UI(AM%dZ#Bm$@<- zW;EB64l#FyZ_>S(*UR2W_4>ZOmAv{gIdL8#YvZ!Y!+9qz8+p4dVyH}bcalV;}e!-f@Pm&T(&zs9nNO=C0$0{w;hTqNh{BwmJ}~kiIm1iD5;&p*`Z} zkx6@j{@5%!GB)&z$;1+FGPUjw+2M2l#@rY=H1{m!e`E%@bwy-l=B{Gt-gndGL*P=q zj`&EtnmW8qv`jLb-;7_u#bebJwwes!U6FB5?Ad?tYCU`d@G?b=Q6=L^gQ+FjiBVB- zAj@xb5sL?acBoPR*96A9hcbBd+qd%JUv=H>ZQU~$@jO(ZR&TFswuYfM2e^~MAVa4lD*|Rpni<2ockEn=$ z)b~EmO7b2d4=77Z25$u5##Cur3Hl>qw`g1SK0P{-sjMGmpc&_&nzrul`u-H|jZiH! zu*>t&RP)cqHqA~jpl8mmSV&~ekV~kK1l4RWYBhf}N6+H?Kc0s+O5Z1c z3W{0yb6+;xJ83j~WwgxSXko~N z0MydLW>6cm?<%{$XJ0_qx1Uj(%V#y4;6(+^OQ-JW&;N|qE*)sBg%&JjwSkz`AUeE3 zJw&LaB?PxoN^M3pyGu+@Js5l?%}RB@rG5}zTXw39FT%52s)(eN^jEQrc?*7y>9uJy zSSnHy-rQR7d9I${=;e7GPo<~Iq!CI^(AlkR$j&M#lRm~xW$vguPDSAEY2OxZl?#Xy zhl5AmD~V)`lTZcGcSqtGG`w{n0*CH^H4jl0`ROBT+dIf*?992|q%IG4$@*dnpKamS zJbwq-97p!iN7<-sJF`{2{3=t*yaaZi-Y%q48G0kTqpin|xepoB1Bbq5kSnO%8eZIfH93Z4i2yX;Yv}&SIhmy12Gd!pI>9-FttFPt@w?7 z$pL$^2oqKZP`gwre;$*zbj#%V?!oH+JoqZ4vL{5ahc7a6Xd3Rxk+W`JY>F}U4){z9 zTJBddY4J- z6I^$H$9n^)w$M{rp5tp?9_<7_kxm8#%!9>)A$$gF?Jv%)r)W!qeE54eQDQWfx^3t6 zPQEtjN8{~1FU`B$VH>sZ@Rsd{D%(DxR@%B9^#L!^W9l}fJbPUCX!^q!Z^9=|Zqfeq zNT0EEv4j0p>*c$1j7VAj+6WX9gE$VMCtGK^?rGV&6aLszTsjrJn zals-`p_2c#Ihe76b#)qq4BE8y&p(LB0={zPz9bW~QnVohk)@%6R=Z%sE&zpqCA#k^uIZ3Uam}r6yv@) zfW$2u8F#-PTNx1=9#-153+D`aN9+xYX!kcgm>FDkW$2qgf!+HnKA_{@H}L|$Qle!$ z5~c%|eEymhpYQviGJ}8D!{)9B?a&U{ZmOpK^*^g(g6`$+UWM{0EI#IAzNuzQjE^9OY_CE8!0G4PTQvd(} literal 0 HcmV?d00001 diff --git a/app/web/index.html b/app/web/index.html new file mode 100644 index 0000000..f38c62e --- /dev/null +++ b/app/web/index.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + localsend_app + + + + + + + + + + diff --git a/app/web/manifest.json b/app/web/manifest.json new file mode 100644 index 0000000..778e0ba --- /dev/null +++ b/app/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "localsend_app", + "short_name": "localsend_app", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/app/windows/.gitignore b/app/windows/.gitignore new file mode 100644 index 0000000..17825c4 --- /dev/null +++ b/app/windows/.gitignore @@ -0,0 +1,19 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +localsend_msix_helper.msix diff --git a/app/windows/CMakeLists.txt b/app/windows/CMakeLists.txt new file mode 100644 index 0000000..48eb14a --- /dev/null +++ b/app/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(localsend_app LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "localsend_app") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES + "${BINARY_NAME}.exe.manifest" + "localsend_msix_helper.msix" + "install_msix_helper.ps1" + DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/app/windows/flutter/CMakeLists.txt b/app/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..903f489 --- /dev/null +++ b/app/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/app/windows/flutter/generated_plugin_registrant.cc b/app/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..842cfae --- /dev/null +++ b/app/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,56 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + BitsdojoWindowPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("BitsdojoWindowPlugin")); + ConnectivityPlusWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); + DesktopDropPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DesktopDropPlugin")); + DynamicColorPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); + GalPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("GalPluginCApi")); + OpenDirWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("OpenDirWindowsPluginCApi")); + PasteboardPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PasteboardPlugin")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi")); + TrayManagerPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("TrayManagerPlugin")); + UriContentPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UriContentPluginCApi")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); + WindowManagerPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("WindowManagerPlugin")); + WindowsTaskbarPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("WindowsTaskbarPlugin")); +} diff --git a/app/windows/flutter/generated_plugin_registrant.h b/app/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/app/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/app/windows/flutter/generated_plugins.cmake b/app/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..1068032 --- /dev/null +++ b/app/windows/flutter/generated_plugins.cmake @@ -0,0 +1,41 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + bitsdojo_window_windows + connectivity_plus + desktop_drop + dynamic_color + file_selector_windows + gal + open_dir_windows + pasteboard + permission_handler_windows + screen_retriever_windows + tray_manager + uri_content + url_launcher_windows + window_manager + windows_taskbar +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni + rhttp + rust_lib_localsend_app +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/app/windows/install_msix_helper.ps1 b/app/windows/install_msix_helper.ps1 new file mode 100644 index 0000000..50b146d --- /dev/null +++ b/app/windows/install_msix_helper.ps1 @@ -0,0 +1 @@ +Add-AppxPackage .\localsend_msix_helper.msix -ExternalLocation $(Get-Location) \ No newline at end of file diff --git a/app/windows/localsend_app.exe.manifest b/app/windows/localsend_app.exe.manifest new file mode 100644 index 0000000..9463a00 --- /dev/null +++ b/app/windows/localsend_app.exe.manifest @@ -0,0 +1,9 @@ + + + + + diff --git a/app/windows/runner/CMakeLists.txt b/app/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..4734da9 --- /dev/null +++ b/app/windows/runner/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "winrt_ext.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/app/windows/runner/Runner.rc b/app/windows/runner/Runner.rc new file mode 100644 index 0000000..d9ccfa2 --- /dev/null +++ b/app/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "Tien Do Nam" "\0" + VALUE "FileDescription", "LocalSend" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "localsend_app" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022-2024 Tien Do Nam. All rights reserved." "\0" + VALUE "OriginalFilename", "localsend_app.exe" "\0" + VALUE "ProductName", "LocalSend" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/app/windows/runner/flutter_window.cpp b/app/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..b43b909 --- /dev/null +++ b/app/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/app/windows/runner/flutter_window.h b/app/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/app/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/app/windows/runner/main.cpp b/app/windows/runner/main.cpp new file mode 100644 index 0000000..5d62d2e --- /dev/null +++ b/app/windows/runner/main.cpp @@ -0,0 +1,53 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" +#include "winrt_ext.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + if (IsRunningWithIdentity()) { + winrt::hstring share_arg = GetSharedMedia(); + if (!share_arg.empty()) { + printf("share: %ls\n", share_arg.c_str()); + command_line_arguments.push_back("--share"); + command_line_arguments.push_back(Utf8FromUtf16(share_arg.c_str())); + } + } + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(500, 600); + if (!window.Create(L"LocalSend", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/app/windows/runner/resource.h b/app/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/app/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/app/windows/runner/resources/app_icon.ico b/app/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8f99e2818e7db31b6fab2de75e4bbb6f438bab0c GIT binary patch literal 109492 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 Wk=&t&sZ#$Rn1^Lp2kT-RZ2Ld{KHez+ literal 0 HcmV?d00001 diff --git a/app/windows/runner/runner.exe.manifest b/app/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..a42ea76 --- /dev/null +++ b/app/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/app/windows/runner/utils.cpp b/app/windows/runner/utils.cpp new file mode 100644 index 0000000..f5bf9fa --- /dev/null +++ b/app/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/app/windows/runner/utils.h b/app/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/app/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/app/windows/runner/win32_window.cpp b/app/windows/runner/win32_window.cpp new file mode 100644 index 0000000..60608d0 --- /dev/null +++ b/app/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/app/windows/runner/win32_window.h b/app/windows/runner/win32_window.h new file mode 100644 index 0000000..e901dde --- /dev/null +++ b/app/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/app/windows/runner/winrt_ext.cpp b/app/windows/runner/winrt_ext.cpp new file mode 100644 index 0000000..3be8e2f --- /dev/null +++ b/app/windows/runner/winrt_ext.cpp @@ -0,0 +1,69 @@ +#include "winrt_ext.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using winrt::Windows::ApplicationModel::AppInstance; +using winrt::Windows::ApplicationModel::Activation::ActivationKind; +using winrt::Windows::ApplicationModel::Activation::ShareTargetActivatedEventArgs; +using winrt::Windows::ApplicationModel::DataTransfer::DataPackageView; +using winrt::Windows::ApplicationModel::DataTransfer::StandardDataFormats; +using winrt::Windows::Data::Json::JsonArray; +using winrt::Windows::Data::Json::JsonObject; +using winrt::Windows::Data::Json::JsonValue; + +enum class SharedAttachmentType { + IMAGE, + VIDEO, + AUDIO, + FILE, +}; + +bool IsRunningWithIdentity() { + constexpr SIZE_T kPackageNameMaxLength = 1024; + UINT32 length = kPackageNameMaxLength; + wchar_t packageName[kPackageNameMaxLength]; + LONG result = GetCurrentPackageFullName(&length, packageName); + + return (result == ERROR_SUCCESS); +} + +winrt::hstring GetSharedMedia() { + auto args = AppInstance::GetActivatedEventArgs(); + if (args == nullptr) + return winrt::hstring(); + if (args.Kind() != ActivationKind::ShareTarget) + return winrt::hstring(); + auto share_target_args = args.as(); + auto op = share_target_args.ShareOperation(); + auto data = op.Data(); + JsonObject json; + if (data.Contains(StandardDataFormats::Text())) { + auto text = data.GetTextAsync().get(); + json.SetNamedValue(L"content", JsonValue::CreateStringValue(text)); + } + if (data.Contains(StandardDataFormats::Uri())) { + auto uri = data.GetUriAsync().get(); + json.SetNamedValue(L"content", JsonValue::CreateStringValue(uri.ToString())); + } + if (data.Contains(StandardDataFormats::StorageItems())) { + JsonArray attachments; + auto storage_items = data.GetStorageItemsAsync().get(); + for (const auto& item : storage_items) { + JsonObject attachment; + attachment.SetNamedValue(L"type", JsonValue::CreateNumberValue(double(SharedAttachmentType::FILE))); + attachment.SetNamedValue(L"path", JsonValue::CreateStringValue(item.Path())); + attachments.Append(attachment); + } + json.SetNamedValue(L"attachments", attachments); + } + return json.Stringify(); +} \ No newline at end of file diff --git a/app/windows/runner/winrt_ext.h b/app/windows/runner/winrt_ext.h new file mode 100644 index 0000000..d37b5a0 --- /dev/null +++ b/app/windows/runner/winrt_ext.h @@ -0,0 +1,9 @@ +#ifndef RUNNER_WINRT_EXT_H_ +#define RUNNER_WINRT_EXT_H_ + +#include + +bool IsRunningWithIdentity(); +winrt::hstring GetSharedMedia(); + +#endif // RUNNER_WINRT_EXT_H_ diff --git a/cli/.gitignore b/cli/.gitignore new file mode 100644 index 0000000..3a85790 --- /dev/null +++ b/cli/.gitignore @@ -0,0 +1,3 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ diff --git a/cli/README.md b/cli/README.md new file mode 100644 index 0000000..2c8a7b6 --- /dev/null +++ b/cli/README.md @@ -0,0 +1,3 @@ +# cli + +The LocalSend CLI. diff --git a/cli/analysis_options.yaml b/cli/analysis_options.yaml new file mode 100644 index 0000000..45ca19e --- /dev/null +++ b/cli/analysis_options.yaml @@ -0,0 +1,10 @@ +include: package:lints/recommended.yaml + +linter: + rules: + prefer_single_quotes: true + sort_pub_dependencies: true + always_use_package_imports: true + directives_ordering: true + unawaited_futures: true + discarded_futures: true diff --git a/cli/bin/cli.dart b/cli/bin/cli.dart new file mode 100644 index 0000000..f3e4ba1 --- /dev/null +++ b/cli/bin/cli.dart @@ -0,0 +1,5 @@ +import 'package:cli/main.dart' as m; + +Future main(List arguments) async { + await m.main(arguments); +} diff --git a/cli/lib/main.dart b/cli/lib/main.dart new file mode 100644 index 0000000..c3dd189 --- /dev/null +++ b/cli/lib/main.dart @@ -0,0 +1,39 @@ +import 'dart:io'; + +import 'package:args/args.dart'; +import 'package:path/path.dart' as path; + +Future main(List arguments) async { + final parser = ArgParser(); + + parser.addFlag('help', abbr: 'h', negatable: false, help: 'Prints usage information', defaultsTo: false); + parser.addFlag('receive', abbr: 'r', negatable: false, help: 'Start a server to receive files', defaultsTo: false); + parser.addFlag('send', abbr: 's', negatable: false, help: 'Setups a client to send files', defaultsTo: false); + + final results = parser.parse(arguments); + + if (results['help']) { + _printUsage(parser); + return; + } + + final receive = results['receive'] as bool; + final send = results['send'] as bool; + + if (receive) { + print('Starting server...'); + } else if (send) { + print('Setting up client...'); + } else { + _printUsage(parser); + } +} + +void _printUsage(ArgParser parser) { + print('The LocalSend CLI to send and receive files locally.'); + print(''); + print('Usage: ${path.basename(Platform.executable)} [options]'); + print(''); + print('Options:'); + print(parser.usage); +} diff --git a/cli/pubspec.lock b/cli/pubspec.lock new file mode 100644 index 0000000..687d3c8 --- /dev/null +++ b/cli/pubspec.lock @@ -0,0 +1,433 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "45cfa8471b89fb6643fe9bf51bd7931a76b8f5ec2d65de4fb176dba8d4f22c77" + url: "https://pub.dev" + source: hosted + version: "73.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.2" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "4959fec185fe70cce007c57e9ab6983101dbe593d2bf8bbfb4453aaec0cf470a" + url: "https://pub.dev" + source: hosted + version: "6.8.0" + args: + dependency: "direct main" + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + url: "https://pub.dev" + source: hosted + version: "1.19.0" + common: + dependency: "direct main" + description: + path: "../common" + relative: true + source: path + version: "1.0.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + coverage: + dependency: transitive + description: + name: coverage + sha256: c1fb2dce3c0085f39dc72668e85f8e0210ec7de05345821ff58530567df345a5 + url: "https://pub.dev" + source: hosted + version: "1.9.2" + crypto: + dependency: transitive + description: + name: crypto + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 + url: "https://pub.dev" + source: hosted + version: "3.0.5" + dart_mappable: + dependency: transitive + description: + name: dart_mappable + sha256: "47269caf2060533c29b823ff7fa9706502355ffcb61e7f2a374e3a0fb2f2c3f0" + url: "https://pub.dev" + source: hosted + version: "4.2.2" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "40f592dd352890c3b60fec1b68e786cefb9603e05ff303dbc4dda49b304ecdf4" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf + url: "https://pub.dev" + source: hosted + version: "0.7.1" + lints: + dependency: "direct dev" + description: + name: lints + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + macros: + dependency: transitive + description: + name: macros + sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" + url: "https://pub.dev" + source: hosted + version: "0.1.2-main.4" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + mime: + dependency: transitive + description: + name: mime + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" + url: "https://pub.dev" + source: hosted + version: "1.0.6" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: "direct main" + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + refena: + dependency: transitive + description: + name: refena + sha256: "1446e9622451e0cffef2af5b3fd57a52f0688d7c9eb848e969c16ccc2d14e833" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" + source: hosted + version: "0.10.12" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + url: "https://pub.dev" + source: hosted + version: "1.12.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test: + dependency: "direct dev" + description: + name: test + sha256: "713a8789d62f3233c46b4a90b174737b2c04cb6ae4500f2aa8b1be8f03f5e67f" + url: "https://pub.dev" + source: hosted + version: "1.25.8" + test_api: + dependency: transitive + description: + name: test_api + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + url: "https://pub.dev" + source: hosted + version: "0.7.3" + test_core: + dependency: transitive + description: + name: test_core + sha256: "12391302411737c176b0b5d6491f466b0dd56d4763e347b6714efbaa74d7953d" + url: "https://pub.dev" + source: hosted + version: "0.6.5" + type_plus: + dependency: transitive + description: + name: type_plus + sha256: d5d1019471f0d38b91603adb9b5fd4ce7ab903c879d2fbf1a3f80a630a03fcc9 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + url: "https://pub.dev" + source: hosted + version: "14.3.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.5.0 <4.0.0" diff --git a/cli/pubspec.yaml b/cli/pubspec.yaml new file mode 100644 index 0000000..1565432 --- /dev/null +++ b/cli/pubspec.yaml @@ -0,0 +1,17 @@ +name: cli +description: A sample command-line application. +version: 1.0.0 +publish_to: "none" + +environment: + sdk: ^3.1.1 + +dependencies: + args: 2.4.2 + common: + path: ../common + path: 1.9.0 + +dev_dependencies: + lints: ^2.0.0 + test: ^1.21.0 diff --git a/common/.gitignore b/common/.gitignore new file mode 100644 index 0000000..3cceda5 --- /dev/null +++ b/common/.gitignore @@ -0,0 +1,7 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ + +# Avoid committing pubspec.lock for library packages; see +# https://dart.dev/guides/libraries/private-files#pubspeclock. +pubspec.lock diff --git a/common/README.md b/common/README.md new file mode 100644 index 0000000..d64c28d --- /dev/null +++ b/common/README.md @@ -0,0 +1,3 @@ +# common + +Common code used by the app and by the cli. diff --git a/common/analysis_options.yaml b/common/analysis_options.yaml new file mode 100644 index 0000000..794abce --- /dev/null +++ b/common/analysis_options.yaml @@ -0,0 +1,14 @@ +include: package:lints/recommended.yaml + +formatter: + trailing_commas: preserve + page_width: 150 + +linter: + rules: + prefer_single_quotes: true + sort_pub_dependencies: true + always_use_package_imports: true + directives_ordering: true + unawaited_futures: true + discarded_futures: true diff --git a/common/build.yaml b/common/build.yaml new file mode 100644 index 0000000..e939605 --- /dev/null +++ b/common/build.yaml @@ -0,0 +1,10 @@ +targets: + $default: + builders: + dart_mappable_builder: + options: + renameMethods: + fromJson: deserialize + toJson: serialize + fromMap: fromJson + toMap: toJson diff --git a/common/lib/api_route_builder.dart b/common/lib/api_route_builder.dart new file mode 100644 index 0000000..613341c --- /dev/null +++ b/common/lib/api_route_builder.dart @@ -0,0 +1,44 @@ +import 'package:common/model/device.dart'; + +const _basePath = '/api/localsend'; + +/// Type-safe API paths +enum ApiRoute { + info('info'), + register('register'), + prepareUpload('prepare-upload', 'send-request'), + upload('upload', 'send'), + cancel('cancel'), + show('show'), + prepareDownload('prepare-download'), + download('download'), + ; + + const ApiRoute(String path, [String? legacy]) + : v1 = '$_basePath/v1/${legacy ?? path}', + v2 = '$_basePath/v2/$path'; + + /// The server url for v1 + final String v1; + + /// The server url for v2 + final String v2; + + /// The client url + String target(Device target, {Map? query}) { + return Uri( + scheme: target.https ? 'https' : 'http', + host: target.ip, + port: target.port, + path: target.version == '1.0' ? v1 : v2, + queryParameters: query, + ).toString(); + } + + /// The client url for polling + String targetRaw(String ip, int port, bool https, String version) { + final protocol = https ? 'https' : 'http'; + final route = version == '1.0' ? v1 : v2; + return '$protocol://$ip:$port$route'; + } +} diff --git a/common/lib/constants.dart b/common/lib/constants.dart new file mode 100644 index 0000000..1bc13e3 --- /dev/null +++ b/common/lib/constants.dart @@ -0,0 +1,32 @@ +/// The protocol version. +/// +/// Version table: +/// Protocols | App (Official implementation) +/// ----------|------------------------------ +/// 1.0 | 1.0.0 - 1.8.0 +/// 1.0, 2.0 | 1.9.0 - 1.14.0 +/// 1.0, 2.1 | 1.15.0 - 1.17.0 +/// 2.1 | 1.18.0 +const protocolVersion = '2.1'; + +/// Assumed protocol version of peers for first handshake. +/// Generally this should be slightly lower than the current protocol version. +const peerProtocolVersion = '1.0'; + +/// The protocol version when no version is specified. +/// Prior v2, the protocol version was not specified. +const fallbackProtocolVersion = '1.0'; + +/// The default http server port and +/// and multicast port. +const defaultPort = 53317; + +/// The default discovery timeout in milliseconds. +/// This is the time the discovery server waits for responses. +/// If no response is received within this time, the target server is unavailable. +const defaultDiscoveryTimeout = 500; + +/// The default multicast group should be 224.0.0.0/24 +/// because on some Android devices this is the only IP range +/// that can receive UDP multicast messages. +const defaultMulticastGroup = '224.0.0.167'; diff --git a/common/lib/isolate.dart b/common/lib/isolate.dart new file mode 100644 index 0000000..1fd5cab --- /dev/null +++ b/common/lib/isolate.dart @@ -0,0 +1,6 @@ +export 'package:common/src/isolate/child/http_provider.dart' show CustomHttpClient, CustomCancelToken; +export 'package:common/src/isolate/child/sync_provider.dart'; +export 'package:common/src/isolate/child/upload_isolate.dart' show UriContentStreamResolver; +export 'package:common/src/isolate/parent/actions.dart'; +export 'package:common/src/isolate/parent/actions_sync.dart'; +export 'package:common/src/isolate/parent/parent_isolate_provider.dart'; diff --git a/common/lib/model/device.dart b/common/lib/model/device.dart new file mode 100644 index 0000000..a1c215b --- /dev/null +++ b/common/lib/model/device.dart @@ -0,0 +1,118 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +part 'device.mapper.dart'; + +@MappableEnum(defaultValue: DeviceType.desktop) +enum DeviceType { + mobile, + desktop, + web, + headless, + server, +} + +@MappableClass() +sealed class DiscoveryMethod with DiscoveryMethodMappable { + const DiscoveryMethod(); +} + +@MappableClass() +class MulticastDiscovery extends DiscoveryMethod with MulticastDiscoveryMappable { + const MulticastDiscovery(); +} + +@MappableClass() +class HttpDiscovery extends DiscoveryMethod with HttpDiscoveryMappable { + final String ip; + + const HttpDiscovery({required this.ip}); +} + +@MappableClass() +class SignalingDiscovery extends DiscoveryMethod with SignalingDiscoveryMappable { + final String signalingServer; + + const SignalingDiscovery({required this.signalingServer}); +} + +enum TransmissionMethod { + http('HTTP'), + webrtc('WebRTC'); + + final String label; + + const TransmissionMethod(this.label); +} + +/// Internal device model. +/// It gets not serialized. +@MappableClass() +class Device with DeviceMappable { + /// A unique ID provided by the signaling server. + final String? signalingId; + + /// The IP address of the device. + /// Is null when found via signaling. + final String? ip; + + final String version; + final int port; + final bool https; + final String fingerprint; + final String alias; + final String? deviceModel; + final DeviceType deviceType; + final bool download; + final Set discoveryMethods; + + Set get transmissionMethods { + bool http = false; + bool webrtc = false; + + for (final method in discoveryMethods) { + if (method is SignalingDiscovery) { + webrtc = true; + } else { + http = true; + } + } + + final methods = {}; + if (http) { + methods.add(TransmissionMethod.http); + } + if (webrtc) { + methods.add(TransmissionMethod.webrtc); + } + + return methods; + } + + const Device({ + required this.signalingId, + required this.ip, + required this.version, + required this.port, + required this.https, + required this.fingerprint, + required this.alias, + required this.deviceModel, + required this.deviceType, + required this.download, + required this.discoveryMethods, + }); + + static const empty = Device( + signalingId: null, + ip: null, + version: '', + port: -1, + https: false, + fingerprint: '', + alias: '', + deviceModel: null, + deviceType: DeviceType.desktop, + download: false, + discoveryMethods: {}, + ); +} diff --git a/common/lib/model/device.mapper.dart b/common/lib/model/device.mapper.dart new file mode 100644 index 0000000..6acc184 --- /dev/null +++ b/common/lib/model/device.mapper.dart @@ -0,0 +1,560 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'device.dart'; + +class DeviceTypeMapper extends EnumMapper { + DeviceTypeMapper._(); + + static DeviceTypeMapper? _instance; + static DeviceTypeMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = DeviceTypeMapper._()); + } + return _instance!; + } + + static DeviceType fromValue(dynamic value) { + ensureInitialized(); + return MapperContainer.globals.fromValue(value); + } + + @override + DeviceType decode(dynamic value) { + switch (value) { + case 'mobile': + return DeviceType.mobile; + case 'desktop': + return DeviceType.desktop; + case 'web': + return DeviceType.web; + case 'headless': + return DeviceType.headless; + case 'server': + return DeviceType.server; + default: + return DeviceType.values[1]; + } + } + + @override + dynamic encode(DeviceType self) { + switch (self) { + case DeviceType.mobile: + return 'mobile'; + case DeviceType.desktop: + return 'desktop'; + case DeviceType.web: + return 'web'; + case DeviceType.headless: + return 'headless'; + case DeviceType.server: + return 'server'; + } + } +} + +extension DeviceTypeMapperExtension on DeviceType { + String toValue() { + DeviceTypeMapper.ensureInitialized(); + return MapperContainer.globals.toValue(this) as String; + } +} + +class DiscoveryMethodMapper extends ClassMapperBase { + DiscoveryMethodMapper._(); + + static DiscoveryMethodMapper? _instance; + static DiscoveryMethodMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = DiscoveryMethodMapper._()); + MulticastDiscoveryMapper.ensureInitialized(); + HttpDiscoveryMapper.ensureInitialized(); + SignalingDiscoveryMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'DiscoveryMethod'; + + @override + final MappableFields fields = const {}; + + static DiscoveryMethod _instantiate(DecodingData data) { + throw MapperException.missingConstructor('DiscoveryMethod'); + } + + @override + final Function instantiate = _instantiate; + + static DiscoveryMethod fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static DiscoveryMethod deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin DiscoveryMethodMappable { + String serialize(); + Map toJson(); + DiscoveryMethodCopyWith get copyWith; +} + +abstract class DiscoveryMethodCopyWith<$R, $In extends DiscoveryMethod, $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call(); + DiscoveryMethodCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class MulticastDiscoveryMapper extends ClassMapperBase { + MulticastDiscoveryMapper._(); + + static MulticastDiscoveryMapper? _instance; + static MulticastDiscoveryMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = MulticastDiscoveryMapper._()); + DiscoveryMethodMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'MulticastDiscovery'; + + @override + final MappableFields fields = const {}; + + static MulticastDiscovery _instantiate(DecodingData data) { + return MulticastDiscovery(); + } + + @override + final Function instantiate = _instantiate; + + static MulticastDiscovery fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static MulticastDiscovery deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin MulticastDiscoveryMappable { + String serialize() { + return MulticastDiscoveryMapper.ensureInitialized().encodeJson(this as MulticastDiscovery); + } + + Map toJson() { + return MulticastDiscoveryMapper.ensureInitialized().encodeMap(this as MulticastDiscovery); + } + + MulticastDiscoveryCopyWith get copyWith => + _MulticastDiscoveryCopyWithImpl(this as MulticastDiscovery, $identity, $identity); + @override + String toString() { + return MulticastDiscoveryMapper.ensureInitialized().stringifyValue(this as MulticastDiscovery); + } + + @override + bool operator ==(Object other) { + return MulticastDiscoveryMapper.ensureInitialized().equalsValue(this as MulticastDiscovery, other); + } + + @override + int get hashCode { + return MulticastDiscoveryMapper.ensureInitialized().hashValue(this as MulticastDiscovery); + } +} + +extension MulticastDiscoveryValueCopy<$R, $Out> on ObjectCopyWith<$R, MulticastDiscovery, $Out> { + MulticastDiscoveryCopyWith<$R, MulticastDiscovery, $Out> get $asMulticastDiscovery => + $base.as((v, t, t2) => _MulticastDiscoveryCopyWithImpl(v, t, t2)); +} + +abstract class MulticastDiscoveryCopyWith<$R, $In extends MulticastDiscovery, $Out> implements DiscoveryMethodCopyWith<$R, $In, $Out> { + @override + $R call(); + MulticastDiscoveryCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _MulticastDiscoveryCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, MulticastDiscovery, $Out> + implements MulticastDiscoveryCopyWith<$R, MulticastDiscovery, $Out> { + _MulticastDiscoveryCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = MulticastDiscoveryMapper.ensureInitialized(); + @override + $R call() => $apply(FieldCopyWithData({})); + @override + MulticastDiscovery $make(CopyWithData data) => MulticastDiscovery(); + + @override + MulticastDiscoveryCopyWith<$R2, MulticastDiscovery, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _MulticastDiscoveryCopyWithImpl($value, $cast, t); +} + +class HttpDiscoveryMapper extends ClassMapperBase { + HttpDiscoveryMapper._(); + + static HttpDiscoveryMapper? _instance; + static HttpDiscoveryMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = HttpDiscoveryMapper._()); + DiscoveryMethodMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'HttpDiscovery'; + + static String _$ip(HttpDiscovery v) => v.ip; + static const Field _f$ip = Field('ip', _$ip); + + @override + final MappableFields fields = const { + #ip: _f$ip, + }; + + static HttpDiscovery _instantiate(DecodingData data) { + return HttpDiscovery(ip: data.dec(_f$ip)); + } + + @override + final Function instantiate = _instantiate; + + static HttpDiscovery fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static HttpDiscovery deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin HttpDiscoveryMappable { + String serialize() { + return HttpDiscoveryMapper.ensureInitialized().encodeJson(this as HttpDiscovery); + } + + Map toJson() { + return HttpDiscoveryMapper.ensureInitialized().encodeMap(this as HttpDiscovery); + } + + HttpDiscoveryCopyWith get copyWith => + _HttpDiscoveryCopyWithImpl(this as HttpDiscovery, $identity, $identity); + @override + String toString() { + return HttpDiscoveryMapper.ensureInitialized().stringifyValue(this as HttpDiscovery); + } + + @override + bool operator ==(Object other) { + return HttpDiscoveryMapper.ensureInitialized().equalsValue(this as HttpDiscovery, other); + } + + @override + int get hashCode { + return HttpDiscoveryMapper.ensureInitialized().hashValue(this as HttpDiscovery); + } +} + +extension HttpDiscoveryValueCopy<$R, $Out> on ObjectCopyWith<$R, HttpDiscovery, $Out> { + HttpDiscoveryCopyWith<$R, HttpDiscovery, $Out> get $asHttpDiscovery => $base.as((v, t, t2) => _HttpDiscoveryCopyWithImpl(v, t, t2)); +} + +abstract class HttpDiscoveryCopyWith<$R, $In extends HttpDiscovery, $Out> implements DiscoveryMethodCopyWith<$R, $In, $Out> { + @override + $R call({String? ip}); + HttpDiscoveryCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _HttpDiscoveryCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, HttpDiscovery, $Out> + implements HttpDiscoveryCopyWith<$R, HttpDiscovery, $Out> { + _HttpDiscoveryCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = HttpDiscoveryMapper.ensureInitialized(); + @override + $R call({String? ip}) => $apply(FieldCopyWithData({if (ip != null) #ip: ip})); + @override + HttpDiscovery $make(CopyWithData data) => HttpDiscovery(ip: data.get(#ip, or: $value.ip)); + + @override + HttpDiscoveryCopyWith<$R2, HttpDiscovery, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => _HttpDiscoveryCopyWithImpl($value, $cast, t); +} + +class SignalingDiscoveryMapper extends ClassMapperBase { + SignalingDiscoveryMapper._(); + + static SignalingDiscoveryMapper? _instance; + static SignalingDiscoveryMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = SignalingDiscoveryMapper._()); + DiscoveryMethodMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'SignalingDiscovery'; + + static String _$signalingServer(SignalingDiscovery v) => v.signalingServer; + static const Field _f$signalingServer = Field('signalingServer', _$signalingServer); + + @override + final MappableFields fields = const { + #signalingServer: _f$signalingServer, + }; + + static SignalingDiscovery _instantiate(DecodingData data) { + return SignalingDiscovery(signalingServer: data.dec(_f$signalingServer)); + } + + @override + final Function instantiate = _instantiate; + + static SignalingDiscovery fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static SignalingDiscovery deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin SignalingDiscoveryMappable { + String serialize() { + return SignalingDiscoveryMapper.ensureInitialized().encodeJson(this as SignalingDiscovery); + } + + Map toJson() { + return SignalingDiscoveryMapper.ensureInitialized().encodeMap(this as SignalingDiscovery); + } + + SignalingDiscoveryCopyWith get copyWith => + _SignalingDiscoveryCopyWithImpl(this as SignalingDiscovery, $identity, $identity); + @override + String toString() { + return SignalingDiscoveryMapper.ensureInitialized().stringifyValue(this as SignalingDiscovery); + } + + @override + bool operator ==(Object other) { + return SignalingDiscoveryMapper.ensureInitialized().equalsValue(this as SignalingDiscovery, other); + } + + @override + int get hashCode { + return SignalingDiscoveryMapper.ensureInitialized().hashValue(this as SignalingDiscovery); + } +} + +extension SignalingDiscoveryValueCopy<$R, $Out> on ObjectCopyWith<$R, SignalingDiscovery, $Out> { + SignalingDiscoveryCopyWith<$R, SignalingDiscovery, $Out> get $asSignalingDiscovery => + $base.as((v, t, t2) => _SignalingDiscoveryCopyWithImpl(v, t, t2)); +} + +abstract class SignalingDiscoveryCopyWith<$R, $In extends SignalingDiscovery, $Out> implements DiscoveryMethodCopyWith<$R, $In, $Out> { + @override + $R call({String? signalingServer}); + SignalingDiscoveryCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _SignalingDiscoveryCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, SignalingDiscovery, $Out> + implements SignalingDiscoveryCopyWith<$R, SignalingDiscovery, $Out> { + _SignalingDiscoveryCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = SignalingDiscoveryMapper.ensureInitialized(); + @override + $R call({String? signalingServer}) => $apply(FieldCopyWithData({if (signalingServer != null) #signalingServer: signalingServer})); + @override + SignalingDiscovery $make(CopyWithData data) => SignalingDiscovery(signalingServer: data.get(#signalingServer, or: $value.signalingServer)); + + @override + SignalingDiscoveryCopyWith<$R2, SignalingDiscovery, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _SignalingDiscoveryCopyWithImpl($value, $cast, t); +} + +class DeviceMapper extends ClassMapperBase { + DeviceMapper._(); + + static DeviceMapper? _instance; + static DeviceMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = DeviceMapper._()); + DeviceTypeMapper.ensureInitialized(); + DiscoveryMethodMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'Device'; + + static String? _$signalingId(Device v) => v.signalingId; + static const Field _f$signalingId = Field('signalingId', _$signalingId); + static String? _$ip(Device v) => v.ip; + static const Field _f$ip = Field('ip', _$ip); + static String _$version(Device v) => v.version; + static const Field _f$version = Field('version', _$version); + static int _$port(Device v) => v.port; + static const Field _f$port = Field('port', _$port); + static bool _$https(Device v) => v.https; + static const Field _f$https = Field('https', _$https); + static String _$fingerprint(Device v) => v.fingerprint; + static const Field _f$fingerprint = Field('fingerprint', _$fingerprint); + static String _$alias(Device v) => v.alias; + static const Field _f$alias = Field('alias', _$alias); + static String? _$deviceModel(Device v) => v.deviceModel; + static const Field _f$deviceModel = Field('deviceModel', _$deviceModel); + static DeviceType _$deviceType(Device v) => v.deviceType; + static const Field _f$deviceType = Field('deviceType', _$deviceType); + static bool _$download(Device v) => v.download; + static const Field _f$download = Field('download', _$download); + static Set _$discoveryMethods(Device v) => v.discoveryMethods; + static const Field> _f$discoveryMethods = Field('discoveryMethods', _$discoveryMethods); + + @override + final MappableFields fields = const { + #signalingId: _f$signalingId, + #ip: _f$ip, + #version: _f$version, + #port: _f$port, + #https: _f$https, + #fingerprint: _f$fingerprint, + #alias: _f$alias, + #deviceModel: _f$deviceModel, + #deviceType: _f$deviceType, + #download: _f$download, + #discoveryMethods: _f$discoveryMethods, + }; + + static Device _instantiate(DecodingData data) { + return Device( + signalingId: data.dec(_f$signalingId), + ip: data.dec(_f$ip), + version: data.dec(_f$version), + port: data.dec(_f$port), + https: data.dec(_f$https), + fingerprint: data.dec(_f$fingerprint), + alias: data.dec(_f$alias), + deviceModel: data.dec(_f$deviceModel), + deviceType: data.dec(_f$deviceType), + download: data.dec(_f$download), + discoveryMethods: data.dec(_f$discoveryMethods)); + } + + @override + final Function instantiate = _instantiate; + + static Device fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static Device deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin DeviceMappable { + String serialize() { + return DeviceMapper.ensureInitialized().encodeJson(this as Device); + } + + Map toJson() { + return DeviceMapper.ensureInitialized().encodeMap(this as Device); + } + + DeviceCopyWith get copyWith => _DeviceCopyWithImpl(this as Device, $identity, $identity); + @override + String toString() { + return DeviceMapper.ensureInitialized().stringifyValue(this as Device); + } + + @override + bool operator ==(Object other) { + return DeviceMapper.ensureInitialized().equalsValue(this as Device, other); + } + + @override + int get hashCode { + return DeviceMapper.ensureInitialized().hashValue(this as Device); + } +} + +extension DeviceValueCopy<$R, $Out> on ObjectCopyWith<$R, Device, $Out> { + DeviceCopyWith<$R, Device, $Out> get $asDevice => $base.as((v, t, t2) => _DeviceCopyWithImpl(v, t, t2)); +} + +abstract class DeviceCopyWith<$R, $In extends Device, $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call( + {String? signalingId, + String? ip, + String? version, + int? port, + bool? https, + String? fingerprint, + String? alias, + String? deviceModel, + DeviceType? deviceType, + bool? download, + Set? discoveryMethods}); + DeviceCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _DeviceCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, Device, $Out> implements DeviceCopyWith<$R, Device, $Out> { + _DeviceCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = DeviceMapper.ensureInitialized(); + @override + $R call( + {Object? signalingId = $none, + Object? ip = $none, + String? version, + int? port, + bool? https, + String? fingerprint, + String? alias, + Object? deviceModel = $none, + DeviceType? deviceType, + bool? download, + Set? discoveryMethods}) => + $apply(FieldCopyWithData({ + if (signalingId != $none) #signalingId: signalingId, + if (ip != $none) #ip: ip, + if (version != null) #version: version, + if (port != null) #port: port, + if (https != null) #https: https, + if (fingerprint != null) #fingerprint: fingerprint, + if (alias != null) #alias: alias, + if (deviceModel != $none) #deviceModel: deviceModel, + if (deviceType != null) #deviceType: deviceType, + if (download != null) #download: download, + if (discoveryMethods != null) #discoveryMethods: discoveryMethods + })); + @override + Device $make(CopyWithData data) => Device( + signalingId: data.get(#signalingId, or: $value.signalingId), + ip: data.get(#ip, or: $value.ip), + version: data.get(#version, or: $value.version), + port: data.get(#port, or: $value.port), + https: data.get(#https, or: $value.https), + fingerprint: data.get(#fingerprint, or: $value.fingerprint), + alias: data.get(#alias, or: $value.alias), + deviceModel: data.get(#deviceModel, or: $value.deviceModel), + deviceType: data.get(#deviceType, or: $value.deviceType), + download: data.get(#download, or: $value.download), + discoveryMethods: data.get(#discoveryMethods, or: $value.discoveryMethods)); + + @override + DeviceCopyWith<$R2, Device, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => _DeviceCopyWithImpl($value, $cast, t); +} diff --git a/common/lib/model/device_info_result.dart b/common/lib/model/device_info_result.dart new file mode 100644 index 0000000..881ee1c --- /dev/null +++ b/common/lib/model/device_info_result.dart @@ -0,0 +1,16 @@ +import 'package:common/model/device.dart'; + +class DeviceInfoResult { + final DeviceType deviceType; + final String? deviceModel; + + // Used to properly set Edge-to-Edge mode on Android + // See https://github.com/flutter/flutter/issues/90098 + final int? androidSdkInt; + + DeviceInfoResult({ + required this.deviceType, + required this.deviceModel, + required this.androidSdkInt, + }); +} diff --git a/common/lib/model/dto/file_dto.dart b/common/lib/model/dto/file_dto.dart new file mode 100644 index 0000000..5de955e --- /dev/null +++ b/common/lib/model/dto/file_dto.dart @@ -0,0 +1,118 @@ +import 'package:collection/collection.dart'; +import 'package:common/model/file_type.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:mime/mime.dart'; + +part 'file_dto.mapper.dart'; + +@MappableClass(ignoreNull: true) +class FileMetadata with FileMetadataMappable { + @MappableField(key: 'modified') + final DateTime? lastModified; + + @MappableField(key: 'accessed') + final DateTime? lastAccessed; + + const FileMetadata({ + required this.lastModified, + required this.lastAccessed, + }); +} + +/// The file DTO that is sent between server and client. +class FileDto { + final String id; // unique inside session + final String fileName; + final int size; + final FileType fileType; + final String? hash; + final String? preview; + final FileMetadata? metadata; + + const FileDto({ + required this.id, + required this.fileName, + required this.size, + required this.fileType, + required this.hash, + required this.preview, + required this.metadata, + }); + + String lookupMime() => lookupMimeType(fileName) ?? 'application/octet-stream'; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is FileDto && + runtimeType == other.runtimeType && + id == other.id && + fileName == other.fileName && + size == other.size && + fileType == other.fileType && + hash == other.hash && + preview == other.preview; + + @override + int get hashCode => Object.hash(id, fileName, size, fileType, hash, preview); +} + +class FileDtoMapper extends SimpleMapper { + const FileDtoMapper(); + + @override + FileDto decode(dynamic value) { + final map = value as Map; + final String rawFileType = map['fileType'] as String; + final FileType fileType; + if (rawFileType.contains('/')) { + // parse mime + fileType = decodeFromMime(rawFileType); + } else { + // parse legacy enum to internal internal enum + fileType = FileType.values.firstWhereOrNull((e) => e.name == rawFileType) ?? FileType.other; + } + + return FileDto( + id: map['id'] as String, + fileName: map['fileName'] as String, + size: map['size'] as int, + fileType: fileType, + hash: map['hash'] as String?, + preview: map['preview'] as String?, + metadata: switch (map['metadata']) { + Map metadata => FileMetadataMapper.fromJson(metadata), + _ => null, + }, + ); + } + + @override + dynamic encode(FileDto self) { + return { + 'id': self.id, + 'fileName': self.fileName, + 'size': self.size, + 'fileType': self.lookupMime(), + if (self.hash != null) 'hash': self.hash, + if (self.preview != null) 'preview': self.preview, + if (self.metadata != null) 'metadata': self.metadata!.toJson(), + }; + } +} + +FileType decodeFromMime(String mime) { + if (mime.startsWith('image/')) { + return FileType.image; + } else if (mime.startsWith('video/')) { + return FileType.video; + } else if (mime == 'application/pdf') { + return FileType.pdf; + } else if (mime.startsWith('text/')) { + return FileType.text; + } else if (mime == 'application/vnd.android.package-archive') { + return FileType.apk; + } else { + return FileType.other; + } +} diff --git a/common/lib/model/dto/file_dto.mapper.dart b/common/lib/model/dto/file_dto.mapper.dart new file mode 100644 index 0000000..3a65ae3 --- /dev/null +++ b/common/lib/model/dto/file_dto.mapper.dart @@ -0,0 +1,102 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'file_dto.dart'; + +class FileMetadataMapper extends ClassMapperBase { + FileMetadataMapper._(); + + static FileMetadataMapper? _instance; + static FileMetadataMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = FileMetadataMapper._()); + } + return _instance!; + } + + @override + final String id = 'FileMetadata'; + + static DateTime? _$lastModified(FileMetadata v) => v.lastModified; + static const Field _f$lastModified = Field('lastModified', _$lastModified, key: 'modified'); + static DateTime? _$lastAccessed(FileMetadata v) => v.lastAccessed; + static const Field _f$lastAccessed = Field('lastAccessed', _$lastAccessed, key: 'accessed'); + + @override + final MappableFields fields = const { + #lastModified: _f$lastModified, + #lastAccessed: _f$lastAccessed, + }; + @override + final bool ignoreNull = true; + + static FileMetadata _instantiate(DecodingData data) { + return FileMetadata(lastModified: data.dec(_f$lastModified), lastAccessed: data.dec(_f$lastAccessed)); + } + + @override + final Function instantiate = _instantiate; + + static FileMetadata fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static FileMetadata deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin FileMetadataMappable { + String serialize() { + return FileMetadataMapper.ensureInitialized().encodeJson(this as FileMetadata); + } + + Map toJson() { + return FileMetadataMapper.ensureInitialized().encodeMap(this as FileMetadata); + } + + FileMetadataCopyWith get copyWith => + _FileMetadataCopyWithImpl(this as FileMetadata, $identity, $identity); + @override + String toString() { + return FileMetadataMapper.ensureInitialized().stringifyValue(this as FileMetadata); + } + + @override + bool operator ==(Object other) { + return FileMetadataMapper.ensureInitialized().equalsValue(this as FileMetadata, other); + } + + @override + int get hashCode { + return FileMetadataMapper.ensureInitialized().hashValue(this as FileMetadata); + } +} + +extension FileMetadataValueCopy<$R, $Out> on ObjectCopyWith<$R, FileMetadata, $Out> { + FileMetadataCopyWith<$R, FileMetadata, $Out> get $asFileMetadata => $base.as((v, t, t2) => _FileMetadataCopyWithImpl(v, t, t2)); +} + +abstract class FileMetadataCopyWith<$R, $In extends FileMetadata, $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call({DateTime? lastModified, DateTime? lastAccessed}); + FileMetadataCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _FileMetadataCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, FileMetadata, $Out> implements FileMetadataCopyWith<$R, FileMetadata, $Out> { + _FileMetadataCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = FileMetadataMapper.ensureInitialized(); + @override + $R call({Object? lastModified = $none, Object? lastAccessed = $none}) => + $apply(FieldCopyWithData({if (lastModified != $none) #lastModified: lastModified, if (lastAccessed != $none) #lastAccessed: lastAccessed})); + @override + FileMetadata $make(CopyWithData data) => + FileMetadata(lastModified: data.get(#lastModified, or: $value.lastModified), lastAccessed: data.get(#lastAccessed, or: $value.lastAccessed)); + + @override + FileMetadataCopyWith<$R2, FileMetadata, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => _FileMetadataCopyWithImpl($value, $cast, t); +} diff --git a/common/lib/model/dto/info_dto.dart b/common/lib/model/dto/info_dto.dart new file mode 100644 index 0000000..d9203c9 --- /dev/null +++ b/common/lib/model/dto/info_dto.dart @@ -0,0 +1,46 @@ +import 'package:common/constants.dart'; +import 'package:common/model/device.dart'; +import 'package:dart_mappable/dart_mappable.dart'; + +part 'info_dto.mapper.dart'; + +@MappableClass() +class InfoDto with InfoDtoMappable { + final String alias; + final String? version; // v2, format: major.minor + final String? deviceModel; + final DeviceType? deviceType; + final String? fingerprint; // v2 + final bool? download; // v2 + + const InfoDto({ + required this.alias, + required this.version, + required this.deviceModel, + required this.deviceType, + required this.fingerprint, + required this.download, + }); + + static const fromJson = InfoDtoMapper.fromJson; +} + +extension InfoToDeviceExt on InfoDto { + /// Convert [InfoDto] to [Device]. + /// Since this HTTP request was successful, the [port] and [https] are known. + Device toDevice(String ip, int port, bool https, DiscoveryMethod method) { + return Device( + signalingId: null, + ip: ip, + version: version ?? fallbackProtocolVersion, + port: port, + https: https, + fingerprint: fingerprint ?? '', + alias: alias, + deviceModel: deviceModel, + deviceType: deviceType ?? DeviceType.desktop, + download: download ?? false, + discoveryMethods: {method}, + ); + } +} diff --git a/common/lib/model/dto/info_dto.mapper.dart b/common/lib/model/dto/info_dto.mapper.dart new file mode 100644 index 0000000..c3fb094 --- /dev/null +++ b/common/lib/model/dto/info_dto.mapper.dart @@ -0,0 +1,136 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'info_dto.dart'; + +class InfoDtoMapper extends ClassMapperBase { + InfoDtoMapper._(); + + static InfoDtoMapper? _instance; + static InfoDtoMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = InfoDtoMapper._()); + DeviceTypeMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'InfoDto'; + + static String _$alias(InfoDto v) => v.alias; + static const Field _f$alias = Field('alias', _$alias); + static String? _$version(InfoDto v) => v.version; + static const Field _f$version = Field('version', _$version); + static String? _$deviceModel(InfoDto v) => v.deviceModel; + static const Field _f$deviceModel = Field('deviceModel', _$deviceModel); + static DeviceType? _$deviceType(InfoDto v) => v.deviceType; + static const Field _f$deviceType = Field('deviceType', _$deviceType); + static String? _$fingerprint(InfoDto v) => v.fingerprint; + static const Field _f$fingerprint = Field('fingerprint', _$fingerprint); + static bool? _$download(InfoDto v) => v.download; + static const Field _f$download = Field('download', _$download); + + @override + final MappableFields fields = const { + #alias: _f$alias, + #version: _f$version, + #deviceModel: _f$deviceModel, + #deviceType: _f$deviceType, + #fingerprint: _f$fingerprint, + #download: _f$download, + }; + + static InfoDto _instantiate(DecodingData data) { + return InfoDto( + alias: data.dec(_f$alias), + version: data.dec(_f$version), + deviceModel: data.dec(_f$deviceModel), + deviceType: data.dec(_f$deviceType), + fingerprint: data.dec(_f$fingerprint), + download: data.dec(_f$download)); + } + + @override + final Function instantiate = _instantiate; + + static InfoDto fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static InfoDto deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin InfoDtoMappable { + String serialize() { + return InfoDtoMapper.ensureInitialized().encodeJson(this as InfoDto); + } + + Map toJson() { + return InfoDtoMapper.ensureInitialized().encodeMap(this as InfoDto); + } + + InfoDtoCopyWith get copyWith => _InfoDtoCopyWithImpl(this as InfoDto, $identity, $identity); + @override + String toString() { + return InfoDtoMapper.ensureInitialized().stringifyValue(this as InfoDto); + } + + @override + bool operator ==(Object other) { + return InfoDtoMapper.ensureInitialized().equalsValue(this as InfoDto, other); + } + + @override + int get hashCode { + return InfoDtoMapper.ensureInitialized().hashValue(this as InfoDto); + } +} + +extension InfoDtoValueCopy<$R, $Out> on ObjectCopyWith<$R, InfoDto, $Out> { + InfoDtoCopyWith<$R, InfoDto, $Out> get $asInfoDto => $base.as((v, t, t2) => _InfoDtoCopyWithImpl(v, t, t2)); +} + +abstract class InfoDtoCopyWith<$R, $In extends InfoDto, $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call({String? alias, String? version, String? deviceModel, DeviceType? deviceType, String? fingerprint, bool? download}); + InfoDtoCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _InfoDtoCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, InfoDto, $Out> implements InfoDtoCopyWith<$R, InfoDto, $Out> { + _InfoDtoCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = InfoDtoMapper.ensureInitialized(); + @override + $R call( + {String? alias, + Object? version = $none, + Object? deviceModel = $none, + Object? deviceType = $none, + Object? fingerprint = $none, + Object? download = $none}) => + $apply(FieldCopyWithData({ + if (alias != null) #alias: alias, + if (version != $none) #version: version, + if (deviceModel != $none) #deviceModel: deviceModel, + if (deviceType != $none) #deviceType: deviceType, + if (fingerprint != $none) #fingerprint: fingerprint, + if (download != $none) #download: download + })); + @override + InfoDto $make(CopyWithData data) => InfoDto( + alias: data.get(#alias, or: $value.alias), + version: data.get(#version, or: $value.version), + deviceModel: data.get(#deviceModel, or: $value.deviceModel), + deviceType: data.get(#deviceType, or: $value.deviceType), + fingerprint: data.get(#fingerprint, or: $value.fingerprint), + download: data.get(#download, or: $value.download)); + + @override + InfoDtoCopyWith<$R2, InfoDto, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => _InfoDtoCopyWithImpl($value, $cast, t); +} diff --git a/common/lib/model/dto/info_register_dto.dart b/common/lib/model/dto/info_register_dto.dart new file mode 100644 index 0000000..18c3c81 --- /dev/null +++ b/common/lib/model/dto/info_register_dto.dart @@ -0,0 +1,52 @@ +import 'package:common/constants.dart'; +import 'package:common/model/device.dart'; +import 'package:common/model/dto/multicast_dto.dart'; +import 'package:dart_mappable/dart_mappable.dart'; + +part 'info_register_dto.mapper.dart'; + +/// Used only for /prepare-upload to be compatible with v1. +/// The [fingerprint] does not exist in v1, so it is nullable here. +/// TODO: replace with [RegisterDto] when v1 compatibility is removed +@MappableClass() +class InfoRegisterDto with InfoRegisterDtoMappable { + final String alias; + final String? version; // v2, format: major.minor + final String? deviceModel; + final DeviceType? deviceType; + final String? fingerprint; + final int? port; // v2 + final ProtocolType? protocol; // v2 + final bool? download; // v2 + + const InfoRegisterDto({ + required this.alias, + required this.version, + required this.deviceModel, + required this.deviceType, + required this.fingerprint, + required this.port, + required this.protocol, + required this.download, + }); + + static const fromJson = InfoRegisterDtoMapper.fromJson; +} + +extension InfoRegisterDtoExt on InfoRegisterDto { + Device toDevice(String ip, int ownPort, bool ownHttps, DiscoveryMethod? method) { + return Device( + signalingId: null, + ip: ip, + version: version ?? fallbackProtocolVersion, + port: port ?? ownPort, + https: protocol != null ? protocol == ProtocolType.https : ownHttps, + fingerprint: fingerprint ?? '', + alias: alias, + deviceModel: deviceModel, + deviceType: deviceType ?? DeviceType.desktop, + download: download ?? false, + discoveryMethods: method == null ? const {} : {method}, + ); + } +} diff --git a/common/lib/model/dto/info_register_dto.mapper.dart b/common/lib/model/dto/info_register_dto.mapper.dart new file mode 100644 index 0000000..1718ef4 --- /dev/null +++ b/common/lib/model/dto/info_register_dto.mapper.dart @@ -0,0 +1,161 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'info_register_dto.dart'; + +class InfoRegisterDtoMapper extends ClassMapperBase { + InfoRegisterDtoMapper._(); + + static InfoRegisterDtoMapper? _instance; + static InfoRegisterDtoMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = InfoRegisterDtoMapper._()); + DeviceTypeMapper.ensureInitialized(); + ProtocolTypeMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'InfoRegisterDto'; + + static String _$alias(InfoRegisterDto v) => v.alias; + static const Field _f$alias = Field('alias', _$alias); + static String? _$version(InfoRegisterDto v) => v.version; + static const Field _f$version = Field('version', _$version); + static String? _$deviceModel(InfoRegisterDto v) => v.deviceModel; + static const Field _f$deviceModel = Field('deviceModel', _$deviceModel); + static DeviceType? _$deviceType(InfoRegisterDto v) => v.deviceType; + static const Field _f$deviceType = Field('deviceType', _$deviceType); + static String? _$fingerprint(InfoRegisterDto v) => v.fingerprint; + static const Field _f$fingerprint = Field('fingerprint', _$fingerprint); + static int? _$port(InfoRegisterDto v) => v.port; + static const Field _f$port = Field('port', _$port); + static ProtocolType? _$protocol(InfoRegisterDto v) => v.protocol; + static const Field _f$protocol = Field('protocol', _$protocol); + static bool? _$download(InfoRegisterDto v) => v.download; + static const Field _f$download = Field('download', _$download); + + @override + final MappableFields fields = const { + #alias: _f$alias, + #version: _f$version, + #deviceModel: _f$deviceModel, + #deviceType: _f$deviceType, + #fingerprint: _f$fingerprint, + #port: _f$port, + #protocol: _f$protocol, + #download: _f$download, + }; + + static InfoRegisterDto _instantiate(DecodingData data) { + return InfoRegisterDto( + alias: data.dec(_f$alias), + version: data.dec(_f$version), + deviceModel: data.dec(_f$deviceModel), + deviceType: data.dec(_f$deviceType), + fingerprint: data.dec(_f$fingerprint), + port: data.dec(_f$port), + protocol: data.dec(_f$protocol), + download: data.dec(_f$download)); + } + + @override + final Function instantiate = _instantiate; + + static InfoRegisterDto fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static InfoRegisterDto deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin InfoRegisterDtoMappable { + String serialize() { + return InfoRegisterDtoMapper.ensureInitialized().encodeJson(this as InfoRegisterDto); + } + + Map toJson() { + return InfoRegisterDtoMapper.ensureInitialized().encodeMap(this as InfoRegisterDto); + } + + InfoRegisterDtoCopyWith get copyWith => + _InfoRegisterDtoCopyWithImpl(this as InfoRegisterDto, $identity, $identity); + @override + String toString() { + return InfoRegisterDtoMapper.ensureInitialized().stringifyValue(this as InfoRegisterDto); + } + + @override + bool operator ==(Object other) { + return InfoRegisterDtoMapper.ensureInitialized().equalsValue(this as InfoRegisterDto, other); + } + + @override + int get hashCode { + return InfoRegisterDtoMapper.ensureInitialized().hashValue(this as InfoRegisterDto); + } +} + +extension InfoRegisterDtoValueCopy<$R, $Out> on ObjectCopyWith<$R, InfoRegisterDto, $Out> { + InfoRegisterDtoCopyWith<$R, InfoRegisterDto, $Out> get $asInfoRegisterDto => $base.as((v, t, t2) => _InfoRegisterDtoCopyWithImpl(v, t, t2)); +} + +abstract class InfoRegisterDtoCopyWith<$R, $In extends InfoRegisterDto, $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call( + {String? alias, + String? version, + String? deviceModel, + DeviceType? deviceType, + String? fingerprint, + int? port, + ProtocolType? protocol, + bool? download}); + InfoRegisterDtoCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _InfoRegisterDtoCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, InfoRegisterDto, $Out> + implements InfoRegisterDtoCopyWith<$R, InfoRegisterDto, $Out> { + _InfoRegisterDtoCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = InfoRegisterDtoMapper.ensureInitialized(); + @override + $R call( + {String? alias, + Object? version = $none, + Object? deviceModel = $none, + Object? deviceType = $none, + Object? fingerprint = $none, + Object? port = $none, + Object? protocol = $none, + Object? download = $none}) => + $apply(FieldCopyWithData({ + if (alias != null) #alias: alias, + if (version != $none) #version: version, + if (deviceModel != $none) #deviceModel: deviceModel, + if (deviceType != $none) #deviceType: deviceType, + if (fingerprint != $none) #fingerprint: fingerprint, + if (port != $none) #port: port, + if (protocol != $none) #protocol: protocol, + if (download != $none) #download: download + })); + @override + InfoRegisterDto $make(CopyWithData data) => InfoRegisterDto( + alias: data.get(#alias, or: $value.alias), + version: data.get(#version, or: $value.version), + deviceModel: data.get(#deviceModel, or: $value.deviceModel), + deviceType: data.get(#deviceType, or: $value.deviceType), + fingerprint: data.get(#fingerprint, or: $value.fingerprint), + port: data.get(#port, or: $value.port), + protocol: data.get(#protocol, or: $value.protocol), + download: data.get(#download, or: $value.download)); + + @override + InfoRegisterDtoCopyWith<$R2, InfoRegisterDto, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => _InfoRegisterDtoCopyWithImpl($value, $cast, t); +} diff --git a/common/lib/model/dto/multicast_dto.dart b/common/lib/model/dto/multicast_dto.dart new file mode 100644 index 0000000..fcca038 --- /dev/null +++ b/common/lib/model/dto/multicast_dto.dart @@ -0,0 +1,55 @@ +import 'package:common/constants.dart'; +import 'package:common/model/device.dart'; +import 'package:dart_mappable/dart_mappable.dart'; + +part 'multicast_dto.mapper.dart'; + +@MappableEnum(defaultValue: ProtocolType.https) +enum ProtocolType { http, https } + +@MappableClass() +class MulticastDto with MulticastDtoMappable { + final String alias; + final String? version; // v2, format: major.minor + final String? deviceModel; + final DeviceType? deviceType; // nullable since v2 + final String fingerprint; + final int? port; // v2 + final ProtocolType? protocol; // v2 + final bool? download; // v2 + final bool? announcement; // v1 + final bool? announce; // v2 + + const MulticastDto({ + required this.alias, + required this.version, + required this.deviceModel, + required this.deviceType, + required this.fingerprint, + required this.port, + required this.protocol, + required this.download, + required this.announcement, + required this.announce, + }); + + static const fromJson = MulticastDtoMapper.fromJson; +} + +extension MulticastDtoToDeviceExt on MulticastDto { + Device toDevice(String ip, int ownPort, bool ownHttps) { + return Device( + signalingId: null, + ip: ip, + version: version ?? fallbackProtocolVersion, + port: port ?? ownPort, + https: protocol != null ? protocol == ProtocolType.https : ownHttps, + fingerprint: fingerprint, + alias: alias, + deviceModel: deviceModel, + deviceType: deviceType ?? DeviceType.desktop, + download: download ?? false, + discoveryMethods: {MulticastDiscovery()}, + ); + } +} diff --git a/common/lib/model/dto/multicast_dto.mapper.dart b/common/lib/model/dto/multicast_dto.mapper.dart new file mode 100644 index 0000000..296e834 --- /dev/null +++ b/common/lib/model/dto/multicast_dto.mapper.dart @@ -0,0 +1,222 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'multicast_dto.dart'; + +class ProtocolTypeMapper extends EnumMapper { + ProtocolTypeMapper._(); + + static ProtocolTypeMapper? _instance; + static ProtocolTypeMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = ProtocolTypeMapper._()); + } + return _instance!; + } + + static ProtocolType fromValue(dynamic value) { + ensureInitialized(); + return MapperContainer.globals.fromValue(value); + } + + @override + ProtocolType decode(dynamic value) { + switch (value) { + case 'http': + return ProtocolType.http; + case 'https': + return ProtocolType.https; + default: + return ProtocolType.values[1]; + } + } + + @override + dynamic encode(ProtocolType self) { + switch (self) { + case ProtocolType.http: + return 'http'; + case ProtocolType.https: + return 'https'; + } + } +} + +extension ProtocolTypeMapperExtension on ProtocolType { + String toValue() { + ProtocolTypeMapper.ensureInitialized(); + return MapperContainer.globals.toValue(this) as String; + } +} + +class MulticastDtoMapper extends ClassMapperBase { + MulticastDtoMapper._(); + + static MulticastDtoMapper? _instance; + static MulticastDtoMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = MulticastDtoMapper._()); + DeviceTypeMapper.ensureInitialized(); + ProtocolTypeMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'MulticastDto'; + + static String _$alias(MulticastDto v) => v.alias; + static const Field _f$alias = Field('alias', _$alias); + static String? _$version(MulticastDto v) => v.version; + static const Field _f$version = Field('version', _$version); + static String? _$deviceModel(MulticastDto v) => v.deviceModel; + static const Field _f$deviceModel = Field('deviceModel', _$deviceModel); + static DeviceType? _$deviceType(MulticastDto v) => v.deviceType; + static const Field _f$deviceType = Field('deviceType', _$deviceType); + static String _$fingerprint(MulticastDto v) => v.fingerprint; + static const Field _f$fingerprint = Field('fingerprint', _$fingerprint); + static int? _$port(MulticastDto v) => v.port; + static const Field _f$port = Field('port', _$port); + static ProtocolType? _$protocol(MulticastDto v) => v.protocol; + static const Field _f$protocol = Field('protocol', _$protocol); + static bool? _$download(MulticastDto v) => v.download; + static const Field _f$download = Field('download', _$download); + static bool? _$announcement(MulticastDto v) => v.announcement; + static const Field _f$announcement = Field('announcement', _$announcement); + static bool? _$announce(MulticastDto v) => v.announce; + static const Field _f$announce = Field('announce', _$announce); + + @override + final MappableFields fields = const { + #alias: _f$alias, + #version: _f$version, + #deviceModel: _f$deviceModel, + #deviceType: _f$deviceType, + #fingerprint: _f$fingerprint, + #port: _f$port, + #protocol: _f$protocol, + #download: _f$download, + #announcement: _f$announcement, + #announce: _f$announce, + }; + + static MulticastDto _instantiate(DecodingData data) { + return MulticastDto( + alias: data.dec(_f$alias), + version: data.dec(_f$version), + deviceModel: data.dec(_f$deviceModel), + deviceType: data.dec(_f$deviceType), + fingerprint: data.dec(_f$fingerprint), + port: data.dec(_f$port), + protocol: data.dec(_f$protocol), + download: data.dec(_f$download), + announcement: data.dec(_f$announcement), + announce: data.dec(_f$announce)); + } + + @override + final Function instantiate = _instantiate; + + static MulticastDto fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static MulticastDto deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin MulticastDtoMappable { + String serialize() { + return MulticastDtoMapper.ensureInitialized().encodeJson(this as MulticastDto); + } + + Map toJson() { + return MulticastDtoMapper.ensureInitialized().encodeMap(this as MulticastDto); + } + + MulticastDtoCopyWith get copyWith => + _MulticastDtoCopyWithImpl(this as MulticastDto, $identity, $identity); + @override + String toString() { + return MulticastDtoMapper.ensureInitialized().stringifyValue(this as MulticastDto); + } + + @override + bool operator ==(Object other) { + return MulticastDtoMapper.ensureInitialized().equalsValue(this as MulticastDto, other); + } + + @override + int get hashCode { + return MulticastDtoMapper.ensureInitialized().hashValue(this as MulticastDto); + } +} + +extension MulticastDtoValueCopy<$R, $Out> on ObjectCopyWith<$R, MulticastDto, $Out> { + MulticastDtoCopyWith<$R, MulticastDto, $Out> get $asMulticastDto => $base.as((v, t, t2) => _MulticastDtoCopyWithImpl(v, t, t2)); +} + +abstract class MulticastDtoCopyWith<$R, $In extends MulticastDto, $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call( + {String? alias, + String? version, + String? deviceModel, + DeviceType? deviceType, + String? fingerprint, + int? port, + ProtocolType? protocol, + bool? download, + bool? announcement, + bool? announce}); + MulticastDtoCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _MulticastDtoCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, MulticastDto, $Out> implements MulticastDtoCopyWith<$R, MulticastDto, $Out> { + _MulticastDtoCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = MulticastDtoMapper.ensureInitialized(); + @override + $R call( + {String? alias, + Object? version = $none, + Object? deviceModel = $none, + Object? deviceType = $none, + String? fingerprint, + Object? port = $none, + Object? protocol = $none, + Object? download = $none, + Object? announcement = $none, + Object? announce = $none}) => + $apply(FieldCopyWithData({ + if (alias != null) #alias: alias, + if (version != $none) #version: version, + if (deviceModel != $none) #deviceModel: deviceModel, + if (deviceType != $none) #deviceType: deviceType, + if (fingerprint != null) #fingerprint: fingerprint, + if (port != $none) #port: port, + if (protocol != $none) #protocol: protocol, + if (download != $none) #download: download, + if (announcement != $none) #announcement: announcement, + if (announce != $none) #announce: announce + })); + @override + MulticastDto $make(CopyWithData data) => MulticastDto( + alias: data.get(#alias, or: $value.alias), + version: data.get(#version, or: $value.version), + deviceModel: data.get(#deviceModel, or: $value.deviceModel), + deviceType: data.get(#deviceType, or: $value.deviceType), + fingerprint: data.get(#fingerprint, or: $value.fingerprint), + port: data.get(#port, or: $value.port), + protocol: data.get(#protocol, or: $value.protocol), + download: data.get(#download, or: $value.download), + announcement: data.get(#announcement, or: $value.announcement), + announce: data.get(#announce, or: $value.announce)); + + @override + MulticastDtoCopyWith<$R2, MulticastDto, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => _MulticastDtoCopyWithImpl($value, $cast, t); +} diff --git a/common/lib/model/dto/prepare_upload_request_dto.dart b/common/lib/model/dto/prepare_upload_request_dto.dart new file mode 100644 index 0000000..2929a69 --- /dev/null +++ b/common/lib/model/dto/prepare_upload_request_dto.dart @@ -0,0 +1,18 @@ +import 'package:common/model/dto/file_dto.dart'; +import 'package:common/model/dto/info_register_dto.dart'; +import 'package:dart_mappable/dart_mappable.dart'; + +part 'prepare_upload_request_dto.mapper.dart'; + +@MappableClass() +class PrepareUploadRequestDto with PrepareUploadRequestDtoMappable { + final InfoRegisterDto info; + final Map files; + + const PrepareUploadRequestDto({ + required this.info, + required this.files, + }); + + static const fromJson = PrepareUploadRequestDtoMapper.fromJson; +} diff --git a/common/lib/model/dto/prepare_upload_request_dto.mapper.dart b/common/lib/model/dto/prepare_upload_request_dto.mapper.dart new file mode 100644 index 0000000..4a0e2f9 --- /dev/null +++ b/common/lib/model/dto/prepare_upload_request_dto.mapper.dart @@ -0,0 +1,111 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'prepare_upload_request_dto.dart'; + +class PrepareUploadRequestDtoMapper extends ClassMapperBase { + PrepareUploadRequestDtoMapper._(); + + static PrepareUploadRequestDtoMapper? _instance; + static PrepareUploadRequestDtoMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = PrepareUploadRequestDtoMapper._()); + InfoRegisterDtoMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'PrepareUploadRequestDto'; + + static InfoRegisterDto _$info(PrepareUploadRequestDto v) => v.info; + static const Field _f$info = Field('info', _$info); + static Map _$files(PrepareUploadRequestDto v) => v.files; + static const Field> _f$files = Field('files', _$files); + + @override + final MappableFields fields = const { + #info: _f$info, + #files: _f$files, + }; + + static PrepareUploadRequestDto _instantiate(DecodingData data) { + return PrepareUploadRequestDto(info: data.dec(_f$info), files: data.dec(_f$files)); + } + + @override + final Function instantiate = _instantiate; + + static PrepareUploadRequestDto fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static PrepareUploadRequestDto deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin PrepareUploadRequestDtoMappable { + String serialize() { + return PrepareUploadRequestDtoMapper.ensureInitialized().encodeJson(this as PrepareUploadRequestDto); + } + + Map toJson() { + return PrepareUploadRequestDtoMapper.ensureInitialized().encodeMap(this as PrepareUploadRequestDto); + } + + PrepareUploadRequestDtoCopyWith get copyWith => + _PrepareUploadRequestDtoCopyWithImpl(this as PrepareUploadRequestDto, $identity, $identity); + @override + String toString() { + return PrepareUploadRequestDtoMapper.ensureInitialized().stringifyValue(this as PrepareUploadRequestDto); + } + + @override + bool operator ==(Object other) { + return PrepareUploadRequestDtoMapper.ensureInitialized().equalsValue(this as PrepareUploadRequestDto, other); + } + + @override + int get hashCode { + return PrepareUploadRequestDtoMapper.ensureInitialized().hashValue(this as PrepareUploadRequestDto); + } +} + +extension PrepareUploadRequestDtoValueCopy<$R, $Out> on ObjectCopyWith<$R, PrepareUploadRequestDto, $Out> { + PrepareUploadRequestDtoCopyWith<$R, PrepareUploadRequestDto, $Out> get $asPrepareUploadRequestDto => + $base.as((v, t, t2) => _PrepareUploadRequestDtoCopyWithImpl(v, t, t2)); +} + +abstract class PrepareUploadRequestDtoCopyWith<$R, $In extends PrepareUploadRequestDto, $Out> implements ClassCopyWith<$R, $In, $Out> { + InfoRegisterDtoCopyWith<$R, InfoRegisterDto, InfoRegisterDto> get info; + MapCopyWith<$R, String, FileDto, ObjectCopyWith<$R, FileDto, FileDto>> get files; + $R call({InfoRegisterDto? info, Map? files}); + PrepareUploadRequestDtoCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _PrepareUploadRequestDtoCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, PrepareUploadRequestDto, $Out> + implements PrepareUploadRequestDtoCopyWith<$R, PrepareUploadRequestDto, $Out> { + _PrepareUploadRequestDtoCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = PrepareUploadRequestDtoMapper.ensureInitialized(); + @override + InfoRegisterDtoCopyWith<$R, InfoRegisterDto, InfoRegisterDto> get info => $value.info.copyWith.$chain((v) => call(info: v)); + @override + MapCopyWith<$R, String, FileDto, ObjectCopyWith<$R, FileDto, FileDto>> get files => + MapCopyWith($value.files, (v, t) => ObjectCopyWith(v, $identity, t), (v) => call(files: v)); + @override + $R call({InfoRegisterDto? info, Map? files}) => + $apply(FieldCopyWithData({if (info != null) #info: info, if (files != null) #files: files})); + @override + PrepareUploadRequestDto $make(CopyWithData data) => + PrepareUploadRequestDto(info: data.get(#info, or: $value.info), files: data.get(#files, or: $value.files)); + + @override + PrepareUploadRequestDtoCopyWith<$R2, PrepareUploadRequestDto, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _PrepareUploadRequestDtoCopyWithImpl($value, $cast, t); +} diff --git a/common/lib/model/dto/prepare_upload_response_dto.dart b/common/lib/model/dto/prepare_upload_response_dto.dart new file mode 100644 index 0000000..deecb5e --- /dev/null +++ b/common/lib/model/dto/prepare_upload_response_dto.dart @@ -0,0 +1,16 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +part 'prepare_upload_response_dto.mapper.dart'; + +@MappableClass() +class PrepareUploadResponseDto with PrepareUploadResponseDtoMappable { + final String sessionId; + final Map files; + + const PrepareUploadResponseDto({ + required this.sessionId, + required this.files, + }); + + static const fromJson = PrepareUploadResponseDtoMapper.fromJson; +} diff --git a/common/lib/model/dto/prepare_upload_response_dto.mapper.dart b/common/lib/model/dto/prepare_upload_response_dto.mapper.dart new file mode 100644 index 0000000..0f97006 --- /dev/null +++ b/common/lib/model/dto/prepare_upload_response_dto.mapper.dart @@ -0,0 +1,107 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'prepare_upload_response_dto.dart'; + +class PrepareUploadResponseDtoMapper extends ClassMapperBase { + PrepareUploadResponseDtoMapper._(); + + static PrepareUploadResponseDtoMapper? _instance; + static PrepareUploadResponseDtoMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = PrepareUploadResponseDtoMapper._()); + } + return _instance!; + } + + @override + final String id = 'PrepareUploadResponseDto'; + + static String _$sessionId(PrepareUploadResponseDto v) => v.sessionId; + static const Field _f$sessionId = Field('sessionId', _$sessionId); + static Map _$files(PrepareUploadResponseDto v) => v.files; + static const Field> _f$files = Field('files', _$files); + + @override + final MappableFields fields = const { + #sessionId: _f$sessionId, + #files: _f$files, + }; + + static PrepareUploadResponseDto _instantiate(DecodingData data) { + return PrepareUploadResponseDto(sessionId: data.dec(_f$sessionId), files: data.dec(_f$files)); + } + + @override + final Function instantiate = _instantiate; + + static PrepareUploadResponseDto fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static PrepareUploadResponseDto deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin PrepareUploadResponseDtoMappable { + String serialize() { + return PrepareUploadResponseDtoMapper.ensureInitialized().encodeJson(this as PrepareUploadResponseDto); + } + + Map toJson() { + return PrepareUploadResponseDtoMapper.ensureInitialized().encodeMap(this as PrepareUploadResponseDto); + } + + PrepareUploadResponseDtoCopyWith get copyWith => + _PrepareUploadResponseDtoCopyWithImpl(this as PrepareUploadResponseDto, $identity, $identity); + @override + String toString() { + return PrepareUploadResponseDtoMapper.ensureInitialized().stringifyValue(this as PrepareUploadResponseDto); + } + + @override + bool operator ==(Object other) { + return PrepareUploadResponseDtoMapper.ensureInitialized().equalsValue(this as PrepareUploadResponseDto, other); + } + + @override + int get hashCode { + return PrepareUploadResponseDtoMapper.ensureInitialized().hashValue(this as PrepareUploadResponseDto); + } +} + +extension PrepareUploadResponseDtoValueCopy<$R, $Out> on ObjectCopyWith<$R, PrepareUploadResponseDto, $Out> { + PrepareUploadResponseDtoCopyWith<$R, PrepareUploadResponseDto, $Out> get $asPrepareUploadResponseDto => + $base.as((v, t, t2) => _PrepareUploadResponseDtoCopyWithImpl(v, t, t2)); +} + +abstract class PrepareUploadResponseDtoCopyWith<$R, $In extends PrepareUploadResponseDto, $Out> implements ClassCopyWith<$R, $In, $Out> { + MapCopyWith<$R, String, String, ObjectCopyWith<$R, String, String>> get files; + $R call({String? sessionId, Map? files}); + PrepareUploadResponseDtoCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _PrepareUploadResponseDtoCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, PrepareUploadResponseDto, $Out> + implements PrepareUploadResponseDtoCopyWith<$R, PrepareUploadResponseDto, $Out> { + _PrepareUploadResponseDtoCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = PrepareUploadResponseDtoMapper.ensureInitialized(); + @override + MapCopyWith<$R, String, String, ObjectCopyWith<$R, String, String>> get files => + MapCopyWith($value.files, (v, t) => ObjectCopyWith(v, $identity, t), (v) => call(files: v)); + @override + $R call({String? sessionId, Map? files}) => + $apply(FieldCopyWithData({if (sessionId != null) #sessionId: sessionId, if (files != null) #files: files})); + @override + PrepareUploadResponseDto $make(CopyWithData data) => + PrepareUploadResponseDto(sessionId: data.get(#sessionId, or: $value.sessionId), files: data.get(#files, or: $value.files)); + + @override + PrepareUploadResponseDtoCopyWith<$R2, PrepareUploadResponseDto, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _PrepareUploadResponseDtoCopyWithImpl($value, $cast, t); +} diff --git a/common/lib/model/dto/receive_request_response_dto.dart b/common/lib/model/dto/receive_request_response_dto.dart new file mode 100644 index 0000000..550a239 --- /dev/null +++ b/common/lib/model/dto/receive_request_response_dto.dart @@ -0,0 +1,18 @@ +import 'package:common/model/dto/file_dto.dart'; +import 'package:common/model/dto/info_dto.dart'; +import 'package:dart_mappable/dart_mappable.dart'; + +part 'receive_request_response_dto.mapper.dart'; + +@MappableClass() +class ReceiveRequestResponseDto with ReceiveRequestResponseDtoMappable { + final InfoDto info; + final String sessionId; + final Map files; + + const ReceiveRequestResponseDto({ + required this.info, + required this.sessionId, + required this.files, + }); +} diff --git a/common/lib/model/dto/receive_request_response_dto.mapper.dart b/common/lib/model/dto/receive_request_response_dto.mapper.dart new file mode 100644 index 0000000..f95ee33 --- /dev/null +++ b/common/lib/model/dto/receive_request_response_dto.mapper.dart @@ -0,0 +1,114 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'receive_request_response_dto.dart'; + +class ReceiveRequestResponseDtoMapper extends ClassMapperBase { + ReceiveRequestResponseDtoMapper._(); + + static ReceiveRequestResponseDtoMapper? _instance; + static ReceiveRequestResponseDtoMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = ReceiveRequestResponseDtoMapper._()); + InfoDtoMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'ReceiveRequestResponseDto'; + + static InfoDto _$info(ReceiveRequestResponseDto v) => v.info; + static const Field _f$info = Field('info', _$info); + static String _$sessionId(ReceiveRequestResponseDto v) => v.sessionId; + static const Field _f$sessionId = Field('sessionId', _$sessionId); + static Map _$files(ReceiveRequestResponseDto v) => v.files; + static const Field> _f$files = Field('files', _$files); + + @override + final MappableFields fields = const { + #info: _f$info, + #sessionId: _f$sessionId, + #files: _f$files, + }; + + static ReceiveRequestResponseDto _instantiate(DecodingData data) { + return ReceiveRequestResponseDto(info: data.dec(_f$info), sessionId: data.dec(_f$sessionId), files: data.dec(_f$files)); + } + + @override + final Function instantiate = _instantiate; + + static ReceiveRequestResponseDto fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static ReceiveRequestResponseDto deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin ReceiveRequestResponseDtoMappable { + String serialize() { + return ReceiveRequestResponseDtoMapper.ensureInitialized().encodeJson(this as ReceiveRequestResponseDto); + } + + Map toJson() { + return ReceiveRequestResponseDtoMapper.ensureInitialized().encodeMap(this as ReceiveRequestResponseDto); + } + + ReceiveRequestResponseDtoCopyWith get copyWith => + _ReceiveRequestResponseDtoCopyWithImpl(this as ReceiveRequestResponseDto, $identity, $identity); + @override + String toString() { + return ReceiveRequestResponseDtoMapper.ensureInitialized().stringifyValue(this as ReceiveRequestResponseDto); + } + + @override + bool operator ==(Object other) { + return ReceiveRequestResponseDtoMapper.ensureInitialized().equalsValue(this as ReceiveRequestResponseDto, other); + } + + @override + int get hashCode { + return ReceiveRequestResponseDtoMapper.ensureInitialized().hashValue(this as ReceiveRequestResponseDto); + } +} + +extension ReceiveRequestResponseDtoValueCopy<$R, $Out> on ObjectCopyWith<$R, ReceiveRequestResponseDto, $Out> { + ReceiveRequestResponseDtoCopyWith<$R, ReceiveRequestResponseDto, $Out> get $asReceiveRequestResponseDto => + $base.as((v, t, t2) => _ReceiveRequestResponseDtoCopyWithImpl(v, t, t2)); +} + +abstract class ReceiveRequestResponseDtoCopyWith<$R, $In extends ReceiveRequestResponseDto, $Out> implements ClassCopyWith<$R, $In, $Out> { + InfoDtoCopyWith<$R, InfoDto, InfoDto> get info; + MapCopyWith<$R, String, FileDto, ObjectCopyWith<$R, FileDto, FileDto>> get files; + $R call({InfoDto? info, String? sessionId, Map? files}); + ReceiveRequestResponseDtoCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _ReceiveRequestResponseDtoCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, ReceiveRequestResponseDto, $Out> + implements ReceiveRequestResponseDtoCopyWith<$R, ReceiveRequestResponseDto, $Out> { + _ReceiveRequestResponseDtoCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = ReceiveRequestResponseDtoMapper.ensureInitialized(); + @override + InfoDtoCopyWith<$R, InfoDto, InfoDto> get info => $value.info.copyWith.$chain((v) => call(info: v)); + @override + MapCopyWith<$R, String, FileDto, ObjectCopyWith<$R, FileDto, FileDto>> get files => + MapCopyWith($value.files, (v, t) => ObjectCopyWith(v, $identity, t), (v) => call(files: v)); + @override + $R call({InfoDto? info, String? sessionId, Map? files}) => + $apply(FieldCopyWithData({if (info != null) #info: info, if (sessionId != null) #sessionId: sessionId, if (files != null) #files: files})); + @override + ReceiveRequestResponseDto $make(CopyWithData data) => ReceiveRequestResponseDto( + info: data.get(#info, or: $value.info), sessionId: data.get(#sessionId, or: $value.sessionId), files: data.get(#files, or: $value.files)); + + @override + ReceiveRequestResponseDtoCopyWith<$R2, ReceiveRequestResponseDto, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _ReceiveRequestResponseDtoCopyWithImpl($value, $cast, t); +} diff --git a/common/lib/model/dto/register_dto.dart b/common/lib/model/dto/register_dto.dart new file mode 100644 index 0000000..93ef680 --- /dev/null +++ b/common/lib/model/dto/register_dto.dart @@ -0,0 +1,49 @@ +import 'package:common/constants.dart'; +import 'package:common/model/device.dart'; +import 'package:common/model/dto/multicast_dto.dart'; +import 'package:dart_mappable/dart_mappable.dart'; + +part 'register_dto.mapper.dart'; + +@MappableClass() +class RegisterDto with RegisterDtoMappable { + final String alias; + final String? version; // v2, format: major.minor + final String? deviceModel; + final DeviceType? deviceType; + final String fingerprint; + final int? port; // v2 + final ProtocolType? protocol; // v2 + final bool? download; // v2 + + const RegisterDto({ + required this.alias, + required this.version, + required this.deviceModel, + required this.deviceType, + required this.fingerprint, + required this.port, + required this.protocol, + required this.download, + }); + + static const fromJson = RegisterDtoMapper.fromJson; +} + +extension RegisterDtoExt on RegisterDto { + Device toDevice(String ip, int ownPort, bool ownHttps, DiscoveryMethod method) { + return Device( + signalingId: null, + ip: ip, + version: version ?? fallbackProtocolVersion, + port: port ?? ownPort, + https: protocol != null ? protocol == ProtocolType.https : ownHttps, + fingerprint: fingerprint, + alias: alias, + deviceModel: deviceModel, + deviceType: deviceType ?? DeviceType.desktop, + download: download ?? false, + discoveryMethods: {method}, + ); + } +} diff --git a/common/lib/model/dto/register_dto.mapper.dart b/common/lib/model/dto/register_dto.mapper.dart new file mode 100644 index 0000000..51561a2 --- /dev/null +++ b/common/lib/model/dto/register_dto.mapper.dart @@ -0,0 +1,159 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'register_dto.dart'; + +class RegisterDtoMapper extends ClassMapperBase { + RegisterDtoMapper._(); + + static RegisterDtoMapper? _instance; + static RegisterDtoMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = RegisterDtoMapper._()); + DeviceTypeMapper.ensureInitialized(); + ProtocolTypeMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'RegisterDto'; + + static String _$alias(RegisterDto v) => v.alias; + static const Field _f$alias = Field('alias', _$alias); + static String? _$version(RegisterDto v) => v.version; + static const Field _f$version = Field('version', _$version); + static String? _$deviceModel(RegisterDto v) => v.deviceModel; + static const Field _f$deviceModel = Field('deviceModel', _$deviceModel); + static DeviceType? _$deviceType(RegisterDto v) => v.deviceType; + static const Field _f$deviceType = Field('deviceType', _$deviceType); + static String _$fingerprint(RegisterDto v) => v.fingerprint; + static const Field _f$fingerprint = Field('fingerprint', _$fingerprint); + static int? _$port(RegisterDto v) => v.port; + static const Field _f$port = Field('port', _$port); + static ProtocolType? _$protocol(RegisterDto v) => v.protocol; + static const Field _f$protocol = Field('protocol', _$protocol); + static bool? _$download(RegisterDto v) => v.download; + static const Field _f$download = Field('download', _$download); + + @override + final MappableFields fields = const { + #alias: _f$alias, + #version: _f$version, + #deviceModel: _f$deviceModel, + #deviceType: _f$deviceType, + #fingerprint: _f$fingerprint, + #port: _f$port, + #protocol: _f$protocol, + #download: _f$download, + }; + + static RegisterDto _instantiate(DecodingData data) { + return RegisterDto( + alias: data.dec(_f$alias), + version: data.dec(_f$version), + deviceModel: data.dec(_f$deviceModel), + deviceType: data.dec(_f$deviceType), + fingerprint: data.dec(_f$fingerprint), + port: data.dec(_f$port), + protocol: data.dec(_f$protocol), + download: data.dec(_f$download)); + } + + @override + final Function instantiate = _instantiate; + + static RegisterDto fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static RegisterDto deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin RegisterDtoMappable { + String serialize() { + return RegisterDtoMapper.ensureInitialized().encodeJson(this as RegisterDto); + } + + Map toJson() { + return RegisterDtoMapper.ensureInitialized().encodeMap(this as RegisterDto); + } + + RegisterDtoCopyWith get copyWith => _RegisterDtoCopyWithImpl(this as RegisterDto, $identity, $identity); + @override + String toString() { + return RegisterDtoMapper.ensureInitialized().stringifyValue(this as RegisterDto); + } + + @override + bool operator ==(Object other) { + return RegisterDtoMapper.ensureInitialized().equalsValue(this as RegisterDto, other); + } + + @override + int get hashCode { + return RegisterDtoMapper.ensureInitialized().hashValue(this as RegisterDto); + } +} + +extension RegisterDtoValueCopy<$R, $Out> on ObjectCopyWith<$R, RegisterDto, $Out> { + RegisterDtoCopyWith<$R, RegisterDto, $Out> get $asRegisterDto => $base.as((v, t, t2) => _RegisterDtoCopyWithImpl(v, t, t2)); +} + +abstract class RegisterDtoCopyWith<$R, $In extends RegisterDto, $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call( + {String? alias, + String? version, + String? deviceModel, + DeviceType? deviceType, + String? fingerprint, + int? port, + ProtocolType? protocol, + bool? download}); + RegisterDtoCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _RegisterDtoCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, RegisterDto, $Out> implements RegisterDtoCopyWith<$R, RegisterDto, $Out> { + _RegisterDtoCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = RegisterDtoMapper.ensureInitialized(); + @override + $R call( + {String? alias, + Object? version = $none, + Object? deviceModel = $none, + Object? deviceType = $none, + String? fingerprint, + Object? port = $none, + Object? protocol = $none, + Object? download = $none}) => + $apply(FieldCopyWithData({ + if (alias != null) #alias: alias, + if (version != $none) #version: version, + if (deviceModel != $none) #deviceModel: deviceModel, + if (deviceType != $none) #deviceType: deviceType, + if (fingerprint != null) #fingerprint: fingerprint, + if (port != $none) #port: port, + if (protocol != $none) #protocol: protocol, + if (download != $none) #download: download + })); + @override + RegisterDto $make(CopyWithData data) => RegisterDto( + alias: data.get(#alias, or: $value.alias), + version: data.get(#version, or: $value.version), + deviceModel: data.get(#deviceModel, or: $value.deviceModel), + deviceType: data.get(#deviceType, or: $value.deviceType), + fingerprint: data.get(#fingerprint, or: $value.fingerprint), + port: data.get(#port, or: $value.port), + protocol: data.get(#protocol, or: $value.protocol), + download: data.get(#download, or: $value.download)); + + @override + RegisterDtoCopyWith<$R2, RegisterDto, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => _RegisterDtoCopyWithImpl($value, $cast, t); +} diff --git a/common/lib/model/file_status.dart b/common/lib/model/file_status.dart new file mode 100644 index 0000000..8f33a41 --- /dev/null +++ b/common/lib/model/file_status.dart @@ -0,0 +1,14 @@ +/// Status of one single file during file transfer. +/// Both receiver and sender should share the same information. +enum FileStatus { + queue, + skipped, + sending, + failed, + finished, +} + +extension FileStatusIterable on Iterable { + bool get isFinishedOrError => every((status) => const {FileStatus.skipped, FileStatus.failed, FileStatus.finished}.contains(status)); + bool get isFinishedOrSkipped => every((status) => const {FileStatus.skipped, FileStatus.finished}.contains(status)); +} diff --git a/common/lib/model/file_type.dart b/common/lib/model/file_type.dart new file mode 100644 index 0000000..6e5675d --- /dev/null +++ b/common/lib/model/file_type.dart @@ -0,0 +1,15 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +part 'file_type.mapper.dart'; + +/// Categorization of one file. +/// We use this information for a better UX. +@MappableEnum(defaultValue: FileType.other) +enum FileType { + image, + video, + pdf, + text, + apk, + other, +} diff --git a/common/lib/model/file_type.mapper.dart b/common/lib/model/file_type.mapper.dart new file mode 100644 index 0000000..489f714 --- /dev/null +++ b/common/lib/model/file_type.mapper.dart @@ -0,0 +1,69 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'file_type.dart'; + +class FileTypeMapper extends EnumMapper { + FileTypeMapper._(); + + static FileTypeMapper? _instance; + static FileTypeMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = FileTypeMapper._()); + } + return _instance!; + } + + static FileType fromValue(dynamic value) { + ensureInitialized(); + return MapperContainer.globals.fromValue(value); + } + + @override + FileType decode(dynamic value) { + switch (value) { + case 'image': + return FileType.image; + case 'video': + return FileType.video; + case 'pdf': + return FileType.pdf; + case 'text': + return FileType.text; + case 'apk': + return FileType.apk; + case 'other': + return FileType.other; + default: + return FileType.values[5]; + } + } + + @override + dynamic encode(FileType self) { + switch (self) { + case FileType.image: + return 'image'; + case FileType.video: + return 'video'; + case FileType.pdf: + return 'pdf'; + case FileType.text: + return 'text'; + case FileType.apk: + return 'apk'; + case FileType.other: + return 'other'; + } + } +} + +extension FileTypeMapperExtension on FileType { + String toValue() { + FileTypeMapper.ensureInitialized(); + return MapperContainer.globals.toValue(this) as String; + } +} diff --git a/common/lib/model/session_status.dart b/common/lib/model/session_status.dart new file mode 100644 index 0000000..c15006d --- /dev/null +++ b/common/lib/model/session_status.dart @@ -0,0 +1,13 @@ +/// Status of one file transfer. +/// Both receiver and sender should share the same information. +enum SessionStatus { + waiting, // wait for receiver response (wait for decline / accept) + recipientBusy, // recipient is busy with another request (end of session) + declined, // receiver declined the request (end of session) + tooManyAttempts, // receiver declined the request (end of session) + sending, // files are being sent + finished, // all files sent (end of session) + finishedWithErrors, // finished but some files could not be sent (end of session) + canceledBySender, // cancellation by sender (end of session) + canceledByReceiver, // cancellation by receiver (end of session) +} diff --git a/common/lib/model/stored_security_context.dart b/common/lib/model/stored_security_context.dart new file mode 100644 index 0000000..cfdebd0 --- /dev/null +++ b/common/lib/model/stored_security_context.dart @@ -0,0 +1,25 @@ +import 'package:dart_mappable/dart_mappable.dart'; + +part 'stored_security_context.mapper.dart'; + +@MappableClass() +class StoredSecurityContext with StoredSecurityContextMappable { + final String privateKey; + final String publicKey; + final String certificate; + final String certificateHash; + + const StoredSecurityContext({ + required this.privateKey, + required this.publicKey, + required this.certificate, + required this.certificateHash, + }); + + static const fromJson = StoredSecurityContextMapper.fromJson; + + @override + String toString() { + return 'StoredSecurityContext(, , , )'; + } +} diff --git a/common/lib/model/stored_security_context.mapper.dart b/common/lib/model/stored_security_context.mapper.dart new file mode 100644 index 0000000..c96ade3 --- /dev/null +++ b/common/lib/model/stored_security_context.mapper.dart @@ -0,0 +1,120 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'stored_security_context.dart'; + +class StoredSecurityContextMapper extends ClassMapperBase { + StoredSecurityContextMapper._(); + + static StoredSecurityContextMapper? _instance; + static StoredSecurityContextMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = StoredSecurityContextMapper._()); + } + return _instance!; + } + + @override + final String id = 'StoredSecurityContext'; + + static String _$privateKey(StoredSecurityContext v) => v.privateKey; + static const Field _f$privateKey = Field('privateKey', _$privateKey); + static String _$publicKey(StoredSecurityContext v) => v.publicKey; + static const Field _f$publicKey = Field('publicKey', _$publicKey); + static String _$certificate(StoredSecurityContext v) => v.certificate; + static const Field _f$certificate = Field('certificate', _$certificate); + static String _$certificateHash(StoredSecurityContext v) => v.certificateHash; + static const Field _f$certificateHash = Field('certificateHash', _$certificateHash); + + @override + final MappableFields fields = const { + #privateKey: _f$privateKey, + #publicKey: _f$publicKey, + #certificate: _f$certificate, + #certificateHash: _f$certificateHash, + }; + + static StoredSecurityContext _instantiate(DecodingData data) { + return StoredSecurityContext( + privateKey: data.dec(_f$privateKey), + publicKey: data.dec(_f$publicKey), + certificate: data.dec(_f$certificate), + certificateHash: data.dec(_f$certificateHash)); + } + + @override + final Function instantiate = _instantiate; + + static StoredSecurityContext fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static StoredSecurityContext deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin StoredSecurityContextMappable { + String serialize() { + return StoredSecurityContextMapper.ensureInitialized().encodeJson(this as StoredSecurityContext); + } + + Map toJson() { + return StoredSecurityContextMapper.ensureInitialized().encodeMap(this as StoredSecurityContext); + } + + StoredSecurityContextCopyWith get copyWith => + _StoredSecurityContextCopyWithImpl(this as StoredSecurityContext, $identity, $identity); + @override + String toString() { + return StoredSecurityContextMapper.ensureInitialized().stringifyValue(this as StoredSecurityContext); + } + + @override + bool operator ==(Object other) { + return StoredSecurityContextMapper.ensureInitialized().equalsValue(this as StoredSecurityContext, other); + } + + @override + int get hashCode { + return StoredSecurityContextMapper.ensureInitialized().hashValue(this as StoredSecurityContext); + } +} + +extension StoredSecurityContextValueCopy<$R, $Out> on ObjectCopyWith<$R, StoredSecurityContext, $Out> { + StoredSecurityContextCopyWith<$R, StoredSecurityContext, $Out> get $asStoredSecurityContext => + $base.as((v, t, t2) => _StoredSecurityContextCopyWithImpl(v, t, t2)); +} + +abstract class StoredSecurityContextCopyWith<$R, $In extends StoredSecurityContext, $Out> implements ClassCopyWith<$R, $In, $Out> { + $R call({String? privateKey, String? publicKey, String? certificate, String? certificateHash}); + StoredSecurityContextCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _StoredSecurityContextCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, StoredSecurityContext, $Out> + implements StoredSecurityContextCopyWith<$R, StoredSecurityContext, $Out> { + _StoredSecurityContextCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = StoredSecurityContextMapper.ensureInitialized(); + @override + $R call({String? privateKey, String? publicKey, String? certificate, String? certificateHash}) => $apply(FieldCopyWithData({ + if (privateKey != null) #privateKey: privateKey, + if (publicKey != null) #publicKey: publicKey, + if (certificate != null) #certificate: certificate, + if (certificateHash != null) #certificateHash: certificateHash + })); + @override + StoredSecurityContext $make(CopyWithData data) => StoredSecurityContext( + privateKey: data.get(#privateKey, or: $value.privateKey), + publicKey: data.get(#publicKey, or: $value.publicKey), + certificate: data.get(#certificate, or: $value.certificate), + certificateHash: data.get(#certificateHash, or: $value.certificateHash)); + + @override + StoredSecurityContextCopyWith<$R2, StoredSecurityContext, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _StoredSecurityContextCopyWithImpl($value, $cast, t); +} diff --git a/common/lib/src/isolate/child/http_provider.dart b/common/lib/src/isolate/child/http_provider.dart new file mode 100644 index 0000000..26b41b9 --- /dev/null +++ b/common/lib/src/isolate/child/http_provider.dart @@ -0,0 +1,56 @@ +import 'package:common/src/isolate/child/sync_provider.dart'; +import 'package:refena/refena.dart'; + +/// An abstraction to provide a custom http client. +abstract class CustomHttpClient { + Future get({ + required String uri, + required Map query, + }); + + Future post({ + required String uri, + Map query = const {}, + required Map json, + }); + + Future postStream({ + required String uri, + required Map query, + required Map headers, + required Stream> stream, + required void Function(double) onSendProgress, + required CustomCancelToken cancelToken, + }); +} + +class CustomCancelToken { + void Function()? _cancel; + + void cancel() { + _cancel?.call(); + } + + void setCancel(void Function() cancel) { + _cancel = cancel; + } +} + +class HttpClientCollection { + final CustomHttpClient discovery; + final CustomHttpClient longLiving; + + HttpClientCollection({ + required this.discovery, + required this.longLiving, + }); +} + +final httpProvider = ViewProvider((ref) { + final (clientFactory, securityContext, discoveryTimeout) = + ref.watch(syncProvider.select((state) => (state.httpClientFactory, state.securityContext, state.discoveryTimeout))); + return HttpClientCollection( + discovery: clientFactory(Duration(milliseconds: discoveryTimeout), securityContext), + longLiving: clientFactory(const Duration(days: 30), securityContext), + ); +}); diff --git a/common/lib/src/isolate/child/http_scan_discovery_isolate.dart b/common/lib/src/isolate/child/http_scan_discovery_isolate.dart new file mode 100644 index 0000000..e66ab61 --- /dev/null +++ b/common/lib/src/isolate/child/http_scan_discovery_isolate.dart @@ -0,0 +1,67 @@ +import 'package:common/model/device.dart'; +import 'package:common/src/isolate/child/main.dart'; +import 'package:common/src/isolate/dto/isolate_task.dart'; +import 'package:common/src/isolate/dto/isolate_task_result.dart'; +import 'package:common/src/isolate/dto/send_to_isolate_data.dart'; +import 'package:common/src/task/discovery/http_scan_discovery.dart'; +import 'package:meta/meta.dart'; + +sealed class HttpScanTask {} + +class HttpInterfaceScanTask implements HttpScanTask { + final String networkInterface; + final int port; + final bool https; + + HttpInterfaceScanTask({ + required this.networkInterface, + required this.port, + required this.https, + }); +} + +class HttpFavoriteScanTask implements HttpScanTask { + final List<(String, int)> favorites; + final bool https; + + HttpFavoriteScanTask({ + required this.favorites, + required this.https, + }); +} + +@internal +Future setupHttpScanDiscoveryIsolate( + Stream>> receiveFromMain, + void Function(IsolateTaskStreamResult) sendToMain, + InitialData initialData, +) async { + await setupChildIsolateHelper( + debugLabel: 'HttpScanDiscoveryIsolate', + receiveFromMain: receiveFromMain, + sendToMain: sendToMain, + initialData: initialData, + handler: (ref, task) async { + final stream = switch (task.data) { + HttpInterfaceScanTask data => ref.read(httpScanDiscoveryProvider).getStream( + networkInterface: data.networkInterface, + port: data.port, + https: data.https, + ), + HttpFavoriteScanTask data => ref.read(httpScanDiscoveryProvider).getFavoriteStream( + devices: data.favorites, + https: data.https, + ), + }; + await for (final device in stream) { + sendToMain(IsolateTaskStreamResult.event( + id: task.id, + data: device, + )); + } + sendToMain(IsolateTaskStreamResult.done( + id: task.id, + )); + }, + ); +} diff --git a/common/lib/src/isolate/child/main.dart b/common/lib/src/isolate/child/main.dart new file mode 100644 index 0000000..154e23f --- /dev/null +++ b/common/lib/src/isolate/child/main.dart @@ -0,0 +1,80 @@ +import 'dart:async'; + +import 'package:common/src/isolate/child/sync_provider.dart'; +import 'package:common/src/isolate/dto/send_to_isolate_data.dart'; +import 'package:common/util/logger.dart'; +import 'package:logging/logging.dart'; +import 'package:meta/meta.dart'; +import 'package:refena/refena.dart'; + +final _logger = Logger('ChildIsolateMain'); + +/// The container for the child isolate. +final _isolateContainer = RefenaContainer(); + +class InitialData { + final SyncState syncState; + final Level logLevel; + + InitialData({ + required this.syncState, + required this.logLevel, + }); +} + +/// A helper to setup the child isolate, +/// constructing an endless running task that listens to [receiveFromMain] +/// and calls [handler] for each message (usually calling [sendToMain] in the [handler]). +/// +/// The provided [Ref]s in the [handler] and [init] functions are instance of the child isolate [RefenaContainer], +/// therefore, they can be safely used to call providers in the task directory. +/// +/// An optional [init] function can be provided to run before the endless loop. +@internal +Future setupChildIsolateHelper({ + required String debugLabel, + required Stream> receiveFromMain, + required void Function(R) sendToMain, + required InitialData initialData, + Future Function(Ref ref)? init, + required Future Function(Ref ref, S data) handler, +}) async { + initLogger(initialData.logLevel); + + _isolateContainer.set( + syncProvider.overrideWithNotifier( + (ref) => SyncService( + initial: initialData.syncState, + ), + ), + ); + + await initialData.syncState.init(); + + if (init != null) { + await init(_isolateContainer); + } + + _logger.info('Child isolate is ready: $debugLabel (logLevel: ${initialData.logLevel})'); + + await for (final message in receiveFromMain) { + _handleMessage(debugLabel, message, handler); + } +} + +// separate function to avoid blocking the for loop +void _handleMessage(String debugLabel, SendToIsolateData message, Future Function(Ref ref, S data) handler) async { + final syncState = message.syncState; + if (syncState != null) { + _isolateContainer.redux(syncProvider).dispatch(UpdateSyncStateAction(syncState)); + } + + final data = message.data; + if (data != null) { + try { + await handler(_isolateContainer, data); + } catch (e, st) { + _logger.severe('Error in $debugLabel: $e', e, st); + } + } +} diff --git a/common/lib/src/isolate/child/multicast_discovery_isolate.dart b/common/lib/src/isolate/child/multicast_discovery_isolate.dart new file mode 100644 index 0000000..a3b389c --- /dev/null +++ b/common/lib/src/isolate/child/multicast_discovery_isolate.dart @@ -0,0 +1,55 @@ +import 'package:common/model/device.dart'; +import 'package:common/src/isolate/child/main.dart'; +import 'package:common/src/isolate/dto/send_to_isolate_data.dart'; +import 'package:common/src/task/discovery/multicast_discovery.dart'; +import 'package:meta/meta.dart'; + +sealed class MulticastTask {} + +/// Sends an announcement to all devices to all network interfaces. +/// They will respond with their device information. +/// +/// This is not wrapped in an [IsolateTask] because +/// - (1) it is not important if the device was found by this specific announcement or another one +/// - (2) it is not 100% accurate to know if a device was found by this announcement or another one +class MulticastAnnouncementTask implements MulticastTask { + static const instance = MulticastAnnouncementTask._(); + + const MulticastAnnouncementTask._(); +} + +/// Restarts the listener. +class MulticastRestartListenerTask implements MulticastTask { + static const instance = MulticastRestartListenerTask._(); + + const MulticastRestartListenerTask._(); +} + +@internal +Future setupMulticastDiscoveryIsolate( + Stream> receiveFromMain, + void Function(Device) sendToMain, + InitialData initialData, +) async { + await setupChildIsolateHelper( + debugLabel: 'MulticastDiscoveryIsolate', + receiveFromMain: receiveFromMain, + sendToMain: sendToMain, + initialData: initialData, + init: (ref) async { + ref.read(multicastDiscoveryProvider).startListener().listen((event) { + sendToMain(event); + }); + }, + handler: (ref, task) async { + switch (task) { + case MulticastAnnouncementTask(): + await ref.read(multicastDiscoveryProvider).sendAnnouncement(); + break; + case MulticastRestartListenerTask(): + ref.read(multicastDiscoveryProvider).restartListener(); + break; + } + }, + ); +} diff --git a/common/lib/src/isolate/child/sync_provider.dart b/common/lib/src/isolate/child/sync_provider.dart new file mode 100644 index 0000000..def2b7d --- /dev/null +++ b/common/lib/src/isolate/child/sync_provider.dart @@ -0,0 +1,79 @@ +import 'package:common/model/device_info_result.dart'; +import 'package:common/model/dto/multicast_dto.dart'; +import 'package:common/model/stored_security_context.dart'; +import 'package:common/src/isolate/child/http_provider.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:meta/meta.dart'; +import 'package:refena/refena.dart'; + +part 'sync_provider.mapper.dart'; + +/// Represents the state that is synchronized from the main isolate to the child isolate. +/// In other words, the main isolate sends this state to the child isolate. +@MappableClass() +class SyncState with SyncStateMappable { + final Future Function() init; + final Object rootIsolateToken; + final CustomHttpClient Function(Duration timeout, StoredSecurityContext) httpClientFactory; + final StoredSecurityContext securityContext; + final DeviceInfoResult deviceInfo; + final String alias; + final int port; + final List? networkWhitelist; + final List? networkBlacklist; + final ProtocolType protocol; + final String multicastGroup; + final int discoveryTimeout; + + final bool serverRunning; + final bool download; + + SyncState({ + required this.init, + required this.rootIsolateToken, + required this.httpClientFactory, + required this.securityContext, + required this.deviceInfo, + required this.alias, + required this.port, + required this.networkWhitelist, + required this.networkBlacklist, + required this.protocol, + required this.multicastGroup, + required this.discoveryTimeout, + required this.serverRunning, + required this.download, + }); + + @override + String toString() { + return 'SyncState(securityContext: , deviceInfo: $deviceInfo, alias: $alias, port: $port, networkWhitelist: $networkWhitelist, networkBlacklist: $networkBlacklist, protocol: $protocol, multicastGroup: $multicastGroup, discoveryTimeout: $discoveryTimeout, serverRunning: $serverRunning, download: $download)'; + } +} + +@internal +final syncProvider = ReduxProvider((ref) { + throw 'Not initialized'; +}); + +class SyncService extends ReduxNotifier { + final SyncState initial; + + SyncService({ + required this.initial, + }); + + @override + SyncState init() => initial; +} + +class UpdateSyncStateAction extends ReduxAction { + final SyncState newState; + + UpdateSyncStateAction(this.newState); + + @override + SyncState reduce() { + return newState; + } +} diff --git a/common/lib/src/isolate/child/sync_provider.mapper.dart b/common/lib/src/isolate/child/sync_provider.mapper.dart new file mode 100644 index 0000000..719d9ab --- /dev/null +++ b/common/lib/src/isolate/child/sync_provider.mapper.dart @@ -0,0 +1,223 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'sync_provider.dart'; + +class SyncStateMapper extends ClassMapperBase { + SyncStateMapper._(); + + static SyncStateMapper? _instance; + static SyncStateMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = SyncStateMapper._()); + StoredSecurityContextMapper.ensureInitialized(); + ProtocolTypeMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'SyncState'; + + static Function _$init(SyncState v) => (v as dynamic).init as Function; + static dynamic _arg$init(f) => f Function()>(); + static const Field _f$init = Field('init', _$init, arg: _arg$init); + static Object _$rootIsolateToken(SyncState v) => v.rootIsolateToken; + static const Field _f$rootIsolateToken = Field('rootIsolateToken', _$rootIsolateToken); + static Function _$httpClientFactory(SyncState v) => (v as dynamic).httpClientFactory as Function; + static dynamic _arg$httpClientFactory(f) => f(); + static const Field _f$httpClientFactory = Field('httpClientFactory', _$httpClientFactory, arg: _arg$httpClientFactory); + static StoredSecurityContext _$securityContext(SyncState v) => v.securityContext; + static const Field _f$securityContext = Field('securityContext', _$securityContext); + static DeviceInfoResult _$deviceInfo(SyncState v) => v.deviceInfo; + static const Field _f$deviceInfo = Field('deviceInfo', _$deviceInfo); + static String _$alias(SyncState v) => v.alias; + static const Field _f$alias = Field('alias', _$alias); + static int _$port(SyncState v) => v.port; + static const Field _f$port = Field('port', _$port); + static List? _$networkWhitelist(SyncState v) => v.networkWhitelist; + static const Field> _f$networkWhitelist = Field('networkWhitelist', _$networkWhitelist); + static List? _$networkBlacklist(SyncState v) => v.networkBlacklist; + static const Field> _f$networkBlacklist = Field('networkBlacklist', _$networkBlacklist); + static ProtocolType _$protocol(SyncState v) => v.protocol; + static const Field _f$protocol = Field('protocol', _$protocol); + static String _$multicastGroup(SyncState v) => v.multicastGroup; + static const Field _f$multicastGroup = Field('multicastGroup', _$multicastGroup); + static int _$discoveryTimeout(SyncState v) => v.discoveryTimeout; + static const Field _f$discoveryTimeout = Field('discoveryTimeout', _$discoveryTimeout); + static bool _$serverRunning(SyncState v) => v.serverRunning; + static const Field _f$serverRunning = Field('serverRunning', _$serverRunning); + static bool _$download(SyncState v) => v.download; + static const Field _f$download = Field('download', _$download); + + @override + final MappableFields fields = const { + #init: _f$init, + #rootIsolateToken: _f$rootIsolateToken, + #httpClientFactory: _f$httpClientFactory, + #securityContext: _f$securityContext, + #deviceInfo: _f$deviceInfo, + #alias: _f$alias, + #port: _f$port, + #networkWhitelist: _f$networkWhitelist, + #networkBlacklist: _f$networkBlacklist, + #protocol: _f$protocol, + #multicastGroup: _f$multicastGroup, + #discoveryTimeout: _f$discoveryTimeout, + #serverRunning: _f$serverRunning, + #download: _f$download, + }; + + static SyncState _instantiate(DecodingData data) { + return SyncState( + init: data.dec(_f$init), + rootIsolateToken: data.dec(_f$rootIsolateToken), + httpClientFactory: data.dec(_f$httpClientFactory), + securityContext: data.dec(_f$securityContext), + deviceInfo: data.dec(_f$deviceInfo), + alias: data.dec(_f$alias), + port: data.dec(_f$port), + networkWhitelist: data.dec(_f$networkWhitelist), + networkBlacklist: data.dec(_f$networkBlacklist), + protocol: data.dec(_f$protocol), + multicastGroup: data.dec(_f$multicastGroup), + discoveryTimeout: data.dec(_f$discoveryTimeout), + serverRunning: data.dec(_f$serverRunning), + download: data.dec(_f$download)); + } + + @override + final Function instantiate = _instantiate; + + static SyncState fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static SyncState deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin SyncStateMappable { + String serialize() { + return SyncStateMapper.ensureInitialized().encodeJson(this as SyncState); + } + + Map toJson() { + return SyncStateMapper.ensureInitialized().encodeMap(this as SyncState); + } + + SyncStateCopyWith get copyWith => _SyncStateCopyWithImpl(this as SyncState, $identity, $identity); + @override + String toString() { + return SyncStateMapper.ensureInitialized().stringifyValue(this as SyncState); + } + + @override + bool operator ==(Object other) { + return SyncStateMapper.ensureInitialized().equalsValue(this as SyncState, other); + } + + @override + int get hashCode { + return SyncStateMapper.ensureInitialized().hashValue(this as SyncState); + } +} + +extension SyncStateValueCopy<$R, $Out> on ObjectCopyWith<$R, SyncState, $Out> { + SyncStateCopyWith<$R, SyncState, $Out> get $asSyncState => $base.as((v, t, t2) => _SyncStateCopyWithImpl(v, t, t2)); +} + +abstract class SyncStateCopyWith<$R, $In extends SyncState, $Out> implements ClassCopyWith<$R, $In, $Out> { + StoredSecurityContextCopyWith<$R, StoredSecurityContext, StoredSecurityContext> get securityContext; + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>>? get networkWhitelist; + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>>? get networkBlacklist; + $R call( + {Future Function()? init, + Object? rootIsolateToken, + CustomHttpClient Function(Duration, StoredSecurityContext)? httpClientFactory, + StoredSecurityContext? securityContext, + DeviceInfoResult? deviceInfo, + String? alias, + int? port, + List? networkWhitelist, + List? networkBlacklist, + ProtocolType? protocol, + String? multicastGroup, + int? discoveryTimeout, + bool? serverRunning, + bool? download}); + SyncStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _SyncStateCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, SyncState, $Out> implements SyncStateCopyWith<$R, SyncState, $Out> { + _SyncStateCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = SyncStateMapper.ensureInitialized(); + @override + StoredSecurityContextCopyWith<$R, StoredSecurityContext, StoredSecurityContext> get securityContext => + $value.securityContext.copyWith.$chain((v) => call(securityContext: v)); + @override + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>>? get networkWhitelist => $value.networkWhitelist != null + ? ListCopyWith($value.networkWhitelist!, (v, t) => ObjectCopyWith(v, $identity, t), (v) => call(networkWhitelist: v)) + : null; + @override + ListCopyWith<$R, String, ObjectCopyWith<$R, String, String>>? get networkBlacklist => $value.networkBlacklist != null + ? ListCopyWith($value.networkBlacklist!, (v, t) => ObjectCopyWith(v, $identity, t), (v) => call(networkBlacklist: v)) + : null; + @override + $R call( + {Future Function()? init, + Object? rootIsolateToken, + CustomHttpClient Function(Duration, StoredSecurityContext)? httpClientFactory, + StoredSecurityContext? securityContext, + DeviceInfoResult? deviceInfo, + String? alias, + int? port, + Object? networkWhitelist = $none, + Object? networkBlacklist = $none, + ProtocolType? protocol, + String? multicastGroup, + int? discoveryTimeout, + bool? serverRunning, + bool? download}) => + $apply(FieldCopyWithData({ + if (init != null) #init: init, + if (rootIsolateToken != null) #rootIsolateToken: rootIsolateToken, + if (httpClientFactory != null) #httpClientFactory: httpClientFactory, + if (securityContext != null) #securityContext: securityContext, + if (deviceInfo != null) #deviceInfo: deviceInfo, + if (alias != null) #alias: alias, + if (port != null) #port: port, + if (networkWhitelist != $none) #networkWhitelist: networkWhitelist, + if (networkBlacklist != $none) #networkBlacklist: networkBlacklist, + if (protocol != null) #protocol: protocol, + if (multicastGroup != null) #multicastGroup: multicastGroup, + if (discoveryTimeout != null) #discoveryTimeout: discoveryTimeout, + if (serverRunning != null) #serverRunning: serverRunning, + if (download != null) #download: download + })); + @override + SyncState $make(CopyWithData data) => SyncState( + init: data.get(#init, or: $value.init), + rootIsolateToken: data.get(#rootIsolateToken, or: $value.rootIsolateToken), + httpClientFactory: data.get(#httpClientFactory, or: $value.httpClientFactory), + securityContext: data.get(#securityContext, or: $value.securityContext), + deviceInfo: data.get(#deviceInfo, or: $value.deviceInfo), + alias: data.get(#alias, or: $value.alias), + port: data.get(#port, or: $value.port), + networkWhitelist: data.get(#networkWhitelist, or: $value.networkWhitelist), + networkBlacklist: data.get(#networkBlacklist, or: $value.networkBlacklist), + protocol: data.get(#protocol, or: $value.protocol), + multicastGroup: data.get(#multicastGroup, or: $value.multicastGroup), + discoveryTimeout: data.get(#discoveryTimeout, or: $value.discoveryTimeout), + serverRunning: data.get(#serverRunning, or: $value.serverRunning), + download: data.get(#download, or: $value.download)); + + @override + SyncStateCopyWith<$R2, SyncState, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => _SyncStateCopyWithImpl($value, $cast, t); +} diff --git a/common/lib/src/isolate/child/upload_isolate.dart b/common/lib/src/isolate/child/upload_isolate.dart new file mode 100644 index 0000000..61ecbc7 --- /dev/null +++ b/common/lib/src/isolate/child/upload_isolate.dart @@ -0,0 +1,147 @@ +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:common/isolate.dart'; +import 'package:common/model/device.dart'; +import 'package:common/src/isolate/child/main.dart'; +import 'package:common/src/isolate/dto/isolate_task.dart'; +import 'package:common/src/isolate/dto/isolate_task_result.dart'; +import 'package:common/src/isolate/dto/send_to_isolate_data.dart'; +import 'package:common/src/task/upload/http_upload.dart'; +import 'package:common/util/stream.dart'; +import 'package:meta/meta.dart'; +import 'package:refena/refena.dart'; + +sealed class BaseHttpUploadTask {} + +class HttpUploadSetContentStreamResolverTask implements BaseHttpUploadTask { + final UriContentStreamResolver resolver; + + HttpUploadSetContentStreamResolverTask({ + required this.resolver, + }); +} + +class HttpUploadTask implements BaseHttpUploadTask { + final String? remoteSessionId; + final String remoteFileToken; + final String fileId; + final String? filePath; + final List? fileBytes; + final String mime; + final int fileSize; + final Device device; + + HttpUploadTask({ + required this.remoteSessionId, + required this.remoteFileToken, + required this.fileId, + required this.filePath, + required this.fileBytes, + required this.mime, + required this.fileSize, + required this.device, + }); +} + +class HttpUploadCancelTask implements BaseHttpUploadTask { + final int taskId; + + HttpUploadCancelTask({required this.taskId}); +} + +/// Map of cancel tokens for each task. +/// Task ID -> CancelToken +final _cancelTokenProvider = Provider((ref) => {}); + +abstract class UriContentStreamResolver { + /// Separate initialization method to create instance in the child isolate. + /// Cannot reference the RootIsolateToken class because it is not part of Dart. + void init({required Object? rootIsolateToken}); + + /// Resolves the content stream for the given URI. + Stream resolve(Uri uri); +} + +UriContentStreamResolver? _uriContentStreamResolver; + +@internal +Future setupHttpUploadIsolate( + Stream>> receiveFromMain, + void Function(IsolateTaskStreamResult) sendToMain, + InitialData initialData, +) async { + await setupChildIsolateHelper( + debugLabel: 'HttpUploadIsolate', + receiveFromMain: receiveFromMain, + sendToMain: sendToMain, + initialData: initialData, + handler: (ref, task) async { + final HttpUploadTask uploadTask; + switch (task.data) { + case HttpUploadSetContentStreamResolverTask task: + final rootIsolateToken = ref.read(syncProvider).rootIsolateToken; + task.resolver.init( + rootIsolateToken: rootIsolateToken, + ); + _uriContentStreamResolver = task.resolver; + return; + case HttpUploadTask task: + uploadTask = task; + break; + case HttpUploadCancelTask task: + final cancelToken = ref.read(_cancelTokenProvider)[task.taskId]; + cancelToken?.cancel(); + ref.read(_cancelTokenProvider).remove(task.taskId); + return; + } + + final Stream>? fileStream = uploadTask.filePath != null + ? _uriContentStreamResolver != null && uploadTask.filePath!.startsWith('content://') + ? _uriContentStreamResolver!.resolve(Uri.parse(uploadTask.filePath!)) + : File(uploadTask.filePath!).openRead() + : null; + + final (streamController, subscription) = fileStream?.digested() ?? (null, null); + + try { + final cancelToken = CustomCancelToken(); + ref.read(_cancelTokenProvider).putIfAbsent(task.id, () => cancelToken); + + await ref.read(httpUploadProvider).upload( + stream: streamController?.stream ?? Stream.fromIterable([uploadTask.fileBytes!]), + contentLength: uploadTask.fileSize, + contentType: uploadTask.mime, + target: uploadTask.device, + remoteSessionId: uploadTask.remoteSessionId, + fileId: uploadTask.fileId, + token: uploadTask.remoteFileToken, + onSendProgress: (progress) { + sendToMain(IsolateTaskStreamResult.event( + id: task.id, + data: progress, + )); + }, + cancelToken: cancelToken, + ); + + sendToMain(IsolateTaskStreamResult.done( + id: task.id, + )); + } catch (e) { + sendToMain(IsolateTaskStreamResult.error( + id: task.id, + error: e.toString(), + )); + } finally { + // Close the stream if it is still open + // ignore: unawaited_futures + streamController?.close(); + + // Cancel the subscription if it is still open + // ignore: unawaited_futures + subscription?.cancel(); + } + }, + ); +} diff --git a/common/lib/src/isolate/dto/isolate_task.dart b/common/lib/src/isolate/dto/isolate_task.dart new file mode 100644 index 0000000..109aabf --- /dev/null +++ b/common/lib/src/isolate/dto/isolate_task.dart @@ -0,0 +1,21 @@ +import 'package:common/src/isolate/dto/isolate_task_result.dart'; + +/// A data structure that can be sent to an isolate. +/// This is used to represent the following schemas: +/// +/// Main sends an [IsolateTask] -> Isolate responds with an [IsolateTaskResult] +/// Main sends an [IsolateTask] -> Isolate responds with an [IsolateTaskStreamResult] +/// +/// Generally speaking, we need an exact request-response pair. +class IsolateTask { + /// The id of the task to be matched with [IsolateTaskResult.id] or [IsolateTaskStreamResult.id]. + final int id; + + /// The payload of the request. + final T data; + + IsolateTask({ + required this.id, + required this.data, + }); +} diff --git a/common/lib/src/isolate/dto/isolate_task_result.dart b/common/lib/src/isolate/dto/isolate_task_result.dart new file mode 100644 index 0000000..a086e77 --- /dev/null +++ b/common/lib/src/isolate/dto/isolate_task_result.dart @@ -0,0 +1,83 @@ +import 'package:common/src/isolate/dto/isolate_task.dart'; + +/// The response data structure from an [IsolateTask]. +sealed class IsolateTaskResult { + /// The id of the task to be matched with [IsolateTask.id]. + final int id; + + IsolateTaskResult._({ + required this.id, + }); +} + +class IsolateTaskSuccessResult extends IsolateTaskResult { + /// The payload of the response. + final T data; + + IsolateTaskSuccessResult({ + required int id, + required this.data, + }) : super._(id: id); +} + +class IsolateTaskErrorResult extends IsolateTaskResult { + /// The error. + final String error; + + IsolateTaskErrorResult({ + required int id, + required this.error, + }) : super._(id: id); +} + +/// Stream version of [IsolateTaskResult]. +class IsolateTaskStreamResult { + /// The id of the task. + /// Corresponds to [IsolateTask.id] that started the stream. + final int id; + + /// If true, the stream is done. + final bool done; + + /// The error. + final Object? error; + + /// A single data event from the stream. + final T? data; + + IsolateTaskStreamResult._({ + required this.id, + required this.done, + required this.data, + required this.error, + }); + + IsolateTaskStreamResult.event({ + required this.id, + required this.data, + }) : done = false, + error = null; + + IsolateTaskStreamResult.done({ + required this.id, + }) : done = true, + data = null, + error = null; + + IsolateTaskStreamResult.error({ + required this.id, + required this.error, + }) : done = true, + data = null; +} + +/// A special data payload to acknowledge the reception of a stream event. +class IsolateTaskStreamAckResult extends IsolateTaskStreamResult { + IsolateTaskStreamAckResult({ + required super.id, + }) : super._( + data: null, + done: false, + error: null, + ); +} diff --git a/common/lib/src/isolate/dto/send_to_isolate_data.dart b/common/lib/src/isolate/dto/send_to_isolate_data.dart new file mode 100644 index 0000000..128883c --- /dev/null +++ b/common/lib/src/isolate/dto/send_to_isolate_data.dart @@ -0,0 +1,11 @@ +import 'package:common/src/isolate/child/sync_provider.dart'; + +class SendToIsolateData { + final SyncState? syncState; + final T? data; + + SendToIsolateData({ + required this.syncState, + required this.data, + }); +} diff --git a/common/lib/src/isolate/parent/actions.dart b/common/lib/src/isolate/parent/actions.dart new file mode 100644 index 0000000..5b4f9b2 --- /dev/null +++ b/common/lib/src/isolate/parent/actions.dart @@ -0,0 +1,256 @@ +import 'dart:async'; + +import 'package:common/model/device.dart'; +import 'package:common/src/isolate/child/http_scan_discovery_isolate.dart'; +import 'package:common/src/isolate/child/multicast_discovery_isolate.dart'; +import 'package:common/src/isolate/child/upload_isolate.dart'; +import 'package:common/src/isolate/dto/isolate_task.dart'; +import 'package:common/src/isolate/dto/isolate_task_result.dart'; +import 'package:common/src/isolate/dto/send_to_isolate_data.dart'; +import 'package:common/src/isolate/parent/parent_isolate_provider.dart'; +import 'package:common/src/util/id_provider.dart'; +import 'package:common/src/util/isolate_helper.dart'; +import 'package:refena/refena.dart'; + +final _idProvider = IdProvider(); + +class IsolateInterfaceHttpDiscoveryAction extends ReduxActionWithResult> { + final String networkInterface; + final int port; + final bool https; + + IsolateInterfaceHttpDiscoveryAction({ + required this.networkInterface, + required this.port, + required this.https, + }); + + @override + (ParentIsolateState, Stream) reduce() { + final connection = state.httpScanDiscovery; + if (connection == null) { + throw StateError('httpScanDiscovery is not initialized'); + } + + final task = HttpInterfaceScanTask( + networkInterface: networkInterface, + port: port, + https: https, + ); + + return ( + state, + _sendTaskAndListenStream( + task: task, + connection: connection, + ) + ); + } +} + +class IsolateFavoriteHttpDiscoveryAction extends ReduxActionWithResult> { + final List<(String, int)> favorites; + final bool https; + + IsolateFavoriteHttpDiscoveryAction({ + required this.favorites, + required this.https, + }); + + @override + (ParentIsolateState, Stream) reduce() { + final connection = state.httpScanDiscovery; + if (connection == null) { + throw StateError('httpScanDiscovery is not initialized'); + } + + final task = HttpFavoriteScanTask( + favorites: favorites, + https: https, + ); + + return ( + state, + _sendTaskAndListenStream( + task: task, + connection: connection, + ) + ); + } +} + +class IsolateSendMulticastAnnouncementAction extends ReduxAction { + @override + ParentIsolateState reduce() { + final connection = state.multicastDiscovery; + if (connection == null) { + throw StateError('multicastDiscovery is not initialized'); + } + + connection.sendToIsolate(SendToIsolateData( + syncState: null, + data: MulticastAnnouncementTask.instance, + )); + + return state; + } +} + +class IsolateSendMulticastRestartListenerAction extends ReduxAction { + @override + ParentIsolateState reduce() { + final connection = state.multicastDiscovery; + if (connection == null) { + throw StateError('multicastDiscovery is not initialized'); + } + + connection.sendToIsolate(SendToIsolateData( + syncState: null, + data: MulticastRestartListenerTask.instance, + )); + + return state; + } +} + +class IsolateHttpUploadActionResult { + final int taskId; + final Stream progress; + + IsolateHttpUploadActionResult({ + required this.taskId, + required this.progress, + }); +} + +class IsolateHttpUploadAction extends ReduxActionWithResult { + final int isolateIndex; + final String? remoteSessionId; + final String remoteFileToken; + final String fileId; + final String? filePath; + final List? fileBytes; + final String mime; + final int fileSize; + final Device device; + + IsolateHttpUploadAction({ + required this.isolateIndex, + required this.remoteSessionId, + required this.remoteFileToken, + required this.fileId, + required this.filePath, + required this.fileBytes, + required this.mime, + required this.fileSize, + required this.device, + }); + + @override + (ParentIsolateState, IsolateHttpUploadActionResult) reduce() { + final connection = state.httpUpload[isolateIndex]; + + final task = HttpUploadTask( + remoteSessionId: remoteSessionId, + remoteFileToken: remoteFileToken, + fileId: fileId, + filePath: filePath, + fileBytes: fileBytes, + mime: mime, + fileSize: fileSize, + device: device, + ); + + final taskId = _idProvider.getNextId(); + final progress = _sendTaskAndListenStream( + task: task, + connection: connection, + taskId: taskId, + ); + + return ( + state, + IsolateHttpUploadActionResult( + taskId: taskId, + progress: progress, + ), + ); + } +} + +class IsolateHttpUploadCancelAction extends ReduxAction { + final int isolateIndex; + final int taskId; + + IsolateHttpUploadCancelAction({ + required this.isolateIndex, + required this.taskId, + }); + + @override + ParentIsolateState reduce() { + final connection = state.httpUpload[isolateIndex]; + + connection.sendToIsolate(SendToIsolateData( + syncState: null, + data: IsolateTask( + id: _idProvider.getNextId(), + data: HttpUploadCancelTask( + taskId: taskId, + ), + ), + )); + + return state; + } +} + +/// Sends a task to the isolate +/// and transforms [IsolateTaskStreamResult] into a proper stream making it easier to work with. +Stream _sendTaskAndListenStream({ + required T task, + required IsolateConnector, SendToIsolateData>> connection, + int? taskId, +}) { + final wrappedTask = IsolateTask( + id: taskId ?? _idProvider.getNextId(), + data: task, + ); + + // ignore: discarded_futures + Future.microtask(() { + connection.sendToIsolate(SendToIsolateData>( + syncState: null, + data: wrappedTask, + )); + }); + + return _convertResponseToStream( + taskId: wrappedTask.id, + connection: connection, + ); +} + +Stream _convertResponseToStream({ + required int taskId, + required IsolateConnector, SendToIsolateData>> connection, +}) { + final controller = StreamController(); + late StreamSubscription subscription; + subscription = connection.receiveFromIsolate.listen((result) { + if (result.id == taskId) { + if (result.data != null) { + controller.add(result.data as R); + } else if (result.done) { + if (result.error != null) { + controller.addError(result.error!); + } else { + subscription.cancel(); // ignore: discarded_futures + controller.close(); // ignore: discarded_futures + } + } + } + }); + + return controller.stream; +} diff --git a/common/lib/src/isolate/parent/actions_sync.dart b/common/lib/src/isolate/parent/actions_sync.dart new file mode 100644 index 0000000..44ba314 --- /dev/null +++ b/common/lib/src/isolate/parent/actions_sync.dart @@ -0,0 +1,127 @@ +import 'package:common/model/device_info_result.dart'; +import 'package:common/model/dto/multicast_dto.dart'; +import 'package:common/model/stored_security_context.dart'; +import 'package:common/src/isolate/child/sync_provider.dart'; +import 'package:common/src/isolate/dto/send_to_isolate_data.dart'; +import 'package:common/src/isolate/parent/parent_isolate_provider.dart'; +import 'package:refena/refena.dart'; + +/// Publishes the new security context to all child isolates. +class IsolateSyncSecurityContextAction extends ReduxAction { + final StoredSecurityContext securityContext; + + IsolateSyncSecurityContextAction({ + required this.securityContext, + }); + + @override + ParentIsolateState reduce() { + dispatch(_PublishSyncStateAction( + syncState: state.syncState.copyWith( + securityContext: securityContext, + ), + )); + return state; + } +} + +/// Publishes the new device info to all child isolates. +class IsolateSyncDeviceInfoAction extends ReduxAction { + final DeviceInfoResult deviceInfo; + + IsolateSyncDeviceInfoAction({ + required this.deviceInfo, + }); + + @override + ParentIsolateState reduce() { + dispatch(_PublishSyncStateAction( + syncState: state.syncState.copyWith( + deviceInfo: deviceInfo, + ), + )); + return state; + } +} + +class IsolateSyncSettingsAction extends ReduxAction { + final List? networkWhitelist; + final List? networkBlacklist; + final String multicastGroup; + final int discoveryTimeout; + + IsolateSyncSettingsAction({ + required this.networkWhitelist, + required this.networkBlacklist, + required this.multicastGroup, + required this.discoveryTimeout, + }); + + @override + ParentIsolateState reduce() { + dispatch(_PublishSyncStateAction( + syncState: state.syncState.copyWith( + networkWhitelist: networkWhitelist, + networkBlacklist: networkBlacklist, + multicastGroup: multicastGroup, + discoveryTimeout: discoveryTimeout, + ), + )); + return state; + } +} + +class IsolateSyncServerStateAction extends ReduxAction { + final String alias; + final int port; + final ProtocolType protocol; + final bool serverRunning; + final bool download; + + IsolateSyncServerStateAction({ + required this.alias, + required this.port, + required this.protocol, + required this.serverRunning, + required this.download, + }); + + @override + ParentIsolateState reduce() { + dispatch(_PublishSyncStateAction( + syncState: state.syncState.copyWith( + alias: alias, + port: port, + protocol: protocol, + serverRunning: serverRunning, + download: download, + ), + )); + return state; + } +} + +/// Publishes the new [SyncState] to all child isolates. +class _PublishSyncStateAction extends ReduxAction { + final SyncState syncState; + + _PublishSyncStateAction({ + required this.syncState, + }); + + @override + ParentIsolateState reduce() { + state.httpScanDiscovery?.sendToIsolate(SendToIsolateData( + syncState: syncState, + data: null, + )); + state.multicastDiscovery?.sendToIsolate(SendToIsolateData( + syncState: syncState, + data: null, + )); + + return state.copyWith( + syncState: syncState, + ); + } +} diff --git a/common/lib/src/isolate/parent/parent_isolate_provider.dart b/common/lib/src/isolate/parent/parent_isolate_provider.dart new file mode 100644 index 0000000..b2ae55c --- /dev/null +++ b/common/lib/src/isolate/parent/parent_isolate_provider.dart @@ -0,0 +1,137 @@ +import 'package:common/model/device.dart'; +import 'package:common/src/isolate/child/http_scan_discovery_isolate.dart'; +import 'package:common/src/isolate/child/main.dart'; +import 'package:common/src/isolate/child/multicast_discovery_isolate.dart'; +import 'package:common/src/isolate/child/sync_provider.dart'; +import 'package:common/src/isolate/child/upload_isolate.dart'; +import 'package:common/src/isolate/dto/isolate_task.dart'; +import 'package:common/src/isolate/dto/isolate_task_result.dart'; +import 'package:common/src/isolate/dto/send_to_isolate_data.dart'; +import 'package:common/src/util/isolate_helper.dart'; +import 'package:dart_mappable/dart_mappable.dart'; +import 'package:logging/logging.dart'; +import 'package:refena/refena.dart'; + +part 'parent_isolate_provider.mapper.dart'; + +const _uploadIsolateCount = 2; + +/// Holds the state of the parent isolate that is visible in the main Flutter isolate. +/// The [ParentIsolateState.syncState] is synchronized with all child isolates. +/// Additionally, holds the objects to communicate with the child isolates. +@MappableClass() +class ParentIsolateState with ParentIsolateStateMappable { + final SyncState syncState; + final IsolateConnector, SendToIsolateData>>? httpScanDiscovery; + final IsolateConnector>? multicastDiscovery; + final List, SendToIsolateData>>> httpUpload; + int get uploadIsolateCount => httpUpload.length; + + ParentIsolateState({ + required this.syncState, + required this.httpScanDiscovery, + required this.multicastDiscovery, + required this.httpUpload, + }); + + static ParentIsolateState initial(SyncState syncState) => ParentIsolateState( + syncState: syncState, + httpScanDiscovery: null, + multicastDiscovery: null, + httpUpload: [], + ); + + @override + String toString() { + return 'ParentIsolateState(syncState: $syncState)'; + } +} + +final parentIsolateProvider = ReduxProvider((ref) { + throw 'Not initialized'; +}); + +class IsolateController extends ReduxNotifier { + final ParentIsolateState initialState; + + IsolateController({ + required this.initialState, + }); + + @override + ParentIsolateState init() => initialState; +} + +/// Starts the required isolates. +/// Should be called by the main isolate. +class IsolateSetupAction extends AsyncReduxAction { + /// If provided, file paths starting with "content://" will be resolved using this resolver. + final UriContentStreamResolver? uriContentStreamResolver; + + IsolateSetupAction({ + required this.uriContentStreamResolver, + }); + + @override + Future reduce() async { + final httpScanDiscovery = await startIsolate, SendToIsolateData>, InitialData>( + task: setupHttpScanDiscoveryIsolate, + param: InitialData( + syncState: state.syncState, + logLevel: Logger.root.level, + ), + ); + + final multicastDiscovery = await startIsolate, InitialData>( + task: setupMulticastDiscoveryIsolate, + param: InitialData( + syncState: state.syncState, + logLevel: Logger.root.level, + ), + ); + + final httpUploadIsolates = List.generate( + _uploadIsolateCount, + (index) async { + final httpUpload = await startIsolate, SendToIsolateData>, InitialData>( + task: setupHttpUploadIsolate, + param: InitialData( + syncState: state.syncState, + logLevel: Logger.root.level, + ), + ); + + if (uriContentStreamResolver != null) { + httpUpload.sendToIsolate(SendToIsolateData( + syncState: null, + data: IsolateTask( + id: -1, + data: HttpUploadSetContentStreamResolverTask(resolver: uriContentStreamResolver!), + ), + )); + } + + return httpUpload; + }, + growable: false, + ); + + return state.copyWith( + httpScanDiscovery: httpScanDiscovery, + multicastDiscovery: multicastDiscovery, + httpUpload: await Future.wait(httpUploadIsolates), + ); + } +} + +class IsolateDisposeAction extends ReduxAction { + @override + ParentIsolateState reduce() { + state.httpScanDiscovery?.isolate.kill(); + state.multicastDiscovery?.isolate.kill(); + for (final httpUpload in state.httpUpload) { + httpUpload.isolate.kill(); + } + return state; + } +} diff --git a/common/lib/src/isolate/parent/parent_isolate_provider.mapper.dart b/common/lib/src/isolate/parent/parent_isolate_provider.mapper.dart new file mode 100644 index 0000000..af425df --- /dev/null +++ b/common/lib/src/isolate/parent/parent_isolate_provider.mapper.dart @@ -0,0 +1,152 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member +// ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter + +part of 'parent_isolate_provider.dart'; + +class ParentIsolateStateMapper extends ClassMapperBase { + ParentIsolateStateMapper._(); + + static ParentIsolateStateMapper? _instance; + static ParentIsolateStateMapper ensureInitialized() { + if (_instance == null) { + MapperContainer.globals.use(_instance = ParentIsolateStateMapper._()); + SyncStateMapper.ensureInitialized(); + DeviceMapper.ensureInitialized(); + } + return _instance!; + } + + @override + final String id = 'ParentIsolateState'; + + static SyncState _$syncState(ParentIsolateState v) => v.syncState; + static const Field _f$syncState = Field('syncState', _$syncState); + static IsolateConnector, SendToIsolateData>>? _$httpScanDiscovery(ParentIsolateState v) => + v.httpScanDiscovery; + static const Field, SendToIsolateData>>> + _f$httpScanDiscovery = Field('httpScanDiscovery', _$httpScanDiscovery); + static IsolateConnector>? _$multicastDiscovery(ParentIsolateState v) => v.multicastDiscovery; + static const Field>> _f$multicastDiscovery = + Field('multicastDiscovery', _$multicastDiscovery); + static List, SendToIsolateData>>> _$httpUpload( + ParentIsolateState v) => + v.httpUpload; + static const Field, SendToIsolateData>>>> + _f$httpUpload = Field('httpUpload', _$httpUpload); + + @override + final MappableFields fields = const { + #syncState: _f$syncState, + #httpScanDiscovery: _f$httpScanDiscovery, + #multicastDiscovery: _f$multicastDiscovery, + #httpUpload: _f$httpUpload, + }; + + static ParentIsolateState _instantiate(DecodingData data) { + return ParentIsolateState( + syncState: data.dec(_f$syncState), + httpScanDiscovery: data.dec(_f$httpScanDiscovery), + multicastDiscovery: data.dec(_f$multicastDiscovery), + httpUpload: data.dec(_f$httpUpload)); + } + + @override + final Function instantiate = _instantiate; + + static ParentIsolateState fromJson(Map map) { + return ensureInitialized().decodeMap(map); + } + + static ParentIsolateState deserialize(String json) { + return ensureInitialized().decodeJson(json); + } +} + +mixin ParentIsolateStateMappable { + String serialize() { + return ParentIsolateStateMapper.ensureInitialized().encodeJson(this as ParentIsolateState); + } + + Map toJson() { + return ParentIsolateStateMapper.ensureInitialized().encodeMap(this as ParentIsolateState); + } + + ParentIsolateStateCopyWith get copyWith => + _ParentIsolateStateCopyWithImpl(this as ParentIsolateState, $identity, $identity); + @override + String toString() { + return ParentIsolateStateMapper.ensureInitialized().stringifyValue(this as ParentIsolateState); + } + + @override + bool operator ==(Object other) { + return ParentIsolateStateMapper.ensureInitialized().equalsValue(this as ParentIsolateState, other); + } + + @override + int get hashCode { + return ParentIsolateStateMapper.ensureInitialized().hashValue(this as ParentIsolateState); + } +} + +extension ParentIsolateStateValueCopy<$R, $Out> on ObjectCopyWith<$R, ParentIsolateState, $Out> { + ParentIsolateStateCopyWith<$R, ParentIsolateState, $Out> get $asParentIsolateState => + $base.as((v, t, t2) => _ParentIsolateStateCopyWithImpl(v, t, t2)); +} + +abstract class ParentIsolateStateCopyWith<$R, $In extends ParentIsolateState, $Out> implements ClassCopyWith<$R, $In, $Out> { + SyncStateCopyWith<$R, SyncState, SyncState> get syncState; + ListCopyWith< + $R, + IsolateConnector, SendToIsolateData>>, + ObjectCopyWith<$R, IsolateConnector, SendToIsolateData>>, + IsolateConnector, SendToIsolateData>>>> get httpUpload; + $R call( + {SyncState? syncState, + IsolateConnector, SendToIsolateData>>? httpScanDiscovery, + IsolateConnector>? multicastDiscovery, + List, SendToIsolateData>>>? httpUpload}); + ParentIsolateStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); +} + +class _ParentIsolateStateCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, ParentIsolateState, $Out> + implements ParentIsolateStateCopyWith<$R, ParentIsolateState, $Out> { + _ParentIsolateStateCopyWithImpl(super.value, super.then, super.then2); + + @override + late final ClassMapperBase $mapper = ParentIsolateStateMapper.ensureInitialized(); + @override + SyncStateCopyWith<$R, SyncState, SyncState> get syncState => $value.syncState.copyWith.$chain((v) => call(syncState: v)); + @override + ListCopyWith< + $R, + IsolateConnector, SendToIsolateData>>, + ObjectCopyWith<$R, IsolateConnector, SendToIsolateData>>, + IsolateConnector, SendToIsolateData>>>> get httpUpload => + ListCopyWith($value.httpUpload, (v, t) => ObjectCopyWith(v, $identity, t), (v) => call(httpUpload: v)); + @override + $R call( + {SyncState? syncState, + Object? httpScanDiscovery = $none, + Object? multicastDiscovery = $none, + List, SendToIsolateData>>>? httpUpload}) => + $apply(FieldCopyWithData({ + if (syncState != null) #syncState: syncState, + if (httpScanDiscovery != $none) #httpScanDiscovery: httpScanDiscovery, + if (multicastDiscovery != $none) #multicastDiscovery: multicastDiscovery, + if (httpUpload != null) #httpUpload: httpUpload + })); + @override + ParentIsolateState $make(CopyWithData data) => ParentIsolateState( + syncState: data.get(#syncState, or: $value.syncState), + httpScanDiscovery: data.get(#httpScanDiscovery, or: $value.httpScanDiscovery), + multicastDiscovery: data.get(#multicastDiscovery, or: $value.multicastDiscovery), + httpUpload: data.get(#httpUpload, or: $value.httpUpload)); + + @override + ParentIsolateStateCopyWith<$R2, ParentIsolateState, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => + _ParentIsolateStateCopyWithImpl($value, $cast, t); +} diff --git a/common/lib/src/task/README.md b/common/lib/src/task/README.md new file mode 100644 index 0000000..d8500ad --- /dev/null +++ b/common/lib/src/task/README.md @@ -0,0 +1,3 @@ +All files in this directory should only call utility functions. + +Isolate logic is prohibited in this directory. diff --git a/common/lib/src/task/discovery/http_scan_discovery.dart b/common/lib/src/task/discovery/http_scan_discovery.dart new file mode 100644 index 0000000..cd1b783 --- /dev/null +++ b/common/lib/src/task/discovery/http_scan_discovery.dart @@ -0,0 +1,67 @@ +import 'package:common/model/device.dart'; +import 'package:common/src/task/discovery/http_target_discovery.dart'; +import 'package:common/util/task_runner.dart'; +import 'package:logging/logging.dart'; +import 'package:refena/refena.dart'; + +final _logger = Logger('HttpScanDiscovery'); + +final httpScanDiscoveryProvider = ViewProvider((ref) { + return HttpScanDiscoveryService( + targetedDiscoveryService: ref.accessor(httpTargetDiscoveryProvider), + ); +}); + +Map _runners = {}; + +class HttpScanDiscoveryService { + final StateAccessor _targetedDiscoveryService; + + HttpScanDiscoveryService({ + required StateAccessor targetedDiscoveryService, + }) : _targetedDiscoveryService = targetedDiscoveryService; + + Stream getStream({required String networkInterface, required int port, required bool https}) { + final ipList = List.generate(256, (i) => '${networkInterface.split('.').take(3).join('.')}.$i').where((ip) => ip != networkInterface).toList(); + _runners[networkInterface]?.stop(); + _runners[networkInterface] = TaskRunner( + initialTasks: List.generate( + ipList.length, + (index) => () async => _doRequest(ipList[index], port, https), + ), + concurrency: 50, + ); + + return _runners[networkInterface]!.stream.where((device) => device != null).cast(); + } + + Stream getFavoriteStream({required List<(String, int)> devices, required bool https}) { + final runner = TaskRunner( + initialTasks: List.generate( + devices.length, + (index) => () async { + final device = devices[index]; + return _doRequest(device.$1, device.$2, https); + }, + ), + concurrency: 50, + ); + + return runner.stream.where((device) => device != null).cast(); + } + + Future _doRequest(String currentIp, int port, bool https) async { + _logger.fine('Requesting $currentIp'); + final device = await _targetedDiscoveryService.state.discover( + ip: currentIp, + port: port, + https: https, + onError: null, + ); + if (device != null) { + _logger.info('[DISCOVER/TCP] ${device.alias} (${device.ip}, model: ${device.deviceModel})'); + } + + return device; + } +} diff --git a/common/lib/src/task/discovery/http_target_discovery.dart b/common/lib/src/task/discovery/http_target_discovery.dart new file mode 100644 index 0000000..3554541 --- /dev/null +++ b/common/lib/src/task/discovery/http_target_discovery.dart @@ -0,0 +1,48 @@ +import 'package:common/api_route_builder.dart'; +import 'package:common/constants.dart'; +import 'package:common/model/device.dart'; +import 'package:common/model/dto/info_dto.dart'; +import 'package:common/src/isolate/child/http_provider.dart'; +import 'package:common/src/isolate/child/sync_provider.dart'; +import 'package:logging/logging.dart'; +import 'package:refena/refena.dart'; + +final _logger = Logger('TargetedDiscovery'); + +final httpTargetDiscoveryProvider = ViewProvider((ref) { + final client = ref.watch(httpProvider).discovery; + final fingerprint = ref.watch(syncProvider).securityContext.certificateHash; + return HttpTargetDiscoveryService(client, fingerprint); +}); + +/// Try to discover a single device using the given IP and port. +class HttpTargetDiscoveryService { + final CustomHttpClient _client; + final String _fingerprint; + + HttpTargetDiscoveryService(this._client, this._fingerprint); + + Future discover({ + required String ip, + required int port, + required bool https, + void Function(String url, Object? error)? onError = defaultErrorPrinter, + }) async { + // We use the legacy route to make it less breaking for older versions + final url = ApiRoute.info.targetRaw(ip, port, https, peerProtocolVersion); + try { + final response = await _client.get(uri: url, query: { + 'fingerprint': _fingerprint, + }); + final dto = InfoDtoMapper.deserialize(response); + return dto.toDevice(ip, port, https, HttpDiscovery(ip: ip)); + } catch (e) { + onError?.call(url, e); + return null; + } + } + + static void defaultErrorPrinter(String url, Object? error) { + _logger.warning('$url: $error'); + } +} diff --git a/common/lib/src/task/discovery/multicast_discovery.dart b/common/lib/src/task/discovery/multicast_discovery.dart new file mode 100644 index 0000000..7d0a4fd --- /dev/null +++ b/common/lib/src/task/discovery/multicast_discovery.dart @@ -0,0 +1,225 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:common/api_route_builder.dart'; +import 'package:common/constants.dart'; +import 'package:common/isolate.dart'; +import 'package:common/model/device.dart'; +import 'package:common/model/dto/multicast_dto.dart'; +import 'package:common/model/dto/register_dto.dart'; +import 'package:common/src/isolate/child/http_provider.dart'; +import 'package:common/util/network_interfaces.dart'; +import 'package:common/util/sleep.dart'; +import 'package:logging/logging.dart'; +import 'package:refena/refena.dart'; + +final _logger = Logger('Multicast'); + +final multicastDiscoveryProvider = Provider((ref) { + return MulticastService(ref); +}); + +class MulticastService { + MulticastService(this._ref); + + final Ref _ref; + Completer _cancelCompleter = Completer(); + bool _listening = false; + + /// Binds the UDP port and listen to UDP multicast packages + /// It will automatically answer announcement messages + Stream startListener() async* { + if (_listening) { + _logger.info('Already listening to multicast'); + return; + } + + _listening = true; + + while (true) { + final streamController = StreamController(); + final syncState = _ref.read(syncProvider); + + final sockets = await _getSockets( + whitelist: syncState.networkWhitelist, + blacklist: syncState.networkBlacklist, + multicastGroup: syncState.multicastGroup, + port: syncState.port, + ); + for (final socket in sockets) { + socket.socket.listen((_) { + final datagram = socket.socket.receive(); + if (datagram == null) { + return; + } + + try { + final dto = MulticastDto.fromJson(jsonDecode(utf8.decode(datagram.data))); + if (dto.fingerprint == syncState.securityContext.certificateHash) { + return; + } + + final ip = datagram.address.address; + final peer = dto.toDevice(ip, syncState.port, syncState.protocol == ProtocolType.https); + streamController.add(peer); + if ((dto.announcement == true || dto.announce == true) && syncState.serverRunning) { + // only respond when server is running + // ignore: discarded_futures + _answerAnnouncement(peer); + } + } catch (e) { + _logger.warning('Could not parse multicast message', e); + } + }); + _logger.info( + 'Bind UDP multicast port (ip: ${socket.interface.addresses.map((a) => a.address).toList()}, group: ${syncState.multicastGroup}, port: ${syncState.port})', + ); + } + + // Tell everyone in the network that I am online + sendAnnouncement(); // ignore: unawaited_futures + + _cancelCompleter = Completer(); + + // ignore: unawaited_futures + _cancelCompleter.future.then((_) { + // ignore: discarded_futures + streamController.close(); + for (final socket in sockets) { + socket.socket.close(); + } + }); + + yield* streamController.stream; + + // streamController is closed because of cancel + // wait for resources to be released (it works without on macOS, but who knows) + await sleepAsync(500); + } + } + + void restartListener() { + _cancelCompleter.complete(); + } + + /// Sends an announcement which triggers a response on every LocalSend member of the network. + Future sendAnnouncement() async { + final syncState = _ref.read(syncProvider); + final sockets = await _getSockets( + whitelist: syncState.networkWhitelist, + blacklist: syncState.networkBlacklist, + multicastGroup: syncState.multicastGroup, + ); + final dto = _getMulticastDto(announcement: true); + for (final wait in [100, 500, 2000]) { + await sleepAsync(wait); + + _logger.info('Announce via UDP'); + for (final socket in sockets) { + try { + socket.socket.send(dto, InternetAddress(syncState.multicastGroup), syncState.port); + socket.socket.close(); + } catch (e) { + _logger.warning('Could not send multicast message', e); + } + } + } + } + + /// Responds to an announcement. + Future _answerAnnouncement(Device peer) async { + try { + // Answer with TCP + await _ref.read(httpProvider).discovery.post( + uri: ApiRoute.register.target(peer), + json: _getRegisterDto().toJson(), + ); + _logger.info('Respond to announcement of ${peer.alias} (${peer.ip}, model: ${peer.deviceModel}) via TCP'); + } catch (e) { + // Fallback: Answer with UDP + final syncState = _ref.read(syncProvider); + final sockets = await _getSockets( + whitelist: syncState.networkWhitelist, + blacklist: syncState.networkBlacklist, + multicastGroup: syncState.multicastGroup, + ); + final dto = _getMulticastDto(announcement: false); + for (final socket in sockets) { + try { + socket.socket.send(dto, InternetAddress(syncState.multicastGroup), syncState.port); + socket.socket.close(); + } catch (e) { + _logger.warning('Could not send multicast message', e); + } + } + _logger.info('Respond to announcement of ${peer.alias} (${peer.ip}, model: ${peer.deviceModel}) with UDP because TCP failed'); + } + } + + /// Returns the MulticastDto of this device in bytes. + List _getMulticastDto({required bool announcement}) { + final syncState = _ref.read(syncProvider); + final dto = MulticastDto( + alias: syncState.alias, + version: protocolVersion, + deviceModel: syncState.deviceInfo.deviceModel, + deviceType: syncState.deviceInfo.deviceType, + fingerprint: syncState.securityContext.certificateHash, + port: syncState.port, + protocol: syncState.protocol, + download: syncState.download, + announcement: announcement, + announce: announcement, + ); + return utf8.encode(jsonEncode(dto.toJson())); + } + + RegisterDto _getRegisterDto() { + final syncState = _ref.read(syncProvider); + return RegisterDto( + alias: syncState.alias, + version: protocolVersion, + deviceModel: syncState.deviceInfo.deviceModel, + deviceType: syncState.deviceInfo.deviceType, + fingerprint: syncState.securityContext.certificateHash, + port: syncState.port, + protocol: syncState.protocol, + download: syncState.download, + ); + } +} + +class _SocketResult { + final NetworkInterface interface; + final RawDatagramSocket socket; + + _SocketResult(this.interface, this.socket); +} + +Future> _getSockets({ + required List? whitelist, + required List? blacklist, + required String multicastGroup, + int? port, +}) async { + final interfaces = await getNetworkInterfaces( + whitelist: whitelist, + blacklist: blacklist, + ); + final sockets = <_SocketResult>[]; + for (final interface in interfaces) { + try { + final socket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, port ?? 0); + socket.joinMulticast(InternetAddress(multicastGroup), interface); + sockets.add(_SocketResult(interface, socket)); + } catch (e) { + _logger.warning( + 'Could not bind UDP multicast port (ip: ${interface.addresses.map((a) => a.address).toList()}, group: $multicastGroup, port: $port)', + e, + ); + } + } + + return sockets; +} diff --git a/common/lib/src/task/upload/http_upload.dart b/common/lib/src/task/upload/http_upload.dart new file mode 100644 index 0000000..ff24ad3 --- /dev/null +++ b/common/lib/src/task/upload/http_upload.dart @@ -0,0 +1,43 @@ +import 'package:common/api_route_builder.dart'; +import 'package:common/model/device.dart'; +import 'package:common/src/isolate/child/http_provider.dart'; +import 'package:refena/refena.dart'; + +final httpUploadProvider = ViewProvider((ref) { + final client = ref.watch(httpProvider).longLiving; + return HttpUploadService(client); +}); + +class HttpUploadService { + final CustomHttpClient _client; + + HttpUploadService(this._client); + + Future upload({ + required Stream> stream, + required int contentLength, + required String contentType, + required Device target, + required String? remoteSessionId, + required String fileId, + required String token, + required void Function(double) onSendProgress, + required CustomCancelToken cancelToken, + }) async { + await _client.postStream( + uri: ApiRoute.upload.target(target), + query: { + if (remoteSessionId != null) 'sessionId': remoteSessionId, + 'fileId': fileId, + 'token': token, + }, + headers: { + 'Content-Length': contentLength.toString(), + 'Content-Type': contentType, + }, + stream: stream, + onSendProgress: onSendProgress, + cancelToken: cancelToken, + ); + } +} diff --git a/common/lib/src/util/id_provider.dart b/common/lib/src/util/id_provider.dart new file mode 100644 index 0000000..a22ad88 --- /dev/null +++ b/common/lib/src/util/id_provider.dart @@ -0,0 +1,11 @@ +/// A simple class that provides an id. +class IdProvider { + int _id = 0; + + /// Returns the next id. + /// This is an atomic operation because Dart's event loop is single-threaded. + int getNextId() => _id++; + + /// Resets the id to 0. + void reset() => _id = 0; +} diff --git a/common/lib/src/util/isolate_helper.dart b/common/lib/src/util/isolate_helper.dart new file mode 100644 index 0000000..405ed09 --- /dev/null +++ b/common/lib/src/util/isolate_helper.dart @@ -0,0 +1,117 @@ +import 'dart:async'; +import 'dart:isolate'; + +/// This instance lives in the main isolate and is used to communicate with the child isolate. +class IsolateConnector { + /// A broadcast stream that receives messages from the isolate. + final Stream receiveFromIsolate; + + /// The [SendPort] to send messages to the isolate. + /// Since this is not type-safe, use [sendToIsolate] instead. + final SendPort _sendToIsolate; + + /// The isolate that this connector is connected to. + final Isolate isolate; + + IsolateConnector._( + this.receiveFromIsolate, + this._sendToIsolate, + this.isolate, + ); + + /// Sends a message to the isolate. + void sendToIsolate(S message) { + _sendToIsolate.send(message); + } +} + +/// A helper function to easier work with isolates. +/// Starts an isolate and setups the [SendPort] and [ReceivePort] to communicate with it. +/// +/// [R] is the type of the messages that the main isolate will **receive** from the spawned isolate. +/// [S] is the type of the messages that the main isolate will **send** to the spawned isolate. +/// [P] is the type of the parameter that is passed to the spawned isolate. +Future> startIsolate({ + required Future Function(Stream receiveFromMain, void Function(R) sendToMain, P param) task, + required P param, +}) async { + final receivePort = ReceivePort(); + final isolate = await Isolate.spawn( + (param) => _isolateRunner(param), + _IsolateParam(receivePort.sendPort, task, param), + ); + + final receiveFromIsolateController = StreamController(); + final sendToIsolateCompleter = Completer(); + receivePort.listen((message) { + switch (message) { + case R(): + receiveFromIsolateController.add(message); + break; + case SendPort(): + sendToIsolateCompleter.complete(message); + break; + default: + print('Unexpected type when receiving message from isolate: "$message" that has type <${message.runtimeType}> but only <$R> is expected.'); + } + }); + final sendToIsolate = await sendToIsolateCompleter.future; + + // Callback to signal that the [SendPort] is ready + sendToIsolate.send(_SendToIsolateReceived()); + + return IsolateConnector._( + receiveFromIsolateController.stream.asBroadcastStream(), + sendToIsolate, + isolate, + ); +} + +class _IsolateParam { + /// The [SendPort] to send messages to the main isolate. + final SendPort _sendToMain; + + /// The task that the isolate will run. + final Future Function(Stream receiveFromMain, void Function(R) sendToMain, P param) task; + + /// The parameter that is passed to the task. + final P param; + + _IsolateParam(this._sendToMain, this.task, this.param); +} + +/// A message that is sent to the isolate to signal that the [SendPort] is ready. +class _SendToIsolateReceived {} + +Future _isolateRunner(_IsolateParam params) async { + final receivePort = ReceivePort(); + + // Send to the main isolate the [SendPort]. + // This will complete the [sendToIsolateCompleter]. + params._sendToMain.send(receivePort.sendPort); + + final receiveFromMainController = StreamController(); + final setupFinished = Completer(); + receivePort.listen((message) { + switch (message) { + case S(): + receiveFromMainController.add(message); + break; + case _SendToIsolateReceived(): + setupFinished.complete(); + break; + default: + print( + 'Unexpected type when receiving message from main isolate: "$message" that has type <${message.runtimeType}> but only <$S> is expected.', + ); + } + }); + + await setupFinished.future; + + await params.task( + receiveFromMainController.stream, + (data) => params._sendToMain.send(data), + params.param, + ); +} diff --git a/common/lib/util/logger.dart b/common/lib/util/logger.dart new file mode 100644 index 0000000..0b50dbd --- /dev/null +++ b/common/lib/util/logger.dart @@ -0,0 +1,19 @@ +import 'package:logging/logging.dart'; + +void initLogger(Level level) { + Logger.root.level = level; + Logger.root.onRecord.listen((record) { + // ignore: avoid_print + print('${record.time} ${'[${record.level.name}]'.padLeft(9)} [${record.loggerName}] ${record.message}'); + + if (record.error != null) { + // ignore: avoid_print + print(record.error); + } + + if (record.stackTrace != null) { + // ignore: avoid_print + print(record.stackTrace); + } + }); +} diff --git a/common/lib/util/network_interfaces.dart b/common/lib/util/network_interfaces.dart new file mode 100644 index 0000000..bcf143e --- /dev/null +++ b/common/lib/util/network_interfaces.dart @@ -0,0 +1,68 @@ +import 'dart:io'; + +import 'package:logging/logging.dart'; + +final _logger = Logger('NetworkInterface'); + +/// Returns a list of network interfaces respecting the whitelist and blacklist. +Future> getNetworkInterfaces({ + required List? whitelist, + required List? blacklist, +}) async { + final result = []; + final digestedWhitelist = whitelist?.map(buildRegExpFromIpFilter).toList(); + final digestedBlacklist = blacklist?.map(buildRegExpFromIpFilter).toList(); + + for (final interface in await NetworkInterface.list()) { + if (isNetworkIgnored( + networkWhitelist: digestedWhitelist, + networkBlacklist: digestedBlacklist, + interface: interface.addresses.map((a) => a.address).toList(), + )) { + _logger.info('Ignore network interface ${interface.name} (${interface.addresses.map((a) => a.address).toList()})'); + continue; + } + result.add(interface); + } + + return result; +} + +/// Returns true if the given IP should be ignored. +/// - When the IP is not in the whitelist (if the whitelist is not null) +/// - When the IP is in the blacklist (if the blacklist is not null) +bool isNetworkIgnoredRaw({ + required List? networkWhitelist, + required List? networkBlacklist, + required List interface, +}) { + return isNetworkIgnored( + networkWhitelist: networkWhitelist?.map(buildRegExpFromIpFilter).toList(), + networkBlacklist: networkBlacklist?.map(buildRegExpFromIpFilter).toList(), + interface: interface, + ); +} + +/// Builds a regular expression from the given IP. +/// - '123.123.124.*' -> '^123\.123\.124\.[^.]+$' +/// - '1::1:*:3' -> '^1::1:[^.]+:3$' +RegExp buildRegExpFromIpFilter(String ip) { + return RegExp('^${ip.replaceAll('.', '\\.').replaceAll('*', '[^.]+')}\$'); +} + +/// Returns true if the given IP should be ignored. +/// - When the IP is not in the whitelist (if the whitelist is not null) +/// - When the IP is in the blacklist (if the blacklist is not null) +bool isNetworkIgnored({ + required List? networkWhitelist, + required List? networkBlacklist, + required List interface, +}) { + if (networkWhitelist != null && !interface.any((a) => networkWhitelist.any((w) => w.hasMatch(a)))) { + return true; + } + if (networkBlacklist != null && interface.any((a) => networkBlacklist.any((b) => b.hasMatch(a)))) { + return true; + } + return false; +} diff --git a/common/lib/util/sleep.dart b/common/lib/util/sleep.dart new file mode 100644 index 0000000..ba783a7 --- /dev/null +++ b/common/lib/util/sleep.dart @@ -0,0 +1,3 @@ +Future sleepAsync(int millis) { + return Future.delayed(Duration(milliseconds: millis), () {}); +} diff --git a/common/lib/util/stream.dart b/common/lib/util/stream.dart new file mode 100644 index 0000000..5953762 --- /dev/null +++ b/common/lib/util/stream.dart @@ -0,0 +1,21 @@ +import 'dart:async'; + +extension StreamExt on Stream { + (StreamController, StreamSubscription) digested() { + late StreamSubscription subscription; + final streamController = StreamController( + onListen: () => subscription.resume(), + onPause: () => subscription.pause(), + onResume: () => subscription.resume(), + onCancel: () async => await subscription.cancel(), + ); + + subscription = listen( + (data) => streamController.add(data), + onError: (e, st) => streamController.addError(e, st), + onDone: () async => await streamController.close(), + ); + + return (streamController, subscription); + } +} diff --git a/common/lib/util/task_runner.dart b/common/lib/util/task_runner.dart new file mode 100644 index 0000000..a08cbf1 --- /dev/null +++ b/common/lib/util/task_runner.dart @@ -0,0 +1,69 @@ +import 'dart:async'; +import 'dart:collection'; + +typedef FutureFunction = Future Function(); + +class TaskRunner { + final StreamController _streamController = StreamController(); + final Queue> _queue; + + final int concurrency; + int _runnerCount = 0; + bool _stopped = false; + + /// If [true], then the stream will be closed as soon as every task has been finished. + /// By default, it is [false] when [initialTasks] is provided with a non-empty list. + final bool _stayAlive; + + final void Function()? onFinish; + + TaskRunner({ + required this.concurrency, + List>? initialTasks, + bool? stayAlive, + this.onFinish, + }) : _queue = Queue()..addAll(initialTasks ?? []), + _stayAlive = stayAlive ?? initialTasks == null || initialTasks.isEmpty { + _fireRunners(); + } + + void addAll(Iterable> iterable) { + _queue.addAll(iterable); + _fireRunners(); + } + + void stop() { + _stopped = true; + } + + Stream get stream => _streamController.stream; + + /// Starts multiple runners until [concurrency]. + void _fireRunners() { + while (_queue.isNotEmpty && _runnerCount < concurrency && !_streamController.isClosed) { + _runnerCount++; + + unawaited( + _runner( + onFinish: () { + _runnerCount--; + if (_stopped || (_runnerCount == 0 && !_stayAlive)) { + // ignore: discarded_futures + _streamController.close(); + onFinish?.call(); + } + }, + ), + ); + } + } + + /// Processes the queue one by one. + Future _runner({required void Function() onFinish}) async { + while (_queue.isNotEmpty) { + final task = _queue.removeFirst(); + _streamController.add(await task()); + } + onFinish(); + } +} diff --git a/common/pubspec.yaml b/common/pubspec.yaml new file mode 100644 index 0000000..d55d742 --- /dev/null +++ b/common/pubspec.yaml @@ -0,0 +1,21 @@ +name: common +description: Common code used by the app and by the cli. +version: 1.0.0 +publish_to: "none" + +environment: + sdk: ^3.5.0 + +dependencies: + collection: ^1.17.2 # allow newer versions, so it can compile with newer Flutter versions + dart_mappable: ^4.2.0 + logging: ^1.2.0 + meta: ^1.9.1 + mime: ^2.0.0 + refena: ^3.1.0 + +dev_dependencies: + build_runner: ^2.4.7 + dart_mappable_builder: ^4.2.0 + lints: ^2.0.0 + test: ^1.21.0 diff --git a/common/test/unit/model/device_test.dart b/common/test/unit/model/device_test.dart new file mode 100644 index 0000000..6d08fd9 --- /dev/null +++ b/common/test/unit/model/device_test.dart @@ -0,0 +1,60 @@ +import 'package:common/model/device.dart'; +import 'package:test/test.dart'; + +void main() { + test('Should not have duplicate DiscoveryMethod', () { + final set = {}; + + set.add(MulticastDiscovery()); + + expect(set, hasLength(1)); + + set.add(MulticastDiscovery()); + + expect(set, hasLength(1)); + + set.add(HttpDiscovery(ip: 'a')); + + expect(set, hasLength(2)); + expect(set, contains(MulticastDiscovery())); + expect(set, contains(HttpDiscovery(ip: 'a'))); + + set.add(HttpDiscovery(ip: 'a')); + + expect(set, hasLength(2)); + expect(set, contains(MulticastDiscovery())); + expect(set, contains(HttpDiscovery(ip: 'a'))); + + set.add(HttpDiscovery(ip: 'b')); + + expect(set, hasLength(3)); + expect(set, contains(MulticastDiscovery())); + expect(set, contains(HttpDiscovery(ip: 'a'))); + expect(set, contains(HttpDiscovery(ip: 'b'))); + + set.add(SignalingDiscovery(signalingServer: 'sa')); + + expect(set, hasLength(4)); + expect(set, contains(MulticastDiscovery())); + expect(set, contains(HttpDiscovery(ip: 'a'))); + expect(set, contains(HttpDiscovery(ip: 'b'))); + expect(set, contains(SignalingDiscovery(signalingServer: 'sa'))); + + set.add(SignalingDiscovery(signalingServer: 'sa')); + + expect(set, hasLength(4)); + expect(set, contains(MulticastDiscovery())); + expect(set, contains(HttpDiscovery(ip: 'a'))); + expect(set, contains(HttpDiscovery(ip: 'b'))); + expect(set, contains(SignalingDiscovery(signalingServer: 'sa'))); + + set.add(SignalingDiscovery(signalingServer: 'sb')); + + expect(set, hasLength(5)); + expect(set, contains(MulticastDiscovery())); + expect(set, contains(HttpDiscovery(ip: 'a'))); + expect(set, contains(HttpDiscovery(ip: 'b'))); + expect(set, contains(SignalingDiscovery(signalingServer: 'sa'))); + expect(set, contains(SignalingDiscovery(signalingServer: 'sb'))); + }); +} diff --git a/common/test/unit/util/network_interfaces_test.dart b/common/test/unit/util/network_interfaces_test.dart new file mode 100644 index 0000000..563e571 --- /dev/null +++ b/common/test/unit/util/network_interfaces_test.dart @@ -0,0 +1,49 @@ +import 'package:common/util/network_interfaces.dart'; +import 'package:test/test.dart'; + +void main() { + test('Should allow any IP', () { + ignored(String ip) => isNetworkIgnoredRaw(networkWhitelist: null, networkBlacklist: null, interface: [ip]); + + expect(ignored('1.2.3.4'), false); + expect(ignored('1::1'), false); + }); + + test('Should only allow explicit whitelisted IP', () { + ignored(String ip) => isNetworkIgnoredRaw(networkWhitelist: ['2.2.2.3'], networkBlacklist: null, interface: [ip]); + + expect(ignored('2.2.2.2'), true); + expect(ignored('2.2.2.3'), false); + }); + + test('Should allow wildcard whitelisted IP', () { + ignored(String ip) => isNetworkIgnoredRaw(networkWhitelist: ['3.3.3.*'], networkBlacklist: null, interface: [ip]); + + expect(ignored('3.3.3.1'), false); + expect(ignored('3.3.3.2'), false); + expect(ignored('3.3.4.3'), true); + }); + + test('Should allow wildcard whitelisted ipv6', () { + ignored(String ip) => isNetworkIgnoredRaw(networkWhitelist: ['1::1:*'], networkBlacklist: null, interface: [ip]); + + expect(ignored('1::1:1'), false); + expect(ignored('1::1:2'), false); + expect(ignored('1::2:1'), true); + }); + + test('Should ignore explicit blacklisted IP', () { + ignored(String ip) => isNetworkIgnoredRaw(networkWhitelist: null, networkBlacklist: ['3.3.3.4'], interface: [ip]); + + expect(ignored('3.3.3.3'), false); + expect(ignored('3.3.3.4'), true); + }); + + test('Should ignore wildcard blacklisted IP', () { + ignored(String ip) => isNetworkIgnoredRaw(networkWhitelist: null, networkBlacklist: ['3.3.3.*'], interface: [ip]); + + expect(ignored('3.3.3.3'), true); + expect(ignored('3.3.3.4'), true); + expect(ignored('4.3.3.3'), false); + }); +} diff --git a/common/test/unit/util/task_runner_test.dart b/common/test/unit/util/task_runner_test.dart new file mode 100644 index 0000000..61584e1 --- /dev/null +++ b/common/test/unit/util/task_runner_test.dart @@ -0,0 +1,37 @@ +import 'package:common/util/sleep.dart'; +import 'package:common/util/task_runner.dart'; +import 'package:test/test.dart'; + +void main() { + group('TaskRunner', () { + test('should run all tasks in parallel', () async { + final results = TaskRunner( + concurrency: 10, + initialTasks: [ + for (final data in [ + [10, null], + [30, 'a'], + [20, 'b'], + [40, 'c'] + ]) + () async { + final delay = data[0] as int; + final result = data[1] as String?; + await sleepAsync(delay); + return result; + }, + ], + ).stream; + + String? finalResult; + + await results.forEach((result) { + if (finalResult == null && result != null) { + finalResult = result; + } + }); + + expect(finalResult, 'b'); + }); + }); +} diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 0000000..2f7896d --- /dev/null +++ b/core/.gitignore @@ -0,0 +1 @@ +target/ diff --git a/core/Cargo.lock b/core/Cargo.lock new file mode 100644 index 0000000..495a12c --- /dev/null +++ b/core/Cargo.lock @@ -0,0 +1,3528 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "arc-swap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d03449bb8ca2cc2ef70869af31463d1ae5ccc8fa3e334b307203fbf815207e" +dependencies = [ + "rustversion", +] + +[[package]] +name = "asn1-rs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" +dependencies = [ + "asn1-rs-derive 0.5.1", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "asn1-rs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60" +dependencies = [ + "asn1-rs-derive 0.6.0", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.2.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "ccm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae3c82e4355234767756212c570e29833699ab63e6ffd161887314cc5b43847" +dependencies = [ + "aead", + "cipher", + "ctr", + "subtle", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" +dependencies = [ + "asn1-rs 0.6.2", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der-parser" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs 0.7.1", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dtls" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f531dd7c181beaf3cebab3716afa4d0d41ab888be85232583f56bbaf07ca208a" +dependencies = [ + "aes", + "aes-gcm", + "async-trait", + "bincode", + "byteorder", + "cbc", + "ccm", + "chacha20poly1305", + "der-parser 9.0.0", + "hmac", + "log", + "p256", + "p384", + "portable-atomic", + "rand 0.9.2", + "rand_core 0.6.4", + "rcgen", + "ring", + "rustls", + "sec1", + "serde", + "sha1", + "sha2", + "thiserror 1.0.69", + "tokio", + "webrtc-util", + "x25519-dalek", + "x509-parser 0.16.0", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "interceptor" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea51375727680dc15f06e8ad90fa31df75d79dd030100e8ad60eef1c27fe2c98" +dependencies = [ + "async-trait", + "bytes", + "futures", + "log", + "portable-atomic", + "rand 0.9.2", + "rtcp", + "rtp", + "thiserror 1.0.69", + "tokio", + "waitgroup", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.180" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "localsend" +version = "0.1.0" +dependencies = [ + "anyhow", + "base64", + "bytes", + "ed25519-dalek", + "flate2", + "form_urlencoded", + "futures-util", + "http-body-util", + "hyper", + "hyper-util", + "lru", + "pem", + "percent-encoding", + "rand 0.9.2", + "reqwest", + "rsa", + "rustls", + "serde", + "serde_json", + "sha2", + "socket2 0.6.2", + "thiserror 2.0.18", + "tokio", + "tokio-rustls", + "tokio-stream", + "tokio-tungstenite", + "tracing", + "tracing-subscriber", + "tungstenite", + "uuid", + "webrtc", + "x509-parser 0.18.0", +] + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset", + "pin-utils", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "oid-registry" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" +dependencies = [ + "asn1-rs 0.6.2", +] + +[[package]] +name = "oid-registry" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" +dependencies = [ + "asn1-rs 0.7.1", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rcgen" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" +dependencies = [ + "pem", + "ring", + "rustls-pki-types", + "time", + "x509-parser 0.16.0", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "reqwest" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "mime", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 1.0.5", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rtcp" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81d30d1c4091644431c22acf9f8be6191b56805e0e977f15ca7104b4a6d6eaec" +dependencies = [ + "bytes", + "thiserror 1.0.69", + "webrtc-util", +] + +[[package]] +name = "rtp" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f126f38ea84c02480e32e547c1459a939052f74fb92117ac3eef23fdac6b023" +dependencies = [ + "bytes", + "memchr", + "portable-atomic", + "rand 0.9.2", + "serde", + "thiserror 1.0.69", + "webrtc-util", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustls" +version = "0.23.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sdp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32c374dceda16965d541c8800ce9cc4e1c14acfd661ddf7952feeedc3411e5c6" +dependencies = [ + "rand 0.9.2", + "substring", + "thiserror 1.0.69", + "url", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stun" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a512c5d501e3e3b5a4bb3e8e31462d56d54a66b95a28b8596e14422bf21c32b" +dependencies = [ + "base64", + "crc", + "lazy_static", + "md-5", + "rand 0.9.2", + "ring", + "subtle", + "thiserror 1.0.69", + "tokio", + "url", + "webrtc-util", +] + +[[package]] +name = "substring" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" +dependencies = [ + "autocfg", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9da98b7d9b7dad93488a84b8248efc35352b0b2657397d4167e7ad67e5d535e5" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc610bac2dcee56805c99642447d4c5dbde4d01f752ffea0199aee1f601dc4" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.2", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + +[[package]] +name = "turn" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ed995882f66ab94238de77c62e5e778389698ab700afa4696f4754da8f457cb" +dependencies = [ + "async-trait", + "base64", + "futures", + "log", + "md-5", + "portable-atomic", + "rand 0.9.2", + "ring", + "stun", + "thiserror 1.0.69", + "tokio", + "tokio-util", + "webrtc-util", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" +dependencies = [ + "getrandom 0.3.4", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "waitgroup" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" +dependencies = [ + "atomic-waker", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36a29fc0408b113f68cf32637857ab740edfafdf460c326cd2afaa2d84cc05dc" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.5", +] + +[[package]] +name = "webpki-roots" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webrtc" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08fd686c0920ac08f3a57eacc48e31f0e4ca1ffefba4478784606f78c14e83ad" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "dtls", + "hex", + "interceptor", + "lazy_static", + "log", + "portable-atomic", + "rand 0.9.2", + "rcgen", + "regex", + "ring", + "rtcp", + "rtp", + "sdp", + "serde", + "serde_json", + "sha2", + "smol_str", + "stun", + "thiserror 1.0.69", + "tokio", + "turn", + "unicase", + "url", + "waitgroup", + "webrtc-data", + "webrtc-ice", + "webrtc-mdns", + "webrtc-media", + "webrtc-sctp", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "webrtc-data" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "062a5438d63bb0756a221693d76cc0dd6119affee1dfdfe57abe3a2a8c8b3eea" +dependencies = [ + "bytes", + "log", + "portable-atomic", + "thiserror 1.0.69", + "tokio", + "webrtc-sctp", + "webrtc-util", +] + +[[package]] +name = "webrtc-ice" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cb13fd1a373e68addc4bba0c8ca058627518e54342583d024bdcbb8ae5d97d" +dependencies = [ + "arc-swap", + "async-trait", + "crc", + "log", + "portable-atomic", + "rand 0.9.2", + "serde", + "serde_json", + "stun", + "thiserror 1.0.69", + "tokio", + "turn", + "url", + "uuid", + "waitgroup", + "webrtc-mdns", + "webrtc-util", +] + +[[package]] +name = "webrtc-mdns" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17279a067e75df72ce923fdeb7f04cd808f6f5aa4910dc6bcb4fbe66b396ace" +dependencies = [ + "log", + "socket2 0.5.10", + "thiserror 1.0.69", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-media" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94a84c910fec0848fd5a0d8a5651e0ddbdedaf25a7d3ae3f0b15f71ac73a1773" +dependencies = [ + "byteorder", + "bytes", + "rand 0.9.2", + "rtp", + "thiserror 1.0.69", +] + +[[package]] +name = "webrtc-sctp" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f985465467d8910c1f8ac4382cd64f83b1f6a1a75021a82b221546f6fb3b856f" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "crc", + "log", + "portable-atomic", + "rand 0.9.2", + "thiserror 1.0.69", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-srtp" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d8cdc33413f1d0192670a80ce93d17cb78d57fe3a2414be30d6f6dff121123" +dependencies = [ + "aead", + "aes", + "aes-gcm", + "byteorder", + "bytes", + "ctr", + "hmac", + "log", + "rtcp", + "rtp", + "sha1", + "subtle", + "thiserror 1.0.69", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-util" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c0c7e0c8f280f2bbfae442701465777ac07adaf46ce0c5863cd58e13fe472a" +dependencies = [ + "async-trait", + "bitflags 1.3.2", + "bytes", + "ipnet", + "lazy_static", + "log", + "nix", + "portable-atomic", + "rand 0.9.2", + "thiserror 1.0.69", + "tokio", + "winapi", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core 0.6.4", + "serde", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" +dependencies = [ + "asn1-rs 0.6.2", + "data-encoding", + "der-parser 9.0.0", + "lazy_static", + "nom", + "oid-registry 0.7.1", + "ring", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "x509-parser" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3e137310115a65136898d2079f003ce33331a6c4b0d51f1531d1be082b6425" +dependencies = [ + "asn1-rs 0.7.1", + "data-encoding", + "der-parser 10.0.0", + "lazy_static", + "nom", + "oid-registry 0.8.1", + "ring", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dafd85c832c1b68bbb4ec0c72c7f6f4fc5179627d2bc7c26b30e4c0cc11e76cc" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cb7e4e8436d9db52fbd6625dbf2f45243ab84994a72882ec8227b99e72b439a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02aae0f83f69aafc94776e879363e9771d7ecbffe2c7fbb6c14c5e00dfe88439" diff --git a/core/Cargo.toml b/core/Cargo.toml new file mode 100644 index 0000000..5e4deb9 --- /dev/null +++ b/core/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "localsend" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.100" +base64 = "0.22.1" +bytes = "1.11" +ed25519-dalek = { version = "2.2", features = ["pem", "rand_core"], optional = true } +flate2 = { version = "1.1", optional = true } +form_urlencoded = { version = "1.2", optional = true } +futures-util = { version = "0.3.31", features = ["sink"] } +http-body-util = { version = "0.1.3", optional = true } +hyper = { version = "1.8.1", optional = true } +hyper-util = { version = "0.1.19", features = ["server"], optional = true } +lru = "0.16.3" +pem = { version = "3.0.6", optional = true } +percent-encoding = { version = "2.3", optional = true } +reqwest = { version = "0.13.1", features = ["charset", "http2", "system-proxy", "json", "rustls-no-provider", "stream", "webpki-roots"], default-features = false, optional = true } +rand = "0.9.1" +rsa = { version = "0.9.8", optional = true } +rustls = { version = "0.23.32", default-features = false, features = ["ring", "tls12", "std"], optional = true } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +sha2 = { version = "0.10.9", optional = true } +socket2 = { version = "0.6.2", optional = true } +thiserror = "2.0.18" +tokio = { version = "1.49.0", features = ["full"] } +tokio-rustls = { version = "0.26.4", default-features = false, features = ["ring", "tls12"], optional = true } +tokio-stream = "0.1.18" +tokio-tungstenite = { version = "0.28.0", features = ["rustls-tls-webpki-roots"], optional = true } +tracing = "0.1.44" +tracing-subscriber = { version = "0.3.20" } +tungstenite = "0.28.0" +uuid = { version = "1.20.0", features = ["serde", "v4"] } +webrtc = { version = "0.14.0", optional = true } +x509-parser = { version = "0.18.0", features = ["verify"], optional = true } + +[features] +default = [] +crypto = ["ed25519-dalek", "rsa", "sha2"] +http = ["crypto", "form_urlencoded", "http-body-util", "hyper", "hyper-util", "pem", "percent-encoding", "reqwest", "rustls", "socket2", "tokio-rustls", "x509-parser"] +webrtc-signaling = ["tokio-tungstenite"] +webrtc = ["crypto", "flate2", "dep:webrtc", "webrtc-signaling", "x509-parser"] +full = ["crypto", "http", "webrtc"] diff --git a/core/assets/web/error-403.html b/core/assets/web/error-403.html new file mode 100644 index 0000000..69922bf --- /dev/null +++ b/core/assets/web/error-403.html @@ -0,0 +1,11 @@ + + + + + LocalSend + + +

403 Forbidden

+

You don't have permission to access this resource.

+ + diff --git a/core/assets/web/index.html b/core/assets/web/index.html new file mode 100644 index 0000000..974ea94 --- /dev/null +++ b/core/assets/web/index.html @@ -0,0 +1,98 @@ + + + + + + LocalSend + + + + + + +

LocalSend

+

+
+
+ + diff --git a/core/assets/web/main.js b/core/assets/web/main.js new file mode 100644 index 0000000..db5481d --- /dev/null +++ b/core/assets/web/main.js @@ -0,0 +1,178 @@ +// IMPORTANT: This script works in Internet Explorer 8! + +var BASE_URL = '/api/localsend/v2'; + +var i18n = {}; +var sessionId = sessionStorage.getItem('sessionId'); +var queryParams = location.search.slice(1).split('&'); +var queryPin = null; + +// Parse query parameters manually for IE +for (var i = 0; i < queryParams.length; i++) { + var pair = queryParams[i].split('='); + if (pair[0] === 'pin') { + queryPin = decodeURIComponent(pair[1]); + break; + } +} + +function firstRequestFiles() { + document.getElementById('status-text').innerText = i18n.waiting; + var initialUrl = BASE_URL + '/prepare-download'; + + if (sessionId) { + initialUrl += '?sessionId=' + encodeURIComponent(sessionId); + if (queryPin) { + initialUrl += '&pin=' + encodeURIComponent(queryPin); + } + } else if (queryPin) { + initialUrl += '?pin=' + encodeURIComponent(queryPin); + } + + makeRequest(initialUrl, 'POST', function (response) { + if (response.status === 401) { + pinRequestFiles(true); + return; + } + + if (response.status === 403) { + document.getElementById('status-text').innerText = i18n.rejected; + return; + } + + if (response.status === 429) { + document.getElementById('status-text').innerText = i18n.tooManyAttempts; + return; + } + + if (response.status !== 200) { + document.getElementById('status-text').innerText = 'Error: ' + response.status; + return; + } + + handleSuccess(response); + }); +} + +function pinRequestFiles(firstAttempt) { + var pin = prompt(i18n.enterPin + (firstAttempt ? '' : '\n' + i18n.invalidPin)); + if (!pin) { + document.getElementById('status-text').innerText = i18n.invalidPin; + return; + } + + makeRequest(BASE_URL + '/prepare-download?pin=' + encodeURIComponent(pin), 'POST', function (response) { + if (response.status === 401) { + pinRequestFiles(false); + return; + } + + if (response.status === 403) { + document.getElementById('status-text').innerText = i18n.rejected; + return; + } + + if (response.status === 429) { + document.getElementById('status-text').innerText = i18n.tooManyAttempts; + return; + } + + if (response.status !== 200) { + document.getElementById('status-text').innerText = 'Error: ' + response.status; + return; + } + + handleSuccess(response); + }); +} + +function makeRequest(url, method, callback) { + var xhr = new XMLHttpRequest(); + xhr.open(method, url, true); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + callback(xhr); + } + }; + xhr.send(); +} + +function fetchI18n(then) { + makeRequest('/i18n.json', 'GET', function (response) { + if (response.status === 200) { + i18n = JSON.parse(response.responseText); + then(); + } + }); +} + +function init() { + fetchI18n(firstRequestFiles); +} + +function handleSuccess(response) { + var data = JSON.parse(response.responseText); + var files = data.files; + sessionId = data.sessionId; + sessionStorage.setItem('sessionId', sessionId); + + document.getElementById('status-text').innerText = i18n.files + ' (' + getKeys(data.files).length + ')'; + + // Handling file display + handleFilesDisplay(files, sessionId); +} + +function handleFilesDisplay(files, sessionId) { + var html= ''; + var fileKeys = getKeys(files); + for (var i = 0; i < fileKeys.length; i++) { + var file = files[fileKeys[i]]; + html += '
' + + '
' + (i + 1) + '
' + + '
' + escapeHtml(file.fileName) + '
' + + '
' + formatBytes(file.size) + '
' + + '
'; + } + + if (fileKeys.length === 1) { + document.getElementById('single-file').innerHTML = html; + } else { + document.getElementById('file-list').innerHTML = html; + } +} + +function escapeHtml(text) { + if (text === null || text === undefined) { + return ''; + } + var map = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + return String(text).replace(/[&<>"']/g, function(m) { return map[m]; }); +} + +function formatBytes(bytes) { + if (bytes < 1024) { + return bytes + ' B'; + } else if (bytes < 1024 * 1024) { + return (bytes / 1024).toFixed(1) + ' KB'; + } else if (bytes < 1024 * 1024 * 1024) { + return (bytes / (1024 * 1024)).toFixed(1) + ' MB'; + } else { + return (bytes / (1024 * 1024 * 1024)).toFixed(1) + ' GB'; + } +} + +function getKeys(obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + } + return keys; +} + +init(); diff --git a/core/src/crypto/cert.rs b/core/src/crypto/cert.rs new file mode 100644 index 0000000..10c5d6b --- /dev/null +++ b/core/src/crypto/cert.rs @@ -0,0 +1,188 @@ +use std::io::Cursor; +use x509_parser::asn1_rs::FromDer; +use x509_parser::certificate::X509Certificate; +use x509_parser::pem::Pem; +use x509_parser::x509::SubjectPublicKeyInfo; + +pub fn verify_cert_from_pem(cert: String, public_key: Option<&str>) -> anyhow::Result<()> { + let (cert_pem, _) = Pem::read(Cursor::new(cert.into_bytes()))?; + let parsed_cert: X509Certificate = cert_pem.parse_x509()?; + + verify_cert_from_cert(parsed_cert, public_key) +} + +pub fn verify_cert_from_der(cert: &[u8], public_key: Option<&str>) -> anyhow::Result<()> { + let (_, parsed_cert) = X509Certificate::from_der(&cert)?; + + verify_cert_from_cert(parsed_cert, public_key) +} + +/// Verifies if the certificate is valid +/// - according to the signature +/// - according to the time validity +/// - according to the public key (if provided) +fn verify_cert_from_cert(cert: X509Certificate, public_key: Option<&str>) -> anyhow::Result<()> { + if !cert.validity.is_valid() { + return Err(anyhow::anyhow!("Time validity error")); + } + + if let Some(public_key) = public_key { + let cert_public_key = cert.tbs_certificate.subject_pki.parsed()?; + + let (public_key_pem, _) = Pem::read(Cursor::new(public_key.as_bytes()))?; + let (_, public_key_spki) = SubjectPublicKeyInfo::from_der(&public_key_pem.contents)?; + let expected_public_key = public_key_spki.parsed()?; + + if cert_public_key != expected_public_key { + // We catch public key mismatch separately from signature verification + // so that we can better unit test the function + return Err(anyhow::anyhow!("Public key mismatch")); + } + } + + cert.verify_signature(None)?; + + Ok(()) +} + +pub fn public_key_from_cert_pem(cert: String) -> anyhow::Result { + let (cert_pem, _) = Pem::read(Cursor::new(cert.into_bytes()))?; + let parsed_cert: X509Certificate = cert_pem.parse_x509()?; + public_key_from_cert(parsed_cert) +} + +/// Extracts the public key from the certificate which is in DER format. +/// Encodes the public key in PEM format. +pub fn public_key_from_cert_der(cert: &[u8]) -> anyhow::Result { + let (_, parsed_cert) = X509Certificate::from_der(&cert)?; + public_key_from_cert(parsed_cert) +} + +/// Extracts the public key from the certificate. +/// Encodes the public key in PEM format. +pub fn public_key_from_cert(cert: X509Certificate) -> anyhow::Result { + let cert_public_key = cert.tbs_certificate.subject_pki.raw; + let public_key = pem::encode(&pem::Pem::new("PUBLIC KEY", cert_public_key.to_vec())); + Ok(public_key) +} + +#[cfg(test)] +mod tests { + use super::*; + + static PUBLIC_KEY: &str = "-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi9uDMYRn63SZtEPGRogZ +Gdu5XXBAoQeMO60mycoinqLKDWyZdpMo+XWY3wYVhoAyxgzDOcPjIf+Uq1oEy/0K +4WwfpbK8SCy851qgYkfMCT9D9mFvXwWoULJCUHFF7f947ArDE1nmuK1nNx2RodN2 +wJCXyzPjw0jn06bwGeg0EqfUC8wvW4FTZ6t1tErzmRqRdMUWuCJwsk1IMbDbFePh +iK5jecOBG0RVVWLuw+TkuX8TUgrpIktH2+qEM1KdLyAMnL71hx2wMvE+lDKFKK9p +37zXK8omjl+VgTC8ocjGeYDDsl43ZtW09V0pb7Vz2FM8b7BgM06kvJl48PIe5puY +bQIDAQAB +-----END PUBLIC KEY-----"; + + #[test] + fn test_verify_cert() { + let cert = "-----BEGIN CERTIFICATE----- +MIIDGTCCAgGgAwIBAgIBATANBgkqhkiG9w0BAQsFADBQMRcwFQYDVQQDEw5Mb2Nh +bFNlbmQgVXNlcjEJMAcGA1UEChMAMQkwBwYDVQQLEwAxCTAHBgNVBAcTADEJMAcG +A1UECBMAMQkwBwYDVQQGEwAwHhcNMjUwMjA5MDAwMzE0WhcNMzUwMjA3MDAwMzE0 +WjBQMRcwFQYDVQQDEw5Mb2NhbFNlbmQgVXNlcjEJMAcGA1UEChMAMQkwBwYDVQQL +EwAxCTAHBgNVBAcTADEJMAcGA1UECBMAMQkwBwYDVQQGEwAwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCL24MxhGfrdJm0Q8ZGiBkZ27ldcEChB4w7rSbJ +yiKeosoNbJl2kyj5dZjfBhWGgDLGDMM5w+Mh/5SrWgTL/QrhbB+lsrxILLznWqBi +R8wJP0P2YW9fBahQskJQcUXt/3jsCsMTWea4rWc3HZGh03bAkJfLM+PDSOfTpvAZ +6DQSp9QLzC9bgVNnq3W0SvOZGpF0xRa4InCyTUgxsNsV4+GIrmN5w4EbRFVVYu7D +5OS5fxNSCukiS0fb6oQzUp0vIAycvvWHHbAy8T6UMoUor2nfvNcryiaOX5WBMLyh +yMZ5gMOyXjdm1bT1XSlvtXPYUzxvsGAzTqS8mXjw8h7mm5htAgMBAAEwDQYJKoZI +hvcNAQELBQADggEBABZ+I7D6wkeSrsi1NBLP2zoZ5oGh+INNcGTravfOQHs4Fbas +/CysaUYjsD3fmaDh4MxgWEqAmWnnBiojfpGX2SGuFqRBKyT9DgitBt0L7Ezg1k3h +bfSiFW4hXWp75grVO8xfML7ZcWMlhKrOsOMUGiy1qs3qsyJ3w7B2Tz78HhXGO5dd +jyPmZarhixKO92UpEvKGxjO0E/3UUNUzxKTAAgFfhKpuwHUgIijM/EppZtA8OcSh +fEztiV0xKfcPVx4d6dqRt/NMElK1Ivw2vUuxTymphZkkFOzht9m73/kyKaeFp8Ij +VRus1zGVD8IVpIdPMyz01WJyS7M0fWaHXKWo+Bo= +-----END CERTIFICATE-----" + .to_string(); + assert_eq!( + verify_cert_from_pem(cert, Some(PUBLIC_KEY)).map_err(|e| e.to_string()), + Ok(()) + ); + + let cert_invalid_signature = "-----BEGIN CERTIFICATE----- +MIIDGTCCAgGgAwIBAgIBATANBgkqhkiG9w0BAQsFADBQMRcwFQYDVQQDEw5Mb2Nh +bFNlbmQgVXNlcjEJMAcGA1UEChMAMQkwBwYDVQQLEwAxCTAHBgNVBAcTADEJMAcG +A1UECBMAMQkwBwYDVQQGEwAwHhcNMjUwMjA5MDAwMzE0WhcNMzUwMjA3MDAwMzE0 +WjBQMRcwFQYDVQQDEw5Mb2NhbFNlbmQgVXNlcjEJMAcGA1UEChMAMQkwBwYDVQQL +EwAxCTAHBgNVBAcTADEJMAcGA1UECBMAMQkwBwYDVQQGEwAwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCL24MxhGfrdJm0Q8ZGiBkZ27ldcEChB4w7rSbJ +yiKeosoNbJl2kyj5dZjfBhWGgDLGDMM5w+Mh/5SrWgTL/QrhbB+lsrxILLznWqBi +R8wJP0P2YW9fBahQskJQcUXt/3jsCsMTWea4rWc3HZGh03bAkJfLM+PDSOfTpvAZ +6DQSp9QLzC9bgVNnq3W0SvOZGpF0xRa4InCyTUgxsNsV4+GIrmN5w4EbRFVVYu7D +5OS5fxNSCukiS0fb6oQzUp0vIAycvvWHHbAy8T6UMoUor2nfvNcryiaOX5WBMLyh +yMZ5gMOyXjdm1bT1XSlvtXPYUzxvsGAzTqS8mXjw8h7mm5htAgMBAAEwDQYJKoZI +hvcNAQELBQADggEBABZ+I7D6wkeSrsi1NBLP2zoZ5oGh+INNcGTravfOQHs4Fbas +/CysaUYjsD3fmaDh4MxgWEqAmWnnBiojfpGX2SGuFqRBKyT9DgitBt0L7Ezg1k3h +bfSiFW4hXWp75grVO8xfML7ZcWMlhKrOsOMUGiy1qs3qsyJ3w7B2Tz78HhXGO5dd +jyPmZarhixKO92UpEvKGxjO0E/3UUNUzxKTAAgFfhKpuwHUgIijM/EppZtA8OcSh +fEztiV0xKfcPVx4d6dqRt/NMElK1Ivw2vUuxTymphZkkFOzht9m73/kyKaeFp8Ij +VRus1zGVD8IVpIdPMyz01WJySwAAAAAAAAAAAAA= +-----END CERTIFICATE-----" + .to_string(); + assert_eq!( + verify_cert_from_pem(cert_invalid_signature, Some(PUBLIC_KEY)) + .map_err(|e| e.to_string()), + Err("signature verification error".to_string()) + ); + + let cert_invalid_public_key = "-----BEGIN CERTIFICATE----- +MIIDGTCCAgGgAwIBAgIBATANBgkqhkiG9w0BAQsFADBQMRcwFQYDVQQDEw5Mb2Nh +bFNlbmQgVXNlcjEJMAcGA1UEChMAMQkwBwYDVQQLEwAxCTAHBgNVBAcTADEJMAcG +A1UECBMAMQkwBwYDVQQGEwAwHhcNMjUwMjA5MDI1ODQxWhcNMzUwMjA3MDI1ODQx +WjBQMRcwFQYDVQQDEw5Mb2NhbFNlbmQgVXNlcjEJMAcGA1UEChMAMQkwBwYDVQQL +EwAxCTAHBgNVBAcTADEJMAcGA1UECBMAMQkwBwYDVQQGEwAwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCnrVjQQ0mAfBaucJd5rbZX9usLROwHDuXdczFq +XJhb8pPjEF18FoDHzobjz5JWq+GDkBmcg0k6+AeETGQEaJisZDBWH7NOjJahGGnQ +0okw1iVUoEpQ26ZSFkr3H5NNtGAa6EkS4xb0bsEDb3vs69zRvFyrVd6OEqmdsRy3 +aU2AvAMoLthgY8bUZ/XyWpbA8euV3VjkRSHsju+DOQH4oj46ZITJ3M2/x5o/3jqJ +ILBhoLcu7UJJTHYqeBsPSTkMIGKLkYSUPOd/mSgwQB854wks4nf+hO4VWvKQFx9X +4gIjS7vJ6e9rQOn2NFfluPbRiijmWIiwUDUWz3UW2RS0b6gDAgMBAAEwDQYJKoZI +hvcNAQELBQADggEBAAO3rG2YcQqH8Z7jDX82q0nn/bglOWvTySv4EP3FNrVPZKfN +aR+oLo8WdAWulbxXDIOK7XLk1V9SxEJvVxOTp2EIgcoWqJANoWjp+5nNInE02eNX +G8euvPvh+p/1cTbHxhrZqtsSpkAx1AbbbcvT+5hUUDXSU7cMN+vFjUqkEVrBlj7S +vFbLDHP82ywisZrkOfNapxV67U4ENaEwJ4P4OERnqOOieJr0elv598cSDu+OSKmt +rFNYYHERELX36g4+KcWGN223Pg4Xl0bFYqV0xwRUThh0657t8cioXaOsjjpKnGAm +eVVihnrJ3sdk7nnreAYMse/OipyufRyZ9t3WU8A= +-----END CERTIFICATE-----" + .to_string(); + assert_eq!( + verify_cert_from_pem(cert_invalid_public_key, Some(PUBLIC_KEY)) + .map_err(|e| e.to_string()), + Err("Public key mismatch".to_string()) + ); + + let cert_expired = "-----BEGIN CERTIFICATE----- +MIIDGTCCAgGgAwIBAgIBATANBgkqhkiG9w0BAQsFADBQMRcwFQYDVQQDEw5Mb2Nh +bFNlbmQgVXNlcjEJMAcGA1UEChMAMQkwBwYDVQQLEwAxCTAHBgNVBAcTADEJMAcG +A1UECBMAMQkwBwYDVQQGEwAwHhcNMjUwMjA5MjEwOTQ0WhcNMjUwMjA5MjEwOTQ0 +WjBQMRcwFQYDVQQDEw5Mb2NhbFNlbmQgVXNlcjEJMAcGA1UEChMAMQkwBwYDVQQL +EwAxCTAHBgNVBAcTADEJMAcGA1UECBMAMQkwBwYDVQQGEwAwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCL24MxhGfrdJm0Q8ZGiBkZ27ldcEChB4w7rSbJ +yiKeosoNbJl2kyj5dZjfBhWGgDLGDMM5w+Mh/5SrWgTL/QrhbB+lsrxILLznWqBi +R8wJP0P2YW9fBahQskJQcUXt/3jsCsMTWea4rWc3HZGh03bAkJfLM+PDSOfTpvAZ +6DQSp9QLzC9bgVNnq3W0SvOZGpF0xRa4InCyTUgxsNsV4+GIrmN5w4EbRFVVYu7D +5OS5fxNSCukiS0fb6oQzUp0vIAycvvWHHbAy8T6UMoUor2nfvNcryiaOX5WBMLyh +yMZ5gMOyXjdm1bT1XSlvtXPYUzxvsGAzTqS8mXjw8h7mm5htAgMBAAEwDQYJKoZI +hvcNAQELBQADggEBAH2/F6iEH8W5gIHcKJ6/EbrG2BY5Uhg5U8X6yPk6z9ctmY6w +n7fDT749PMVDJq+qhIcnoBlUgVJdJ2qFa5h3VaSF+tUFu/CImr+S8TYHCdQGYXA5 +6b/pnHmbrWqZdNdxs6Y80A9Mu+iNeLDcrTo60/zGfJsiD9Cnlj0Q6c8nn+Obzeqq +iIwUmPFw0krH+ku/DlSenKnyL8jaktf48neufu0jObUvCuj62I2WlFZwzXd8CnDR +X2/mKq6FWHCDR6RTh1yMLfD+NoVNcswxwMFq8ILCfBuTjNVaSFm3eUqKeEOAaDes +nidU/qXQvBJ7NPUkXXgbcgqxK735iijOqQHmKts= +-----END CERTIFICATE-----" + .to_string(); + assert_eq!( + verify_cert_from_pem(cert_expired, Some(PUBLIC_KEY)) + .map_err(|e| e.to_string()), + Err("Time validity error".to_string()) + ); + } +} diff --git a/core/src/crypto/hash.rs b/core/src/crypto/hash.rs new file mode 100644 index 0000000..7bfa671 --- /dev/null +++ b/core/src/crypto/hash.rs @@ -0,0 +1,7 @@ +use sha2::{Digest, Sha256}; + +pub fn sha256(data: &[u8]) -> Vec { + let mut hasher = Sha256::new(); + hasher.update(data); + hasher.finalize().to_vec() +} diff --git a/core/src/crypto/mod.rs b/core/src/crypto/mod.rs new file mode 100644 index 0000000..d6e7ef6 --- /dev/null +++ b/core/src/crypto/mod.rs @@ -0,0 +1,4 @@ +pub mod cert; +pub mod hash; +pub mod nonce; +pub mod token; diff --git a/core/src/crypto/nonce.rs b/core/src/crypto/nonce.rs new file mode 100644 index 0000000..9b2b758 --- /dev/null +++ b/core/src/crypto/nonce.rs @@ -0,0 +1,11 @@ +use rand::RngCore; + +pub fn generate_nonce() -> Vec { + let mut nonce = vec![0; 32]; + rand::rng().fill_bytes(&mut nonce); + nonce +} + +pub fn validate_nonce(nonce: &[u8]) -> bool { + nonce.len() >= 16 && nonce.len() <= 128 +} diff --git a/core/src/crypto/token.rs b/core/src/crypto/token.rs new file mode 100644 index 0000000..bc5d74a --- /dev/null +++ b/core/src/crypto/token.rs @@ -0,0 +1,254 @@ +use crate::crypto::hash; +use crate::util; +use ed25519_dalek::ed25519::signature::rand_core::OsRng; +use ed25519_dalek::pkcs8::spki::der::pem::LineEnding; +use ed25519_dalek::pkcs8::spki::der::zeroize::Zeroizing; +use ed25519_dalek::pkcs8::{DecodePrivateKey, DecodePublicKey, EncodePrivateKey, EncodePublicKey}; +use ed25519_dalek::{Signer, Verifier}; + +pub struct SigningTokenKey { + inner: ed25519_dalek::SigningKey, +} + +impl SigningTokenKey { + pub fn to_verifying_key(&self) -> Box { + Box::new(Ed25519VerifyingKey { + inner: self.inner.verifying_key(), + }) + } +} + +pub trait VerifyingTokenKey { + fn verify(&self, msg: &[u8], signature: &[u8]) -> anyhow::Result<()>; + + fn to_der(&self) -> anyhow::Result>; + + fn signature_method(&self) -> &'static str; +} + +struct Ed25519VerifyingKey { + inner: ed25519_dalek::VerifyingKey, +} + +struct RsaPssVerifyingKey { + inner: rsa::pss::VerifyingKey, +} + +impl VerifyingTokenKey for Ed25519VerifyingKey { + fn verify(&self, msg: &[u8], signature: &[u8]) -> anyhow::Result<()> { + let signature = ed25519_dalek::Signature::from_slice(signature)?; + self.inner.verify(msg, &signature)?; + Ok(()) + } + + fn to_der(&self) -> anyhow::Result> { + Ok(self.inner.to_public_key_der()?.into_vec()) + } + + fn signature_method(&self) -> &'static str { + "ed25519" + } +} + +impl VerifyingTokenKey for RsaPssVerifyingKey { + fn verify(&self, msg: &[u8], signature: &[u8]) -> anyhow::Result<()> { + let signature = rsa::pss::Signature::try_from(signature)?; + self.inner.verify(msg, &signature)?; + Ok(()) + } + + fn to_der(&self) -> anyhow::Result> { + Ok(self.inner.to_public_key_der()?.into_vec()) + } + + fn signature_method(&self) -> &'static str { + "rsa-pss" + } +} + +pub fn generate_key() -> SigningTokenKey { + let mut csprng = OsRng; + SigningTokenKey { + inner: ed25519_dalek::SigningKey::generate(&mut csprng), + } +} + +pub fn export_private_key(key: &SigningTokenKey) -> anyhow::Result> { + let pem = key.inner.to_pkcs8_pem(LineEnding::LF)?; + Ok(pem) +} + +pub fn parse_private_key(private_key: &str) -> anyhow::Result { + let parsed = ed25519_dalek::SigningKey::from_pkcs8_pem(private_key)?; + Ok(SigningTokenKey { inner: parsed }) +} + +pub fn export_public_key(key: &SigningTokenKey) -> anyhow::Result { + let pem = key + .inner + .verifying_key() + .to_public_key_pem(LineEnding::LF)?; + Ok(pem) +} + +pub fn parse_public_key( + public_key: &str, + identifier: &str, +) -> anyhow::Result> { + Ok(match identifier { + "ed25519" => Box::new(Ed25519VerifyingKey { + inner: ed25519_dalek::VerifyingKey::from_public_key_pem(public_key)?, + }), + "rsa-pss" => Box::new(RsaPssVerifyingKey { + inner: { + let public_key = rsa::RsaPublicKey::from_public_key_pem(public_key)?; + rsa::pss::VerifyingKey::new(public_key) + }, + }), + _ => return Err(anyhow::anyhow!("Unsupported key type")), + }) +} + +pub fn generate_token_timestamp(key: &SigningTokenKey) -> anyhow::Result { + let salt = util::time::unix_timestamp_u64()?.to_le_bytes(); + let result = generate_token_nonce(key, &salt)?; + Ok(result) +} + +pub fn generate_token_nonce(key: &SigningTokenKey, salt: &[u8]) -> anyhow::Result { + let digest = { + let public_key = key.inner.verifying_key().to_public_key_der()?; + let hash_input = [public_key.as_bytes(), &salt].concat(); + hash::sha256(&hash_input) + }; + let signature = key.inner.sign(&digest); + + let hash_method = "sha256"; + let hash_base64 = util::base64::encode(&digest); + let salt_base64 = util::base64::encode(&salt); + let sign_method = "ed25519"; + let signature_base64 = util::base64::encode(signature.to_bytes()); + + let result = + format!("{hash_method}.{hash_base64}.{salt_base64}.{sign_method}.{signature_base64}"); + + Ok(result) +} + +pub fn extract_signature_identifier(token: &str) -> Option<&str> { + let parts: Vec<&str> = token.split('.').collect(); + parts.get(3).copied() +} + +pub fn verify_token_timestamp(public_key: &dyn VerifyingTokenKey, token: &str) -> bool { + verify_token_with_result(public_key, token, |salt| { + let salt = { + if salt.len() != 8 { + return Err(anyhow::anyhow!("Invalid salt length")); + } + u64::from_le_bytes( + salt.try_into() + .map_err(|_| anyhow::anyhow!("Invalid salt"))?, + ) + }; + + let now_seconds = util::time::unix_timestamp_u64()?; + if now_seconds - salt > 60 * 60 { + // Fingerprint is older than 1h, reject + return Err(anyhow::anyhow!("Fingerprint timestamp expired")); + } + + Ok(()) + }) + .is_ok() +} + +pub fn verify_token_nonce(public_key: &dyn VerifyingTokenKey, token: &str, nonce: &[u8]) -> bool { + verify_token_with_result(public_key, token, |salt| { + if salt != nonce { + return Err(anyhow::anyhow!("Invalid nonce")); + } + + Ok(()) + }) + .is_ok() +} + +pub fn verify_token_with_result( + public_key: &dyn VerifyingTokenKey, + token: &str, + verify_salt: impl Fn(&[u8]) -> anyhow::Result<()>, +) -> anyhow::Result<()> { + let parts: Vec<&str> = token.split('.').collect(); + let [hash_method, hash_base64, salt_base64, sign_method, signature_base64] = parts[0..5] else { + return Err(anyhow::anyhow!("Invalid structure")); + }; + + if hash_method != "sha256" { + return Err(anyhow::anyhow!("Invalid hash method")); + } + + if sign_method != public_key.signature_method() { + return Err(anyhow::anyhow!("Invalid sign method")); + } + + let salt = { + let salt_bytes = util::base64::decode(salt_base64)?; + verify_salt(&salt_bytes)?; + salt_bytes + }; + + let digest = { + let public_key_der = public_key.to_der()?; + let hash_input = [public_key_der.as_slice(), &salt].concat(); + hash::sha256(&hash_input) + }; + + if util::base64::encode(&digest) != hash_base64 { + return Err(anyhow::anyhow!("Hash mismatch")); + } + + let Ok(signature) = util::base64::decode(signature_base64) else { + return Err(anyhow::anyhow!("Invalid signature base64 encoding")); + }; + + public_key + .verify(&digest, &signature) + .map_err(|_| anyhow::anyhow!("Invalid signature"))?; + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_generate_key() { + let key = generate_key(); + let pem = export_private_key(&key).unwrap(); + + let parsed = parse_private_key(&pem).unwrap(); + assert_eq!(parsed.inner.as_bytes(), key.inner.as_bytes()); + } + + #[test] + fn test_sign_verify() { + let key = generate_key(); + let data = b"hello world"; + let signature = key.inner.sign(data); + let verified = key + .to_verifying_key() + .verify(data, signature.to_vec().as_ref()) + .is_ok(); + assert!(verified); + } + + #[test] + fn test_fingerprint() { + let key = generate_key(); + let fingerprint = generate_token_timestamp(&key).unwrap(); + let verified = verify_token_timestamp(&*key.to_verifying_key(), &fingerprint); + assert!(verified); + } +} diff --git a/core/src/http/client/mod.rs b/core/src/http/client/mod.rs new file mode 100644 index 0000000..4a98fb7 --- /dev/null +++ b/core/src/http/client/mod.rs @@ -0,0 +1,224 @@ +mod url; +pub mod v2; +pub mod v3; + +pub use v2::LsHttpClientV2; +pub use v3::LsHttpClientV3; + +use crate::http::StatusCodeError; +use crate::{crypto, http}; +use reqwest::Response; +use serde::{Deserialize, Serialize}; +use thiserror::Error; + +pub enum LsHttpClient { + V2(LsHttpClientV2), + V3(LsHttpClientV3), +} + +pub enum LsHttpClientVersion { + V2, + V3, +} + +#[derive(Debug, Error)] +pub enum ClientError { + #[error(transparent)] + StatusCode(StatusCodeError), + + #[error(transparent)] + Reqwest(#[from] reqwest::Error), + + #[error(transparent)] + Json(#[from] serde_json::Error), + + #[error(transparent)] + Io(#[from] std::io::Error), + + #[error(transparent)] + Other(#[from] anyhow::Error), +} + +impl LsHttpClient { + pub fn new( + private_key: &str, + cert: &str, + version: LsHttpClientVersion, + ) -> Result { + let client = match version { + LsHttpClientVersion::V2 => { + LsHttpClient::V2(LsHttpClientV2::try_new(&private_key, &cert)?) + } + LsHttpClientVersion::V3 => { + LsHttpClient::V3(LsHttpClientV3::try_new(&private_key, &cert)?) + } + }; + + Ok(client) + } + + pub async fn register( + &self, + protocol: http::dto::ProtocolType, + ip: &str, + port: u16, + payload: http::dto::RegisterDto, + ) -> Result, ClientError> { + match self { + LsHttpClient::V2(client) => { + let result = client.register(protocol, ip, port, payload.into()).await?; + Ok(ResultWithPublicKey { + public_key: result.public_key, + body: result.body.into(), + }) + } + LsHttpClient::V3(client) => client.register(protocol, ip, port, payload).await, + } + } + + pub async fn prepare_upload( + &self, + protocol: http::dto::ProtocolType, + ip: &str, + port: u16, + public_key: Option, + payload: http::dto::PrepareUploadRequestDto, + pin: Option<&str>, + ) -> Result { + match self { + LsHttpClient::V2(client) => { + let result = client + .prepare_upload(protocol, ip, port, public_key, payload.into(), pin) + .await?; + Ok(result.into()) + } + LsHttpClient::V3(client) => { + client + .prepare_upload(protocol, ip, port, public_key, payload) + .await + } + } + } + + pub async fn upload( + &self, + protocol: http::dto::ProtocolType, + ip: &str, + port: u16, + public_key: Option, + session_id: &str, + file_id: &str, + token: &str, + binary: tokio::sync::mpsc::Receiver>, + ) -> Result<(), ClientError> { + match self { + LsHttpClient::V2(client) => { + client + .upload( + protocol, ip, port, public_key, session_id, file_id, token, binary, + ) + .await + } + LsHttpClient::V3(client) => { + client + .upload( + protocol, ip, port, public_key, session_id, file_id, token, binary, + ) + .await + } + } + } + + pub async fn cancel( + &self, + protocol: http::dto::ProtocolType, + ip: &str, + port: u16, + session_id: &str, + ) -> Result<(), ClientError> { + match self { + LsHttpClient::V2(client) => client.cancel(protocol, ip, port, session_id).await, + LsHttpClient::V3(client) => client.cancel(protocol, ip, port, session_id).await, + } + } +} + +pub(super) fn create_reqwest_client( + private_key: &str, + cert: &str, +) -> Result { + let _ = rustls::crypto::ring::default_provider().install_default(); + + let identity = { + let pem = &[cert.as_bytes(), "\n".as_bytes(), private_key.as_bytes()].concat(); + reqwest::Identity::from_pem(pem)? + }; + + let client = reqwest::Client::builder() + .use_rustls_tls() + .danger_accept_invalid_certs(true) + .tls_info(true) + .identity(identity) + .build()?; + + Ok(client) +} + +/// Verifies the certificate from the response. +/// Returns the public key extracted from the certificate. +pub(super) fn verify_cert_from_res( + response: &Response, + public_key: Option, +) -> anyhow::Result { + let tls_info_ext = response + .extensions() + .get::() + .ok_or_else(|| anyhow::anyhow!("TLS info not found"))?; + let cert = tls_info_ext + .peer_certificate() + .ok_or_else(|| anyhow::anyhow!("Certificate not found"))?; + crypto::cert::verify_cert_from_der(cert, public_key.as_deref())?; + let public_key = match public_key { + Some(public_key) => public_key, + None => crypto::cert::public_key_from_cert_der(cert)?, + }; + Ok(public_key) +} + +#[derive(Serialize, Deserialize)] +struct ErrorResponse { + message: String, +} + +pub struct ResultWithPublicKey { + /// The public key extracted from the certificate. + /// Encoded in PEM format. + /// Only available in HTTPS mode. + pub public_key: Option, + + /// The response body. + pub body: T, +} + +pub(super) trait ResponseExt { + async fn into_error(self) -> Result; +} + +impl ResponseExt for Response { + async fn into_error(self) -> Result { + let status = self.status().as_u16(); + let body = self.text().await.unwrap_or_default(); + let message = match serde_json::from_str::(&body) { + Ok(error) => error.message, + Err(_) => body, + }; + Err(ClientError::StatusCode(StatusCodeError { + status, + message: if message.is_empty() { + None + } else { + Some(message) + }, + })) + } +} diff --git a/core/src/http/client/url.rs b/core/src/http/client/url.rs new file mode 100644 index 0000000..535cdde --- /dev/null +++ b/core/src/http/client/url.rs @@ -0,0 +1,95 @@ +use std::borrow::Cow; + +pub struct TargetUrl<'a> { + pub version: ApiVersion, + pub protocol: &'static str, + pub host: String, + pub port: u16, + pub path: &'static str, + + /// Query parameters as key-value pairs. + /// Note: It is expected that the caller will URL-encode the values if necessary. + pub params: &'a [(&'static str, &'a str)], +} + +pub enum ApiVersion { + V2, + V3, +} + +impl<'a> TargetUrl<'a> { + pub fn to_string(&self) -> String { + let base = format!( + "{}://{}:{}/api/localsend/{}{}", + self.protocol, + match self.host.contains(':') { + true => Cow::Owned(format!("[{}]", self.host)), // IPv6 addresses need to be enclosed in brackets + false => Cow::Borrowed(&self.host), + }, + self.port, + match self.version { + ApiVersion::V2 => "v2", + ApiVersion::V3 => "v3", + }, + self.path + ); + if self.params.is_empty() { + base + } else { + let query = self + .params + .iter() + .map(|(k, v)| format!("{}={}", k, v)) + .collect::>() + .join("&"); + format!("{}?{}", base, query) + } + } +} + +#[cfg(test)] +mod tests { + use super::{ApiVersion, TargetUrl}; + + #[test] + fn test_build_url_ipv4() { + let url = TargetUrl { + version: ApiVersion::V2, + protocol: "https", + host: "192.168.1.1".to_string(), + port: 53317, + path: "/register", + params: &[], + } + .to_string(); + assert_eq!(url, "https://192.168.1.1:53317/api/localsend/v2/register"); + } + + #[test] + fn test_build_url_ipv6() { + let url = TargetUrl { + version: ApiVersion::V2, + protocol: "https", + host: "::1".to_string(), + port: 53317, + path: "/register", + params: &[], + } + .to_string(); + assert_eq!(url, "https://[::1]:53317/api/localsend/v2/register"); + } + + #[test] + fn test_build_url_http() { + let url = TargetUrl { + version: ApiVersion::V2, + protocol: "http", + host: "192.168.1.1".to_string(), + port: 53317, + path: "/info", + params: &[], + } + .to_string(); + assert_eq!(url, "http://192.168.1.1:53317/api/localsend/v2/info"); + } +} diff --git a/core/src/http/client/v2.rs b/core/src/http/client/v2.rs new file mode 100644 index 0000000..c687df9 --- /dev/null +++ b/core/src/http/client/v2.rs @@ -0,0 +1,452 @@ +use super::{ClientError, ResponseExt, ResultWithPublicKey}; +use crate::http::client::url::{ApiVersion, TargetUrl}; +use crate::http::dto::ProtocolType; +use crate::http::dto_v2::{ + InfoResponseDtoV2, PrepareDownloadResponseDtoV2, PrepareUploadRequestDtoV2, + PrepareUploadResponseDtoV2, PrepareUploadResultV2, RegisterDtoV2, RegisterResponseDtoV2, +}; +use futures_util::StreamExt; +use reqwest::{Response, StatusCode}; +use tokio::io::AsyncWriteExt; +use tokio::sync::mpsc; +use tokio_stream::wrappers::ReceiverStream; + +/// HTTP client for LocalSend Protocol v2.1. +pub struct LsHttpClientV2 { + client: reqwest::Client, +} + +impl LsHttpClientV2 { + /// Creates a new HTTP client for v2.1 protocol. + /// + /// # Arguments + /// * `private_key` - PEM-encoded private key for client certificate + /// * `cert` - PEM-encoded certificate for client authentication + /// + /// # Returns + /// A new client instance or an error if TLS setup fails. + pub fn try_new(private_key: &str, cert: &str) -> Result { + Ok(Self { + client: super::create_reqwest_client(private_key, cert)?, + }) + } + + /// Creates a new HTTP client without TLS client certificate. + /// + /// Use this for HTTP-only connections or when client authentication is not needed. + pub fn try_new_without_cert() -> Result { + let _ = rustls::crypto::ring::default_provider().install_default(); + + let client = reqwest::Client::builder() + .use_rustls_tls() + .danger_accept_invalid_certs(true) + .tls_info(true) + .build()?; + + Ok(Self { client }) + } + + /// Registers with another device for discovery. + /// + /// POST /api/localsend/v2/register + /// + /// # Arguments + /// * `protocol` - HTTP or HTTPS + /// * `ip` - Target device IP address + /// * `port` - Target device port + /// * `payload` - Device information to register + /// + /// # Returns + /// Registration result containing the remote device info and optional public key. + pub async fn register( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + payload: RegisterDtoV2, + ) -> Result, ClientError> { + let url = TargetUrl { + version: ApiVersion::V2, + protocol: protocol.as_str(), + host: ip.to_string(), + port, + path: "/register", + params: &[], + } + .to_string(); + + let res = self + .client + .post(&url) + .header("Content-Type", "application/json") + .body(serde_json::to_string(&payload)?) + .send() + .await?; + + if res.status() != StatusCode::OK { + return res.into_error().await; + } + + let public_key = match protocol { + ProtocolType::Https => Some(super::verify_cert_from_res(&res, None)?), + _ => None, + }; + + let body = res.json::().await?; + + Ok(ResultWithPublicKey { public_key, body }) + } + + /// Prepares a file upload session with the receiver. + /// + /// POST /api/localsend/v2/prepare-upload + /// + /// The receiver will decide if this request gets accepted, partially accepted, or rejected. + /// + /// # Arguments + /// * `protocol` - HTTP or HTTPS + /// * `ip` - Receiver's IP address + /// * `port` - Receiver's port + /// * `public_key` - Expected public key for verification (HTTPS only) + /// * `payload` - Upload request with device info and file metadata + /// * `pin` - Optional PIN if required by receiver + /// + /// # Returns + /// Session ID and accepted file tokens, or an error. + /// + /// # Errors + /// * 204 - No file transfer needed (e.g. text-only transfer) + /// * 400 - Invalid body + /// * 401 - PIN required or invalid + /// * 403 - Rejected by user + /// * 409 - Blocked by another session + /// * 429 - Too many requests + /// * 500 - Unknown error + pub async fn prepare_upload( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + public_key: Option, + payload: PrepareUploadRequestDtoV2, + pin: Option<&str>, + ) -> Result { + let pin_params: &[(&'static str, &str)] = match &pin { + Some(pin) => &[("pin", pin)], + None => &[], + }; + let url = TargetUrl { + version: ApiVersion::V2, + protocol: protocol.as_str(), + host: ip.to_string(), + port, + path: "/prepare-upload", + params: pin_params, + } + .to_string(); + + let res = self + .client + .post(&url) + .header("Content-Type", "application/json") + .body(serde_json::to_string(&payload)?) + .send() + .await?; + + if protocol == ProtocolType::Https { + super::verify_cert_from_res(&res, public_key)?; + } + + let status = res.status(); + + if status.as_u16() >= 400 { + return res.into_error().await; + } + + if status == StatusCode::NO_CONTENT { + return Ok(PrepareUploadResultV2 { + status_code: status.as_u16(), + response: None, + }); + } + + let body = res.json::().await?; + + Ok(PrepareUploadResultV2 { + status_code: status.as_u16(), + response: Some(body), + }) + } + + /// Uploads a file to the receiver. + /// + /// POST /api/localsend/v2/upload?sessionId=...&fileId=...&token=... + /// + /// Use the session_id, file_id, and token from prepare_upload response. + /// This method can be called in parallel for multiple files. + /// + /// # Arguments + /// * `protocol` - HTTP or HTTPS + /// * `ip` - Receiver's IP address + /// * `port` - Receiver's port + /// * `session_id` - Session ID from prepare_upload + /// * `file_id` - File ID to upload + /// * `token` - File-specific token from prepare_upload + /// * `binary` - Channel receiving file chunks + /// + /// # Errors + /// * 400 - Missing parameters + /// * 403 - Invalid token or IP address + /// * 409 - Blocked by another session + /// * 500 - Unknown error + pub async fn upload( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + public_key: Option, + session_id: &str, + file_id: &str, + token: &str, + binary: mpsc::Receiver>, + ) -> Result<(), ClientError> { + let url = TargetUrl { + version: ApiVersion::V2, + protocol: protocol.as_str(), + host: ip.to_string(), + port, + path: "/upload", + params: &[ + ("sessionId", session_id), + ("fileId", file_id), + ("token", token), + ], + } + .to_string(); + + let stream = ReceiverStream::new(binary).map(Ok::, anyhow::Error>); + let body = reqwest::Body::wrap_stream(stream); + + let res = self.client.post(&url).body(body).send().await?; + + if protocol == ProtocolType::Https { + super::verify_cert_from_res(&res, public_key)?; + } + + if res.status() != StatusCode::OK { + return res.into_error().await; + } + + Ok(()) + } + + /// Cancels an ongoing file transfer session. + /// + /// POST /api/localsend/v2/cancel?sessionId=... + /// + /// # Arguments + /// * `protocol` - HTTP or HTTPS + /// * `ip` - Receiver's IP address + /// * `port` - Receiver's port + /// * `session_id` - Session ID to cancel + pub async fn cancel( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + session_id: &str, + ) -> Result<(), ClientError> { + let url = TargetUrl { + version: ApiVersion::V2, + protocol: protocol.as_str(), + host: ip.to_string(), + port, + path: "/cancel", + params: &[("sessionId", session_id)], + } + .to_string(); + + self.client.post(&url).send().await?; + + Ok(()) + } + + /// Gets device info from a remote device. + /// + /// GET /api/localsend/v2/info + /// + /// This is primarily for debugging purposes. + /// + /// # Arguments + /// * `protocol` - HTTP or HTTPS + /// * `ip` - Target device IP address + /// * `port` - Target device port + /// + /// # Returns + /// Device information including alias, version, device type, fingerprint, etc. + pub async fn info( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + ) -> Result { + let url = TargetUrl { + version: ApiVersion::V2, + protocol: protocol.as_str(), + host: ip.to_string(), + port, + path: "/info", + params: &[], + } + .to_string(); + + let res = self.client.get(&url).send().await?; + + if res.status() != StatusCode::OK { + return res.into_error().await; + } + + let body = res.json::().await?; + + Ok(body) + } + + /// Prepares to download files from a sender (Download API). + /// + /// POST /api/localsend/v2/prepare-download + /// + /// This is used in reverse file transfer mode where the sender hosts the files + /// and receivers download them. + /// + /// # Arguments + /// * `protocol` - HTTP or HTTPS + /// * `ip` - Sender's IP address + /// * `port` - Sender's port + /// * `session_id` - Optional existing session ID (for browser refresh scenarios) + /// * `pin` - Optional PIN if required by sender + /// + /// # Returns + /// Sender info, session ID, and available files. + /// + /// # Errors + /// * 401 - PIN required or invalid + /// * 403 - Rejected + /// * 429 - Too many requests + /// * 500 - Unknown error + pub async fn prepare_download( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + session_id: Option<&str>, + pin: Option<&str>, + ) -> Result { + let mut params: Vec<(&'static str, &str)> = Vec::new(); + if let Some(session_id) = session_id { + params.push(("sessionId", session_id)); + } + if let Some(pin) = pin { + params.push(("pin", pin)); + } + let url = TargetUrl { + version: ApiVersion::V2, + protocol: protocol.as_str(), + host: ip.to_string(), + port, + path: "/prepare-download", + params: ¶ms, + } + .to_string(); + + let res = self.client.post(&url).send().await?; + + if res.status() != StatusCode::OK { + return res.into_error().await; + } + + let body = res.json::().await?; + + Ok(body) + } + + /// Downloads a file from a sender (Download API). + /// + /// GET /api/localsend/v2/download?sessionId=...&fileId=... + /// + /// This method can be called in parallel for multiple files. + /// + /// # Arguments + /// * `protocol` - HTTP or HTTPS + /// * `ip` - Sender's IP address + /// * `port` - Sender's port + /// * `session_id` - Session ID from prepare_download + /// * `file_id` - File ID to download + /// + /// # Returns + /// Response containing the file data stream. + pub async fn download( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + session_id: &str, + file_id: &str, + ) -> Result { + let url = TargetUrl { + version: ApiVersion::V2, + protocol: protocol.as_str(), + host: ip.to_string(), + port, + path: "/download", + params: &[("sessionId", session_id), ("fileId", file_id)], + } + .to_string(); + + let res = self.client.get(&url).send().await?; + + if res.status() != StatusCode::OK { + return res.into_error().await; + } + + Ok(res) + } + + /// Downloads a file to a writer (convenience method). + /// + /// # Arguments + /// * `protocol` - HTTP or HTTPS + /// * `ip` - Sender's IP address + /// * `port` - Sender's port + /// * `session_id` - Session ID from prepare_download + /// * `file_id` - File ID to download + /// * `writer` - AsyncWrite destination for file data + /// + /// # Returns + /// Total bytes written. + pub async fn download_to_writer( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + session_id: &str, + file_id: &str, + writer: &mut W, + ) -> Result { + let response = self + .download(protocol, ip, port, session_id, file_id) + .await?; + + let mut stream = response.bytes_stream(); + let mut total_bytes = 0u64; + + while let Some(chunk) = stream.next().await { + let chunk = chunk?; + writer.write_all(&chunk).await?; + total_bytes += chunk.len() as u64; + } + + writer.flush().await?; + + Ok(total_bytes) + } +} diff --git a/core/src/http/client/v3.rs b/core/src/http/client/v3.rs new file mode 100644 index 0000000..d79b3c5 --- /dev/null +++ b/core/src/http/client/v3.rs @@ -0,0 +1,268 @@ +use super::{ClientError, ResponseExt, ResultWithPublicKey}; +use crate::http; +use crate::http::client::url::{ApiVersion, TargetUrl}; +use crate::http::dto::ProtocolType; +use crate::{crypto, util}; +use futures_util::StreamExt; +use lru::LruCache; +use reqwest::{Response, StatusCode}; +use std::num::NonZeroUsize; +use std::sync::Arc; +use tokio::sync::{mpsc, Mutex}; +use tokio_stream::wrappers::ReceiverStream; + +pub struct LsHttpClientV3 { + client: reqwest::Client, + + /// Maps client identifiers to nonces that have been received from remote. + received_nonce_map: Arc>>>, + + /// Maps client identifiers to nonces that are expected to be received from remote. + generated_nonce_map: Arc>>>, +} + +impl LsHttpClientV3 { + pub fn try_new(private_key: &str, cert: &str) -> Result { + Ok(Self { + client: super::create_reqwest_client(private_key, cert)?, + received_nonce_map: Arc::new(Mutex::new(LruCache::new( + NonZeroUsize::new(200).unwrap(), + ))), + generated_nonce_map: Arc::new(Mutex::new(LruCache::new( + NonZeroUsize::new(200).unwrap(), + ))), + }) + } + + pub async fn nonce( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + ) -> Result { + // Generate nonce to send to server + let generated_nonce = crypto::nonce::generate_nonce(); + let generated_nonce_base64 = util::base64::encode(&generated_nonce); + + let request_body = http::dto::NonceRequest { + nonce: generated_nonce_base64, + }; + + let res = self + .client + .post( + TargetUrl { + version: ApiVersion::V3, + protocol: protocol.as_str(), + host: ip.to_string(), + port, + path: "/nonce", + params: &[], + } + .to_string(), + ) + .body(serde_json::to_string(&request_body)?) + .send() + .await?; + + if res.status() != StatusCode::OK { + return res.into_error().await; + } + + let remote_key = to_identifier(&res, protocol == ProtocolType::Https, None)?; + let body = res.json::().await?; + + // Save the response nonce and our generated nonce + let response_nonce = util::base64::decode(&body.nonce).map_err(|e| anyhow::anyhow!(e))?; + + let mut received_nonce_map = self.received_nonce_map.lock().await; + received_nonce_map.put(remote_key.clone(), response_nonce); + + let mut generated_nonce_map = self.generated_nonce_map.lock().await; + generated_nonce_map.put(remote_key.clone(), generated_nonce); + + tracing::info!("Nonce exchange successful for server: {ip} (ID: {remote_key})"); + + tracing::debug!( + "Received map: {:?}", + received_nonce_map.get(&remote_key).unwrap() + ); + tracing::debug!( + "Generated map: {:?}", + generated_nonce_map.get(&remote_key).unwrap() + ); + + Ok(body.nonce) + } + + pub async fn register( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + payload: http::dto::RegisterDto, + ) -> Result, ClientError> { + let res = self + .client + .post( + TargetUrl { + version: ApiVersion::V3, + protocol: protocol.as_str(), + host: ip.to_string(), + port, + path: "/register", + params: &[], + } + .to_string(), + ) + .body(serde_json::to_string(&payload)?) + .send() + .await?; + + let public_key = match protocol { + ProtocolType::Https => Some(super::verify_cert_from_res(&res, None)?), + _ => None, + }; + + let body = res.json::().await?; + + Ok(ResultWithPublicKey { public_key, body }) + } + + pub async fn prepare_upload( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + public_key: Option, + payload: http::dto::PrepareUploadRequestDto, + ) -> Result { + let res = self + .client + .post( + TargetUrl { + version: ApiVersion::V3, + protocol: protocol.as_str(), + host: ip.to_string(), + port, + path: "/prepare-upload", + params: &[], + } + .to_string(), + ) + .body(serde_json::to_string(&payload)?) + .send() + .await?; + + if protocol == ProtocolType::Https { + super::verify_cert_from_res(&res, public_key)?; + } + + let status = res.status(); + + if status.as_u16() >= 400 { + return res.into_error().await; + } + + if status == StatusCode::NO_CONTENT { + return Ok(http::dto::PrepareUploadResult { + status_code: status.as_u16(), + response: None, + }); + } + + let body = res.json::().await?; + + Ok(http::dto::PrepareUploadResult { + status_code: status.as_u16(), + response: Some(body), + }) + } + + /// Uploads a file to the server. + pub async fn upload( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + public_key: Option, + session_id: &str, + file_id: &str, + token: &str, + binary: mpsc::Receiver>, + ) -> Result<(), ClientError> { + let res = self + .client + .post( + TargetUrl { + version: ApiVersion::V3, + protocol: protocol.as_str(), + host: ip.to_string(), + port, + path: "/upload", + params: &[ + ("sessionId", &session_id), + ("fileId", &file_id), + ("token", &token), + ], + } + .to_string(), + ) + .body({ + let stream = ReceiverStream::new(binary).map(Ok::, anyhow::Error>); + reqwest::Body::wrap_stream(stream) + }) + .send() + .await?; + + if protocol == ProtocolType::Https { + super::verify_cert_from_res(&res, public_key)?; + } + + if res.status() != StatusCode::OK { + return res.into_error().await; + } + + Ok(()) + } + + pub async fn cancel( + &self, + protocol: ProtocolType, + ip: &str, + port: u16, + session_id: &str, + ) -> Result<(), ClientError> { + self.client + .post( + TargetUrl { + version: ApiVersion::V3, + protocol: protocol.as_str(), + host: ip.to_string(), + port, + path: "/cancel", + params: &[("sessionId", session_id)], + } + .to_string(), + ) + .send() + .await?; + + Ok(()) + } +} + +fn to_identifier( + response: &Response, + require_cert: bool, + public_key: Option, +) -> Result { + match require_cert { + true => Ok(super::verify_cert_from_res(response, public_key)?), + false => response + .remote_addr() + .map(|addr| addr.ip().to_string()) + .ok_or_else(|| anyhow::anyhow!("Remote address not found in response")) + .map_err(ClientError::Other), + } +} diff --git a/core/src/http/dto.rs b/core/src/http/dto.rs new file mode 100644 index 0000000..7014408 --- /dev/null +++ b/core/src/http/dto.rs @@ -0,0 +1,172 @@ +use crate::http::dto_v2::{ + PrepareUploadRequestDtoV2, PrepareUploadResponseDtoV2, ProtocolTypeV2, RegisterDtoV2, + RegisterResponseDtoV2, +}; +use crate::model::discovery::DeviceType; +use crate::model::transfer::FileDto; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] +pub struct NonceRequest { + /// The nonce string. + pub nonce: String, +} + +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] +pub struct NonceResponse { + /// The nonce string. + pub nonce: String, +} + +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] +pub struct ErrorResponse { + /// The error message. + pub message: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RegisterDto { + pub alias: String, + + pub version: String, + + #[serde(skip_serializing_if = "Option::is_none")] + pub device_model: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub device_type: Option, + + pub token: String, + + pub port: u16, + + pub protocol: ProtocolType, + + #[serde(default, skip_serializing_if = "is_default")] + pub has_web_interface: bool, +} + +#[derive(Clone, Debug, Deserialize, Eq, Serialize, PartialEq)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +pub enum ProtocolType { + Http, + Https, +} + +impl ProtocolType { + pub fn as_str(&self) -> &'static str { + match self { + ProtocolType::Http => "http", + ProtocolType::Https => "https", + } + } +} + +impl From for ProtocolTypeV2 { + fn from(p: ProtocolType) -> Self { + match p { + ProtocolType::Http => ProtocolTypeV2::Http, + ProtocolType::Https => ProtocolTypeV2::Https, + } + } +} + +impl From for RegisterDtoV2 { + fn from(v3: RegisterDto) -> Self { + RegisterDtoV2 { + alias: v3.alias, + version: v3.version, + device_model: v3.device_model, + device_type: v3.device_type, + fingerprint: v3.token, + port: v3.port, + protocol: v3.protocol.into(), + download: v3.has_web_interface, + } + } +} + +/// Similar to `RegisterDto`, but without `port` and `protocol` (those are already known). +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RegisterResponseDto { + pub alias: String, + + pub version: String, + + #[serde(skip_serializing_if = "Option::is_none")] + pub device_model: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub device_type: Option, + + pub token: String, + + #[serde(default, skip_serializing_if = "is_default")] + pub has_web_interface: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PrepareUploadRequestDto { + pub info: RegisterDto, + pub files: HashMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PrepareUploadResponseDto { + pub session_id: String, + pub files: HashMap, +} + +impl From for PrepareUploadRequestDtoV2 { + fn from(v3: PrepareUploadRequestDto) -> Self { + PrepareUploadRequestDtoV2 { + info: v3.info.into(), + files: v3.files, + } + } +} + +pub struct PrepareUploadResult { + pub status_code: u16, + pub response: Option, +} + +impl From for PrepareUploadResponseDto { + fn from(v2: PrepareUploadResponseDtoV2) -> Self { + PrepareUploadResponseDto { + session_id: v2.session_id, + files: v2.files, + } + } +} + +impl From for PrepareUploadResult { + fn from(v2: crate::http::dto_v2::PrepareUploadResultV2) -> Self { + PrepareUploadResult { + status_code: v2.status_code, + response: v2.response.map(|r| r.into()), + } + } +} + +impl From for RegisterResponseDto { + fn from(v2: RegisterResponseDtoV2) -> Self { + RegisterResponseDto { + alias: v2.alias, + version: v2.version, + device_model: v2.device_model, + device_type: v2.device_type, + token: v2.fingerprint, + has_web_interface: v2.download, + } + } +} + +fn is_default(t: &T) -> bool { + t == &T::default() +} diff --git a/core/src/http/dto_v2.rs b/core/src/http/dto_v2.rs new file mode 100644 index 0000000..b116f51 --- /dev/null +++ b/core/src/http/dto_v2.rs @@ -0,0 +1,380 @@ +use crate::model::discovery::DeviceType; +use crate::model::transfer::FileDto; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +/// The protocol version (major.minor) implemented by this crate for the v2 protocol. +pub const PROTOCOL_VERSION_V2: &str = "2.1"; + +/// Serde helpers for `DeviceType` in the v2 protocol. +/// +/// The v2 protocol uses lowercase values (e.g. "desktop") on the wire. +/// Unknown values fall back to `Desktop` as required by the protocol (section 7.1). +pub(crate) mod device_type_v2 { + use crate::model::discovery::DeviceType; + use serde::{Deserialize, Deserializer, Serializer}; + + pub fn serialize( + value: &Option, + serializer: S, + ) -> Result { + match value { + Some(device_type) => serializer.serialize_str(match device_type { + DeviceType::Mobile => "mobile", + DeviceType::Desktop => "desktop", + DeviceType::Web => "web", + DeviceType::Headless => "headless", + DeviceType::Server => "server", + }), + None => serializer.serialize_none(), + } + } + + pub fn deserialize<'de, D: Deserializer<'de>>( + deserializer: D, + ) -> Result, D::Error> { + let value = Option::::deserialize(deserializer)?; + Ok(value.map(|value| match value.to_lowercase().as_str() { + "mobile" => DeviceType::Mobile, + "desktop" => DeviceType::Desktop, + "web" => DeviceType::Web, + "headless" => DeviceType::Headless, + "server" => DeviceType::Server, + _ => DeviceType::Desktop, + })) + } +} + +/// Protocol type for HTTP or HTTPS connections. +#[derive(Clone, Debug, Deserialize, Eq, Serialize, PartialEq)] +#[serde(rename_all = "lowercase")] +pub enum ProtocolTypeV2 { + Http, + Https, +} + +impl ProtocolTypeV2 { + pub fn as_str(&self) -> &'static str { + match self { + ProtocolTypeV2::Http => "http", + ProtocolTypeV2::Https => "https", + } + } +} + +/// Multicast announcement/response message for UDP discovery (v2.1). +/// +/// Used for both sending announcements and responding to announcements. +/// When `announce` is true, other devices should respond. +/// When `announce` is false, this is a response to an announcement. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct MulticastMessageV2 { + /// The display name of the device. + pub alias: String, + + /// Protocol version (e.g., "2.1"). + pub version: String, + + /// Device model (e.g., "Samsung", "Windows"). Optional. + #[serde(skip_serializing_if = "Option::is_none")] + pub device_model: Option, + + /// Device type category. Optional. + #[serde( + default, + with = "device_type_v2", + skip_serializing_if = "Option::is_none" + )] + pub device_type: Option, + + /// Fingerprint for device identification. + /// In HTTPS mode: SHA-256 hash of the certificate. + /// In HTTP mode: randomly generated string. + pub fingerprint: String, + + /// Port number the device is listening on. + pub port: u16, + + /// Protocol type (http or https). + pub protocol: ProtocolTypeV2, + + /// Whether the download API (sections 5.2, 5.3) is active. + #[serde(default)] + pub download: bool, + + /// Whether this is an announcement (true) or a response (false). + /// Other devices should only respond when this is true. + pub announce: bool, +} + +/// Register request DTO for v2.1 protocol. +/// +/// Sent to POST /api/localsend/v2/register for device discovery. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RegisterDtoV2 { + /// The display name of the device. + pub alias: String, + + /// Protocol version (e.g., "2.0", "2.1"). + pub version: String, + + /// Device model (e.g., "Samsung", "Windows"). Optional. + #[serde(skip_serializing_if = "Option::is_none")] + pub device_model: Option, + + /// Device type category. Optional. + #[serde( + default, + with = "device_type_v2", + skip_serializing_if = "Option::is_none" + )] + pub device_type: Option, + + /// Fingerprint for device identification. + /// Ignored in HTTPS mode (certificate is used instead). + pub fingerprint: String, + + /// Port number the device is listening on. + pub port: u16, + + /// Protocol type (http or https). + pub protocol: ProtocolTypeV2, + + /// Whether the download API (sections 5.2, 5.3) is active. + #[serde(default)] + pub download: bool, +} + +/// Register response DTO for v2.1 protocol. +/// +/// Response from POST /api/localsend/v2/register. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RegisterResponseDtoV2 { + /// The display name of the device. + pub alias: String, + + /// Protocol version (e.g., "2.0", "2.1"). + pub version: String, + + /// Device model. Optional. + #[serde(skip_serializing_if = "Option::is_none")] + pub device_model: Option, + + /// Device type category. Optional. + #[serde( + default, + with = "device_type_v2", + skip_serializing_if = "Option::is_none" + )] + pub device_type: Option, + + /// Fingerprint for device identification. + /// Ignored in HTTPS mode (certificate is used instead). + #[serde(default)] + pub fingerprint: String, + + /// Whether the download API (sections 5.2, 5.3) is active. + #[serde(default)] + pub download: bool, +} + +/// Prepare upload request DTO for v2.1 protocol. +/// +/// Sent to POST /api/localsend/v2/prepare-upload to initiate a file transfer. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PrepareUploadRequestDtoV2 { + /// Sender's device information. + pub info: RegisterDtoV2, + + /// Map of file ID to file metadata. + pub files: HashMap, +} + +/// Prepare upload response DTO for v2.1 protocol. +/// +/// Response from POST /api/localsend/v2/prepare-upload. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PrepareUploadResponseDtoV2 { + /// Session ID for the file transfer. + pub session_id: String, + + /// Map of file ID to file token. + /// Only contains files that were accepted by the receiver. + pub files: HashMap, +} + +pub struct PrepareUploadResultV2 { + pub status_code: u16, + pub response: Option, +} + +/// Prepare download response DTO for v2.1 protocol (Download API). +/// +/// Response from POST /api/localsend/v2/prepare-download. +/// Used when the sender provides files for others to download. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PrepareDownloadResponseDtoV2 { + /// Sender's device information. + pub info: InfoResponseDtoV2, + + /// Session ID for the download session. + pub session_id: String, + + /// Map of file ID to file metadata. + pub files: HashMap, +} + +/// Info response DTO for v2.1 protocol. +/// +/// Response from GET /api/localsend/v2/info. +/// Also used as the `info` field in PrepareDownloadResponseDtoV2. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct InfoResponseDtoV2 { + /// The display name of the device. + pub alias: String, + + /// Protocol version (e.g., "2.0", "2.1"). + pub version: String, + + /// Device model. Optional. + #[serde(skip_serializing_if = "Option::is_none")] + pub device_model: Option, + + /// Device type category. Optional. + #[serde( + default, + with = "device_type_v2", + skip_serializing_if = "Option::is_none" + )] + pub device_type: Option, + + /// Fingerprint for device identification. + pub fingerprint: String, + + /// Whether the download API (sections 5.2, 5.3) is active. + #[serde(default)] + pub download: bool, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_multicast_message_serialization() { + let msg = MulticastMessageV2 { + alias: "Nice Orange".to_string(), + version: "2.1".to_string(), + device_model: Some("Samsung".to_string()), + device_type: Some(DeviceType::Mobile), + fingerprint: "random string".to_string(), + port: 53317, + protocol: ProtocolTypeV2::Https, + download: true, + announce: true, + }; + + let json = serde_json::to_string(&msg).unwrap(); + assert!(json.contains("\"alias\":\"Nice Orange\"")); + assert!(json.contains("\"version\":\"2.1\"")); + assert!(json.contains("\"fingerprint\":\"random string\"")); + assert!(json.contains("\"announce\":true")); + assert!(json.contains("\"download\":true")); + assert!(json.contains("\"protocol\":\"https\"")); + assert!(json.contains("\"deviceType\":\"mobile\"")); + } + + #[test] + fn test_register_dto_v2_deserialization() { + let json = r#"{ + "alias": "Secret Banana", + "version": "2.0", + "deviceModel": "Windows", + "deviceType": "desktop", + "fingerprint": "random string", + "port": 53317, + "protocol": "https", + "download": true + }"#; + + let dto: RegisterDtoV2 = serde_json::from_str(json).unwrap(); + assert_eq!(dto.alias, "Secret Banana"); + assert_eq!(dto.version, "2.0"); + assert_eq!(dto.device_model, Some("Windows".to_string())); + assert_eq!(dto.device_type, Some(DeviceType::Desktop)); + assert_eq!(dto.fingerprint, "random string"); + assert_eq!(dto.port, 53317); + assert_eq!(dto.protocol, ProtocolTypeV2::Https); + assert!(dto.download); + } + + #[test] + fn test_device_type_unknown_falls_back_to_desktop() { + // Unknown device types must fall back to desktop (protocol section 7.1). + let json = r#"{ + "alias": "Test Device", + "version": "2.0", + "deviceType": "fridge", + "fingerprint": "abc123", + "port": 53317, + "protocol": "http" + }"#; + + let dto: RegisterDtoV2 = serde_json::from_str(json).unwrap(); + assert_eq!(dto.device_type, Some(DeviceType::Desktop)); + } + + #[test] + fn test_register_response_without_download_field() { + // Test that download defaults to false when not present + let json = r#"{ + "alias": "Test Device", + "version": "2.0", + "fingerprint": "abc123" + }"#; + + let dto: RegisterResponseDtoV2 = serde_json::from_str(json).unwrap(); + assert_eq!(dto.alias, "Test Device"); + assert!(!dto.download); + } + + #[test] + fn test_prepare_upload_request_v2() { + let request = PrepareUploadRequestDtoV2 { + info: RegisterDtoV2 { + alias: "Sender".to_string(), + version: "2.1".to_string(), + device_model: None, + device_type: None, + fingerprint: "sender-fingerprint".to_string(), + port: 53317, + protocol: ProtocolTypeV2::Https, + download: false, + }, + files: HashMap::from([( + "file1".to_string(), + FileDto { + id: "file1".to_string(), + file_name: "test.png".to_string(), + size: 1024, + file_type: "image/png".to_string(), + sha256: None, + preview: None, + metadata: None, + }, + )]), + }; + + let json = serde_json::to_string(&request).unwrap(); + assert!(json.contains("\"info\"")); + assert!(json.contains("\"files\"")); + assert!(json.contains("\"fingerprint\":\"sender-fingerprint\"")); + } +} diff --git a/core/src/http/mod.rs b/core/src/http/mod.rs new file mode 100644 index 0000000..2af0c5a --- /dev/null +++ b/core/src/http/mod.rs @@ -0,0 +1,14 @@ +use thiserror::Error; + +pub mod client; +pub mod dto; +pub mod dto_v2; +pub mod server; +pub mod state; + +#[derive(Debug, Error)] +#[error("{status};{message:?}")] +pub struct StatusCodeError { + pub status: u16, + pub message: Option, +} diff --git a/core/src/http/server/client_cert_verifier.rs b/core/src/http/server/client_cert_verifier.rs new file mode 100644 index 0000000..895017f --- /dev/null +++ b/core/src/http/server/client_cert_verifier.rs @@ -0,0 +1,83 @@ +use std::fmt::{Debug, Formatter}; +use std::sync::Arc; +use rustls::pki_types::pem::PemObject; +use rustls::{DigitallySignedStruct, DistinguishedName, Error, RootCertStore, SignatureScheme}; +use rustls::client::danger::HandshakeSignatureValid; +use rustls::pki_types::{CertificateDer, UnixTime}; +use rustls::server::danger::{ClientCertVerified, ClientCertVerifier}; +use rustls::server::WebPkiClientVerifier; +use x509_parser::nom::AsBytes; + +/// Enables client certificate verification. +pub(crate) struct CustomClientCertVerifier { + inner: Arc, +} + +impl CustomClientCertVerifier { + pub(crate) fn try_new(cert: &str) -> anyhow::Result { + // We add the certificate of the server itself just so that no "empty" error is returned. + // We don't care about the authority of the certificate, just that it is valid. + let mut root_cert_store = RootCertStore::empty(); + root_cert_store.add(PemObject::from_pem_slice(cert.as_bytes())?)?; + + Ok(Self { + inner: WebPkiClientVerifier::builder(Arc::new(root_cert_store)).build()?, + }) + } +} + +impl Debug for CustomClientCertVerifier { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.inner.fmt(f) + } +} + +impl ClientCertVerifier for CustomClientCertVerifier { + fn offer_client_auth(&self) -> bool { + true + } + + fn client_auth_mandatory(&self) -> bool { + true + } + + fn root_hint_subjects(&self) -> &[DistinguishedName] { + self.inner.root_hint_subjects() + } + + fn verify_client_cert( + &self, + cert: &CertificateDer<'_>, + _: &[CertificateDer<'_>], + _: UnixTime, + ) -> Result { + // We trust any certificate that is valid. + crate::crypto::cert::verify_cert_from_der(cert.as_bytes(), None).map_err(|e| { + tracing::warn!("Client certificate verification failed: {e:#}"); + Error::InvalidCertificate(rustls::CertificateError::ApplicationVerificationFailure) + })?; + Ok(ClientCertVerified::assertion()) + } + + fn verify_tls12_signature( + &self, + message: &[u8], + cert: &CertificateDer<'_>, + dss: &DigitallySignedStruct, + ) -> Result { + self.inner.verify_tls12_signature(message, cert, dss) + } + + fn verify_tls13_signature( + &self, + message: &[u8], + cert: &CertificateDer<'_>, + dss: &DigitallySignedStruct, + ) -> Result { + self.inner.verify_tls13_signature(message, cert, dss) + } + + fn supported_verify_schemes(&self) -> Vec { + self.inner.supported_verify_schemes() + } +} diff --git a/core/src/http/server/collect_to_json.rs b/core/src/http/server/collect_to_json.rs new file mode 100644 index 0000000..24fdc35 --- /dev/null +++ b/core/src/http/server/collect_to_json.rs @@ -0,0 +1,18 @@ +use crate::http::server::error::AppError; +use http_body_util::BodyExt; +use hyper::body::Incoming; +use serde::de::DeserializeOwned; + +pub(crate) trait CollectToJson { + async fn collect_to_json(self) -> Result; +} + +impl CollectToJson for Incoming { + async fn collect_to_json(self) -> Result { + let bytes = self.collect().await?.to_bytes(); + serde_json::from_slice::(&bytes).map_err(|err| { + tracing::warn!("Failed to parse JSON body: {err:#}"); + AppError::BadRequest("Invalid JSON body".to_string()) + }) + } +} diff --git a/core/src/http/server/controller/mod.rs b/core/src/http/server/controller/mod.rs new file mode 100644 index 0000000..f34074e --- /dev/null +++ b/core/src/http/server/controller/mod.rs @@ -0,0 +1,52 @@ +pub(crate) mod v2; +pub(crate) mod v3; +pub(crate) mod web; + +use crate::http::server::error::AppError; +use hyper::StatusCode; +use lru::LruCache; +use std::collections::HashMap; +use std::net::IpAddr; +use tokio::sync::Mutex; + +/// Maximum failed PIN attempts per IP before requests are blocked with 429. +const MAX_PIN_ATTEMPTS: u32 = 3; + +/// Checks the `pin` query parameter against the required PIN (if any). +pub(crate) async fn check_pin( + required_pin: Option<&str>, + pin_attempts: &Mutex>, + query: &HashMap, + ip: IpAddr, +) -> Result<(), AppError> { + let Some(required_pin) = required_pin else { + return Ok(()); + }; + + let mut attempts = pin_attempts.lock().await; + let count = attempts.get(&ip).copied().unwrap_or(0); + if count >= MAX_PIN_ATTEMPTS { + return Err(AppError::Message( + StatusCode::TOO_MANY_REQUESTS, + "Too many requests".to_string(), + )); + } + + match query.get("pin") { + Some(pin) if pin == required_pin => { + attempts.pop(&ip); + Ok(()) + } + Some(_) => { + attempts.put(ip, count + 1); + Err(AppError::Message( + StatusCode::UNAUTHORIZED, + "Invalid PIN".to_string(), + )) + } + None => Err(AppError::Message( + StatusCode::UNAUTHORIZED, + "PIN required".to_string(), + )), + } +} diff --git a/core/src/http/server/controller/v2.rs b/core/src/http/server/controller/v2.rs new file mode 100644 index 0000000..34f117e --- /dev/null +++ b/core/src/http/server/controller/v2.rs @@ -0,0 +1,547 @@ +use crate::http::dto_v2::{ + InfoResponseDtoV2, PrepareUploadRequestDtoV2, PrepareUploadResponseDtoV2, RegisterDtoV2, + RegisterResponseDtoV2, PROTOCOL_VERSION_V2, +}; +use crate::http::server::collect_to_json::CollectToJson; +use crate::http::server::controller::check_pin; +use crate::http::server::error::AppError; +use crate::http::server::query::parse_query; +use crate::http::server::response::{empty_body, BoxedBody, JsonResponse}; +use crate::http::server::session::{FileStatusV2, SessionFileV2, SessionStateV2, UploadSessionV2}; +use crate::http::server::{AppState, RequestClientInfo, V2State}; +use crate::model::transfer::FileDto; +use bytes::Bytes; +use http_body_util::BodyExt; +use hyper::body::Incoming; +use hyper::{Request, Response, StatusCode}; +use std::collections::{HashMap, HashSet}; +use std::net::IpAddr; +use std::sync::Arc; +use tokio::sync::{mpsc, oneshot}; +use uuid::Uuid; + +/// Events emitted by the v2 HTTP server that must be handled by the application. +#[derive(Debug)] +pub enum ServerEventV2 { + /// A device registered itself via `POST /api/localsend/v2/register`. + Register { + /// The IP address of the remote device. + ip: IpAddr, + + /// The device information sent by the remote device. + info: RegisterDtoV2, + }, + + /// A sender requests to upload files via `POST /api/localsend/v2/prepare-upload`. + /// + /// The application must answer on `decision_tx`. + /// Dropping `decision_tx` results in a 500 response. + PrepareUpload { + /// The IP address of the sender. + ip: IpAddr, + + /// The device information of the sender. + info: RegisterDtoV2, + + /// The offered files, mapped by file ID. + files: HashMap, + + /// Channel to send the decision (accept all, a subset, or decline). + decision_tx: oneshot::Sender, + }, + + /// An accepted file is being uploaded via `POST /api/localsend/v2/upload`. + /// + /// Binary chunks arrive on `binary_rx` until the channel is closed. + /// The application should compare the number of received bytes with `file.size` + /// and report the result on `result_tx` which determines the HTTP response + /// (200 on `Ok`, 500 on `Err` or when `result_tx` is dropped). + FileUpload { + /// The session ID of the upload session. + session_id: String, + + /// The ID of the file being uploaded. + file_id: String, + + /// The metadata of the file being uploaded. + file: FileDto, + + /// Channel receiving the binary chunks of the file. + binary_rx: mpsc::Receiver, + + /// Channel to report whether the file was processed successfully. + result_tx: oneshot::Sender>, + }, + + /// An upload session ended. + SessionEnd { + /// The session ID of the ended session. + session_id: String, + + /// Why the session ended. + reason: SessionEndReasonV2, + }, +} + +/// The application's decision for a prepare-upload request. +#[derive(Debug)] +pub enum PrepareUploadDecisionV2 { + /// Accept the given file IDs (a subset of the offered files). + /// An empty set responds with 204 (no file transfer needed). + Accept(HashSet), + + /// Decline the request (403). + Decline, +} + +/// Why an upload session ended. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum SessionEndReasonV2 { + /// All accepted files reached a final state (finished or failed). + Finished, + + /// The sender cancelled the session via `POST /api/localsend/v2/cancel`. + Cancelled, +} + +/// Channel capacity for file upload chunks (provides backpressure). +const UPLOAD_CHANNEL_CAPACITY: usize = 16; + +pub(crate) async fn register( + body: Incoming, + state: AppState, + client_info: RequestClientInfo, +) -> Result, AppError> { + let payload = body.collect_to_json::().await?; + + if let Some(v2) = &state.v2 { + let _ = v2 + .event_tx + .send(ServerEventV2::Register { + ip: client_info.ip, + info: payload, + }) + .await; + } + + let info = state.info.lock().await.clone(); + let download = state.web.is_some(); + + Ok(JsonResponse { + status: StatusCode::OK, + body: RegisterResponseDtoV2 { + alias: info.alias, + version: PROTOCOL_VERSION_V2.to_string(), + device_model: info.device_model, + device_type: info.device_type, + fingerprint: info.token, + download, + }, + }) +} + +pub(crate) async fn info(state: AppState) -> Result, AppError> { + let info = state.info.lock().await.clone(); + let download = state.web.is_some(); + + Ok(JsonResponse { + status: StatusCode::OK, + body: InfoResponseDtoV2 { + alias: info.alias, + version: PROTOCOL_VERSION_V2.to_string(), + device_model: info.device_model, + device_type: info.device_type, + fingerprint: info.token, + download, + }, + }) +} + +pub(crate) async fn prepare_upload( + req: Request, + state: AppState, + client_info: RequestClientInfo, +) -> Result, AppError> { + let v2 = require_v2(&state)?; + let query = parse_query(req.uri().query()); + + check_pin(v2.pin.as_deref(), &v2.pin_attempts, &query, client_info.ip).await?; + + let payload = req + .into_body() + .collect_to_json::() + .await?; + + if payload.files.is_empty() { + return Err(AppError::BadRequest("No files provided".to_string())); + } + + // Claim the single session slot. + { + let mut slot = v2.session.lock().await; + if slot.is_some() { + return Err(AppError::Message( + StatusCode::CONFLICT, + "Blocked by another session".to_string(), + )); + } + *slot = Some(SessionStateV2::Pending); + } + + // Frees the slot again if this request is aborted before a session is created. + let mut pending_guard = PendingSessionGuard::new(v2.clone()); + + let (decision_tx, decision_rx) = oneshot::channel(); + let event = ServerEventV2::PrepareUpload { + ip: client_info.ip, + info: payload.info, + files: payload.files.clone(), + decision_tx, + }; + if v2.event_tx.send(event).await.is_err() { + return Err(AppError::Status(StatusCode::INTERNAL_SERVER_ERROR)); + } + + let decision = decision_rx + .await + .map_err(|_| AppError::Status(StatusCode::INTERNAL_SERVER_ERROR))?; + + let accepted_ids = match decision { + PrepareUploadDecisionV2::Decline => { + pending_guard.clear().await; + return Err(AppError::Message( + StatusCode::FORBIDDEN, + "Rejected".to_string(), + )); + } + PrepareUploadDecisionV2::Accept(ids) => ids, + }; + + let files: HashMap = payload + .files + .into_iter() + .filter(|(id, _)| accepted_ids.contains(id)) + .map(|(id, dto)| { + let file = SessionFileV2 { + dto, + token: Uuid::new_v4().to_string(), + status: FileStatusV2::Pending, + }; + (id, file) + }) + .collect(); + + if files.is_empty() { + // Nothing to transfer. + pending_guard.clear().await; + let mut res = Response::new(empty_body()); + *res.status_mut() = StatusCode::NO_CONTENT; + return Ok(res); + } + + let session_id = Uuid::new_v4().to_string(); + let tokens: HashMap = files + .iter() + .map(|(id, file)| (id.clone(), file.token.clone())) + .collect(); + + { + let mut slot = v2.session.lock().await; + *slot = Some(SessionStateV2::Active(UploadSessionV2 { + session_id: session_id.clone(), + sender_ip: client_info.ip, + files, + })); + } + pending_guard.disarm(); + + tracing::info!("Upload session created: {session_id}"); + + Ok(JsonResponse { + status: StatusCode::OK, + body: PrepareUploadResponseDtoV2 { + session_id, + files: tokens, + }, + } + .into_response()) +} + +pub(crate) async fn upload( + req: Request, + state: AppState, + client_info: RequestClientInfo, +) -> Result, AppError> { + let v2 = require_v2(&state)?; + let query = parse_query(req.uri().query()); + + let (Some(session_id), Some(file_id), Some(token)) = ( + query.get("sessionId"), + query.get("fileId"), + query.get("token"), + ) else { + return Err(AppError::Message( + StatusCode::BAD_REQUEST, + "Missing parameters".to_string(), + )); + }; + + // Validate the request and mark the file as in progress. + let file_dto = { + let mut slot = v2.session.lock().await; + let Some(SessionStateV2::Active(session)) = slot.as_mut() else { + return Err(invalid_token_error()); + }; + if session.session_id != *session_id || session.sender_ip != client_info.ip { + return Err(invalid_token_error()); + } + let Some(file) = session.files.get_mut(file_id) else { + return Err(invalid_token_error()); + }; + if file.token != *token || file.status != FileStatusV2::Pending { + return Err(invalid_token_error()); + } + file.status = FileStatusV2::InProgress; + file.dto.clone() + }; + + // Marks the file as failed if this request is aborted mid-transfer. + let mut upload_guard = UploadGuard::new(v2.clone(), session_id.clone(), file_id.clone()); + + let (binary_tx, binary_rx) = mpsc::channel::(UPLOAD_CHANNEL_CAPACITY); + let (result_tx, result_rx) = oneshot::channel::>(); + + let event = ServerEventV2::FileUpload { + session_id: session_id.clone(), + file_id: file_id.clone(), + file: file_dto, + binary_rx, + result_tx, + }; + if v2.event_tx.send(event).await.is_err() { + upload_guard.finish(false).await; + return Err(AppError::Status(StatusCode::INTERNAL_SERVER_ERROR)); + } + + // Forward the request body to the application. + let mut body = req.into_body(); + let mut stream_error = false; + while let Some(frame) = body.frame().await { + match frame { + Ok(frame) => { + let Ok(data) = frame.into_data() else { + continue; // ignore non-data frames (e.g. trailers) + }; + if data.is_empty() { + continue; + } + if binary_tx.send(data).await.is_err() { + // The application dropped the receiver. + stream_error = true; + break; + } + } + Err(err) => { + tracing::warn!("Error reading upload body of file {file_id}: {err:#}"); + stream_error = true; + break; + } + } + } + + // Signal end of file to the application. + drop(binary_tx); + + let success = match stream_error { + true => false, + false => match result_rx.await { + Ok(Ok(())) => true, + Ok(Err(err)) => { + tracing::warn!("Application failed to process file {file_id}: {err}"); + false + } + Err(_) => false, + }, + }; + + upload_guard.finish(success).await; + + match success { + true => Ok(Response::new(empty_body())), + false => Err(AppError::Status(StatusCode::INTERNAL_SERVER_ERROR)), + } +} + +pub(crate) async fn cancel( + req: Request, + state: AppState, +) -> Result, AppError> { + let v2 = require_v2(&state)?; + let query = parse_query(req.uri().query()); + + if let Some(session_id) = query.get("sessionId") { + let cancelled = { + let mut slot = v2.session.lock().await; + match slot.as_ref() { + Some(SessionStateV2::Active(session)) if session.session_id == *session_id => { + *slot = None; + true + } + _ => false, + } + }; + + if cancelled { + tracing::info!("Upload session cancelled by sender: {session_id}"); + let _ = v2 + .event_tx + .send(ServerEventV2::SessionEnd { + session_id: session_id.clone(), + reason: SessionEndReasonV2::Cancelled, + }) + .await; + } + } + + Ok(Response::new(empty_body())) +} + +fn require_v2(state: &AppState) -> Result, AppError> { + state + .v2 + .clone() + .ok_or(AppError::Status(StatusCode::NOT_FOUND)) +} + +fn invalid_token_error() -> AppError { + AppError::Message( + StatusCode::FORBIDDEN, + "Invalid token or IP address".to_string(), + ) +} + +/// Frees a claimed `Pending` session slot unless a session was created. +/// +/// The cleanup also runs on drop so the slot is not leaked +/// when the request future is cancelled (e.g. the sender disconnected +/// while the application was still deciding). +struct PendingSessionGuard { + v2: Arc, + armed: bool, +} + +impl PendingSessionGuard { + fn new(v2: Arc) -> Self { + Self { v2, armed: true } + } + + /// Disarms the guard after the pending slot was replaced by an active session. + fn disarm(&mut self) { + self.armed = false; + } + + /// Frees the pending slot immediately. + async fn clear(&mut self) { + self.armed = false; + clear_pending_session(&self.v2).await; + } +} + +impl Drop for PendingSessionGuard { + fn drop(&mut self) { + if !self.armed { + return; + } + let v2 = self.v2.clone(); + tokio::spawn(async move { + clear_pending_session(&v2).await; + }); + } +} + +async fn clear_pending_session(v2: &V2State) { + let mut slot = v2.session.lock().await; + if matches!(*slot, Some(SessionStateV2::Pending)) { + *slot = None; + } +} + +/// Sets the final status of a file after an upload attempt. +/// +/// The cleanup also runs on drop (as a failure) so the file is not stuck +/// in progress when the request future is cancelled mid-transfer. +struct UploadGuard { + v2: Arc, + session_id: String, + file_id: String, + armed: bool, +} + +impl UploadGuard { + fn new(v2: Arc, session_id: String, file_id: String) -> Self { + Self { + v2, + session_id, + file_id, + armed: true, + } + } + + async fn finish(&mut self, success: bool) { + self.armed = false; + finalize_file(&self.v2, &self.session_id, &self.file_id, success).await; + } +} + +impl Drop for UploadGuard { + fn drop(&mut self) { + if !self.armed { + return; + } + let v2 = self.v2.clone(); + let session_id = std::mem::take(&mut self.session_id); + let file_id = std::mem::take(&mut self.file_id); + tokio::spawn(async move { + finalize_file(&v2, &session_id, &file_id, false).await; + }); + } +} + +/// Sets the final status of a file and ends the session once all files are done. +async fn finalize_file(v2: &V2State, session_id: &str, file_id: &str, success: bool) { + let session_ended = { + let mut slot = v2.session.lock().await; + let Some(SessionStateV2::Active(session)) = slot.as_mut() else { + return; + }; + if session.session_id != session_id { + return; + } + if let Some(file) = session.files.get_mut(file_id) { + if file.status == FileStatusV2::InProgress { + file.status = match success { + true => FileStatusV2::Finished, + false => FileStatusV2::Failed, + }; + } + } + match session.is_complete() { + true => { + *slot = None; + true + } + false => false, + } + }; + + if session_ended { + tracing::info!("Upload session finished: {session_id}"); + let _ = v2 + .event_tx + .send(ServerEventV2::SessionEnd { + session_id: session_id.to_string(), + reason: SessionEndReasonV2::Finished, + }) + .await; + } +} diff --git a/core/src/http/server/controller/v3.rs b/core/src/http/server/controller/v3.rs new file mode 100644 index 0000000..cd9125c --- /dev/null +++ b/core/src/http/server/controller/v3.rs @@ -0,0 +1,73 @@ +use crate::http::dto::{NonceRequest, NonceResponse, RegisterDto, RegisterResponseDto}; +use crate::http::server::collect_to_json::CollectToJson; +use crate::http::server::error::AppError; +use crate::http::server::response::JsonResponse; +use crate::http::server::{AppState, RequestClientInfo}; +use crate::{crypto, util}; +use hyper::body::Incoming; +use hyper::StatusCode; + +pub(crate) async fn nonce_exchange( + body: Incoming, + state: AppState, + client_info: RequestClientInfo, +) -> Result, AppError> { + let payload = body.collect_to_json::().await?; + + let nonce = util::base64::decode(&payload.nonce).map_err(|_| { + tracing::warn!("Failed to decode nonce from base64"); + AppError::BadRequest("Invalid nonce format".to_string()) + })?; + + if !crypto::nonce::validate_nonce(&nonce) { + tracing::warn!("Invalid nonce received"); + return Err(AppError::BadRequest("Invalid nonce".to_string())); + } + + // Save the nonce + let remote_key = client_info.identifier(); + let mut received_nonce_map = state.received_nonce_map.lock().await; + received_nonce_map.put(remote_key.clone(), nonce); + + // Generate new nonce for the client + let new_nonce = crypto::nonce::generate_nonce(); + let new_nonce_base64 = util::base64::encode(&new_nonce); + let mut generated_nonce_map = state.generated_nonce_map.lock().await; + generated_nonce_map.put(remote_key.clone(), new_nonce); + + tracing::info!( + "Nonce exchange successful for client: {} (ID: {})", + client_info.ip, + remote_key + ); + + Ok(JsonResponse { + status: StatusCode::OK, + body: NonceResponse { + nonce: new_nonce_base64, + }, + }) +} + +pub(crate) async fn register( + body: Incoming, + state: AppState, + client_info: RequestClientInfo, +) -> Result, AppError> { + let payload = body.collect_to_json::().await?; + + let info = state.info.lock().await.clone(); + let has_web_interface = state.web.is_some(); + + Ok(JsonResponse { + status: StatusCode::OK, + body: RegisterResponseDto { + alias: info.alias, + version: info.version, + device_model: info.device_model, + device_type: info.device_type, + token: info.token, + has_web_interface, + }, + }) +} diff --git a/core/src/http/server/controller/web.rs b/core/src/http/server/controller/web.rs new file mode 100644 index 0000000..9e5cd16 --- /dev/null +++ b/core/src/http/server/controller/web.rs @@ -0,0 +1,479 @@ +use crate::http::dto_v2::{ + InfoResponseDtoV2, PrepareDownloadResponseDtoV2, PROTOCOL_VERSION_V2, +}; +use crate::http::server::controller::check_pin; +use crate::http::server::error::AppError; +use crate::http::server::query::parse_query; +use crate::http::server::response::{full_body, BoxedBody, JsonResponse}; +use crate::http::server::{AppState, RequestClientInfo}; +use crate::model::transfer::FileDto; +use bytes::Bytes; +use http_body_util::{BodyExt, StreamBody}; +use hyper::body::{Frame, Incoming}; +use hyper::{http, Request, Response, StatusCode}; +use lru::LruCache; +use percent_encoding::{utf8_percent_encode, AsciiSet, NON_ALPHANUMERIC}; +use serde::Serialize; +use std::collections::HashMap; +use std::net::IpAddr; +use std::num::NonZeroUsize; +use std::sync::Arc; +use tokio::sync::{mpsc, oneshot, Mutex}; +use tokio_stream::wrappers::ReceiverStream; +use tokio_stream::StreamExt; + +/// Events emitted by the web send (download API) endpoints that must be handled +/// by the application. Web send can be enabled independently of the v2 endpoints. +#[derive(Debug)] +pub enum WebSendEvent { + /// A web client requests to download the shared files + /// via `POST /api/localsend/v2/prepare-download`. + /// + /// The application must answer on `decision_tx`. + /// Dropping `decision_tx` results in a 500 response. + PrepareDownload { + /// The IP address of the web client. + ip: IpAddr, + + /// The ID of the download session that is created when accepted. + session_id: String, + + /// The `User-Agent` header of the web client. + user_agent: Option, + + /// Channel to send the decision (`true` to accept, `false` to decline). + decision_tx: oneshot::Sender, + }, + + /// An accepted web client downloads a file via `GET /api/localsend/v2/download`. + /// + /// The application must respond on `content_tx` with a channel receiving + /// the binary chunks of the file. The response body advertises `file.size` + /// bytes, so the application should send exactly that many bytes before + /// closing the channel (closing it earlier aborts the download). + /// Dropping `content_tx` results in a 500 response. + FileDownload { + /// The ID of the download session. + session_id: String, + + /// The ID of the file being downloaded. + file_id: String, + + /// The metadata of the file being downloaded. + file: FileDto, + + /// Channel to provide the receiver on which the file content arrives. + content_tx: oneshot::Sender>, + }, +} + +const INDEX_HTML: &str = include_str!("../../../../assets/web/index.html"); +const MAIN_JS: &str = include_str!("../../../../assets/web/main.js"); +const ERROR_403_HTML: &str = include_str!("../../../../assets/web/error-403.html"); + +/// Characters that are percent-encoded in the content-disposition file name. +/// Matches the component encoding of RFC 2396 (letters, digits and marks are kept). +const FILE_NAME_ENCODE_SET: &AsciiSet = &NON_ALPHANUMERIC + .remove(b'-') + .remove(b'_') + .remove(b'.') + .remove(b'!') + .remove(b'~') + .remove(b'*') + .remove(b'\'') + .remove(b'(') + .remove(b')'); + +/// Configuration for web send (download API): files offered for download by web browsers. +/// +/// Web send can be enabled independently of the v2/v3 protocol endpoints. +pub struct WebSendConfig { + /// The metadata of the files offered for download, mapped by file ID. + /// + /// The content is requested from the application per download + /// via [`WebSendEvent::FileDownload`]. + pub files: HashMap, + + /// Optional PIN that web clients must provide via the `pin` query parameter. + pub pin: Option, + + /// Translations for the web page, served via `/i18n.json`. + pub i18n: WebSendI18n, + + /// Channel on which the server emits events that must be handled by the application. + pub event_tx: mpsc::Sender, +} + +/// Translations for the web page, served via `/i18n.json`. +#[derive(Clone, Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct WebSendI18n { + pub waiting: String, + pub enter_pin: String, + pub invalid_pin: String, + pub too_many_attempts: String, + pub rejected: String, + pub files: String, + pub file_name: String, + pub size: String, +} + +impl Default for WebSendI18n { + fn default() -> Self { + Self { + waiting: "Waiting for response…".to_string(), + enter_pin: "Enter PIN".to_string(), + invalid_pin: "Invalid PIN".to_string(), + too_many_attempts: "Too many attempts".to_string(), + rejected: "Rejected".to_string(), + files: "Files".to_string(), + file_name: "File name".to_string(), + size: "Size".to_string(), + } + } +} + +/// Runtime state of the web send (download API) endpoints. +pub(crate) struct WebPageState { + /// The metadata of the files offered for download, mapped by file ID. + pub(crate) files: HashMap, + + /// Optional PIN required for prepare-download requests. + pub(crate) pin: Option, + + /// Translations served via `/i18n.json`. + pub(crate) i18n: WebSendI18n, + + /// Channel on which server events are emitted to the application. + pub(crate) event_tx: mpsc::Sender, + + /// Download sessions, keyed by session ID (the client's IP address). + pub(crate) sessions: Mutex>, + + /// Maps client IPs to the number of failed PIN attempts. + pub(crate) pin_attempts: Mutex>, +} + +impl WebPageState { + pub(crate) fn new(config: WebSendConfig) -> Self { + Self { + files: config.files, + pin: config.pin, + i18n: config.i18n, + event_tx: config.event_tx, + sessions: Mutex::new(HashMap::new()), + pin_attempts: Mutex::new(LruCache::new(NonZeroUsize::new(200).unwrap())), + } + } +} + +/// A download session of a single web client. +pub(crate) struct WebSendSession { + /// The IP address of the web client. Downloads are only allowed from this address. + ip: IpAddr, + + /// `false` while the prepare-download request is waiting for the application's decision. + accepted: bool, +} + +pub(crate) fn index(state: &AppState) -> Response { + match &state.web { + Some(_) => html_response(StatusCode::OK, INDEX_HTML, "text/html; charset=utf-8"), + None => error_403_page(), + } +} + +pub(crate) fn main_js(state: &AppState) -> Response { + match &state.web { + Some(_) => html_response(StatusCode::OK, MAIN_JS, "text/javascript; charset=utf-8"), + None => error_403_page(), + } +} + +pub(crate) fn i18n(state: &AppState) -> Result, AppError> { + let web = require_web(state)?; + + Ok(JsonResponse { + status: StatusCode::OK, + body: &web.i18n, + } + .into_response()) +} + +pub(crate) async fn prepare_download( + req: Request, + state: AppState, + client_info: RequestClientInfo, +) -> Result, AppError> { + let web = require_web(&state)?; + let query = parse_query(req.uri().query()); + + // An accepted client can re-fetch the file list (e.g. page reload). + if let Some(session_id) = query.get("sessionId") { + let sessions = web.sessions.lock().await; + let valid = sessions + .get(session_id) + .is_some_and(|session| session.accepted && session.ip == client_info.ip); + if valid { + drop(sessions); + return Ok(file_list_response(&state, &web, session_id.clone()).await); + } + } + + check_pin( + web.pin.as_deref(), + &web.pin_attempts, + &query, + client_info.ip, + ) + .await?; + + let user_agent = req + .headers() + .get(http::header::USER_AGENT) + .and_then(|value| value.to_str().ok()) + .map(str::to_string); + + // One session per IP; a new request replaces any previous session of this client. + let session_id = client_info.ip.to_string(); + { + let mut sessions = web.sessions.lock().await; + sessions.insert( + session_id.clone(), + WebSendSession { + ip: client_info.ip, + accepted: false, + }, + ); + } + + // Removes the pending session again if this request is declined or aborted + // before the application accepted it. + let mut pending_guard = PendingWebSessionGuard::new(web.clone(), session_id.clone()); + + let (decision_tx, decision_rx) = oneshot::channel(); + let event = WebSendEvent::PrepareDownload { + ip: client_info.ip, + session_id: session_id.clone(), + user_agent, + decision_tx, + }; + if web.event_tx.send(event).await.is_err() { + return Err(AppError::Status(StatusCode::INTERNAL_SERVER_ERROR)); + } + + let accepted = decision_rx + .await + .map_err(|_| AppError::Status(StatusCode::INTERNAL_SERVER_ERROR))?; + + if !accepted { + pending_guard.clear().await; + return Err(AppError::Message( + StatusCode::FORBIDDEN, + "File transfer rejected.".to_string(), + )); + } + + { + let mut sessions = web.sessions.lock().await; + if let Some(session) = sessions.get_mut(&session_id) { + session.accepted = true; + } + } + pending_guard.disarm(); + + tracing::info!("Download session created: {session_id}"); + + Ok(file_list_response(&state, &web, session_id).await) +} + +pub(crate) async fn download( + req: Request, + state: AppState, + client_info: RequestClientInfo, +) -> Result, AppError> { + let web = require_web(&state)?; + let query = parse_query(req.uri().query()); + + let Some(session_id) = query.get("sessionId") else { + return Err(AppError::BadRequest("Missing sessionId.".to_string())); + }; + + { + let sessions = web.sessions.lock().await; + let valid = sessions + .get(session_id) + .is_some_and(|session| session.accepted && session.ip == client_info.ip); + if !valid { + return Err(AppError::Message( + StatusCode::FORBIDDEN, + "Invalid sessionId.".to_string(), + )); + } + } + + let Some(file_id) = query.get("fileId") else { + return Err(AppError::BadRequest("Missing fileId.".to_string())); + }; + + let Some(file) = web.files.get(file_id) else { + return Err(AppError::Message( + StatusCode::FORBIDDEN, + "Invalid fileId.".to_string(), + )); + }; + + // The application provides the file content as a stream of bytes. + let (content_tx, content_rx) = oneshot::channel(); + let event = WebSendEvent::FileDownload { + session_id: session_id.clone(), + file_id: file_id.clone(), + file: file.clone(), + content_tx, + }; + if web.event_tx.send(event).await.is_err() { + return Err(AppError::Status(StatusCode::INTERNAL_SERVER_ERROR)); + } + + let binary_rx = content_rx + .await + .map_err(|_| AppError::Status(StatusCode::INTERNAL_SERVER_ERROR))?; + + let size = file.size; + let body = receiver_stream_body(binary_rx); + + // The file name may be inside directories. + let file_name = file.file_name.replace('/', "-"); + let encoded_file_name = utf8_percent_encode(&file_name, FILE_NAME_ENCODE_SET); + + let mut response = Response::new(body); + let headers = response.headers_mut(); + headers.insert( + http::header::CONTENT_TYPE, + http::HeaderValue::from_static("application/octet-stream"), + ); + headers.insert( + http::header::CONTENT_DISPOSITION, + http::HeaderValue::from_str(&format!("attachment; filename=\"{encoded_file_name}\"")) + .map_err(|_| AppError::Status(StatusCode::INTERNAL_SERVER_ERROR))?, + ); + headers.insert(http::header::CONTENT_LENGTH, http::HeaderValue::from(size)); + + Ok(response) +} + +fn require_web(state: &AppState) -> Result, AppError> { + state.web.clone().ok_or(AppError::Message( + StatusCode::FORBIDDEN, + "Web send not initialized.".to_string(), + )) +} + +fn html_response( + status: StatusCode, + content: &'static str, + content_type: &'static str, +) -> Response { + let mut response = Response::new(full_body(content)); + *response.status_mut() = status; + response.headers_mut().insert( + http::header::CONTENT_TYPE, + http::HeaderValue::from_static(content_type), + ); + response +} + +fn error_403_page() -> Response { + html_response( + StatusCode::FORBIDDEN, + ERROR_403_HTML, + "text/html; charset=utf-8", + ) +} + +async fn file_list_response( + state: &AppState, + web: &WebPageState, + session_id: String, +) -> Response { + let info = state.info.lock().await.clone(); + + JsonResponse { + status: StatusCode::OK, + body: PrepareDownloadResponseDtoV2 { + info: InfoResponseDtoV2 { + alias: info.alias, + version: PROTOCOL_VERSION_V2.to_string(), + device_model: info.device_model, + device_type: info.device_type, + fingerprint: info.token, + download: true, + }, + session_id, + files: web.files.clone(), + }, + } + .into_response() +} + +/// Streams application-provided chunks as a response body. +fn receiver_stream_body(binary_rx: mpsc::Receiver) -> BoxedBody { + let stream = + ReceiverStream::new(binary_rx).map(|chunk| Ok::<_, std::io::Error>(Frame::data(chunk))); + StreamBody::new(stream).boxed() +} + +/// Removes a pending download session unless it was accepted. +/// +/// The cleanup also runs on drop so the session is not leaked +/// when the request future is cancelled (e.g. the web client disconnected +/// while the application was still deciding). +struct PendingWebSessionGuard { + web: Arc, + session_id: String, + armed: bool, +} + +impl PendingWebSessionGuard { + fn new(web: Arc, session_id: String) -> Self { + Self { + web, + session_id, + armed: true, + } + } + + /// Disarms the guard after the session was accepted. + fn disarm(&mut self) { + self.armed = false; + } + + /// Removes the pending session immediately. + async fn clear(&mut self) { + self.armed = false; + clear_pending_session(&self.web, &self.session_id).await; + } +} + +impl Drop for PendingWebSessionGuard { + fn drop(&mut self) { + if !self.armed { + return; + } + let web = self.web.clone(); + let session_id = std::mem::take(&mut self.session_id); + tokio::spawn(async move { + clear_pending_session(&web, &session_id).await; + }); + } +} + +async fn clear_pending_session(web: &WebPageState, session_id: &str) { + let mut sessions = web.sessions.lock().await; + if sessions + .get(session_id) + .is_some_and(|session| !session.accepted) + { + sessions.remove(session_id); + } +} diff --git a/core/src/http/server/error.rs b/core/src/http/server/error.rs new file mode 100644 index 0000000..18227d3 --- /dev/null +++ b/core/src/http/server/error.rs @@ -0,0 +1,47 @@ +use crate::http::dto::ErrorResponse; +use crate::http::server::response::{BoxedBody, JsonResponse}; +use hyper::{Response, StatusCode}; + +#[derive(Debug, thiserror::Error)] +pub enum AppError { + #[error("Hyper error: {0}")] + Hyper(#[from] hyper::Error), + + #[error("Status Error: {0}")] + Status(StatusCode), + + #[error("Invalid request: {0}")] + BadRequest(String), + + #[error("{0}: {1}")] + Message(StatusCode, String), +} + +impl AppError { + pub(crate) fn to_response(self) -> Response { + let json = match self { + AppError::Hyper(_) => JsonResponse { + status: StatusCode::INTERNAL_SERVER_ERROR, + body: ErrorResponse { + message: "Internal server error".to_string(), + }, + }, + AppError::Status(code) => JsonResponse { + status: code, + body: ErrorResponse { + message: format!("Status code: {code}"), + }, + }, + AppError::BadRequest(message) => JsonResponse { + status: StatusCode::BAD_REQUEST, + body: ErrorResponse { message }, + }, + AppError::Message(status, message) => JsonResponse { + status, + body: ErrorResponse { message }, + }, + }; + + json.into_response() + } +} diff --git a/core/src/http/server/mod.rs b/core/src/http/server/mod.rs new file mode 100644 index 0000000..adf7afc --- /dev/null +++ b/core/src/http/server/mod.rs @@ -0,0 +1,397 @@ +mod client_cert_verifier; +mod collect_to_json; +mod controller; +mod error; +mod query; +mod response; +mod session; + +pub use crate::http::server::controller::v2::{ + PrepareUploadDecisionV2, ServerEventV2, SessionEndReasonV2, +}; +pub use crate::http::server::controller::web::{WebSendConfig, WebSendEvent, WebSendI18n}; + +use crate::crypto::cert::public_key_from_cert_der; +use crate::http::server::client_cert_verifier::CustomClientCertVerifier; +use crate::http::server::controller::web::WebPageState; +use crate::http::server::error::AppError; +use crate::http::server::response::BoxedBody; +use crate::http::server::session::SessionStateV2; +use crate::http::state::ClientInfo; +use hyper::body::Incoming; +use hyper::{Method, Request, Response, StatusCode}; +use hyper_util::rt::{TokioExecutor, TokioIo}; +use hyper_util::server::conn::auto::Builder; +use lru::LruCache; +use rustls::pki_types::pem::PemObject; +use rustls::pki_types::{CertificateDer, PrivateKeyDer}; +use std::fmt::Debug; +use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; +use std::num::NonZeroUsize; +use std::ops::Deref; +use std::sync::Arc; +use tokio::sync::{mpsc, oneshot, Mutex}; + +/// Configuration for the v2 (legacy) protocol endpoints. +pub struct ServerConfigV2 { + /// Optional PIN that senders must provide via the `pin` query parameter. + pub pin: Option, + + /// Channel on which the server emits events that must be handled by the application. + pub event_tx: mpsc::Sender, +} + +/// Runtime state of the v2 protocol endpoints. +pub(crate) struct V2State { + /// Optional PIN required for prepare-upload requests. + pub(crate) pin: Option, + + /// Channel on which server events are emitted to the application. + pub(crate) event_tx: mpsc::Sender, + + /// The single upload session slot. Only one session can be active at a time. + pub(crate) session: Mutex>, + + /// Maps client IPs to the number of failed PIN attempts. + pub(crate) pin_attempts: Mutex>, +} + +#[derive(Clone)] +struct AppState { + /// Information about server's device. + info: Arc>, + + /// State for serving web pages. + web: Option>, + + /// Maps client identifiers to nonces that have been received from remote. + received_nonce_map: Arc>>>, + + /// Maps client identifiers to nonces that are expected to be received from remote. + generated_nonce_map: Arc>>>, + + /// State of the v2 protocol endpoints. `None` disables the v2 routes. + v2: Option>, +} + +impl AppState { + fn new( + info: Arc>, + v2_config: Option, + web_send_config: Option, + ) -> Self { + let v2 = v2_config.map(|config| { + Arc::new(V2State { + pin: config.pin, + event_tx: config.event_tx, + session: Mutex::new(None), + pin_attempts: Mutex::new(LruCache::new(NonZeroUsize::new(200).unwrap())), + }) + }); + + let web = web_send_config.map(|config| Arc::new(WebPageState::new(config))); + + Self { + info, + web, + received_nonce_map: Arc::new(Mutex::new(LruCache::new( + NonZeroUsize::new(200).unwrap(), + ))), + generated_nonce_map: Arc::new(Mutex::new(LruCache::new( + NonZeroUsize::new(200).unwrap(), + ))), + v2, + } + } +} + +/// Binds the server to the specified port on both IPv4 and IPv6 addresses. +pub async fn start_with_port( + port: u16, + tls_config: Option, + info: ClientInfo, + v2_config: Option, + web_send_config: Option, + stop_rx: oneshot::Receiver<()>, +) -> anyhow::Result<()> { + let ipv4_socket_addr = SocketAddr::new(Ipv4Addr::UNSPECIFIED.into(), port); + let ipv6_socket_addr = SocketAddr::new(Ipv6Addr::UNSPECIFIED.into(), port); + let info = Arc::new(Mutex::new(info)); + let state = AppState::new(info.clone(), v2_config, web_send_config); + + let ipv4_listener = tokio::net::TcpListener::bind(ipv4_socket_addr).await?; + let ipv6_listener = match bind_ipv6_only(ipv6_socket_addr) { + Ok(listener) => Some(listener), + Err(err) => { + tracing::warn!("Failed to start server on {}: {err:#}", ipv6_socket_addr); + None + } + }; + + tokio::spawn({ + let state = state.clone(); + async move { + tokio::select! { + _ = start_server_with_listener(ipv4_listener, tls_config.clone(), state.clone()) => { + tracing::info!("Server stopped on: {}", ipv4_socket_addr); + } + _ = async { + if let Some(listener) = ipv6_listener { + let _ = start_server_with_listener(listener, tls_config, state).await; + } + + // Keep the future running forever, so we continue using "ipv4 only" even if ipv6 fails. + tokio::time::sleep(std::time::Duration::from_secs(u64::MAX)).await; + } => {} + _ = stop_rx => {} + } + } + }); + + Ok(()) +} + +/// Binds an IPv6 listener with `IPV6_V6ONLY` enabled. +/// +/// Without this flag, some systems (e.g. macOS) bind IPv6 wildcard sockets in +/// dual-stack mode, which conflicts with the separate IPv4 listener on the same port. +fn bind_ipv6_only(socket_addr: SocketAddr) -> anyhow::Result { + let socket = socket2::Socket::new( + socket2::Domain::IPV6, + socket2::Type::STREAM, + Some(socket2::Protocol::TCP), + )?; + socket.set_only_v6(true)?; + #[cfg(not(windows))] + socket.set_reuse_address(true)?; + socket.set_nonblocking(true)?; + socket.bind(&socket_addr.into())?; + socket.listen(1024)?; + Ok(tokio::net::TcpListener::from_std(socket.into())?) +} + +#[derive(Clone, Debug)] +pub struct TlsConfig { + pub cert: String, + pub private_key: String, +} + +async fn start_server_with_listener( + incoming: tokio::net::TcpListener, + tls_config: Option, + app_state: AppState, +) -> anyhow::Result<()> { + let _ = rustls::crypto::ring::default_provider().install_default(); + + let tls_acceptor = match tls_config { + Some(tls_config) => Some(create_tls_config(&tls_config).inspect_err(|err| { + tracing::error!("failed to create tls config: {err:#}"); + })?), + None => None, + }; + + tracing::info!( + "Started server on {} (TLS: {})", + incoming.local_addr()?, + tls_acceptor.is_some() + ); + + loop { + let (tcp_stream, remote_addr) = incoming.accept().await?; + + let tls_acceptor = tls_acceptor.clone(); + let app_state = app_state.clone(); + tokio::spawn(async move { + let res = match tls_acceptor { + Some(tls_acceptor) => { + let tls_stream = match tls_acceptor.accept(tcp_stream).await { + Ok(tls_stream) => tls_stream, + Err(err) => { + tracing::warn!("TLS handshake error: {err:#}"); + return; + } + }; + + let client_info = { + let (_, server_connection) = tls_stream.get_ref(); + RequestClientInfo { + ip: remote_addr.ip(), + cert: server_connection + .deref() + .deref() + .peer_certificates() + .map(|cert| cert.get(0).unwrap().to_vec()), + } + }; + + Builder::new(TokioExecutor::new()) + .serve_connection( + TokioIo::new(tls_stream), + hyper::service::service_fn(move |mut req: Request| { + req.extensions_mut() + .insert::(client_info.clone()); + req.extensions_mut().insert::(app_state.clone()); + handle_request(req) + }), + ) + .await + } + None => { + Builder::new(TokioExecutor::new()) + .serve_connection( + TokioIo::new(tcp_stream), + hyper::service::service_fn(move |mut req: Request| { + req.extensions_mut().insert::( + RequestClientInfo { + ip: remote_addr.ip(), + cert: None, + }, + ); + req.extensions_mut().insert::(app_state.clone()); + handle_request(req) + }), + ) + .await + } + }; + + if let Err(err) = res { + tracing::warn!("Failed to serve connection: {err:#}"); + } + }); + } +} + +fn create_tls_config(tls_config: &TlsConfig) -> anyhow::Result { + let config = { + let certs = vec![CertificateDer::from_pem_slice(&tls_config.cert.as_bytes())?]; + let key = PrivateKeyDer::from_pem_slice(&tls_config.private_key.as_bytes())?; + + rustls::ServerConfig::builder() + .with_client_cert_verifier(Arc::new(CustomClientCertVerifier::try_new( + &tls_config.cert, + )?)) + .with_single_cert(certs, key)? + }; + Ok(tokio_rustls::TlsAcceptor::from(Arc::new(config))) +} + +#[derive(Clone, Debug)] +struct RequestClientInfo { + /// The IP address of the client. + ip: IpAddr, + + /// The client certificate in DER format. + cert: Option>, +} + +impl RequestClientInfo { + fn extract_public_key(&self) -> Option { + match &self.cert { + Some(cert) => match public_key_from_cert_der(cert) { + Ok(public_key) => Some(public_key), + Err(err) => { + tracing::warn!("Failed to extract public key from certificate: {err:#}"); + None + } + }, + None => None, + } + } + + fn identifier(&self) -> String { + self.extract_public_key() + .unwrap_or_else(|| self.ip.to_string()) + } +} + +async fn handle_request(req: Request) -> Result, hyper::Error> { + Ok(handle_request_inner(req).await.unwrap_or_else(|err| { + tracing::error!("Error handling request: {err:?}"); + err.to_response() + })) +} + +async fn handle_request_inner( + mut req: Request, +) -> Result, AppError> { + let Some(state) = req.extensions_mut().remove::() else { + return Err(AppError::Status(StatusCode::INTERNAL_SERVER_ERROR)); + }; + + let Some(client_info) = req.extensions_mut().remove::() else { + return Err(AppError::Status(StatusCode::INTERNAL_SERVER_ERROR)); + }; + + let v2_enabled = state.v2.is_some(); + + match (req.method(), req.uri().path()) { + (&Method::GET, "/") => Ok(controller::web::index(&state)), + (&Method::GET, "/main.js") => Ok(controller::web::main_js(&state)), + (&Method::GET, "/i18n.json") => controller::web::i18n(&state), + (&Method::POST, "/api/localsend/v2/prepare-download") => { + controller::web::prepare_download(req, state, client_info).await + } + (&Method::GET, "/api/localsend/v2/download") => { + controller::web::download(req, state, client_info).await + } + (&Method::POST, "/api/localsend/v2/register") => { + if !v2_enabled { + return Err(AppError::Status(StatusCode::NOT_FOUND)); + } + + Ok( + controller::v2::register(req.into_body(), state, client_info) + .await? + .into_response(), + ) + } + (&Method::GET, "/api/localsend/v2/info") => { + if !v2_enabled { + return Err(AppError::Status(StatusCode::NOT_FOUND)); + } + + Ok(controller::v2::info(state).await?.into_response()) + } + (&Method::POST, "/api/localsend/v2/prepare-upload") => { + if !v2_enabled { + return Err(AppError::Status(StatusCode::NOT_FOUND)); + } + + controller::v2::prepare_upload(req, state, client_info).await + } + (&Method::POST, "/api/localsend/v2/upload") => { + if !v2_enabled { + return Err(AppError::Status(StatusCode::NOT_FOUND)); + } + + controller::v2::upload(req, state, client_info).await + } + (&Method::POST, "/api/localsend/v2/cancel") => { + if !v2_enabled { + return Err(AppError::Status(StatusCode::NOT_FOUND)); + } + + controller::v2::cancel(req, state).await + } + (&Method::POST, "/api/localsend/v3/nonce") => { + Ok( + controller::v3::nonce_exchange(req.into_body(), state, client_info) + .await? + .into_response(), + ) + } + (&Method::POST, "/api/localsend/v3/register") => { + Ok( + controller::v3::register(req.into_body(), state, client_info) + .await? + .into_response(), + ) + } + _ => { + let mut res = Response::new(response::empty_body()); + *res.status_mut() = StatusCode::NOT_FOUND; + Ok(res) + } + } +} diff --git a/core/src/http/server/query.rs b/core/src/http/server/query.rs new file mode 100644 index 0000000..b26b4fe --- /dev/null +++ b/core/src/http/server/query.rs @@ -0,0 +1,45 @@ +use std::collections::HashMap; + +/// Parses a URL query string into a key-value map with percent-decoding. +pub(crate) fn parse_query(query: Option<&str>) -> HashMap { + let Some(query) = query else { + return HashMap::new(); + }; + + form_urlencoded::parse(query.as_bytes()) + .map(|(key, value)| (key.into_owned(), value.into_owned())) + .collect() +} + +#[cfg(test)] +mod tests { + use super::parse_query; + + #[test] + fn test_parse_query() { + let query = parse_query(Some("sessionId=abc&fileId=some%20file&token=a%2Bb+c")); + assert_eq!(query.get("sessionId").unwrap(), "abc"); + assert_eq!(query.get("fileId").unwrap(), "some file"); + assert_eq!(query.get("token").unwrap(), "a+b c"); + } + + #[test] + fn test_parse_query_empty() { + assert!(parse_query(None).is_empty()); + assert!(parse_query(Some("")).is_empty()); + } + + #[test] + fn test_parse_query_no_value() { + let query = parse_query(Some("flag&pin=123456")); + assert_eq!(query.get("flag").unwrap(), ""); + assert_eq!(query.get("pin").unwrap(), "123456"); + } + + #[test] + fn test_parse_query_invalid_percent() { + let query = parse_query(Some("a=%zz&b=%4")); + assert_eq!(query.get("a").unwrap(), "%zz"); + assert_eq!(query.get("b").unwrap(), "%4"); + } +} \ No newline at end of file diff --git a/core/src/http/server/response.rs b/core/src/http/server/response.rs new file mode 100644 index 0000000..259d677 --- /dev/null +++ b/core/src/http/server/response.rs @@ -0,0 +1,43 @@ +use bytes::Bytes; +use http_body_util::combinators::BoxBody; +use http_body_util::{BodyExt, Full}; +use hyper::{http, Response, StatusCode}; +use serde::Serialize; + +/// Response body that is either fully buffered or streamed (e.g. file downloads). +pub(crate) type BoxedBody = BoxBody; + +/// Creates a fully buffered response body. +pub(crate) fn full_body(bytes: impl Into) -> BoxedBody { + Full::new(bytes.into()) + .map_err(std::io::Error::other) + .boxed() +} + +/// Creates an empty response body. +pub(crate) fn empty_body() -> BoxedBody { + full_body(Bytes::new()) +} + +pub(crate) struct JsonResponse { + pub(crate) status: StatusCode, + pub(crate) body: T, +} + +impl JsonResponse { + pub(crate) fn into_response(self) -> Response { + let mut response = Response::new(empty_body()); + *response.status_mut() = self.status; + + response.headers_mut().insert( + http::header::CONTENT_TYPE, + http::HeaderValue::from_static("application/json"), + ); + + *response.body_mut() = full_body( + serde_json::to_string(&self.body).unwrap_or_else(|_| "{}".to_string()), + ); + + response + } +} diff --git a/core/src/http/server/session.rs b/core/src/http/server/session.rs new file mode 100644 index 0000000..d053090 --- /dev/null +++ b/core/src/http/server/session.rs @@ -0,0 +1,48 @@ +use crate::model::transfer::FileDto; +use std::collections::HashMap; +use std::net::IpAddr; + +/// State of the single v2 upload session slot. +pub(crate) enum SessionStateV2 { + /// A prepare-upload request is waiting for the application's decision. + Pending, + + /// An accepted upload session. + Active(UploadSessionV2), +} + +pub(crate) struct UploadSessionV2 { + pub(crate) session_id: String, + + /// The IP address of the sender. Uploads are only accepted from this address. + pub(crate) sender_ip: IpAddr, + + /// The accepted files, mapped by file ID. + pub(crate) files: HashMap, +} + +impl UploadSessionV2 { + /// Whether all files reached a final state. + pub(crate) fn is_complete(&self) -> bool { + self.files + .values() + .all(|file| matches!(file.status, FileStatusV2::Finished | FileStatusV2::Failed)) + } +} + +pub(crate) struct SessionFileV2 { + pub(crate) dto: FileDto, + + /// The file-specific token required for the upload request. + pub(crate) token: String, + + pub(crate) status: FileStatusV2, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum FileStatusV2 { + Pending, + InProgress, + Finished, + Failed, +} diff --git a/core/src/http/state.rs b/core/src/http/state.rs new file mode 100644 index 0000000..bfb8efd --- /dev/null +++ b/core/src/http/state.rs @@ -0,0 +1,25 @@ +use serde::{Deserialize, Serialize}; +use crate::model::discovery::DeviceType; + +#[derive(Clone, Debug, Deserialize, Eq, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct ClientInfo { + /// The name of the peer. + pub alias: String, + + /// Client Protocol Version (major.minor) + pub version: String, + + /// The device model of the peer. + /// Windows, macOS, iPhone, Samsung, etc. + #[serde(skip_serializing_if = "Option::is_none")] + pub device_model: Option, + + /// The device type of the peer. + #[serde(skip_serializing_if = "Option::is_none")] + pub device_type: Option, + + /// A token generated by the client. + /// Used to merge the same peers detected on different channels (LAN, WebRTC, etc.). + pub token: String, +} diff --git a/core/src/lib.rs b/core/src/lib.rs new file mode 100644 index 0000000..540128b --- /dev/null +++ b/core/src/lib.rs @@ -0,0 +1,11 @@ +#[cfg(feature = "crypto")] +pub mod crypto; +#[cfg(feature = "http")] +pub mod http; +pub mod model; +pub(crate) mod util; +pub mod webrtc; + +#[cfg(feature = "http")] +pub use reqwest; +pub use serde_json; diff --git a/core/src/main.rs b/core/src/main.rs new file mode 100644 index 0000000..9efda1d --- /dev/null +++ b/core/src/main.rs @@ -0,0 +1,574 @@ +mod crypto; +mod http; +mod model; +mod util; +mod webrtc; + +use crate::crypto::token; +use crate::http::client::LsHttpClientV3; +use crate::http::dto::{PrepareUploadRequestDto, ProtocolType, RegisterDto}; +use crate::http::server::{PrepareUploadDecisionV2, ServerEventV2}; +use crate::http::server::{ServerConfigV2, TlsConfig}; +use crate::model::discovery::DeviceType; +use crate::webrtc::signaling::{ClientInfo, WsServerMessage}; +use crate::webrtc::webrtc::{PinConfig, RTCFile, RTCFileError, RTCSendFileResponse, RTCStatus}; +use anyhow::Result; +use bytes::Bytes; +use std::collections::{HashMap, HashSet}; +use std::sync::Arc; +use tokio::fs::File; +use tokio::io; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::sync::{mpsc, oneshot}; +use tracing::Level; + +#[tokio::main] +#[cfg(feature = "full")] +async fn main() -> Result<()> { + tracing_subscriber::fmt() + .with_max_level(Level::DEBUG) + .init(); + + webrtc_test().await?; + + let a = tokio::spawn(async move { + let _ = server_test().await; + }); + + let b = tokio::spawn(async move { + tokio::time::sleep(std::time::Duration::from_secs(2)).await; + let _ = client_test().await; + }); + + tokio::select! { + _ = a => {}, + _ = b => {}, + } + + Ok(()) +} + +const PRIVATE_KEY: &str = "-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAqeusikjBGJ/mqG+RYPyNaP2M6/YafR5bVcEr0NirDntRaSI8 +SBVy6ezqGnpJJpez2rVcLfqPOZNW+yhiWmX/DFGAbKWNUjpAfEgQ0ySS3EKEfTGa +kpbBgVmSgnJKu0cuFHk3LRQXZc9USWRtfZu/HLwrxeTy0ynKBjqctkcJmyEOleSE +tWwx/sFUszI4j3QH7iAg+jJu07qCaBv1iOVoFLwtvtkHP4pIflPi4FR0nUn8VpTR +8j3h1Z/Ea6j2nW/CfatfhOiwrlOgjpd1CFtU5OoUk0OiHYgUTLRvOR0ebmKLJZp9 +2x85h3ucuwzcNHXds6IrBsV7dcMeN9+nI2yYHwIDAQABAoIBAAYVzZEKN/gUyeLg +U/mAMeQ/qEtO/fXbH3Q7vcD18XJMUkcMldITCpF8DYozNOlv513+vrVa0sRCFYxb +DuKj4nVjedDqQNxf/60zu36EQconi60cGKgFRBrIxWlshGaejvTmvmYb4RahTShv +s0gbSsXRq1Oj9lo/ld+RO8l/U8W9Y2KlHc14VbAHCxlBd70Ngpw/hKzt7jVwUt2O +QMAgek5Ffbjoqk/GvwdYFtgLHLYKWNdaqt/dGCZcDWPNOv93Lb+XuI3orAcSr5T7 +V2fseLMrrQfKr4dK+DSxvB/McAahSY+6sxpm972D1MYBoDM/yCK/jcdV4T83ofIl +tnavOyECgYEA077OpgXt798miVtybRgPv2cEZHnMZStHhNOO/3A2J0mnT5lCGT8M +FnB45LE7NxP5yXLi1/cBSazwF/W2TKu4g42y9X0lPzik6uM4F7AZLCwO6zd4etwa +NwKjCiPBGJkWBODQ2IeK6Gy9gnTAnGhzuPoTYEl2AH5REbM8btsRve8CgYEAzW8U +8sztt1cLWKwAsf66KZOjU03UoAhgofhXeyCDW4tLZ/l7F2cEfRaRkIx40TU1tNSy +R130DsiRmJ/7vSy00qaC7IZgFRnDXM8oWSvE31p3AiZEvMzh3cMl67u/TPFn/Zhr +iDE2fxTmNf9a860IbYeGqbOj11fFsSMNZIYf+NECgYACR/Ht8+5mQR8nJ6cJ6dJx +m2h+tJkxFdBFbAoEUm8i6TY2M050+yrkKv4CaK5cn4h3VReAgBaxdn13pJv8I3Vv +ZV1iK6D1F2Ufaqc2Ch2bTjYy7nwLxsc5hHvBJjV0UGHeV5WoX31tl45LE3rntHBa +s8b1qJTu2G2DJU0nXJDKXQKBgEhxvrpsp/u6d2baqRgb0vxscvEihjO1IJadpAPo +kEoNEhdldBHpozyVY9nMn6JvGDRfuUrPiAxakHV5HWY1yMJsM8lDDckDH9CvwPPJ +KpD1LviUFDNcMN5qPgomWCzDCL/2Kx2I9UXVUeWC2kkKIOm3HDbmAYYkDrQLv2JO +piGxAoGAfbhVHgMhroI64t64NaVpXiHy2bd36q7hLVm2+bTDpPphHwn4kIsFvVr3 +uGPVsyoOa68s1eXnOnh5TzhTltsjyAYfiKo/7ZX6mHMctFlgt4njailDWOqHwj0c +Uy/QlsvXsOcN/Y99HULigND8C49F5Sz9Ih9G1DGLvd0BUUI/+qg= +-----END RSA PRIVATE KEY-----"; + +const CERT: &str = "-----BEGIN CERTIFICATE----- +MIIDGTCCAgGgAwIBAgIBATANBgkqhkiG9w0BAQsFADBQMRcwFQYDVQQDEw5Mb2Nh +bFNlbmQgVXNlcjEJMAcGA1UEChMAMQkwBwYDVQQLEwAxCTAHBgNVBAcTADEJMAcG +A1UECBMAMQkwBwYDVQQGEwAwHhcNMjUwMjEwMDE1ODM3WhcNMzUwMjA4MDE1ODM3 +WjBQMRcwFQYDVQQDEw5Mb2NhbFNlbmQgVXNlcjEJMAcGA1UEChMAMQkwBwYDVQQL +EwAxCTAHBgNVBAcTADEJMAcGA1UECBMAMQkwBwYDVQQGEwAwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCp66yKSMEYn+aob5Fg/I1o/Yzr9hp9HltVwSvQ +2KsOe1FpIjxIFXLp7Ooaekkml7PatVwt+o85k1b7KGJaZf8MUYBspY1SOkB8SBDT +JJLcQoR9MZqSlsGBWZKCckq7Ry4UeTctFBdlz1RJZG19m78cvCvF5PLTKcoGOpy2 +RwmbIQ6V5IS1bDH+wVSzMjiPdAfuICD6Mm7TuoJoG/WI5WgUvC2+2Qc/ikh+U+Lg +VHSdSfxWlNHyPeHVn8RrqPadb8J9q1+E6LCuU6COl3UIW1Tk6hSTQ6IdiBRMtG85 +HR5uYoslmn3bHzmHe5y7DNw0dd2zoisGxXt1wx4336cjbJgfAgMBAAEwDQYJKoZI +hvcNAQELBQADggEBAJ/bopM5NjK/Roi1bS+qAQ7EHeVNfLyPgAReyJESHsg3mBEE +FhP729KlHcNCvaAnmxEaUH2XZTmP3s0m9IVabHhdFEyIibMQ/Qpid/JIDsG2IRw7 +oNJj8z0C7eDjC9eWR+wZ2d0nnyNpWghcqAqqZSBuNpJ9jDqmg4LzdNXZUvh9e1Cq +qizxa3CQEHRYqdL/hA1N6eq7GkeiIeP+cbvWGmcSf8SS/ORMKvvDGzkGs2mFZnY/ +DZmiOOqkzvgZOgOVQ2vFuJIXyZ/tY0ez35dtQYLhKRljlXjckA/PFuTJDa2kq1Rv +qqsPsY3pRq93zkKNx1xRtURBiJEvA/Js2+hHWrU= +-----END CERTIFICATE-----"; + +async fn crypto_test() -> Result<()> { + let key = token::generate_key(); + + let pem = token::export_private_key(&key)?; + + println!("Pem: {}", pem.as_str()); + + let public_key = token::export_public_key(&key)?; + + println!("Public Key: {}", public_key); + + let fingerprint = token::generate_token_timestamp(&key)?; + + println!("Fingerprint: {}", fingerprint); + + let parsed_key = token::parse_public_key( + "-----BEGIN PUBLIC KEY----- +MCowBQYDK2VwAyEAZmdXP230oqK92o65ra3XaF2F8r3+fK5DEBK4c40qVts= +-----END PUBLIC KEY-----", + "ed25519", + )?; + + let signature = token::verify_token_with_result( + &*parsed_key, + "sha256.RikOdJlAUTdMVFZjEk7Bft5G9cxnNBBLfgttPpyS2FY.hJCuZwAAAAA.ed25519.iNgHrRzX2Iel-Ozj47yn5o5v0cGY_BswK6JYqwY65j7Krpr43KanAaCrjUng7gHtc2pCcylUrKswR_rxyswhDA", + |_| Ok(()), + ); + + println!("Signature Verification: {:?}", signature); + + Ok(()) +} + +async fn server_test() -> Result<()> { + let client_info = http::state::ClientInfo { + alias: "Server-Test".to_string(), + version: "1.2.3".to_string(), + device_model: None, + device_type: None, + token: "456".to_string(), + }; + + let (stop_tx, stop_rx) = oneshot::channel::<()>(); + let (event_tx, mut event_rx) = mpsc::channel::(16); + + tokio::spawn(async move { + while let Some(event) = event_rx.recv().await { + match event { + ServerEventV2::Register { ip, info } => { + tracing::info!("Device registered from {ip}: {}", info.alias); + } + ServerEventV2::PrepareUpload { + info, + files, + decision_tx, + .. + } => { + tracing::info!( + "Prepare upload from {}: {} file(s)", + info.alias, + files.len() + ); + + // Accept all files. + let _ = decision_tx.send(PrepareUploadDecisionV2::Accept( + files.keys().cloned().collect(), + )); + } + ServerEventV2::FileUpload { + file, + mut binary_rx, + result_tx, + .. + } => { + tokio::spawn(async move { + let mut received: u64 = 0; + while let Some(chunk) = binary_rx.recv().await { + received += chunk.len() as u64; + } + tracing::info!( + "Received {}/{} bytes of {}", + received, + file.size, + file.file_name + ); + let _ = result_tx.send(Ok(())); + }); + } + ServerEventV2::SessionEnd { session_id, reason } => { + tracing::info!("Session {session_id} ended: {reason:?}"); + } + } + } + }); + + http::server::start_with_port( + 53317, + Some(TlsConfig { + cert: CERT.to_string(), + private_key: PRIVATE_KEY.to_string(), + }), + client_info, + Some(ServerConfigV2 { + pin: None, + event_tx, + }), + None, + stop_rx, + ) + .await?; + + tokio::time::sleep(std::time::Duration::from_secs(u64::MAX)).await; + + let _ = stop_tx.send(()); + Ok(()) +} + +async fn client_test() -> Result<()> { + let client = LsHttpClientV3::try_new(PRIVATE_KEY, CERT)?; + + let nonce = client + .nonce(ProtocolType::Https, "localhost", 53317) + .await?; + + println!("Received Nonce: {}", nonce); + + let register_dto = RegisterDto { + alias: "test 2".to_string(), + version: "2.3".to_string(), + device_model: Some("test".to_string()), + device_type: Some(DeviceType::Headless), + token: "test".to_string(), + port: 53317, + protocol: ProtocolType::Https, + has_web_interface: false, + }; + + let response = client + .register( + ProtocolType::Https, + "localhost", + 53317, + register_dto.clone(), + ) + .await?; + + println!("Public Key: {:?}", response.public_key); + println!("Body: {:?}", response.body); + + let prepare_upload_dto = PrepareUploadRequestDto { + info: register_dto, + files: { + let mut map = HashMap::new(); + let id = "test-123-id".to_string(); + let file = model::transfer::FileDto { + id: id.clone(), + file_name: "test.mp4".to_string(), + size: 1000, + file_type: "video/mp4".to_string(), + sha256: None, + preview: None, + metadata: None, + }; + map.insert(id, file); + map + }, + }; + + let prepare_upload_response = client + .prepare_upload( + ProtocolType::Https, + "localhost", + 53317, + None, + prepare_upload_dto, + ) + .await?; + + println!( + "Prepare Upload Response: {:?}", + prepare_upload_response.response + ); + + Ok(()) +} + +async fn webrtc_test() -> Result<()> { + let info = webrtc::signaling::ClientInfoWithoutId { + alias: "test".to_string(), + version: "2.3".to_string(), + device_model: Some("test".to_string()), + device_type: Some(DeviceType::Desktop), + token: "test".to_string(), + }; + let connection = + webrtc::signaling::SignalingConnection::connect("wss://public.localsend.org/v1/ws", &info) + .await?; + + let (managed_connection, mut rx) = connection.start_listener(); + let managed_connection = Arc::new(managed_connection); + + while let Some(message) = rx.recv().await { + let stun_servers = vec!["stun:stun.l.google.com:19302".to_string()]; + match message { + WsServerMessage::Join { peer } => { + send_handler(managed_connection.clone(), stun_servers, peer).await; + return Ok(()); + } + WsServerMessage::Offer(offer) => { + receive_handler(managed_connection.clone(), stun_servers, offer).await; + } + _ => {} + } + } + + Ok(()) +} + +async fn send_handler( + connection: Arc, + stun_servers: Vec, + peer: ClientInfo, +) { + tracing::info!("Joined: {peer:?}"); + let (status_tx, mut status_rx) = mpsc::channel::(1); + let (selected_tx, mut selected_rx) = oneshot::channel::>(); + let (error_tx, mut error_rx) = mpsc::channel::(1); + let (pin_tx, mut pin_rx) = mpsc::channel::>(1); + let (pair_tx, mut pair_rx) = oneshot::channel::>(); + let (send_tx, send_rx) = mpsc::channel::(1); + + let files = vec![model::transfer::FileDto { + id: "test-123-id".to_string(), + file_name: "test.mp4".to_string(), + size: 100, + file_type: "video/mp4".to_string(), + sha256: None, + preview: None, + metadata: None, + }]; + + let send_task = tokio::spawn({ + let files = files.clone(); + async move { + webrtc::webrtc::send_offer( + &connection, + stun_servers, + peer.id, + token::generate_key(), + None, + Some(PinConfig { + pin: "456".to_string(), + max_tries: 3, + }), + files, + status_tx, + selected_tx, + error_tx, + pin_tx, + pair_tx, + send_rx, + ) + .await + .expect("Failed to send offer"); + + tracing::info!("Send offer completed"); + } + }); + + tokio::spawn(async move { + while let Some(status) = status_rx.recv().await { + tracing::info!("Status: {status:?}"); + } + tracing::info!("Closed channel: status"); + }); + + tokio::spawn(async move { + while let Some(error) = error_rx.recv().await { + tracing::info!("Error: {error:?}"); + } + tracing::info!("Closed channel: error"); + }); + + tokio::spawn(async move { + let mut pin_tries = vec!["1".to_string(), "2".to_string(), "123".to_string()].into_iter(); + while let Some(send_pin) = pin_rx.recv().await { + let pin = pin_tries.next().expect("Failed to get pin"); + + tracing::info!("Sending pin: {pin}"); + send_pin.send(pin).expect("Failed to send pin"); + } + tracing::info!("Closed channel: status"); + }); + + tokio::spawn(async move { + let Ok(send_pair) = pair_rx.await else { + return; + }; + + tracing::info!("Declining Pair"); + send_pair.send(false).expect("Failed to send pair"); + tracing::info!("Closed channel: status"); + }); + + tokio::spawn(async move { + let Ok(selected) = selected_rx.await else { + return; + }; + + tracing::info!("Selected: {selected:?}"); + + let file = files.first().unwrap(); + let (tx, mut rx) = mpsc::channel::(16); + send_tx + .try_send(RTCFile { + file_id: file.id.clone(), + binary_rx: rx, + }) + .expect("Failed to send file"); + + let file_path = "/Users/user/Downloads/test/send/test.mp4"; + let start_time = std::time::Instant::now(); + read_file_to_sender(file_path, tx) + .await + .expect("Failed to read file"); + + let file_size = std::fs::metadata(file_path).unwrap().len(); + tracing::info!( + "Sending file completed in {:?}, speed: {} MB/s", + start_time.elapsed(), + file_size as f64 / 1024.0 / 1024.0 / start_time.elapsed().as_secs_f64() + ); + }); + + let result = send_task.await; + tracing::info!("Send task finished with result: {:?}", result); +} + +async fn receive_handler( + connection: Arc, + stun_servers: Vec, + offer: webrtc::signaling::WsServerSdpMessage, +) { + tracing::info!("Offer: {offer:?}"); + let (status_tx, mut status_rx) = mpsc::channel::(1); + let (files_tx, files_rx) = oneshot::channel::>(); + let (selected_tx, selected_rx) = oneshot::channel::>>(); + let (error_tx, mut error_rx) = mpsc::channel::(1); + let (pin_tx, mut pin_rx) = mpsc::channel::>(1); + let (receiving_tx, mut receiving_rx) = mpsc::channel::(1); + let (user_error_tx, user_error_rx) = mpsc::channel::(1); + + let receive_task = tokio::spawn(async move { + webrtc::webrtc::accept_offer( + &connection, + stun_servers, + &offer, + token::generate_key(), + None, + Some(PinConfig { + pin: "123".to_string(), + max_tries: 3, + }), + status_tx, + files_tx, + selected_rx, + error_tx, + pin_tx, + receiving_tx, + user_error_rx, + ) + .await + .expect("Failed to accept offer"); + + tracing::info!("Accept offer completed"); + }); + + tokio::spawn(async move { + while let Some(status) = status_rx.recv().await { + tracing::info!("Status: {status:?}"); + } + tracing::info!("Closed channel: status"); + }); + + tokio::spawn(async move { + while let Some(error) = error_rx.recv().await { + tracing::info!("Error: {error:?}"); + } + tracing::info!("Closed channel: error"); + }); + + tokio::spawn(async move { + let mut pin_tries = vec!["1".to_string(), "2".to_string(), "456".to_string()].into_iter(); + while let Some(send_pin) = pin_rx.recv().await { + let pin = pin_tries.next().expect("Failed to get pin"); + + tracing::info!("Sending pin: {pin}"); + send_pin.send(pin).expect("Failed to send pin"); + } + tracing::info!("Closed channel: status"); + }); + + tokio::spawn(async move { + let Ok(files) = files_rx.await else { + return; + }; + + tracing::info!("Files: {files:?}"); + + selected_tx + .send(Some(files.iter().map(|file| file.id.clone()).collect())) + .expect("Failed to send selected"); + + while let Some(file) = receiving_rx.recv().await { + tracing::info!("Receiving file: {file:?}"); + + let file_dto = files.iter().find(|f| f.id == file.file_id).unwrap(); + + let file_path = format!("/Users/user/Downloads/test/{}", file_dto.file_name); + write_file_from_receiver(file_path.as_ref(), file.binary_rx) + .await + .expect("Failed to write file"); + + user_error_tx + .send(RTCSendFileResponse { + id: file.file_id, + success: true, + error: None, + }) + .await + .expect("Failed to send response"); + } + + tracing::info!("Receiving files completed"); + }); + + let result = receive_task.await; + tracing::info!("Receive task finished with result: {:?}", result); +} + +async fn read_file_to_sender(file_path: &str, sender: mpsc::Sender) -> io::Result<()> { + let mut file = File::open(file_path).await?; + + let mut buffer = [0u8; 1024]; + + loop { + // Read a chunk of the file + let bytes_read = file.read(&mut buffer).await?; + + if bytes_read == 0 { + break; // EOF + } + + // Send the chunk through the channel + let chunk = Bytes::copy_from_slice(&buffer[..bytes_read]); + if sender.send(chunk).await.is_err() { + tracing::error!("Receiver dropped, stopping."); + break; + } + } + + Ok(()) +} + +async fn write_file_from_receiver( + file_path: &str, + mut receiver: mpsc::Receiver, +) -> io::Result<()> { + let mut file = File::create(file_path).await?; + + while let Some(chunk) = receiver.recv().await { + file.write_all(&chunk).await?; + } + + Ok(()) +} diff --git a/core/src/model/discovery.rs b/core/src/model/discovery.rs new file mode 100644 index 0000000..e95afa5 --- /dev/null +++ b/core/src/model/discovery.rs @@ -0,0 +1,11 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Deserialize, Eq, Serialize, PartialEq)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +pub enum DeviceType { + Mobile, + Desktop, + Web, + Headless, + Server, +} diff --git a/core/src/model/mod.rs b/core/src/model/mod.rs new file mode 100644 index 0000000..0fffa94 --- /dev/null +++ b/core/src/model/mod.rs @@ -0,0 +1,2 @@ +pub mod discovery; +pub mod transfer; diff --git a/core/src/model/transfer.rs b/core/src/model/transfer.rs new file mode 100644 index 0000000..0f9d25e --- /dev/null +++ b/core/src/model/transfer.rs @@ -0,0 +1,24 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct FileDto { + pub id: String, + pub file_name: String, + pub size: u64, + pub file_type: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub sha256: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub preview: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct FileMetadata { + #[serde(skip_serializing_if = "Option::is_none")] + pub modified: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub accessed: Option, +} diff --git a/core/src/util/base64.rs b/core/src/util/base64.rs new file mode 100644 index 0000000..e350586 --- /dev/null +++ b/core/src/util/base64.rs @@ -0,0 +1,13 @@ +use base64::engine::general_purpose::URL_SAFE_NO_PAD; +use base64::engine::GeneralPurpose; +use base64::{DecodeError, Engine}; + +const BASE_64_ENGINE: GeneralPurpose = URL_SAFE_NO_PAD; + +pub fn encode>(data: T) -> String { + BASE_64_ENGINE.encode(data) +} + +pub fn decode(data: &str) -> Result, DecodeError> { + BASE_64_ENGINE.decode(data) +} diff --git a/core/src/util/mod.rs b/core/src/util/mod.rs new file mode 100644 index 0000000..dad3ff5 --- /dev/null +++ b/core/src/util/mod.rs @@ -0,0 +1,2 @@ +pub mod base64; +pub(crate) mod time; diff --git a/core/src/util/time.rs b/core/src/util/time.rs new file mode 100644 index 0000000..6c229e4 --- /dev/null +++ b/core/src/util/time.rs @@ -0,0 +1,7 @@ +use std::time::{SystemTime, SystemTimeError, UNIX_EPOCH}; + +pub(crate) fn unix_timestamp_u64() -> Result { + let seconds = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(); + + Ok(seconds) +} diff --git a/core/src/webrtc/mod.rs b/core/src/webrtc/mod.rs new file mode 100644 index 0000000..dcc8d73 --- /dev/null +++ b/core/src/webrtc/mod.rs @@ -0,0 +1,3 @@ +pub mod signaling; +#[cfg(feature = "webrtc")] +pub mod webrtc; diff --git a/core/src/webrtc/signaling.rs b/core/src/webrtc/signaling.rs new file mode 100644 index 0000000..302de5b --- /dev/null +++ b/core/src/webrtc/signaling.rs @@ -0,0 +1,528 @@ +use crate::model::discovery::DeviceType; +use crate::util::base64; +use anyhow::Result; +use futures_util::stream::StreamExt; +use futures_util::SinkExt; +use serde::{Deserialize, Serialize}; +use std::cmp::PartialEq; +use std::collections::HashMap; +use std::sync::Arc; +use tokio::sync::{mpsc, Mutex}; +use tokio::time::Duration; +#[cfg(feature = "webrtc-signaling")] +use tokio_tungstenite::connect_async; +#[cfg(feature = "webrtc-signaling")] +use tungstenite::{Bytes, Message}; +use uuid::Uuid; + +/// A message sent by the server to the client. +#[derive(Clone, Deserialize, Eq, Serialize, Debug, PartialEq)] +#[serde(tag = "type", rename_all = "SCREAMING_SNAKE_CASE")] +pub enum WsServerMessage { + /// The initial message sent to the client that has just connected. + Hello { + /// The client that has just connected. + client: ClientInfo, + + /// The list of members (excluding the client) in the IP room. + peers: Vec, + }, + + /// A new peer has joined the IP room. + Join { + /// The peer that triggered the message. + peer: ClientInfo, + }, + + /// A peer has updated its information. + Update { + /// The peer that triggered the message. + peer: ClientInfo, + }, + + /// A peer has left the IP room. + Left { + /// The ID of the peer that triggered the message. + #[serde(rename = "peerId")] + peer_id: Uuid, + }, + + /// SDP offer from a peer to another peer. + Offer(WsServerSdpMessage), + + /// SDP answer from a peer to another peer. + Answer(WsServerSdpMessage), + + /// Error message. + Error { + /// The error code. + code: u16, + }, +} + +#[derive(Clone, Deserialize, Eq, Serialize, Debug, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct WsServerSdpMessage { + /// The peer that triggered the message. + pub peer: ClientInfo, + + /// The session ID of the answer. + pub session_id: String, + + /// The SDP string for the answer. + /// Compressed with zlib, then encoded with base64 without padding. + pub sdp: String, +} + +#[derive(Clone, Debug, Deserialize, Eq, Serialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct ClientInfo { + /// The ID of the peer. Generated by the server. + pub id: Uuid, + + /// The name of the peer. + pub alias: String, + + /// Client Protocol Version (major.minor) + pub version: String, + + /// The device model of the peer. + /// Windows, macOS, iPhone, Samsung, etc. + #[serde(skip_serializing_if = "Option::is_none")] + pub device_model: Option, + + /// The device type of the peer. + #[serde(skip_serializing_if = "Option::is_none")] + pub device_type: Option, + + /// A token generated by the client. + /// Used to merge the same peers detected on different channels (LAN, WebRTC, etc.). + pub token: String, +} + +impl ClientInfo { + pub fn from(info: ClientInfoWithoutId, id: Uuid) -> Self { + Self { + id, + alias: info.alias, + version: info.version, + device_model: info.device_model, + device_type: info.device_type, + token: info.token, + } + } +} + +/// The data that is encoded as JSON which is again encoded as base64. +/// Sent as query during websocket connection. +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ClientInfoWithoutId { + /// The name of the peer. + pub alias: String, + + /// Client Protocol Version (major.minor) + pub version: String, + + /// The device model of the peer. + /// Windows, macOS, iPhone, Samsung, etc. + #[serde(skip_serializing_if = "Option::is_none")] + pub device_model: Option, + + /// The device type of the peer. + #[serde(skip_serializing_if = "Option::is_none")] + pub device_type: Option, + + /// A fingerprint generated by the client. + /// Used to merge the same peers detected on different channels (LAN, WebRTC, etc.). + pub token: String, +} + +impl From for ClientInfoWithoutId { + fn from(info: ClientInfo) -> Self { + Self { + alias: info.alias, + version: info.version, + device_model: info.device_model, + device_type: info.device_type, + token: info.token, + } + } +} + +/// The HTTP request sent by the client to the server. +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] +#[serde(tag = "type", rename_all = "SCREAMING_SNAKE_CASE")] +pub enum WsClientMessage { + Update { info: ClientInfoWithoutId }, + Offer(WsClientSdpMessage), + Answer(WsClientSdpMessage), +} + +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct WsClientSdpMessage { + /// The session id to correctly associate answers with offers. + /// Generated by the client (the peer that sends the offer). + pub session_id: String, + + /// Target peer ID. + pub target: Uuid, + + /// The SDP offer. + /// Compressed with zlib, then encoded with base64 without padding. + pub sdp: String, +} + +pub struct SignalingConnection { + /// The peer info received from the server of the client. + pub client: ClientInfo, + + /// The sender to send messages to the server. + pub tx: mpsc::Sender, + + /// The receiver to receive messages from the server. + pub rx: mpsc::Receiver, +} + +#[cfg(feature = "webrtc-signaling")] +impl SignalingConnection { + pub async fn connect>( + uri: S, + info: &ClientInfoWithoutId, + ) -> Result { + let encoded_info = base64::encode(&serde_json::to_string(info)?); + let uri = format!("{}?d={}", uri.into(), encoded_info); + + tracing::debug!("Connecting to the signaling server at {uri}"); + + let (ws_stream, _) = connect_async(&uri).await?; + + tracing::debug!("Connected to the signaling server. Waiting for hello..."); + + let (mut write, read) = ws_stream.split(); + + let (send_tx, mut send_rx) = mpsc::channel(1); + + tokio::spawn(async move { + let timeout = Duration::from_secs(120); + loop { + let send_result = tokio::time::timeout(timeout, async { + if let Some(message) = send_rx.recv().await { + let message = + serde_json::to_string(&message).expect("Failed to serialize message"); + if write.send(Message::Text(message.into())).await.is_ok() { + return true; + } + } + + false + }) + .await; + + match send_result { + Ok(success) => { + if !success { + return; + } + } + Err(_) => { + // Timeout: send a ping message to keep the connection alive + if write.send(Message::Ping(Bytes::new())).await.is_err() { + return; + } + } + } + } + }); + + let (receive_tx, receive_rx) = mpsc::channel(1); + let (client_tx, mut client_rx) = mpsc::channel::(1); + + tokio::spawn(async move { + read.for_each(|message| async { + if let Ok(Message::Text(message)) = message { + match serde_json::from_str::(&message) { + Ok(message) => { + if let WsServerMessage::Hello { + client, + peers: _peers, + } = &message + { + if client_tx.send(client.clone()).await.is_err() { + return; + } + } + + match receive_tx.send(message).await { + Ok(_) => {} + Err(e) => tracing::error!("{e:?}"), + } + } + Err(e) => tracing::error!("Error: {e}, Server: {message}"), + } + } + }) + .await; + }); + + let client = client_rx.recv().await.unwrap(); + + tracing::debug!("Received hello from server: {client:?}"); + + Ok(SignalingConnection { + client, + tx: send_tx, + rx: receive_rx, + }) + } + + /// Listen for incoming messages from the server. + /// Upgrades the API to a higher-level API. + pub fn start_listener( + mut self, + ) -> (ManagedSignalingConnection, mpsc::Receiver) { + let (tx, rx) = mpsc::channel::(16); + let on_answer: Arc>> = + Arc::new(Mutex::new(HashMap::new())); + + { + let on_answer = on_answer.clone(); + tokio::spawn(async move { + while let Some(message) = self.rx.recv().await { + // send answer + if let WsServerMessage::Answer(sdp) = message.clone() { + if let Some(callback) = on_answer.lock().await.remove(&sdp.session_id) { + callback(sdp); + } + } + + tx.send(message).await.unwrap(); + } + }); + } + + ( + ManagedSignalingConnection { + client: self.client, + tx: self.tx, + on_answer, + }, + rx, + ) + } + + pub async fn send_update(&self, info: ClientInfoWithoutId) -> Result<()> { + send_update(&self.tx, info).await?; + + Ok(()) + } + + pub async fn send_offer(&self, session_id: String, target: Uuid, sdp: String) -> Result<()> { + send_offer(&self.tx, session_id, target, sdp).await?; + + Ok(()) + } + + pub async fn send_answer(&self, session_id: String, target: Uuid, sdp: String) -> Result<()> { + send_answer(&self.tx, session_id, target, sdp).await?; + + Ok(()) + } +} + +type AnswerCallback = Box; + +pub struct ManagedSignalingConnection { + /// The peer info received from the server of the client. + pub client: ClientInfo, + tx: mpsc::Sender, + on_answer: Arc>>, +} + +#[cfg(feature = "webrtc-signaling")] +impl ManagedSignalingConnection { + pub async fn send_update(&self, info: ClientInfoWithoutId) -> Result<()> { + send_update(&self.tx, info).await?; + + Ok(()) + } + + pub async fn send_offer(&self, session_id: String, target: Uuid, sdp: String) -> Result<()> { + send_offer(&self.tx, session_id, target, sdp).await?; + + Ok(()) + } + + pub async fn send_answer(&self, session_id: String, target: Uuid, sdp: String) -> Result<()> { + send_answer(&self.tx, session_id, target, sdp).await?; + + Ok(()) + } + + /// Adds a callback to be called when an answer having a specific `session_id` is received. + pub async fn on_answer(&self, session_id: String, callback: F) + where + F: FnOnce(WsServerSdpMessage) + Send + Sync + 'static, + { + let mut callbacks = self.on_answer.lock().await; + callbacks.insert(session_id, Box::new(callback)); + } +} + +async fn send_update(tx: &mpsc::Sender, info: ClientInfoWithoutId) -> Result<()> { + tx.send(WsClientMessage::Update { info }).await?; + + tracing::debug!("Sent update to the server"); + + Ok(()) +} + +async fn send_offer( + tx: &mpsc::Sender, + session_id: String, + target: Uuid, + sdp: String, +) -> Result<()> { + tx.send(WsClientMessage::Offer(WsClientSdpMessage { + session_id: session_id.clone(), + target, + sdp, + })) + .await?; + + tracing::debug!("Sent offer to {target} with session ID {session_id}"); + + Ok(()) +} + +async fn send_answer( + tx: &mpsc::Sender, + session_id: String, + target: Uuid, + sdp: String, +) -> Result<()> { + tx.send(WsClientMessage::Answer(WsClientSdpMessage { + session_id: session_id.clone(), + target, + sdp, + })) + .await?; + + tracing::debug!("Sent answer to {target} with session ID {session_id}"); + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn ws_server_hello_message_encoding() { + let message = WsServerMessage::Hello { + client: ClientInfo { + id: Uuid::nil(), + alias: "Cute Apple".to_string(), + version: "2.3".to_string(), + device_model: Some("Dell".to_string()), + device_type: Some(DeviceType::Desktop), + token: "123".to_string(), + }, + peers: vec![], + }; + + let encoded = serde_json::to_string_pretty(&message).unwrap(); + + assert_eq!( + encoded, + r#"{ + "type": "HELLO", + "client": { + "id": "00000000-0000-0000-0000-000000000000", + "alias": "Cute Apple", + "version": "2.3", + "deviceModel": "Dell", + "deviceType": "DESKTOP", + "token": "123" + }, + "peers": [] +}"# + ); + + let decoded: WsServerMessage = serde_json::from_str(&encoded).unwrap(); + + assert_eq!(message, decoded); + } + + #[test] + fn ws_server_offer_message_encoding() { + let message = WsServerMessage::Offer(WsServerSdpMessage { + peer: ClientInfo { + id: Uuid::nil(), + alias: "Cute Apple".to_string(), + version: "2.3".to_string(), + device_model: None, + device_type: Some(DeviceType::Desktop), + token: "123".to_string(), + }, + session_id: "456".to_string(), + sdp: "my-sdp".to_string(), + }); + + let encoded = serde_json::to_string_pretty(&message).unwrap(); + + assert_eq!( + encoded, + r#"{ + "type": "OFFER", + "peer": { + "id": "00000000-0000-0000-0000-000000000000", + "alias": "Cute Apple", + "version": "2.3", + "deviceType": "DESKTOP", + "token": "123" + }, + "sessionId": "456", + "sdp": "my-sdp" +}"# + ); + + let decoded: WsServerMessage = serde_json::from_str(&encoded).unwrap(); + + assert_eq!(message, decoded); + } + + #[test] + fn ws_client_update_message_encoding() { + let message = WsClientMessage::Update { + info: ClientInfoWithoutId { + alias: "Cute Apple".to_string(), + version: "2.3".to_string(), + device_model: Some("Dell".to_string()), + device_type: Some(DeviceType::Desktop), + token: "123".to_string(), + }, + }; + + let encoded = serde_json::to_string_pretty(&message).unwrap(); + + assert_eq!( + encoded, + r#"{ + "type": "UPDATE", + "info": { + "alias": "Cute Apple", + "version": "2.3", + "deviceModel": "Dell", + "deviceType": "DESKTOP", + "token": "123" + } +}"# + ); + + let decoded: WsClientMessage = serde_json::from_str(&encoded).unwrap(); + + assert_eq!(message, decoded); + } +} diff --git a/core/src/webrtc/webrtc.rs b/core/src/webrtc/webrtc.rs new file mode 100644 index 0000000..fae4b9c --- /dev/null +++ b/core/src/webrtc/webrtc.rs @@ -0,0 +1,1406 @@ +use crate::crypto; +use crate::crypto::token::{SigningTokenKey, VerifyingTokenKey}; +use crate::model::transfer::FileDto; +use crate::util::base64; +use crate::webrtc::signaling::{ManagedSignalingConnection, WsServerSdpMessage}; +use anyhow::Result; +use bytes::{Bytes, BytesMut}; +use flate2::read::ZlibDecoder; +use flate2::write::ZlibEncoder; +use serde::{Deserialize, Serialize}; +use std::collections::{HashMap, HashSet}; +use std::future::Future; +use std::io::{Read, Write}; +use std::sync::Arc; +use std::time::Duration; +use tokio::sync::{mpsc, oneshot}; +use uuid::Uuid; +use webrtc::api::APIBuilder; +use webrtc::data_channel::data_channel_init::RTCDataChannelInit; +use webrtc::data_channel::data_channel_message::DataChannelMessage; +use webrtc::data_channel::RTCDataChannel; +use webrtc::ice_transport::ice_server::RTCIceServer; +use webrtc::peer_connection::configuration::RTCConfiguration; +use webrtc::peer_connection::peer_connection_state::RTCPeerConnectionState; +use webrtc::peer_connection::sdp::session_description::RTCSessionDescription; +use webrtc::peer_connection::RTCPeerConnection; + +/// Nonce message exchanged by both peers +/// starting with the sending peer. +#[derive(Debug, Deserialize, Serialize)] +struct RTCNonceMessage { + /// Nonce to be used to hash in combination with the public key. + /// Encoded in base64 (url-safe without padding). + nonce: String, +} + +/// Sending peer sends the token. +#[derive(Debug, Deserialize, Serialize)] +struct RTCTokenRequest { + /// Token using the received nonce and the public key. + /// HASH_METHOD.HASH.SIGN_METHOD.SIGN + token: String, +} + +/// Receiving peer sends the token as well but +/// also the status for the next step. +/// After this step, the sending peer may close the connection due to `InvalidSignature`. +#[derive(Debug, Deserialize, Serialize)] +#[serde(tag = "status", rename_all = "SCREAMING_SNAKE_CASE")] +enum RTCTokenResponse { + Ok { token: String }, + PinRequired { token: String }, + InvalidSignature, +} + +/// This struct is used by both sender and receiver. +/// (1) The sender tries to resolve PIN first, waiting for `RTCPinReceivingResponse`. +/// (2) The receiver tries to resolve PIN, waiting for `RTCPinSendingResponse`. +/// +/// This step may be skipped by the sending peer if `RTCInitResponse` is `Ok`. +/// In this case, the sending peer sends the `RTCPinSendingResponse` right away. +#[derive(Debug, Deserialize, Serialize)] +struct RTCPinMessage { + pin: String, +} + +/// Response to the PIN message by the receiving peer. +#[derive(Debug, Deserialize, Serialize)] +#[serde(tag = "status", rename_all = "SCREAMING_SNAKE_CASE")] +enum RTCPinReceivingResponse { + Ok, + PinRequired, + TooManyAttempts, +} + +/// Response to the PIN message by the sending peer. +#[derive(Debug, Deserialize, Serialize)] +#[serde(tag = "status", rename_all = "SCREAMING_SNAKE_CASE")] +enum RTCPinSendingResponse { + Ok { files: Vec }, + PinRequired, + TooManyAttempts, +} + +/// Sent by receiving peer after receiving `RTCPinSendingResponse::Ok`. +#[derive(Debug, PartialEq, Eq, Deserialize, Serialize)] +#[serde(tag = "status", rename_all = "SCREAMING_SNAKE_CASE")] +enum RTCFileListResponse { + Ok { + files: HashMap, + }, + Pair { + #[serde(rename = "publicKey")] + public_key: String, + }, + Declined, + InvalidSignature, +} + +/// Pair response by the sending peer. +#[derive(Debug, Deserialize, Serialize)] +#[serde(tag = "status", rename_all = "SCREAMING_SNAKE_CASE")] +enum RTCPairResponse { + Ok { + #[serde(rename = "publicKey")] + public_key: String, + }, + PairDeclined, + InvalidSignature, +} + +#[derive(Debug)] +pub struct RTCFile { + pub file_id: String, + pub binary_rx: mpsc::Receiver, +} + +#[derive(Debug)] +struct RTCFileState { + file_id: String, + size: u64, + binary_tx: mpsc::Sender, +} + +#[derive(Debug, Deserialize, Serialize)] +struct RTCSendFileHeaderRequest { + pub id: String, + pub token: String, +} + +#[derive(Debug, Deserialize, Serialize)] +pub struct RTCSendFileResponse { + pub id: String, + pub success: bool, + #[serde(skip_serializing_if = "Option::is_none")] + pub error: Option, +} + +#[derive(Debug, Eq, PartialEq)] +pub enum RTCStatus { + /// Received remote SDP offer/answer. Ready to start P2P connection. + SdpExchanged, + + /// Opened data channel. Ready to further communication. + Connected, + + /// PIN is required to proceed. + PinRequired, + + /// Too many attempts. Connection is closed. + TooManyAttempts, + + /// Declined by the receiving peer. + Declined, + + /// Files are being sent. + Sending, + + /// Data channel closed. Connection is closed. + Finished, + + /// Error occurred. Connection is closed. + Error(String), +} + +#[derive(Debug, Eq, PartialEq)] +pub struct RTCFileError { + pub file_id: String, + pub error: String, +} + +#[derive(Debug, Eq, PartialEq)] +pub struct PinConfig { + pub pin: String, + pub max_tries: u8, +} + +const CHANNEL_LABEL: &str = "data"; + +pub async fn send_offer( + signaling: &ManagedSignalingConnection, + stun_servers: Vec, + target_id: Uuid, + signing_key: SigningTokenKey, + expecting_public_key: Option>, + pin: Option, + files: Vec, + status_tx: mpsc::Sender, + selected_files_tx: oneshot::Sender>, + error_tx: mpsc::Sender, + pin_tx: mpsc::Sender>, + pair_tx: oneshot::Sender>, + mut sending_rx: mpsc::Receiver, +) -> Result<()> { + let (peer_connection, mut done_rx) = create_peer_connection(stun_servers).await?; + + let data_channel = peer_connection + .create_data_channel( + CHANNEL_LABEL, + Some(RTCDataChannelInit { + ordered: Some(true), + max_packet_life_time: None, + max_retransmits: None, + protocol: None, + negotiated: None, + }), + ) + .await?; + + let (connected_tx, mut connected_rx) = mpsc::channel::<()>(1); + data_channel.on_open(Box::new(move || { + Box::pin(async move { + let _ = connected_tx.send(()).await; + }) + })); + + let mut receive_rx = to_receive_stream(&data_channel, 16); + + let send_task = { + let data_channel = Arc::clone(&data_channel); + let status_tx = status_tx.clone(); + tokio::spawn(async move { + connected_rx + .recv() + .await + .ok_or_else(|| anyhow::anyhow!("Data channel not opened"))?; + + wait_buffer_empty(&data_channel).await; + + tracing::debug!("Data channel opened. Exchanging nonce..."); + + // Nonce exchange + let nonce = { + let mut local_nonce = crypto::nonce::generate_nonce(); + data_channel + .send_text(&serde_json::to_string(&RTCNonceMessage { + nonce: base64::encode(&local_nonce), + })?) + .await + .map_err(|e| anyhow::anyhow!("Failed to send nonce: {e}"))?; + + let mut remote_nonce = receive_nonce(&mut receive_rx).await?; + + // Final nonce: sender_nonce || receiver_nonce + local_nonce.append(&mut remote_nonce); + local_nonce + }; + + tracing::debug!("Nonce exchanged. Exchanging token..."); + + // Token exchange + let local_token = crypto::token::generate_token_nonce(&signing_key, &nonce) + .map_err(|e| anyhow::anyhow!("Failed to generate token: {e}"))?; + + data_channel + .send_text(&serde_json::to_string(&RTCTokenRequest { + token: local_token, + })?) + .await + .map_err(|e| anyhow::anyhow!("Failed to send token: {e}"))?; + + let token_response: RTCTokenResponse = match receive_rx.recv().await { + Some(msg) => { + if !msg.is_string { + return Err(anyhow::anyhow!("Expected string message")); + } + + serde_json::from_slice(&msg.data)? + } + None => { + return Err(anyhow::anyhow!("Failed to receive token response")); + } + }; + + let remote_token = match &token_response { + RTCTokenResponse::Ok { token } | RTCTokenResponse::PinRequired { token } => { + if let Some(expecting_public_key) = expecting_public_key { + if !crypto::token::verify_token_nonce( + &*expecting_public_key, + &token, + &nonce, + ) { + return Err(anyhow::anyhow!("Invalid token signature or nonce")); + } + } + token.to_owned() + } + RTCTokenResponse::InvalidSignature => { + return Err(anyhow::anyhow!( + "Invalid token signature from receiving peer" + )); + } + }; + + tracing::debug!("Tokens exchanged."); + + if let RTCTokenResponse::PinRequired { .. } = token_response { + tracing::debug!("PIN challenge by receiver... (I need to send correct PIN)"); + handle_pin::<()>( + &data_channel, + &status_tx, + &pin_tx, + &mut receive_rx, + false, + |data| { + let Ok(pin_res) = serde_json::from_slice::(&data) + else { + return ChallengePinResult::ParseError(anyhow::anyhow!( + "Failed to parse pin response" + )); + }; + + match pin_res { + RTCPinReceivingResponse::Ok => ChallengePinResult::Ok(()), + RTCPinReceivingResponse::PinRequired => ChallengePinResult::PinRequired, + RTCPinReceivingResponse::TooManyAttempts => { + ChallengePinResult::TooManyAttempts + } + } + }, + ) + .await?; + + tracing::debug!("PIN challenge done."); + } + + if let Some(pin) = &pin { + tracing::debug!("PIN challenge by sender... (I need to verify the correct PIN)"); + verify_pin( + pin, + &data_channel, + &status_tx, + &mut receive_rx, + true, + |data_channel, result| { + let data_channel = Arc::clone(&data_channel); + async move { + send_string_in_chunks( + &data_channel, + serde_json::to_string(&match result { + VerifyPinResult::PinRequired => { + RTCPinSendingResponse::PinRequired + } + VerifyPinResult::TooManyAttempts => { + RTCPinSendingResponse::TooManyAttempts + } + })?, + |data_channel, chunk| async move { + data_channel.send(&chunk).await?; + Ok(data_channel) + }, + ) + .await?; + + send_delimiter(&data_channel).await?; + + Ok(()) + } + }, + ) + .await?; + } + + status_tx.send(RTCStatus::Connected).await?; + + { + // send file list message + let file_list_req = serde_json::to_string(&RTCPinSendingResponse::Ok { files })?; + + let result = send_string_in_chunks( + Arc::clone(&data_channel), + file_list_req, + |data_channel, chunk| async move { + data_channel.send(&chunk).await?; + Ok(data_channel) + }, + ) + .await; + + if let Err(e) = result { + let _ = status_tx.try_send(RTCStatus::Error(format!( + "Failed to send file list message: {e}" + ))); + return Err(e.into()); + } + + if let Err(e) = send_delimiter(&data_channel).await { + let _ = status_tx.try_send(RTCStatus::Error(format!( + "Failed to send file list message: {e}" + ))); + return Err(e.into()); + } + } + + tracing::debug!("Sent file list message. Waiting for file tokens..."); + + // Receive file tokens + let file_list_res = { + let bytes = receive_string_from_chunks(&mut receive_rx).await; + let parsed: RTCFileListResponse = serde_json::from_slice(&*bytes).map_err(|e| { + anyhow::anyhow!("Failed to deserialize file list response: {e}") + })?; + parsed + }; + + let file_map = match file_list_res { + RTCFileListResponse::Ok { files } => files, + RTCFileListResponse::Pair { public_key } => { + tracing::debug!("Pair request received. Sending pair response..."); + let signature_identifier = + crypto::token::extract_signature_identifier(&remote_token) + .ok_or(anyhow::anyhow!("Failed to extract signature identifier"))?; + let parsed_key = + crypto::token::parse_public_key(&public_key, signature_identifier)?; + if !crypto::token::verify_token_nonce(&*parsed_key, &remote_token, &nonce) { + wait_buffer_empty(&data_channel).await; + data_channel + .send_text(&serde_json::to_string(&RTCPairResponse::InvalidSignature)?) + .await?; + return Err(anyhow::anyhow!("Invalid token signature or nonce")); + } + + let (pair_res_tx, pair_res_rx) = oneshot::channel::(); + if pair_tx.send(pair_res_tx).is_err() { + return Err(anyhow::anyhow!("Failed to send pair response")); + } + + let pair_user_response = pair_res_rx.await?; + if pair_user_response { + data_channel + .send_text(&serde_json::to_string(&RTCPairResponse::Ok { public_key })?) + .await?; + } else { + data_channel + .send_text(&serde_json::to_string(&RTCPairResponse::PairDeclined)?) + .await?; + } + + let file_list_res = { + let bytes = receive_string_from_chunks(&mut receive_rx).await; + let parsed: RTCFileListResponse = + serde_json::from_slice(&*bytes).map_err(|e| { + anyhow::anyhow!("Failed to deserialize file list response: {e}") + })?; + parsed + }; + + match file_list_res { + RTCFileListResponse::Ok { files } => files, + RTCFileListResponse::Declined => { + tracing::debug!("Declined by the receiving peer."); + let _ = status_tx.send(RTCStatus::Declined).await; + return Ok(()); + } + RTCFileListResponse::InvalidSignature => { + let _ = status_tx + .send(RTCStatus::Error( + "Invalid signature (not expected)".to_owned(), + )) + .await; + return Err(anyhow::anyhow!("Invalid signature (not expected)")); + } + RTCFileListResponse::Pair { .. } => { + let _ = status_tx + .send(RTCStatus::Error("Unexpected pair response".to_owned())) + .await; + return Err(anyhow::anyhow!("Unexpected pair response")); + } + } + } + RTCFileListResponse::Declined => { + tracing::debug!("Declined by the receiving peer."); + let _ = status_tx.send(RTCStatus::Declined).await; + return Ok(()); + } + RTCFileListResponse::InvalidSignature => { + // This is not expected because the public key is not sent yet. + // Likely a bug in the implementation on the receiving side. + let _ = status_tx + .send(RTCStatus::Error( + "Invalid signature (not expected)".to_owned(), + )) + .await; + return Err(anyhow::anyhow!("Invalid signature (not expected)")); + } + }; + + // Publish selected files + if selected_files_tx + .send(file_map.keys().cloned().collect()) + .is_err() + { + let error = "Could not publish selection"; + let _ = status_tx.send(RTCStatus::Error(error.to_owned())); + return Err(anyhow::anyhow!(error)); + } + + tracing::debug!("Received file tokens. Sending files..."); + + while let Some(message) = sending_rx.recv().await { + let file_token = match file_map.get(&message.file_id) { + Some(file_token) => file_token, + None => { + let _ = error_tx + .send(RTCFileError { + file_id: message.file_id, + error: "Failed to get file token".to_string(), + }) + .await; + + continue; + } + }; + + let header = RTCSendFileHeaderRequest { + id: message.file_id.clone(), + token: file_token.clone(), + }; + + if let Err(e) = data_channel + .send_text(serde_json::to_string(&header)?) + .await + { + let _ = error_tx + .send(RTCFileError { + file_id: message.file_id, + error: e.to_string(), + }) + .await; + continue; + } + + let result = process_in_chunks( + Arc::clone(&data_channel), + message.binary_rx, + |data_channel, chunk| async move { + data_channel.send(&chunk).await?; + Ok(data_channel) + }, + ) + .await; + + if let Err(e) = result { + let _ = error_tx + .send(RTCFileError { + file_id: message.file_id, + error: e.to_string(), + }) + .await; + continue; + } + } + + wait_buffer_empty(&data_channel).await; + + send_delimiter(&data_channel).await?; + + receive_rx.recv().await; + + Ok(()) + }) + }; + + let offer = peer_connection.create_offer(None).await?; + let mut gather_complete = peer_connection.gathering_complete_promise().await; + peer_connection.set_local_description(offer).await?; + let _ = gather_complete.recv().await; + + let session_id = Uuid::new_v4().to_string(); + let local_description = peer_connection + .local_description() + .await + .ok_or_else(|| anyhow::anyhow!("Could not generate local_description"))?; + + signaling + .send_offer( + session_id.clone(), + target_id, + encode_sdp(&local_description.sdp), + ) + .await?; + + let (tx_answer, rx_answer) = oneshot::channel(); + + signaling + .on_answer(session_id, |message| { + tx_answer.send(message.sdp).unwrap(); + }) + .await; + + let remote_desc = rx_answer.await?; + + if let Err(e) = status_tx.send(RTCStatus::SdpExchanged).await { + peer_connection.close().await?; + return Err(e.into()); + } + + let answer = RTCSessionDescription::answer(decode_sdp(&remote_desc)?)?; + + peer_connection.set_remote_description(answer).await?; + + tokio::select! { + result = send_task => { + match result { + Ok(Ok(_)) => tracing::debug!("Sending done."), + Ok(Err(result)) => { + return Err(result); + }, + Err(e) => { + tracing::error!("Sending error: {e}"); + return Err(anyhow::anyhow!("Sending error: {e}")); + } + } + } + _ = done_rx.recv() => {} + } + + let _ = status_tx.send(RTCStatus::Finished).await; + if let Err(e) = data_channel.close().await { + tracing::error!("Failed to close data channel: {e}"); + } + + peer_connection.close().await?; + + Ok(()) +} + +pub async fn accept_offer( + signaling: &ManagedSignalingConnection, + stun_servers: Vec, + offer: &WsServerSdpMessage, + signing_key: SigningTokenKey, + expecting_public_key: Option>, + pin: Option, + status_tx: mpsc::Sender, + files_tx: oneshot::Sender>, + selected_files_rx: oneshot::Receiver>>, + error_tx: mpsc::Sender, + pin_tx: mpsc::Sender>, + receiving_tx: mpsc::Sender, + mut user_error_tx: mpsc::Receiver, +) -> Result<()> { + let (peer_connection, mut done_rx) = create_peer_connection(stun_servers).await?; + + let (data_channel_tx, mut data_channel_rx) = mpsc::channel::>(1); + + peer_connection.on_data_channel(Box::new(move |d: Arc| { + if d.label() != CHANNEL_LABEL { + return Box::pin(async {}); + } + + let data_channel_tx = data_channel_tx.clone(); + Box::pin(async move { + let d_clone = Arc::clone(&d); + d.on_open(Box::new(move || { + let _ = data_channel_tx.try_send(d_clone); + + Box::pin(async {}) + })); + }) + })); + + let receive_task = { + let status_tx = status_tx.clone(); + tokio::spawn(async move { + let Some(data_channel) = data_channel_rx.recv().await else { + return Err::<(), anyhow::Error>(anyhow::anyhow!("Data channel not found")); + }; + + // We convert on_message to a stream of messages + // to improve readability using a sequential implementation + let mut receive_rx = to_receive_stream(&data_channel, 16); + + tracing::debug!("Data channel opened. Exchanging nonce..."); + + // Nonce exchange + let nonce = { + let mut remote_nonce = receive_nonce(&mut receive_rx).await?; + + let mut local_nonce = crypto::nonce::generate_nonce(); + data_channel + .send_text(&serde_json::to_string(&RTCNonceMessage { + nonce: base64::encode(&local_nonce), + })?) + .await + .map_err(|e| anyhow::anyhow!("Failed to send nonce: {e}"))?; + + // Final nonce: sender_nonce || receiver_nonce + remote_nonce.append(&mut local_nonce); + remote_nonce + }; + + tracing::debug!("Nonce exchanged. Exchanging token..."); + + // Token exchange + let remote_token = match receive_rx.recv().await { + Some(msg) => { + if !msg.is_string { + return Err(anyhow::anyhow!("Expected string message")); + } + + serde_json::from_slice::(&msg.data)?.token + } + None => { + return Err(anyhow::anyhow!("Failed to receive token")); + } + }; + + if let Some(expecting_public_key) = expecting_public_key { + // Optionally, verify the token signature + if !crypto::token::verify_token_nonce(&*expecting_public_key, &remote_token, &nonce) + { + data_channel + .send_text(&serde_json::to_string(&RTCTokenResponse::InvalidSignature)?) + .await?; + wait_buffer_empty(&data_channel).await; + return Err(anyhow::anyhow!("Invalid token signature or nonce")); + } + tracing::debug!("Token signature verified."); + } + + { + let local_token = crypto::token::generate_token_nonce(&signing_key, &nonce) + .map_err(|e| anyhow::anyhow!("Failed to generate token: {e}"))?; + + data_channel + .send_text(&serde_json::to_string(&match pin { + Some(_) => RTCTokenResponse::PinRequired { token: local_token }, + None => RTCTokenResponse::Ok { token: local_token }, + })?) + .await + .map_err(|e| anyhow::anyhow!("Failed to send token: {e}"))?; + } + + if let Some(pin) = &pin { + tracing::debug!("PIN required. Challenging..."); + verify_pin( + pin, + &data_channel, + &status_tx, + &mut receive_rx, + false, + |data_channel, result| { + let data_channel = Arc::clone(&data_channel); + async move { + data_channel + .send_text(&serde_json::to_string(&match result { + VerifyPinResult::PinRequired => { + RTCPinReceivingResponse::PinRequired + } + VerifyPinResult::TooManyAttempts => { + RTCPinReceivingResponse::TooManyAttempts + } + })?) + .await?; + Ok(()) + } + }, + ) + .await?; + + data_channel + .send_text( + serde_json::to_string(&RTCPinReceivingResponse::Ok) + .expect("Failed to serialize"), + ) + .await?; + + tracing::debug!("PIN challenge done."); + } + + tracing::debug!("Waiting for sender PIN status..."); + + let pin_response = { + let bytes = receive_string_from_chunks(&mut receive_rx).await; + let parsed: RTCPinSendingResponse = + serde_json::from_slice(&*bytes).map_err(|e| { + anyhow::anyhow!("Failed to deserialize file list response: {e}") + })?; + parsed + }; + + let file_list = match pin_response { + RTCPinSendingResponse::Ok { files } => files, + RTCPinSendingResponse::PinRequired => { + tracing::debug!("PIN challenge by sender... (I need to send correct PIN)"); + let result = handle_pin::>( + &data_channel, + &status_tx, + &pin_tx, + &mut receive_rx, + true, + |data| { + let Ok(pin_res) = + serde_json::from_slice::(&data) + else { + return ChallengePinResult::ParseError(anyhow::anyhow!( + "Failed to parse pin response" + )); + }; + match pin_res { + RTCPinSendingResponse::Ok { files } => { + ChallengePinResult::Ok(files) + } + RTCPinSendingResponse::PinRequired => { + ChallengePinResult::PinRequired + } + RTCPinSendingResponse::TooManyAttempts => { + ChallengePinResult::TooManyAttempts + } + } + }, + ) + .await?; + + result + } + RTCPinSendingResponse::TooManyAttempts => { + let _ = status_tx + .send(RTCStatus::Error( + "Unexpected TooManyAttempts response".to_owned(), + )) + .await; + return Err(anyhow::anyhow!("Unexpected TooManyAttempts response")); + } + }; + + status_tx.send(RTCStatus::Connected).await?; + + tracing::debug!("Received file list."); + + files_tx + .send(file_list.clone()) + .map_err(|_| anyhow::anyhow!("Failed to send file list"))?; + + // Init: Receive user selection + let Ok(selected_files) = selected_files_rx.await else { + return Ok(()); + }; + + let Some(selected_files) = selected_files else { + // Declined by the user + send_string_in_chunks( + Arc::clone(&data_channel), + serde_json::to_string(&RTCFileListResponse::Declined)?, + |data_channel, chunk| async move { + data_channel.send(&chunk).await?; + Ok(data_channel) + }, + ) + .await?; + + send_delimiter(&data_channel).await?; + + return Ok(()); + }; + + let file_tokens = selected_files + .into_iter() + .map(|file_id| { + let token = Uuid::new_v4().to_string(); + (file_id, token) + }) + .collect::>(); + + send_string_in_chunks( + Arc::clone(&data_channel), + serde_json::to_string(&RTCFileListResponse::Ok { + files: file_tokens.clone(), + })?, + |data_channel, chunk| async move { + data_channel.send(&chunk).await?; + Ok(data_channel) + }, + ) + .await?; + + send_delimiter(&data_channel).await?; + + tracing::debug!("Sent file tokens."); + + // Receive files + let mut file_state: Option = None; + while let Some(msg) = receive_rx.recv().await { + if msg.is_string { + // End of last file + let last_file_id = file_state.as_ref().map(|s| s.file_id.clone()); + file_state = None; + + if let Some(last_file_id) = last_file_id { + let error = match user_error_tx.recv().await { + Some(result) => { + if result.success { + None + } else { + Some(result.error.map_or("Unknown error".to_string(), |e| e)) + } + } + None => Some("Failed to receive file result".to_string()), + }; + + data_channel + .send_text(serde_json::to_string(&RTCSendFileResponse { + id: last_file_id, + success: error.is_none(), + error, + })?) + .await?; + + if is_delimiter(&msg) { + // End of all files + + // Wait for the last status to be sent + let _ = tokio::time::timeout(Duration::from_secs(5), async { + wait_buffer_empty(&data_channel).await; + }) + .await; + + break; + } + } + + let header: RTCSendFileHeaderRequest = serde_json::from_slice(&msg.data)?; + match file_tokens.get(&header.id) { + Some(entry) => { + if header.token != *entry { + let _ = error_tx + .send(RTCFileError { + file_id: header.id, + error: "Invalid token".to_string(), + }) + .await; + continue; + } + } + None => { + let _ = error_tx + .send(RTCFileError { + file_id: header.id, + error: "File not found".to_string(), + }) + .await; + continue; + } + } + + let (tx, rx) = mpsc::channel::(4); + + let size = { + let entry = file_list.iter().find(|f| f.id == header.id); + match entry { + Some(file) => file.size, + None => { + let _ = error_tx + .send(RTCFileError { + file_id: header.id, + error: "Expected size to be available".to_string(), + }) + .await; + continue; + } + } + }; + + file_state = Some(RTCFileState { + file_id: header.id.clone(), + size, + binary_tx: tx, + }); + + let _ = receiving_tx + .send(RTCFile { + file_id: header.id.clone(), + binary_rx: rx, + }) + .await; + } else { + // publish binary data + match &mut file_state { + Some(state) => { + state.binary_tx.send(msg.data).await?; + } + None => { + let _ = error_tx + .send(RTCFileError { + file_id: "unknown".to_string(), + error: "Received binary data without a header".to_string(), + }) + .await; + } + } + } + } + + Ok(()) + }) + }; + + let remote_desc_sdp = decode_sdp(&offer.sdp)?; + let remote_desc = RTCSessionDescription::offer(remote_desc_sdp)?; + peer_connection.set_remote_description(remote_desc).await?; + + let answer = peer_connection.create_answer(None).await?; + + let mut gather_complete = peer_connection.gathering_complete_promise().await; + peer_connection.set_local_description(answer).await?; + let _ = gather_complete.recv().await; + + let local_description = peer_connection + .local_description() + .await + .ok_or_else(|| anyhow::anyhow!("generate local_description failed!"))?; + + signaling + .send_answer( + offer.session_id.clone(), + offer.peer.id, + encode_sdp(&local_description.sdp), + ) + .await?; + + if let Err(e) = status_tx.send(RTCStatus::SdpExchanged).await { + peer_connection.close().await?; + return Err(e.into()); + } + + tokio::select! { + result = receive_task => { + match result { + Ok(Ok(_)) => tracing::debug!("Receiving done."), + Ok(Err(result)) => { + return Err(result); + }, + Err(e) => { + tracing::error!("Receiving error: {e}"); + return Err(anyhow::anyhow!("Receiving error: {e}")); + } + } + } + _ = done_rx.recv() => { + tracing::debug!("Peer connection remotely closed."); + } + } + + let _ = status_tx.send(RTCStatus::Finished).await; + peer_connection.close().await?; + + Ok(()) +} + +async fn create_peer_connection( + stun: Vec, +) -> Result<(Arc, mpsc::Receiver<()>)> { + let api = APIBuilder::new().build(); + + let config = RTCConfiguration { + ice_servers: vec![RTCIceServer { + urls: stun, + ..Default::default() + }], + ..Default::default() + }; + + let peer_connection = api.new_peer_connection(config).await?; + + let (done_tx, done_rx) = mpsc::channel::<()>(1); + + peer_connection.on_peer_connection_state_change(Box::new(move |s: RTCPeerConnectionState| { + if s == RTCPeerConnectionState::Disconnected { + let _ = done_tx.try_send(()); + } + Box::pin(async {}) + })); + + Ok((Arc::new(peer_connection), done_rx)) +} + +async fn receive_nonce(receive_rx: &mut mpsc::Receiver) -> Result> { + let remote_nonce = match receive_rx.recv().await { + Some(msg) => { + if !msg.is_string { + return Err(anyhow::anyhow!("Expected string message")); + } + + let nonce_msg: RTCNonceMessage = serde_json::from_slice(&msg.data)?; + let remote_nonce = base64::decode(&nonce_msg.nonce) + .map_err(|e| anyhow::anyhow!("Failed to decode remote nonce: {e}"))?; + + if !crypto::nonce::validate_nonce(&remote_nonce) { + return Err(anyhow::anyhow!("Invalid remote nonce")); + } + + remote_nonce + } + None => { + return Err(anyhow::anyhow!("Failed to receive nonce")); + } + }; + + Ok(remote_nonce) +} + +enum ChallengePinResult { + Ok(T), + PinRequired, + TooManyAttempts, + ParseError(anyhow::Error), +} + +async fn handle_pin( + data_channel: &Arc, + status_tx: &mpsc::Sender, + pin_tx: &mpsc::Sender>, + receive_rx: &mut mpsc::Receiver, + receive_in_chunks: bool, + parse_response: fn(Bytes) -> ChallengePinResult, +) -> Result { + loop { + status_tx.send(RTCStatus::PinRequired).await?; + let (new_pin_tx, new_pin_rx) = oneshot::channel::(); + + if pin_tx.send(new_pin_tx).await.is_err() { + return Err(anyhow::anyhow!("Failed to send PIN request")); + } + + let Ok(pin) = new_pin_rx.await else { + return Err(anyhow::anyhow!("PIN required but not provided")); + }; + + data_channel + .send_text(&serde_json::to_string(&RTCPinMessage { pin })?) + .await?; + + let bytes = match receive_in_chunks { + true => receive_string_from_chunks(receive_rx).await, + false => { + let Some(init_status) = receive_rx.recv().await else { + return Err(anyhow::anyhow!("Failed to receive initial message")); + }; + + if !init_status.is_string { + return Err(anyhow::anyhow!("Expected string message")); + } + + init_status.data + } + }; + + let pin_res = parse_response(bytes); + match pin_res { + ChallengePinResult::Ok(result) => { + return Ok(result); + } + ChallengePinResult::PinRequired => { + continue; + } + ChallengePinResult::TooManyAttempts => { + status_tx.send(RTCStatus::TooManyAttempts).await?; + return Err(anyhow::anyhow!("Too many requests")); + } + ChallengePinResult::ParseError(e) => { + return Err(e); + } + } + } +} + +#[derive(Debug)] +enum VerifyPinResult { + PinRequired, + TooManyAttempts, +} + +async fn verify_pin( + pin_config: &PinConfig, + data_channel: &Arc, + status_tx: &mpsc::Sender, + receive_rx: &mut mpsc::Receiver, + mut send_initial_notice: bool, + send_result: F, +) -> Result<()> +where + F: Fn(&Arc, VerifyPinResult) -> Fut, + Fut: Future>, +{ + status_tx.send(RTCStatus::PinRequired).await?; + + let mut remote_pin = "".to_string(); + let mut pin_try = 0u8; + + loop { + if remote_pin == pin_config.pin { + return Ok(()); + } + + if pin_try >= pin_config.max_tries { + let _ = tokio::time::timeout(Duration::from_secs(5), async { + let _ = send_result(&data_channel, VerifyPinResult::TooManyAttempts).await; + + wait_buffer_empty(&data_channel).await; + }) + .await; + + status_tx.send(RTCStatus::TooManyAttempts).await?; + + return Err(anyhow::anyhow!("Too many requests")); + } + + if send_initial_notice || pin_try > 0 { + send_initial_notice = false; + send_result(&data_channel, VerifyPinResult::PinRequired).await?; + } + + remote_pin = match receive_rx.recv().await { + Some(msg) => { + let pin_req: RTCPinMessage = serde_json::from_slice(&msg.data)?; + pin_req.pin + } + None => { + return Err(anyhow::anyhow!("Failed to receive pin")); + } + }; + + pin_try += 1; + } +} + +fn encode_sdp(s: &str) -> String { + let mut e = ZlibEncoder::new(Vec::new(), flate2::Compression::best()); + e.write_all(s.as_bytes()) + .map_err(|e| anyhow::anyhow!("Failed to compress SDP: {e}")) + .unwrap(); + let compressed = e + .finish() + .map_err(|e| anyhow::anyhow!("Failed to finish compression of SDP: {e}")) + .unwrap(); + base64::encode(&compressed) +} + +fn decode_sdp(s: &str) -> Result { + let decoded_data = + base64::decode(s).map_err(|e| anyhow::anyhow!("Base64 decode of SDP failed: {e}"))?; + let mut d = ZlibDecoder::new(&*decoded_data); + let mut result = String::new(); + d.read_to_string(&mut result) + .map_err(|e| anyhow::anyhow!("Failed to decompress SDP: {e}"))?; + Ok(result) +} + +async fn send_delimiter(data_channel: &Arc) -> Result<()> { + // Somehow, empty messages are not received by the other peer, so we send a non-empty message + data_channel.send_text("0".to_string()).await?; + Ok(()) +} + +fn is_delimiter(msg: &DataChannelMessage) -> bool { + msg.is_string && msg.data.len() <= 1 +} + +async fn wait_buffer_empty(data_channel: &Arc) { + while data_channel.buffered_amount().await != 0 { + tokio::time::sleep(Duration::from_millis(100)).await; + } +} + +const CHUNK_SIZE: usize = 16 * 1024; // 16 KiB + +/// Process incoming data in chunks of CHUNK_SIZE +/// The callback returns the same data_channel to avoid re-creating or lifetime issues. +/// Note: You need to send the delimiter (or any other string) after the last chunk. +pub async fn process_in_chunks( + mut data_channel: T, + mut rx: mpsc::Receiver, + mut callback: F, +) -> Result<()> +where + F: FnMut(T, Bytes) -> Fut, + Fut: Future>, +{ + let mut buffer = BytesMut::with_capacity(CHUNK_SIZE); + + while let Some(data) = rx.recv().await { + buffer.extend_from_slice(&data); + + while buffer.len() >= CHUNK_SIZE { + let chunk = buffer.split_to(CHUNK_SIZE).freeze(); + + // Process the chunk, reuse the data_channel + data_channel = callback(data_channel, chunk).await?; + } + } + + // After the channel is closed, if there's leftover data, handle it as needed: + if !buffer.is_empty() { + callback(data_channel, buffer.freeze()).await?; + } + + Ok(()) +} + +/// Convenience function for `process_in_chunks` that processes a string in chunks. +/// Note: You need to send the delimiter (or any other string) after the last chunk. +pub async fn send_string_in_chunks( + data_channel: T, + string: String, + callback: F, +) -> Result<()> +where + F: FnMut(T, Bytes) -> Fut, + Fut: Future>, +{ + let (tx, rx) = mpsc::channel(1); + + tokio::spawn(async move { + let _ = tx.send(Bytes::from(string)).await; + }); + + process_in_chunks(data_channel, rx, callback).await +} + +async fn receive_string_from_chunks(receive_rx: &mut mpsc::Receiver) -> Bytes { + let mut buffer = BytesMut::new(); + while let Some(msg) = receive_rx.recv().await { + if msg.is_string { + break; + } + + buffer.extend_from_slice(&msg.data); + } + + buffer.freeze() +} + +fn to_receive_stream( + data_channel: &Arc, + buffer: usize, +) -> mpsc::Receiver { + let (tx, rx) = mpsc::channel(buffer); + + data_channel.on_message(Box::new(move |msg: DataChannelMessage| { + let tx = tx.clone(); + Box::pin(async move { + let _ = tx.send(msg).await; + }) + })); + + rx +} + +#[cfg(test)] +mod tests { + use super::*; + + #[tokio::test] + async fn test_process_in_chunks() { + let (tx, rx) = mpsc::channel(16); + + tokio::spawn(async move { + let mut test_vec = vec![0; CHUNK_SIZE * 2 + 5]; + test_vec[CHUNK_SIZE..CHUNK_SIZE * 2] + .iter_mut() + .for_each(|x| *x = 1); + test_vec[CHUNK_SIZE * 2..].iter_mut().for_each(|x| *x = 2); + tx.send(Bytes::from(test_vec)).await.unwrap(); + }); + + let mut chunks = Vec::new(); + + let result = process_in_chunks(0, rx, |_, chunk| { + chunks.push(chunk); + async { Ok(0) } + }) + .await; + + assert!(result.is_ok()); + assert_eq!(chunks.len(), 3); + assert_eq!(chunks[0].len(), CHUNK_SIZE); + assert_eq!(chunks[1].len(), CHUNK_SIZE); + assert_eq!(chunks[2].len(), 5); + + assert_eq!(chunks[0].iter().all(|x| *x == 0), true); + assert_eq!(chunks[1].iter().all(|x| *x == 1), true); + assert_eq!(chunks[2].iter().all(|x| *x == 2), true); + } + + #[test] + fn rtc_file_list_response_encoding() { + let response = RTCFileListResponse::Pair { + public_key: "123".to_string(), + }; + + let encoded = serde_json::to_string_pretty(&response).unwrap(); + + assert_eq!( + encoded, + r#"{ + "status": "PAIR", + "publicKey": "123" +}"# + ); + + let decoded: RTCFileListResponse = serde_json::from_str(&encoded).unwrap(); + + assert_eq!(response, decoded); + } +} diff --git a/core/tests/v2_server.rs b/core/tests/v2_server.rs new file mode 100644 index 0000000..8a9facc --- /dev/null +++ b/core/tests/v2_server.rs @@ -0,0 +1,555 @@ +#![cfg(feature = "http")] + +use localsend::http::client::{ClientError, LsHttpClientV2}; +use localsend::http::dto::ProtocolType; +use localsend::http::dto_v2::{PrepareUploadRequestDtoV2, ProtocolTypeV2, RegisterDtoV2}; +use localsend::http::server::{PrepareUploadDecisionV2, ServerEventV2, SessionEndReasonV2}; +use localsend::http::server::{start_with_port, ServerConfigV2}; +use localsend::http::state::ClientInfo; +use localsend::model::transfer::FileDto; +use std::collections::HashMap; +use std::sync::atomic::{AtomicU16, Ordering}; +use std::sync::Arc; +use std::time::Duration; +use tokio::sync::{mpsc, oneshot, Mutex}; + +struct TestServer { + port: u16, + /// Uploaded file contents, mapped by file ID. + received: Arc>>>, + /// Ended sessions with their reasons. + session_ends: Arc>>, + _stop_tx: oneshot::Sender<()>, +} + +async fn start_test_server(pin: Option, accept: bool) -> TestServer { + let _ = tracing_subscriber::fmt().with_test_writer().try_init(); + let port = free_port(); + let received: Arc>>> = Arc::new(Mutex::new(HashMap::new())); + let session_ends: Arc>> = + Arc::new(Mutex::new(Vec::new())); + + let (event_tx, mut event_rx) = mpsc::channel::(16); + + tokio::spawn({ + let received = received.clone(); + let session_ends = session_ends.clone(); + async move { + while let Some(event) = event_rx.recv().await { + match event { + ServerEventV2::Register { .. } => {} + ServerEventV2::PrepareUpload { + files, decision_tx, .. + } => { + let decision = match accept { + true => { + PrepareUploadDecisionV2::Accept(files.keys().cloned().collect()) + } + false => PrepareUploadDecisionV2::Decline, + }; + let _ = decision_tx.send(decision); + } + ServerEventV2::FileUpload { + file_id, + mut binary_rx, + result_tx, + .. + } => { + let received = received.clone(); + tokio::spawn(async move { + let mut bytes = Vec::new(); + while let Some(chunk) = binary_rx.recv().await { + bytes.extend_from_slice(&chunk); + } + received.lock().await.insert(file_id, bytes); + let _ = result_tx.send(Ok(())); + }); + } + ServerEventV2::SessionEnd { session_id, reason } => { + session_ends.lock().await.push((session_id, reason)); + } + } + } + } + }); + + let (stop_tx, stop_rx) = oneshot::channel::<()>(); + + start_with_port( + port, + None, // plain HTTP + ClientInfo { + alias: "Test Server".to_string(), + version: "2.1".to_string(), + device_model: Some("Rust".to_string()), + device_type: None, + token: "server-fingerprint".to_string(), + }, + Some(ServerConfigV2 { + pin, + event_tx, + }), + None, + stop_rx, + ) + .await + .expect("Failed to start server"); + + wait_until_reachable(port).await; + + TestServer { + port, + received, + session_ends, + _stop_tx: stop_tx, + } +} + +/// Returns a free port. +/// +/// A counter is used instead of binding to port 0 because the OS may hand out +/// the same just-freed ephemeral port to multiple tests running in parallel. +fn free_port() -> u16 { + static PORT_COUNTER: AtomicU16 = AtomicU16::new(40551); + + loop { + let port = PORT_COUNTER.fetch_add(1, Ordering::SeqCst); + if std::net::TcpListener::bind(("127.0.0.1", port)).is_ok() { + return port; + } + } +} + +async fn wait_until_reachable(port: u16) { + for _ in 0..100 { + if tokio::net::TcpStream::connect(("127.0.0.1", port)) + .await + .is_ok() + { + return; + } + tokio::time::sleep(Duration::from_millis(20)).await; + } + panic!("Server did not become reachable on port {port}"); +} + +fn sender_info() -> RegisterDtoV2 { + RegisterDtoV2 { + alias: "Test Sender".to_string(), + version: "2.1".to_string(), + device_model: Some("Rust".to_string()), + device_type: None, + fingerprint: "sender-fingerprint".to_string(), + port: 53317, + protocol: ProtocolTypeV2::Http, + download: false, + } +} + +fn file_dto(id: &str, name: &str, size: u64) -> FileDto { + FileDto { + id: id.to_string(), + file_name: name.to_string(), + size, + file_type: "application/octet-stream".to_string(), + sha256: None, + preview: None, + metadata: None, + } +} + +fn prepare_upload_request(files: &[FileDto]) -> PrepareUploadRequestDtoV2 { + PrepareUploadRequestDtoV2 { + info: sender_info(), + files: files + .iter() + .map(|file| (file.id.clone(), file.clone())) + .collect(), + } +} + +async fn upload_bytes( + client: &LsHttpClientV2, + port: u16, + session_id: &str, + file_id: &str, + token: &str, + bytes: &[u8], +) -> Result<(), ClientError> { + let (tx, rx) = mpsc::channel::>(4); + let chunks: Vec> = bytes.chunks(1024).map(|chunk| chunk.to_vec()).collect(); + tokio::spawn(async move { + for chunk in chunks { + if tx.send(chunk).await.is_err() { + break; + } + } + }); + + client + .upload( + ProtocolType::Http, + "127.0.0.1", + port, + None, + session_id, + file_id, + token, + rx, + ) + .await +} + +fn assert_status(result: Result, expected_status: u16) { + match result { + Err(ClientError::StatusCode(err)) => assert_eq!(err.status, expected_status), + Err(err) => panic!("Expected status code {expected_status}, got error: {err:?}"), + Ok(_) => panic!("Expected status code {expected_status}, got success"), + } +} + +#[tokio::test] +async fn test_register_and_info() { + let server = start_test_server(None, true).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + let response = client + .register(ProtocolType::Http, "127.0.0.1", server.port, sender_info()) + .await + .unwrap(); + assert_eq!(response.body.alias, "Test Server"); + assert_eq!(response.body.fingerprint, "server-fingerprint"); + assert!(!response.body.download); + + let info = client + .info(ProtocolType::Http, "127.0.0.1", server.port) + .await + .unwrap(); + assert_eq!(info.alias, "Test Server"); + assert_eq!(info.fingerprint, "server-fingerprint"); +} + +#[tokio::test] +async fn test_register_over_ipv6() { + let server = start_test_server(None, true).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + let response = client + .register(ProtocolType::Http, "::1", server.port, sender_info()) + .await + .unwrap(); + assert_eq!(response.body.alias, "Test Server"); +} + +#[tokio::test] +async fn test_full_upload_flow() { + let server = start_test_server(None, true).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + let file_a = file_dto("file-a", "a.bin", 100_000); + let file_b = file_dto("file-b", "b.bin", 5); + + let result = client + .prepare_upload( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + prepare_upload_request(&[file_a.clone(), file_b.clone()]), + None, + ) + .await + .unwrap(); + + assert_eq!(result.status_code, 200); + let response = result.response.unwrap(); + assert_eq!(response.files.len(), 2); + + let bytes_a: Vec = (0..100_000u32).map(|i| i as u8).collect(); + let bytes_b = b"hello".to_vec(); + + upload_bytes( + &client, + server.port, + &response.session_id, + "file-a", + &response.files["file-a"], + &bytes_a, + ) + .await + .unwrap(); + + upload_bytes( + &client, + server.port, + &response.session_id, + "file-b", + &response.files["file-b"], + &bytes_b, + ) + .await + .unwrap(); + + let received = server.received.lock().await; + assert_eq!(received["file-a"], bytes_a); + assert_eq!(received["file-b"], bytes_b); + drop(received); + + // The session should have ended after all files were uploaded. + tokio::time::sleep(Duration::from_millis(100)).await; + let session_ends = server.session_ends.lock().await; + assert_eq!( + *session_ends, + vec![(response.session_id.clone(), SessionEndReasonV2::Finished)] + ); + + // The session is gone, so uploading again is rejected. + let result = upload_bytes( + &client, + server.port, + &response.session_id, + "file-a", + &response.files["file-a"], + b"again", + ) + .await; + assert_status(result, 403); +} + +#[tokio::test] +async fn test_upload_with_invalid_token() { + let server = start_test_server(None, true).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + let file = file_dto("file-a", "a.bin", 5); + let response = client + .prepare_upload( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + prepare_upload_request(&[file]), + None, + ) + .await + .unwrap() + .response + .unwrap(); + + let result = upload_bytes( + &client, + server.port, + &response.session_id, + "file-a", + "wrong-token", + b"hello", + ) + .await; + assert_status(result, 403); + + // The correct token still works afterwards. + upload_bytes( + &client, + server.port, + &response.session_id, + "file-a", + &response.files["file-a"], + b"hello", + ) + .await + .unwrap(); +} + +#[tokio::test] +async fn test_upload_missing_parameters() { + let server = start_test_server(None, true).await; + + let response = localsend::reqwest::Client::new() + .post(format!( + "http://127.0.0.1:{}/api/localsend/v2/upload?sessionId=abc", + server.port + )) + .body("data") + .send() + .await + .unwrap(); + assert_eq!(response.status().as_u16(), 400); +} + +#[tokio::test] +async fn test_second_session_blocked_and_cancel() { + let server = start_test_server(None, true).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + let file = file_dto("file-a", "a.bin", 5); + let response = client + .prepare_upload( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + prepare_upload_request(&[file.clone()]), + None, + ) + .await + .unwrap() + .response + .unwrap(); + + // A second session is blocked while the first one is active. + let result = client + .prepare_upload( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + prepare_upload_request(&[file.clone()]), + None, + ) + .await; + assert_status(result, 409); + + client + .cancel( + ProtocolType::Http, + "127.0.0.1", + server.port, + &response.session_id, + ) + .await + .unwrap(); + + tokio::time::sleep(Duration::from_millis(100)).await; + let session_ends = server.session_ends.lock().await.clone(); + assert_eq!( + session_ends, + vec![(response.session_id.clone(), SessionEndReasonV2::Cancelled)] + ); + + // After cancelling, a new session can be created. + client + .prepare_upload( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + prepare_upload_request(&[file]), + None, + ) + .await + .unwrap(); +} + +#[tokio::test] +async fn test_prepare_upload_declined() { + let server = start_test_server(None, false).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + let file = file_dto("file-a", "a.bin", 5); + let result = client + .prepare_upload( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + prepare_upload_request(&[file.clone()]), + None, + ) + .await; + assert_status(result, 403); + + // A declined request must not block subsequent sessions. + let result = client + .prepare_upload( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + prepare_upload_request(&[file]), + None, + ) + .await; + assert_status(result, 403); +} + +#[tokio::test] +async fn test_pin() { + let server = start_test_server(Some("123456".to_string()), true).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + let file = file_dto("file-a", "a.bin", 5); + + // Missing PIN. + let result = client + .prepare_upload( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + prepare_upload_request(&[file.clone()]), + None, + ) + .await; + assert_status(result, 401); + + // Wrong PIN. + let result = client + .prepare_upload( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + prepare_upload_request(&[file.clone()]), + Some("000000"), + ) + .await; + assert_status(result, 401); + + // Correct PIN. + client + .prepare_upload( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + prepare_upload_request(&[file]), + Some("123456"), + ) + .await + .unwrap(); +} + +#[tokio::test] +async fn test_pin_too_many_attempts() { + let server = start_test_server(Some("123456".to_string()), true).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + let file = file_dto("file-a", "a.bin", 5); + + for _ in 0..3 { + let result = client + .prepare_upload( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + prepare_upload_request(&[file.clone()]), + Some("000000"), + ) + .await; + assert_status(result, 401); + } + + // Blocked even with the correct PIN. + let result = client + .prepare_upload( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + prepare_upload_request(&[file]), + Some("123456"), + ) + .await; + assert_status(result, 429); +} diff --git a/core/tests/v2_web_send.rs b/core/tests/v2_web_send.rs new file mode 100644 index 0000000..7e58b2e --- /dev/null +++ b/core/tests/v2_web_send.rs @@ -0,0 +1,534 @@ +#![cfg(feature = "http")] + +use bytes::Bytes; +use localsend::http::client::{ClientError, LsHttpClientV2}; +use localsend::http::dto::ProtocolType; +use localsend::http::server::{ServerEventV2, WebSendEvent}; +use localsend::http::server::{start_with_port, ServerConfigV2, WebSendConfig, WebSendI18n}; +use localsend::http::state::ClientInfo; +use localsend::model::transfer::FileDto; +use std::collections::HashMap; +use std::net::IpAddr; +use std::path::PathBuf; +use std::sync::atomic::{AtomicU16, AtomicU32, Ordering}; +use std::sync::Arc; +use std::time::Duration; +use tokio::io::AsyncReadExt; +use tokio::sync::{mpsc, oneshot}; + +struct TestServer { + port: u16, + /// Number of `PrepareDownload` events received. + prepare_download_events: Arc, + _stop_tx: oneshot::Sender<()>, +} + +/// The content sources backing the offered files, used by the test event +/// handler to answer `FileDownload` events. +#[derive(Clone)] +enum TestFileContent { + Bytes(Bytes), + Path(PathBuf), +} + +impl TestFileContent { + /// Streams the content into `tx`, mimicking how an application would + /// serve in-memory content or a file from disk. + async fn stream(self, tx: mpsc::Sender) { + match self { + TestFileContent::Bytes(bytes) => { + let _ = tx.send(bytes).await; + } + TestFileContent::Path(path) => { + let mut file = tokio::fs::File::open(&path) + .await + .expect("Failed to open test file"); + let mut buffer = vec![0u8; 4096]; + loop { + let bytes_read = file.read(&mut buffer).await.expect("Failed to read"); + if bytes_read == 0 { + break; // EOF + } + if tx + .send(Bytes::copy_from_slice(&buffer[..bytes_read])) + .await + .is_err() + { + break; // client disconnected + } + } + } + } + } +} + +async fn start_test_server( + web_send: Option<(WebSendConfig, HashMap)>, + accept: bool, +) -> TestServer { + let _ = tracing_subscriber::fmt().with_test_writer().try_init(); + let port = free_port(); + let prepare_download_events = Arc::new(AtomicU32::new(0)); + + let (web_send, contents) = match web_send { + Some((config, contents)) => (Some(config), contents), + None => (None, HashMap::new()), + }; + + // Web send emits its own event type, independent of the v2 protocol events. + let (web_event_tx, mut web_event_rx) = mpsc::channel::(16); + + tokio::spawn({ + let prepare_download_events = prepare_download_events.clone(); + async move { + while let Some(event) = web_event_rx.recv().await { + match event { + WebSendEvent::PrepareDownload { decision_tx, .. } => { + prepare_download_events.fetch_add(1, Ordering::SeqCst); + let _ = decision_tx.send(accept); + } + WebSendEvent::FileDownload { + file_id, + content_tx, + .. + } => { + let content = contents + .get(&file_id) + .expect("FileDownload for unknown file") + .clone(); + tokio::spawn(async move { + let (tx, rx) = mpsc::channel::(16); + if content_tx.send(rx).is_err() { + return; + } + content.stream(tx).await; + }); + } + } + } + } + }); + + // v2 stays enabled so the `/info` endpoint (which advertises `download`) can be + // exercised. Its event channel is unused by these tests. + let (v2_event_tx, _v2_event_rx) = tokio::sync::mpsc::channel::(16); + + let (stop_tx, stop_rx) = oneshot::channel::<()>(); + + // Web send is configured independently of the v2 endpoints. + let web_send = web_send.map(|mut config| { + config.event_tx = web_event_tx; + config + }); + + start_with_port( + port, + None, // plain HTTP + ClientInfo { + alias: "Test Server".to_string(), + version: "2.1".to_string(), + device_model: Some("Rust".to_string()), + device_type: None, + token: "server-fingerprint".to_string(), + }, + Some(ServerConfigV2 { + pin: None, + event_tx: v2_event_tx, + }), + web_send, + stop_rx, + ) + .await + .expect("Failed to start server"); + + wait_until_reachable(port).await; + + TestServer { + port, + prepare_download_events, + _stop_tx: stop_tx, + } +} + +/// Returns a free port. +/// +/// A counter is used instead of binding to port 0 because the OS may hand out +/// the same just-freed ephemeral port to multiple tests running in parallel. +fn free_port() -> u16 { + static PORT_COUNTER: AtomicU16 = AtomicU16::new(41551); + + loop { + let port = PORT_COUNTER.fetch_add(1, Ordering::SeqCst); + if std::net::TcpListener::bind(("127.0.0.1", port)).is_ok() { + return port; + } + } +} + +async fn wait_until_reachable(port: u16) { + for _ in 0..100 { + if tokio::net::TcpStream::connect(("127.0.0.1", port)) + .await + .is_ok() + { + return; + } + tokio::time::sleep(Duration::from_millis(20)).await; + } + panic!("Server did not become reachable on port {port}"); +} + +fn file_dto(id: &str, name: &str, size: u64) -> FileDto { + FileDto { + id: id.to_string(), + file_name: name.to_string(), + size, + file_type: "application/octet-stream".to_string(), + sha256: None, + preview: None, + metadata: None, + } +} + +/// Creates a web send config with an in-memory text file and a file on disk. +/// +/// Returns the config, the content sources for the test event handler and +/// the path of the file on disk (the caller should delete it). +fn web_send_config( + pin: Option, +) -> ( + WebSendConfig, + HashMap, + PathBuf, + Vec, +) { + let disk_content: Vec = (0..100_000u32).map(|i| i as u8).collect(); + let disk_path = std::env::temp_dir().join(format!("localsend-web-send-{}", uuid::Uuid::new_v4())); + std::fs::write(&disk_path, &disk_content).expect("Failed to write test file"); + + // The config only carries the metadata; the content is streamed by the + // test event handler when the server emits `FileDownload`. + let files = HashMap::from([ + ( + "file-text".to_string(), + file_dto("file-text", "message.txt", 5), + ), + ( + "file-disk".to_string(), + file_dto("file-disk", "dir/data.bin", disk_content.len() as u64), + ), + ]); + + let contents = HashMap::from([ + ( + "file-text".to_string(), + TestFileContent::Bytes(Bytes::from_static(b"hello")), + ), + ( + "file-disk".to_string(), + TestFileContent::Path(disk_path.clone()), + ), + ]); + + // The event channel is a placeholder; `start_test_server` replaces it with + // the one whose receiver handles the web send events. + let (event_tx, _event_rx) = tokio::sync::mpsc::channel::(16); + + ( + WebSendConfig { + files, + pin, + i18n: WebSendI18n::default(), + event_tx, + }, + contents, + disk_path, + disk_content, + ) +} + +fn assert_status(result: Result, expected_status: u16) { + match result { + Err(ClientError::StatusCode(err)) => assert_eq!(err.status, expected_status), + Err(err) => panic!("Expected status code {expected_status}, got error: {err:?}"), + Ok(_) => panic!("Expected status code {expected_status}, got success"), + } +} + +#[tokio::test] +async fn test_web_page() { + let (config, contents, disk_path, _) = web_send_config(None); + let server = start_test_server(Some((config, contents)), true).await; + let client = localsend::reqwest::Client::new(); + let base_url = format!("http://127.0.0.1:{}", server.port); + + let response = client.get(&base_url).send().await.unwrap(); + assert_eq!(response.status().as_u16(), 200); + assert!(response.text().await.unwrap().contains("LocalSend")); + + let response = client + .get(format!("{base_url}/main.js")) + .send() + .await + .unwrap(); + assert_eq!(response.status().as_u16(), 200); + assert_eq!( + response.headers()["content-type"], + "text/javascript; charset=utf-8" + ); + + let response = client + .get(format!("{base_url}/i18n.json")) + .send() + .await + .unwrap(); + assert_eq!(response.status().as_u16(), 200); + let i18n = response + .json::>() + .await + .unwrap(); + assert_eq!(i18n["enterPin"], "Enter PIN"); + assert!(i18n.contains_key("waiting")); + + // The register/info endpoints advertise the download API. + let info = LsHttpClientV2::try_new_without_cert() + .unwrap() + .info(ProtocolType::Http, "127.0.0.1", server.port) + .await + .unwrap(); + assert!(info.download); + + let _ = std::fs::remove_file(disk_path); +} + +#[tokio::test] +async fn test_web_page_disabled() { + let server = start_test_server(None, true).await; + let client = localsend::reqwest::Client::new(); + let base_url = format!("http://127.0.0.1:{}", server.port); + + let response = client.get(&base_url).send().await.unwrap(); + assert_eq!(response.status().as_u16(), 403); + + let response = client + .post(format!("{base_url}/api/localsend/v2/prepare-download")) + .send() + .await + .unwrap(); + assert_eq!(response.status().as_u16(), 403); + + let info = LsHttpClientV2::try_new_without_cert() + .unwrap() + .info(ProtocolType::Http, "127.0.0.1", server.port) + .await + .unwrap(); + assert!(!info.download); +} + +#[tokio::test] +async fn test_full_download_flow() { + let (config, contents, disk_path, disk_content) = web_send_config(None); + let server = start_test_server(Some((config, contents)), true).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + let response = client + .prepare_download(ProtocolType::Http, "127.0.0.1", server.port, None, None) + .await + .unwrap(); + + assert_eq!(response.info.alias, "Test Server"); + assert_eq!(response.files.len(), 2); + assert_eq!(response.files["file-text"].file_name, "message.txt"); + assert_eq!(server.prepare_download_events.load(Ordering::SeqCst), 1); + + // Download the in-memory file. + let mut bytes = Vec::new(); + client + .download_to_writer( + ProtocolType::Http, + "127.0.0.1", + server.port, + &response.session_id, + "file-text", + &mut bytes, + ) + .await + .unwrap(); + assert_eq!(bytes, b"hello"); + + // Download the file from disk (streamed). + let download_response = client + .download( + ProtocolType::Http, + "127.0.0.1", + server.port, + &response.session_id, + "file-disk", + ) + .await + .unwrap(); + assert_eq!( + download_response.headers()["content-length"], + disk_content.len().to_string().as_str() + ); + assert_eq!( + download_response.headers()["content-disposition"], + "attachment; filename=\"dir-data.bin\"" + ); + assert_eq!( + download_response.bytes().await.unwrap().as_ref(), + disk_content.as_slice() + ); + + // The session can be reused without a new permission request (e.g. page reload). + let reused = client + .prepare_download( + ProtocolType::Http, + "127.0.0.1", + server.port, + Some(&response.session_id), + None, + ) + .await + .unwrap(); + assert_eq!(reused.session_id, response.session_id); + assert_eq!(server.prepare_download_events.load(Ordering::SeqCst), 1); + + let _ = std::fs::remove_file(disk_path); +} + +#[tokio::test] +async fn test_prepare_download_rejected() { + let (config, contents, disk_path, _) = web_send_config(None); + let server = start_test_server(Some((config, contents)), false).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + let result = client + .prepare_download(ProtocolType::Http, "127.0.0.1", server.port, None, None) + .await; + assert_status(result, 403); + + // The rejected session must not allow downloads. + let local_ip: IpAddr = "127.0.0.1".parse().unwrap(); + let result = client + .download( + ProtocolType::Http, + "127.0.0.1", + server.port, + &local_ip.to_string(), + "file-text", + ) + .await; + assert_status(result, 403); + + let _ = std::fs::remove_file(disk_path); +} + +#[tokio::test] +async fn test_download_invalid_session() { + let (config, contents, disk_path, _) = web_send_config(None); + let server = start_test_server(Some((config, contents)), true).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + let result = client + .download( + ProtocolType::Http, + "127.0.0.1", + server.port, + "unknown-session", + "file-text", + ) + .await; + assert_status(result, 403); + + // Valid session but unknown file. + let response = client + .prepare_download(ProtocolType::Http, "127.0.0.1", server.port, None, None) + .await + .unwrap(); + let result = client + .download( + ProtocolType::Http, + "127.0.0.1", + server.port, + &response.session_id, + "unknown-file", + ) + .await; + assert_status(result, 403); + + let _ = std::fs::remove_file(disk_path); +} + +#[tokio::test] +async fn test_pin() { + let (config, contents, disk_path, _) = web_send_config(Some("123456".to_string())); + let server = start_test_server(Some((config, contents)), true).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + // Missing PIN. + let result = client + .prepare_download(ProtocolType::Http, "127.0.0.1", server.port, None, None) + .await; + assert_status(result, 401); + + // Wrong PIN. + let result = client + .prepare_download( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + Some("000000"), + ) + .await; + assert_status(result, 401); + + // Correct PIN. + client + .prepare_download( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + Some("123456"), + ) + .await + .unwrap(); + + let _ = std::fs::remove_file(disk_path); +} + +#[tokio::test] +async fn test_pin_too_many_attempts() { + let (config, contents, disk_path, _) = web_send_config(Some("123456".to_string())); + let server = start_test_server(Some((config, contents)), true).await; + let client = LsHttpClientV2::try_new_without_cert().unwrap(); + + for _ in 0..3 { + let result = client + .prepare_download( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + Some("000000"), + ) + .await; + assert_status(result, 401); + } + + // Blocked even with the correct PIN. + let result = client + .prepare_download( + ProtocolType::Http, + "127.0.0.1", + server.port, + None, + Some("123456"), + ) + .await; + assert_status(result, 429); + + let _ = std::fs::remove_file(disk_path); +} diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 0000000..c27e93f --- /dev/null +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1,7 @@ +LocalSend is an open source app to share files and messages between nearby devices using the local wifi network. +The communication between devices is entirely end-to-end encrypted via HTTPS. +No Internet required. No tracking*. No ads. + +Currently, this app is available on Android, iOS, macOS, Windows and Linux. You can find all download options on the official homepage. + +*The operating system may still gather usage data. diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3e20f217afd5a937edf5d07287c0b6557a7396ed GIT binary patch literal 4688 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5874aa7a430b0be2a9554f590ddb4888402be05f GIT binary patch literal 403320 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%0AftB?53~<1F6;=b(aXOOkymUkylz4BCDkM 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

-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Ⓢ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

fzFipwT01zy=U*IK~P?UX$o$wxk&$ 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 z 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..49e0e166b500432541add7b6059dc9b64b931d1e GIT binary patch literal 501654 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%0AG>@*|6cB=Jo-H&nCBm+{4C!O zcBE77M~W9q&1JO?-#zh^(XQ`i4(}`X62I)`m1aJiC6vcya$^EW7G#Q|)CdiTYShXD zNMpE0)W>k-l{QD$hT*tW`pG?EjS-Qj2`h)-d7^)}CGzs+7S1>Yx4ympqI7E^#$5e* zJg+LkyDE4GRU@E=0QMC#YMZ)^ty92Z%Kj1y5v2v_zGnJBn!hJXY+r0(WT- zSD}Kw(^s}I$!SK9M>k@!Wa<))!w6fXI%J1PWbFDG*owjg3zxTjT$l1f$D%mPr?e`= zb)%%h{JO7iV|GUWQh5R|t>U&O<~9Wx%YumSL{I)casB9|91*Kar<7uEJx*}Bb+JRW zI9%8%IXB(d9ve>LdIKO}-2;GzR_5Ub$qzrHoA4v#6EL_g*FYR2DcZ-b0LKyrIOf6Q z71(j9+Aio<{?n}-{oAcn|J$u-SYaOG;*R*Mpp(<3N4&)O|B1sUxVKBxK z!x-Ql*`=<)O{n^IteSOP{n&;R;tIG|9o~MNmFO$vVw8oTkE5IarS4|q{|i%ntw!D8 zQNt@Ty1l6_Ga$drYWZZ7(YNP8vn7M37q4ttFS;hWG{~fPwqc0!lzgXNnJpO^`Wp9p z$W;VaQp~7o`mTL8%sF8s_IwLZN%C+;<$mh;=hfcz?rGJugmyzG{2h!EJWlB~yc$is zDz-UY9Kc6TA?XovI>ueCOM`~8_(t{vFOHjb_?*EGzWF>R39e12EW-WLhWvObj;ud) zrJ7Bi>-c7#%a7DabVq>F4{UV5!&3*%G$bk`=O?#u>bzN)ZE&j!Vna4fGLJmv;xyHNq?DF1TT^XW1J9}7jS#>?=Ll+- zCek8%?r61htH`)IMHPgneZzj9axm<)wF_@ISb5SiT;iJ+Gxe8BvXIZ$ayfZUozEL6 zer$Gl8$`CZJF4!Ai~Q(F;Y$E8&fVImhjI9dx|_>4mj$J#oolCkoa>66*Qdv-j+X%> z0hZWO1Z5a;VAuru#xF@V#KQ<^XVRV=3L3;^TmE?xcV$Q9>JI>#kDAul$qoy zLho8>TBMChfEP7s6v)qU5y(P%o`ojC^+lPoqN{RCro=Yk0euHCX((+U(nevk4|hlx zS8?RHR@n5&fd?TU?U%yAatPd8c^cg%j=bZ+ow!(Ssryac3*w)R?b9ArP_`}Bl}L^} z_4L*ayV#q&tMzDV5g(=%!)rW_@t-O#50C4Znzb_na+IH5fxwN%mC7+x1@cTsb-h97 zHch{{lo8jBm&0bNw>$!>7uD{yP4u#84BBagzI5i&TH3ne&mt#vr54I|hU8G21d=&u z3IpNKok3vgmXX8B{k17u)TyAK96U*f@|jH!&DX%?1+eFuA$=@|wv9L*)`1+xZ4`E% z*<4qkmNNdekw6{KP`M@_+D@6p9yl-<>;GBP1nydecU7A0LeX-D1yZxBxkUyECQBNb zQwEXnK2$#2X`4#13x$MaI;Im?bomD#{U+X%uW~CUVR^xw*do5Ekm7|e3l-G`w{%NJ z3!|5!^TJAHh;T#@bUl;`Qi9`M?KgKyk=+N;1oRd+u$Ey)N-P|Pc){ske9g(}K6luG z;IZg_`ts$n-5)f(QsJW4(f)_*=P9lG^XJuNAC5lVh2#lrcS5;p!z|eO5uD~y_KY)b zzr2_GZ+u-vZ;o;fTMd-9u(@u|XUCnhsZx~gN6yu-cMD@PYFiMY9g>T54RfwE!v}`B z6Qa7sc8Dh_LgFrlR$^yY?X0-we^n>&J^ItT#^s))&IeSDF&9{Ud~8_s3|XJsoPMo- zm5zi6WG&r{+v};hynHj~O8)ZAVf7o{z(gsfwD}^ufA?UD*za`mfHIDPQEoeo&}Uxi zLR_pl3Xt&NbZfxJ#t0#O+CXkMt`*fTubL=)>qm~9(lE;|=P}}Xt3sndU%9?u{^aQtg{Lpn9UK)34~u@zsy+L!kYV zw@P%rz~ohAWj4KIlpN!U&$8AP9W0lP9DbZFr^{sQszL(_TD^?S;m4tBwEfN5?26$P zdv6y=uAE5iPB~RG4b$imMrA-gB_jESK15C`-b|4$<47{J6P)N+SOb34j_&HCAPSB? z@8;m{BKmg@$sYIz0L(jBFR0(IdrR=dDS&sxc7$W66=Lur%ivZ!G$*a&_cjnrM3{c{ zm?T-6FnZRW0FSsnM7qaP=#^qBwsXtKe6DLPaRu2Z5oQ*@c%$EuSme=){hYSqCEVGj zA4m4fUDaz&j5hwGwhdE@{ilO47#Se<;IY@8rf_!U2#KP~=u8fzLVmM?3LT5Nu`4V# zmh&8kkA9M{(U-(fp&00sHlzUCeDg0R-Wt#%HW{Eot~dF1Y&7a44L?g^Ct9@1P#*Rv zz(5v(r=z0$xJHwQf|9>K)1?>YMw=R}n*Osw{!XuNhAze(!kNlF+Mij?ISzN*6ivj8 zp(^up!oxE&3Jo)?1|+m!4E`xzd)rZ6g<%;t2>()`8R{W|5i0GuAsYy>2~D;L=BGzy z2rS}}eig<^LfBQEpgj)6yZuA8KcD`sPk$?ev%HkpSwM0k2SfJvyvJAAy|}-?cTy;X?HsuQ6fyh8Pr#LIiObMdjtscEkYOnwpBzvnkkej20a_?WRVg-~=md38B!`+f^ZQGPJJ_JQynv_plsJb={edO@ zSPMX4Ah5>UUe?&1nYSd~wF2kdbJS_|n|a044z+q+&(rvIVj21cmwlIMClbP7EILS` z5tpIhVgZeerMXC<8hJ+#Z@srkSrJ+AVT(878NOI6htS^NnwQd-u9UzpF8^|L_b84` zL1j((`!pd8G6pSCr6I`EMe)+tLyT~Jv^5ACb+ZjF6S`^SImI_0(v+8b18Z6rh%xs^|aMjDH+4L_f-?5vNCC3MV~e1yE=6a61Sgw3a8E!5X>KiaG8I5R{l!)Ke@N^hac4tv1 zlbm>>KpB)~>yiF4RfZu%b#nOKzS%WA-V6Ohyos|r|0wXmK8#z$kq{hVV`lO47d)Tn z@FrE!_M?V$_zeXXK}f>GXd{op^8}8lS%Me?Wsv#dWA$RezsK}D6jUW5s^|naR5Rrb z`tB6=@Hg8dWYlG6g=BPwCl+0aGU*iExGvOzGerRizfZ8*{z1IZ_poqsG?-}~$3?-# zkJ&&``>P+m8Qu@-3HSEy0~F#NZ2bXnFQ~C6WwLGY0t&_MA`_(q&TO)`4F>$zOR6ZH zL@}~zJ`_p;8&D6_4LdM(m!XtZ6ug=E6oC9+oH+eEqT=3ZLmdgh83FJUgoh}(@?M?* z#h(>N957h`D){#Uqz^@dA&Sy12Y4Dk;Ul$}l)=LcJUU_=b2dn7203zIKtwrzM&`R- zCP`Hh5bqRWPK?Wg#Y9e%2`|gjASg#z#H7VL9LLRQR%0o+*n%G@mI+5MeywV18nL@a zG>QFI#9qrXnp)U|6Txk7M#yQh0e1>Ju6;gQKO5usXt zN}u*qgWF+c(8p9_vf8AoT>k00nn(>JH=PWufo{~V@j~?x=N%Sfry?gT{GDv$Z_SSi zUVbz5ogY2>)&~r-Qwa~nkpZfVat;qx%$~Dxb3L<#g_Ts2L^gq|W#gC+#(sw=1Mgs^ z+#CUeNuNd6uv<;y*6xhplHV#awwBG#65rS)2%gWBi6)ukBE7X)d)@fL)}7$=bBLZZ zELHU*W!$&6R>cW7)AI!EOgV~567|qAuZ9a=k(ZUC*9CiC3@4j*!XwmQ>@Un`OW(P2 zd?ofCuH>B7Irc8E%9bl(xAL@XqCbzK{YWi z#LP1let=4}w zt8TTAv@MjInmZ;l+@sU@S)fC|Dmb7$kULXkm{cIBPPqWJdOv6fcq^R#mc2>i$POvbou`0sQI>B=HB&+)r%l3%&4*cqr!Ys?{g8C- zy)IjHtoysSrdpTh$C6T#2@Vbd^GNG-gB5dsyR+$TX^8LhnyzfONq5`50%UtCgq}R; z_=PN4H+1wrGGQ8U7|pRrmf}+Nx}r(H$v29rvWqB`?UIcaStYqlZ1Eqxhd#sqrAleB z{f8wpe06HoWqM*lkNdn^Uw~^3N4+U%ulfy*N zhZxCptsnpUR4(~Off<)JMArI-iVBp%ER8L}4&3gb$@a1(6mh46b`l0SoOM78Gw36! z`B?Y?0?>lSd>6iwY&+0L91HMGE6o1Q2Fiy(TKLjy+~A1_c)jRJ2^m4gV3xY!PV*;V zauSU>e!WriN8ujOA#A1tag7-HQ9kq#*$I>is1DT0H6rRSl_9Z;w779>2)M(8+ny8} z^1pndpO6z%Fo#SViqlC?`9vvz3%{ND85udK*ZgiBb|K(Kp4$2JoB-wFVUrV`Y`6bL z+N3LwnnYlYBh|eo;2>cD)z2w2>ZCj&6T88DK>+n=^nGSZi2T{FLns_C6Uo@TKLm zP$XI15K-#=hPvJ)Eg7wc{xXLiJ57acoC2ST8}?z6V~)|OXttS!J#0qn&FEZO^G$+T zk9zbqy635Wv<6L*2u)-1Hqf%3M_WC8;rq;Vt3c4b`11J~o$~xj$B*nsIn`VFGJsnd zU$Nk{^mXA+1eVpsX{}!ChpkHrHobQSEn*;v7}bDPl$C0|9|+8zc$6KKy$I?KGQaXf z7xr?sJtQUg#G%;g)!lnNqIGJXg1tD)KDX~yK{bi}k1Ej+fmGE5M=Rq2+fLM{!GSTl zCTIXw>$-#-C4i!(qsa5G#q&si(T6MibQJJq7~>nML#S(X#RoL;)>dw?oG_Ve%KlM~ zJ?9#?@kt^}UzO;n@~6g=@ycvVTr5ylwyM!G`(<0-Q4#aN55;f55bKBD(;au;o?avqX#1t>HRtYV)5f!IT40Gbv+Xwx<0v?BgSpjb%G%715`lkMF% zM~~VB2~?Xp=^APZC%*|(7U;U44WKE<0jYzUn+Yc{yhi1LsSf6Jsmzp9)o9Tf<{u1o z8hbOal~nBS=JpptG@rgWE@1;!&Eb>tey(y;j#qa)DD1wy<>L%NpNX%_B>4lTLZWrn zy{5KlWL<1~KshX<;*~qDCI9iZbcOg&3J}B`h!JL3lV#1`H@};*;j6P~M}cD`qhUm< zBpan&|K@;Ii6Bjs+up%2!({rO;HTD-=De?Fg5G1&`z?Y=o}mjkoAjzNmGs=eTyio~ z%*N%eDNQJC94CE-GYxxg0zMK# zBG4mAYJsb2BA9;_44%cdaGu>NAV^d&9-uP81>n!=(9>E;X76{@RtIQp8ai!6=Rg5t z5$b);d4fKDgR1%93}9$f&&@HO&;?89Hwx?~FV$6ntko7zUAX+l9XClqaufBhJg=~{E%qb5@*(E2c5}dxdp&j>4=>8( z@{$uPV*3Aa`&(mU_Pqr+cv(6~ElALG%Q@+-J zJq6QQKh^yGAOAykS?h*^dk6o#9QU zw{eCR0jlvi>6C>h1^%GP1p`utBJZ~^Ob|t+C(%3C%Q_}ektNxb7-VTxp#@P;mzpiL zRjNtq1Fn;9-zO^oow+4fHq)&K3>1WpCABn{sW9`eS*!4bI)-M5eE&#RJW^F3zu7sH z#j!KK)j%f^9Tk(GcHKLTkmI*Q3Q%VzZYHjko$VYVvH6IcyOZgv583UfjiqgS0p4!R zlg*hTZL57qjcbk5gOXlnj{}Jjv9!A66+PME?~lEuM>C!JXaL;X-e-wcDl#TdT!neK z)RtP7pF0N+R~PBt9{i+Z#1LLS4cX=&0A_)GB~3?hzIBOHVVt6f#%-3nu_Nb&j7TF8 z+CuDo*q!crAg1QQi(lyNu|DTS^{k z`hXN@>Y{@GW_)|`qF}Uw4+Bn%Hh?D>+5h<2CC(L0UF?ksfPjbBi*K$raG~Yu*hSb} zv$$+6>XKV}`kZZq;3HLI)y@v5gx}BD5KzfF6VRZ;G*Sj{iW`*rV2RIN6B)8I;dNEt zc(v;Gq##4*btoJ$mEhw7-f&{F-X&*oAQX?jondt)$?Pl-sDp{RcW40H`5yJ?d4(fP zM~4fm(9Q1&_L!F!zQ zDyg}i{LSwuXF^R3cAx1Y)+zjCIL@#}rylO96Ks_h4r3TU1>~@WC2YE=Qid%ZzM`1Y zBiIqUO9JT0x*+nhz!uN^$n`!`H;TN(q|I~PFRx#GWOcbD;ruhx=UWD`QzdKdldWhu z4^J|2+SHmfgENHT^?XADpXp`Jx=eO3_r3`Z@FWN8mgs#jQ&)-{b&CB&os7?=Y_0|# z(5^a<`)eCmf6HD{NlR-o1ziOG5s?4fZLXmI(VE<*7QbOhyGf6s-6q$T; zBK{O21#@ZkUByRrnEIED)>O?j<_>{!AD!tRb5Z*QZYQ34!86M>I^x{?|KtV)U(? zcvQ!ZfYIHJ$L*)T5Ltg$ZcP%`=pD9rEi0%!K;wJ6AvO5AGfdXZR}-F}CoKi$X)A&Dm`MQrjX!7J{xQ5*CHX~+Gs-umrk6c6)qm1 zL7GU#C8uM~j_H1VJs=tYVuJD^%pE6njmTMCTX~K%&+9hZ>V0+08p^hn#HTYc6;Q{n zJOEuDzGtMyLlP6i{K1aW1J>&a#^W`YC-9Kq1V~6)I$7&IL?x}s($t|GRsTgK{EBL? zTZqVeUj6HT4+42}y{k$sZcz3Vl3gs$u$y&iq13YIfiZ+94Pas-A2OGgsYdYU%dG+3 zF*JRW-(4N(U<|~Pw;a6^wn_Li5kTUT`K+fRt0{%!<*I44?bAKt^S(>A41OIs6npKDzF2Uf(OHi*;pe9+ z0zgM{z4eWekC6Ll-9{`;2qc_EBha$Yx~Ba${a;AbJvdjMWM0X&K2?`E2A z+w_^O_H~H!LTBY!@W|Gu{4Qh%vKK`)$ciI0g404#Y0F&Ec8UYL>5go;D6-$j0}C=> z3PK25?v>reZ5D$7HNExwnXprR*|WGlp~cP2q5E-$l)p~5o=~IWfgvmo6PuDCpc9ooW{(eCT+Hn^hCVu18$8r2?jxV9)GJ^ zJM>Plm#dJj8=7q+K3;rk@X%JJMD&%gl2kN&}6~F3!fhHPu$mBiGDnxl*?M zwiQVLl-+l_ycCkluePE6G@Ie{Ogwzfxaq`6eI$4xOMYNOa6pqY-}802Xt}I#M!&Un zrCX(?T@fS)B{iUI7ACQ3R_Lj1s7MDC^|5H=yiUnZ|EbY;SKS8wJkS+g5Zlrf`kl9n ziK$VjOJA2v)Oy6Gl&~B9_rJgS@aeS0hg}!4SHLD}c~1Es zrU^$BZsmN0qG>&UlwV0!4io49(XjBUQ?;o%mx8g?oG;+Ts7?4+wj0mC1}%dOM&){G zn(?~ec&sfLN=Cs+UyDHn3ZcNtOXq8htI7VUoS_r+ij;M(hoD`eM6Sr<<)&@uyx);F zJ@ORJ;G9NsBKFod^xvnRC~_l&2MWTvA{_H$yF5K$k+6#I$_~S~xV8&ITW61-g}1#M z4)HB0&yNVY#$OPQxt@sg`1UPwM)Kw$NjM4eE+`cLImcIh)3|?#!&uK)l2<0gc+XT~ zRjT72^eqBM&NHF3vASz{YvQafTdHF+he9Aq8IWJDFvB9p&>#z}^j&wUA>JyBezK>I zA6F7ii&!H>16o-|D z8H-bZ%awom+TL8B<8T#FGh7&%i?kd$X#sNuYg<|3j6jeI`88t;EI6tveL74~VHCn| z+v$j9{GM?lK(Ejj))9~!jBoe?_FXl(E;kHH=$5T@L{q0#I;OF=!N?;1REzBF1V~z* z<(b#nbJR+D2?xrf=-KR1{Moy%2=a0=u-_t%(@SYp_Z8GmJN%T)q!|j?TPF-MOxHA*duk~{&jSuURRdCkDPKA#*SE=eUq_0!Bgg&F< z3}dVHoTTPBD+~B*Lt|q@yHqBUu=0)b*G*It{0yzghuRkBMJACePLI3+(?c%dfW`a@EHZ+0v%Wv%(%dyXsOleZ9W~islKR*#*3ZVz9mo;Gs$Ftq z^R#;%AvJZRooJIf@VGQ!=>2z>9eodkT-wU*8fYU1+9*bn#Ub6=dRw-*q+Fh5bVvKni2N8u@5Tui?T(y_5i#21 z#cH6+n@~)jS`%9xzu_DIsxTSPc3n#5%|P3<8X<)JbVPQk(Td*lGcDo0Fg7A7{wZBfP5}=pN1;ZQ(C((7WLUNcjt>Pk0f7Mh6q-tW)uefij8aI2;4W;mY%1bWcfqM5Co)k$w@HQM zg}kxx1!(H|%47!r{0MW0Jys5h^VbKxqF|Exr-`kYu|yJCsR>{0neu2IP$Xm1goWi5 zhQ=OF%I$>iXqvUOHB26y3M2gGs-M=}Fo`m`ecL27^NN#`y;$azD8S3^mcXqwZee4z z&JB#6A(p`aj2bJkfR*^UCh-%9sc*wSYdU?GA!Pr|8jvoUC9qy28)gV8W$0MLtWy6+ zx(GxTPR3i`xFjxMAO+;qgY!Ui#k!s8vhT18W*-pCt^P9V445)5$7Rw#O`oi_Bgrz_(NDU6 zIz+WJ$eczTSK44@D?u05s@0mg!&!o(*>9q0ChN)GG}eYoP=Ji{aKpk)SdN#z=CJUhn>yd2wWO20DYl}`F3Ra7 zyQiUXS`MzZXgITUYCh#3AP4_ZOEKPo%hi&jqVP_yZn2BZ9AAAv9l4hJ@m9b;E4Z5k z>2&O6V9=qGW|^MTl%CTGtFbb-K2beAsgbeSvMF^flo_uv3kC9icy+>H)@eYm4U9xe zwKN3{%CUTtw%&Vjv^FODXL^oeR?G16*YB%Fq%u0Z66);g^GveekmmJ<0_SiT6Eo&Z z(W@X6I1ul~`YgVj`=(!Q!j}~i##-7@&r_Xada};aSExdo%=CEPcjl#R0levcctWc4 zGJSb{Cqft60?lA|u>SnN$o;5$(R&U93UwD~hLA>`=?c5c@f7}7p9fc9rfni}4FV#3 zZstOj%h>|2jo2;AERS+KCUXfgsFk;bdN0iB?}!Sr(epz>ax39#m-%Yl`DMhIW6$`3 z!@(V%`^C%9j`5o2qCXdx7Po~83|q~^6zU>G^Y-r$^+nOX^69fsCqP#(dIOtQ$EHdG zQa~~;8HU)%nCkcjgfv@wApN8yZ#y!69zn-kRp|Ooy$dLgHT&wH#bH?^dsSb{Wom`5 z=t}Tkk@ApC1RBdINQ{j!yRQ+)`uf}YgR?h9=G$Y;%bLJ);4*b%CxdEkL^V%4 z9QH%a$&y{;+%WWAgP!*+*0kCTY%i?Bo?$UDW0StzTb;v(l*yd^6vN*)rZ`vHGT9Py z(PZqS79mOITl>~5#i21D=4lI>V?F$z-zxV2sI8mfxBvyO8-9w@429={ljd=^hx2KLOFk zR=i1ot(lykqQ?~trFNI3GI%IaZoG@=0r#%SUAKi9q4lInL%qo|zqyASJ33xCudO>> zr7ydNBfVpxg&#a<4qh^Osw}qFeiIRvjsq3|t?=bDv%;C|_-4N*t$r`<7=#UEvY6F+`yTuk#;j{|r~oyzJ=M0aO23`LjE`JU4yy`;3#{3v zv#qZsk%Ht!ynr0*@*}LBFq#}9WZz-rG?U445nJ)o!>^smf$D8v=KiVvT{tW2-`_x8 zEEt5>-1g;`>yqS)MHJ9AKgaF@lgsV(&9l*-7`nzV>6o8OI6lofpTxXnV)vk^`AvgZ zwW2V^me(qKxbesR?dB=(bhOT+`05==v-t0jcV@G(ILOKA_S_iT*`@ujlr8gg#Gn-E z@eNCrxWAI1_vO-Uq0 zcE(NmU2+td6(LDHTC%~Sdpx_Q6g}r=Pu4psALvcuzt1(VENnl+u67-Bzern~??2Cl zbjli}H0jznd#P08?W%r$J4ko$5elU=CuqrwUE0hKpGPe@OA;Me&Ogx-6((0-(0woS zK|ilZDr(x#23_>jRiT*>nKIxm(ea%k)22Q2F_@?nj{*TaIs(;KSnGzBZ5> zh??1hKZ@oeg{iW+=uYyQ4*nijRbg!G^xeJyUcf4ihhzwf%QVtGZ{ZZ+OTj4h7%7Hd zFExVGLyPl9|3DpIkSJ@puoC(*PB-aRfA2(}b)A+eB+>KL=iJQ|nD~y*=c0$9XIZB_ zeJDQkX%N#Hv;@!!{?GVP#Qz>Y`i1lVj314lfdFCDk7jxEL7knFBp?%r-bPxwI2m^5 zZWsO>1EK0_SRx z*?45_F=lHV_AOz3Vm416KR37&*%N{OW?hfof9j&k0TO=wxUqouyPhK$`pNeUdhTAx z+?zg%i>|shWc+9vHee=WWqg}8j_QTPsBRO}EMvZtu~>N6?ZK!Whw2p?A37*-&)BmRHZiQ*6tiS7_@%ltL08n{ z?rQzPyHZFqK(MH|(EMZrVV5rUlk|GBz}6CXD;qi_DtpGYr=aqQ)@9V&QKQEN-poSPKHDwl9aR}h$&d_zt|bk5zS zajp&mJs>**{>lHOB0ms(A>bhuR z^txtt)-mn7*oo0u2H4#^wgj+ml3>y2sQIRyol`A1e|665h+|icSy6e~KppH#KRl?) z#i{qaMuBaiWT)vB(vfn1`4*Rp%RgyBIOujkUg@vmh~m|z1xTOAt=z|jf%In));@RN zx16632yQ$=-&!c2a5Pj(N3};QQSk{~Qva;wP}f+|vJ|XYtAC+~w&ZKCF9m@?@ig8W zmkf(VlkOPA_l~FgxM3{IvWuR5Nj3OfO%sy#Q9XcW@le+L#clqu|2bvPP3oe@3Rd|m`hOC$*?Lf zk=OB6%D`O9RA|$!|8GhX1YSucP#?L79of<`_~@(jmg@3+s{X2NUBwu@4r*4v1?A|G zNOqg3jyA3w`ceNC5z(&`ZL0^O*W zkI$*#jidy&g`lNs)+}=it1MIL9aX*3W`RbBsBymmXU(LAyD4Ndv3@x)Ymk{lIyoIL zE}~~#A~ncqa^2Oma-!GknuiI?D?9Wwi~jG)I34?^dJ^zckIegMZu_EJnfD#UvNbre z#s2t->b-u=3ghKSLl92V=A{xC8X1 z=OyUi)4TNd&U6e_cHnCCMZl#a(J=+M_mZfmekk@X{o2LR9B1F~8NO$UC8(A6Z)T!W z4u8k=SHV;l8cpGEzmAA69E09IiH^w_uAC%#Y<3Y7)Jo0jnvW1wp%aa9Iq4V|BLmS0 zK`iFK3h)n7`ixu4FMVIm6-9I?MCfY_jFyWD|BcX0`-j%vnPXXmu&8j%cv_3K-OyRK z&4||BR+n;?3E@PiFY8+pQY?*!6xZh=y8C9)eSJitAf9c85BzkCAF5 zK9)ntf727V-Y;NdfPjXfYl>_fo-%oKPZ2pcOZ|y7oa78GdQaNi|WXjw{GeB8@b5 zXTS|c_J}8q(c7ad&Iz@bR1S1!_t_T9@}$=A{+RX+71vQYO*;CUeoUP_@}^r*2t76+;4#jx=T?9wD^D zp{XOvp@H@~0a)J&lhbB$*qCiu&xnqngYk*%$FhHavtJce`lp>IDMVC)BKJfoG5`v( zjPRRxr*Wv9^qgZcZvMU+6yiFXAnVc#GqHnF6y z+4y}Wup{$s!DCu3#xdb(lx2LIsavJiD7PcA4AgzOA7_9sM-_ui6r{%xiv2woD0;%5 zWIa1tU5GDn`dpAv)wt272h${q)X)J<%lW>d30Go`pkf*XpEpjdwcZF=$E8QP=8hpgw!xBo0b5Q#~PDjt5cu^BQ;!2ZNe>8ze zU#tJbK$V85hpG?rxo(xH`;1ped%e=sK-Uj*W~Do!c1(SG2B%OftpuuRl(3+}PLJNU zPCwDmCA9lCnPnikuG~#nD^*(^m2~3z>Xw(qRaIYQgLR!ev^%E^qG2UKGB-Oi`Z1x{ z{?nDzeP4l;;jss8YcZUYerGb#Y*>hmG%e%l!wG-4&A{1f1Jy-u*3$aEeR;<3A6)A@ zo-x;z3m5;DaB2taTS?)aiO=zL^CK`lq!uPLy*=W|-(QlNH>abQB`E5&O!xjE6tmvu z7xnBHta*5sXZxeSkEP~Rv~>ojwOfE4M3advHz9%{7@F(`$SYkzQQiKpssN-~(rx(o)YZZzdYkykHdeCHw zG~Rt*o9-ymLa7w1(JIoAH|cdy+E^yT08eil5S5;)RnNLg&vNZ4v6ya&fo!#zhDAmM zj@`=q%YOA?^4sS(+n$TXO07btd>&yEF=mOPxl-d;Ue-`tzu{E?-Y;vgco?v=*gCet zm{j`|(lsdf#*4mS=J|S^cOzwBwE^u7ctShA6seiNKCrwnEL6LU$5sGPbkYxOr1 z4}PKu1PJ|jO=UUqpx>ZE2f&0|En3qxsTl@>x3TJMA{6YR zVX!NJTOqei43la(R`jlsqsPQo9e*Vn>Q+rPzLN)&7`*tcK$t%n%IV|2bb{iE zzDrG503L6@iGU}{PG6np&x%%1Es-_1l$ogh1?g8C^aTw`7N-kl*8+QpCOnp15*s_d z)?GGo>Q7c-*oa%ZG4gn3&&h3o8rKVOAO|9{X%Y^7UlwdVOLQj^9_Fy1-2<(W^AhlK}x z64b`p-$#|Si_Zz#@#I1B_yv>ttTS}JR9HU3*s5m7=5cTZ`zoR#7N)zmTEI4|%hq5-p`{WRzZob3V_l+3kjm<+fkF!yX0|BzDy8JG$B$xv!dLWuU1t0 zZShS_vB!f!aFvh#5dnL1i~8!#jeT^A(m{~5FTjE*bxg2tx5iq^JSueEsyHsMo@_Ez zd%d})-Q)dY-ClQ9V$eN!VN9`(&5Tnx9xtQ5XrfMe=Wp-s);jotuECqAssa_=m|qNKytAw}50G$QRH{&o@*70>@m1 zW)8j^z4YW06=<_dy}%e$r&3f4x4+RVC(`_@CFDm2?nJ^UH!E&KA5_)n%opINOBR@* zGqr6pl^)HKB6#6xm}5|dne$yz1Ien+bqqZ-@ML-;kyusOTIBdj#D>)$C!=*qQb2JU zeg)O*3ovr@B${Jk%sb9>$GykcgSu-BH9E#S;;Dm8>sV9;9c=wM#nvmMXRO++6yuR2 zm}&G&ri-($`HhL9jeF0coGqY3HMA+U8najI**H*u9$=~ZAT#a~{;A>Zp;^+pARh{X zysz%@mdVZUz;3Y;AYQd2$0nt?QIkr<9$VopQNJWtOY=Mqa8#q; zO^5P%-Boo`G=Hf4NV|<%_;ZzVW(u#DCg4m+B~|5e`DiWlqD~&L#Cj z(b^b@1-{VTR=m7qI9x7_kuI#S(g{}_b=2*6Q$D?&Dn!;?Hn0X4g0Io>eM?$2(I%j12>P86 zQlqUXvcC>pBKmZgrD0Xyg?ccd^Bdh$>Q_EWbab}A?EEN~elNj*C{uZ+04Q*z?`5zC zVj+dr(vuaum+r~>3@97l>Uzo0f8`~>m={j{)THYrsq{&?r6Re1H3(hhuB=sXczwgR z#kUa+$;nw9GB*)__uxYfhw2Fws0!hzUQdD-=U32?5gkV5p%^{a)BTQAqWbS<{tPoU z=@k{AN8u2FWEY&(WkSLK?iN`WZ9$#E$&xC*Yt%1Y$q=0~iWH#{XRpdda5JHOg}eoT z+CWx`o7eOXC3G@)Pt2(NNunZ8oI%B& zBGA-NdqW*vG~T`Hi>ARF@8zY;(mc7i1d>mq#1mX-`X8)^LfOeeNWrI}QRRg8!iBI2* zY(5j(7FLF17B4H_iq$Syx|mH7OQg%Hf80-3a7*d)+{fJ0O3?a@PeI%51RlbS^3;`b z-|k3P$c{v{`TqP^tR5qYxYCE>P+j8uXD?HcxE@*L{0{N#SM528(&w=syam{ZZLRpY zG1`~p4h!N`hQdSj``hh?W>)bD9) zY03ni^YLZo-{#wnfZ+&y#rJcKnKlau2NYl~xD0t-QcDXzpZca{snv8I1I~~+tN!;l zWsZtoQB7I|3CfR%80`6j#)l_^1rg>pEi+x(lskM|KMwCmS~bN`o#)L;s8Z{R2H8v7 zOUC{I?+WH%?$LgqF{v0U&g2T#DcQRKCZ*PARAo_}UfyChqBh}OiuUTrGkX2FDZNBE zdALdUJ(oFe>;TzU$A)^ib(@IQt}FBulw|$C>%1y+h(HZIaqu~T1GkK)oQcnBYj9tk z<{dQweRFu{qxKmgtr;E^1)ellUW$Po*)=v^=>}M>#Lg*O9uu`;EaJ9lqLe>$k139I|jSRDb*}+xf6;-upNriC`*j!mj^2#nvFX&koBP zx_p(os0-E;ACS?T2j#fSy7^4tCAzWCz9MDRJf)4@_J+99VT5TA5TfS;UU|d3)spIQ zdXJNHQPJqa@5zQ{* zCOq-k$h3J}-RZMS%(xF{Qqi1)R_P^z)z=N{WCVU>CHq)cL~Y5W$>0)mCYdgFm3al* z=>#5B?^8f3Stu&n61k(Nz3nR7VP9Z98LdivPbti|B)3+>LTc#X`xBOSw^Peb3UAv) zJg{&T6Q5WKkf{7Y<$6~a;M?AH(`58>jb->j+TM1^DibYw=`pTjk}~%z!GK>}|92AO zu1xmKkPM=_>2jjwv#(}dPtj{nR#Bq_U`Ig>%8%b^KHX6~a;M*@^_}ZWyJd@1qK|}l zV>XX0Bkx}+quRxX`CC1jao9P!ZyH=oDU@xaoga@<5(Zuyj5r1Af74c<=- z>(f<}=}Bsou46Td?$53u?b@LK{0=h-z`J3z#RO)SAwVqB2~17DAu#x$KSUd{hm3HM zO#UBUC8!NJEK^0goLvgaql9yw!Al<|?}Sj`A6~&-QEVfni(l(9ko+}=Q^y4@J#l`x zmX@THuG>)&LGpX_@Kf9ICzJ4s&i9io7HoU4Y=$Hc)l+U811K4+i0d30RaMeaY<4mh zah2pqOWd{Gm@+p#AFSZLEn}1|o%i6?Ai^^)=}M5^75i$o9%p7>r_l( z@-wWmEL#4tYIVxs={;Fbk&W$t&^V(&wRrRMS~z37?i@{BTdVrKpF$2cm8eB9ux!yu zV=l#ln*u=))OqD*G205hnc*t6!uobbT(X#J(Zqxm(eqW8T+w0yHU(D&_tRV@H1jj~ zd5$hkFhPhheX3%5mp={eI;*QpxqijGk%}TM^Z2yB+!iWE$GAN`J}K!lQM}+Z=ytuY zp{0MOu%J5j;y!St`RA)kN5mgN=V{ku+@&7%PFC0!8ADnna_7?}1@-LRur3{HMY$ck z2LY0wX!#R_UWT4&ftyO=E+V_ z2o7Q85-Z&TXW6#;=ltv+eJ(x``_1_}<#8y4duP&m$WPwkkhL9IX*XJxjM9LGNm0MQ z(A4~+nrqF@GdNyP)|VNRXCxvDq%}{Bj4@HfnP`&>&=pWFQe-an&}X```{Y-+f^wdi zT%C5*q;*U=ck@D(yHZ%y-c;5>6g7znsEkjqAt=O!XwwFIKGnpD>pq-36RjMyTEc-P z$p~7R%yeDqY;8fod73JVfoiHF*C+$$OSKnA!qTbxx}}nb4sJnHKYuyPRPp*x77JuP zFz6YtQF~u9zo2lPw)62XwYNGnrI&73=?Ns@F3;3*4m3o z+eWHcWCo!8QFLkZog1ft z%jG4sa}F)QH@dEOSf>V#?_u-9E3)?LGz$9x`g>Eg313mgnYZ?Dk)d}K z4V~Vh8IL6nFwLU=u6ezt_2Z(bHQ9;B_+BAi+pxg5OmesVURidt>*t*A z=51sg*^bY1ft|vCh34gN1hfc^4`UwM%4E8j0h|;_Fws45%WVtrvO{=E?)bD;xxxT<8{R_Ozz*`ygMRm{yZ~EQknZ@Xc{-% zpo-O@qpCxO;wxm#=P3BuEV(KxtfmhT*+>>PR;#UErlQgr{%AxR#g02D(>UpqQioU2 zS=OPiV2zwQTMYOIBTjY*AN9=sq3dl<(WizNtGA+bZCrg-Dx~*JhYDqp{m|Bp0nisX zC5s^kPUP2^E6=LdzxaA}IjM7@O^hU}J^ts*Z;4B1{$EThz6*Jb+yUk!`d&iE4?6M? zOR_r>K#HKcWbqSwxzo#sPb~urh4Vl>=euh~F}48!_Ms>nXXg52!i-kvrZt$*BLiq+ z8F$ZGUYH4_Ye*=S7CvdmnQsfWa&reLRlogJNvYH}L&*69H|8ox5a7zJ0VMUz8a<#p zdItPmOOkc&IO*PkDLm0Wx@=~tve>3KINdYHydMA4m8Vu*SfxWmE3yycLd{##z+pjc6mKPDIAG%vbVU?uEf9<_-Pc4U z9A0jO$xg$hrHJKD7Qc5=7Va6lR{329{Mdk(4^5gTD%PEOIvpSD`&ftiSebu@=7q& z*$ZxautDK;9GjOL?`e-c0q^FtWNkfB1ZkaXUgfafVGW9S!&IQPZD|+M^AqYw&YE$3 zfyCI{flCciiyVW zyjt`2P3qebL$Cea+#f~%gnw`t0ILqJ`cQ(uO!T|s?J9&?8X)fyj5`cWjey|LTZa~f z=%c4+`J^#yU6P3Shb~EyV4lgqH0>9Me%=~l=!;z2O<9uI5|K>hL0cd4!_au5Jp*A-`1 z1iW9!N=N+YO(<1tP*=stx4>n>pmOv01c^DXX~CQ(X`5ZqUSTNkTsJA^XjQS^;2*Y4 zFt4_;z(Y`8kdyL4i8{dn3xCkMW~SbaAaEk#!NPHJJ5>1a>BHb9kR3asDj3E3EXZ0d35XR`+3ye~`_j zs@YK#OS{sm$&*ZW@ESjavO2oZ3yp3KL|!PykfqqGFTKpT$F%BV)Vh(^gOYHPe;2XE z@GXmP8?n2{KdoRLvFx<9%kYkk^vj;GSzfZ*gWspj6PqBXkAzHGL;05?h;dO z-k0aaqw}feya)gV^C+Cn;o(W4bn4X z>v(!z{VETOtII_M<+;;?GjBkO0&a|mCl!ZR4jYLOSQ3lHSn_6aLlGU6hG~poTVf_( z*NtT8sKMdkPh3YpM~Dy`EhQhGgnaJ{occO1kTZ)Fuf;fob&_M5~ymK=6aS(qGuoMlHxyxn@i z2%qSJQ56SZaBjbBqqn}OtGX=WpQT0eg(UFg+y46fiA(U}&9B?8S7S}Cjl6^U)(I^- zBf+l_k%eyC#w(KgpnJPtnR^1!_nhX+WVOaS=L^&e@)-5q`6rsa%MXG1SoHNvv~Z9b zS#JEEEZ+<#SK%5rE{tDS0eIS-lmqixuFL#-DsGJ2vFX#Q$~i#+K)%>9p!R4qzn8A# zKT6NC%2tYg&n`<&8jyW6|5_uD>s}+`k1L4b3xAqKg!l*4Bt%ZXJ{K9dQVcxos3vE4 zS4C>CRGsEieblWtdwQo_2c=X^PKb@2u*^>|yNKT1zDc~r*B*P^lh3gM%e=;uvEgR0 z7S#GVChK>=FC%f*uBU;x(hp@(TjqBHVhp!czM>J+F zrfTI6zEIw0URt*FyS;@qcKGpUy5R(}qW3GG>dg-nX%A0>={^c@OH#?5)~X6hk}F%i z_HE98Z{I*RYOI0^p3v_{iqN2`!O^5dA1~`Y#v7?(CpkmUdwD{L&K6~KkXa4uwePcq zQikecmpXqIIT#yvDj91deWGvEvsTCAi&a1O++e8C0=icK+?f{@>Vp)gE|u!Nsj`1) z@$NMrLh$}kMBbi>cjeZxta@UF+nv#pN+;*9&SU3GEK*2rv|Jgt25T5#2iI+pwn@#s z)%L&0d+(?ww{~CDwOon_i1ZFNK)N(30{JX})JX3{L_k1#3xZ^+^cJN{%R&gDN2J#X zNkF>NivkG((j=jTK#J#Gd*3nc829Y&o^PLh?zwl2`xgubf#jWYKJzKR;;4%h@HQ|W zkIl$(%rJ}L%UFMlx!{>+x^;QDKGNLx&+47PyloEe&p31(V1 z7!CEcssupS7$j^C@T!oC(p5DFkimYWe3~t$<>G<~S#^1D;|sXrlEuZ2X{Pwre0+gB z$C|bCrUt;SRPQQVGm0-D_(~>=IAD}VqBYjCs=iY{^(yYT1$B-X)>aa|`z(FS+$}SG zhVpCb=9xd1mCCD;chcE#F=DlewPyrPbP3r8sx`GkJIaxYDoy7tDp8GSI~I7HR-4JJ z$3d36Ii#|iAJ|+Iz~<77HVfd*php*A1u}kzn3BO*Nb*gAi>F?U6-0S0?-<^dzV%vO zyK~s(+^K}5vSaN|u796}SkkQP?Tw^2glyBm-E8}yzk&hkf%Hp3s)6MS;4rQ0!j8Q% z_G45SvRG{bNZS9b6*VoIDRdek10J4BOx7WSlZ?N-p4yh4MpwF)ODK$mu0n-NZuhA_ zug6Cc!R*w4+uWubt2n9YM-PTGOuzht=u@S`fopo4_5MZ){|v^7FW$m#bH%vUF~_On zHpT9lpeM{2{l|wB%OY_Z+**^nkb3-(is+t=*I-epaO?J27M78lZSEt<$sLxNsS?V^ zd^B6&#Tz?5eov=Tc4E5waXFapI(0q?lI(?30ZgvMqzy_wu?hCv)J( z9XL>VjPF}FvQR*R!?nHZwyBkXPp;5HN%DvrtG;41zk~kt5GjnfJLJTZI7}q|tgx)e zDy0*t2{^~2l(26QytvGC7>ElB#|ft`qU(Iyrw;p&)jlUk`dCm@g^$Kjut`W{WS9c^`su{6MdHkUq<-t5))=Se zz|DMLm9hylpZsU#O{Vm}7zv=|ZXiL&g4my6*kQgH4rnIP_RTw|xs7KM_%T-9>?QcS ziH8>*7kXBni`aKh)J8if6tza=;-=f1a=Jp;-nAX8ol%iOJoUCv5k)fivq6f&;J zP-e1cdd)sUI{X`JuS%$O@noT-na0n-LhfW{1PQV6BK1?CpmPGQ@WL%!tlMQ1&RC*p z+jwQ6L9CWcuTY%`k7JxppLI!u{Bs?Bd5`-&Q9hc(_tsq@^^X5O1w=nbVI#xHM;2e| zBvU&!v~zno)3`VJw^>dq%f|I2Hrt)z3FZf@yvT$ID4r!k2k;)`e2Bm1@c9(L z1S1g)^biaWMmUk+7uiqxYR#2v;|sGF#W5T~rq#E9osvh!57Y~W1MB4)#3b)6^#@Qj z!4wyg|C`7Fl5~%r9`y^cZ~y8flW*hH4CbJw$-EWIQ2ShvQyMBYHG^%K(tAW;L3tvoBJ zodPmP_vL6`GKlhOu55adpA?g>c|TRpx{-p5pCJ#J;sk}^nGL$=j##Cal zR8Tdr;v4N)~cHH(3qiO&uA^gV@LGT)=Z^kog6oTB@t~mH}T*& zxXXR{Z!dB{-hp!#GV9J{lcU{XesZ)eAg$x4E$HD?x$^!qb#DkD9$x`ruM{0Vk8{xJ zi5@+5npCBlu#QFNBM|%6iGK^y5$omaMOY&ZTe=Q}kl!Ai@t7N4O)8cCv)`yid-5-& zL1%Fb`VPt5Z|SIU)!c7j5Y^-(12dtT9TcsAIo==3JXBk)IGM3LFW?M4G4#)I&cRJli-wCmLd-c}vk@ zv`D~PTJz5MDy4dtDi5dg`1DTf1jme@`1R(cR-S=l5vc+*!O;u0pa!RCy$pL~_@zIJ z+~!duughe|mDr(5No6~XT*+Fry!m;#>D`N&uDRPypHK2JMwrtT6BKxQg<0_ab;|+G zoLa-$tVo&f<5`cFj4I}$#v83NsF^D$x~LXS18Qa3{ej9#+Uf^P_BtOt3hr&@>;2Z#+=Fg=tAo)2c{h!VGyN0sW?2S)j;e+0+Q-@c zhLPs*$-u#P##}gTL9xW}%#IiBY0PI>Gdz_@4(MAFc;4P`64@W8!}b?e@y)W*S*Nd} zBLWEroQ=+zVVd)~`D^HiDk|XIx!lq{^;5x5ez}El_xh*3?TlBYFG`1G78V}Ks_W>7 zH;2hOJn0_Myl$1^*T>qXLBC2=N-p#wrhAL_CpRehnp{|C6lFbJk-rJf?hRN>=VTeP zpc(zBdPG)N7M%Z*dfARgJ9OiYgw)LYn9vxYSJwmd<(|UgLGO=t#E6_Jz|&Jx5~C(y z9b0-K+|&z;{e-o*1csBdnY#lS^fIj4>1}PN5fRR6uUH_4j^8aUemwcT-6_eB`<9k_ zB=XgoW`iW&tIb14oV#4S$lhJ%k!ZbY<@xB>NLLPN<81E`*P5qomLDQA!of$N(%qys z&N$J4G@|R3UH}bt;c9~N+&!7cjW?jFjyPidv8`<3I#>)oR8e)l_-s{ScBHjcwz{xo zN>&L2DB5xQpn4Dk=vvL^0u>@6c8N}_-bYj8kJlMzRzXw{z%v+@rUcNr5}=t!aLTrp%ykD zIDCUR-i2`>50n@6eWM}+#Ckuyc5%MP@5M+t4PfQ@IXNuwW1Ml=&jqjiFN9X!DJ*o( za!LvESLjoyc9AY&`jc(F6UHIUp2?H|8RsWJ;-dk_+W@dls)Oie$5=}es{(_R1bHgSK8cK)aA<$gPo z`0uP+NzhWJ(e@JaV|C1ZhSxun%;$zJw@K{1!KA<_vUEU{a4LW>$k+$y72orF0E?Bc z5N6rb-QAs~Au{DSGl0D#%wF$56p>I$H; zR`Zz|S$*J6?fft7@_+R_oc;--O2O%fvF##2kG8ZIc4B$BOg5xv&S4lYZ0T=K#{LP- zo_-AolEI+Wt1zIX+P0yB0lmp3Y&LEEH(+7ZUje46tr&(;6%4@Un@Ak%el-Lv2bf~O z0}%g%o`S9i74-g7c=&1B60ik;06eIQ@kG;VU?-SvS-bsR5#TRdy#00RYc8|;eFE*b z17Hti@_fV`g}}Dlanh%OHZTAw%!;7W0BglK%t_9?o#83qHAV@5LR~b3`PK`50F1sf z6$)XqE5OeVJxrMb)kmfD+c>o3p-pWS)@^~E#!$YR4PU!9(aU;BJm zop@2dnm`$r$jDI$4_W*)8u)do%1#=~T+%M0eTdhi|SUfdE0)%7@TPXeb>r@L0 zzm$OC>SSBS@IkL&dzLN;^l0Qqq)3k|Dk<&?;O2j}EBPS|JKAHN1jC@qb8^?-*#mGa z8FUB1G#w#5{}!9JZ$pK`ot^ zPOJj^6U4_1@{{^AE<u8QPFKUGE+3SL| z70+V~^*Wr+Z%E+Wc}r7k^1=+#T&B8O-nPJU*N5K(%(ZE3FLn5@eoOTi`t(-M ze$Z)7!=GZORtlbX**$2u9S96D9i#z<}hTq<}!VOR383}Ud_A` z!7u{tO9F9WpSI7u24U90ncg6#hQu2f$r3^1?F4DjZZ zn@R4Lg#G$@0!W<^cfrZe*O>P0DNKV(SRSL_u9>+y1eyjPX3~6>a4TIH3Wx%l>P9Eo z!#sfWtw|N^Hx?5E^ESyPe9y(j1lUbTB>V?EljR_YbehQlXotiBGOh&9J{Z*(LItvK zf)8DT+;6!MO66gae#%6DZ z&g;%(1=fQ73@HIfmH9A)zd(eiz`JxHU%?WND4cXz1ogIF4`qoRio(I>fszbC`Vj3w zLCZ0@(DjU0H0=f0Ld+M+Bu(QDs2c0+#(cjb=LTx%Mr{X<<7nVohI>Iyt*mn)!nVYh z=IZb7MOw&pLXXj(o@l{vVuYH8MA(edVG7Mqr!@09nBmI&MA4i1EziBX;SjzvJTV{4 zFr15$aATvn!hG7aq^WZdADHrgunPalV&i|^jr(5?6Fxs6dm_N@-j+lCI_-)~7&Y?Kc7eFZzX^F{4o%IKCat`gy!Iw% zPkD}Mmh;VBRa9N3@2Cv5<69k3qHkT*;mhGNV-S`N}B2D}OxjuEbgH}p^T zGVaRd>Q(lu4I^WRzSm456eU~neP)u^Tb7r2^u(bB1Zf;tG+L32>}o=!FvX#0SCUuK zj{Hx;q=G`zF2|;wuzB^Fro%Shs84QPP5GKXA9^NxSOC577kcpmJSIZ%B`JR`lqQv$ zcS&C(e$%eEdKL5x-`W&<=%l)`|20^@oM4?Xwnvw4L(|C0s-@Hi8Td8Lj)sZ4474HI*G+#0gbhEFW?Y_ z!VZQ&qnzbH?v$+qoQg;6{l8AxDuW8<88?{X|3O~Hc@W3|D(-%OU-&m^_!Z>j&mT7Q zDI91|Zxpuel?Ff`lM`q`%e(Y^7zbuMfdFS%5jcmyR80)ijBWXdQ5YWw6omc6wC9lc zr9G`a;Cy{RF_CVZ>p+iXj9%amOfNpH0QiwA@k^kzDn_W!qv@H9n&c@FZ|6W1#Y zjE<5Qkwd^}=IIVoH2U7;rN(KsEnV|@Hkz*9$c|FUONtONeQ#>lCb#q_8A4WxkqqZjOvu93(v{!`QA@t*3_eT4yU*;e|U^6!WbC1-Y&`D%Zi(%Vq*doH>JH)VxuGgrH2mX~%UX}mF?m+BL6 zhzo$=DEt+yK_Tq9?Huq7T>u0_$j6u)FXx$R#b&2*TzAhZmds1GeLgHOlfX6K9H0NT z^rN}CrP<2)In$xoqivBN>3k+8;vC5L&N~V;SpmN=Z{_!cVsmNT*i2ohMM#pK(67fI zgo-;}V^bmyH_Te$h?n;0Gptrykp^Dp!`_vXptF4vopEhdZpzlA+06&p+S%_LH>Qv> zzfP5^!){9Kl+c0hdCw<_JtvUoE={r+=<7^2YcmqC;3Ls7X73N+s>^{DN|*sftt?c8 zi4%e|YaYQgnoiv4I-!dkB)b&m6)3`hWcMdswGP^kU%b+lV*Z(~LFiK1wV!Tsngb66 zc%WwS>chK#j;>yn_hiJ~B--3=L?a^mM@* zb8!laL$1_SK=TOmo1aoiG7-e#=)FfbBTrShx0OuGt93bHnLHEMGOnZv%+ft-o$m|} zM0xnBnXyHmbtm3*h%c;MzA?4W!avg#Z0~$)KNfX9y9|v{7nG(vo@ir)^(@^L*BlKz zs4oOor|`0Qjl24vC<6zIpZQ7aqY469Q>Q()@F_s(*Rdup*m&Qu2!i>d=^_y%_;!>C zrGT0q#;K4npZjr9$O)t&?aPSWtOezqJ+03uZA-jn+;$2IBl9R1F73%-gO>sV?DCh0 zt4;Ld7{g89A0Vvj;8^P525g|Mrpdp9L<1!YrIL~ zBKlm%#q7k>N))pg7rEKsD_&yi!e=tSAO>l91a`9r!1o0dH8mTHpLC++~ z@^jSNh{QI3sUQ>_Ydf?mmD`j$Eq4JCId}tQ%X(~4QA$C2gzPPDevg#H5WijDl(8?FvtFL}80l1h0!0?(^to}2+p+9%?C z_%1tU->b8~ZMbRqS8Y{A%u$|FGU6-0fAhtY9bq%{XU8ISxk< zpZ0;A0iU;-i=G4imfCch>hF!3Vy zjm6jci{;2+xS^%C#Y4BhxMvxv&i6#d8A)(#+43j#8uV4twMT#v3M&RF8kpk?qvF{_uv{+I*U6 zxLZ<@ycD1Dcqqa4LoFmD2s=@&J{Yqd4V=qYfiYJ$!^3AVz#aVL*C|%$ot@ZVFyYs! zcqYeGbnu-v_UTWRKw{eaTE`k*{^|$u>26 z^5B>z8(260T*>mnLfHXinttox@@Vxq$}YKeNpZ+WT?owbW;HK$ZfOCrF zq`6GKxZa+M;zcR_r3eG$C}WkL4tUYbqVK;Xm2*cSPE#NKoP&6a z)&^0PhVJJk1Jxplv{1eI`Jzt~ZGK42v(iSsAn#b-sB#Or_?GvG+oRx%!4t z^;UpSQ6t7`bghNb%-j!UFae2?l zfJ+k@gX{f{>WB0Pw`Kb&-|X(SwC~YJC}UR^l$vs(DKGIh$h!i6;@nWSfk>e*mF#Bf zS_Ar8A@Vva{PP%jS@q`Twqv*;VDC_R<)fz%ijy2}R_qo`SG+1_$C}_DAHKOzON3o?Uclb+W{Qy*Z*ncCc2h0Y!awKj5L!F)=jZ+9 z`)^=9pxV^0&XdnsozBTFXXC6o4MMqm~-4wt-NlP`_qtqH-&Z=m{xwI11Rbq zuXNC{8H5FRzeII#EN-D&TT#Ja;N2iI{!p{GA)|^zb>9{qo_}U}EJjITDAsdAcQYnkjP&MJJ z&#qOB)kbsO@Q|F^U(OL>WgK8R;jVS9$~-t#t4O;L17unxa|rb+ z2ER1hK*=3vYEp-YV_3N0lN@nQvRC}~FP*9$M5wx9E19E=pK`=1RgH3TjJ%Y^@6w%$lc4q<-#}C+rlnJ{JP|lZ)CV_(%lT z_qWCTISzTtt^&WANU+~6zFBygwer#RUWB}8z_ryVT}9aKspC0D4om^lm`lHCw}S3l zn&(^z=u;3`f%W={+^3e3t@>m1Ce(_+U~+7JPJtV7jC)i28#0YH@2%q4wOS)k$$@nm zxF%%{llgX||L|!8j{Pi);>TswpMB;~Qz;2ftv+jO4_UQRvq6obW2dyK!{&7or|9#G z(3a%ZvE*T;z#<{Zy&8ur=i?28==3!0j-(uA|yHU~4~D)+ucW%%zFm?@M{VaYIqx~n8W zT$|4`T0g@RYLmCTw;un|vi~mEj&gECoCy(lde?MQ)||gC?lp~l%BS%hH_}8X4vd!| zAIO66o)yW2fc%LhM9EFoPXnOpt4sq!a|5waUOhkKz-Y%8D$BFDr7sH)BxQznt1+QDkRc;ElXhEm2N|Ed%o( zajD5nf^%|h^cmTz9BJ*o$@tS!Sn!U4{XE4!zi}e9iV%DP9rggsd2+<=7=tNGgfY5E z2>Pr2?J#l(<=wbit!Wjb`W`ie^z#VE&(-FPc|%0-KohVUJhI(3(PJzhT@3bDGv7xm zO5+B7%pUGlj_S%j3Q|T%Zy9H6S4LNZ-ZE@5p0m`4l%6j%>Zd-{4bN@tef(Cz*+a0y zcOcK5+$uC8{cdgO()`S~*+bec_2w=?^fliE%o~$P$#oF%>?Uc%hn@R<`Mbyybr%%_ zt@*ob$Wy=H%;?EY*OPKr+Vy~Xb{KToV}J{Qq?dyR!hfM~Nq^+3cJ8=MaN(IJPA-J= z2iLyspc`Fmn%b$k02)SQf@TioH1D2{IZxLIGy>oMQ&|2Hr)`b zX`QR`B^EX-9pt*=k*gIiJl6v{{v?aY;f!zeyVVP_$i2`8&;`ul1yRl{rY1& zeg?bd{`C?&zTUY-3;cW3@bvk>oV)op$!2JG69EWM&Y-Q4x|Q0ypEFl-ngN}su@^dC zq%r)nnHSxcp%7=1SE|mfC`CjqH3av}Z#28wyCtyRHk~;7Q}g?|W!6hYr*DU_N#Z*{ z^jr(pSp1B8fVYT?R(A~hF_oOH-B^ZVm7Y=$`#!z#W89~I&)hG|^X&!qbV+Sb;m=og*I?q`>52t}X2A z+y$mv;yK)!sp`>&(^FoYk2dNc4>x2&LYgp5wk=*U2|vX-p&~`lev?GmRiSCSEJcaR zoVynrWTEZp9m6Z|Y-z*I#!aU=#vN4Sdebps2=;6#42orP{GbATjiqw{>f{I^9>eJ} z54FSQFC{6~`ZX>I*N%)dCzQMRge)w)4UJ0#tJ&6y8W`B)QjxQYW>DT}gP|>3q`n7r za&ro0q@m4kUY2DQUbJ1%QGc@Nb#P-vv_WxLRkjd(B8o9yubR877s>FCi_%s-paM2|03NiSgp8q2}g$g*EeW z*X2f$2APeQ3O)opo@Y7}#Mz1dw??mjcb3Z{hCJU#g6x*P&zF8wTc@>>t9e6f`;8cmNQEdZchZ zNPA!>Y=Nc}&y3ZI18_J&0V0I=Hb}wtJoW_nO85gm4Pbig?Owf{t0tDYI#hML+uxxv zGq)UyW^%NWOy{E$fZ1h}Msnzm&6SYzR5YP3v)22F=Vkfz@6WH|wa<(cnx5|4mxbtf zOnbb%E%egWQBTUw(sfCu^g0CMo>X`(*S2lL+VZ*I&n4gLZ&7XV&k?c!)#x$xMcxD4 z^%lOo@6e|}rZM;G_gtd%PBtL__=SN2x?RqIq<{1+6f~EB zoPL+@UqH6|m}@7Di7nn-Gt!SsZxI_orq>gmoB!0D8ETns+=>z@$cZwOvzl_1enzXw zO;)KnI)XZ8Ad@ZDa(FIg$vH@l$ogsBso{CnYBZqWbE1Q+Q}s*O`6;rYlE2hRr}T|ABx{K~If+@wOxhyj-+k+9zT!>Oj94`?MjA9(6K>XR zBLM4JXh0qn)%P}nZ5e6B8Jm%#p*`$&AuQ)H)%*4%@=b62bfs+8`#jCj&y{I70>PrM zps6%hL^))R)h6C`>;><&=yM<&k){`T-9AC0lFTlAy(zWV6nwyCBO$M0P~ zYpY#5b0cPgbv|_8yz=YRE%*A_njtULLufo70!O%E%_T z@_lMmy7Dn_iDOyDW6s>gWbShb*kQ6@x=xzMhPls^f}8AeHn>s^bQ-R$N`G*bpxH7P zVGR=79w-Mhaz{UT7Mfz$oUwbG#1g;#oh$)Y?|8B_q!E6?Q6Rg~9@3hj83yNaebTOg zBY}O-mP$^7PwftB!qi4rC0}6MtX>(HU#ZEK*S&e7ok2x51fqmSqzaPF*9V~q#G~J+ zZg;X;(VA(Z{!)ci5BH)uWZWB~T{JtQ?myg6tFZ7hzJXiuaSLoH^fKpLwN#W|^DOvv ziiIbp-|pFu_ZTXKcGp{5G$XHcW{tFqr8Or-Tz5+OCN)NspHX(&QQUi;?q{(2`(GyB z4zq@b+@vLK>*LboAur3B&?(b9m@F@O6*J13h3gagm4pd9tacv8-RaVbsUFu*j^@C_ z4?gL#8!}T^%h6TM-kD&EWvzvSV_`u!gJVh&^B6&u1#eHGe~1f_;}ghNKWZ<`4~e77 z;0@G%0zCaGw@K}3dxZYf!fZ1H9+ob(yH|@^8 z)@t)s+16@KAdR^zErY{TFaNPBqcL}F0hAml$nNQ#-m}^kE?lQ70mpsrStd1J9dqJJ z!cC^h@_P3JR>pp|b}eP0G?#Ht>q;1X`E?3GMI_Y=Q6&2mLqBY) z!fdgwUn%V;_{X&)w!V*lR^ayx?X<=i(IkzJ^n%`}=|w&VKRiXf-adFWx}SSSI>E}K zU{GbiXyD67xAKfiOVK7(VbaM+lvTP2XFLV7AVJw@AV7~e&pY}e1a)qQ1rg1{7uNz< zqHmHqFZuw|0ReMm_dSaTd!q_&DX89W$?pB;+rCOEK$c!>o^Dw5xuc-xFPfXMFG^`Z zy)4g`^^={=ukDQ!*~}`-LdrBXX$NId{0uZQP7plNuFGTRRW_mBl6}_2w***+Wx$khE|LsWvy>~&TKMuRcvC{_Oad=t&MS1p?f4SFPMdTW|^mO7iQUmj|#oEzx zBtnJJ!^prqg}*>F=VAxCFVT6)9QZwNjR)Svilp)uZ$>V0_sr(ejV^psLZVvfHF6^Q zuXKmTE{IwCq?(Jx!;a*k2RXao$=avgJemVR$5N7R^^=p46WPL_qYr$0ZfRK+Wp+9l z2WF%aLRWc_0!o{^7oyDxAl_hybsdGYBAfWi^Flc;$*9BVAvxTrV(5>R8}tddg1v#| z-}z;29PYYxn(R1WTc-^v!jK%`RB3cP#+&mc^BUu?=->X*_oe+K`VwiUuT6bA_vyPW zA{fg!%Nn4LVcR5q?Dj0JeUkq;0`SUG>;=a>ZbV=$%HI1-*P8^lZiqu~HW zpj;d;m|#n+nDm}{^~``LyTrj;MBQetXFo>npqS)-x?fZ&eMP>2ML606YcE4wwc-RH zyuJ!N{lHF8HVr7>SK)p;-NI{Mia& zuq0Q-iD(^lA)b*GgYmCj>xt^e1om28Ou_-18Q7_{CG~g$`;gQtY^M+Uum(Me^gJy9 zuR^mc2wAT>YK;+4W_syJ!*fyx=78eI8tOEuTq7OYkw7(3%0MNJg~$pj`ALq5DvB-E zsS0U+)55a6LP7X6_4m!yoZTbU;0G1}1k7tJZmEH#7r{msry3F#Tu%2c3V(>#D!*UC zoF+?sa7$7Lgyiy>nk$*Mfc~ToP(O7StlnO=pVRj)cbIcF)|Gcx5DNj!^JtoS3{HD8<_|#S?;3(jPXS!sQ>B4L z|8^TS67tvFlK%RJou2AUnA4V+Dz@I|{jXDH4s$(>dLn;A#*F3jGoc+cxh=Tw6@vVP z?kk)H#r~;qX2NvP1taS$m+}g$SP$(wPM}P&TI+m{((&Ls&P~SLcRfQw@rjlypHRYZ zAtmg02UMUIS){DZegvnL8lEUSUh*>iiXKDz!O5ulc<5HAFm@Vg3(L!ak%GNmNj%s) z|u|--vt1EWT=i=IG zN6^VgR@Y)ULYw9eI1<`nW``)1R0s0io_SEpAtVmL6$Xnh*7`861M~;Sz@(Ast_o+W zmtFHqEVlS^{ggV4)#oH`b?7eOt^Vtjza#aPRmR%6nnrK0{dWmiG~m^1mC`$1B>0H* z8UG+_Yx!$cRglfYuT>LSmmRs1JF*xBDBgms@djAcD#QrHu5+6}r^#bI?b9Vj>$Uj( zOgOU0lG>W*^V%mqKJxBOXA?2uN*W4MuQKaXyRqbiN<+)^slES@tL9EupV?(Oz6mQ$ z*gg%Q60~TSVRJ2XpnE*YatFOuclp<;Hm#$ z{v%%zO*HemPufj57~1i5ojJV4A#m?YV}}DeOxMY7%Ku&cMCge2=(lUdKTntxsGpz0 zL&JO`(Vmzl^zAmIxQt-TQ)y`tryZEJY3^rmBbEoa1ax`bc^3liWdbN2RZ^?7`7OTq zo`)5-cz5NzWKCx&0ZwxpUqI9)`AzAaIN=B8VRC@!DL^P>9Sq3=UU;9m16$6*kj!hZ zQm#_(cT16*;($5#ju82laYG07Ma{Y8V%Q%)S}bNE3v}5pyM%lqt9)b17PO8IhPlZ! zlUb53JN$7pZ<|8caHDgkKrr7v8AOo83k6$dAlbAW@ z&92=X{71)37_4C=;GH*@GsHx6g3ZYUef8Qvy~CPzF(-R|+GIW7*8p~1UdCqToW^*e zVv$i3?|28~9Th<|*Czy=U(w9esua%7$Yw8 zC(W;xcR7LlxVbj03>t9n^MTxtr>U!*1COG*jQ5TlCecd%z}%gvC{S&6`J;!Hl(@=C zoeCdn%r;xg+O@Y+*0xfsRc5Nvvdp>mLwKtDxjs2MljPN(dVvRDtUzYNvoAKWAOhE} zDqwXK*+kMx;xb1*6q<9&_qYW%lKF1Tic0aYI;yqpj$Cig-kieQRokKt;Ivz?9&?QQ z*gT48hVF&DWP)a*^;c3xuG-FAnh2n?tSE6VG#9+Xi_XXPTTCBB$?-u;-<-!yBuPqh zRbSMP@pv299Fj$FRTWD>nZGQQX*1+9C|xV?k;^GuRq*SoX-9l@=35zyFTS*%MGc8- zNOje?Ss9OeM7Yyz@pk#IA8zhKwz(~Mw@M3hz@!=FOFVQ#z?PM8l&n6+0)5xJKtR9`1?8In72Zt^VcS}74o1!k^`h*J*Cu_?D!)kJ0JGr=lBN6XSgq-NS=y~IT5C0a*Ms?gW6XE595{Ny^HWg(Jv zA)hbtde1QbASWdF^<|dcu2W$2 zOsbDu=^KhRi}bHPl{cc4XZoZ^6g@*qU|ZKR@UMq%>uOu;RlDY@1@ZdmMYaalIfi64 ztv;Lo#0)+$fbJ5|i7{d(2~ax?{7Qpe@hWu5-Rb%;>A^`ezb4W#WwBWqid@Nyh6wlctl%Q3+X};O!SSj zgZJw>6(8{%Q%{|CrrV$6JnHSN7G6)Sk@Gx$c)hyIF`i%f)rMiFY7X8vGv5evTvB*n8C)Bu2s3~2b!pxh- zL;bFT|K#E;N1z<^IcjTUO>TZFbs1OvL@Nt-r`q^T1@U<~b{S3ATAJI)T4xrnOLt_I zEd)#*OKdK>QKH11D5*1U9C^V_y9Y5f+8MbNAbfSQW60^~TVi1sbjk1xy%X z*K)rb%AUB>j}joGAt@)<@U6+|v2c=hl8wgKV+ z=59;(s4tfNo{Wg4ca@CDr1{q-r__QhK6J#-SbaJ4Rr#S5n)Yb0-@0M{D$T6S^^rfd z(4R#B=z7KVeXdMEvxQhyWN%Zl9v7q%lo~XRA7mF5fGRY7lQm(f!Kr%Bu|jn`T7yB( zgE^|KGMZJdTN+D&>GuRW4maLTX?|_-pu_KyNu>v#0s`eb_&#*jxS`jYH&k6ncG_@_e@tTCz@a( z@vWIWuZb&>=H(Du??Ow0Fqj|utUZnWCR?fs zU1$BZS8}17#pKJZm26L&M{QfH&`Pa46YDv@H-YQi-YvD1Br(r)S`pwEq0+d;%cOu5 zwSo~Ayg1MFA((>-zc+c63*s%jmh>Eu#MsDv^Rh?rX+SNi`K`^{dvBVjJ$gW&L#rmx z#zoImZDedw=NqdG?MI95SKhJM%X0Lc1Z>Y#+0UxV_OApF_j6jYY>IBC5a^#QsYIk?+dSG`jEr@d|(zBl3xV<1?Z^~?L3_ga3uw&*c{s>E#U?*J#ae7 z>uCM67h?v8p`9ZrF*I;q2We!(+mq2&q%lDAUJbfZU`v*G5$*EVMv#f@ZQk~DG=Xs! z{2|@p`xQ<1sDi}o)nIOQ$=SHG7!^QISl(8+=39w*mvE-HOGR&)hg8PYkK!WmPkCUZ z?{wo+L(N%XU}O4QX>v$C!N$O$nYwNja(`zXsGbMXCI*F@^yE@c68KzD$TCO?P4 zfrY6~J^SDAGlS62b653O9zh=Z@cCX_d!J|TVAV@Fu0dK_W*}KjzJ+a#TBM?$l)tO& z1*Hc9`VvtG0VHPTXoD$6zUV$-Gw1>=(JDttcl3D*;89j#iPVXajbqta$zIKKl_;)Bh0|; z6_1KUZ|e6!w{@fk$yp>V{d3mo#fe7C1!-W}L3zg@ z&O`^v7t4LwF=Ms?o&220RW2^2`S z-csZrDccuS*KiWZ@KkeU(ZpJ;KcMV#$V{S=u$9L7#aB;51ny*2jRW)@?FQ?y8XfoL zT{gggpc%6a7x^Jxrt|4*t^vkOj7K}yo37>mIt8Gps4@}TPC>Mb%<+?5?6+%6uF*Hh z9(m;cUKdwt=l%de!T9IeBA9b&v9NZ!fgonSxOJ~9yU=-YP9N!;d(nx*^Sa%MK)h;G z@oFepbv0c!wJTnQ>r2#=vZ?$1WpetJct0Vn3A4SMu=E&hstf2mbXOqLjnU-%N*Tqd z#pdO=WG%Y5mJ#IneCjsKX)i3-(e#mC%{wz-XRc=ev0551Of-em1fGXM&FR5T9eALR?R8@R7Tf zP;$1Y!c9u0qqZ)5Katu`j_O|$@0Ny+5sz>?!2uVcOa0HjEws7eL`ps8ySohy-4KaRz4c@I5pd!*-V?uDtRycEXy#=i3pW)uHH< znZ0fq;4spr>%hE1263;8LJ*#XMuZ!l=Hs~>IiTp5;u@*Zla|5H z#K~rF-tIPpC}d6FVzc^I=w%%GyzB{4t`GLZ12XDG`^W!O$GaFv`OeZ}#-=5>VLo7C zy7$aeh1~=6pWCkriy_z6bIN#cESK?Q87oKfc&u(0TT7&t}Fs~R6ydr$STs&y{p60Ym7K-id@JARtKq=_H6qPpAPx-0%9%{%h}Z&dlE5KHr=f$3Jjz7ufIK$KR;RfncQv_xI(jGfLOXNwx|2fvx7EmPq6Y!D zqZ}sg8Yu%_9sfdZ{-aPejvU};T+5ivsr$-0RXD90g_iyWF7Z6_f0Az0F9_&sIy=$> zzJrPLpctf`-w366ny@u~10m;T`>cGd%+a*h=FCCM&46Cq!Y?41o9LnYBsnx05D=;> zhlhu`ZP;C(GSt6|tY*H%(sMOZO__3m*4dcrQH3luvA``T!8wZRQhS$}030aEk=G|C z>CPw8ZVXKZ_KJjz>^(7-Q7U2uX!!qV3C?upB#GcpRhmlIrN8|t6CCJlGbO?6vpusY zTI=!IgtNNRvS(RxdLaPV-ZCG?+dHxm)HjbTkM&Oc2oVOamm!FcYT- zv=M8Vt??1uFn2PWlNd=gb;1p=WP2%Bx4)Zu_=q&=e)q1?RC-mX4XmX|#;Q^FJxQ@JAHd|S6h5Gbk^ z{K9i4bW#l*i2tRL5KT1g8erMH^bK-pokwmvo4nLp4s#*$Uh1N-E}uWgN`MHQq(#K# z&Z8wZ;6`r+h3OL+ZG}@YciSbfn)iKY*LH)Ld`!GqQ7NsZb7LW*5c6ZD)sY;lD4;4P z(SvYj>Y$<{%zUXu_L-F)m z?n|{TS5=X$e#GGmwne$cnuHQk5qgQ2rUFwtFX-lkwyZGsr{2^ipf6Gsja5$(`>2AT zAfB~$b~R}cRjaNLf6P7M zv`(bDH;-?Ee}3V+1fMUo0b;l07mC!MUt9Cu)P4HAs_rQ0{ib?a8Jw1pAx`*&Pd7s) z_FH9$JC|!OR$2L_B2w-v@VzmA#ru6}p3X6!xD$o%E1?o~0$1(etO zeJ`}J{3`DqK$OzGnF>g(F~xes*<&CrG_yqc6HWcd*^53hh!6#W0QJM&VtvdfVxI8t zPJq1={O(-)-~kYp8;JzcLU1i0@x*4bqk_H$n%w_SgmT6Y{LZ7%ZlkJ4PtVh7jIcXR zbsV8%>B|dJw&dQ7c(+bU6w%A3X`FlBm@Iix!tZ~yX1owL7rwS)jr|y=Z9Zku^>5%ar+f>9mzcW#4Dc>}2@_f#=DSE(V)R|m0B1=tXE~E? z8yYP(*3>rq`hTY9B{B|-)9x2KTxA5<@`$@RHv?MDVpn-Apy>7(QpH9E&5Ar@=koD ztCRJiyUcwsd%JFvtY^0+9yVXR%pe)k4FnDBp4~l={DyHxa^tGB*>j!@nEONBIH{rr z(hVch`y;}*QK1nfY=^#d{g?h9S+;!HY5IIw!Ov`SvYzRSqG9^NY5ze~6>ipl1sb9U z8jq3cz+d?Y2~`Q8V-r|Iz4|fd-Mq6{o$_961IVcX5AV?+S!@e^W(}3X1fMQoU;>m? z)Vd(E)}QXGstU<>a8}bV&A}u9lk}#pr5@jT59K(c4KHu}8x(^I8qsggYHDjZ5l|TN zc;2QHI#Jf$@efkdSfIq90F%3hdeF7XlY!57ffEPv94*i#TFFkLE3H@i469^o5^@QJ z(gV)*4r^D{M>g;6F-oyo(=iGKN8^&L4*SmeIF_O_4i`1|#=bdruD!G23Zt z=F@U+1=q*+$Ipu5zMnj+2UQs@hD6*!Tw7RZSH6V;p9f}wGlesmmW~G2>G8SiDhU3 z)i96B^_y<|N<_y2_iwr&vK$Sg2Ds^s$lT|k2FWVLyOvLE-@jp~yka1)Nq1GaknYFy zs@rj|hv;0rUGssy%$(Z^@MG%H2faYEMa-ZZTar5MWjlg`NGJ?XcMZWLN`PPAQ7K%k zCpUa)hSf3h%RSv76tBLU;G4ryT^E@jH36;&`hoP4bq*`Y1WYl_Y)GM<%~Gi@sF>mV zY}WCb6PPwS5&>p#8qT*Ysgal~49Gwa$nn8UzG|ARRF5lU$s&veM*P&0I$}s*Bj-;i zjy#2fV{^_jEn4+gDFnc zDhcvHSsfatmBPL|_9-fN5H}6*AM|w46G3?@t=Og-1^=nptnA=mSKrj@JIHL_sNSDk zb`(tub}(0hKT@r0@+coNlP}_dF|ZkxkTKo$9lZ6EDp<4%GkEt588xbqUuX#n4J+gdPQ}#{` zJ$TCOD8SF$;N*E)KD>Q`M({=6BtRQt{cni&$Qr7IXFOH3v&hGn zd=j`$?hRF$@F?LHkD>@ZNd>fYhPol2hR7uXKK71&XZ}a1(wf)`PF@+*R^?R3;uo6v zsi*I%bnpdVpsWj%2JMV`;}Th*b9t1nLjyCF9N}4XD`D`d|0>reFWyHFO&)?Y3jVbD zUqxa4zr||*KlnHJhdAmjg9k07H7aY>kyBlB{2c?-Rj>Ag*Yx*xfQJ>$PDvqJJ=2#H zo-J+o!}t9jUh+;Q;5j45=vl`r+Ny?GA&o-KdM7?+4{0BQWS`kxBUOl>@XVpT=%wev>fZuLtowvDL6t10n z6jKUCKAh@QB+96a+mZkm{Xv1=!|A~AhwQDNCIh{l#=Jr1IG>t%w!*Q~VPcqljstrZ zwJsf=Fek-*m!)#y(3DKs`ruQ5+V)2deexKVAkkN1h-CyT2rY>K#MFXy_c_)KlMu7^5U>z@NfvD*&CwW|$h`xF^!S}XW;Q6O zU+`k58{qsK&3t)KbZZ@bg~mpS?X_r@t}YC!t&I=n3jAC4AC2~`tH(P4CYBvz!@y3g zG^;TXd{`~gxNg9kh!h8jF>%v$!iDO-cc!j0^@o&MIzcsirN63~D19bYC{;R>@oFw{ zb&Y;E+r4rNMI_&~dv1&>2b}(M{tsxm0&)@LEyoCj_nwxul~C2si%aWU8pvXpg_pD? zV*s?0Xw%YYD|ZNwy|uW|Kq=Dhl%IDR{MawODEh59PaqaBk1)-Pb3#8)Yr0z#ZILuy#1 zVgvqOO69lW!+ArA3ah>!x2jA#BW|IjHwKxw4fvyz+^*|LV3F4y;W!zuM-!d;2*@w3 zJ6NUBFzre2kM)yE-T;u)0^1~|9xKv_#-U0I$M$AT``$We3mdDs-syhES|BliPzTl_ z%HqbieDnWq_RFyI^C~q`Jce0uGN$xSVO)Ii@;Qc&_@#9@*>!;`1*iOO$)NJdr1i<@ zc8p&J#3DjB0t+WSGWm{NDTqaeEkhXQBgVDvwHX~b2~nKeVA9#*wRNIM682~vCL^1- zzgsxnD}>?P@AO@N@))FIYJt18>p*Hi8n{t-7JSDqztV%{!we80WFP^D1&b!cXY`NKcGiToL z9tF6E;P+6!8t9r4j_O6KJbq%pBt#sK)Y+bn)0zm}V`Kt4cC25KHk@uv)xM)MaMV?A z?8qxPYS(S4YJ72c+N{^l{XDcy9Bd))m#RbxIXQ$9>&9UYI&RISz6{Za7rs@URK0=!2+s#V3gf&0B!r#$Xr*WAM2W@=pJDD5 zJVj!71skWgT1bOOWuVKAK8ezDR5_q}?)-U8FI@=6$v=+YGIu;z@)VxAMle_WvrQT*jacM z35x^`N$d|UCK(rM0UFEt5rw2jX|@Pk$pk(FTWrR!XB;Zg^9pMWnaix-K&xh z`d_V-tv~h46e62rh@xH2y8e&^E&G_ejpTXLUZ`Z{LEU?rNlbYGHjvDn!jpmXvV@Lq zqg>8aHctY7(?LysDAI1+C*LRzAnzUplRl=gB7UK-1?}FP>2J+6((a=vcH)90{%~RV zyM>gJhNw5VmT^<%54Z~nn{NeqZw28aXRHqabnVQ`;xuLCana8uTo|t%l9OcRC`KEP zA#^@h$?z$uNgb7ZQoD^Mjrgv2Yz{X!qsMe2GTX#N;_OTl0nESlZ%L1?p zzA05VuX$Lbfk$$zh+7~;)QlC3l*NZ7$^e0}>^-gc)QE&X=u$N^Z3<%28auJ}Dw_!Q z;s4C*YWdDrcwmOzAu#CrHPoudV48pG-mvLeo}hUzQrFHMO+RRK(rAox}>dJ?T zO&>F|&h$mwKaQ{N({7kzt1%IS?X!LH5u;=rIQMBO?8q-QI{Q`K<8!c`k;ojT>q1w4 zVF}uTG~h$yaE1q;M|!;S*^F=6NJCRhsZ0kydvPtXIS95Y)&ABHec&Ag+E@kqrEeRX zl@mKA-y?zd$Ta*5>k+W<_=Nh5J{P7mnG=J_3O*#4-*lSX=>K6eZ9?8R?UmmMWExHu}RrM zlHZKNztX0Nr-ygvMf$mN6;`X_2=hB#5~8?duFDw=&15_9>zCrk(u*hBQ@$0q&Xn z2EnyL#e`JW=M_?N9&y=YHinuXY5v~S@gv1wI4gwDMG8ZZ@Ty4EXoV=&3aS03Aylcf z#9$s_eADDr>8rU8*i|Yg1Ft%KIbV>w@W<`kxjqQ}bKLQTchDuaPLY>CHKXFrE**b< zYq2G(7-?}p5=tY!U~dj2CqM|N2;g>w5HD24wkxeJ$FXT-{ft$O6VW|8)9d37e}M?qv<7t7pXa$gx8G{!TE|gs35n&$SHeQ5a%ATI z*;|9+e8pk*yk0q(pCZQnE*|)r?2mJs1wylx677r;JQc^5zIabZ*bm%3aA$RiNQP3L zYtj44*bMLWE;sO9e!RHDIBhqyI3uiL>FrT2bM>iL~sldz)&@S}q-z)AfZ})KJ5L#0&kDa)@ zNrox^rt7lGC=daFJ(fv-cK%3JUDtm%Jx1ju2FI3dObuFF z=dJFToJi;gfg(3(|A4;y^?~^jMVqv51&D3{lnb+Pg|H{&hE-!(Pc|aqI7ut#E}Ihm1`{3rTdbf^fO$tnuTF zf91gcb*htA%D-S7s;gTNY2+xM0&~+rf1?I3n{dlC7+y-VrBwBvcE7>(UPzaIYqb0$ z<)=IG0#kp9(e0%_QdRqgZ`o9%SbbiV39>vqnzaD3?Roo_2iCu~@n=3CXdd7)?ZNkQ z3YMSVcbn(>t9wb>#xk-*`zOi0D%Px%Of#Jr%T1pWr$u!u+du~`DXL^I14?kkqC5Jg zvRrJ0<|mSD19ENq)FjDAQ>Jo`;$mKhc^on0Tr=bnaFTqhI`J7Y zE=7u2`jH4}EXlKHGN~E+#LQ%pHB7WS2{<+6| z1^od%Y0M7*1dLgK(_H{~TcYq()Zi|6x(6kuj~@BFz(K>K1_!a8H=%^8QrS3ZDGkIT z+I6KRnw2T7(s%cq!MBKV9U$1;1qR38bSrY_e6oN38_9&z+?fAMK1EB1QbaZ&G7qHk zZ32C35)_mr8J((WaQ^-G+VU1O`KE+!9J>BwVCmUJW6eF2xEEfDVUJ&r z{4qF#ApjoN`A`?KRrqm9_P`MD9kqvM;8 zN#mDDt!Wa)Sqk+!(q@vK{z6iv<*v8?QSQ($%QaHM896E)cp%%uO@CklkbvPt;-PPb z8$HHYF`9@k6(5#S8Mi1}%KkD67Q1gut`-&lk#bM1NhZJ=Ctcjs)Y5|Em=d~3&2sCp<@kHm)Oqza zN_4I&(lafipegez_mkkJA1lVU(!JXp=V>v^J|B-0=Ghsz!0(&1B! zW!DVAU53?q-t;_$#Ct1!xjcXjUiM+@_eRz>PpM$+Hx~o|Y&JHi!;4E!?r8&FX+i7E zG;VM4HsN}NHfQ`=isFT@rH8qGz6D}p?v)35*$qEmCAo2r<)tS%luGEzosIV_eS|PT z>+IB}daVeH(iW1|wEq67STW`lSsdo=;N@-D(DCiJ@}9w;~lXL>3ogDwBu7B`k9r$v~QPSo&tG)C;^x`w<8&UW!n zn!BofcLabCItbjm93NSs%^Hik%8*g1bCBVbmS`SbqXt$?`WrnKe1tnMvIhtX6%k6X zYbivpQN_=NGJ&Lpg)yVa=_u+0qz$yHr@;xdkVc_E9I#fjN9S`8nV!Em>EQZ5LQ;>K z&0l|&E|u01Ttw8@7@Hw%^%}!#)c0ymUclqKC49YrDW>m+IDuUqU!3vW=&7d#O~kN; zS2x8u3tTm8SqMq&mBc!2RwBKXK%Kz!b(LlqaP;suU4st=IBm*r#6ZTW+P~?9w$^9^ z(53Uo<#3eN4Pbgh0=mVQ2;iKW)Vc|%(7?6kC)JUB{MqOAzn|N`6w9+c7zguP_L;5f zmKXzE3&HNN-q^C1k!xOG(hpnY=!XI>Wbns@nyZJ^W{zHPodIjGv zlPxCgxRT0hG~R{H5I<#Q05UW`g1*LC>0^`LN|Aw<@R*u*G=(=_;kpCKw%MG>agjY5 z#oOAZeVce$gMEELlHy>bs=-yQxog4#NYTlU2r8-VAZNijlh2?Q&d;MlM0iYcb2@S1 zuHCO9w$5uUOfpN6u;H@85?{nNq^=zCX&sK8^SL4N)fi-iFLq~tNz|Y<@X->``cqx;(eRUBoE0g2& zp?%KMtc#q=XYDO(BV+}eO3%R6gx+W9D8Mu+)n9Z&)1D}IfwJ3sS`-6wA>6my*Cq?b z1?9Ol;u{OBFy>672)x{a&C3*-g|HZ%J!Qmb%M}>!nc% zH2Vx!dhjh{h3I@&&h`w)+z5{<#q(dqPFbSKd`1lKs zI!Ep_8}#xIxmb+^FL(oJAPg$tcxMGnM)vYQ`ynyoQa-cr9a`1<_VLLq#Im`YZ1J|7 zu6$xm+D0Mf9MY?45u#|w`YN~Jx&`OHF4)4eiFTDo0&sT;uC3vsZr9d1(D&br0y_O* zxZ8br1F+?~MQP4cXR&anI|U9HQ+qd_DT68xp*cczHcMZ=&O2WkheDyyz0tj`%7g^(ij}&+Ps4WJT#_jP zSrgH&5=!ZAr@lIDz@M8RQp8;zmn27Q=Z@UK}AVjC{0Z zDO)L9vuQ%T!Gx6HkRFvUhWrQ4oYHWnNR^EZ3>&{f)gn))_!R42E=eScy$STb(f5@O zz|BY*3?w^bS@;typEHSVF7i09@(Fk(dM%*d^nOd+A>r4|tN=$YaH)Izn@&9EB8DIJ8WB_5a?y8lNJk$Y*Sla`iKw|9g; zPmZdEX^n`(dF6)!44L?|cm1F|l+e)T>_O9)*qtqS&K3~s*PNQZJK_`IBmLIFew?>g zlNIw*-8om{k0G|Y$JJ@N8?`A2n=6;B4|zO*t~aGzj|HVeBjxsRZW_}VD^lIOf*ZIE z6{{J`0=J=gS8iQ>;5MWz4j7-xYIO|X0tTIc^GF)ohTtW*3uFdOD6I36iR~cl#yIh` zkvWPqhSS#d1FbCs{3mel-nA`$@ePgJ@Es+0^dJr z0dRgR%p!&}G8-E!FfyS<+vCx|nlJ{y3&RpwjV=73vI3t?c!64;K)>(b;qETwL;4aD zrv1b!^E3}7;$+s~S}>LG>dG91k=7d;9BuT?NSg>509|%}XDe~OJ&;E@lL;G8Jr?m- z^!5lV{zV4QZ?|?e@J9HL97G5>FF2f9*6a{`EjQEy%_<}VpLIES8ll9$Q0>=K^UXg) zP4r}rvT6#+Dwfg7!sqMXdawh}gDRD$*ft1vC(_q78V{y6DFvwc)V=?T9+m%;owpiJ zQS~{>!3D`(q*|P3D9@1v-)JgVkCS~q-*qt9hfrMXjpTI5S$ThRAC-Soo(mVVQXwPX z%aa`shhq)wV^jC!ZYi|scC)G?d2v;jqxzJ(c^XgFbb(tYDr24yQ8*w~37Rk|hVXww zWstANLEGnBzh04q>7`@*r4Q9!yB#P& zNye*J>o#t?Dg0ueopEWgSFR;7BrCKqwQ6P*xe*#ZA0pt|w4K>^ge%kig>d~c8sYli zcVfO3#sK=n5Bnrv7{M*JsGyHhg8RGN&3W;EZNz$6qXr0@1Rz>gm757u5zQ!{E;YOF z42aG2wRP!wq`EUWyhl_^lQz_?LcW3~9b*K zcgr*+1J;0&<1t!3rZ{;f>t>bL>EICJ2HLY8kSj%UQi5_<8^*;Js>=cMOg2@uecuhCl%asXX?K&%f<(v_Rd zGdc&D?k`ZxHk1zYI6#CTcj#vm^b&kfqI)ltyzR}p8u2hDB4ecO?Ie3>$uRD(_RjXK zdq%1{WR-?;L%$dDJLG0_X`D!fz&QrR*WbEQu+1ayNFt#w7{X8S4+F0`^cP zz{Ibl#@e^V&NtlYdm_e8SnZvO@vL7hjp>`NGHy0cF07RQ@m0dS2VZ3dF1RiWVz&$Z zi$}9yrY^B^Cilb<$|dY^UY2$t_RC zywT@pn07Yd1xg|&wEy6kCrQI99+({oZ9iM>Di6m2Gpg~2j|@T^RmG?WMtfX*B2||qh8Zr z6<6Vk z9_u?PMrW)DANgh28-Pu9bWRXME9Gf$GlLHOg6k9YM$6wY?W*SESJSf zlS*!Sd0;3WyF{^<&E`kTjH~_gBwEiPSyb*qx;$}yY%m>-bz=2Nl$ zr{86>Ma-SH$q25VT(U~r*@{Sm?$hY`&mL0Q&fi8zMoa=fryZrD*wP*qtt;8R5C-b^ zpd}tJP62sJ>hjWMrA3K6lU8qD%&S+S!SQSOdpV~OUeIp98s9~V6 z)HBHxbLp$h0eYOd&)nXxy?3%$%>gGZa>^pWv06a{eXBm=s#R|3n_hyqD9zwJ8SOgi zb~H#?{|LK6T1#jgzd}juE953Oql&%k7Lq5A63+q87Nci`P(3cl`6=;q+<5XQF59Sm z^2PR{RDq~edU@|h&)pYFb44y1qt0o|VmX!w4g9)gF~eJ=2=|^<6@yuZde;n?!D0B8 zpSf4&80Sw&K43B6La{spxj)?CF7dQ3qtfW(0=>R@ALd--p|^=q zTM6O{ZZ%ylxl>|gm)TEQoUF(6lgm&^L>xC-ZdxcO+E?Bo@#HIsT*$d-m0ee*VUwe4 z8sv`i7Fy*w93LB>22q6KwnoTRMC5iNDS$W_1Ct?2F~YEkEm?c%VsOy~BYFje|VgoFN(|#toaQwuAK58Z9U+vd?Ky;8~gjh{xm+AG42rAg_xyUsL~p_dM+k zDTV=>MPxi}!mcGwEOOUyqRHnPMPm0)@AZHxir{B0PEyO82T$o-006(71x{NcD6n47 zTC!L0TPJT^MJ%DSncdthU&?wl{5FKess==5$S261L4VWnYo)byvucp5lIzsCF^KCb zVlu-EHuoxs{`p06BjlD>lh^?QnN7Af_hYWN;@N}q|EXnwl6~_x-Ip_UV6R!I3e+=7 z3T_BSq4zxgL zW~uB>emBpjS>IV)l87JyLf>gJ)+s^!DtB`=tpLVkeO)#@qpe9>Wq8#TT*HxP8mkc7 zv`4j~z`$T|8BeWfjL*R>iX1tWaJ+qigziCeX>n}6gT{TPsblX<9@roJaqmt2_~o7K zirJlD++hvxlh{r0RN#yaaP@i>Y?XFv;ugH1?z^h+> zs5H;2YdZl9*p~qvAkx_`Vsi0j7lll+)=mHrIX$5k56{4LHZp?)att26+q9m}OS<*Y zIh}?Fz@8Z}6c#=&^?0c%68^JCHYVu9dFmCi!LXE`+@OVzG)i?u-SHgUxI`8LCVMft zl?NUi=Z!BWb<9uD>tf3ypqqQMosO9Aj|WryJ2k^=1=6B9SzW(F=Qe^~nJ8nh5K`Wo z^q)1xf-_BR#nK{%f@JMrk09ru0GDuYKi4o4cx;VRF_|Bw;s!1s=^Z4>L;icRi zQs3+d=Jk8qg}`%B+H$q?yzq_HM;=1R0lxzgS-x6qJ2D<)>|`2bA@`f^wXu}b`4-&Z zoTUm|x}s|d5GvgOIpma$)kA$U<%$i!Z!v1pW3qdd@bcTs`HH6VvFYW()30!P2+2D2 z`zG)^(1V)YUt#WRCh5I7G>H-9>U6Dy>5*De4r-*#@Kn&zF2}HP>P-sV67Rj7JNJ0% zVEpES=R3W!#Zk6wJ3v{M&fG4OxVoFqU+|RNrp3s(y{^p}S$tjDL354EVzs1A0v~N} z>|3CGWtDAP%YDQWb#nXQ9cd&U>e5#zIu5U|`<}v2d@;^a_*4<5CC~*EZ2pQk%zw$u z3dAPvey`-3&3Q8rW2=MjJ(I+v=#`njE>SFs*slI_D3_oB1Chhgy~$#hpT40w1A;$n zs6=q2+T#}k>n4a(J2iw)?UQb2%DsRTHEVKz-tU3*zBZrum{#d#j!Cs1{b7O}s~Y&D zyX3n}>udJ8FX`LFrBI>zqOqf}-Mv9OOuS1+0~p1j^JsC>TNl0XmFT^ruK%8E__aw^XBpCg)WH}+U8sK zJ>bhe=4*2MMv4Agt(N3N5F|14ptL^Pm9VQw5muZG$&Z*;qlL zukK@}M@{t`@|l{ccavVOX;|K6D~_zO@*ab3-H`l(uNBhlaJnZ#Wi}>M0gK?C+Zuhbbs}1#-3KG*ljj3ZZb2o_siwF2H1Jzz$b*a`@v`aot#5ypDk92h({&MN`FAKS($ zBvp$Wn(9PyY+4=u1!sqGe}qutKHJf<`G`_R4;{@76Lx7Vc_WBGnGci?9(H{SA(8jI z@=V!(0L$D}P5q2Dwqi{!$xMwMsaa>KF(oqF&&hdBuG9MDHjy(j z;x;q@=&L^I)=n94^{p~>R*M7H9|NmgUp3uEj2o-IC7YC6mgjae-?f1mx{i)8WZ*qV ze!#E6?vr=>`0bYdA_+#q>{pEZcUGmh8{rJl0004wyg#4Hr|-?4lI|Alzps=w5Gl_c zj{S4M#_fAed@o^nuF+*Yo+&o(S9 ziepDUspWfz;L}Z?BugtxrU&?ESj)-mOb46-npLDG@VhM9=}j^p-~cs&w(oz?`9N7S z{L~Rg5W{S)#co=VYQ|7*M+RtqN~4{_h=&`hHZvd`;jYEodS*G0dR`n{<@xrz*HNfp zXz-7DxBdfpylcj)B|n%o!%2~ox7_kcuuZ5c*bF&Vs*!1#abof3sMk7A%JkuV!jCS&{S=%i0{)) zQOM#qr6qP+5{qt71bYQ;lZz6Y!sM7K_Ly8*BvFoKGdHQ*DE3{6`%!==Phn}WEEl4y zpr8}?#nN`T_*(T33F>SzkU+&1>)xucYFshSRI3^e$j@-$s@+T17o6jcb&eeN<(kJS z^kI8ePhN3!tMVqIWbM>m$ns=VS);7%X4xtpnrEiJvJ>4(-AA2wfIK$Gf!xzkDFs3P zj5tKb1ufXg2!7Tu{_t1Z1Wl0g637NJ+KsE9yvKWCc#s<=NenKO(+E zj@T){`TDVlqiX**9Ve3hN5Ur23Y;n;ED|`DavcoG$sr3k_^BSCuCOcwDejzvhaZ1Lj9kV4&g6HEvxWr*4=0AGSeqUck6` zx_^{Yt$X#dQ9ES|&FvJ>7j~UrGV>F=n3Yz~Q)l`KT5ul5Nz&1a#xg(}f5X|Q^{oFq za#p288KsQ4DGixlUX5sWK?&uY|aV=G(CTxExYic?? zl{lF7Q;PkN^PhogAB9x>A_sb^Ex*ko0=0GCqL^-KkhWv@GU6ECBL!N1C&-}*C!6#D z(;C_XO$X@3%vv|0jMfcgm6&BXpGS76Tw=EMAXo{=XBIEyLS z!%YKss;LJXk4n00`FeXHqGBChM0Vp^CQ-mZ;`2?c826j#3JcUjaG-BvS(~S_mCQiU zDhJ`R5&G}B{8jFUcZ&{zwu1d%3w^eOH(m1~gYUJ(L+np}I}i%QD?@ea}2yBycvTezBa);3kGcG8cTyAI%BEX;T2XA(BL!JoOorn+?{Z z$SjpTo-`sJ}@qnjn$GgL#j29hPz2L z!~bJdRR0-q_5b;cV78@jlN*3}V4V!Uj%s&)s={fAL+lO@nwlZddk>b;83mqyXq*?AK43B%9VSFgsyHWJ(Td5p||4F(iR; z6k$8G6V$^vSQhx2u(-lZdMU{0QU81}>S1Vm&{G`p4Tk7Z)>X^O`7r42_go{Chi)}7 z-`)(efZPHmpUXg|^f#S%>J5*nTrD&brbQWN2RQcW%S#DO_Fmp0J`PI$3sA|uAGSR! zU03u=U!`p7=uQUy`q%_vaX(d>&e9K}2!vy1vh;uq)M|W>%6XPb1}}1C!aCt6G&KIc z#re>^GxbqjV98=n6(g@jc3OP?hKwCB9cnGP8#(AZ;QR(@!d2N(VKKacKYB7sO3ScM zHk5=Wumn!2GR0)tfswzqVH0P5nYCW+VzGhAdVK=IQ%Wf2Um7~qEwjxnwVoWg#_td_ ze|3~~;)A44YPPm&oFTdPiSJ8dl~?B(+5hD?3Ur_3yA6CHLjFl;DxH!*T@eJtPAA0BUxsijz1Q$rhoIpcW?z8 zD4*kDz!-D%-E-2*w4R{8!7 zMsMC8LH^yEwJvOvk?5jQGp^Aj9y=?1Jf$)E)}}@V=6$4puxn+?OD1U@MaPf72NPT9Zkv zrbmelG_Pk-=o`$IFlxo#h6S3U3LqxajYi;w&wu|LwCPB!V*KLx*fnc0gyr=m`73C- zDsT-$8p19Uto#&cc5{{tx^o6*1)D|~37xfE$a$)0D8mymOI^pwEzY6K+jP!~6wg7Y~IWQAn-Bm5-`Zc4b z2^*GmDO4=>U}n_<+sGs^An|hNBclhxquEzSV7=DO_s^!51hvuyX)N2LWQ8quD5SGW zxa%}M9WdxhsMgyz&&}MyVwT;F^_@vjPt#0r8n{p(MqJ0qQuKV-H|ZHl0z4#ARSzmk zrAUuc*_e;a$;?{_vdfV(Nv@w?h-lKED&R!9fxRafx2H$+VTO8Wijd`cx>YA-H4TV! z5+-rp^D|J-eWOG}oHCQOU8+^#qSS%{7VofVPmAkuxR+->N_t-_M6W5!%FL(j-zNq} zK)hpW9x`Nd%ekL#)TL*XUh@}S5#8pbdLI;$(|f=A#O3RJw$+8lj;kfAR%MtcOXr#n zE`O4e9ryn_&7v9M0*07H9og_S3O$T@p)2uB?Am0paZzIxb1ySR2-TNLN0mJ9?!HB7 zAwrU1>dPR8!BUtG){QKesO)v0@vjE-6znQ${nUZ;bf8qGy9k-Mc|vH2^qNZyd)1c9 zWmvqbB;hQ|F_w}5$rZdDRj+&4RPcm&WH~f=AP{KvW zb!DEps_{xy-sXDv!2bx%bk5z^Gwf)ZRH^}wJsJ9G?>IYjzhJeo)PFZY|Bhdqe+WBZ z^AR`Bm>1*5Rb2JZ)yMdy{lbAwy+%dhs784%hgSlHLQHnCiu7;dl!45Xd7twpHgj58 zBV!eKu4OD&By=`X{xEsHbXgRyi&6zHEHU*PpLcljiS>cD2?|9C%9(-(=IAX6;g91M-2i_Q#5RkO#3L!3^`X1W&6`Atdz8 zxq}%Od$HaT4+WZSdPTrLfU0F61ZBxAeE|owPr4Dx!xS6mEFoE>`EgF=AwOp%iW&fcIBjIN zVZn;?j*Cu?^P1@kj*ce6>GKXILZeD!dyluazQW!9<%!BCBmrp^u8*Z$2v;t|-)Z0> znOhTrKVAPtDtb<%tPr7x8^%qZlSs)-FUtxsfX9r_%h<4}P*)!dcxj&QpYGiZFID}& zBkYdd{vQatCjUnWyWZB@dM7CnXkhXb0Wg2Zfa2=Yw??|!=lF1E_sEx0RAraSVPB-N zMZHf}isw%*>NDcOtIv3^$~2`Wzu11}m2C2;si8aeUXAu&xayq<)kMm3^+nE2F8BWD zP#e&*1BmTMl!SBH+2UTY=r&J^skiROk7z_hN`&eZsY5G7E7-2a_}Vy`ZOVl?6nP}8 z1y=HKv#|@t7D>iPPi3m@Ph)ThEBOlhs}D0xcHky>X=N`)ers@d0}#M49-DiD3zE_L z$vemN5Oc)V*3ezo*&HIXv$eDRBPGl$M>vg}@J=Ltf!~J4BtCpALyTM3FFmPLctw0z z7MoPEg-`zd)myL;#{-8+pmZelp_)UDycd-elDpykt5hK!AerUe>r z)02q!l39-;V2-150J~MdD@Cu2euIADGc%1j>ojFFbU-0xu5&G z?(5eE@}H&?oZqdG%h;yt4^Ki@F`zDK)iiT{j1BHqHt{RX1>b0(#e+$(yo+Q6J<3=+*F> z_Yp6>WKx-az{qSY(_QAQL|+T34y3hzO+#HpYSMg)$mTA>$@}#Y&&(tJG&3*md+?00 z6r^YbW*Xk@EESkXD21%$uRPim22K7D;Zz*DkoM8OqbjXj-qPIR;$fmG4mVgl<;$~F zlxAf}cZf$+iFbqTUWB?kmV+Pqh1a;TSPI5bSE{SbuemqZR#8Pu2pPzeh z%Oh~6VrpeFVhw|cy@BdRg(#BF;wepq-{%#ERx(yV^P@9nWb>kymS&ppVoNhek5hk# zneeEm!&O|lS@TVq@13_ZFjvDR7ro;8!Zk|JOSjy1@Dry85VZcw7Jri-DX5(svEE(g zQ;B?7vF(=p6Iw%g)y3ngzY4?GtN?GRhvSSS=7@N6Yd>mEn>?G$RAq?ITD~A#2o$*) zTD5ao{Yh`?ZB@Ucj04gwH$N##z&=M^cR9#36~5ivi2n8?#85S*o!Oz^9@o@@l$I^&;n{Yj>e}$Sq5Sbz}iw=mslQ>$2l_MY3X( z6!w!|UX3U1=E--Jxr#N8i*SoE(X84AycJt=y+&b>>=I@mgu%1Nyu3ihEPzL-=_IB6 zMt~-A6gIi{y1lb`%3T4)kF=S36HVn;fMAD-^- zpWK$QqVDZ5l)4YzntQ3{BuS{{Ij3hXiAX-ImmOa>8?8f6ZEJj(-Pt6nhNG>1KnCy? zPd&)V+MLuiMSF{Go9Gu`Ga5k4%3pqo{9>{BUJ;fQe8)yL7_w_c!dw}YOGesCkYGe|VgE`@@I^M~8`r9}A8E3vC zGMwAJ5=|P*csfI^|4@p%*!pbEKN_CxJICAAL^?CrpX)TN84<&hJP|Sn$+AxSC zbksL#P-lqkvLjSrC&DiIBTeHv?`6jn&)R(w^|)_W!1Ik=?IdD;KNCrq*PDLaX0^=g z?QL(*QFlQ>j>X9oFjt7X^z~Y|NE-dZ$)?7H|I%&1+OKp(t+K4z(O*luuo4&JTj}2s z(>z;nl2sPYS(2Gq(j27JzqGbAG!POL^o!}l2zWx$+PLof;Gc!nM4LR1OM|dn>kQ9- zjCUTsMlS??%W-%#+7h4>U>7Qo*8J^$Ih$R*bBpN&7Mgcs4d_uUh&-fARdSXv>kONq zitLSe=4C5jK=GCywJLr&5HL=Lc;Wfx5I@NIEg=!*+i?B^zEi*lUDVm~?ZVO+i4*>> z+5Tl!Rgq2S(wtz1%IoIwEy#RyWm&-dJyiMQu?wD|yfu{YTD4x%uT!M>8Z6S>KGd%4 zgOE0za?7ryIO;n8D2flUc2NB(4EbKLS6^^lqbc^+euGM3-o7@IUA4}f;;AxNRIm&^ zD&KdAxd-RmRbwdR1)d^}0zx0HpF)QysTXrguU_V!-hj#(%NeVh8OuomO`K%2nG%*zDmgf^vJNV5@>F2Sn-DRnw(iX)Z*QOcl1M+b3FeOd`A8U{?02|CaDvSC6pX( zCy5*_Sz5={zrJl5D&Woy4&H&C|K*x_j9AV0q@r|K`ah!ooFI+K4*z-^E8CeGj1|K7 zXyL4}Q@F~coDM&#J}c7*y1^bE7>IR7!fC6Miho`wj_CJTJTo5pHCztuf{ z`8Xm>F~75TYfbmb`qJVu2s9#dwkaQ3aMn5Zvkk1{#;e1YG&7ijV8O}}iPLf?$ zzQB@dr~HQaHpiFdCNhMc`Y%a$PLd%5A(;dLXBm16EuNg*NBQOTvk3a{locL&&n+ig zX!XnsM7-V9jh6j<{~W1S(|p;l2+E}l+e42x0wTQ3s<<9fa2*q$j5TVh{9b%xX$Svo zdA^h{vVYO8Z&W3PUH}-PT9^ zUuw<+(0QaYy@p!*-NKNB>KjXeaPF-?$#GdZj~MHV1-;KV9elZLjsXQYKN+Rv8Dxw? z(Xfgjf%QH>DA-mF(4CO??8p1=W1Zzs=WH`x?0jXI^nq`~?A~(x)ctGQtV+IJ-#=?e z-i$aCRuhLeu)ry3eXpx;+yg8?SpId^?mnZSe(D}O{#rI(UXSsBHt2Tsc&rFnII%oz zY&la%Hn!B_oo@pmhUvwm@9-~kK`Uo>?zawti*aAG8)MZFZ#Rh;#@$lwwakgY)NpSb z_-&#w3ZpM{yuprQI8$0UZf&adrEO4Zs;~BMs>~B9B&35WgDG@w-1y zEjm1(#Wwz914Eyc1;`tS=q5d$cR9m=pjjn^$V=alr6K)bt3J-o)07`OyY1oHMeD~& z4;Rt(GKa%PfuEcLyV4uiBc>47e-leyg{Kqv^!Y8M26`c>f1kU`6kUXFOE%H@iCvP^ zj0wGcyky74s;c)Ln2zDTEMj}309aZ{Dy@gqDEFw5N6y}S+%_XSP?l_Y<1Z<>uTIQ} z97_vbE7=j%xknW zT$doj@6|GA3hQALS`VLw17I?)9i**&q~(M<{Z}u*OJCI=E1>RwIXR?=r(Z5;beE(N zqzk*GN7fwf7SNWJX66DMz_XE_9lf~H)jy51aZxy(pMyUP z(`;N%JogOq9Ob_^Z%(qy6Y}ka%wM2bJ=ehb&C6NGXa8uTLz41^wJ87QqwT@$HB05HZ>q2$m#% zgCZvPiF!b$aA-MU)?X@WcurUy~GhAs_qHH$(h;-t#+(_7H9->GG3k{711V$omIu`o1*8Ye352iJPY+Sl9 zHZv_sh7MB=nBk5oP4l5lgOjzt&k=4fE#@rV1Hy33B*dc+Juca#B}fPu1qm1#D~wC# z980W*3S<~7*KLz=Gkvqwd$4ym>bC8Q_VmzFa-WVry}Mtldifl)mhj&Kr28TNH$HkG z@&8hADA9qXAZbMbo#g;~?@4OF;qki*XQ!+{BZ@$s-M(<@n-2M!Pllgf^@W@?^kLSm z;Zr7b@H0#t3TPAOT}TaRzIf`!Q8ImFmGjCaN}8x}H-xVI`pULLr28wzNH3v z5yN(=x|batDi&Hmq6jclfw&B{OdaBFt~B$qF@P&a!4SvNwrXhRfORM&)if(d9{3>{ zl#cYQr4^Ug($gKLetROB_u#zEU%$@0L|$ZNV{XRvc%XK~LB`q4q6AAtO1cg%CCBwn z-{PIpib->w(QuIw=@tvcVCfHq&u-5e4h7a7Q~&&b?hF6>eFxgY{eS3w2-37$^jF$+ z)xXb`0*4a={dmatF5qnP#e@yD*(Cvay^@96zstM{gp(-J;{hdSJ|1550J8E1b;O?x zIE{XWyhAiG&4PiqG+qq<`&{jg8Pl8h>@F(4`?vq)8@&G!ACUEs8}JNSL$vmE35*j0 z(KMOVP6%nebBcLMvv9j`rl_K2qT8S5YB|%xTwff$uGS}|8hq`Q1SoSGGuR0&cdpw< zc|)<5j$X$filuJ3k(6R>cc0yYKNDZU7~C6B`RIW(b=-*s{jx>Yv7U77wBxu{U1pWi zzR2s}izz4sFSf3&JG6|ST}B4c%c-N3)q(ymztYoJovMmR$=PK|0!TN~u~eZGSPmx{ zY9tiEv2P~v=I&jVS1ESC{Gsrp_zE{qW1ANBOG3WFm4zn(k~ug|cn8Wi)E@Q1DoH2n z>gawd)agp708uyp3M>y>K<3JT)hz@y=RkMAW&iNRZ#FSB|LcPKzu$xN?<@M>esBEu zE&lf{{+~mi`S;5D_saVB%KBg2)ayUizktTY=aQLh5vNYEvye*+6IvBXJh@YG`RceP zr@86G4Vp=+N%CQ~Xut{h>QK!llcObvNS@f<$#FG$IG@#u`t#e{ErSiKcT?-{Cl3Yc z^+Pnto#iq_*hh-I-O*%*uQs%xIZ2E=$iQwsC#S>GwV477(8^7NrK4IN^FPoTBM=$*^A<{2G2nF-oN9O0={xDrX%*B!;oE}9%_@o&*WZixEK;RnO z2!Mq%UIQsrfIc}ww&lsBGcfE7d=jhfoauVoxmjVdL}*IhGBd#L1__3C4txBMCM2&M z5aFw(n-R?_8`4^gJ$@6ffeS!Z(SQ^B6=r`I_gTv!Dz)_dbf+MBg@qwOtH;M5Y{Rda zke`{Wq|Y$L+9nh?O4oaC%QZBYk#BiV-HSBlziAm%YPFPf4Cd$a2yI_`lqKMLS798V z@#nVLnV6xoZ+cciq$VV_OTYq^6(qO}^iv zg-B^Y-7~i?a~<-cvc)UdP@qRBZ>?RTU~S%-#U1%+DNDH;Gw5c2t9O$jMkJ^5+H>qf_G`PE zna_arf8n6_=rVu^c`=}8U5r~a?!MSx=$We_7hI6KGtEle_giTZ4TMnrGX3{nsF+`7 ze2p95XWodr#cFnUC(GUFOU1te*XZ$Sk2`PMaGGCB!n=_@U=?os7P7Tr8O{aZe0-6) z_6?VM=Z^31oyva|hj`yVed^Bii8D~U?W}vZcS3UH#bzH?%`+QJ~x7Uv$ zqL^?SH8LG(LlPcJ3I5JdAm0w@jdXb0J+r(;F`W9|{OP;W%>B11KKauXDWB zya!JLY7hMF)BNqRmbF$-YK<&pf|PTc8tGlWzn40_@(~Pj>cIk4b)eh)O?m1*e!%l$&F#;2UczK>G?EPnN)wD3DVeg?(r-{_pi(=e}8hEYnA-9 zsr1T_dL2@gp7yfPj>o^JS$6O;FUg9uzMg<((>cw$pYs#;7Unv3!rdEEkt|I2?s?h3 z^@-{veTzl@OQ)q%>ad@uZ`xp^z;yIzPI(&EklR3WFRjXu+t?njS9~aMol`D8v;?=G zir96rosCGZQE3SZwEi&NVm@a8B-@J`ue%H_)cg|gB2`)0C*Su{%J0RycCP0SA1Cx89Pw(}ylR?tn!A}~_Qyt@Li(_!1b=D`5Y}iH-BxVmvJo6sEqG+FHe{X2ec><9S2skWdMl`pin$>}VlLol3N>5OzAmY+CUNgw1ga0z%5wEN|*%)l&T@x92~Uj2Fp&@Ker3Cx_Z z^DBhDPgtv;Om94kCuu+Lyxt#sl_s95`&~u54`84Y(l!d#ULuVYrQM9X%nQi!Bpg{p zc1SQa7cXGtG@XsE2GWm}uB=gV6@{a-W)U!UjW7bs6UX;UGJQ;PcrhX=P0z!R)46GdKenK6x3!qe1LNlEJ zF6VoC&z?cD&8d6lV{!BR!yEY%;i8LT?h$GIt8Y7>sRGOPwVReFo9Q-&YEQhrtl8w?dFuI&;AWtFE65D|~w z+2XuzA{ZJEe#pNxCEu>(i|ie&&8Qh6R_FtFEv^Zm=iNqLJN*S|NVoE$Ho4M%rgVui zET~VLBCnLwxK4kYj;Ka@lid8T(|9w4l9M{sNw+mNYhG`6U2A*Sl576#OK`ACMg9@O zr!{G|mvjXn;R-x@*!YBc(5U15*;2=EDnaz}n-97=(>Q0>#e;3><6~!Qs9fdB7TlC@ zQ4P=fqd^qgOYfuz=WNXR$X5jV+C4^O*oK1%Jms0#%U?t;x*2{^R8~E z+CR>du-Xs4B-2qU9O&oW*4~z{qqMu4xn3Hz9x8Ibm&c8RfX*Z zGp%_u>4ji`>>TtVXKQT3(I7%b=m|w`G%Vx#B_lu(623L)?Ch06jXs8+cZ4- zM>h8>QiaZWdIeEHAtZKs)57iO+ti<=y?8L30_WT=oQ=opiw{K!e^a1AZ!1_#f-hj{ zX@djCEkG2d8;2Xc=zczXkg~9w@w4?D^X}t(>jB5kUVZFyoFOa6MHz1Q%*)LrCr=)D z^GSIzHl;)t8f24b4oeFT>Ng&g`Kg_PF;a|A0Lu)}p2A{yo) z@bxib_UP+b833oJ_nrXa9i$BnmCy{jK#%W^=1Z>q7R#X>D^9H}i3%jclS^f$Fb*_$ z=0WO7FU1K6shr?Yp19-MfxS?pM9kugC@(2594AlZcmx|o^dHRs~i3y?a(rytU zf=^WV5e{V5tWLSA&E*R;P}~#36^kl_SGW5$nrOo8yV76jQRGZZ^ErIW>0fxsc!$AISv%OE zRu=#jczI_sQ&YeIYEu9p0o|Geuk0@&M}<^K--pPfH)rJ``fP~gUNMDb)v#^dE9#p|LkYKe+P}SJg%Ig_V1I zQxSm@j-5*P)N%Gr*wP28=)g9+pSQ7W2F0<0Mng6ym1j7B>j|0*q=0tPS3}~(g}c-j zk+57 z{=27^ua2HQfDxnz)fE?5iXDinkIlKWYYy>&iHJuQ-k?BhXzO>ssYJh1-P5jv73sG2($p0>QkDWa^=qd@0<-5ND@tTrYREhFBF=>?g&lPsxGYkW9Mm+cOIhie*O{n}aUG z5heqA#4>y)H)$;4Kq+{7H{t_(Z^z^5;D)age+uE8tsec1oKXY37dd@94PQ~VNIxDm z=!j_CL@OB7ex$rvoTfM@NLbB#2HIBcSz^t?BrA`VOUePRZ5%R$itAp!NV-SRqW;Vd zpjk$wkVT~3(uOwr!Ad2yx^9nJwfbg=F*cGzZ(eo;m#VPEl^v#`rIO?N^uptTScLLZ zi&ImiGHrthsK-$|vs65(AUUMdfkF^w2%e>A08N;4^u^Nen+NzL2ktSAEPLVGw=5dt zwr!?c6l!iXPBi0gEkT(G#a-W5`Vxx$Bq})c6`5w|Wdbr3E*-_1Ju1+blg!`GtC+eD zI1q&a)U863Lm82Wf&`v3J{{rYw<5fc2DC>IUOmOi>}*Ev5%OStL)}r>(@c2{IRh-x zB0395B#pKUoGF&GDK6;k5&|we2w3F`K-o??Sh>VpTxoGHB3otg^YP8|x3H>Np4z2jF zTw9#&pS5)|^xSkphMQpg=`3^(Z)zYC~D5%?sj zKC!EzEM}fn2KC6dTqD)Ku8<-qMw4nT?3?}J{_wv4DfpdP*kND+<5Lw}T5)_JbZ7UFN zFZag?_7(dkev+mlq5}nAN)~Va(6R27laf94uUG^^zR?0s`(6H{C8V)4g;o4`l|Idc z{mP9IS`(?^YTgEivg-XT3ANEG8e1p*Bl%?_1m9x#B12_T5vg6Z#n)6` zF%ubjSIJSQ<6RFIK~rSAPvoH;Qr~qGhQgln)%%c~t!3X)tpQ9n9a7CZyd z!v)4@|6=Ib+@B`p5yWdciQO1*>1n%r6+U=vHE(6`nQkYx54CcGE|I9$bOW zN{c4}^d?^5fQo^ONzm@Tb+L+kO^@u;SElY|b)F~B?OL9eup0xi?Bx2O;7)})Nz3bL zkgGB&zX}x^R&8sGiMIkuY>m_I(C;2`{faWz9^B5c0CL-n0lRgh+qG68>lS5kZu zefRrzLiY<~cw)HPAgN(&H2!#3*T#Lc?i3L3_bQ)V`%{zLGf;lWsOjq?w;^IYo=$X4GDFXF4NZmbpD+#vKOkTo&^%E909sGS3*HVx!>8`**jn`w$ik+ zvvT?iLgJ{B3dx97+ag>=ntM~j)=y1n@DwC>%<4A`nJ+uAI?!O!YC>Pk&w0^5P-C>i zv8Ye|rRU|=py<_hx=41qy2x0H!kXr{)v{!)VnD{XNxab5)?{en8rZ@#pnwn%uorA| zve9ootlB53K`N6*+0HBa(&;Cx95t8IVi9-ds~!n^a0^ww2cPCl&2G4|1; zMK5pb>1e{ow6jahTM%2wYVOLLpFOCBCW=ZQDjCHOHl%@iJ5&<%1tFOl3;1NA)}(_> zSd2B&jcr5vgsnM0G-*6a2NTTEQflYjU! z8|?~yaz=2Q@|vWfzvZyB>-G(U#q*`I_}U=T}% zS|wxt)pe8pgOt6CuR-*Zwc`O}y4gM^3$+5%oV>F_{)Hx!t^onTxAd;0obV?zSiKvz z*=n|)9?fJ{e*2ll?*1t6oi`akwfW<`U(=6BAQ6M%Z_O)bFWGu-o{u{ zBG$^^=9>KDwe*m}(9lf0E%@n3_8m`O(UCnq`-7$yyYjfA(P5#()SY({X2j zEv_EUnuxf^XKl`(YPa3Pv&5n49I;gs1}pZNgpbt67NV}OoI@FiH-<2{gpXoq13PQ0 z`1#(W?z0LKJ(RjJU>~X1kpAbllMTQa$J@gz2vy_gG61+cirsGg&{SaE6{ALW7}too zB6uSX?7UqNHn`%=*uF&(AtrglWk0oxKTb6xx~!U%26)nZ(q6&HP7P|U1ovQ&aSzSol~cw1h>!~TP;iD>c0RUFiATaP=p z$K&yfJP+|D@)p!;?#zpX`tpN$NtDKI-%R&i1-zH-Tg5b{zrUV%QevQz!IYgmRM@qA z@Gk%8#BMJ|NrGx$_ADaIZuddj;AU{cL&x2+96nQpzi`F$_@wxL`;RRKY@>jKFJKGw zVSPg=Xf^}3)UKd3AB}nK%@m3OHFa8m(-p~u;UlV=63M;x**rcxfzx;en}nN(q0JQZ z3=URqSu6p4U1N>CG^q3&<0DYi{zP@lA7Z{3b?VZ%KgLQ=cm2v>r3F`(3MV_xlA5#o zmpN#G&Tep*Z(Xu_ZY5dhYR7GRdxrvNu@6=Ajup9c0YdJ8$hAT`aC z8hOf+hGl!_+ib#)G`}qwjTV5hK(0}q9W*SjInP(nOt%&lhd4fX){iizI?Y&T_icbB zUXuAP>J&fpuNzVrcGE+9Bo6E2q4{DhigxmL0UoM({^OQUa30&A%VkMho}FV%HuF;; zUhAv_;)fDMO3_>Jh|}IK5$axd_BAA6u}F`oMMRp;tj!!`iy-x=(=GMWW2t~C-Ztw* zX>b30UQ;(;5zB&Gx0ht(c&`Z6^)NIzGX1Zxd4XY3@NH;|YBO~rOPW{4!ls17!hQm4 zpV59?-7o!hy7wpm=6B~(L#KMxe_X-uG9VCv8zhv=%(E#RRKjUdB-}fpqvLD zmKC(QSZ^cJ5@5nvb?I}W35=%@CqR5$^Yc0IpO-^iFgtr4tG~j4(m&KA`OcDKS+|&i z6Lm}(hRF;=CXj*=U)j=UqheB8MsAtS25Z1U2z_F&`E<+BnLM2P6X|&J)Zmu*6@OvvvDc>Vn+HYcux2uEvu3JZ&XR|sX=dxbjdq%< zVr7BMI*j|u^wRJGGh>Kc-kxP{YNgEiWGrR_(b-WNR6K)6dw*GUyz{K9d+?RLXIN(+=8iD@|EJ-Dv78!tc0d1E4I-!KrB@5#auM6(yD{=Q0W_GxAOD)W!dwz5!kG*9dr zZI8j_b>vTzVQ|O77aWd)X?Wr;ifBeHGN)Goal9U6{JHH?fu{7|+FJo}cK4r)Mx?*b zCAkYvdv{Uox=JVteii8sMta%F!{GyZx0Db%u__~Sp=y8q&=U}P659@zX(>0qW?5Hq zmsw@4_p(5RZhev8X*Oq@R%?n#M6c_0s9lYr?r_Zn z(V>^9R-ZT|YmBIy3E)AeP zg0NA+Iqk9TTs77vrA@iGl)B;vSThr}!lx1K z?_bVrHn~Zte<7@jAA%u0?FH9-bSu@*!!<_vBC`f*w$ztUbiTM^m9b!~RsJ9^jk_$X z#$mx0qa=igGA_Z%VRELASbw}~B&~n~yOd^|L)Z~;(<$T~GUQsoQ$6LxvQ55R_*P+8 zeT}P$zekn-k^QFRPltj6wE>pSYZBlbz1lbnBWT{Y$r9(LOg&o?pd8XFzhofS4uwU_ z_De53lfbdW^{+b)E5o1nIuN}Y+tM6erMWpR?HUD&Eux4eLOlL=bf<9k75~S(%qp@s zQL9#rtAL|%FDfaN0gUM5;u)dhpk1Z9phF9{h*cPkzS})vaq$&f2LF-zu^k7zFVF0Pd1oZHqjAnDmu&`Ox34-oB-Iqdc*4 zl>}KIASj-e_ZSQWajZh@uwii zT~){ANGO)0qvVotbJXLuorm6n`g;~-9gygQP)Pgjya}c?$ zh{>lF4~W?;Fs?<0O@UE2CL6%^`LhlkK81vUcg@;=_>XtK9*;eh9ofkGt9qSY2rUMR zS-@2F6810vT_$B=i{6tm-crlY+;8^}KNjzUfNnCB$nU&JGiEPsiT9I&a@N|PLe#!y ztev&S4~1&Tq~~+x#%Bty%a=f#WmWty$IkHB6g0uxW-wG!ak>m(6#d$-b){8h*X;-| zuw`!^2G;4i`MFE*Tfxe$GwgxNvbi>I3QzjLP1d+7ey&y*Xl+5cFov!$qFs(#$ps>1To=K$SN} zamkXYBIo;c(xSS=uWX@uf}h#&r&qkDfa+%k!)tBusXg+!RUCJzTZtN5#>JrmQB##; z8<3-svm7MqlouI6W9?QETXG3h^7r+{)2;gFV=89!d^5qKxZA_g4k?dzzDt$52nvx$ zPw!1@thc`x3T~;~(o$Vs>HbA~7EaDxfw2@@V;ePL})R>slRQMcU0b{U++ncm)g!?rY@|k(EDYw4vE%WV`+mH)Saj| zymn`*W=GXlVItG{b3&jkvlO+OO4v^ajz{80`iw9@))hh0V>D%(i|Ww5LN`5t zv(Rf@#Fgd#pjU1;{wP$+w2^zaR|nT6p!&R8GW%xFnqfnHWqk3)IMrUhZ_< za}x5xu+*LXS>mbOYz6iy;YpdSO{T_V8r~U+7M<47sh+}+k=zI2tBl;_$6z-KfzKpC z&gaEZJDlU}89REN3p*sJvdc!U@l-{JhF59YSK8&1>}6Q2=EnHbGM(&uJeVWYNCvkr z^U~0%qhZAA%3KpA7#m0#asf_y>A*pew`vOMplFZz&_>AZMsaCupVqrT69w&=6w}F| z>q)oEcaL&fUoJ}pOH&?|)gG5#RJk&5G1DVE{(jtKfrRB{BfPDWUfFLcJBf8#4H=K` zGo2dJ5l+KRjsTK!(*Z@Y;LNbA|LJ7ie&>E-z)K)g71~Ulk|WBmbXCa=18H%D5YQJZ za`uim%^CDB#4>rMuZxSOSwGrHT_GzM1Zr01lF!6u{74^?0?pigCctK|&2KmBF%zZw zhn$LV!V50A5p~$)UNFSqFLj1ADglwkHc@X@?fH1pe>7u0SV=QD+Kwx@~jn;$5PEU;b^fJma))>}MyA*-e9-guOaTJOHxCa!}cX zo$wss1$;M|@Gf1{r$_W&U|tL)%rUVYA7X2O2QCy?a?-+px6?-^D|zKu9@r!YMYe$= z?3jCW>*zf2{3~y*G>i9sgZQb;#}hjUANS%Mv|!uOdJVQmDZ`YV?Ok@_UZs753QFQ99{;+ zJ+-x!(*zp@Zps=wzMp$PEN_Y=zKLOtO>Zkz|5QeFjVbg*SS1F)@>ST9t3>q0HHOvb zHW5;{F+3yssC_B`@^mN02#X zV}dK)R6GlARZ_1Z8<&2-67uEcRMHDa<=hs+525@&kG zPtxg1ieBcvW+`xwcrDD9BE9M9!5cN2to=dI&_Pcv?`zo}F&r8@M#YHgXT8ECYHZRj zT4eTxvR?F*CuY!EYHX4`a>xo+1)RwvycdD7UuvgU^6)oU?|4m02&W5R*Py7-&jdTn zVTMWnnOOh-k4pMt)(c#K^Tm4Xc8BKI`KS2TTUyTV(A6$C&C^BAE!)%fiTg__*L_+# zlH|yqmmG|AbZUwvVBA$YH3p%1GW^Z|_{R{Wi|(y(rsCuKNHm0VQ(0=yEEbr>SMKU* zezVPV)_ibcSz<~IjS(_A1SY{Oek}lu{|H2vg7<*talbXS>SZS`kdph~mj&FzS8lrB zp1eWz%>v&N<0$tjAeW#_gAA3rE|8L!esx@PV1y)yybV?)dTR==;STGBx{4=zKh2ie zR1H9jkDr~oy@O1IRCw#@OT~!ML;4g&b)G%C@E0QMb=97p0CG7YtaIU)y0uF2n?#S2 zpb*yQk?6c!1`F_L+95e}DSNvMRN-D5=NQ~?R8;CDnUFR#Ao;G*55s9dFTE6EuNiXS z2Jh1<n2_0;RpMNyk;0zVpR$863-Nle`#un`3# z$WZGWu^rmaxX3PzWp8+7Da`x4f6euNp6J9$zOS3d!xg|t)?&XtgdsuiCH+hV^V1~y zA(vYed(4W%Se)u#W&gG|fIGe0oS5JQMRwKLC`O`0^gCdP~ziRWIu8CO4 z)14jL2B!k=SEXi@4x*s}wYkrbS9XA?z#rfuQS`>EWROF}+N-s>cPi5L#)ZMK0S{I5 zO-(riB{?k`&*F_ji}wny%xc0aKDr;j^WvYL>Z}MT>h+h`=O^uH8Tu?#%T`X@v7y6f z{j1*!O;Q+-r3zq6FYWvCvJUto&Q-B>X-5Yn-Rnc ze_UNrnT_7?mV;T#2s9CC5!Kz|gSNApb63(FdonqVs(*zM^3u8RtsUU<D3&3dk+sv%hXG=-7>$R=rtf8;UyoTU;jzRQmF^td!?#2AbJ^#steT1 zJi_C)S__1ds%p0)Bl&@Z7gUtOSY!+;CQ`B$I4;`!^~2S5(OhzJa8I&fv=6iFacMH+ zAC6#xt;Z!P0ivqCbp{NoYJNAzOz9f)9$A%_7P0NwXt(Vds*~1KpVH?kZ`l%kSo>)d z>pUF*wUeK&(OT2X&BN+y%V{n69)$m+=VN%%L@`9GEYx|KsbFa;Dy2)vgy!CRudNeZ zud%{SH|!S^reb%A=!ajsS!Ui>&}YuqS%j>OM6o6{zj!R2ZIxL6_c;xk0t?hp5eVx; z2Oz2v@}}(8pe^z(ud9^itMouGZr|7%oe7I%E}n3OYUvel(|lP+JJ<3lVX`z{A#R+E zWfDYbU^Q&3sdpmwtGp+5u0p>_*4fVE_ulXy#u={qvS;tQ&dniyGTE%9f$V!t zbo}XEq}Js3?@HINRhImHjy<@yTOSy9H+WhUWde%z>BGR+n9f&}SD!Vq&i@Qk>~W0c z=w0W%z3HL0X#2WiZ{$$dp$f{++{a#0PTMX!2Drnb<~k?$d_}G&Koga3Q0`@AI!&fQ zvrh(0MAPt+aw8_)hDPexX^2V+Ds}2uf1#I41evXx1JrtlOMfU##DH| zKV7)~a&bij9p&+`)?{8v3LGqLgL&t_q-}gNFDDR+mK#-q7DB3G^F{n^p6hTYf%QmE z=5kof{hE0Ep)NGzO{eOM&po7k7t8x=dDmas0WK1-`z2c*HxZqheuJgT4orQ8BOAsf z#09dN@%OnF?ewnmv2!R+28&p0G=U>lACcBe!eoMPnvZ!z;Ss;fOzMkoznd9AJ}vBe zMPaWOo3VguaB0QI;Jys@C?w{9vMH{WSwPVb6&r;(4{Z+d8Z=DUZq5T-@9!je`5==J ze*v?Ay1&nr$7bmN>f3GAGG6nXfF7H{6?;R$| zH3LTA9D!X|n%Y>@_BV-}Uvpe)w2n(fC>tq*G#&Yzu#==4`h(vY&8qS?8Mk?zBPu$v zfs!wNLhgO%>iN1D^@66wmEqT*G$>yemSAi5Xi}oakkf^0zGcJaeEN`_m3jO9qbwNO z%;lhnc^TN9WW(uz>CFTD93Tv~F1mc2#Ras;ll)BZEWo?`>uhY36L`%?@5&MABm5-( z?*B==BtptCbZrHuWjZDM>=-6^4O^aprFUq z)iL&gZ4r+eybB2kITf!X9CA_DV#I-Z_enbsP%eWB2ZsO`tips*in$8e2?dULc5U1z z|I~92)F5B14(dz&sRL?Dw03p_X#;G;U93!kxA;jk>yg!S;M|A=$h4k7ekbJ6B^8pj zbyocMIrTWeG~!_B?{oY}CweREa|TNU4ly+FZu!zUrdRw5m_I;M)CUCeR|3x`j$%mJ zR~$_gpAx^Xo8cn_AJs8utF4NPjvFL@+a40q0Sote^2mBDMV$hci9@Wgr`9l>y@mVW zcv@aPZw2i3)?C3gnuuCPX{C(D=ykM*`vu9t%~Pc9O~>FU`x23hmopxg?MkoNchnxXc50!#_sPCOp|r`Krj}sHwv5^6e@2 z-KUu4fw1x4lN5RLFnWY*Uv-|kekT5fh`i zBuqTUr4On)1+ftwn#(g!ZgQ zoJF4>lJTH(>Y(1&Ccc097aAr$f5p0U`rz4_g9YGs?ATnb91&P_>-2Z^0EcnYP01W0 zCih{>n?_2Zo!VT@gKe)y_kN;!f~bg*&}@c>PLFkl$b4L$UAyN|6XY|VTWxs1b^N~& z_uk=b?(zR{dwN>6Yj0ZAh+UhMQ(B6W5_?wFuDybg9<9Avv$b;62qN~T90V;z?NuX* zJ=%ndSn2OR|2^09{r>s8p672D?(4ok{U9YwR<(H4>n(Gz%`(Q~~Xvl{-H0N}|#~wlLwPnB4`{_wSWN$|R!I^0!>UED} z(@$A&K>D}t?<-G9Lr2=*P*jt0;GTB-eMR~AmD%)I24;$!(}6faJE5m}8Gw$N54_Qc zIH0#xa$@Lp$L)nP*oLAAe!MU{JyKdLKJ@`hBckF#xp#+t+-w~QF0?D_dUDbJA9 z=RUd+=EGs`mqqI7!mxtA5c?|SaGhAX#uAe(M2>9mmZjyaZ@{LH4jmX_^h14Av4>U4 zKWx@ZR|Ll(`v-g7)67%`J?}hMiv2jpdrJfAS(7}aOXWs-Qm*SIizWr$vxxpqEtz?TpO*(4ImHk%B2x+e0}4zA6Qr_gZNFRx6^D zZzxV5ExJaVlzP9N-E)h(!vKvE;FvOV(gLUepMa|PB|L~YPKe+4Bg7?JHh!Dj!VA4o z!syu400-E=D@xWEiX@?a^fivS)yGpIUzB{FJYYGJtp$f+o}51n*Gf-lhgUqWLkY&jhC zi2p`d3}E`n?Zw^h9KiqXq{?EH1P$HLE|6QyTnj~?t3-bT4j$@_-QQO{JiGZROO_K# z=lTEOqm249I=rG;XPu%x75g3Z&^v9Pb#yEZuqQ?|=#+EnX_sxNQQX3PnT6=>*mT%3 z?DVQmymiAaH0ldfeFFC?FLd!Vw0JeXRJGhUB=8R#G4F)FiAuAJW8yupZil3>Sj|g6 zIZPb3yqLS$LaoL!edYHRit6h%jxG(HXT@~%8|9DZpFUe6|k5| zI4kyK7iBK-Xjx%xOe67pX`X9N4n2%f%RTzZa&!at>dSV^t|fAIPe-$r->uI7a&TEqsp3rIV0O#LyxEN58{|W2} zV$K#HrG%WnjQ%#~)U1DCK*}Y&$#@csXE+1&mg z)$_@eZwL_C``pKI>uHw+*WNgT zawaSaZ@1ANi=Wghbm7RZCK-8hG?#LIyynB5)K~}#ku)z+6F02((kbQYDC6x~nY?HT zLn;;IdA2NlI@Xk5h*PBn+|jM!j~=_!anu16Zee4KLb^5@gSGD#7HVy{PqEySD2d?$ zXA|~Qb=Jhyd6+w4{D2RC;O#I8S0}j>kZB>_<1OB2<(VI0op}AkpFe%C3P+i3_RU#O zZ{|JH5m9A;sj6S= zt-Dlc5-0$z)`HyjRgaJUgZull8TUvCi&-kzINZb_vc{KeX)B`*R5#Cl&O1@*#EGlq z0tyQWhl=_a3c&JhRu!36oUh}WS>@p`tTlNxzkz3t$|7^u)WZyJT3aBoY z_|nXWaj1#j!*RXoR(=5w?*l_(*3#~bc({Jpv~v=&laFP{b6Vg~cv_r4QE8-%eYQKs zak%)tO4(yDziMaN_txfy`!>x5e<5yJRu2w8Z;)OV3Thwp$C@tE0oByn-+8fVnE+I9K{7#Cetx^t z;XXK?xENQgl-w>{-#|qEUE{kR()&Hpk3VJP_1l}hwOm;4VfZ7%TUJ?hYSsf`K(LNM z)PYd>B{SNrAEx^LxzrcESSHXo+A`D1w9H6$*xk%H#E`|Orh;nHg7OpA`7 zJzZVM{VynV+|o)S940K}X4Vt*T!7+orpYptCY?Vdrr#gu* zS5U_^cAPzi6*7}HYi(w*bA^V-RWrym7~7De zEX9=|#0dY3$d#ZhM-Ln687ob?e|6<)aecc9K-VFAS<$l} zO$h_skxmlOt^dzC0nn*D_<1T$Ij0V(%TbG6n6Z8ft!r8z&Vg;)Ya9%Do%id;UcZ*e zWpVT!uWp&9zWr`uZcMWi2aJI2cu}*DW{4O}#f^-LjD87;Tt76k`D&`Y>=yo}0gy|m z>&^S+=lrgD*M zX687sjM(oh`9c&I#Nr7x)r$P~_mzG=lIHI#A0jSQ&%J>k7PkOuzgUVB)fT~sz$%c$ zsi{Bt5qNPV;^^w754CTFiBf<50Qe~4-FKqLdzyOwh6mxs**&@i09PfKhb;h6R0h!> zeYfLVHCWXdFBj)164O7R5~^xd57RlapZrzJxchA>*?Nm;QGLUpwrS~$6Y1itg-sT} zujP`BmjH5L-#>Y|!rH9Slx<*<4Ym*mnPntnc!LV9RYTFOt~`%~wpZV@yR!r!CzjOL z#x#e6UNULZ$Ba{)=otVt`rxyG8Tl-KrGR!O4fY_q;3|tWJ1egE{Jfj2Hk7WMP+xWH8@e3=kGLMfq79B`d~ z-%?5d@eGm6US!?n)=)zIR9CA7G@CKPFxFLa0L9?kH+o5k_1D(aM~V$@8G&oYlnrzH zWm5%rdWcB)qltGPutDFwY?~ban5cGcbyxJ7&0It)EwM-Nha`j-DGGlkHf+K=vPiN< zfY!8WWS8Q3D$$D<7bCyPoIhp$SZ>O66F1J$1s(U$V8LB*DvF>?K5kSO8R?$8X!eya zqckY*H@Iz0U&H6~pym15?@rHwTdLr)?0Ec7U~L+}X$gK@yE}I-i@OZ);{eQZORoHK zj$B?(@**1>JoZQe6LUCu&Nzq;hICCP*9JQkI z0ULQgCi^tdv*TsygVeOHu;k&cz+pxE5!QUdlTepTcjdAlmo6OG5C^zY_NV#bas+?3 zZF##r9y9v2=K)nQdQcaLMT$A0(Cayf0W>A7fD@oZZnijk&#|A;-xpy)uEjry_`KV& zxYxthMH7x1t3luPW3_vr6gY^-BMN%m;YC8v#m9g=4vxV0dq0CL3!IH|8&R=XJtOKT zmAr-MQ7n}^%6;eWOq``41T+?)j!3Y`6%Nkk?_{=ONh4#F${;*QR}PP{9Zf^^Ttv- zvy!jTV8A{F@#?Hb|M-KH`Bw!Fsny#0(#u$h9;v>v$EW5!(4+LS6HbI5tm4p6nZK^! zPS)CCxA{`}5q~hEIpEj@(|%bbb^Q(c1qRHPJS)D3xVZJ2YC1~FrH*J1j9*$fF?tgK zIXBhNp6l}OXTPr;%dsQ$qgW8@Ujno*v-u4G4hi`og3sdIlCApXkVS1JLR>q+!GBw&UO%nL%rsg;`uf#Y*^s=Ls9`oRzYurd7S z<@bV_3^?*lh4t-TxBxs8fFlElqT|AUUnzS&{;Pi={Z#h{7cg$n?(4Z!cq=p%5eL8^-xU)0V(DSEk6K{ zOB2*|O3kC@<7z2t?grDxo+3%WAMs#*)uI1E66+a;*N#Onb=^lPwhZ08QBq}FxX;1% z^NXki2ITxV3e?R%cB?a&9O|qobL#n=qzpWD2EbRyoIeKWeY)3vee0jYwhd+y1aI{R z0cN5BUH3DdRjBMAcu|rfI`4L7nFTtQ0F+5#ii>4DUVOioppv+xGY#h=UF*L!c14mC z^Kmba6CJ>w!XUZymLFsH$b>QU#o2_v}G$Z(Iy`o3~DR>LeLPoQ$_}ynCjX*hAp(` zv;+o>axT90uPHuJ(dM$SQ9Un^?e(^nTsZjabv z@fK}$C$%~?3vH@j0x(T)8<{I3dJ-Yn{IK<1)4BHFGl+6*q3TQv2Z+`=#k6`j<$FrG3x4&X?irA~v|NL1b5UtyflX>d!2uw1>wyDMGlrs_3Q3TQ9E#A{ zWfo#*TWCS+4`AjeLvp%IzIX`0lfI%^Vhq5b5wBMnj(bvtIJI~$go#T-OrJ=q zLyjCo+3cWuJTm(~!BC8i$Ar@|sLOpn^v2OauKU*%nI_iyU^?qSLV!6@4QzR@ris`V z(Uw?NlI5ub4Y1pjb+jm%Dfx~oNah&efAr3O<$4AFXn$31SpFzuGZxey2g>18t`a4j zcWBKmPM?%``Dgmv4LYa0EbUf_9_=AMl#6j<(h|I&p-7g&N&vI*WCs&^sY}2+S2>;a z0nViyI68qahg6y1(~wWDrPCp3*NHCm7t+5rGQ2zQv%s}WJ-z>+D(5^4($W}u9-tnl z5nR{i&Lz>Su9Jx#-`{qYPzU)pJv-eU$+I-HxL>*zbSXn90<9rFBI(w{Ipo1H zK2wc&dD15r_eJD2Eit}7Yr6bzj`y*vq-)lsE;At5FMEX%^~|H>RSwO;HY}=t8gn3$ zG7v_dFER(9%p!K)!@1e5!%gpBy`*^gt+PT$zRy$Mx#y~)78`%&Po9oRDW~KcOR6&Z zz$zS&Elxbqci@jHKm+=x1W6p*lbrXxNQ4qkK)&jLB*OJ;M#^_0ba&IMD8LclKIJ=> z|8Zy0B-2ZDVihuh?6s3|002iB&!qys})8#?cWAgxHwe% z_mxHj(0%Xe_r-tiAp!-@se$SNfR#Ht#S5LGv;^krdl83EHV|vTXnNOI^kQ{K^*?8# zbnSf+Q2zOPRPH$=@?p#da=c>hn<<((1ods(mxj>G#W!|px%hc9e?fQ{A; z4DV~2So37qL9T0l{PFzo0uisCuEorkJri2_8hxB+XsfK(+G#0yKN~a=m`x6${@ex( zMdEKnIVDiM)8*M`o&efNPUE!72SI(|MYe_Z*TYRzp+%a~wY*B^d}gR@mF(q>W2b{h zFu-qMoFbz7ih6Y(7sII3~!|Ea4}mlopgDby(y_J z(H<`XjgWXCY$QRe*l6-QtwcR-wZEXE1P90gj5Ze3kQD(fyMY( z{!96)f>sJGAeOwT^lZgcEaFzk>ViJ`0fm-0IY;GyE_!tQXsq^Z^ypy@PW5$A89Us2 zKpcA2#UU3b-bwvz^j^AI#%<4G%FNhy@oLcRVs*5ILtSu&QRx^-jfB-+ z#8rL5I1L5*n6x_ZGv1M9T8a73i+jXQMk5GGJLQ*y;FdwsPi#k6@-gN5G*^bLzDglN zu>7NaufMN~{F$`XpTr+DazoFxYHgc{6tJHzX|?PyS_;!?e58Ls&IN?n>PP;kIi zqUeFk<*&vLpa%PZ;0QkF7VY@d4Wud5jEybc>99*iBjc&JVpeYEQc82I9)AmS`=e_` zBO{&N`L0-&OWeQ1#`_sqOP?Om^rkaOvr4;v)9#cQ0FBpM_kY*>Eo%9F|=&IT&*NFQ44cjN0)H&t^cnE&{ zy3^`TLrDYsr^%9;5UKomqk~orpUH<}ETU%7;yDH`7Y_<;A$fUU17^%;$BG0~VS`5J zjs8i=dtYn4ml3E7KSQ|qFYW#f%9(H6Jrs?94V|@ZF8S@C+d`a$WizeVOcjohP^(e@ zsdyhGQ5jeucOUTo^tIb@O>8ngY=Oswu2&H_Wo@4_&aG-xOfoi#L-v??oUxtGD(6luqt+(S`G%!Te{X|PoIi>QRwxgs7)`u!~T4WIFl0FRuf zdb0!N=cAf>;tcgTGa4q;wb zPqX>(LJdBfrm7hCVh{YJe*QvCijl`Tpe;h?X&P^=iKD(+^+W#B=@P$DKT5(J8F=WA z0z_u&C0zISmCea+B=t^>1%P~>#;*dC-VGWYlB5X-I+KS;8sLkl&;7n~pKh*)7~p>J zAksa|ZS_yBKRzxmL0*p4UFb+BgMlb$n!)#XbzfZT70C-AE`d_Ax<9@5m|A6=Sf#>Q ztafULW<1SHDbP2pm9)Lh{JT3QvNE+4^JRN#Pp3mG6K5x7Wx^)SFVI z(QYp4;trAUbox7uTHlq2k3^cP1+SP-qmAP{$+r1DyG+8;fY|F5;qs;JJ3}F#<3)Z|YC|RA+?B^bX zzd&*2Xat6$fLubZ4;wRlJJ3w#v_4bg!(rOG{vxjqGW$U1n-KJ3!YUue!&} zy;hsG4`>KIT;BeR4+N@PBed!Xmk@$@>W`;Vn?SsS<;lNAOtdc(`L;73d5rKgOc)&6 zbI>hxBN(EE596S@&fC2$i_kbhH4y#iFbmdl&dDQxW*4CoC0=h67VpUVTuonmy*LqA zy?`Aa2X8>Cx_STepu7u6-n4;ssFDIlU`oR`LpfTtDKB|nxl?-Lj~+Ayisj`>f@_D1 z71qMMZKjkj*`6kd7&)W2=jyyPeAb<3-hS~8_hHx;u%W-rQ2N4Z9}wL)Yh+bDGAy(< zDZrBfCNj^XQ?-`#Bfsk@*p2zGV$QG8AnvbBpg2W(Tb00)#J-u>2#)7@-g$-AdR{wd z3{?N@E=AFj0wMAJMKK0g$v1i;>903jW`p&^!>dFMKs(WNq%OffD9BpTM#Dkx$aLC~ zwPmw`;!rNmEwfn}H`u}tGsxx{aR684q819C+#IbO&>?TtKETU2?dPOgTHvHGLejk5 zz*hGP?1C_D!L$TOIgKTc%!ns^mgRRI88{zyE%Im~Qp~cDO5(XjQndyH-LOcwvASBT zvfR-+Wr!qaLm44?FlH`V>rAT9?DH{Wyh7ylEmz}GN*Q-NY=tEm9{qyI5ZbEJ9~x;q_ifYycYF3 zWMr#1IZw1>bvb0&2@Do+3s7e9aSAje#&NQoje7&|=r~gAGqeAenSL)_N!(=DaPQI< z`yv=P^3-0~xIIV%ARx$oN}Q5wV!~H=2vl#;s;jKR90?GDhW8@Rnm!bkEfL6I8X`4=mRTj;?ESY zkzlzDi!!i2C27OCR-+_mdHhrArw`t(ABo1ep!JMY=I2}it!D03-&UZQJ3buv@fVe zge~T4{Y34EUT!@qE>^ms`o*qgs=G#0#z(@q1mdrrR-uc36xW6>-)hh2{=QG3 zil>?|sZs}dwy4?3+6`c!fy>guAYk zne^SPn^8itT*yrSS~_=E_-^CHDRh&{w`{Y#^jX~iQzM+_Q4rW5Tr{&oeCeXaIpVBT zMmsq$Xc}pFZ}7Q!=AmcPc-x8^BI zQgy$c+jAs;x4BB9*@z92tu~Tt^S~m--FS?K9BN!h)Sqna7dj478#Enm8@g%|C(fml z<#~w^A0ti|aujX6*T^oB4mC<4H%rcbtSaMG`>=+#>c<132f0BxK1AjekQe~fx*XDncr@=a( zK~O0A`0IV6$mufOMPL*b8eAsvB{Xo|ulhMcZnHje` zTS;r-6VQnTv{bXDlGP7|r=Fs%fDaArajvC^hXL8-cXK}A<(6p3W0dx_n_xeHtQ(h! zJ1YC`G=hU%UE1Sp7^oEcJFH@U=L~R{pbEp%jgOk>@2fr}UIadH4?=t9J>)(2iaA_b zKl&j$5MaNvz97bYYulvM9a{Lv604?!-<23P-*&DvoZ&~AqVCd;POWbszB#hNq~1me z)lpViFP`GTMLacJw04X!u<+R&rz~AI6VqCL0mEMv1V#Iw0=h^VlQ^zF%jlq39P!&A zSid>`DE1sqo#Smiz?>UVMhFhGNR>ofYurem6H}LF@bkz|^uQvHcii^KIeXnVIT+$& zvUy}i5^Q=m9^~Uwy%$E#QDyZclix(=_Ah|%fotNf8w*|vNizD)mpT*FjI+(a7qFginJs1C zEM-@xNSw5;@Ja&rEQ7jU<}+QN+xspQ)-O>8F&bUMI$1$TyA}6Fzwha3fqN zQd%u+M6h25Oc7w@Lqrj#A2P%_kqzjZqygTmr$i`B5?>Wg4|r_`3|ad&o?^j*c7~`Si!ruJ$Iixp%un1pf$42X841HclqKYB z@82|LoDiKNLw|pPn5X`I!i6P-=`P_(G>cr-#xEizMV1XT{H(OZEL+QdoF$>(3{9Oe z(^?WpDvK>k{r6k?;VMvkI06T9LiF@1S=$D&dlxr+Y4--PorBJU>8gV1u zd`_&3HeWWB2f89kDDegzkB&Yz7mfY9Jbr5iBV0QUJBt&!j(pbW(c1w<#b>K8R8;FR zm1LH#*Sf7$j=o&Xsz!?bCxJ8=4NMa!A`>sPYZGF@(R@4wrUSV4V$jr=w&d${=A`Kz zqwFyjtPx*aMK0KLEL+G^?b0m^@)?mLM0^NYqFI}Z@0O*UU^U|VI&0&cXyJSWKf&*m z;kkj_XupID?X?4`r?au$xwz6v@mWmBf#vXLX-mMYebKdSx?HlkHBKQwZhoz8Pi%0y z7q>ISS#Lf3OMW-`BgU}IbC9dhF@(m1HK!pt(9;3h*+BKhJAFhZ!WClhPY66t@l`Lt z>N#%h*dvYbRFjv!%+md{1A)#&DMqjb*ikrJw8XH>S*Oq-aD3n=5Wedum!+Ix&0vGO^dF zksd82;k>muukLdAHJXl567QeAJ>>&10j4s_*XI_X8=HsiWI-Vkhb#*r4X`JAC=R86 zN4jD09=`(w0hqzSTKBR@@5*>Q_KX-0EM#Z+Z9Plpj(-AcWs?xFxmdjCSD)%5F$@Anb z7A}X|Q)x-E_JcpdGrB33(u#DnPAI>vrHd+3O(!ztm1KUy5=h6Zjs3mfvLvfAPFzMg zFERR|1)fu{x0(xZ?H5!1LJv)(QOP;3cs-wY#9Ug}M1msRT+xub!1aj$$AMIpvWQT{ zv&uF-Q*`R!bC+XZS2J#Vivp{I@q=W*RBLF!i6YW70GL$@PL@t+aX4LwHcfU5cm~>D zzOkh!_91R5A#YNGA3V2N865MG(`jj|um6xbT3AqLXa9Eq`zyGtQ5+VhHcq32eBQq+`=5s&-U}3qJlbZ!Wdx_~ivlZ3jt& z`Va;==X(mE8sLD7%3qSeaZw52^a z!Fz~PwfD$#ZXiO?n;TIsD2f>7T}J}uELch=_zXe{25q(Uyo3_t z!Xasn4E~|?3H$+SKWOmav>bJdWDMv%a6aMCYs(PNyXr$KxW!+@_f;qG8HM-L1hul`4==Z_x*|=#xFi+$*eN1s1%Bie)AuuS7UcwNVK`eYa%zTGhlPwB z0YJ~T%LM(-x$0=6fF+JPSpE?w0a3wfz^Zo}vg|SnK-IE#maN_xRZb0I= z9o?17{~i!Z{odkKPjkQ-GR}kfx=KS8-^nSWqZE=KZ??66^C_7Y>G}o_@^sv0Z(sH!T;?Fk(HTigI z-Zf)C%}ZC*jySsyt2gQ^QaM}ks4|LcytofWYmoyAwqBQ`L2cm0LQp`~o{?O|E-336 zKzIV1$e6v^JLg8WuM(dMQABg!{J!FgF&P3>tm#_9FuK(NA(mew#x7XPlf`NPy`&&n zZTfvsl*ax=>fg@QDv5ZTg9FPUn>0JkRB@a3I6m~?x8nrm) z4zDl!_h&g$bl>x{d9!v61t&B7@)!+FXq$yRX|6NxY4d2M*@PvB?7)(7KcbhT z?~wlF^-JQz$-Poi@Q*pd<^hJhtuA(d?Th7_Ou`k)y*gqyz9oj)*{;-N{yAyD9>z86 z;g-i-U5n>@V3MCLSMwZXw_HXiIPRDPMXTw7&fAWfYNlO3BE}b-zWp5N^1a8dNYnp8 zi>(mUwy*b+yJ><8T2?)MDVky>F_e z5&cE*E@{`xRxTMVgBy>d@{=}O{oG6J_JmmXgL~*GgHw=>hwVjEx~+5KGjM3BM@x{C zgVAM02UG0bEBOp{@O-zgdbCSo~%)&5z-G21XxLCU#+jUv>m0aRPiPnIha`lh#MN z4kHA#yJ_+rGq}+RZcn0;3PFIA_k4=1ShaX!GI<(pT4-QOhQ7IDx=#HpL^P=dn%!P? zu+tiHF_*kfs(t-}60;&T*~NE$AI?EcD-GGhSmE81eT#{k`DibzR?eI{FRn$p-P$OA z+ebBJr4&cb^nq3&kTxzKwSx&CXSKlFDj!zI#Ujw>JaYg7Ua~(e-vmWV=t;J6Pp@xu zeRsE5NpT*Le7r@R>jl%q*c4gdX_9$rERS;E;|{wSa4%ar2hFkW3)zp?Jf2I<6l(Zm ztZvpbRi*J3!nOX8akB_;T#V&quKHg_3e{Z-lp`eZnKsyYJL>;EP~9=c^n@CdUS@Vn_0FLOzQYj54& zB?-_4cxt?t7G;YR*Ol+O*6N#^*)mA13% zbMYZj&o?7e-66!9k1u_L6Mik-H?G0_01SlaG4vKh-(rrjSC8z&#JezoK=ynT|GR6+7ezuUOnkr@5?2zuQ2b# z>Bh$|=DX~A$FC=1$ASh-NA}Kn-+O#RIZVes>EVIWCX7hw!L(PZyp&o1t%KLqFew8H0%zffxa@0d!1l`BnUAfl--01@j-&hvdw&cb z*~};#%R70#6HC1NRile%EBcPJBX7BoSZp|6O6RF{M;-ZT{}DQ9^0jZ7;e^%tX38Df zz%SD4DJ<{_h{E-V@J6@aqxV_7OM2|gVC)vXg z!1xd2BOC0)_u!i!1~JhL1OnT-{-}|Y!-%y_9^d!2zO|S_@#X8Rskw&RrO<^m+J~r{ zVeyq!)?OBD7Lv~S&_cs^5rZKc+<}7zCh`E~!q$;%a%51tHaXx!*cJa8l{8J!&kANk z?$#Hg1Td$jI^f{TMgO{Y2KB?L-_;z1kHUBb772Dsag0Fh8NAHT&Z&&;0C~*e+!Qf? zNd#(R)1NF>sd)GE6<`$cjDoyWe{w1HKZZRQcrPS77(#@Qd*-_3VE3#)k|6zli_BOp zrEde{1utv-y0i)Bmye{CxeqpDJbz&fo<(U}G#iwhI~E3oc#W~T)lTAK%hJA7uI-iY zJa5o z0UwZmY|aoVRjioU+Oo$|eMO)GKC*SSj9wlzCbP@oS5~EkXx^kWsUy+Eml>Nt2cel(!DVs2o=dncagfiip8H+n>(vl|hBydPYsYQlC}CVW%KRef zB}F<#y#AY>7Gzk#eTEm$XG-zJt{u(5*5WDZ6kq~&Uy2O6OpO)>(s8#)0HfnJWkI%h zE$SMs^=~kr{~6-V)YBQTH*OpLgy^Lu+&a~zPZ+girqyZ>63EVZ{g0i;Z0KAEW;)_y zsoBn{E8G=)q|yJ(pPM&}2vXjCUe7V7>}&nBV#iVGd!_T*UZm0nD4Tzs@F%V+7a`DLfj$uF{m1Egn{%FHedypCW z<}}KT)iTQ+(3U>J@W06O4i0%%KmWavC+_RL?`~3ZLu-3b>@(85^doyQMf!xYyC4hV zd>$LhHr6Z9(0q5Yz@1icnd$rf;C9|$-|r0{etE9dD&2Wa z+P1*!(#!gZCN}c1T@I=x7@!=zYg=`VsBe@I z6cMi3`<#6S&Np%=#acYJy2{+b|3`d7MU}A$>t^MP3{M@#K!*IZYJPd zSt7{wBX91iw&vv&V2ZdmbRPUhd)TH8VmWwb@#v-)5Ub2I?-nOB(?s;W<+ zOjv#8lN^;DP+tYNh*snem;Y$HYwjKBu7wT!6o4ycS}3$&JaL7gyK{Q8qOpb#Wb6Mi zoZ60PB7e4#ai0#}`+&(_w-!`>*YEGr(A9Y_#U;HLM>6DE5Aj5)Ifc+A&D=&>@Q9v$ zKU?7>bl+RcoALHXvbrs>*Ynr1L9QlOLg*6%EZ@|tsjK4@6k~j#g%KQgjaB|3ghj2U z2{r$|a-e>0;CU9BP8uP&r%^>bB20>zFy$14-3+{k$<~WZZq1SRW`RYTBn>^{?NZT5 zD|Y9sn7u*OG};>pX}k6PYkJW&G2ojU!Wfu@7|jCwvkm<}S=}Ir)0mk+*8@{t;6_Ja z1B*KXa4Wo(AZe7B+gBQ2y{g&gjMitT=T>`n_wiKyTlapT02z_W=BkyBm_IS znqVGF9*!9tYHS^_oc{$w{;T3d2R9;(6Sxwhxjb8V#j;Uwl{qaj%A6&UF)kOE-3(#e zX>nxgnf(FQ^mfMms&6o69b?qcjFNnLVA-b`;CIWoa-%&&`eA)=9XANpZdkgJgo-U@ zc!;v3&YEF(y-Ko8JR=R%9pU32IvYm^NVPmJhY|LgY4{bfLE0C&+wt}KG zp(~ZujC3}xFU^VO+iNo*BU(dtcKO|GWj*=z)UMD@$Op}ycqDtbI9zy6jHKO%NLbON zIOFXKRibzafNLb!3D11pJD2zV%s|=lY_igVMy( z*4RuW+nYXuWEG&d6yh*2Fot3$P>y+d#*!5lDIZI-O0zJ*rIVpAj}IMhkGJ`8fe}nw z;oT3?3Tbifsb7Mm-K>&}cuRMtD}jiiYqqhTPYVr|s!THTQIeA=$w$L1-g1MEDkLP< ziFG$xk@6b}}R+(?bx{QYG^3$Hq+kF>V9?)3O)6LARcF8HzH-3`pns>uhRxkypMc#St zu-()0pbsub@NxDvl1-X>3f6@*pKF*U0SzI+sYnXp&(75LnI1OjkJ zt_1L1jAyqfv8J<{;*PbwKfL0}3yegLHJABpCu?tU7=2Q;m~wCFu5bVAD`%t)K3n$| z_a9zWP?RlenQZ}RDsQ7u<1G-$LCz8_c+r*TF>*b1&~?6wd%uS(>0cNB84i0D#p{kW zfI&c2O|~I-5?ib-VAnT=Qv2etfD8awjYRVviiB2t86)oq8BIan{}^kkQXf(Zi?`^z zaZTe#Pw8$1ftCA*+q9ATqJ6!ENH3Dk|G?mAM6$0kG^S7uvDOiks(q1l>B9Ky6)B%K z-rCmjj{8)3b$h+C{QP&l+*PiWeyf4j8qBQEPUM2!1~OSlKuZxGI$KQQ8uUwY)T9(v z+g8_GJ5c7ZXRQfbhB0BR#@;2iyIfG4?OC(Of2O*Y*)1&kon90!DDOGTb4&jz0On+4 zj(y#jQEbS5x;UZUR=On>RoSksc=SUUzaoy`HxKB7V0pTu63feYl@;xy#kuQ<`J35b z8I75{5PE|VD_wOlC7!(5WTeqf}a<=$e-7 zRC&s4Iy4>bL!TVqga1^+?MF#Z36BQx=ie(1F%rloC~))Ji%13aDHCTTr`Pig%*!{v zm}%`3B(|dxfkyGa+5A5dW3l4#atN>5BuSJJL(Wf?{HSt|j)^pfViMkg&!~>X`z7|O zn}hk2S8WFDkI%cT{cD-}P|a!3H=8EpEO#{r#8l;&IcDRFpA5^Ho5;{l9tCUtztMQk z=n6w7CUX#u*j8g>3!Iem_V@V%bMlOzv(L6^a}AsD+1OFoXrI0cp3m3?XAG_hFI(kYZ-w_vJQ@M3b3KTvw4@FoYCNZQI^(#IQWK=_nozND`WTB75J zFNXwp`uX0w+6=nnx&*wfv{c^J7|%TZ_q6wW*zdc) z@9wwO@3;Q{_4~hTwN}fT=XvhyzV7S#T!;I*uX{egM8>HStH&jeJii?Gh^ekpTeFfK zY`SG}oJGyaO*@OV%}z_Wn`4a58nX6Ko#OSKQs=c7EuO4dccA3RjprxDfjW&QO(v!B zjq4e_!0n6$>)hs%UI*+Jm44c>NwaEK?csuTM(q4`Q|qViHga+@iT6Kpo!Wr~`$Mzr zG-TwOdQf3;q7&5qt!9~D#mymFA80MN29f7tg5Bq!nMU1hUHPXr8Xfp(lW-z<{-I}= z_Fi3_x_Ke?YPON)LyZEBqaxRQ=XHxdei(YQF6iwya_$5FBz_1J>)q4+O#Q^2BOh+f z7}Gho?<(y=-Nv;gHuFx}^uA#!#i^b8U7Vhh9@y!_RSvKp?W*0Z)^ZgdXv*)_dG2|K z;&?T0E8A?zJMP5xrLOQ zs~_2G1&HSttx=b#pAIPv(Lt8HuJoL4PN@x=wF$=-I-W_J}2h4T{w z`@QzZW!l&oPc2we&8p+}Io^1Tn=d>o6xX@r&8W`T9?ErowA8RQKGV`blosaGJ;5I5 z6t1Bt08Q9Fv^4E7?g0HRE|W3MT`Bvi!nRwq9YI`&;M0M&J;Dc%%3@>Z$OB1MQnTXc z$JOb>4W0X$qD?N1mD0n3B9V{p~W6DK}|FV9+?#{EF^+k2|G{NDDkdxu*zm&P|P>-r{aFUz@P#TTQZ(T6#e1#X2cf}ib{i>zz)*4=+n?pF8VOF*<+0zSvR z-ihqlSKXAh@96uZ4wH?FK2})$n$Dln)v)x<3K1lHiz`w^R?ua;AYnOb0#`p6Qyq3k zj6j2seU%_n6cemS9;Odq`#G|WbdUz&YLBV5gQAj3hT`rp4E&<3(a2!te$ZT}i?dJ8 zZ(T$1?B>ha?~XZ+40p}(b>#(u4W=LUp7_yij&dtdESP(Ij?rQI`uj^4WHyTSj0lyN4vKNtNYw# zV0jO@{EK<<4W>4ycE{z#vgfs^wdm5*;g%D2D@3;|9s)cmd;Z}=dvBY6uAuDm=i%JQ;j)Od?3ls> z2b>NT7MB!Xel+Xnt7i>eYFuN~)@knzT|-~0t-*D=X_?iv+UacTp@pxUog2J%l;ruW z_etr#`^Bo#H??~&!ZED_r-8ih0yBV|TiTL6UE_1Omr=IoCLiYnqq7J5b|u9aou)3_ zID6Zjd}o#S#qdY{;V6-6jlln6*$4xQ_uy3LSJ{QEqS`zg&uq)`U2BT; zuLS0#mB;b9GC))txnZ@44N*x%K5o6B;sV?li6HJW0U1W?rgcy$rA%K0#PU zjjeJ@eR6j3t#{xSo#_@^cV@0!XV~nLVYKVBVO8~d(Z>P1BWM*kavZuW2_y}rAd#{! z9Iv3+5U*gb*e&y2z?s)?mj5&Ji1Eo)>B-d;6=eCZM@WIPMvqF;o}$XAErq_QdBN#7 z^B(jeC$9A2FUtyNBps4w$E2RVk?Oa4-}*dn0Z3!pE!J~fP?WPR4{D)L6yEWlVn_Ng zj=5r4wv*vgdi>KSN9_KTxT_?;T#_kgZ zUoIY;Pb9gNzAJa=j5x7Nq+apx^RpWQx3-|XUg;_~muJ_8MiwNqO+UTn-@dWgRxqr+ zi@O;(bN4fxZ!UIDogcRb^go=}rJ0p{1A5bc&V1fo?|{3BRz)JsPmwETgI!G{yW_V+ zdmk3kF6Zx*rg;<_Sla!X^vkMaXJRlK69yqw=s5JzcsLwPiR*;;$`XWM+WOo}%Ui-t zJ0qM}H6tZ!r|$knD_<|(mQFY@?}Ekx_t2B<>DMprn|KsYNqF_^r+SXp3vR)x70cgc zFK}H>*z)ez+-Cug~Q%LZHE^!;)>HwlaB*Z=uyHRg)EpO+(i+-F`@h#J9xBl7Tb7d`U zzuFa=ig@*E9IVZ1(^|d7yN<8k$56RKz10-Zwe$2X&&Rjb^Df@cw-66C4e?#O!D%aU z$Tw@|9aE-vHdxddl@?_Oege%i3?=^LyGJY{!;?y6DOJin7WD zvNP?~UTO+zq`?PbX#IzkMGEUZt^LSevv$J^kJg7CWnMiQ)c9t7%ZJ&Ai;D|NOD?p{ zo3)>z0WBpG6SZEN>^^XO)NB6kC8ODfn|Fm|jof^v8CpM;3gZ}4Jgo>}p`z4c}Jdd-^(=76T zQs)z>jX!zaDI@P~%~6@o(rJgDyaxfE4a*JmIMbgVx9zr9%koI^-St`g*I$c*9qafu z2kLA#rL-_jn-({jZs%aFg4TRUG+k5MR(ELW=HvMbq967VrsTB7A9qb$@L}`KmQ;-+ zk4-z>8U6_%?Za}s%EQ*<rOepj)YMO@=&M=$uI^;xb)zBK zCk|Y-?fkZ)Gv*R$ZU8h(q;cB0u)$78bi^P~6?!=>a4hKw+ew_1mciL*lovu{o zn|_`jb`tuQQe;qrpYesL&t)(`16VAwAmJ%wfR4l@7i_3y}CJnkI~Fm zM(d2+Znj+Yt1~##e*De7qn>{CA@e6b-hEvZJooE|1HNs!`&YdxMA)le?9RP>(bqlK zUG-w!+nUz2YQ5N7?$AR{4C}3j3sL~KYr0{F{R@8(q;J`5_OyYLNAHETP_}0zCw{C1*v7~6*&%}9opiy+5 zSB1wd0Xx^~UEZG5hv3eWtkk~Ud9J72a$U2&@-5#ybKdc4$I}lV5Gxr~WXx5)d|wn? zO}nhORu<4n^d55e5;|U42df;GuJK2qGjF6Dl-ecYcR{Fd|g7~(V7oUzSlwP(@pWO z3f`wqS6-d*XHpzL)7;3dm^y70_SaKT2Z&;YE{%DUSw|EP?S9HHtABfC z6;Jps8*O_(&2JBDL+mbJ)!WaHo~SW8`l@to1HIOBX-%AGk;0&(IAlWW>5}AC zm0u&%pe*Brd4^-th|y_=OL%Xlb}ZjhSc25LRn^Sux?hy$bu>Q(7z;C5jA$Du&Cd@g z-yyt6Smkl#Ie$=IaU zu=m^Mr>paQ>!&vuZgyI(v_7RyJvLG4|8Jgn`QNoWf$gOadn)3fjzp3$y2FRTjHeVO z#~c-fhFb`6ah1!$4Mht;qWUAGPED+jdC(WRv{_1-=&`p(G`ESg&wT!f-K-r48_nRJ znTKrF-pN8r)-f$uf;$L(^6fplA`35P$JDVJ3szI#DY7!0vP|YA)$G6VX3y7OBS+RA z7mPJV*{qbC+G%rFuj!1mXw1I5l4SVW^qX$Ii0r5{=M9>>u@ahg<<)Z6#Neg^8zI@F zz@~-tEh3(`dS5swv7hV*{LK`Z&u}5EhD=aUR&|5Zd_LG%?S#h<*6n=ohC3+R8@Y&e zw%4p;{(fWZ4!@&88L}1Cw-=b-{-W1n?B{1tQTEKw3DoKrSw&u*NiC>CjNJ`~pCuk{ z729n046(e0&vU!^tUG(BrO_?H)=jOco;O{);j6Ca(4~;~4>Z{?5mRxwpRFCELyMIHAQ|Q|!HT&~ewtcfp%sWSQM8 z(D65~hMX!$@$noP$2dv&@p5>wSrysnKM(5pNIVa&JMf=9 zju98(W!uYfsh|`96zr;&5x{|BRI!6^*N(Oa0Ro{~3aJEx__G!^(F`75qqW!sU3fS3N4 zU|~cyMNu}6ft-(_UtW%5dIE2Poh^pyIHoZgU2Gmlk@(qw#*DS*ph{x&BTkq?G)FIS z)P~0~cZP3qI0Nuk`47zyuJ-NV$QPEI$^;)>q|)aC#>pR9bi8awxE7!^_>wjJI?Smr z3}$?Rn9fCiJ;UGLgD*i~hLM!sh=|Z&$&V}rPFuDHe*KwCLU6qVB$*jWzT5lP^70nq zt``y@k-LmQIsk9gLS}MCakp^oA8-owGZe(4190y&T)RxMa_6gp+V}KnF#xW3!5b{xZ|RCM=>*!jv@p z07xju+YW+#N6i$x6d zrt{Dh*cpMK5yKR)mE8cNbgJ2Z6chq7fR#Dh%;nVE&F52*UD|lMf3Z9sUJ3dE{AXRi zkJFLqqp`T@6j-+9ELgc8V@O~}Dp2}qq?izJ*fV-7Xazz?ODcXqOemA!<}NM)F+3Z8 zb{s=vdf8h4i26WWD4Psg5=)tzNThyUFpeRR$#;JU6evP6aUsB=i>zu`wiE2Nk&sGQI`(6< z+9+uy&jGZOwjfZKSdVi4Po)Le%|93gtR8Uz8jGI}b2nuInLqZYFa3)lfvZD0yr9lv z;hk~Jv#XAh0rVb|MJxW3W%vUS{S2ly@}ityUpW^yVglxe+*8c_lb8N=?Kl&GG+ty^ z192`O0r~pMVagMK%#e^}3v7t&YJzNM53n@@cgHanKQ_ULj_p3^T*9;<1`;1?2TMwN zM}KS`Y=s62^)GV}8^=tFqWniqo&jQj0twA%ueJn}OxldXeh2`UAEgzN>z3=wWJ#O# zDoZLq7yh*pDX|^grv*!_WsX#ZT8cRVnOP5-@BO*WgZ}30e1|f;@;Y7z`b8p;?Rm?< zj(Rb2Tj`bmIvV^x_^W@E?7c9S-V-JaW}|cb=IYu;eiqb+2LA|=6k&m#-iU}3O&30R zYgZ0a)j7^T;#tp_%N_C8m6?+%BDWskRZA3AO!1pPfy6)Hr~^9RxaJFLEj)%BHtnG_ z4siHCWMAOwT3G~;6izfG%y|nXxBn?n{F}}mMgTBmh^y!_x1Kb3A(t&4{t=$Q)pfEk zFd9EP!ct^+g>4JYZnDUxf2#0*920<3OoC918?qys_5w#{^A&(GUqGYvzZPionkqJ< zat5%1R0jZ0=imQNVIMH+e+U^jh;UpEtOvaEPj5kpwO`Z|_@|Wq5t`n@T<>sea0s0& zGv%O030TQE2G3`;{iPx)%fZ!0nWXUf(6?h?zM~M7@ncM7$bw%2@E)sDTEk2Spbr3_ zzFGd*%P(cYlu=wc(7zbx*iqiV2T(HkCtm0uT{WQfFJ(dCKwou42hCsh@a#$+8Rm@x zbj)XZ{D3Z!VhIvRwgM=A{#0Q!#`6WgH{=!O6Xr0ak2MtpaJI0@?npT7yIIk!ZiVGNu;?!I*3c*8UtD3AGz zL=zBH{~CX}p_i&<56oSuTs`E^6C?k=>~Cbpr@-7pvW0ZyO$son1}N^YaSAAXld@;f zrnxUT1lcw-wX;&RS*j`dv4Gwu+ziO~m5x(@DeI5nkS93SUj_-lxCPhX<%Z-bAXeU8 zhLQ5njXF9c!CxZ=a4&rjvq90^7cW3TZ1w(hc&Pe6Ed*F9Wj1XF#LeghFVSW0MA$%x zHvfqIg=-+WVdZ4RW`BARQ#WYB58Fhh%;!5dzfgwO_viv8K7@59GP8fcw81qtKInXd z^RO_#8N!WT{^7{b2T@wl84F%eWP5sWu}G~+uT1-|6h1}ne-&B!Xe}d4My)B!N=Ufg zTh?|re4upB^F1H?Hd{Xlhzd+x@gVVN@?np?;gK_DeSVbFnX~)U*uITf_vj9FuVpLZ zf8Fc!Ah6nV$4yqOx$So5;y0&fk&Nr!tlTsIrgvk|n{)ZCJ$Xf=*Zvnv4@n=GAnEV*|~1kDdW)>8B|rLpG8vVsu3uO~j}COchWxM{^-p*_8}VYcR> zgAR^Ci)hS1`m8lX&|0}`7mq|+Sl7AaV^uZbbHH)pJzJbUbw>|(&la>^NbiZRE#J0n zTB>MxEp1xYx|=5)3^JV8StQTh)OU;67XRd#dC^r@Qrn^U`VF}bvy+=|-R;okB!;`w zlC=|yiHH0c{kLhu)|=ek?x>*MxDkUhDnd`*X*zJ_47~QWMUwUFc6r+&!iVQ*XM81X zgTdRD%m%HjB4?^ie)&B=`Zv2-LiZYV)flK>5Buu&>XZcW_E)6g$`i}$RKbGkQsQ6O{Cv_xfq%w`$rhK=bo ztH8`r@F&my(se0MDwp6oU?Y_wZAUucG2YeD6IC7MFRI6(C8InoMu1eBJ}G??V^q*8 zmGWphag!DBc3<6kE3_P2LwOvQXrZ$6BCu2f>DRy};#b~N>!hf|-a{xM(b@-*q)!5V z52aDq9i<(5&cc%4>eCXX6{Ev1RrVMor-jCAV|*nHRw_tyGyR>5FgIt&6+c7CqXUEX zvw1WgIYQ1$LKpG+)O;lS7Dsc!_{%^51_O_tf}zs{a{3o@ zcD(R(s02rXwqqGlm>LNKB!+CxDFRunpUz(a9-y2q=Ry2@jF}{zz<%vOVyU)DUNC9A zo@1Id462Q{ZLA%&l;QQs=ZOk_RIZ*nf)v)<<^U%Q18Bb9W1VO^XnzS%ELA`+Aurn< zn9Yv%mbw*Kd<~mUYmJ_(#Tb>31zF(E58BTZpaE!TB{25 zpR0HeLXT*^4h@!~1O-fW0{5b+h!~@aW3%okOk@FlRzU)}3l5k`I&J4gZ(W6Tq>fGy zLtl@YdPI{&rXtq`98!(g48sx20@=uja%Bg=>n2rz8Pd_2wq@c(yzY?db}{+0$$)*m zH;Jk%V@6uXdpC<@QRWo!sLKS@(Vrk@gZta29@64bPm=MEt;Ec(X#09fI4P1&=wj2x zKD@!03*|7$t2{E?Wg<)=q^IwnhQe~5YIMU0k~7hCfMGyt#GGfGybwClYhSDXATm}L zKaTMnk@SVeVf<-I`Aoy;!pu{265M5fNv~WUC`;8tA~T~oDN{^-4UzICTH_e3m*E6U z9u3GqBGhC!VGYa#5e2w~%H{$}r@cHR$DIrsplr0@3F|k9U{0+CLL10*ejyh%Suo7h z{7-$UC>@r9R|tAVm{<^dF-N=4PlcJdDM|Hze{4DYkSbsT@wH9>*|OiHN*?&0BCJzc7)_2CZGzSD zhb<+18<&X@VIzQ*e4583b2>j7jigX?k6{IJ(2SfKPil;c968jBFiSPmNObSfGnPmx z5(e~rAO&M0N6$_@q)Ws#o{w&~HEA!NpnyFR^dH+oi!Awc)*?LJEbrrI`)RGhJ&%YyhiVdpdjsfi!bu|ErG zb@1iLnKw)`h_v08zSwv>KQHxjbXt-6YZ_3sf%(@5#~y6)jyrYl2xzk3MyR!H+RKw} zubHjshu%Yt zd@b0wi?gS$)#cnxU-vwZXjpf-!4kAV7BIH=SZHHawhVn`tll?g-p_51!ata4?d`x8 zZ(5n;)qAmEtZUHEesXu|(@l%%+Zw_*R(Ecq{hj13ufRNL&wZL*@xJ=)4MN_r_)bxNM~Hm=+6kWmZOaq>OGy71|mI&R@l zGGptuKCLXjbnMhmpd-Xy>V;!%dw;pG>GpE()7q9lU7xY!dfByCueKbuKEEiMkhyth zs<(xc>BSp2kIv85+LV{Od212N<3U==dvrBzW2JVnr`@syPrILDw!Woptgvj!-<)r0 z(F$4wZ_;Arf?hM#0j}{$u3PVWS;|F{k?x$AQ%qP8h0EfMl3q;sfl?e#T(3+X5s`z@ zOGWi63I(k5?3Snn?KBn5-fwnPoggiK59X{bk!Jz%?b2fL9#ag!O^F=3^18%Nu2=!8 z8Rwf(a%un7E3TT061r3NP0!l7Njv%WR^7|Hw!Ga|sAH6~q+@!@t;J5MeeXaUQ|h!` zxvpn+UR*q>%kq`;E0cJ)GyXp(`8#AzyIAKf+Uu!41G|4ge0`@Ocg-D7+vRPwhXeMe zT+eX8ZoIW_`MZ3NM_lJyN~hwcx5n50@MO`#&I8OVzueo}vh;SleatKC#l-G+aY&`# zi_v|n)qxs z(ssXToDTQ-yaln7Aek5(T@AdILr+FYI-R*2^R0G!Z<`&%B{qK9ds3}J9u&CE;?XZh zrzmdTd{R2i$mps5!mkh?84KzqOow+*BXxmW0|uGwILsm4K#u&JJV45@hc9Y=vDQ;S zG}?pBmVFjIm{^f*#25u2)k)M0!$Kpor0EXMaD#vWU1sQ{sK_NKJ!_4^gk?F%5e_!< zOPV#wHEhxF0J|q5X99pGpn(#zslG21VZqErVs?&BVuiH}j*VDUTcWVyWFp-wOY+sl zq|_#C$S#d8ua24v+zB=!lDQZQ(aM)$z@ci97DEY`LMaoSw=GdX(TjG<<|Cd1z=uoty8oG_Iy{u=mV z95VskgfSq9+s@C_7qp+}uzICDK^=flE42~+19$_4KxjIjz@S>bkoIFoc_nR83rS*< zm;>?SFnDn>moiy>SlR|)WqB;BD(5|k#WE;S#Y{tD-B8&6*o0DW z{YqIg?z@e%t$>>%0tXVU;xTLF-X$F&9V2onP!0mBKU z5(J|1$sF{Fg9+!sX_ICjigV3iWO}m+H4#c@MwSoT+LE~TGa10r+1jeZ(=i*Z0tQF* ztmPz;(iG>kSja=gj3-r$65Zz`7~c-GoKI(qs_NA(nZR`M2M3T!3fF#`lF>>u&w>dL zuwHjScA{ii6fk~*Zvc zIs$463j*d#K=FRTvz7HSZA0u*T}+}adMRF>*u0G=4qmQOksOI0kKlyC=Kz3!7ovB5s1kqWn&iWj$>3f zBVsWfq`4PQmjFTfeM~(z5m4z);gw7nK2*`YPY9yU}Yyx%^qzBcX4W~~5 zUM5I{OJ$wsr#hCntTk;N;iX1~D*~b*z_uaH!1zFRJc*TfcNmFPa+OKd8ONk*V;t%x zYHtQPG$~5W=urM&ArCKoQI-&9iXV_|rInWL!M5TfSkiir&OWv%qMU^IyVTHIx zjcG7}-EB5RWUy48PBA4#TE$H<*OWlc@O2447g>930-fJ$Kh;qeth|6EmXD-6?APp- zeT7rQ4)XM>&jTfAOU2roL;3MTcK)x&B6R_$!98v**~X77Ios;4PP} zdrY&%3brx7q;S07|i5AupKr-bBQdgP`GoiHa!o4tXG(Bb4)^+oIGcV&KboKMoC(r(nG9 z$j^;*d?m+%pg_WVVqlAs)8snC!|5vTL&tocTEm2zR+S#g1z0c0KX$?GkIPETdyh)TErtZO7YxkoQ6hn?Y(S{&oFd$HjTTQ|a5_K=>;f{AZ>^mPGn z+fJ&NM@F-Hs;iO|*sgfV2tQY0I7=^J;C&>-qCss@b5&VjjmS4KH!&{%!`zXzh;v~_dk-7lo2m$t!7bzj5G!Q`Ec2bwU0@j7HN2U#;5fDXV z1}u=H75FsNl-STpn&vxni)+w!B;oSPM|n#tqGuy3<4eqEL_gb6mS|Jw|Ek=c`8DO` zlVa_bb%E11eJEa%?Wi{J_Celm{Mp`B&sZoRWD#+bQk&(Ec+lt_>#v&CRzN}71{7y! z_zor_RQ)rkp&Jzd-K}BSaV|{>F zYXL$T7Z4f>+S{`+<_Jj)A{}YZcgO#7wY55IB51Pe2=%6W1=!aI)`tZ&Sw#R~>%j!b z0{h?^>45Cu1c0Gn^+7~AB3Fm)FoS}@)U#%4zgP(a$WyH3@rfpEc@PK(@l;lc7{Y@X zJQeIEQM%-cFqetm^vKVq;EqoT0*G!sZE0&YJUGfH(L$$~5A|aKP~lk3BN`ZRxKJ)* z;>E0J`Q?|AsG%M|8STYKR1#FS7JY|Y0Ac@l3PRR#$ zNExzafbD?3^o=+%#Vb|RJYqTc@qE0E&_b2ds-jRG(!jJpOe*jt1fk+6kWs*jWiE@c zEIH~;63PSY)$GcHr43M&rj(Z$(WA*CovQdX^t7XZA_9O}qO`9SVZ-T@^plvQiVb#m z4XAn`%`iHf3=$I$Oh_z2qR9)Bv@!+6+{w13TVZSiQAlwTmKFfxS_yi)0H5Iymatt9 zRs%`rj>wx6K+x;WBGssJ7GXrk2+eQlvbCCI;XAGDUEcg#?)U- z1{s|ZfmN2!9sZLyDhtoceITX|?xX^{!5*aE^*I!=ta&1?SE6u~MI4)T@vQE1Nq=DK zS+LIX4wtny-j)JJy24W0%L2akLclgA0UpO3z-UZ8H9_zxF+!c#W0xwe14)QOFZ)b; zr4r=4t)XVDUaSaG_|tgy(-1`^@IuOgzlf*P96-3r%oTiz(sq<}3}G1DRGjnYKw!8l zRQ*{rR%!n<=2O!b6TKmnen`N=DGs%q2O(w)L>v7Y>eH@)skTsQ4h^i*QE9i-= zrA**lD$Ns#UpH}9ya?bGo0JbiQv&;o=_D!Y@BpIO5+!!&wY*A`emL2=2B^lzsD+8P zh2T*TK`UcndGq2dcsuL`x1bYlkwRY1M~+)Y9c zcDo{gDG>latJQaa5zZ3=4Tw{fUnW+43l%X+Z53g-2lg)}5&7*RhNlXXFBwe1Y(J~X z91&8KkZ9ZU646hhen(3w;|b6~3$U&_-WEt9>pH^&gYOz_hUHfV z+Dk0bCpW2Tf}&9%1c8(qGYpy28jAJwrb_fWlm!+*4dk#V21grJ8InM;%@gnriK_k# zHpL&`YmYmQz9MLJJ+1V=l=80O#EQ4JoS5vp4P)zurj%B;xLl99Fl@4F;Md!`6TdCz z*$;6Zl3HybX4iC@ex0-Ap}6&h6J8dyoA0hp+47FGZtt>|-TD@JuO2!IDc~q?wUx!A zN#VO*K6z--KcnVg>C;Hgq{S@8J>c-{Y478k1cF}fz zE`H;BYR8JFt=^G)^LjOIyazW7Tfj?R2-`L#35WM#eWDuHe$v}_k+f3Zz;W_M4SiSY zl0#a1@?Q3}rNj;2@^L-$Jn5)PqQW+SMe@%90>xX`6sEF;&+2{A`z>Gq4VhxD`amgt zkpvHnVx8hTz2h2GLK(=;+)HF|9jkiHu$RiNUw$9HQ&8ZV2XpwmGW)TZcROQzx`E&-+?-XEA>*Q%a6 zRvJiy1l$$nlT-)$@fCWmc#Y7Xj)Hc;A5tIH1_ug_^7dJKOi7hh3BKJ z&ES5y8f(=LsxR+QL^I404J>*U+aCyiSN-jG!KRwD5Mbj>sOZe2;8^?lRJe|-NHiJ8 z998B00-KK6rmWTxFohuaqKjr2AR2RVLwjLw5@G=@1lvX>v_rptU=65l-3N7~QzU=? zS*}OVUZ5VtSA^F>!V@^~u5xfCalZ}zPWhv38Yn0)fU7oyg&$HR05|XL2H6J&3s=ad z%5=H`@nQs0awry^KBEB?8q|y}1evzos=R}IGW_)m34hXu{_OPM_z0c?_GZ)7VGz62 zM2iX^L;YVW;MJLr4gb!^D!@k&Xxy(GTL}1ACHnx%vc&S8%1=baqB9QyCPc$;4=WNt z$$kgorwT^96v|^|+~+oxEBVNg#e{)T7>Jkg`*wX6SlOyUup28zLq#u_{?1G+qW%0I z!vHgPKSoqC3bx$7$Ae0S%E69X$2*S95K_zs-vNOfww{B=Dw$n~Rvw0HSI~tnuzV$< z;IZ{Mrmji`9%&W>UY`R319niO_kinG!A7rSFWsBK07TR%L%@0)AG^`N5lRtFXCoSm z#xZZeWE^Q=k3OODGsM$_m^6>yNVo!6pAT1Ugn9}h>*=!7mFp>rk@E_uR>`avQ0F{~ z%y7dvCWSGkJ@%c5k9aoa1CQ4B`?5FyL4O45t2Y7(x(XhWFp!(Z2|!QVi0IuBiE=Jl zV2C{BBS7Ysl7`I~3h)F+fyK23GIb~Xwr*e`SZ0V<%!l5y03&eqJSGjfSMj^(0J+*t z@5q28dqK~AJYqpuNSEvVzMP8zBX+|b8II@)gMPr3*crUwE=K=1i@)&znCdCH%Hiof z1!z5S9P?|8==l?H*&z`)4xzts0YrGwy8t&c_JJPrj4>@9`U+S7jUr3@9P!V*q#zo` z=v9M$pjNS19&k?_{zf4rJg)q)q#pmi5zxP&eh`ff{F`0@QOE|OFar`R={H6!;Ds{& zHHZiD9kwCAk%<*+16jbz3=aWbH;ico0eOiP(W$6@322P@)9-QzmJ>!aOqC=6Mg5(G zV!)&i=tQ`7xw0DyQ@)Z?kc{d;Kz6B!cZr6lC7aR#upZpZ~Smp~(@ zK6z7h9RuoT{EiPmuFcWu3xW0|53l7}fE5KaBvPcOI0StC?+XrfY5LeR&+y2tyBysn3WAaK=1h#tv8?|txy7w3h*#@r2ijam;@#SDk<+bj%ohJ zts1b3mj~EG=w2lmO1J{F0`U!2%qP4DQlO4wV9{8@tA7BBJ~~|w?gnG%(!1}62MECX z0u z)q&p`asO`ve0~PawzJ@q@G^!o@YlbBb?-Ii!{cmn{#%VfG1{qP`SLD7i-W??g5@w@VwqKhH$`xW@DkK!sU>M2C) z?hJtPrn$W2X86rBy)TN8zgs^Zz7do*HyEsr23Q?H zJbpZ_SLX}$OBZGlKoyI{l+|a8~zdKOK1-v`JYt1`@K!oGq3xxyWnP#r>IBu9G6Ga^(j{Tn`kZ!i!I_kVnY0&s=&ojeo+=17tm0{BXKJ2nrncJ~6F z^50b@P*{4${RJ5Rx#VzlmO3BS{r0kKgNM(=1q+;3a}IBpoN#hV6XJw zr4ui^*oaOCGPNmlc)0|C?^RJV@D48XIF*k4?=lL2Z5iMoNl6_z!seeyQK&1~{~gr4 z!QyCw#d$jhmWW#~14z=$MMHyM{x)}DUs(WC85T0um_{IFG>4;Wfxz5U>?kArpP(ig zOky+KQ-s#(m4|PZ^|Eopr}XH_{!YJr1^872Fpk!Mh&pVDMCym1VS^H{3Y~h}ee) zNSl860h$VUM;XI%&Hga2;;0=#W2^^tRcwtxz2zgz^0lHf#Mr? z-ttrHXmRkApzERqRj6K3$(5zgTElny`}!UNov>AVo^sokhi~Yl&p1}5n)>sMhi2Kk zqFuKm*Chg$KCm$YRp2VeU(0~hqkKwOWSIFx1B1hhd*E9bLQAprn+2{cX@ZrvKb-yL zW8Zu?+LRS}mMxvCnl=O1HJ;eazIJA&Uo6dirdQ&!_-89z@|=s88yC8!-t0hKw>dx8 zJLi9^Bk*2!Ab35w} z_3r5+{Ni>Y@PYJ8>S%_sMImC&)6=dM#?A{^pyq9vP59}J=!1XJjgpe=OSR6L;jW%} zBgAs6>?_&#%Z(VD3Yss;<)Pl}$Ji2hXYYYzyTD|yxKU+5$hS=Slc-Ik)> zzuHk0k(B(22%WYFp)&yx+TBz|EU*t?fK4<}Iz%fqWh1DK)PPOnZr>QCOe;>fu^E~@ zsu${_a_o3K*8@S&yZ3=|}?8D+Gx+9U5>RWGus6b?I105LvU8>AGNm_)CMY}Pm>FgDwc(n!42 zZ8gH~)yqHbO({KT73rF%T}T*~TDe^v@_$T~_`h{un&{7iux+`MU2kta-xPSauEH|+ zsPu`2??}bUUk+W$U$}0Nbu~CH00toqNKbEyoC@ckXOZxDF_JUkqIw8WR!4(Lsp?R2 zu?ln!>WGGg&iLu*r*TY?&*gAG5y>&azr(y=>X$A+mkawvFUx#Lh~MK+1h{%(N1F42 zhb11E0}FSv%iX+Z6qG+<^%w2$cnYH1kDCi9vRsR`)H-Tt9 zyjYQr=!*m$<}n?@lK!zVr-uAS^NU4yZsV}v;>W7{cLu@L)}N=htkHjqtmyn~G|Z{9 z(|nt`jJ>_0M06=Bvx-U#+tOkt*yFn(LazrsuG}rQWIB*D&F151%|IQXWUpuGDi1;! z+;)zD!EcL#c0fn{e%XQN?wWtbj+cJoI@#lzeqCfQ z7hTHc%3MLsuv=Z{n!d4|#-urw?zLtWE1yEINZH+vcq36{<@!|11+z~N??~Mh(6W}c z_3)Xk6?2@NEjL+${8QJ!()?}otefOa1Bj)A={WUW$+*lgFu|hr@i35s+q- zWP!w=0=|<5_J#oRx|o4YuGi)VVbbwkeUB3Z-q4(HVm?kTP;dcK=4)@J zVEc_l&k2bi=I&{wpD>3`)TmPPPHrK0^mPuRz5Blcv92%`s!KyFsao>5yp5_|hOcr=XEK94%qbbU?17 z$0OF=r?bD!yOnI(AzRks`Nq-ejfeZ^tgaQSZhgK@ZTku^m|B7tOPM`XQCf`ZC-p$4 z4F!~aTJWzOo9l3Xk;?nwUICk?Ilv}cyDj4Yv0Cf0+4`K_9k7`fIKVu~T1;bz2Znkh zF955QuYi;%Q2NsMpmeNYP#1+?Li{gaS0+}P15?0G&;-9|M8pyEdcxdh-BB7eWcVMT zsulqoQ%8}CV-vo7d7)R~s0-oQT3}ZU*vZru98e7pMHL#-AQ-4pL>OXac65*@_t!UI z2?qo$7R9;Z<@9ZGa3lHX^(3Z>?ddgGttJ=?zY9^yeM7GzM9n66(m8oY#D*7;1G6)3 z+gEetUL%E&KY8zFgU2C#R%7zBJpu2%ix+1rw`e|X-cP<`m#H*TctH8&B_Y`Q#PC&z zUP2=)>zW#xXf}cye)%7oB&E&l$GwrpVu(F3Av2!S?o8 zsmF>CnSOEPN|=fvcE}^FBg^H|7hosFe-!mjnFNP&geQU#;C}K{6=Z{2tiqL2$nX7< zWD25R<9C#nqmw`n_&?h=$MMak8ft?5bfqI8Xu&)HJL?mtPxr?Cja^8 z|KlSQ(jJ}A#>W=rJ9x5-t!FOW)Z%AAf49!h_1g?xYv+Qe@r?n&VIgNk?d|&=v%`5JMdP2oE3yrAd=6A$+q24}Y@E)eh=282c(EaTV2Rp78#k6V#UUT$n zojO985WY`F5IMi@!_BN*EHh@@K7Li7$u*wSt36b=(EG&eGQZC?)%n*{oN}gh1llt< z0J*hcbi(zti_qk=IqT?G>2r|T!uG9Y=Mr1S>d8x5%AuK`u16i&=9cUEg1t&}(aS~q zY@TcgpJ=GUr^$%?{srS0$6%ofNLRRnDgQszy=PQYZPzY}f+8wJDWWLEjy@JtKzf2A zAkypz2vJe0kOu+jS&9NGB_awcB`Qrsh)7dPA~iM)5+p)|5Q0J|k^l*dl;yd3-u-@K zpS{1a#~%BPGtT+`C@>&dx!0QQn%BJM-2S`N(uYtp4SS9%Hltoc!&mB!z<^_=qObz> zpZ)qZq#D#ksCBY9PFckZchIhsjKz%^CNqDcT zvqWG-y^}>POe>U#bQ;WD#&ba!dtU+~s230n#@BNyPx<_ zwy$~sqWkp7p0x2;lumZ+o~YrnsH@xZ6Vh{`55SB`O>q=KzL;Q3Mmxpsr4_9<-$15= zs~lKv;T)qgH>_PJ0YsW@yIU^*9rZ`fGjR&34;w#b2aZ9Aub)CE7a`k|7BCUr?go%f zKO_{hs6`ycYBF7F1Im@Hnn+tER;acP@Tit+)E}dR74hw>*utay@@W%ArnYIgxtCP2 zLrZ!VNEI8 zxh2}}O}M24sa^dn7QxXxK;soz2a+&>IQ=NQ=s7@b({ ze#F!Q#|fFO5ar5BFp3C`q?|cOqp>xiCiK9Eus*Zq)0t_0wF%{sv1R_nA%+F<899Xq zg2RKiSA+e7_g_YDsIGeKa!!5WO7AFI0%kpI)P`C36{8DBw`j%AUaPm}Blmy%te;YNgSo%$&1U2LGg)= zI5eF1j`|vX8|$mLC}s!$S7tz--yR-mmDHp#V$6v@oNR8tKkqru$TYdSR@RkyjI||2 zSl8osyoa{Fror#)nrC;aYe@|d|0EgSwq6!TSvnF$yisq4N~M@d-2@9G&;#^1Z`Jli z{dLB-gTnfpzH}vh>N7iRv_H+du(#4htGXn%h{rQn`6)Pf;f5XTXSS(OqZvU9YIF?3 zY_=0rh`xg@mTLy}lp``5!vj&{J)A>~7Ruso!;15<1@w{>^x<;G_~cAhXl>QK7Js*{ zv`2Rura!*kC^yk5!-t5XuA^z0H!(XvR(J|5O#*$hiKh}X0-asWm2T`HD8YZ^26z2V zIzQNeKAdG;!7qCtSd3rp7p3!1jJqDzaOlIOb)rVCnO6Z3S+UKZQW^suSnnr?@X*(B z)iqLeP0>~vg`$bH;J`9_ZP=d6yh$-(`H7H4a2}^_t-U>Khb-#%Al<5KVsh6Edf8bI z*T#}w`zK?y81mCy->9TTvXpVb#wyM)mF;bUPP+Ja%mE3=O&gCxflv<{S$acY)%;kq zO;7U&;R|~SVQ&Q3Wk^!yFwD)264T!WAzHCMha2jUrt~ujv=iHbF~}fTVPp^j_l1Jxjcc0lc^fTLa`(7y_bBN5E@n5I#wzX^W=5a<*~|;FR7P_EKL!3iCzfU;~dG-n8lqKG>qk(x}P2ZtpgWhhGW!k=hlrV z-#c4$qbkS$Bg?X$5#Kk+>pteUca%Bny|%%zYy;!lngu1hgi|u-lfaH#K_h~&i|{S? zFWD2Sk8>~XT@(t0NZ-kxOb;!WMe?DXN+s`&yl23+g)9?vx$@VYj?h4 zt5gc23r01&g9A*>oi1KqSgQF9V*ZHrkwk#|cLMX5R9irks@=m~+n>7zp9oc-bn~nt z7o`{|QkgF+cZImZAsRRLr{JGAtB{_vc>TL6cP0_cpk|uQ*NXgeZyYP}HFH_)8lb_W zK0G*lgX%|)$GxJBuXz%2V$gYF$Dqg69?E9V0FizGScU`TdAQzw!U#L`s=ivXH7~%= z6i#mm&)hc`rIHkYS8LwYUs!TkJ+FZE+MFl?%q}Wm6;#YlBuVxXT1ge7G3x}AEyQGK zVg1^{T_7&CV%8!b7-96=y`&_9u5VP=Ub8Hm_$*2{puUCwQrQ7$wxQE${(!`7%`l@CC7HWSr5Et(PxPqYKaRtSF;;LddHB$0rYrScY;eM}uf483rXF72_WbG;OF85Qb|4!&bsqN` zEz1I6y0gsYr7zIG!hRm30#Dw%|BsyLm@FGvFa5g{(SZ{Og96X+xn;E_PW1Ww7R{fDv??13P@P&J$ zLRz03N*lKh*zMw&oz97+$a16`w{qZCRXt+r{yk9j!jtV3cX#q?IO>-|TEa|9=usC) z`~XyXBgjHo`X9NAD5B|o%y!`NTnIfnX7Cn?)yU7VoV6U?R%cazf=ahxQH@PbB^?z| z?dMZWe_ljaO9~*W^D3H%8p3+hmqpZiEaXLGbVc;WHxy&fbm-!N_e%4N-3n051cd0{R%vL zez>ztI>IcxfA@F)>cWj_{m87rZ;0P0hkkZ8e1ig)dhH>EO35FX4dQFr?aPgqt&EA?8vT}?=g5FY04JYupwwYT)+%B)d zUpX%uQnJHW^nYBO?LCFQusMDE5ye0w9C1#kQ6MkE%TlDvp2r-#rw4CJ1YJS(2wl$T zsAdg&WhE}D)|#APsJzUf@(ra{u;}#|TdOkVILpc2-tX5&QQNX><(QGoWp9>6l4(-n z3o2lEz`8Y3HD^&ati)$<`*S2}G(KQB!%v^o+z!Pri)e18nBZ5q`BwOAR*Nl!yv`UX z^4tZc0V_H%+!?1hr0Z4y%G8*={vsfo%bx#$7N>!5|evUoZ{VCVQ`84?q`B5En(<_d&cfcre~?4F#H%!mnhAT5Iw$Xm=AIOxqMXgSqN4f%YT< zec&CyKuqDtd) zEW2!w9Szz&Snl@$oyvKReTNM%ot+A#>9j*=o^uli>_O>gVR-S7fN3%|G4uX+>1%XL{E|e9MzNtN<$)kOt8s& zc1)-W9G znJQPv;Kj-~_Q`MKapeGSOx`u(HANhN)TZ>CCHF0IKArGf_z*G(HCOIP`vNEGGEUV!HFgQ(mrGEC!y zHN1)+yR zsm~DVXAXAYDekprB5>j{vL{$CY%f-150?mzIIBtz!o=wOm_r@rkz5Ud%2O_rF9T{< zlT{{RN`Ws8da4}NTC1ae73ITu&Xm-tZM*dzl{N3||``XI9g4?u>0?%K6Z*U8n2=#o$27y*g+$*TjI&mDO*W^oBPrQZJ zASP!Gj#%Z9l%S?wXs2IYUM8{?+spRS{fQoF@{B&}nGKGhyJ$@D9U2Byh=~FLQAFn( zO;iAntqYg(*)2NjVMmQ5uzd~Bf9Mce640k*SM+t!kK1`8wLy;x&*1vb`ZHIs{>WV( z)oK`R6|vwn%cG7xuDi@;rJ7dLK5aOKambGZ?<7gpNun@HoC$7_`i^u*>uS7ynH#Om zZSf7hq@{mZm)FM{y4RqGzSA4yHEElC?Rqv{$`pA)n?BD>_L{X}YtZA(;C!dSXFO#a z_S{OaznR-Qe2st|G?I8e;!_9ui$u=LKZSm&NR${QkPWwA+*hf$HE+OPf8Ps#MY+ep zbt%;t0Di~0^R)C5sRPv{{!y$l9Mq-_r03S~%gCIRWsWr-ul&T=L__xCk;j4ecl4UM zn=Lu-BsqF9z1^xGi+%6Ru^oe?s{)W?H4?i&a^E$ZNaEax3(p_a3T;Pd*MX1Whs*Bt zqro;}$AaZ+>o7ZHFR})i6KKv_!0VvCqEE!~*&NL_;zF4G8IBJNs#PRb?J~1YV4e9o zX>L^Ndl&M@Mfk&GC32FBqQ5=d=tVyczImi&ior35G^JFs`$9CWrlZZuB|TU6rvsc2Md;(_$wm|xV}?4?T5)(Dbs>kw0=c6@M+C$%7%#MW=}=_Q21$)a~WLW#;8=@ptrjw zDZr&G%s$E8I(MLLaCP$2p=~Vra|5a~lw`z>I#5AXfG&r_(SyWZ>>z4lC5KLAzY59` zL^pX_B#Q7IyItO8Di0{*PbaXOSMj(hYEEzPYAkn3L4bOA(^T}WClsyfM-=z4ONy&1 zPc!QaSIN}Po`F5EU(-lU&L0IALe)Ua9P}@^}7P1nhV(b68 zyTZP}v(>Ng$xE*9$Z9hqTcDHy(1~OMW6>)6+Cr|cuZ@mr2|c^ zUX?>#Wua?F3M;z?CFbF)e)aq2pZ&6#^>)FNV_)|Ro!G^on^mnFNA)FrpA_+AHxU4! zgX`5DL03=SG{kB8n_{o29jHXBU^!>Uw9vQA*BJh$m}?gB?(%v|{9JN3d^NZB3%Y4t z+Rt0aJeu1+4mcdo%|{3LoWF9I_NaZiy}>g%0Y9-=5C8KmGu&G0Ax z{U3a^e?ROTftFW}34Jf!{_WEp6IcD^D_w{5(k>kR{$tA)GaHdhLjx)otn-9kXVQqb z*j40lp~QLwz1V=nG8@1(LCgEU!=FT_fqN_4Wp?(?sGVL=m~s%SsWe1gJY-tc(4Nxk zSk&uZvvurX&FgOlJcI7)3(A*;emt_&XcTm+6hgZI&nS!7TOvwvzSgfHdkTRpG}Wjd z6^U#^+91`Rj0>=G(r=YEV1*wzB4?fA53RZz+i>_>HeSe}4V_ za_F_00{Ie@{u??R`tM-;|FmZOkFs)cP(`Vqj&^62ayagrflL#$kGv^e!obs0%aqNW zD{78U_j&gB*=aOXuH3e3bH(9XdBsmqABnvzWa+73z7+s)?@)d43Aq~l*_6vvf1HMN zQ!N!v41Zx4`IHr71ZN61(i&IvM>y^JDR_Uu01L8YA+S20UAJ(rV4 z!aIsbO^c)&IAm%2)&eN<0Lap*A z_Cn~9C~MofQ`at?J8)Vq4yCXnV*Tvm>!bt{;E1bD4=Au#VYVS`bQL~{vQv5+iSUp)~XM+}orkBQ?v~__l}Gic)Sv1BJ>o^qYYn_gkXk zq{}2{2rL~8KTVK0{s=r2dGHo5iN&FNIUAX$U=LYUae&ym;_bd(Tv-8!I1#z|_OVAV z4FWy)j5-|up?Cz4AH*`tw|uVw+V}@xoSx~eJPt0df1~UM_A>ceZ(G{Sh`bg^r7}r^ zRZJS{*6NK2s{EN~Q^Sa{y7a>BhkZa19iIp1Ipr=e*X(@|U;T8s9J-5mGjt6ovq>ml zquTz0!4zAYj+s&&NvjsSC$(m9&CDm`3DW6r`Be!^bVOq7jNifPcB<{>b?OW46hcFn z1A)MS+`V;B;}K|}tRo(8>a5vsYF#;(3aFIkXE+Zqg5zb$s~7HnotvyIN2oo_(qIQv zw|e*1R|KxMpVsa`D;kE{2tUyHv#FQClLV@xZfbpHc>s{Qw% z(8D19R(|UwUNrmDiV9I^8DSvm>Wf2mP%}|FO>&-|fDwb0!{SJg7+<3TQUjD#w?2ISAM@0*HUr?KVi1IzC zs;dAzrZ=@0oU5=g-_15%iZkK&-I`$rzQGDP#fUlS$p2ITVyz580mudgpglBb)dbpt z#nXvDC+R<>GKq-XhMJ)Qy5fdy3ko7PPp8vroEnS)VX{MC@)b0e-GK@xNby!<#|4=6 zS839(xSnZnK-rz%C)huc|Gt6vQ0fC?2lR;SWifbu$RHsJL~bR4{DC_D?5$85e%DZC ztz1EC{(xo`wfxOt{N>$T+0Uw>6`$X3zaxjlb-6C%UIXOsjDf^fx+?M+qYg)7Z>lv%4aXadHH4KJKuZsVp+rWvW+ZxQ5tvE$ z8>imX1qK|;sbcw+#T-!3DrNRwQr&U0sI-@wHfz+3l|#!(4Pb~baTTZ(3zp8l>t6vt zqWED!X3{}V_(ls;Yxe`cB4@Jyw8QM~-qaT&YCygBn_Qa=t6yiG20jkd|B=flL=u=( zzC#kWw@6eadw})dM$vPRu}Bhme>2#11Se<9|EQ;C%WZrHccWLYjWj<@G2!>Zp&m<8 zAN?{)jIkO@l;ARVV?Ms)?(lG%Me20Qfvb=MQ7k%U8~FE{boWj9Lk4 z1>gkca01*Tr3VHYT+>tstO9m+--Zfsk^4(yiPJOhsCZsfCx@~&&^fLrZ z%1{`)&X;?*{cc;;Jt_3n$6LtLg79fz*j?-DuQW* z2}aD7T87k#*fL8{hmZFwCOTBZ_(A7&XZl915qwEA};`|tU)^#ep+;CMlz*K9)gL9I-jn7^0`L`@I&-6jO*!*Pe2YQPCZ zBP-Dpr6Eq;pfpt?N_A_8fv@VJG>R@mO}n1W_2Y9M)>F4LzR^Acgw7~5)2j-+Y&C4w z+K&NW5C|OvRlaU~j2#!J;V-sL*wh)L&)J1K0ooXbCL09g#2{~?^ViB~_jViMU`>MG zkb8jN^1oX*zg)O!&jmLFDVRJX&A=nA?N1-?+Wl?Ioio`x zXq$sxrl!7l|E@&tfcgTsSz-w_YMWb=315+YvKLq{T<&J9 zKLZYF4Pn=-jvAHsS`AW_K6&kb8otm!yu&lczuV&sOjfsm>}7pO##MT+I%lwrQZJZQZxBU4}a*a4t5lsw?UO z{1=M*d}9tm12=GMVoq^z%cP2M9k9t=FkPT1vg4mFI3NBbW~H;j{`4yb6B}LET6g>s zD6?BEt~8lhXsyY=;lSpMjcFU6UiGyyWj(7m>0Hbw!YNryCFZ@1j2*a#Xvzv=&Pz1L zFiLQ#W+QG1(x&Ve$e}7U@_Eu=^zF((tP9^e?|eauzcV`GxW}S_8h(`Pr`X-3L8YLJ z)aV|s>Gi&42l3QLKR}sv1Uv8$SqaYc<_LB9w4aQ{Pz~ z^)ADRdcQ3NU(yzRDckV4b8yPSHLq(?N*bKX!<9-(sh`_nkhLi6&yaBO01`>XR^um1 z1$m-wCP8!bv}sM;3`*P2g@We)jQ^DtyST_l`5T1{a)etoul)jw-CWroJk!A6X`r!k znbhkSxy<~KTIQj9w%^g^HRGiM_jlMzfCG^wr(+@$4-#o;bbaKr5wyzX%2+px&=IVH zRJpLV2tNH~RH$lDSx-GY;n<(0?l*+VzUR1ka^J&7oc+3*`Mo3xpSmDly;RTT^B|iK zyLU$`^g3}uZ(w5E$Ub=1lHXdCGJ{<;Qj8bvaL1}fcuL$mp5z7uC}ufnqQb&_g3k$9 z{X7>(Jbvf;-_?BSfmqxg^qE&@JH3w1X z9G4p3gCnUGp`_)0y_C0F4&8_K#GGPRBI@TmdMJffwE{z{%jMu7u`rj5f=7DcsFTBbBMR_=D0%LTQLEP%ZokF z1^|d)la@-+;)Zh>sAtUu-$yGd-7fu%Z|`e(l`-5dx6Y*n3vWTU;x(lp7mV|f+Ps2u z_+s{9*)7Uiq#d(F@H3~c=C;~#K^XfTQFWvjDT?N(-*C+R?jCX7fLD6?gzH;IL524n zccQ_nLvp<^fL9c%;HLw0mLA~5jx$e^*Rz!Tg6-P3eY}$7F zg{x;oyf1mSkQZD?!r*;hY$X zi6DGpQ@%8)Qn2$h1#o6=Ix!D-N;f=%y(FqX*@r#Ojh>)9+BKZBDnnGBpVpYUp+F7| zjOI1F$--p-J^qt#KT!6z#83RYf?vlW-;}N_9y2`|zK2(vGnqJ(6^j|1YTD6ipI@1K z#&y8`rd{>Q294WCm(0FcY!woSkHlLP^wk@kuGwq1sJ-g*F*-h2;kj4F8qNbZlM4^l z+&esU+V=RV`*GHC1QP-a{W?*qjs~7nlkd|)eT|>MLj3T7piIAKBmEosHc7?p91pd3 z(09h++1f6OMyHOp{$LQPq$hH}sCRLNT#{36-{ri+GjlPLziqn#jN^TS%T_`@peqeX z@`Sa%1Y(zT7A#g)N!J_fvdf>ZNNXuDf90b znbo*mz8j8J=YCZ23+Yw(O~PI`qywi@Z%+m-H&cAGFJ=|;UaU=Rc3v5QKWYjh=N;mB zGyg*sZk4Z=49N?WWfl8nW*E7lZ_SK({3SB`l+p9tF#x()xm@P+1l5e|bw-qA61NC> z(MthoA`9HVIgk(ODZ})^YCtJ#)l0yb$8D2Zy!5mUEV9~PH*+ z-}Zd$`Ii`K|Y%@XsMBcI7JC#`5q)u_G$wi@DW@hc*~x^HAzV_DLXiTmz(w+KfTPEvAG`@pnV zW9UyoAGLM6xuQhXPOzWRTsk0ezD4Fhi9~K4PN`wMHy!q5w@zG$Ie<#U9ewkL8mMY< zAhfMMHz4n_&x4`$1dmiYV!8^jGhIMS>cTaX67qK|Wa%+UK*S`cbe?uK2sNWnG0Jer zU>0t*C#=YcIUUjmQ;#vG0!uF@I>xOv?wwfn-LZJoE&d(ja!}dO>(1Xn1q1S8t?KH8 zFa7P2THgf4z__mCOD2wo&Y3XV{d197}ux^>j)>LfU0D z2+phQUqvSDBF;4p#dd{>7mT;t%nlRJp7X-e(GICO&q2*EPaeXMh=Zm_71`|9_E4+l z-~k3kH^>=+ANc*4&W@g*z`cS){?%ekr2bQ8vKovr zEU@$%^f15Bd-hG`GGs{u;Chm1ML>{m{!KbiI0&I&b#kE6z4KJm-6qnxS)CuV!U^6# zTyWr0Oc(2d-=3T2sc$G?i`mY{_x(sq2IJ-L`Nrdx6GS)bEwZaf9rS3e(Nl1>uvC$A zz2mq6m=oF46tyyWMkq6x7)1pYJm0PdD&nfCO}am3xyD?^6mn`y!CYE}m$A7{goWAi zyIAaS>hns_PVBmw8!RU1NQcQY!hGLM@YbFr#)hjj@Zp67fQS>;TW<+z5fqg)m^51s@{nX zjoA#=T`7f~G^&fkn|2KP>FVKKJJXrD^ zKZR|VBDf-F93JQIoo5UHZ22!yD$&7dU(C1$%fLOR-(Ylvj=dX5HSN%!B=+n9 z+^aQ%PJqXIf>dOBI*V1Lt$!DLM0TT@Jg32>j)Mnj)Iv=M3dnc5}?wHYsf09Sp%#!ap&K5GP4iyw2p2chIz$1(6Zutl;n3U3u=?=5f zcK!XgPY%noNf)9dDrT|H1;?^*{Gn@n3wjY*kv-MAPYaN-@5$3CkRBs>n#s7Pe*h&$ z>OZI_gXTP2K=(xI|K5I&DFh@Cg}W=eNI~_}jCJ9&VxLldBlxNm89Xo&C7eM!gZJe+ zWP#_F{kwbYd;|a@09m}8XPG;gt(FZYdnu$(xg@962^|Yl^G3JHArx5!VlEmszi_t& zISE9UAkTwdW8#oT84$bfLj9IfQH(Dwj=9;vlM`%XdeNq?;Kw#eVxa5Ru!KmRBh5qvXpJm=vD)yTD)#YL{=`;qXc}-*nwvB zqiGJN&jv#+v(RVCn+s@MAMtU027qmlNcz+hg*H=w#6fhoMF1FsqJY*9QTkA^^^csy z9E(P%iy$9{v{>I{atfRO_`jaL;9%4Lu$S!sM0*MXNWs4>2BezvE>i!%UN-qBy^uf} zHjrx*r?V8I<~4Eaqn0j?f9=Iv49RSb93GZMePQc zHaiqCM?>HlZ2~nl`qUbOBTB{=@Wf~&HbapD?f0Ia3iSBU#g#@c2e$$5`L~GyxCk<= za4k6%ysePP6H2#jxu>^2n%e<%!gQiS#iv$$u!#ygHX2(Ss(1rY|J<|NEM)#!ww<9B z=wrufguLPNu?>_QD!A?cK#B^-5MZg!=aHxcxd>gUpchOxEJH$)qXbAS?Z9DQ=V_TQ zs>4eS7Nn*9;HFy8VniF${KD8|DOS2yX|n_f1~-U9#TWl}+;k{m?>e7s@Vts=C+=96 ziPMba8H}gvd`2TSp;M!e?*g%F=%5pp&X9)8(DUvF5k0AQmp!GKTHKLb7_FyONdJkjZ$asSY^jF*Q`AW-HSxwDqx>1y zcUv;1mf2mN=(1Z@Y^1p&E#>pV*X1(ZxRB4}U5$f#zK@^%TUg>{QDFQf$467q=Dtb6 zY4x8+mOb9*Ddkr6XJGGO(veky$+d#5jyZfX%H_+I@tTBgwKXov$)C=9u73FI%(zva zz5K1Vue1wA<0Z!*i_5fL$NVS{I${_5RzcvrF2ri{mDayDm)ox`q3sNk2MYD~%2Eql zwfDU&`g^kubSgP-TiY@JWA~0HKVu}PyEq!=Ihqw#26(}X8?^5K^)1gW=ZN8Rr_dK) zOO#HO94Rm{K3Q};`(C!Ll6BkP;E#YleTn9&29U^cyTI;-W}e&DD<3zH_DhF=kl>6+ z9DMR3Qz(x4aDP~ue8T294kSBgve6ErVY%S%P$K7@p-mtd+P5vkViD@JiFi3-XM6f~ zkS3BGq9swO!48QsC~ZCc=RFf{`Iwk1D6~5CBv(4~o<1j<9JkirpXvNbEWIr^0OeAV zvL2oL?_a%Lvu0R|rDHp!^U|ooFGp1;3nqL5r z*d0CSjGNj^`#D3iKt-in&yQrKsjZtCV+m$xWJ-i=3v$^ z+r|d|kD%ivumnOm2_0c=WJM%xboD6ECFkH22Q{U)U$I5{pm2Wvh9PE*L{PbxhDoA> zzi?tIC%y5#I10-4nnvTu+#<1+jPPuQ={c@6)?^@bg6O~4M$w5v@&t<0@~Nhe<&bH> zV`8G`_MnmgNjQRl1!TV+63o9F66yb*X!=h9i~k?~P;nacI}}}^k9%g&5>w~+HDah~ zlfYIg+xFL5((pnX#h~xPv9XzTq4Xyvh5iO&9W0HnQxDxz2QV>2`pK650+YL7!2LnN zyK}Zj_g>HKp%ePE!)6ArlM2CtnXFLK>4($Iux7};6I*-<=&RJdX)p|2@?~mN!@vUe@ zuI<{+=40_%A>{PIf~CR7l3Kjpgl}sb9Id=}Rwy`g=i8`#WLJsFhiaC^)3rrG!wd#7 z29f{n!pP&l-Ply)^hj!kE`u_KFZKrf28q+?&v;#85f;f42gCEmcil8MLIK2Uzzrq- zq($w!_#(=S#VCxh=-XCnaaJVcA=)yWA9BH5y zbJr2H_bfp_Z`C*Y2@ZB<>lj1IB_dV((0y}>Akzklu4|A6-tAkFSdL}lIYQo)#Wcer zLP$RkHUPW>gijz^Y<1|el2iZ^YG559GaD05LZH>&l`Kw;{Ox3`m^`HO<0|%x<4QFz zsWWpd^@)zj@KnAV_%LH#x45|=LgS{tM1|+OZO~;-(}!Vh(HJnHF)>f(e~`v5=XDLI zHcXk$qVE_SBimTCNcX45(~rnw~QWJLtHzVcr

GxB3b;C&C#)UKor(~gUyVB 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69fa9a8d1c998929e384ed43cc29e873e674d152 GIT binary patch literal 475972 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 z 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 rlB#)s-cG{fj)1o;Ffx+eQ7rsaxkIPI}$9h$Oi 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
    A>LQ(jT0{_F_=bVr1;?+z>h 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
    CJaqL$@`PN_v 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 J1OlI5{}X=A>{|c; literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45ad628f966bf61dbe8b72ae7074c8b5c98c56fb GIT binary patch literal 466237 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 z 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 b=z;VAo=G6~1GJ;L#!5Im03Cqw_{aYMCh4rP literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1292bda5901e6bfa4402206cf2680a459dd7d02 GIT binary patch literal 365374 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

    -bozc=Ov_$I>g3d#%u~{tdP_Rk%(*3<}_`<4R9? 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f2ac82215d9a19142d3fa68f1354d4c24c26fe42 GIT binary patch literal 667802 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%0Al+I4yT|TGy3d# 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

    nfCELaG;0NeGtbuA1MlIbsSgm*JO1 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:Eg$5>sgttcsI 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

    5w*C}LTf*we*S#0XZ%8=D>FjKm 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

    )JbIFox_V^cFBSeyGbn7w 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 z z!e}W`Vvoh4B3I=-J$SoVas;RN>t+j}I-LhwD?!+dJ8l-_o@+nJIh7ks4Q*Nq~}kOn>8c|E3n9J%xbpK-U-LZKKD|>xI+AK~q_vJ{gebJfG8MYj_JwW}tYvDsUS*R;sILPwlTrb0* zjim+nvfL7VdQOMthgj2$=;!ur0_b>iMD5&1G08S*c?HoeMPtY7s*QLJg;`pU)GV)E z$~kE5pVvcFV5h*c7RUl$k+qv0*cr+<3g6&s4*9Br28)#&mJw{mp_WtT0}s;@r0NC0 zF>jddYlbcHK?@1EN3Vm(>m!{v(+?+Y-!{D+I=4jxIhkC#;h3_XWWRniBwQp5m0C_( zwbHr=D{XYp^MNN+ro=E7dg=;GesKz3C-i5RI`LdU}f*Z#^U&3 zTai%!>4<>ko8Y=+Sa%#7W@zE-TF>-reS0hIc&qKZJC;ZMp6py|dNFFv8&&-)vQ4|H z&AmEGI=(2C$*v2FPXClv++sA|?_mpH4!~EnB9v5tS~sPFbW24)jPHU|uEfvn7$vC2 z>{8e)FMqhjYVMnz^Wwx~G2j->op*y=$ z0cVa!_U=8B7^K;#74cT_6mbgMfh&2R6$G=o`y9c=5xKpZ*nZ0i88N-Sv?u4@@?2%Yqr=y?_i|?q* zgTh&pV5(0OzoY!D5HWRdJ4lu3CtYw(IY@D0Ji;pc^soT3GPY+US($s4MLo;!)swvU zD}NbQ*p39Bp3&w=6Q3jes7`|6@dgYr;YaAyz%PLuRvR52q!$DJT;eDe-j5-2vn;f}t(HdBVBFO8(%nwMc6dFa29zXG@WJR5?2f=p%Hkf=@CV{KnRIKFse}SFjcUKY5Nu4 zDyDRY(b(;H9tsOIs|boDG_OeSziFSCY|-7e-aeoi zqcPf|dv2SQJ_L9(t$P)whF^*t$zOn^Ur10SP~+9b_Yyb|VB~p;VCyE`HRq4msYMzu zqj5?%lSef@Sm(lyvabt{?5j#pt{h#Oa{uL1E8_tC^CeX^`f~bG`5Rhx;ge&gNtQ@6 zZcd4OFi0r5HXlC19xSc3uTaRlqT?Fv_;rA@GG7!RuizVTpv%$DcE4(@`pJ_ARxL&A z%?rz`;q4B;_@L!nqqAD%32~aG}!Ul|+Z0 zT7K0uoU0suzMYbJtFG$VOz(1JF)LKrtzBKW#TX(#|;G+ zMO7sB5z;NpQbP=9Xt6;TAJ=jVR z()%5?!p-B zuow%mYT1G9$^uI0!CSCmciiq8{vCmR#`)HVB~M)A=hwlfx>-jnb^W#MD~xMByF~^y zk^5T`qNff-wIu9yOqp{!d>UC#_yT5 zDf18zZJ~?kxKS1oR0UY7yik6W)N`|0BUr0PM$?vLxkNCR^~{Ny(&3MLOEkWkq3u}$aI1P8A=%6KQ`vp7_7xPGSGG)(|lci$z7Tg zN4c?%D!a3K!&Vcuk5?Xj`6cjhU9;sz;S`ayhfoBSYGAvbV>7`CgHEGo3FNCF`4RREPL7(>x#Wq+V`!n zU9-YU>CMdxXRZ{XtPXC_tczuU?1}~O{eCR_;9^Nwz6M!v5`}`CT^$xl!gnx>XuHPE zS_!wjk>yy@2xM)&_uqpqbrwyKSRseV)%hw1jz~X!tj+X)A0@r-Oni6KthHvc=4?z?_d~9tpbFlN{#|C zk8b%KES=4cyZcOdj(8y!eaj(qTTfQ)H=(bp@}C}zWDHxGY>0;(@w=F{do)=g@WXRUo#Ex(i|u>p1c-d^`-Len?- zr-8HRE}pjy5N~V;{#kP`N@*1aG*FGud-x;X(kAiH+kH1s$4om5RmT8(`k}PU%n{ zc90Ds2Ccm2qSi~2r(tRdv;g&sQ4ru|<03m}T@?`Ci`CIgAwoGifkzhH05E3gN`_?5 z@yor@Y!Rs@#mKvoaJa`GuEvhN{EjN(icvyofbjvfqEHRU(_SvA{LZWhmxjryl}cRN zMc%Ij<2jf@Az4{~vHa{gNp-52f$==Nmg#*#DbMdE4_E80a-p0A!81L?jy})(ReJ-8 zLl8AXU7{1#owebfo=OSjkmT!eCV=v6MT?gJCBa^_8YtGf#q2rIfI6Er-S@L1FX?AR z-h_`l+0W&dc*FG8D>CKHR}jk1k338qN->N)4JhRX@1V9BK{RX^RQ+7y5^v@o%;TAV z%c3r-B!Xvw#EnI5M<3ofubU~x(x8UsAFarg??8Nh`=ad1GVn_*`Mo1(U#7hA(5(AR z1fos%{QR_LL><*`WHv42fJR2trEhl6{H5^vOp^^Wjoba~z>M5qi(09Yjd~hGpVUU> zt5ABU56yZXI5R@ineiShX#`znOY(&C%wEAmpi$7yca-6e{w{-vCBzbZmJZrT1i2eDmGC~wch zJKqbEvFEJ9OsMpuIknVVMd|LeD8IALtFsY0Qak72(a?7be)(nYT#n*A_%A@^W1@EpY_A$X-Z=K9%@F zknjrm;xs#-(rT+Dujks z#avG6w5!y4z?b(Mck{e(`fOQJ?u6lP~ z-XUL=mnY@xP2MG!sZ#;S9}4zsjPdNl)mt1}uH0z?wL9m{jx*13QF9()D8R<-6BW1x zi~!XtM6topwA*O^5`0hsu8dHwz1nv9?45N*_SR1hCj_+2GO#&xkQxeWi*EyAOuXK? zgcEk9L?L)3n|7mUb+6dqNPVz#f{lZFw4HnF#f*&DhjDGV^K|btc?;Fl^rAY}!aZlz z6(7Vs^>=qJ6sU>xgF(ny(K1Xq=^Ad)BsQ!>GBTsXaC?#tEDUgG-p(Lz)3K{wr1!}laD~?6wB|$Hhl0~@+@9KHH-u^~Yl80aE=W4ZB zvPSO1G@BNOQ`6E$+2Pk}BGW#EZm8b0!2ol3C?3Ve-GsLSLJ6nq-RYb5vGZD-J`O#S z>*@U1`thZT+_BXywo*rIYfg$sq$o$P3p7MK;3eX?Y_b1-!3OrYsURpt5MxtJ=e0S? zS?=A(({Mgql;5a{AJh-!F{LhQ;l+W4URj67RwWELU-D9>(Zmv|CcU<)2E0;v)OdNFcE6QI8Pt@XfMRWJ{WlD$6f#1vpk!iHC~c4_5W&HG%lRSOHtQDz4Yd!3zMouZ!H`v#xT zG}-0z{5eR!Qhh2uK;hK_YV>9M+r-?C?yAr;Q%39FP40cT`j2uJXH5eL zXl^SAU_XX5GNxv#qm(TEi=t2K^CGrmX_LJ|NDJibt)gRzL?^8;dbEsvFjN5oeY4^O z#uVaFm=cEyK=R;VPud(d`k;Z|ID3I5e8d zoFR))F-MK&PlYK#>MveFS&V$aPTx zUQB@KyRb8_Bop9lp#B4T)pJO57_wt}x&mDV7qyK097_|vg@DQf+07LbFm&E?paJ3V zTmj)2dK}OmPawIigZ&s-mLr|_0Z_bPmu4|uv*+z#w!uA=O&lGZXc;ns6FrAQ#FFc( z0rGD0k}($=Zwnzn^;m;oz4_DIwnlh9^Z7tCzP@5GVfc#Y^ob2({s@cQF*pU4$Md?s zAp`Tgj-d~N2ca?IZhqneBQlA^8%(6TtAM}!I6+$#T!a`Mw7N*?{_x{3V|e(&i($n9 zo}O>d05i}yQJM4X-nLmhiCptfDov21d_Q6zKh<3+QPV4WuN0;4GXg$AA3&-1qtAmk z9M?=0?k7~ltcIM?Ez7;*C|T$aI?Q2qN|`g4Y6R)0s%Y2|TLCVl#Cn6c%rMV=5c+i7 zeFAF%#ic%crO2$G+|kxBhRz{6J>wz4hffX?NOUqU(49Esy$~W*fsaynLBm0KWVblYhc*ot6P5M9o*Wz&W4TDqGM4jQvuRlUEl^l- zq(dT`QSV`}reNF*9+x}QE*O(g2(-??%_Vvsr2UT?05<*Twk4S$^1J;o!6wYhrpmZVIM+ zp8KtrL~n$yf}ISP%!ZmMWQ~%Y7pVu3l`~s34Av2=K^W^KT>{Nd4wAV&;gSZENHLT; zig91TL@+hLwggS3YjZ`#rXri(naytx>Yae4(Ih-DP>RY~Cdm+%J3MY0`ejP&Gs);r z>GcFVYc@Cykp@k}z`CXL=oH@jkTh>vH)4kA`+90-3;aOCUFwA@#Rz2({J)cY5*^Q^ zSv?w;-#LZgdek!=rVt8_nW_J!m;!bsV}s30O$&dXnyq&`rUB-%So@MdXZI9`T2KW9aa_UD#T6PA+?f_ zp)e#HU#8&h)y>f)_0hQ3=vv$mDGZ4YOLBjU+aYqtBfROa#QIkP__@YlYog=z!RgfPs|tXnKPj*dXY7m8%2~LZrZpzxG6B31d00bUMJ~ zL+2oHIaL0aC5xvz{*)z)XA?Q!QF=&R>8R(>!7<$-2Ag&@;gNsC;EXqDzr^y^c3X!k^c!l^e#TC=4GUATAMwt(LaHKRY zF0B_G`>K8WM0vs4#@hpC_|$+G;xt$c4GB*p9wg zFc7iPGRT(dUiRSfn_8Sj)j}a6-=(6}YZskTR-_XiDk~4Q2>26Ynf1eB>uYZf7cVjm zpfK|mLUq8!x0#DZ&ceicsK>VGqMJ^sW+MHTz%*odu$oZ~^XhN{Z|Y3ANn{%^aR)z; zk;~aoMmtdWO|bC0&)DgE*dE(pJjk9^la@iN(JEGj_zfw_3? z9qf#io*`Z}LzZF$X6Q&L7wQobY6GplRgr;#62ph!FypPmBv+9c-*Frcd;*hIfxvqz z1zqb6=5G9g&BA77;%tO@^pL!S( zKaT~Ko=VpR=HeO5CPgnZFzXgyVu^0BJ9IImctX0I(gmEWMrk5!u}4G3U>aCF_D+mo zlVdUs%eP#@0-B&agYQZJbs&S!To}A(b|A3paDYFInU>6sA$3oU{pe+mI#|e8t)n8d z(Y*fNl^Av*#YLBTF%x!lZcr)S`myI>_sr;2njI<2r@#$(!c^D}FTo-UJl*nW;wO9$ zs#OFfi|d0Kg^v@&RWkBK2*gF)19O1_kz5`YMBKN8e^AjA_yUql8V+5AONdjgESW1% zWci0I!)V4rMhteb^`4J=1hX7b+CxVE7FfqfBueQi0}v&f%fYqbcE30uu;zOyeu## zohcCz*aIP9Hotc$0Cf+A-oK42e=Edgfk^`g{PZf(B5?AJ!;tT&HgI0)=YKYKy`?9Q z5ALi)ijW3}{>3-YOp&eV-&zVXJWc`1P4(-U8HW6rp%zg%?lBFK6Jr5}Dv9hGC<=J>VF>QI>*|jK8pkSr0C^fLU-VJ%EsHK}H*x;4s#ty}kSfHl zwJLy;w@;;J*^iBpv>FreV9M6NXpI3wl;Qsv7TBF>?}nLWJ{@xX#GrVw5Y1?VI3s!q zaLr6ZzwWT4l@&~ynB|;0l{K@&L^zVw3Pv<@G@p+ILjF|oUoIrX8Rt$n421bkVJGB&G{lX=BKwTX(;!*`6KH!Z z3fPeeutfCsnJXE;2??RVi@+nY9&@T0`}0KReMez_`$GBm<7OpUI@ad1b>s6GXZ3>-fX8e;bA z3E2H(Yp1@%Q6?#tMTL^ze2G8r(~o^c5B$E^Gkwv4UjfPGp3MAlG4JY6^BHgu48)>ZDdfp(> z`0v&t4|xPW;R1Cuj5*lm31q;~&)q}+m?F4%#zJwzuQz?>@Xm}%^jlZ7<&-Qsd<+ci zrLX*`9R(I*W|jaHR-};0+TJEVmf&zY@;8i)W)IxB6XRbQ9os>avFFw3R9K<*N;&u{n%)c7=kG=UJSZ0LS4xp*? zI{_@ifYtwcdPd-M{(5L;4gwDtLSO!4k-$xqnHJ65;9o>?WN-t)V{=uGL4?8a;E82fEWiuo6Em z&U($?ZpGRiHX|J@#qX%u8Wh3QwD9ZCJ=U?3&EfwLidJypoo3-P6YtiVE7<<0W*a^X zj#Z5^5?-)FPV`(&J7C>!PGRSOKmdXMHNi`u7bc%(-Ni(p{+(o*XluZnZa! z4ps9-8AXx%E|v~KG%yXDzGFJhFSMqC;J=-sl#n?No(fXR`EbS88U+w(vgXbQ;t&8) zg!P&eL;8Q88}_eE*!dsk68-sp{y%h;{$8CE>R1daKST;lEH643uj9f`kV|$9j(F=c z6)|@6;5EHLxvi87YzDF?fFe>n0bHks zQV340L+Kki12RA-$YNJPnrQ4#$qq2ftRZuph)+N+KS%Kg+2Eoxg>1d&h5#I>NHPYi zNuuMpa#tukF=R(dB(V=rzTL)p;O}O+cB;qnsoiSjL7OnkV9SDrzMvr1{?@S(S8a^s zH>cGy&i*}5Qw^G8h1>Gv0(GCJIoRsssOQTEc95}1X-(7qjoYevUT(B8T^CSUsdl6& zk^gYTC*AO`jSpmto4<;}u5`+3F5giQ;814m%I-AVfACexR#x z?y2*|1m~Nboy)DO2h5X0xb0si92_h*PgJWC<~kK$us;7d!qm1o{rExOjmM%N^s5zm zAkt@M(!Y_n{g;p1N1YWMNL4RA^=>pzV(*IJ_0m%NwJ%L>*k!jhbjRAFeznVAE*^dM zQg6RiO4?oa-;k00Zjb+ua|6qoeR2vz$5uJ!-AnM@h^2?FoOp&VqGAg1Md?@LlJ3+m z>-U4CVX%jv`zlX0?bD;~&$LV~Y0Bvj8UH#-II*M6$i#2kCFl#Jis)p&xctDq4W@KK zjt5^f_wE1+Id%~2erM)+>Px8zmD_FkU;z?|gsrp8(ACxO329u&|40rn4m zkK08{V2(1G{|L$9)Sr{&u9WYfG?g+795E zzf`$%a|NQ+V`^^5m}^S$ig#4FkLygmT~UP}cvU`zt=CM5Uv$IJxaUIIR*PkKdKCov zS?>xHu2gS3F9_(Q2S+%<$7seG_x;Jv- z?ej^Su`{L;4YPKF=io#_&Dd_oZuzMsTJ(cyPo1vp!|BI2)oVprO&Z7;4|-)t0dIsJ zwRbwiedU(0#IVZ0`?1QG~*vz|#0<7~mMdPUzJ2K?i4|J&q|$ zgFqT`W60kk#Ist4AWk2affq}q>WzypD>q_q7UKpkG%Ehlt)AsHju>6UG9yUBSISz;pH;S`R z1VA$sRQ)V?KZu!o!ihoN(5~wU$hQCrUAfF_+v`=brnxH6UH>^uPQiSJ?mML|A2xx3CS8A+-IQ|SqNZb}wQv}= z#fyCml-GFeKEuZVxIbi5yz3;JTTB`d8$lV=pmQ)9&utW84q;OaAEo4&4^g@)FX>Rx z&?zIWMj{u{iPlfd4_1L2CNR;dyXbjF5)6P4a6j5 zmb(g8;IW9fJ)CaywqBdUV)_*{s748CN1s`EUW|xTH{YD7D3NUabU^mb9m|%{;MeSn zB4h!%=Q2ShAgjtrPaJ=it$AxwjIL0qihCKX)8wH8jYhg02s>==Za>A@lS%bnk$?L@ z)wkEJ)YD^KjreG5w?M{ZChtV~chpLxaapjdpfVZW%O-~cUHiJRazpcAcS(MV#p-6? z*Uoj5HL20Bsyyzm-u1d9WdZ9EzQb(g;Ev<#A4Xd_r3xo92T5#8T9@#N~RD?RtGq=xn9cF-AyfvS1mwS64)^^3lwXV`yS}G`% zm#f4Ch3_XWguOXTev2Rls5Va;;SSXMPA@$?XKO~> z!q^8g_+0bw+sC3%{kS9T9{xlQ~(G;x2A2KEPq3xRV9 z6iN)^3jK$FH+1m@EfP@1L45)y?11;=2g4Si?&UY#46zzyU60?v2l2jiGT zlRtWR#~9Nw`n@}KCi)YkbjQSC(aGBcdvPzJ_V%(c(~j{7b>c3Fbcmp z7)$u13$d;H^91YEDit-q-8Ytk%9OjaQmeaY;TVM+t6SI0sim2qn8s5Xv<-+H#dZ(- zn)vuoSc;cnYY(?M>pAJ;TUymmzxNOHz*l(j16w{JZuZ|%`^7R=S3uRXyICS%q%(e5 zv*BU#2w^3ge$#McCx*@AlSBMp3=#d=Q{7EXU+aB_2ZHREdHM!j_S}$nQ*|x<#8P7? zH)-WP$b4ZI_XHm+PQpWHX#!PJr14s}?cQ#Iy|9y@_W7_v-*I9PCTv`XbSp3;K6bLX z?)H|8%glowkB1hg7uQx&qfXzHI&(I%zQKvE9XpVUw~7yw=Ae7?J}~A5FK$9M!7Ifj z$ku>Feoh07o%i~sTl|_j$aT1AZjYs(Mfkb*bxCy@hRZ`#I2!}+vl1%52L$q@Qm6}8)} z0s=V&%PtTkXR_>;maGw&RPf13HZ}oe*k$&D-foXR;bvW}6=SfYr{wK(McjHz+w~7u z-*(AYu`ExxyLX9JaZ`PPqb?zYSb)gD+lvK)4oMGRF2TKx;}zl)u1K!_t5gc{H^+@J+$)& z0B?n+*c%ehsaNO-B!3>yhNkDWLiE+PMl|ya#YHS)0(nNH zuNtJ+0~ptVTKgq1dKh@L$kzce3XzGUP8#xhUk%>VM>_?A2T$$CgGc%g+XNN{dj2EE z$)EJi8~X-B;$Ut=LrS28Pz3HAiOWLFwC_-O!wlg>+u7%al&+ATLz*#o8X)DTGvLJ% z$N@$VU_+!vPFtsroMySX}M+hk|$U~l~i8s+xV0|2K3?tl+HO!#XITZfNTNGpwi8pP-%yyn4 zT%RUdaqBZ*7aASVt%2#h>FEoB)?qu1!hnO%kSlh7f>2P{hAHB_udV{XK2 z+RT^y=mZ-Z#}^ighF)vh?LW%x>$v}6VcMr%o2~pnMO%NqkKkz+t#zFLK~S1L>~~L~ z*@N8fZo|xRGJP}b-HxLr3p7g=bUx9}%JjwL&caU`2p*DItcQnH*#c2H@n&+*0I zu+&XKq?__L592p#k|e{@aujR*q|V({UFG>ak^Cg{mcfHrV|YJ?2Oe^yEMt*~1VwRb z@b;ttWr_<+tCV0+KdEk9-2;UQCj{=6`lA*pA@SR@8x8kd*sO8GUz+05#(KAMukO4B zj7Jrl+(U%M9kk`*SWwxE*eX#PzeXSu?G!vMGnNav-e4C3}OO-qW|qtOlww@ajpdRk-=P;}>%3beZLZ3cS<)!q1O@#wF{Dz3&7O&-~WPYqtx_t2`mMx0bY-QWvQ zw&Ec)UpnM8Hamn=eW+i#@#E7QIU8yxTBmrESO@Ff8{b51yz<5fwL*eD`^n?%{|z$r z&kz8A1o-_^y8Wj>XRpOSD_ib`|Dv+x_Sy?#Zd*Kc)k%MeI-fpk@Io;mDhb+kw}^0^ zqICBL$k1d4lncG@8Uw4#5DA|7^D{hk1udbApf?@?sulfkMdm9-8TjfM-qV__(nn-x z39G?Q_EX^vR&u?_oe~hR^eXJCJD&#N>OQmZ@2JciNNn+*dqs%cYQ~l`;OWO zz$D@w8s*Q){3-udNfhXerC~o^S$dDbtNW3dU^IkDCryf=a{mQC@(-r9{u309@y94y z`41FL`#(d`Bx(t2!KVfPi@i4whq~|E$F-`&P)QM!Qj)DAWE&Ea7$wQpBq79Pix@LS z*_TqtI;kXkvP{;=UP)u0tYgN$3^UeYmVR&7y*$@*-Ov3z*ZsTi>-pZ_bB+#GurNaBt7u zq}zLYqZ-ql3q~(wx7TJ9c4ohM(YMVhvqQ2Je{4m53?{Z}tM=UPNsArN~VmOZhBy#$sA4XTR z4%!TQ5;^I3pv&?95pW1^oCI|FKB_r)h5)d!WYj$|LLG2lVdo(&_yB!Kus*~uC(^^uejfJ#BTzceqd z%)-`sSl>Or1CQAvOwAe0NEidh`C45TlgTHNs;8G{7HCvjS2zjxU&IHN3O2# zs0A%efw5vv;Fpi5|K!T@9cIg{iD16GCtzkOffRHpjqJH{yqb$s{AW;IU4J=}j;kkx zAhx3J4?`b`0V4SEGdhn>t2fUaALAln=SdPt+tFQ7?2d=Cur=}N_Tg~l4~3P{oZ*&@ zeKLGpezK5ZM>1l@AA~wCZ~zKehIrso7hz5pdc=Y_nh`36`3am%|{D^-(y>-v+Y)`eF1N@6)X z5H=J66_g#JVIQgc(=zLN2i8{a`BV!r3dvRhUZ2q>Nggh^-l&p>8oB*94bO~-Z{KES zwF%t#jcozd7g-(b9L!J{R19MuD#7Ss9%4+_;{}SL+dtBe|L7Z>%%O7|M(ALuYOcmd z-j}w{pw81J91LBR&$rFZ=DUge+Lb&X(BV;A*&Sh-pTusW0xjzmmEtcKXlmX%B#yJ zhY>%f_~ySprWR1p6|E+JnSkM5C?vxe$CO!u^216MOjA&^o7Vu5G!(&rGf$w5i7bI^ zC$WPa9B~VjE?pz@Q8m<8nj%-SH#OUu<=m#OwlyyxgHa~qm6KR(n_1^qSn_T6p$n1u zEoD;qW|9&k&nE4C+?u9VW?)R~Nf?OkGj&5hxqA1`=|CZGyW}ceUomiXYZ?90NOA!` zN`pQgjuvA?4=f3#S?L$qAZmR&YVIcBPVhM01o&98n4Q8I{di-IJVs8zw-xMW7Lp-L zm%rNW1qp!(fsY3W_GvTieZE1uG4Q6LvqEA0_Rwhk>P=lW}#yT@u&48tCKEsFUQao%W9ByQKvv zqNc{m9*VJg;qe?hAuki<6Pq_D_b5+9e{HT8=6n5Gm!bi)YL{neXyhQY3oM+knp-M% zpWjzCV)J_YfK2E2Uq53=7nI>JZ!P zlZ_SBMfdV|xY`9e$;nrfmapyFf8D~&&SPKhoQvA>lx{Zb62m^-_i|s8AE_R(@ivFM z>Y-aM%RZY?QMZP9EJwx8T3h*s&zXdrPvfrXlQEAGu?tq*lGfdcA0mk{L?}uT++mtx z3_>khjYe$`E+JNmP-LME!m?irZwT|6o~x`bOf=BrYEs*1R@geUHEH1Vl=t&({}84G zd0v8C-H!t0tL*?lUX6FN1JrgbO#*>(0^2`?6B|R22149n%#6bBpIn)lqijD>wcKI2Ae6^44bBD%xDhaNOVLedvjyXZ|@y_tnE##{*8B`;T8ighK^?kelz&Q^-K$@1O`Y- zVKcY_1_cpZuG|C3P)rx{Br3?E;m=$*vH>WzRQNGu) zZxvcj-t#eEI6;;jiq)x2;&ybPz8Xk-rWKQnKFIlj_yAm9v3s4+TR@U(CXWYIBJ!+d z-^P*INSk2drK&QY^Re4(dp~_`HxS8Tf-~9`Z$y2NNlx4t;gKM^?g5A6x8m zgz4`q{n_tL@M5sRrL`%dNFd+DxQs8ORu zVXm`za&{IsJ_hTqUYD}-_Oh)5OV7oe=+NOz5ZxasSBrH3e_dS~?%`ae#r?flat?xj z>e3IRyz2x{!4#$LZL7fRxRb6GddBI%vAGA}ovLsu_$X)zVTQm|yFQVGY=TCiH!^H7 z6hoKffvtpw@>(aNa9&1YiB(R-u|(0g;ajVUEv$D+Tc3l-921Vr_)rxcLWWTH)8vOo zbBXw^XekDaqLEj*aqK=yKD+7Nw!CkF;)>xLRU2=KZxU>rJ+|A(E!W>{ZfvEXg1-qmI!G5VJ&Dbo@Q){4MfWVHArFp!t_tBJz!O;{6+KM z<&uf{_jJjWM=s0}$Xa0DeQDx|IN&Tn;X6i{$FMQu8y_wsLck=s_|m#;2B>H-2rNwt zvZ@dhhFJC#I|U|4t!NH-LExjP{{q1jGyx*(N_S2?n-@Rw!x6uH-2t;kpp`M7A-FIW ze+6+-Fs9cetoZ0-rVQ&M{Kqs$pkO=eTv2O@##NZKQ9HT(8N4J|YUv{iX6OFWx%XT- zn-c|cu$}B^RZ+&Ug`#aJ2lQVZl!#wA8?PURaCQ>nfZ;Du`D;VsY5wOwEhwB&*2_)2FX(sUPlQ02wS?1*_A0Gryv2?QrcP&SZKJYy`i-Et`eMc`3ncr-mXEB+O z6knD>(o?)fVtUrE#4l62tc(H`y!|?&>q3-mVg}eSqmJT;^D~Nhn#~srL)^m&@RGo< z?T2P;zTI1HYuJJGuqb`mUtjn|qFtuqKahURUM!zH*yOkdc?cSoEc6j}yf-F93BSb) zl#h~4Z7iz~#}a^9LTp?0Cf0s2wJx;CMDNPO63phQ-8~FptNn}DybJc-zHF4+XVWy= zcPwyf%n#MmzAA5YVP*7sd_~F99EKs;^^>buG8FvEAS_LX6j+X#am;m27!(4{4PvX) z;AuJ^E(!ze+d1v)`-1jUEw^ zapT~lPL!4;>1WzumTxj#X==-j?2q8C_2Q^ePPW5HVU{?f3|hBNi1JmsQ(XNG+gQA` zad<+#kRLiL{q|MM?@!5nWlJs*$bd$NZJRT?`mXu}V8~Sv zEzn!N)P~Gd0DSNZd<(i^h2S`pLkfrSRLUOB0S0)xf!F1S4lj8@mIuu&CR8zpAnf8t zj6_+zW%yq;vNLThF(}S6$S;-^o~15&6)Sa96kew1vS$f~R%SvyM*<)a#wDf|?eK_tQ?-f-la}<(kDkVTThm!qYgH@|#MHpSp~}@1 zA-W#Mx0SRU9@0z9>M_E9E&ovYZ1|2czrkp^=9j|`S9_=K`W}iMV1*^rz&V3#$Tt!% zBZwjt471Myzu<|`!hMo}1G`WbqK!u>sUu#igIVSlHi zrO_gvy9oi0XUwf6BIgyI=a*B@fcYt;1<*u?vnv!~5v3#?amJM?!BV3^Y6yE#$~4KD z0hc_6GlOHpUsd3r>-K{R z-51N&fKAU$d6%DHR{rFY3o5`F|Day$8UXDc1kQs4(R>qlmNT5#Lj90&0LcQC5mDkN zm-(95GSnW}jLdUzsyXN&7A64*a0H&Ikr#-VrZxOikEg!{F#mAZ2EGf-oSE z?S_dp$PnxfBv6$=H=`~E)o}zuu9eWY2ECj>tKsOR$IlD{oX^V(D+GAIOLhJ_)8cW| zApd5PMPkeg55M@;4y2V!2^BdH0)4}=>Ycvw6yi)DS$+>orIb#Hbp4)cKLin(QnEA~ zODC7f^1X>qxHO2^E}tHEao2l)17(QH6K#jg00Z-)BAoY%mBuW)6l9j;O3N$4b?qIJ25vrit@zX~sy2?TzptUk zQ;owNKnBaE3BgpDJrA-sVi;N%vzsMV+Eqa5P(L$dI4N@)y4yFHGxk-w&(P?Uh(F;t zg)(*&+Z^Q}5#a>aHky!x_{XWOE}og&4l4l zk&4YN3MTj}BqP4BKf=GI+hZ_&tKuQOUHp$Qf*Zb;6hA9mRu18)47%WY(c-8vf6go)}3_j4x9O?#&9l_rfPcxUu$lr&Vf8j9qa8-L1uFtTHFYLfpC z7C6{}fv6qqB+f2$vtDg;jpl*&O1N!6Mz8OwasAfC&`Mp+kMGMf`el*GEghfdL*JyG zA0dsY;v~ZLo_KhW<}~M8(TDn3!t8kUBg4oDp-j#$2m~xK{KXr~1V^haTtM zWSZ(r5QUU`_B{zXF8ag%eCAEz%G~lQ4M=@K@Zc7@1Bh!|jM;#KxJ?TE-0IszS;95; zMTjbyO2g9`#?wRc4N*E5+TWad_rtan*FkI!OA?%?W$uvjUKK|4r}$f4j~TRrwjvv? z*p7w_ZMwNBZRiOj#F*haoXp;K*7|~XGJL0Vg7CG_riC!gfde8tP~`XKDW<2aa;V;( z^M^Ux7ii)xSpre)i4>C+kc_|LRChCHk;6fMhAXD6V=j3nbg zIR&Ni*zVayj&2@+k;m(8uGhSOi4*D#sNNB%J+e{vr0Kn90k3{?DF!5ic-zFt!%*ZO z`aro+_U|;B>XAJQ)?J!V-%P5!c#?~X9IUjMr(RjYMkCwT)2hw&s=;fmyxn?Iq&$-QcOQ=bO4;27M z0VzZX%8DrkjP$J-<~3+8x;1nUvht*0TH+h$CxeFM97C(4xQ>kte$-qEb7$fIWVeSa87@mrGTAAX}hkjPEF!)7gxztx`X>%igC z$Jc%5y4N(}1-OF!giUXaRcUtxc;V0s5Wp4ZtVoqpvLqHl8Vl?I;1w zUm44;pXs3j9bdco0A_(7O2N*bV*zB#9$`IBZ}Ag`s7wOrPXxB?%{U=W!9XyY{3+c=BgwsGG;8yB$N#*P2Ejk{aMj00_) z<$s)t4XZ97?jabqOe>TYJGDfb)MH4&hM{=!88;0B?CMn^L8s;UeH|OFA8E^zcus0~ z!^o^t%}dL0YtvO!R#v@V8rw^0uN^Wxm794ZERLGK>JI_{oCf^Ep$+KMRSX;*F^p+2 zXB@t9T2^?x7PALsHH;JisM4hziz!;KO`nsnPpG=KT=J_Hd!^JY9nakQ1ZAbU@-A5$ zq{Hn#+!EXQ;{CL|3KU`L)YF&0esoYRH0ZJcLxHI(*}$k4om9=~LwVAdGwFvZqS&w! zJvwiECPmh+7VHOfczs|m?#VXS#pG1(nl+8eBrA#1SqhbOx7>SMrld6D)rZ9jOx7oq zDhLt*oEF$l)&_b6Suchh0JmZw=(vX7kf_Q_wDCsOY(~zfB(bt=L{sjd@+-1MQ3?;5_RG`WZGpeN+I9<9=pypu_7Z*|UM$*Bkfir$i8?&Nyh`Oy{)se?8upPqqK4sg9SCFCkF%Y%Y2G zM<`d>T-Yc72=Dax$WH6;EF!UNVWkGnI0~EjLQ`w)2qD z^qjrR+KL8~jGrl_C6mFG0#!#bJ5?Tf3h*$%QY2%DC=;GzXxAMJf1_3>-BF7A!wotXsc12Qa<8j|Uq9w;1K@wAFf^g6p{xALb_) z(z)j!b71BEYKdb-4j%l;^?nSryP4ake=QU&;QZtQH~;-N{Q|lpFtq5L_OeaIhm5lD zYfDi^1Vf%zoD$+J>H2uaB%50kdtn3%$4>Y&Fd>Tpir~&)oN_IPEcC(JKRBXb1@&d; z-~TU@1P~#{0==jX!==8#o4&iD*SIRj*YE2*kA|+g#@p%~AE!OE{%^!*Jq_iK#bL5G z_P1Zh1*zNF4m{yKI`EXy#=P%~<7_XWcK<27gds3%?hn>vakNXtz-p?rC@BkHzpUckqelM6+*qJ7UpI#K+w+*6irRWGOG!5{L09lda_>#*rN z8LWfd!a){b=GU~1`Vvq3H@W7|RwW8)?K>KZCI$uj$1 z+rU7N&vX`hyDyBQU$;b;fNiFtY+bWa=V>926s_1UXJe&*a#0oAyT5fTLjCe-IHLyJm+3zrS2)**; z%qVs5oX{oAMwBdO-=u)A2-zXwF6nmBdt9qb=KHpifNN5Z^SxaiFIIJaiB=J#4~Jbj zG(w$iI6csJ)elQupcyU~vEQj9Xxt63BC#@BawB33OTa(Jx1v4`m{~`92k@MuJ4U>; zQbTT=+CAXw*6!q8C2!O*S9w;Vy&&JA{b*T5QAJXtRkGTdm%^O_eB}{siqHc#*4n_Ud(m6H9c;a{liigZ9j;C40xqhiS*5BJ^)v0#*(8$AHW=&qc9C<{z95u37yA0~en5hp8>_rnM zg3P`INbJ(avSBcL>OZ_R-UNHRb}uX7HM$$h8}n(gT`@-mVc3RNav3~O-o`oL+hOi) zA$LHIXul}2C0OlL>LZ8&Fwwx zy?kG6({b?>y-y0GRZSxAu9S3)MfWWoV|Dj&j(SbryX1O>0T*cS*n?Wj7}2vf0{V9 z>GSELm7iSSeW8fYJGj^&LkEJ%-Y>h?eI}wje{x-dY>cU+kNwXUJDh({iyhx4JWzqN z7PPjnFS%e%3IfY*whJ3I10C;u2<*7=#1ZJaYpCTW4rGaa`*-wA>(tkO^i0@asITAj zOn-nX5tWgH`P@Q*F!`MEYj;0RUvGes+rgFHT^|)+9Xreh6V3n-et~7HDde>k&a=5M zEduc#`PvnL1zU-w3Esw8`AxIs*3uF(7cWseRs%2>MzK@=Km1GPIaQjDrpQ)InmZ9} zNNGr=^#P?Ev`R>7?{C0>KhhgwLtNg3pK_RDbDjvIL&iJm__BiFAog8fledfdoo&(* zr*fn|OE~W5N)ZD)IyzpX!ASQ9pAgoS>eKC-+zeG>eb~WxwK1E^Q~T_9=6=w5Ycpj! zd7|=8_RZV5CiPnLUnzlQqb>-YLGPH5Y98W}4aBNj{Y)mpxmu)YS#T!oP;&-#VI%vw zu7vwbF;FY>DW}|fX|Czm1;`96w6MCOU>Yse$=Sm2K=S)WGns}qUE*CVD?9gW5<86t zUNXo7;qTLx0iy2`T+p|Z!SgS}G^dVjxZrVt$P!u=>mXwvK)KbSLx%X^>rmR>7?&Z# zF3ZC}BlwCTx%3$IBEz5K5M#_ZSisOI>LBJTdBba zsvpj0Kqx{XxhOM`uy#8o^eR=ooVxDwqr^!5a!LGG&esvE=FM+KatuZTO=8nee*Pqo z(z?BP7N=Cwe#6*GmB(xj7t392L4|h#3rb9vlFRt{K+#x`wGXY-W48?C1wiCFF?K)$`1&dx&N`YDQVZd+_6@C!)gW^^qI(^a zkx4}1i>i7P6sFl`dvr;}O8TkRYDNj+71dStjw=Ohun%tU72M8SRcWyE#60`77*8Vn<07-*VsO z_R~Db#0%Ef5SCWfpLz}&?%2C?!)BfmwvWg#9N^oGFk8C}2C+^R8CuLfHKx|gW4M^` zwWKWUmG4-nj?B4JiUI<$`kz&%pU8DLC9-VTaWF@GjB0*RKFgY6`^vY&f>xC}h$XWx zuT5KgsBX_KNa~uC&2#gLg2Ur(e)N~ti?c{}4^&_&@?J1>a6z45r=Yo6`%-7C_oGx= zQPO_PjV%RK&H&~eJMK;N)ra1^*8#tKzW4l12eVY4eI57CKG>i%IJ4Zl`8Pr74+ysZ z!gu%=O2C<~plfaTZBBX3A@$XmXRsC$u*d5N>c}G4b^ue+uI}$a>*<{!N>f>yPFWGf zu)TgUg?Sj1!ogg$`_m#aniYu^leIiengZV=H_kO>mMXB`ZCV12WD~Fshd1Dtub%z} z1_BawKE3_FHtP?RgYw&x?aNx|Tz8QgJ8}qLz<|=u0l{{wj1_j*1xt?q-4FM&Bs-fAHK8K1IxbM4n4DtH$DpRwF;CR6|0`0&pf z%gr(52&`8*%Wr>jm5T#~yE3pFSzKCvi<5)yTIE~>FW3ND#1UV;oq)ct?$1mrdP!#^ zVQ0nMQTc5ecG%dltt?>s`SAo6I2Z0hGCe!mX zjE#y8;G~3u*^>3je zd|-vs{EhIF%VJgt=8-c5nb!Iv`_Dh=uPe1dG2ddouD=GuVMASJOrD1@ok}|2Ovao8b5VgMxze)K-YmUqk0mr?0 zQGK2doha7js68Uw17=QluZcnMiXf-=FiGT^wPD$N~YM$uQXlU+4n~ zkb^D`$-skQDdH+O$o8;tMM%L?=IH7Sl*|d35L#kj5Fi5n*?3`i-FSiU-x@ERS@~Zz zUT`MOpJD_RutH8F*(&gkUmpL*e@**wbL{kWN~IFcNlRkkbJhniH2g7gBu;i?{&?nN z(7qRI$ipY9KLuz=$6^Xrf!K>YUD%}^2?51{q0S>aShPeJRh7c3|_^9KGsH7+-zjQP2u5Ai~^rR{K)a)==~2Dw`QM2wl2^UuH99pU8hD5-*~xMg3I6_*C~UEW4zI@YxKv#DTJN8%gK+q1omyYRJA|MOx;e+ zP#{H2yP=VHO-xfkB|X@UpH0;*kIvF;8IUg@m*BuU4WV+|&Mxmf!`_f{rK`j*&5%G> zUU8}&^as!EBc>VH6{hr)D*-5kz`5vw{c=qgVPwrN%y<+YMDibPGsJs;y3{}P<#>50 zDOk+AQdeze6D;`NPcBuB*x4(-K?2?cV_t8=tlo*iWAD3OoP~ZVJIucF@p2RU*~cu& z_uQKO-5x

    C~a3i<)w+VQoPF74K=}@sle+n!`I=O-cCAXYCv2m$UieZ=U==o!S4D*D-$%IGHo8Ku!pD zu5_$o>O{(sF|uRc;cH5d3OBXv*l8!hcdroHU_$ztW5kHZGi9-rZp z%c?75h1Mci?;<1jL2vl@S8Zq}#<|&ULR_UYJVhcyDBA@&-5DSFcO&pWG~oA-u_gZ! z_QI5D`jhK#_5-+;kJBH5O7tZ0UE^JJNbfJBJB06^pvB$E2~g03`bSc$+-@Wp<&a`B(pDhUmv&RHI}A@%#3eGHW9eJqBYGhW6lPmQ?D zor2Vh+NoPkzM#Hv3uDW3&u1@RngtBZyb6imPW5sfiVRwu1aTPo#x!h!`W8b<#&e8b z_vlxEHJh;Rok-SNE%;CcF{^hmwKd(C@jlT0;*~M1Wc?2@J`BtgOzu9?>e6Gdkp*DB z^8l%S9Fz-cfKu?+qTRsW6r~t@u{j!8a|CvZoWw6ogVyc=2*9I2%frKM0Xi#J1r7@k zB=fFfUo}W%jyC7L9cH{+2n-(Q0C$BT&R)JEkmSl8*{c9i8tK(|?vJly1+i~{X%s@P zJZHoDpD#p3iyM99={t5|MX9ef1~X_NKN@ZvJHc6amB9afy6;kujg2N~uO}}j_B;7; zl5^zO6eo^+`nF3nc7#5kLv`e$UC0vE&~-faan|408ZELH?{mqs=lZUDv8!sz`3V>L zeDt~udjDI{;djGNzwk)Szwk(;Ja*IS(qh4NENv1){D_%6###{gt6B%K765A^&Z`dW zb40E$hzAtey0e$M9O)h>b6uv2dsCKSbbFwnd7k*R5wiOn7^2 zW@7m0S4)&K-oba2F=dMj_PEECTPhv<9^fM=v;Dh5Be!7N7W*;I0=dZg7F{K=#&G4z z8}h!q7FC4-j|iz_C~za8qexODU^+9tQgqA=+5=BLq1 zyTY9&^YG*tL)k_+&vl+erqmay2C73la-?KcY${UJtVz$LZbDDj6YG`Q?&9!_*<_*+ zNss=p=KUgYpp@WoZ!h%z?)@rLTlK|WtDDs-`{hAIR2rLk^<$GuE~HV{-j(=FdS`y4 z2j8qO+GP0sQ^ux}oEHEo?kfa*I;f77*i ze0SU#y}NFwB8+9-l6>?ld|k{`^HUGxdn#fo5;6z5>{PhC4wa4N5-OVAkwPJnBONIL zJ!=_Va+x}p{Wc3JWEAiEKC&fT$uo_qeGn}fzN_NUn_=T!DXGtI4ptj3{Q%+Byi2kR zd891v%T>G40^M^5jz1pWhp119HIN`)G>g?AXH;IKn`K`1a8;ho50^d{JDEwU=xokD zbM`+SX+CC+Uw`Ys+f>EJFH;_eS*3mu+p{S$GQ}~)uiG;^!4NUM#*D!nX)+d!7xQ#W zSqx7w&?FFyAU3&>{NFZUzrHPh(Dyc;!FPf#$r`W*+KR!r>p2T*R47Ng6ub2KD%`W( zO8%VF<$Zq-2Z27t(`*V>b>UR_PcAPV5Eqomyr;|VG7<>$j;m$Uj&n-{L=*H<+9|*B z0`Bm2QG(}w&(F*OKRY}$lL#=1-f=qiVvHL)6|-SVh4KKn*mKmmPBQ3`OOufSp5Y*| z-=#6mEKSd0Kk?ze|2eV4Kw`H6s%=N`PbchCS{-ZY_iPM@Y5kj8Z{g4w`MNaxV=mmT zrvP_f*s&!5mRB91wV(ye5DMfI{%VGt%(?)Sr!VL+f5*GN;O~0ZZ-QEO%PzX;eS9(d zG_GF2Csqr8OhePALFYi^rUsRUFF!^ahoy$zl|Sn?f;sYih_#eAEb(a{51z8j7|go6 zB6PVZ7JY?$N$C9*lRW|M&-#-l434DJKBk!6G1I@Cn;dZXRiyc?Si^Cb6$kH2-_0s3 zOFF1-@&%dU-QU|K)5gXew(sF@3%|N%+1ojq_3gnf%g>hm>O4 zXh)XnWz$T_?XpQ6yh0D_B*m=z&j;zH=GRyQ+`ay9};e7*JGQ3nKn2p0i&Aw^l#7499;-tN>*Cb7lowymzjX zH39O}%r!S))1`I-V#f)9rRO>$+4nTmW%K%QUsluNG8e7=AV@TpjYQdnkFI036~J7h zfZ~o!Gfuh7xNNUe-N`pUCrZEoXPmSl**g)eG z+&GA=g%q8m=^-%&7cw{(B;&f9zCPxz_V2*Sy#4r$~P56ldlrqrA60|_gwPtS9hHk{M*1-7H z14C92M`-2K+?q6r7XaKvt*}+ii2MnSDCFuAXfe1FR)zia8xfDH4|e8x1@KT1551!- zR|jMk2b3FBPg9pVns$GiM!F#HOSFH`IS~8)+|9z*WwluccW0O#9XRs_=eElL)vF;{ zp!oS0@83=DX@(!Bw{h!PL*KfnCW|#1NFKOpNR@^e!Ci78CC5p-N_`~mo-@`TJ=^~s zN6W?pBAzbz7v6K!u!(@??1E3Z#1fp!oL=ZZ|ZMMc!&$C!F?X9qm^Oo-ffa%eqXnsMYQYGFMa8zj%sLyYk3UAXO?wucx^{x zCR}HdfrhWNP5N`TE%tt1vrDGC6#H#q%3Gg>&1DU9FP;XjEMsHTCi(o1q7|6%Q#j4> zk+}iwq1MjWb78^;qIOYxiYne;(cN?;F?!>>1F`4V*CTwv{FfK2m-hQl+73-k6yzos zqk=XRtHtHptR?a66ITE}7JfmlBBT)TZ<^Vdp-bSHEfXn^hod(i^K6s=F#VD zPuPL;vi z0{>IZ@yq?<`b(7jqrUoA_5UmDyAzt&{l8v-?g1e9h^J}#o)h;c`>>f+>ua(;-bF|< z>qx9qYQwbs>jVaYMD4_+VP7l}-mdSv;i%i;4{#1Fq^W!!TJv82f$z%08gRsC>_Q~e zl8fyO$P=K6`?8DfgKJ3j@@isz;cTY<9vbuEzbTE0TmWDQ!!IQWvH;q!3p#8V8DAg{ zBP^`Dbxg8v2R;DxLgin~>l}cuJ8-X4w+HTZMZa~gd+}%Yy2Ag$y^apuH-!wy{<6*E zM$y2Iqi7pu^vWjo``zk}qxqrI`Yl+26p9VX`X#nZj}~5?LR`UqZ=OAKya<5$^T-(J zyq=~cz%Jv!H2vh};tiZz_#!xK4{@2mjxJf?u7yPnDkHd^dS42F33|!U5-c!(5B}c1 zOwK6oK#AudY#9Ff%I+8FMjFvCBJcH8;G|gSUy*ARd&=PE& z5t1BV=6<*P5@V%i#m_uUU0nTAPhQh9E^N0+a;>ta*n->Mu~y*k=2jy7^cKazB{9C& zT5U(uBG4`m0|$>@o*F-&dikJg#def8nfLNG$>MG=pQqFx)`w5&4c>8odT7SWd&6_p z6FWa`w9VPJ6#l19MSjw!-HEtNbT5*RQ*=FO8c63hJq|UQj5|1TWARN_hrZt4%J)CQ z&0bNPRTl2oPA8(e+7{J!<+e5)PYDyS7MMMSIo#k;MQ9}-QPFcTJC?cf%5uj)UwCX9 zm9^sNA%9Vc06O?_)9Ttd5&K{E^nfnHeo1wU>e75wm{m4OE?t$ao|D7UzAfg#UJdtk zOmlpf|Ev$0o9kN}WTu+obQhZzo4N}fQA(T&AS6W}`TD=_(|sQdr7Za&nM4>;?t9-seKg@7A+h!jU&6QJhmrx;fh_JTn{lIb+)=Mcb`q9)reKho z|3(1o9LADa^0<=mg4|(l?g!Ih4P(f5z6+e-0e`T?efLi;x><`)KYMqNDd#+U9U>BG z!Y(RJlNcwkKe@tR&3*Jgj`;%p$b>E*p_x;K=+l&vhL9S9==4>L0BZMZYvA^i|wDB<|~SSt~ik^?8s)R-o{8z@1V#)!zA-eI0+toa=oYuqR0gsFPXJP$(F zb>O>U%b1!2yVqMyjD`w&^*_y*hPm74T4%@XIg;xxq0qa3s3b9e^k!RV;mIeVUDic6 zaghbD2heI*ktF-HI(8-mSbt=@BX~J%7@?3Eb=5bpb%U1Zx~Ij6f>6g=x3`kUon-br zl<3))vx)jO0bK5=Cujl@t0uTpc`RYO z5qz9as)UE2g1Ny`qHE&GP+^yQYsVRx=hJ$nc~9N96+$i-Xm(%Kv`I04_TFL-rR&oa z@2;e%`~q}UX!HCRyJ6GVH+Cwz)q43PU044e6yf6{GAcpo4ea!`WCDWh?S z6iCPn^}2%hyGftki=mr=>d0FGmvx2mJE~LttRcgdd!px3>{AxGSQz zo1@IQL?H>@M$1Igez^1=Y02Gt$;hEQJ#S2TZxMPPULvk_z)M~1tLf;Z$NWs*m_YL5 z+hCSUjtE+o|d30!I@DOlEFKOsgj;0QgHZo#r=2@^9{dj6gMY7?e3L6B~U;UZu z&Mi9~I)itLs5MMvV{vHi=lZ*hMun4G(?=KI~tLFeG=(Dj0l}p>oKM&=7@$oyuf`-`$h%nwuUm) z@@sxGaZwW+Y`6bv{elGhtN&UjEP}+iHV9HlI_~g6(w~f`oflAxs&fIZZi?XSI~sc?0iM zh*nV{{m94;yZfhbN?7Modzbsb{+&0q{X6|O}G;AG+S^A1+9Go2whci zu#uR4D6O#a{!cC)wcQ~51Fi|%osg}fe&4X;!}^^!r0o}Bs>sD3TNrR zzI_!34{$$J$%c2jUvj(*@U5I0 z{7@R6W&(}Cd{C~hK>jdXo)PLMCb^fCG92mBm&>16I$PdqE)}t`obTWJ&_F*>8_keC zaq_{Q($;6!XR6_AEXdPur`A-;k)jVvQrUTmrSWVrHoIdjsI)9_ep`N?L$v?>Hv8b) zFVsB%8#gg^-u{NiHkCsqnznCK)1r2RuqvcD2Z*a;fLw=y+a_)>)AAmm(-}Xx5QkS^ zPppl?^#A$9{tuV-e;}&&aT?PQ?YGE+!3jjc^+l9qCTDfZlW}0-Az^%7Z8#2DlHiCc z0K!1Sef?|tM<~XwZ`FTc-H!qH3E8wN5X2#>dx?VmFn_AiF@G-6eMnHcK4Ui+!Abdj z2752f*0!_Izkxh{H~;a6{Xd=`n5V?U(s4WHIh_u4;fu%m@3Z$8Z2dWrl zZH(%sH4M>oZ4HF&|6wiVTf3OW-$Hx-e_cztX)G*5!B8S^<;~5eDVKMwb`Q^#w=2)e zL;?A62D_i(0NL*gufM*hJk8Jw!#^ohevv3}%t<_YdF$ghx)K||iX7Z^Y}2YF1030{ zS+|q&>ZYJPco&|k4Qc*ivx=lWEIF~mF3;2}I(6S!`ZDXjxQx2F_T@?LqH)DQPcN(r zdQz~VB$~@O6+`ahVS*9Z-5fF0xk_B1l*~+t^lkN>2_Hm?!+q1H#_QMCdbiz)Oo%wF zqnt#KFbVyB1cEIWBt+)HhEia(%g7%QjS4I+S}>kG7o2vgU3RuO3#Bs@6BZwId9RT> z(#QLzoNV5u!EXO3)m{sJfwDZx4Q&&r0oXUkiSc#MHSSX^PlioypYQJF5{7L$>Qehm ziNA)(C3;NIQUqzIORsD!eAxzWUR_#MNWV|FX?Y{=He6JipzHGGP?EU19$9Sv-I=|x zJbaJ*ay>(v2}<1#^f8ubLcKhBKu>_z+UP__yLa%J7-!B<$TSS;MywwUena1 zt5{+!d%Y>&L{gWRHhMYPu6)%1lpzoLzXi?j*y0JNV2C<%AIi#xPR#p%B+#->uZb*4 z`kHXl>B9kb%a`b2#`q!A$XB1UW1NB)M9DLry<+JFarV13q^W-_rXlL&d01zj)pA6V zwdjaC_%7eC8*X?sV#2Mu|2PwL2AE`B!Um2bbV+?9En9+w6La%h4(m1@WTEwNaJOdX|X-+?jIl%a;ODm0g?JO)?)o+!hX0SfH;<=sUH`|GN=U0hLM&w}!Y)L@Qwd3|kRj8mR6@v(-d-)--6_St8D&i z=QJ_#+w(n#4m*goW$iHf25V`o3B zv9ww28d85Uyg^ejsFnooJI60}hOL@AC!h_vKts!YaO{?6dTU8X31&!vyVGJ)z?QE# z+DSyzH&?b>!%CZQN-rl}aQ0Q(w8X8Z=0Wy7(i@TzOBc;1qpAo9SY0Nc;$YN_01)t4 zq~$hbF}4R-Aa+#yL4XQ2mGLvrlUj412X$DtNYE&uxuvo;KnEEfupZ~^cjmQj@#q|F zUX-2P>Uc2Dz%wa{SD%&U@}V$8>~TlQQ}dz)!zB8nKj?p&h>))MOWVl zjA4uB=>f2AAA}Hw;iqK}lPFU~$stk6-L>ASj^_Inwk}3lAC(rx9OVKm| zrm>OFg(Y}1l64}VadOJiX6cE)NbZo84Sd;`XRKGQq$$l)jVbM50osjRUT5sNoj zD)qi^Y0E3okFlK&MER^HUo61W%Z-AJ>BEmNt~|C=@Um2PIy+gExU`IJ1fbvg?QJk%V%$2QHx!|HMN`se>&${H@1)-P z95c(Fdsj2!pB?LS?X5ppGk?0fCQf)x|Cs}4nu0R2k|6IIw~q(zEpASDXW6GVJ&R!9 zdD=(vt!YOTP_6x-S!Qoy*IrAa>|%Lq6us5#NrM3&z#Lkv{>~P|?Jh$pPeVC_biXXN z2f6UAVWz<4WOLrAV8AhxyVD%*6{}~-HZvj!<;&^Ji+aUXr1t1sODC^=m;PQeCB%3s zmtZ9qbP6>kUBGvl*s>mxuFS3pxY(rdEn|1HJOS5%eta|Ei})>_kSNPO=vJkKPb=BzMgYF8_e1olCQH7>2nPe_lV}stQl3q*^ieb^ z(C)AuJ62X0|4mM^k70C6KM>N-D{+?p*yLT#lbp1jnsM#Tn^Xfy`^Jfe_hGs3xVHx1 zDrt7t@6CzMKN#-qlnjR0IGE%}?zF3-=gwASi5Lu=Et8(uerF=R z$p7nt0`CWH-$PY-9Ut@+$i zqLatity5&6GkWC}C1O+wF527@DQ|o~_B-3n(MtuJD%XeKUxB7g{tI!Iot#K*Ey;6c#)_1}k>(R@F zmx`g|<#16WNcgWbCwU|&4v|(i!QFh{*_zzi7f{|IcgixE;RVr8ZI;PVKk@=IVuEgt z2avY{Lk^&#Gc;Ksjf=8pyqPYAwI)^Z2< z_jh78k*P%I=^*91K|g@uk)wXQ9~ekI>w5huQ?zM@D^}m(hQHmlJl_a>gSMnu-jaUd zT>8CBGgcn3`xn>4Ht7^v&&o2&iKW#HKulh(!MGU_Dt_sG>u{rTJ$@_sb-lC0r44Cz zsb71>)vmfJ5_>-;TnwRqY1fUIS;{eSK6iBY>+Rv*Ku*-%k>6cL)$gn6=VvBXuj3yV zOFKb|^{_MCrLts)aMNZhDS7rx-q1m>6kux5>$HJfQ?|Bw+Wc5!$`>&CG5gk@s4sec|qwZBF&K;4~k&d0_B%f+{*DgfLj(eRK0WBZ~jOFZ`W zNqki(@(|U2lQEt8B3p6&X|-6p8ytnw{8d5kVOkYds_tN9%HTK?PqhHGYlTp;PuPy{k{{v3rRP$VB=i&?_@JK8W%p(y zL2j8_1`g7k3iVpGAI>YD;4!m7%K=@15R7T>4^hkENFnSqr zsCGe4p6<#PaHQ->mg~2DIsWOg5-p3|;pvGUOU>Oj5{;h*FW>22alCo?!kcGkz4!EY zw$HwOXAPf2nZ_pxinh)1mNrwK&T39m?({drs8}wx!W6iMmBLz;BYDY%yX+i_YADcG zuwSsc9ee4jzsG#}izwb7UT*#oBSWiBQLrPNQvQ=+D|FK7`T$LVFif7m2AXJsLxd0Z z?-l`#&q{fGKW_FzDx*fZB`?0i2DC_*Ycm{P}#c8 zG-yDWd2;_1%oH6hsal;GVxq@ZsW~jipAAg~C3vSja|uP_AyFWW{H(wVONA#ds{$g3W(Z~Osyl_Dpa`+-3#?gnSvMf!+8dg#W%*9} z_2HLyT)B8ryvN+Q4g0j?^@LfP!T5kQwjk})r#9N(_!^n%enjP2g(Md!Y8w>n`JF8i%U9y; zot5F0sNHBR>x?tn9>;EOL6j?zOa^92O$Jw8o>{V?r;PVK$(!F2djiu)>eNLy)__ZF zH;Xv4PhD@2N4FZ{D&ct3c{H^fc{*qwo@qNbDjOS|c#pYP;hs3nprpl0Z{K8x<*`>A zKRj@G$QP;S8#ay-NEclZm7ygW)-#u@>Lx=(s0u3*BzD%eJhd{zXWsm*(o^mNK`EWL zElP5SE8V{Acy7AnSetsuF2W*jqU6(c*G6;5wM2P9fg4ddmERN~J-`yLEHX_BGA#{> zO6j(+(iU~k(RCGKe^e`1cyBn`@yK}UD$=HTi^|Hjys~s~`UhhbRSnozDH_vMeZ98N z0Gt@?i;;!ieIi`0IJ2K854$0Udn6WX^3I0!pa&^&4_3 z+luV>@5ip0>^n>yi^x!>V9s{>*bXk&1o7Xl&a>rsh7>KI$t^3RDcobKq)aTG?xytW z+B-J)HAEzeJi8n{MEbOn57v}w07u5xFt_1=kbU4FWj%7cD(C>XNh#HMQBUm6 zF5L*R_pO;hqCVY&gsLfqE4#szA9glJZ zv20{-mV=y!Q|!`oY_T^!T%&SH2@z*(_32)U1YHD>f5GoS4JDl7lQr-xE&YqWyd?FW|7e~8o)FM~nzVlI^;{$F2r{z?a^RSGLH%hE=rr(6C2XT@e>gD9>p;kkM$D`HGH<6@T%b=pS0g@_yKkVmR7;gUQ#LoWEydhKIng>u z5LH0Su~ajKJEB->&Ak$lA%Z|qk0Ov&6bUI!{4(%xhzBayT+e#SJkOsS$CNm@w7n}d zG{DqtfJe7dMWy|Haw+*~s%1B&+>^I(}r@|S2Epz%ZL ze)i}w0qoeq;_ooQ(S+y3d1gbt&T!TM0VO5dnFAPLW{w#Y=+{kMoiijI1?Vj~_d0G7 zM83XCB9uj%_4n?XB+@ZQ!8pt!L)3k-7N`nQ8DPX%u6f^YqBDCo$g77w!DSRWubDgW z$3C12^Z1cIccvcvJrsRyDTV3R19u2Q3+zWUo{YwlXfqtF>p0drv-(TpzVDG_RC?u6 zi^Lw_IJz57Z-M&?0aB$*lp7f*nT!^M4^)7LZpsL6eY)L9#SKWD)L)35i@L-pY z$5E>+lUcWj3^}j-({MaQ!gW)sMa8L<8p2oX$wuW;oNkL}*4-{*CeiM7U(eZY$Ae8i z_|rc9B_Vw$ng=C3%`8SXy}TiI(foL~p=SD`Cij{h^_a-(Va_H72Ol}idlWS?0or-1 z6Rp;iV&#$gUx3HZwL)RdR6I5~mu0f#)1mB}tKneJkQlA`ShibCZ^>uaT`ceY)-9G~%k%d0YZ#trb)PcpPMI>u45MjdcRldi zreJEM11cdDd3%f%I$adp%StkWlO(SDzM%))2VMh>g4b}$j}z;r0}pZw;zV@2P3|X( zx>)J^ClPQa^b4T@VGs6y_Ske5C zR(zo(>QMtt@@cS>A;=!vBagyy>wR9$b^Ck@8&Sq=u6Un1QJ}4!dSGK^0wS&k3u$~_ z%#Ca4wO>D%6E!t!NOQgS6y=)FLXPInoIz|ccZ57!EjhZs!SBTj;dPaV4f90pJMR$p zABfxPav)%(_luMFjNAwvD>j6k{;@t*y|0bYZcP!kn#~LC2jM*(6!ZB=Fe3;o>S@@i z+ciW}j+%AbjvDlm+SfNJ;_Fg@lK>FACU)|AJ*M;J1D;tweHXE~o@=U~Pws4SWRVoK z`pPeRPz5hehOvfhgmMTLm$JE zh|W)@lJN7I+?rszhd`c(uFINK{W1N{sC&>Hj(G_j^FBb_OS<0ZppQIQZFPQP=$HoD z>FEfXwPu)xzR7Jp5>+KM2${!KD(J3Y$At%-bx%{JnOm02)d;s|v(yizc00h?7rH4E zDvD=qj~CU(0orn<>t@R-wR^F6sUe#Vb&Zsy zjsrY%B~Hry(I)fzPk$Zb!&%gfEXNPGoN+_$S@qtL(M#^sxr&~L`d>oSlTg?yqJrmO z{y>YX!U!X{YA=X)R=Hl|00t9YuJLr-t84vdqWjX_MC+49%r$GreoU&}Ay{{MSdA#Zqc9YwjU;~)j$))+#0Ccm>i4n}ZjwZay7!YoP~iU|0u2xhMY$V~k? zd%8%6(aQMg^A8Pw`eAB; z7h(S9!u_W^%YXPU2;_sTnn{N>7dRG|ffU0lIH5JPo4x`+0CG(@XktAeA1h4JnIPo- ztkdGUs?%ck5&t)ITH=6C3+We~mKLDXg8rh@f{~y#L^j&UCvO`SesKIN%Bgj+8167& zo+A{whjl&6B(`BC69#t5WSkNxHnI#d#=#8#r&Ijq=K5`*Dg`w`d2GO`2gO%Li#Crf zu4k+kax%~bsB?F{zH7)TG$@yf5DXkf@j^Zo?XEj~?)KRnYhP9Y&bu;29a7DfR^C49 z!~;%OjQ2{OXgc0J8`8~BZnAh4xnn3~NAr&J$HVr#(vDP3j5sFY_KGd_?hBdSH{QHp zV`DR3d-7*?qZ)>1LgCHiH7Uq#-NP@}YEoh&ccx@sS>s59mmiox& zHd+~zoMA3$UU0ny7QIAsJ4EakaKJ|>K(x5fQ?XDR-mZWSBho%2X0fngf3 zskAiVu#*)m>d|;_Pq*C?V(gufb&k}pvay1&qHEAW}pPsfmMC_|--_!@qkbFYt zB0i0}Vsof1IWkza@JowXn7M184F-a{@crg9hrt8u!Ft9tpb8JV-YMI2#a4**tiPf#r?HVh1!)A2UDEGk2hpu5rWU!OXXspZ^qn(Y)WZAEsVKHfsXs)txFV z05^5xra$Its+uzD7qJaDKrJyI0Y>t?@QdZ}lgzU&HEkms)b#u zh8C>BEXWQikFJT}@Tb@@rV@|s%tV>b-0beR-;nXxcW5<{}?)}6Ux5~JsDp2X{_ zM|s(XmJ$JN+jYP7vCr+ev1zZ zr3r(_bZxwBRJZ=pgLr|nyB`g@y#F+LJ>#I&^^N`W6Bhd3lYy_-SaF1sm<)Uxiv*4f zi8Ob<53F5gES9b(>8w8xL>dh+3Lu$EDt-wa_O66);Rw zQs&)7u21yaV2FSn&W7@Pzm_qQdqfigyfGm00OAU`+?2oxSn+5n)uahw1R~lh673bi_Z^W z5wVWY+(HF08(D)!(&hB2?%DmCWM_xupk~nflxmfij61wd_5?8{+WW$GrF)&9xK50N z=((DSitHiHbn0~F-_`RiQMOWe-ULd7Jp4>LLyqYI+$FF9KOp+FtPh&%w9zND^!}c% z&=7T%K^v@D8*%r0THKwkNxkW5R~LD4i`c!~0{72}+Y1}=#XIg*TGZ9StPgvM7c?UZ zw!9v1&lwTmW7RG?h`NH>;z-YjAda9qwTAGzn*7Nq0z;{5;Z$)`P2z!fzzVw?%o1XPeI z9pb=KVfXe?H`(|=@^%$ zA^(An%KzT1Q87k^VXKOxVn-GPu{&d;u^rXJ;GsUn@)nF&^joqk0q(7Ka9<~3@ma)uD zC^V&VEWS9s-ap+!K@1onDM#-$dKhy<{Xk6J@XjCB&A7an+hf=;9+vaca$AbA%;|VH zhoof#8@zpH)XO0uz}m`ONE5Z-&)gUFS>pKBD$b9RjPfHAY~JnM-SLJ3t?DLJi@Isw<=~eWjhs+H$g_~MR}Umd)Vg=qudX_v+ZePy?~~L zQ@*o}PdG|bNm}i-(D0>DAO^^cn)hkSb?W6dYsr1C=AB>G;?iG|7k_XMt)4q{y~Xvy za${XpY5vba_nV^~CgZcAlB`>R&rF`y0;?6oiUEF3@X~{}s{x9%4K=zg60JF-?b8{a zPcd80b_vTC&u(@UXg{#mMDa_Ezx3shBizFQy__E%$$`t}n%nXOL>^yAw!#R=1T=in zE-1+NNP5IF?C!6b23xVN6N2T;cPLBT66R)*rpY|rM|M69TwAAS+k7bby86of?4A?N8P{H#n{MSv zrf}*%>0#{Lz<>US)^TEUNy#w4eqaNb>a@(fM-YOh4>^HvWSc$Cw{LJ$sn%~q^U~di zZ{1L%tOxT7mlaYLGbXS4b*eCiq0F&-Gmh>U1ps8%jiCjkxtA`NtPo|WT;bD7SrPdQ z0GVSIkVEyLqcK(vj&;!p@o~#Utje}>Z+9WZq-{Kx8%##GY&7MR*)I`!z~4;SOSkpf z=V+p(++=fp4|(w9Tg}!#=aC>0>FA|Vy8Lg(!lj? z0M`nz0Oe-dYc)8&{?4|h-PFsL^m1{h0y6-I>_t5>!-S>N2<;8}89ZXrm6!;>R}6PMVHm@)w~a@=A>Pz}NV| zSNx{Yot$AkD+gq+a)k9Y#TPeII7ZkX@mIb~?CbFRF`gVw zI)_KZvC}m)_HxPwbsXj{D(+;72~)`6HS5Sw#`8}FiM4tZe^N@zwF>7JRwS94LNzPSBBw?MsPE4`KlfQs^+U|(KB z*&Wqcon8!-lf^K%ndmZ1pzEZ+xROtAPu}LxwG^B>S%LO7oRxPrJ1l3`VO*-0Q_J4_ zO8>m$N8V^1YP3_#%49%@TioE@3$YN_Q*T2(xiis}KofnNeES|O7u^3Cz?k~@PU*p& zP|khQHf0S%XcJyKEJt5K(5L=r3AH`OGuc|6=UPrcxC98-$wK0E~U?D3%(SLq6D z@IiM6P0@JSne=u zU9(WHU)JZ@9C&3z7u>PytOi-{YU$SG6X%coPRz@eH+&w$Lw0$LjM7--h^=`h_|?Hj$Zq3<*lfn!b0B58;j z=rgIhFwxSTauUeJTqQi6=!wKkw2EpJj`6LbgAH8Q2k2MggR=}-%USf5=(>LhEj=px zUy7Cjsf55ii1beoN?bgOm8b@Eq1up)e5U@WHzu(vS z*ohiB2?^OpvxU|{F(FQEapCTJ`#@jDv~D#>9>jii#YS!6d5U83U2_kd{I>QB7@ zqL}Q*0hPQf3M6v3!F#>}{uG1MA4(_PLIZFp2M!Q=IhbO=<9n$Uo@HX0;kr3-ajSa_ zwJ`L(F+0V5Ou!z19#ZQKA}SR)t909V&{w%tuLk|WD-Ic5=F z&qN5!&4ll4G74SDVXfSAeOf(RTV^(8A5HwcD%`v zdj_;4CC+HG$)tW@+q4GZ3h!A++)=*gqs-nb(Z?VER+!~qq>cT?`{y^hGAQs@od0+M zURVGvdUTUNjC1?WHc1xDaC9N#xT&meFP48o%y}ks6b%Hz2w=dQH0=Ks4)xC>C6k~z zHDLb^GKx3v>|gSb21p{_C?Td!`?n|A%MZ)+#VmJ!XFKND016yiT~EwFmifw4W#jTfMmh)d0JlsRvkH zV_d$$oDC=U8}u1;%3JNIwr5+_n&3&w#Uf%kR(JdJ{d|-@SRq1+tHpl()+Or)=ExiY?`a~_6 zvWf!mAcd?jp%Mnak(RElV>b=aFW<<{Ue9au)_U`X!*1G1^aFNbA1VikIx5rC*Gbe$ zLT(Lf3-&II$V7pFwPz&mvU$ff!opVY(65DvSVV=lpHi)G$5sF-Jx^2o&?iQ<>HU`F zpphgrLgsqwzbMCgVEK+@H=J@qWkBHLIx){@1`w zpN<;n24NF?g|yZYzqw4-$E&+4NU%*Tq0j$p^8p&MV%@_5Z{0b{niJ;~V@$ppJ1Aey zj7T+44~A-%Pm+yMiAg(9VO(Yz?@U!DH7L41=Q#@)jDOzp58giveQ+ z+#ilXu3?zG6!eZPXp(V)g}j>xUSSZ3=zeD#V_LwKH{kw+)j>@>*xpkxQ(Lq_gtP^v z)PUN5klYg0S-*4%(Pqdpp_VdXrYNj;eX{wfi48=&XdLUJotL3d8Rx+ZyyG56jKOWchT>>(D~0 zWFw3z$MUS6>^oQdj(XBcPt}3f@pF62okNHAL&=v+55^P|^eSW0jEHwV?RV@w7H{3q zk)Kn@1WQ)AIj94>a3p9K`224m^hAd5rA~s)VvjUyoe7A;kx`YD_x3a81ACJSsWlat za3P+mf^7!L-OA4*IgXHdn%}Wc>Fz7uuP<;bA)2V8|K;`3te{W$yqYjqC`VnF>NNN| zKk%(|*P^VJw`O&Nz~|VBr|i<~8sp$`-df%NiYV0js#w|%gYIx&DgX*Y>@*ChGmSv> z*WUSly5^Vn5jD$;ZoJeF2?iWug_Rs0$l8gxpP`nOI><%$Ojza?<`>_K?mBa>Hg@L^ z;=ArH6Vs#~l>wIh6KY}ai8CMTPDeksnQkfSVLc_{cJ5(sMzO4^tW@ySfXStl#a6m4 z7Db5Ha#h?={nby<}FEPtymUxW$fVjC(G>n3~m zyKe8cIzDfW1Kvh^&fj#Lo&R)hV`8k$kAdDB7nXo# ziFi&MbUCYg%Bm&uVLDR@`I6>vNl5&>k90!g$2!vo70ba~@1r+<-0aY0^MsrChT$ZU zkI{>tRdq$qle>n{yO=77$q#aYTE4rOy8$4!5s%@5emPzIoFOf6tO3?Skw z;+1|QFWWo=)sJ45zeLcFR*lz=HOQFQl@^49yK| zdlz+=qX2ll{{O?5tbjcl)&TC&RQM(aB!RpCt|JqR{lAl7jmORR-Mojw z&&4KKa3vkC3}#!^kA0y6#EW8nY4iWdjs>*&gMMqrvfAeV$&O{ysvQf+zkb!`U;77i znt!KW`dQU4;OMFyixu@d+r8lGpS)ObfA(MkpvUm}`z`p)3qiBa&{SIcIHeMS6F3%D zJ(#iqQSv(*JNX;aL_>C!DA|&~0MgHbpH+5{AiVb?*y%|knLQH3MfI_i4(R!X2E=*! z-|W3O25otDIsfegOsvW?m3Qa2V(Fa3y)Mk@fUzyrMLxbB_umB0=rW&-m=?~xJhI8B z*>vx2iMzc*! z!gC+=oZT{~I44jb`DK)0woZQrC!vNg>=g42bYCC3RT_o&9u=4XdVI*7w9u=Qx}RvT zZciR}06*d9sx>q}o*QO7K1f=KL3Md7MYo(@XI#FnpK~DWT#A^!(1|q~AFdsNPO{x* zXjY;DS3#a5gas>C42%^1>2K6;t>lx<+mUz=E*6qe7=FRU77b1Sc(OuidG%>-bF0V&7QR>OM#(G1h6Rkl^~|}8t>lFfBqX$kqymK7=B`oi<n*F3BBb2)EUi3y}KahZE&<7WF(9w<=NhCPWltW^nZp7NF3@fhUdbf zx)LX-;LiOkY1}*~xEetHinUpogG=u{@Q4Ifv=MAX3ZBhnT-m!dh1TK?RMN|4s#sZjj4I zwJyAXvZfZd0s3W@!qhw$2Mabse*~R47HswBiJSl3um}DH=tx1cnZE)${?5Ly`MpB+ z@BSX>QGru(=V=voNu&*47;r;jnZ*fEwh&nUp=fjz8Pp{|QifV|1E(%Ny=( z*VxuY2eR#abVQ>2y+Qta%j`~dkyn}or={XMd)=<9IJ=~V1{?2x_(0{{cQ*g7x6d+X zzB1IGuHUDDbuv;mPVP;hSxNTVI1!h}z1p74Y&;@%`;+?CBTDfO(_}u{<=}&aK;>4W zcR7VINoJ={=st+^RNcYu=A3w+O|9d&q^Hv)Noz3s>L%*qnAv`p7`;PMj~q@~)~Ynw z6yslhGEMmF$-p(O2>y7SNm2#W>?93 zL+3X$E2TEK>x=|lwNvdMDo}0_+$-6G>~z`odRxxGo-#w%>t;=0!juR5B;t%)@L$<3 ziiY+RH|xpkB)bXkyY}GRru~IAyKac9n%v)dbCEwr&*9R%W~k(cI@9e^NtX9D*R^Fy zUQT|~CWo=ez-9dPW&dya>iuW0Me7%d>;-`R-5)R13_jxKUF-*z`HLEpE@k&#-XNGq)O`$F$1e5M*);Elez+kHI)+pJvb@)}aLvpP_hwmODL1 zDXah*g?>$&EvNu4SAmD``V^ye?ZvYIjDv5=E|GaaQmY#dhz+?gOX~w+1k}V36pFs4#M)C2JiD{ae=Ze_ph||FY{vfaDUWly0C82xCwS6ZHt40$-b>MI0-@ z?gCh+0F^GNWDgdO?e?XhSQ9z}U`s%Z>CZarasPnMx)N9d_!lvzf9CD|lcmbf>Yg_6 z|3-gZ^?cU=eCd)Y57z-EL>`(TkFB~uCJ0o%!oyHV+aMv$zJ~t5FWVLs@igdMQrw~IX@2UG*8tWB8d)7nF^{- zyIr92?RQ!ZYqrvJiIl;Ie%`U7;%nRefE|o&w=wYI)dWm&*~u@Nae7+;>`Ee_L2>8` zmT3by4eQcLCTLI)cw)Iwc!iE<48t@Jf4mrY5+-3X`4cpNCxcR6|2tbi6e=I(G>n~O z;Z{~wIGD2FX&IYBlaBGHad zP#c{vKMz#J&F29K4A_Yj5b44byH+^pBxnWfLQ?#8+qL--?fS(b5B8EDzhRTu8THgX z$Rf=XtMw}6sG;0RqONS<<7lQQGjgu0UHC-ojxD?Qd=MeGXZsZ|YfO5)JSoFBn8=qA zz3=oDki>B)q$B3IHo@fbTV7MU&)u$BHax_1n=uv4b*YI9uX~HU9?OtITb)~+p?=gJ zggMOcCNG;?rT0!_&`?W%ym(yzBs*a?H4GZvfBjML|LH}P2p^c=F6!LZ_RVw+L>B?8 zn|h7mO37%R)1%OIFC`&fm3nMd$s@Dki}ah_^UBYXhW%Af6=UwSbJp2hlEtGOOr9^3 zk4ivinMt7qvCd8YoCctH8o-4cMY zyD}yBIqO=T);byfqap=z4=Jf>p2A?^I_m6qG9R2U~ zauI0^3@jzXmC)D&XaJP0Rj$pe)$5e&)Hg16IurQ03`ETn=271lkO>{c#=j^1m^>7< zkU#DU?5S(Oz5ae)5yZle8WnUxp)z2T{`hAy?RsDNnG5l11F;A&=l8YHl zmdKk(W+jh=a6}HO4#gkR2^P$oo?!)$CxY~!Ubz?|m?;)!b*tW$FS=&uqxa4|yL8Sq z$MikDwL$#)m~e>E#f5*diT*c>_+NF_K{{OUw+G-?Wz(4|Om<>ZRPRg+9bSxD1if`X z9~+Va0*$#AEEI319F0QrS0=2pS@5T2Ft@O|l(3k!^4x%QG-{;AkPLLwd^uQvn^cr5Ec!LOhl-#B#vU!M{$wfB+Of%*T*Mu`S}ElPMwo&Q*-fw&G}Z(r^{ zN-ZNK_w@SMkMs+uuOB+u4b(d4ZoldL&CW(bsWJbtVGo;y z{48m49DW&Ejs?Tuf||TOn8Bdu4yhKFNd1w#Hsco4_kn6Cr+2;c^|W{5ZH5lesu)g-w|4} zHx;bCaqUhO?*m9CqZ&Ox4On(QpKRUjB;b|6mqQal-Xx_aD>(~x?v4Zz) zImJ_lHn-n0;UG9EExoT)zaR3<3g_XMyjI=(6zgT#mMOdt^C;u+gzXP`r3h&Nx9JLc zfQG#z{Q4TP|mF0bTGd|V57%`rOzwfo5>vZP75v+ zKuC-iP7i8=I2Q0xqJpd^vrIcDfseBSKJxJ0c!itVk#Cl>5h=kET?fz<=cXjzYZ}ar zUakld%ZU_J<}X!rXy$bkkLHwI+tAbAyhM63irUPoIvG zwkAEZDoejap^gW-pL+0XFz+8Fe`@|L@xsCS*+d@I{mDf>^cNTTA0zf7UjRRt2GRZO ztr9))sk5u1<_S(hPZJV^?ODE}apxQ1#ZneX0paIB+{L~$6bZ5n?6pL57S)~x-KJn4 zl%s^Phi4Vbgstd3g(u$r=51~!YXLxi7s`Og4bGC`sZZZtGL?Z`fa2vBUw`jYa4o~M zDUcvqUj)1j9=0X>cuO#RnS))dg%-A2$;G`Ktsjg-2&1@vZBc%SFTeNt|0F*14?{nZ zXD{5^E0tg|5F+6q8EbAa7^!63Fn3~DX7`?bpQ~h2B_6C7zL(24B9+MZ)Hx?w->bVx zvMqZA8wOmZb*JN~1_=sxDLd6g60Kh;KDFAbjNRH3a3@_{ci=f>vA;k@r`AjK&)dFW;A*k(h{R%jl{V~2GV&u=2XX;0ek4S)sT0JI!m#eeI>|aHK~L&buXOYNI}L{Kni-4_>5x+ z^1t13Xl!c5U-Ty`{E9<&Rw|ocfR`>ULLmU1( zc|*3~E&x}CX31$Rd>#Vn<``{=FAOElF;D>HtF9)Z%{TJNu;FS3%1y_246rQzIt2~5 z^v_zM{poH%HAwwKJi7hs$yLzpSj`Q$EB4YVKKT&Qeb!gvz2ck)IXyrG%Z{sXL!#%} zH|BD8UT8f}lRdgL_T<96^+!h1IU&X8W%eBustZp|Wi}N%IFt9Br--SCyPJP~%H4nu z+qLZq&r2VpbKA3@cR-!`ZcEBONA=x;-k-2LuvL81waFk7Tz*VGNTe&M1}iFsB(F~< z-;OIczkmuCIFHUt9H<-)zf>r@qiA612aogEcy=}mzB76DR1$awzO-p>095BZs3M%) zC4}K2Q->WNR6|V3JT&kdq51j2o2s`v>VB+p_cRdCKM zlizl93gxV&atsN4h~o5_9Waj|IpFUvli2q$p?*BiM36YmwQ`mZQTT`|-X2UY3r(!? z9k`M!8(x6!Kn7cM%R3bGfvk7Ago&^GGW$6Qtx^UxrVd8MW>jfd3`mo|Z_Qa|Pn67G|D zvE}h{@3K3laUmX7va;Oz&Ujo-e&G)j4>=8A%9|y;E$WUlq(h$g*JZYsF%^_f&Aw%n zJA&40HIzRi$&Q#0*ngM}+p|OvDcjoxJJ)*-&fagqu0tZ6OYj0q%ay6PP*b@QOu8^- zQ~7pcruO#7?u2@!DfEb<7R7fuy!_}h(V2zkU*?a6mj`4Zk-UVJQ7G!M0Aezgo z>Z<=a!Tz>J5efQZ7qQ-wrsf>gNK=Zxc;dT8_ZzoEUqxNflhlmC_QJ86xH9rPDZ&UqFi3JEI(!naOn{bz%03y=_vPXPA=x;T>|iYCpf6?^a)Y zee-WV?B6ZXzjTQI$xjC`P$1r!{l_fuCm_kF8Tw)){*4QzM<^hE$6*d;uT5qz&ztrP zt&pqC*)SsB+|I`m^B(;I&c;$idRvirW`r;7HE=&Z%_6*DB2rY`kQnWz)JLZP3~Tm7 z#l;u@YtsCMMWpIEhHa4zA{4bWxcua&M~^0LQ#{k*uA+5Vvq$C%Z;!0rPQ2c`(23NA z1(Jz|j<4PL^BmiOJy!$ix74l~n|5aIlhDeGovSSC7aO9S4tjF3o&VFjtEG;?nSl*f zFUEa}^gWKurD-Sj876=2(tqIQA29~e`hfeUm+46#d+h*3xZ0axKSjD7>^yo>BjRv1<}#jIgEFnIh|EkKyIhkx z{x!1wYSL%7lP%HrcuRaKkFH0B85#78-5_7OAiF0tN3uLw!-0BaQNlP!qI9rknBad& zIX(Fw+MCl%xiR!!x}ttbZ?!Z@8hy6s){vHyM-~C)OfG!({*`8b9oJ}%ko&8Y(?)u7 zk8Y+;=MK%*+w33WF*T_p58LVbAafJKpIqO?MLX!*PxSv>GwbCf4W_l&M z1-;!mbsJ)~Q8~Q$&a9c(+b0b?LuFU)k{A;|?!QoYKn_Yn$Sq8jx3sqr#>gZ9MtCo^aW%-^&$V+x6CcE6t z+~;JJet7KYM~Nee_HtcPqTRrp{};7$h-^Vv(*T8>*^6~>mL1`deBXEj361=SnZN-Q zO)ILA@$i8UgEl*l&*bzcF6(7@F0QT4Xx`~w;&dNgBg}qe*sAf3bw}bcJ^)?g0(>Z= zXrPWxPOr3anx91^vrx;^4?nUKm|Vzf;Eze1(3dAC^!1JFGRG~v^3Nrw{(E|bce^72 z%0$Kg^miyf-MJpZbUj-n05I|a0OXXNEudb1frR7#>=^#8m6!dwLGf>n;kTRy#cfFH zKky3!9L8ual6(mpJ|e&>kSW3319}bnke@ag)f_BcGAM}ofsVAGNM{E!wS04ir}2za zd8h7YjWlF@8MxY%>F@)aZZ`O2QO2S)v#7#8L0g6)zJx@S6l`D*5I_@#;6%j`mtxRx zYLlP2hc#EXs*a0o?iag(-qf@$Lmx9V@{$}Kh0j;tUEM*LrmbEe9Vx8}yd1uXXh|vx zhCtH{^L0n4?u-He?wzFUd!lMfIX5xG81M&I&trL(%ax*dgVHkJ{nXR$QZ{|E+dgS{ zD(ko<7%LXtluZedzV1|`s9dv;&1bQ02MZ72rE8AC?n676NGDRk4tq0WLU?x_TeO;d zAt8I%;Yz7l;0v~N#3dB$ZTD#Ty3s3-{gl1Up5fPy%LwJuK$;_{LHq!{#U1$o!^h+! z7c{u;cSrNsonmMtI~5&RiyFQbC2D-Oc45M^{vOw@t<;=T+Mil-I)1-|;UShF{P@5& zpeHe)fU*ntVu~W>J4x`zSf1MBvz`N(Mi`G*LwzMCoT+2wQZU8v3{=&|z*IFe=-KrG z=s;N)Kea4#O{+Vv=$`1Ot%m55R-Uh$2D%gspFX{;o0s=;ZNay%256yO_tMR2 zY8@quyX>yi{)jhh3E-zky0`+{jnAW?@uQ!=FGb3b^0@bt>0v{yTsp?M7Zj5?5Gd%K z1zKl?p12#WICylQ%7mN0kGB~ivXjZhdj5^e5#nQ>?Nmjts|VnhnEIW5!WkoWwF2Y_ zuohlmRl?j;Z2HXe6z4pl9o<(cP`G9Y)%1;gk51C;jx^~eYVZ7~!KU3GH(k=xFNtvq z$RjLtnoh6}1=NGggA7*L%Hkk=)U&y53vs;VNwp{uxsho_hC-@$<#^SoniH`+vxoz| z?!M4gpixVbs{;h9Q&g=;j!qXA^-C!mFCFQ&6tv^XtRFdGa4laNeWiN^+ZJ!4QF17+o? zSMQ8{Ip#Fn3WC$PIjfw2c5E?bzKlX!ZJ{9~OIUeKt5Nu_Y4-jSGPOAtd7nhqoopP8 zFRt#j?kz~i-|W$BJQ`{Jph3snF!O`+IpP3aHoZuXf{#AJ?%p;`@#>G_|C8tk$c&SUW!d{LH3V+%B*CzFnbu(1S;KI z^OC7Szv@UX8?~(u-$-^Gfst2({LG2Ej`~5gCq;!6&2X0kC_cK5ZlA{%!&lRYA4B>W zE$6QOl;jaOuco`J$R#@7_aj4LVXABm)2-Qz0y(826vaTq?qNS}R=OBnd~7j@{X-X1 z)ZaFLN^#^A-MZk7SwM2Ur!wK;3g#!e0pM8uvYKw`xcVjJ&W5e0Q2rYpT&dK0X(Q2M zo}0z6W3wPpUz#*4(vW6A#y4j7soE+w!h?|lwTB&{y$A_<$t}T)T_x!K^g#Q3D!;s% zfMd#qMeQzjzo)NQNy^Al;<|I?h&*q40wkAxs2PoEBvRC5Rwq#&6@yM}iRK3@)Go2~Y#b%%5FnoRobFWRM zZYED)T#t9>I~C_-ma+${KQHC=_NCpHaS`>9+Ntg;AXyeyfX*1_cT(LhA{)O-J(OvH z^6>Y*67o?>h5?_1g(5_4R9zbPSGwjCqpmxmVE5{~VrpV9c1DLb8m%TK&!AFW9Xj=6 zjFU`|C#Ak1#r~rZ4H5){M&lsz*>fx0u;i2_LZxdh^9ANV8jEScW8( zr*h?8DYmHmfl;Ew^@?EYb5YIO2yQ1a)X1jWXZNgCzZ?_ammX@*NN4R%GfO=ZeoTX3 zqAO2N;o#Ad!($*RAx~r?Q}ptSf2p>L2GIFEfs=H5HtV(AG+F&mNk>JF=#~~6wgqdZ z{ow}%P&mcMH=umeR@;0P(meoin3=?W)&yzLx!mN_ExSRnm449J7tZpt&DP82E>!{= zE*=??9kAVdcFlw7E5OBa2O5DBNGARc-l_p9`5X=QpG-UI{dY|}0-|>-rn~DNrwcJ= z@?t(lc9zYx^)B-$Y<3brf$1t-96vLY4YH8RsB4(NFSmmI$K_W3<1C~d)yF@4Ske%z zwmrHK^7#?6`yX6R-Wq#=tj2Tb<3BWQ!H+*q1PVUMctAQj z`QWBkR^ZL6KgUVzPH#C3QZj|LOfK+T)!OuvE|*&+3TR^+ruHp4B<_3QC;D>6tw^=< zX*97$P!Ai~f44}>+tzwpLy_#K&s{rB9=M)aSWofzQ}*V6Br?AL?eDU9K`)toaCUw` z>})q%7|B?LvBco1c#i+b@f+6(FHHPmHY;021ZNp_n&-aqV;>rA-MoL&hb^?$9F3;J}tSIAYVR7~QNtf@gJr~{+p zi%L}UxdrX<_g0Mtj=;K&zsz6*;~*Ks<_lfF1RVZ}3rGjt4fKmdU!w!eR7{2!T!KbMTxotLLS_iKK8@n!`GPYuD4@etUgM% zD6KZvBgmiq2c3ZY+*Az?zk8=8>fvsET5?8RYNOJopMI3z=mhe_bmi9-UfZr-1typV zD;qslHWzP8l=hh(r+C&!{6wJZosUDEG>?EC!DP&sS**Wnm@uzVH!R(3bWi#R;X-4i z5^1Y=@4I$abXDFS!!F&A3WIam%g9bR7yTUt&SOwdIx-&q@tyJQofCdtsUq@Ied)$E zB89nE_LecLhF4gi+%&84U-jRh$rg)i8j76g>OqhvCH#jxseWqFD(ho25?3+yw1S$e z47@cTfzG+3MX#KDN$p*WUNh$gWP=7{;~k!iRAskq9CuCg!tD$Gd^jY)_Hi(O$w8t7 zLh?@E065F%Z?_-pyZ`1tcl%NQEpIMZxg#V1Q|DSnp!%`gZ&WS2M0TJNm6S<)9`j(Kt%eXxOUj&iIt)RTr^z=6_ zi>GB8Z1{U{yOZBIEVAyZsmk=R%h33|2%T=+mPG<3|7t1?PF!br>M*dcK}oC-@lW6SAKS%${(v?_lK93;Iy|bL z3%^VyTnc;{Nx{1|?AZ9~GMB!VgOm9FemC)~O4&9{ zr_0>fC~|)QNYdh#hqn6J)7xJAUBNR|J*wtiNG@R|!|FygHANWxnx2E}HU;??@lhIC zUp~aW?na0P4oNbf6n{>ts=R^)>M<7+xMUyX1Pu6y2SPuiLQ|z!i3ru{yV#w6vc6eo zDlzv|4aa8(E~XNU?0-UK4XJzlK)cT;bztJS&#QXhlhe&h*IG3RIq*gd4;W|+TMzrP z-dKh#$x0)em?+~OQd4ePfPi3U2|U;^EBaXXl*-)JCZi91BFU zUg+b`cworW=&iL;cX#9o!-jNO{Y!Cq>B>Hvek08d%=17$^kaIvlHdbmx`m9GzhZ;( zk>toTpZ#7HY>&^@aQ~3>geL*)?e*rFFy`AAYIJwW(dp`6o9{nUOlam!OHfTmaNb#no zT*VVxLi^1PvDTs*)pb`YV;&$qJ03=&orE;Do3d$``r58J=qD2*a~}Vu&-iIku6_Z{ z2h+}sINB?pr*poxyj#InDn;dT@g3o|lp)=1jXSq*))D0T@SeKq=9L+3ZHj$%k-1!R z-i5r)QJH4R)5Z^rr`t|{k}X0ReP-BLoq=bAZPAAJJ8G~pzj4{;@u<3H+9zTg;2Ti3 zB(%sE$Gf>6nGOPb63VgI!txMD?|EyOb#{Bfp5{jDSoKqaq95B&xYZNI<_3*liwo$< zv}sMHPA~Me%m!?`{dl_+Y3StVqn!mY<6VKWC$pbCND+AM<7_Nx7!_m9FRqsyZBSSo zyMh=8Og7AJ0m=kIknTeB2fVT_MHj3`?57)!=|Dnu0pcz{O!o;~d9Gj~T`hqO%8VoE zl|C5JTC}RdzmGmfFH)Md3^*I!XdEZLEi6Z=FKhaf(EP`x+5ji>+PJ5wwo{f!vL;AX z)#E4W!CK#%Uc$hI8epMb0!C9^w4T)MrdPG))Awr|i>m5X4ea%Y)nU2)B`6C;D{BmaQwcc(1dy8ldgAz$?s^mGoZ(Q_73_phH^pq!RTT^kc8Yc2$j=TV&p$70}MJ!dLc#Hpqi5&EL3$YkyR?rpUfm zc8bN_qZaVfZAOqk*=@Y4Dj?t_FvIB0pXUyp#U&1y)-7kSmu=rSk7X<$t4xLeG%T6l zE2`%bhlV#s7xg;_tk$V+3A7aQ3XLGiz{6GX(&>8M9)1BkrFI2Qc)@)h&75uDM~m*0 z_A^*U?)T#(+mf)2QwvAvzU1|$fD<8Is3Q})+!rf*cJkkqn!EdWbKsYmFSrXo)C@ci zk$0MRsNXl3@P!GN`B0QRtbNtyYFNur#MNpAzFz&idTmWtRpbNa=_<6-bZ;V#et5D4 z9*o_I*laI=Y$j~0ldp6MR#hkFo>n!_9MihGyUy3u!Daq^^2LUmtwEc}w;d<5pXRDg z!Y;%eGHAegU2v+KVOS2rJ5P)7v>vbBO8LPl@#}6oTe|7TuBM-FzkPZtVqtf5*f`7{ z?yZ7RbcVj*u1R?{{K$D#(Bl1^JPceH{_pa^~gzcnzHpK5Ri#u|3;Z`>OeD|Tf z_0^FdH>yaEKeF3T)bK0V-EGi7oVjW#mx#TB5sMoZW-l`$rs|#>rDJT%c@^j0oxUbC z_5(pOSuA)W%3NIRQ<9GH?$i(L4^l+bJo#UAz(94L*zw(j5>)qS5WCp3Uf}n}%hr83 zf(Y{t;|9n>K030?NQ}7xb)(W1XuRK;=}+!_-VK zcE6x5KK1o{&j~TM5Re!(NVcV$+Qt=71=XFxehs2y*`G#gzSjj)3tC&5Lf#@1*yp{l z>w+fVxO!Ci*l3ml_Up_|IL&3LfMrL2!{YsS#rF*|fCF9x+RTMoX8UWdEnduKK^D-N z7ij$FquVPXoe2mHkG=Z#d<873o`rf);s@BWBLOs1$A9zKV8AF4xOt)LK0 zF+L0^R+WJ(?jsSYWCJTF{82U z(>qIMdqxbkKQ^f;A^?8!LG~1KH+zpCoE43|F;1tBRS{rJQ+h0Mk;hM)p5*KAlu55@ z3=pEA!rWPcriE3#D|ArPtEhTdPQR)SW;yKLv1XRSi7p2DpQK+Wc|Biod;ub4?? zcFp2DfX&6;0#uSsWvpjNTTm8UJZ~~0V0*t;5D^NiR`7UvVW2&Uf@~?<;WdRe9oF)2 zA^9tsP;?hkNZw!LcpM$u^!gZ#MqT;4(e?3i#~zjdu+lrD87-WJOIItZLA{(+hWrZb zvAUzsT!|k7FbJ$^H-WmkOLzu)%(jD=yQOH?=sYAiT`FjN^Y-+W0k{?Mfh{&eFZF(}ElDF-GYZY9#Yzjm7jb zY)E*cu6HbbI>g@2P2Z6*rF+PXKy-z3oqCU@3h+g4(T1N(2O@!t;IZjgR1Rziy?p$K%Q>*LU={D47r zJBU5v9|g#<8w4WeQEAMR9V@VHXRXJ~yGNfFe>u=S5n5k+5bti@6xV+IkWE$6g;Y1# zcAHi=U9bIbYBRUiT_3+5P;{I;Ei9nO^ zBo*(E26q-MXNYffv{-IF8EhpFy{^gMc0chY_)2!*BO_6*Qv}H{cP(%DX%qb=;u$y| zV(yfs+2NVufQwe>O%%nmJ*u)q!V`iZzDe2kVF@JSu(xt=!VO#2L*AepPt9`^=Du7_ zYPh4+Di^6zXzON6DtdFxHlZV3Ov#{ONjWmBBFV4a_v);pe+#YUfuBThotJH@%@?2N zmt^c4;pUn53!e7`io_~ICQtb#^xPiO{Fq(-{*$e~=|gF(U_V<@1YInmkpppV31#w9 zLR+v~sco7h@rDL6s3Wr1#3k$D%OSIApPOBF_>Q+5i7o@DT|&)=7j7JgeIbHI(jK3- z-TltU%HXkbr_t;6iz+%JCXNYrOZyxr{5N@VA8(=~lWv#Z32!a>+#=Cv{CTM*jx^oY zrT2(qVC(h1=400U>r?yao3lfWK=c;weH@d3*dDdZ81y z4xXxZ$i6_#m*(CxM^!-`{>cBB6!*hJD2Ax|;ibn+<2j{3PwK7nLvJY)F;;Cyo2IQD z<-c*kKd*%a@uM5Cn?RWW)rY(nf`0lrAWyqiftd5Nlzz;_@D)jeOG0u z8FC}?7BT``LSXK6p$$@CEp^$mJ_`?t(<>}wOKIx<4nGA~Qto*QEHEVWL$y+ty_x%x z{W3O<-A~>V$yfW(LP+@=5?Rv~pB!Lu=1Qkni@~#a-EHMAPftgO z`w5IOO?FCpgxB>R5!*DcGg4i0dKfi^3&UQA z(+`W!^;5RcY&yVoyp?&8PRR9Y9&1AHlxE5jSpkz801fS4`Lph;d~DWCT!3X-mU&i^ z^N}(uA&lw5SC2$`I3bFxi7Yvg<08d+7A=^N=bp4pxpPQMia2&}>j`15H&&0+AK~7v zyi)v-vUV-G!lToolp)fr5>k{ZOBR1}=hBk=h(brQwPmV6oZw)ARe^%0v$Ti2&I7~L1nTXESsePKGr@0F}=Z=Wk#ohuW)6p!} z>j2CqBsIPEr*89jSg;?chyW$YRA4Y)cHzp#=nPna4)E&Y<${3KX}Z!3wfmDfIWe^b z?LMoktF)F1sv27=3+5$suH zMEzd{ZvJ0|UpDwcm?ahH$@CdMwl~P1SqYhCLw%rP!G<%~f)jSISq3{kZt|b%Y^DP` zo7w)Yvl&Rb`$K254ZmII|NWXa?!0RCE z8m`+vMa;7v#NkoP-79LcsHyV(W7*l@B0N2PEn1Cx*ea#leFvElT{F|`}bCT3h@>83%m;h9xkkHZ(noee*KX$za5Ge$s^Q84pBY_3;V2DlA(7+&xw>~1QmXDtK%I`3}jQnUwlZe}4-rw@-3(DSe zGVk*~+7Z#i{ZEN~r=HrCKFgSN-u#w`FzVLI#zNKW1*2sTm}v4k5gW)91O5WIh!;ky zBu?6}=}1q1$`z7%ZfLY(f9r{GeH&AKw~H6!k0ihXT3%m1@LR$HY+RPTU5LKJLl}22 zK*_%Jjt)-~rGq+~aX;+TtHkS1TiRj`9TIdCzVNTry&uJYxm_xD$GAZ&b7A?chfCt( zGBOeoU9F^a`4c@PT=8ggS?{|$Iv2CGdn!_ju|?gMVQe$UdDz&!Up~jpXkk6#xU>6< z-ebrYg$+j+!w{#KC&`2+K6hkjhvulRV{@uVH}G3IB9tj5w0ME3cu$Ih*y5YTJQ*h= z^9e7RgK@_{9*U+^1a8@5s1ojFHS;M#Vc)!{orJ7ey7An6T&6U`+qi)j<^bKLr-3*NYO-hYTrWuHe&h*&lCEjsT_}ZCr ziPOCo)`uE!WN*IXPf4da(^2b6OcgRBo1Csr_ek$IB@m{4)}?0g6u}EMHC8uhcON^C z;63Bq-hWts9-T;en{cjyluLTuV?2IEH}j~hhof~K4LcgqUtZMo8U%#D4#~!jQwwh) zOwR3|F-i}%Cpn1o8e}i52^kHY!h7a40=pJDnqGT~6^uCKg>4*YPReB(k|Um~%Iyux zryCkkcqVREzAaDHm7#43?avntJ`nPa%P7z*mRpzhJn8n*snUcv6BJzgr_gZzZj8L` z{ya?Mn>^os^LLYUTT-0Wd;TnyeU`C)V?58TM1vZy&;IP-sO%Psj8&MBZkM)fA$YVA*D8C3VKC_BfjI5)zeTvFJ z+YM|!|K^gNC)bavreVRovC731nbbp@+h0aBy)^fWDEZ*$nHFcYd@L8F39&ZEjFhhB+UyAIXwe8S9%+LO!xkw5uIz^{&>cr{!OH5>WG&6(LVWzi$Shhs}5Y->s@N0U@&FIEzz zD=>jj8K=@s)QGBOkL;{Xh5AC%gBUd~tIj^fvqrHx70QLN7u!|}qs+xz6j^aVBIKL7 z)IfSvL%6ehq3MO%@ zRVC)_GXpA!vbkC{sLt9?k>W^0(}UMfdYRBXx)H)&cbfW6PBV@%5U&xqm+I0L_Y(5@ zGaSpBaY6*n7u$Zel?r=BYqt^q^vxswVvLN?*z; zd4^|@`??B!;l&WQ{K+B5)f0TXV`RDSx#jcLQ!YrLcIa%|=bmCt_`@dTM8^M16*H{+Q(R#CN*(URurxEE$ten4W`YcC@jx z(2NNH5ar8IsHCD32zH=Z$TkrD$v;=^V1NgU&?gD3117r;2CbDZ zK2pocYYl3wg`$yd5#~7D{V(gD)UiPdBDt4SJr!!9)8D#^dorYGf?{x>Nm$jR2UiF zjSLd5`sYA#X?y-HVF6nP*E|3)z^7xQ!T!s_zaVXV% zv#Y;Q&d=`*64xZ(VqY&n8IZcF1wY-lv3!phHB6D8JItabXOywZ-QKQv2~t5hlp*R%WLe&VCATrT&}o&ygp8|AZg z)p`zLUWXu+bHr4gC0+aEnoMFWR}FHGVA`kC-*pBJGu5!TwOLc6;naLVC%;M`dzV>e zjZDK!7B3oFX8D>N13>Bbt8W=CH3iGxxWo$5dd3?k!mnQe&=um5)E{~6OIH4HEcc`Yng024bS&)uJD z4-jr59T3OQ+@W!+)G{bZHUv$A64Xwf`*$;7xc+KU2z^!&(l&e-EuJn&!UQQ-Yj;_k zFRQ$jwL|6XD>F@GilF=I`#4xx2;K0nW;=Np#_CLGJBszXMSJi`$D^sFvlC!P9%VOrwh#JxfDac|q} z+i40v6RIjpj<=WFa9!lG5yJGmEr0U!E5icaZ2l%S;WtbXJXT)W%Abw_aEsT1uQ!{pqjP2y}PuA;>o3f#p&9I>n?OzMXl( z>W=5Biu~!jCedfNT#`PvAbarX4Czey2CMrSk!2^tUwaEX#`A|{KT0!rGjQ!~bci$F zUPWwX1%Y|wt}B`SE;xO2ci6R9$&)#I4AQ6V>gR_u)7YVeBE`D!Eu;JD zT)6#?cO3YspYEa=I2;`Ov$u2RM)RDTMu%Oz`MO&3aVy%UKhmDS2zfI2EbF)A;#Az@$IW@bckGF95zgnddLze-ayY?<^L!{-67xUkQzM2?ilVDQPVE3?$a`ROJQX#@7jDd^Ww8~D#F&wHF+ zWmIIT7bwkmNEOWr2jPbq5#SG#WhWArJWj&a71vDI#eP=;9+~`mc0G4l#<_IEaeepK zJa<03i=Acp_&DzdI7d8g8C0qSt<_lOhAZi8zWeJ=P3!ypynTU?SNn?P4LH*Og>Fu| zwl`O;VJg?jtD6qBT%qmlY(=EqAzoc@8LKFIpd{lgFMPxNX*(Yk{_aA6dFaV~spCV% zMpsn$B(Bt#SSq@IJ$%m?(R1IY{F^hafpRlOg-qJ+ zo(XbDisda4m(B8H5`8)G+8!~}^(RvNAi16``d zpn;XC`fEGH!H$AFs zsxMP~bIfav=G#%j+A?hcuiNZ!RA1@Oh0L)HkJ?VYaTYw$`mV?7N!{3Ok2LhQC+Wz* zOv&P*bg|02o?$WRhcoxaYhD%Rs7t@0YW^-d_^to4-=TR4gPy1}oh{?#~$#t1Gf4MmM)vKb`9>sIPDCeWj z9(}iFiQz5-bQ5N&-;Zxr;_6_m++>@Y+ga79fLfL>W_i{!CL*jM&yYD>30cWV5>45Zx zu|P#KE3|b#wFY5addmK{9N1r6VVe&8boT3x2S>Rn+3d~!z*+EtTsCh@)YWW3z|7US zNqxcB#kv)CIg_^8OK-V2V3R@X{CIl#<*{c&Kjv?)zTJF-ukt+2EqNdxt$)EJRRl$N zObuU|2w&;Gn_oE-piU}y>>r z{K$WWW{hyB^RFxW8MD%=t<$~ah`7K7>XsC<`2*30iTq<-#Zwn;;}(`CPTRO{wF_sz z4eu1VtexID~VUkG|UrGg(hZ^UWy3 zh#6&;8z?9>DOkBGo~;M9V0VN65w56Gkr9?k(=990XGGNV#wHl46<=4`wOGBF4Gf@b za!UP133F;m`2ZMgEAl-wSwM#ksw#p$y&|&g=3ZbVz&1kh-?(&L)|3-?SxHQADViaq zkmvqAYc=mH8(V`?PugvefT2NdItc$rbF<%wZ3Oi`mOy!*-Mmzg<$)!x?5mRbL3iK5rJY^m6SDc1f;Mv% zD8i%1yu&ZAI^FI)6rM;B~n^2vxjd%7HGuYku#Z6B<})*lN}Ze{rUxmUvUKxi;QU zr9sij;OklFB0*~=a9dC4r=W1!h<>4z{eZDzlE74 zBa~ThkfSxg^K68Dyu?&R^8|DZ=*3i0C}>(i0@-}@ZaOVu4oAOG+fY1%-oC($kXk>t zh|r4oysVi})f(Z_O!3@4u4F=kdTw{6&$G+sUC=uWlluM5qv<8KtuFS+KzwakVcAMS z=U7uaVvIn=vh3UKZQ%Xr833U0K3Sd1GZ%nml~Hq9n!JIuWWdM37qt%)9l7MT46NbP z(`d3Q#N0D7>4I6mG*ysn%RZ+0o@buj(x4z*(X33Fr(liJm=PdfE`ANug&kCiV6t`C zM17`z8|)%ze=tgf(WQ9W2`aQ_ok^z;N8BfD+!pE`OTWU|>3b`>i}Hcxq_w3xG;AQOuD2{*0pYd^9WTVUk#{H<-$(lUm@r^59z7iS?$^ff1BhZgh+X=|A{J2pD@NuhVfF2GA9+6Z+3jFt#2GQDY zbX5YuWrSUWEhBSq_t5ZKN&4idNu7%TsIYRGK#y*Q^92ZbWjF4derb2t-Zzi_untsh z$hFAJj7#B3c|An17`jy2_w1|_m#ffEEjuMQGg3teyaXlo-pB^kZ(It7iKemEN8%Tb zy5B7=#(^Bs$GKw|#+H^rwpArMU~T=#QAQS=vkc%wG7)E4wLw#2&}fJ-a^WYazK4Qm z@r;29Iwyc?((bi6L133t0ns{xmNAUFB&b6hy}B`oxQ?CP@{MbYVGDX?Z$ufh!5zm| z2R$40sh5yTp6ho&{key%>uuPnBS^X^tQW$+<849<0Xy3gnN9mXG(^I9s<#U0B&pUD~6+wTrxk@<&l0j{VD zH0>~}Rpt!r2Y5qKhXLU*1T z&wttI7S5KeL9O6bKuQIGlmL^p0l6B9NG-1Y?Ns8|w*0o;qOfmVpC10QeVkFzeDSDxVzi9LoHG=S+L1HuBg31E+< zv+TDvgq2BgjTb5dlx;ZF>JAFhxYy^t`gkaWPICWCkm}k;JRo-7H0EcC!LVprDf1|4wmb&|A0J{`lW20ugz8~h_Mh15ghk?fQB~1gBAb;SN0dtV1^(pZ{zF-lk!~zebyH(9Y9|KPK^$~h;dQcgXcP)HTpz2LPm4W$!Es!sZ>HTr z_LRNZRg3XBP3gl?aw=6PTIH&Cwl{u_`&mm|Y0=EC*i5X@OlV6YDp41d;g87}N^-d} z=wgD+OIh$>xQmaEbuX>H>7TY5DeBH4MlEvN0M$sl=_+$C0xg*2Uk$@omTmjV7f8lFQWi4Hu z)T*+@erthnT!C8OmoF6(LZn_%=~d zwovT)O{k+N3nFR|aqO$T(3>yY0UOl;Nhu1a$AKW>ePFSCR{X|w3`Tb|nFoUSTzdi# z6#IgZYqpw3?Eah3<%9Ue{q{Dq9WtcYnWSU zyywpAAcZHv6~QNaSK;vbQH5_@nWiH_ok?L1+P##k0V2x2OO1w!7Au)JX*F0!!95TV zov+2b>YqXHXQFKL)Lq84#Gb}WPxendJASM%mlb;A?TX>U!9C+7ua_m~`$Up5{bgk= zt*2|Tax3jZ47u^s0x`L^Ymemk4U630vWN9!;y}t@_}J3gUEp@5Z&^RW6k??otEj=> zi)`yyaVa{x+vSe^jr|o-7sqxKhr5a=oH*&$wqDPtI#KIZd!+V=v&ZZ9bWb{{i*x>K zwMrD3wl{T`cYZTuZ@#sr4w12TxeLkg&^Ipkh&kY@Ip&Qe9mprlU|QMQ<`6nagVOi-i1uw5*Lv6u%$>Rq;wyXBdU10E z+iWy?Hf=6(7pwiAkdOQO!(>!9R-FHUfQ*c0J_b)6&zVaU^lx`fcJ0nT?z1{Mbp~g! zxtxWe=2pxl^0$wCJ-*WJGdh-aTn%d`BNPGD@%wlB<&OzhuS_O;Ofzd(71_6GE~P*@ z1=n>Nt3BY;?Y*pc$fmEZj?PPVk7ywhf=~e~y*v*u{| zn#UlSUCb`sH8=UTC7bh>fQ(S({2Iv3A}hd(FnU-$?BvQzV(U1T<3Qv>v_l`}SqLmj zTSf+Lfi1vXUsnR|ASQ$>*#{SoX4fvZenx!uSD~;2YJo*BQPJ%O=j-fZgGmq4mcwX{B68o+EmY%#1B=LY_unpeGAd< zk32hv#1W@88shN_5dQM|39t`{;h<&qt+CElDxWq{#x4*?V#Y{_;_%hyvvG*_QL~_@oUJj%O0|`tt;#jvHuTh z;lGAW2^+k&p{D`ByIXX*aB?Nrok(0?UrH(#9j$|3KFeFa_*=K1TxRR;f8(-7zh8TQ zg!=z<@4}BCUi`>>0!=1DghTgWhu~`ynAHz2xIYB3y|Y+qN%=8Y{6Nhyt-=15`ke zl7MbSMU3KBlos8nfCz~6mW8OGphQJQK?#bAN{LF97OD{u1A>GigwO&6NCGK~l;xXo z-*ek3@4oZh^WJ^u+yD4UAZyM!=3H}(@f*J}#`c$zJ61Y_iS73=aoEgBOO<^y0yu}l zrha?p{;a??=H`mOxF`iHWkMI3TM2SAp2=V5{$6d)oHfJv{RKFQKH)y~#*0kj&@-UV zVi{Eh^a{1kCR0Cby**^66FLkFK*XtoZ6jb)sH{Y0BIAjo-rOLTD8r2SxAbXp8NE3B2Rko z69AFO2Ke9+aGY|Xdl1K_)_us17!6^r{$rx^f4?uL66^aJWMjh%nb}HfS2FRO3?Z@; zBICbYnt~3j*Ql3J>4+96!vknwevqP-IqvHvjyqF=P@m~4e(G;D;0O`w0`OmX#376U zM=~)-MMlMNB#}T@g&)FlB{Ce^ocxGfC@6QKRgMSU$6{%wKzg$rA{Lp6KKK(-;45Qt z;J5^$3ld4M+zVT36eAK~hqMVbdN)(lI_eVkhtEpro;C=KsPW2BQ( zs6v2HkCkOwKiE#M&N=AExYV5Sgm$1WZpYP8%x-YiS*Gv274i5Q%{Rk$$dG|;@h7!m znHj=DI^QzGnz)#}tGSS!%Dxe>I%mtl3leIQFr!{F{C;d1+T1UpD`faXxL=z<;%{SG zPAMRhg<@i?__lPdCs37V2<;E~Vvx+pyu8_z-VOV+avy;U_4!fysuvh>BE%#kcflPm z9*>+MPZ^WU(f=r+-VsnQAPrb@y^%}oH#xxM@SOY{)Ikxr(0(W_3qB=;@U)lESzt3l z1`{|kv1>{72=^U&lqtdwAiFhAjanoPQ-u@g(dJZg8bV-z8$HrxDuT+Qu0R@aU2@bE z_aI9cTtH3|Qe|7H?PXZP*L!V|iu&J?(y;6DM>ah2$7T9D)$gQCmhUi1Jd+ExgXbth2|*YKCY}Z~=VJ${DPTGY)SR(7QX;MufXCN=9}q{ML;}EC zK=EP%o&%L#mp?}8WPo%?Kc`hj^As}&>{f0Y;pb?|69 z53SFGaG4SuwYgB(ehZ9}$r-r;cJa6osirh+5K)sAZgLfJ^ z8L@zw>RKY!Dbf8!cF}jtUIwFx7ukEdQb_{vIP>Va&kB zum#q#J?m9IUI^%NowQBbxaPi7iu-S<2k#6I{Hj{1vPA1qpDFw1DoG?wJH*lXljwYN z=8peNj{R%u>aQ?x{;KEt?^XE!-Dl3Le~A4CoqG1m+!e%zxPY!tr5 zPn=8Nf4yW=@Z{UFr91Xv<0VKL+A$ipacMfHB93}1>&sV1rN1_H^hYvmfcnXultcif z(V75T+xa+S*G|eFB3=?EpG=`-;Oi%4e0S?UNt;v#>``;S7B@{UBTmuIAYCvHeH@8Y z=6o<~1WbAI2QxPdiSnIrcITAhXZQQ;#7D#(<0!(xnHNm~8=eBMqseY@f0E&;3Nk#n zlK=PJ$7cV}tWM(0R!J?x(IJR!H3y=*r5fI*>td-atJ!;r#Xy%73cv4H!s!4@Uk*ye zN{~F+?lfcI$F}TOk&MZ=0LnbPsa`Uv9yQ4za6ax=@t-tD=B(Zt)7L{Y?E=vQ^o_tu zo&lW5u;_bYJVm-TQ7AGYi%7^2xeK?mV}FM1m&e8=$zzbynC&PYDklbES2r4LTQL5K zobqb8a;RwR)}C;7i^HG=Ta5b_k^Qcd-k{UR;yk*-zQm*y9KW!~hTu9wrxE*Vpc6rL z!CwB~EpXT%_YBla`GwF5n(x6p|M-z|M^Lxqhf?UcD<*L~q07>b@rrFK5pm;o(1cEs zR94zz>AP)VfwVOG4oxBV#>oI9|JZL1UV+UMLgY4biTQRsaS*A)y!)QwKS=xnO(!5y z*qs$40h(IN|JN7NRAc9DqI@Gj97uG6LV?tLCnW|_jGX+DxLPJX{6+duegfJ=xDWIY zyi$GxSHf*pC_{g^mu$|3W4|T&R)f+~s6)sHIzR%*lqt5rwMjgQ`Ih9~nFGE=lRbdk zAfUeyYU2;3n>tNmjc*RVE;tGeUuPiNf^c<;fO{K5&Wo%bX&PfnI&)H!IA<|!)zY#^ zD*dfkzFtJ4_F|5?6cc=%pab~PQ*!3PYRZ&aS-N6)2lp3U5hcn^d>QUJc(!cUNF5XC zTVxistpX_FVFV)hIv*ax0Ea#+$u@$TlPvEA^T}moXit(R!kd48xWadgk*i3TLIL1b z?M})A;lBlvyl`BJY?P{m&@f#hZNBSh20^hyK>fHR|4?!ZGZ>x>55D=JI6@SB!dGt{XTLD5yKeBc&QjzM*TqYkRmJI)aQ2Q3Y&p0JSFc2fW@#- z!t*a@2|dQ#hkZE%!vzJ4rOV~y$vDfO>rDEUI}D0J zpiY0pEs8u5By0k!&Jc`(N14+4Eq8!$*>0^-Y*t}mcNwk+DT$ZInd{@HrU$SE^mD|Y zvaZhsN(`dPY7iQGoLmoB3oZs8Qqo9$IF=bj1yg!2!vavH{)T^Y1h=R>t2krWhuPYS z9zFH3gZKa(qp+_cQW289q!~d0cUHwt|MDL8@(aYf;WkXr(n6mZ(}k-?lpwcxymBVH z?Dq}M%oP-JhV(5 zOxO)bB6WilJbgw?{1D*xU?|~{9oOYI%nhbEh@Zrs4US=bA!`Z&rG(`qgx-%^h(x~p z`RSCStPmXiN-%pllSrmd^^s|6Q%uFl0{d$Ko5hN@L$NYBM8`b^$Lax+Rf6pboEetb zktFJ{&F`o2-Pl)YSf}JS$PGO%3DSl>KL2^PUYA&I=M1!kG+B>H<^eG2J+ANP7Z%D- z5PZ!$!FoUE>Le&jAIP>MA(Od3yt6y?Er8Ro(0lzH2psXSWd z*=FzjiSAZMzn;-JC`DZ#d!83~@-|_`HmC2WS$LJOw^{|PsDp-#Wg7?(uA=|(>`g@@ z_vKAZwb`Ejd)}=bUG99^=YpzbvxhCGt_?P^-2HwgNrfmNr6!e0J|uu5Ge;ELAo7joLQkdxhoo1R znITDHQzh-+2!)?vd^H0lK6w#MCC>C4zLDUcU>1P6?~mz5s_`5~hLHMd9MO89{ir83 zHo@;kYK?y#r#VB-AN6Je3ItI#pK>9q9rtar{h~kVNUC{X!ahmUXH`-X3x@7dKZ_w% zY(x&;bgB4@S%Tl~%M~Ao@2nrxcrzhwW%B9?2AjT%NveqxCI?ZhDRlJ;qVwU;I+a0_ zNC|m}EM3|@Q%=I2nMv!GCnKPYq>x9gqTwjQ1_zu_ZulW{C${wk*(Vs#J|9bn)F%Q; zTO`#2x{U{tBk%@^RhCqgoFHRHkL<=DUJqrY4JP|3&o4C!SuL-^eHN+2Q zP$H72F{&ahD?|&JxH`I^(uDP5(KoUeSWlaxR^V z6zjIx?9d7XyVx)HU{9b=Vd&}TH)wn#5n@k1rw_;@`$SuVxj+(8Z$ttR%BHlEaY;gP z>|4@3P@@1ML`6o05iiTw9Z4oa`4-XEv2>xv=<4RFNQln`Apm7P53YZ!4_J{tkKnS0))4XZL@g+sowRcau6-c8_+W` z`V9%6(JW)jJSSt{kbFTz%@J8CQUC0KWbvS~!~D z<>igTSHC2m)FEdS!v5V!;E%UTm&&`#$vlX4RjL~9E*xtmn}*L437GV7142nF>y0Mx z-0^H-`a{L;_lmZL1yi93S;=+L!ePNMg6Wgb28+W>S}d=G<&;r-g5)!#N)=NOzFwOu z{}nK4958PZL^4d@>61?LFJ(Gr?pHeHI6 zT3VI}aR(qF|6dn`GoVVQFefoxW5Y-Yct{f<5>sICC4@48esd#00G^DV9J4Y1d3tOL z*$9C$ggGUW@sZtHTmXs0YWyxNhaXBNlh|rHp1&jgk>wRaeLWsW77j&5K>^`{K0$g) zJsY+Bo2 zLxB~DcY5TDwvnwyCI$D!hu^Ho;?dTxxUn$y*qD`;F{6sC(zW-rFWPf|L)`{9pDX0Z zmxfl6wFLMGG83?0)xjGYbsORvjZ3Me#{^PpPpoVMfK#Bxxghvbv6l)b>x19u4TD4^ z^nd=2ix>)VY90riFbpq4HXoFt&@%_M0#||C)}v$`;T2|d0kwx?;o;>-lw&Y5ZTAnQ znx^0`Im;Jcg3N-d$UGCdQXW?}J^qK%^{3ntX;n8lShfIgE^$4+5@k;&JX-^Fi-q)Brk59h#8=^{gSt>@*^o-Rgg= z=8wJkO`so_|<2f7ogNWLD>FBh2iG`O~AVS#rI&M>j=VOs5B! zo?dlpY*?)QEhh2B@a=0^=d-;JDNU=KeppGV0<$XNu5$X{Oltc#Q0#~R1{@F2dGX(Y zV)?l@<@`hjxgYzuh{IJ7OWFr$AOy{2P!BTqD>6A?sur?~eBO^cJfZ|(us&$1<_;0< zV37^&hAz|q{zON27{lonei1gsJ|ysjL_+5?wh1jmG2`7YUP!hfX<7vq0q87?&? zDq$e8Q?^x*HiL7C-i(u<>ZDq@H8xI*BtE`0jD&~#S!TG5sGZp_j#S+Q6kR;v<4DxB09GZ2F|Lw>z%2Z8TRk=Yg? zI*%uMUIo8wmdHr;7l@+ktiau0RoEmUzT1VzqV1o71X zfRwEJLy5?}&5Mm`LjW5dTmBGR>Q17#Zk@6NSk2M)2vRt&57VV%ruzMI!ef6}Og|VM zAG>ihoEbYa2&&jO{AKG%n0Ulo`8&u^0ND`}Q#w-CXW0V_?bl{E0#NU{otC6t=N%40 zije(XOr769wTrrxzN>jkuvFZWtgn>`h_3{|w6MXnyiTQ$-^d3pwfV3nk7W5_vDQrSz)9z_Le1TYK(+{gp7?ylCaR~ z_dj9F_y>Cj2wwr!zhB2nf!Pqk98?J-Oa?%cZf*F!!@;*+f|UOjs-mqRXyW$kYsG`< zP*z4<8bcI-qf=wiMGF27dQBKnkqMnzU0ifAZ30yYYOU9SWQB47$lU0O@h3TjdC1?^JW$b z$HpN!-ST1Q9biXg~|t1D-G8H%|eH z6TTLOs=UC_8B;Ot*??JE#6u^JUc>L?4 zi#gq7#-Ry~PDNrb+zbZhNWdd9!QX&gAWs0%QlHBWIO7UQ^1(;-zkk$7P)Jse%jjPM zBms8SyZWOJsPInvmlPCRN$1Z=kSCFl48Px(Gl5t6&Aw>L0f3?N%s*)b0J_oR z^>ZO7$R+lQicH)G7B7?yVL)G1!h@c)ATZx%UfPU5qcHr0dj4K;=WhW&|CGN&e};BXRSNqEcS8UUxD79T1#y8&vBE}!YBmAT zcpc!V6u~Cd;=tv$5SJE$>-Y@BEyA1OC zlq@H!Lv;wQHGv|rnARI=q|EJJzN5`>m^MIbUW)37!Zr1Y)`N02#_~JRXghWqK;bia z&+RStQ)>ZhnE({ibHm|c(Esuun{Th&J_PamaZF$N?93fpd8l>^E~bnyc)n%%KX%-| zKgC4(A1sl-I5XubG^k|L`$OsOVdNWOT!GL2N3L-)lkZ>gWe1Jo{~dtUV-1SJ+Yzx6 z6Tcf5!?oN=L_bAUR!9e!Fm<{KC||lF<5$rx@c{WSBN|uZ-_jGHs9DF7(j;yfx&_cY zzs@3H8gk)vRM{=2I;acp$WSnj*Am-VRM|B?B-%~^uWHC*8CBv1)wO)YjWP!ak|zEM z$r3^una28mA*H`4y1)7%=01jJPlu;qZIG<9Nq`0R-b5wklf}QY)Y354&{Q!_eENqH z_j?3}_2oL}(iEC7DLG5sfNNA?T9_U@B&g8o;(xzgDcd%?K`ERKa;FB!ECl*unc$(q zj4)MQrTuPZq?}K4l|wpdpnN=a${mJ)Hp3u=I%$|8zElmWOD5LgMCZxMknkvM|B?@` zHg$?T0;Jr~UkpF|M<-eRJ>9ndpS%QrbtnHXT@|Q)P<$dDIcy_63YG9coXGLtr|0E( zJwo*{Bz+Y8AhheJR|c%AU5#M@m8i=%M7S@Cta^@aIk%ePN~018J_^qa7a`j5kvn9W z5aveC`2GEpPoRhCK3!3CN|_Ros!)w|*>R>uc!U$9gpGiMI1K{z?f$nNN$32}%4U!zero1@&*QqQ2 zJ*V#Ps-E-TGxQ9lP>4j_F2lf1-fI~(gzM!fp7Y_D&E+fk`uARZ*Ul`v5|sEo`+Jtg z;3hTwHny7bK&qy^fO;BQO2~Q0Vs@-%?RgS0G0T1?-zVj?<4&ttl$W+%nrm*yVS zSBf-rk393T^ErqodPREaZvEc=eYd~w3gN!A;F}UsF)drk@lR&@%#vs4=&Lubx{+Hl zQt+#x3>&yCJ~xk6h$ z?JvZb|ATG#ClUOkKUA3j)xv5)a&fx+HMI*~31}BK+PupQ;lEY5H7+|(A~!!$`GN+N zaxFecF~$Lw55^TXrR8jGW{|=ZDN8t$f>A!1;9A}eay);6O;U79^Nqwd;zLWkrXtO_ zCt*PY@Lu=by*4|G9m#w;;N6Z_=M<>V})J zr|#-e1G&Xm^0@JC^RY3K+ZQAVC_M zsQ8hcgK~}SWMoW=KcdQE|4TZc=Kj7Fh>KaOKX54|X2e>|#98t?ygWs>f*?OiRC}$k z<$ppq|KHg1Gd)`au9n+v9x3){>7RGxph@e~sj7MJZFd=TEL}fv?Z%kaqeC2teGvnytJ9a9#2c(WfL{&QlQAhH5 zDxx{CUKY}XnDInUjc&R*e9e2jQ@YQ#CEqrMGMY&hL~a-AIUXNdSB)&fEwyEvjAb*2hg1O>w*!4ul6&Vhjk})jK?I@kzW%)Vi`HLB6Hsv;) zypZwI=y9%F<`GE^%8C@^)$KNu^w4O?nvpq*xr7E=5{hUFLiN#%hw(ENA~u| zd71j&Ov!3m`zdMfbHnw!bc9~K5uMn6d7*4kVFi;HpE0Hh+?W{1V?- z3A3ibeLu;jyyeZxm?~|QeQr@fXm-aeV%_4b^`l2m?X)wJLaq>_U;XWoJ@P0}x{=Af znRFO7?;(xNcm<<+XSAz_=|2zU$M_GPhl7EAxPx_?VuIQ89n6BYcAAUs*gxzj_~- zj=}ge__Aw@h2^VjTuNt+`cCbjrDsa>Q=59CC38K;4*6Vd-D$UWcq$FI0dfcBur~RQ ziKP}H-SiL068STtE{Ac9qUpWq1G4d(g?HNLIM%bt0D~p?EYHOj*Y7g*QnpM#6*E&i zN{Sb;Kmoc~$oq#Jl&B&ZSX&CYav%m;+XNUboad1kn+j;)l!OMN5B_riV zJo#8ghxcGng5Ba;jb#OQeb&UO$84g!i@&CR!s20icg=kjxiQp}OfJO7;Cj+9xf;<# zlcBejZrR<#1wq8EO{{sD&*7&X2Dx5AZ!;G~JjgfIce{S~-QBtQ*H%5xRF=&Cz3!F@ zUn+VJUcPV0N6gzKTDC@yZmqZfA?&J_=S{sW`g!4->ZNwmIfv6Lw`Ut?=hqy2W3?{Y zHski)-HVfcOFJ8{@o5y=jN|#?WNPA`;IUvo9-WmjD(#y~S?HOHZvK*<DKVO z5wrVgN#64`rkO4}8}qfb=}d>y`Kz}cy=asynUO9deWt*x3dc%V__ibwvyrGTJJxFa zoOdw02U-w;`{o{F+u3xkd}V8?0a5?#)rg4|ah9rtZ95-0-?*J>3tC51pX1nKzTbZc zUMZP8x^y?6SwWsA+uG-K)61U!4Kx}ct}VQbsKe~w@=Ec-LZ=pStl z{;Ns+UmZwgq8^!Zl$;l#N|XOe#!GHlLIzK8`(^1h+^IW1iQb`XiLwBY1yj<0C$mQ2`E~z;FwZE8iZ8kyvy~*>}@`Kf18L`z^U^&z1;MI zrWh>)tuavJY!cBZVkLaMmBZiE8yqE@#yGyc9^jQrJj!(pFMr%}^VkIAGwQ8#oK+yQ zoR5zwb$j0FmAaTAfEIZ$Zq@pEz8(s@`QlZ^_sVU)F&_G(1Ie@9?qNf^v@$85p8+I| z9&to!9WjT8EkVUtxbtIKl&cXofom>+qFXEZ8L@(!j-enXa8&J>27~8ZQYV}9_P$Tm z;|DrdP2wVqy;)NcC;TWwJovZe8v-|!TI;8K>D*K&PqRquu6t$lv`O#O-hR(@p1*i3 zjNj7XsXX86-w}{%|$hwIJo07m8NC3~6Y|pRxOPR+cX=uQWa-Eg|9L z^$xq7SRc)cqZP=h9Ap)z0LQx+9Fv#A)$-b2J~O@&w@82RYfi*INaJey-n@o|UkB~5 zww2G<-!R;^zwzd!2Qiw)1a~~=B<>Y7TjmdM?JGOStxlZ-XY<6hsVm;x>nUrBFz+2h zAOEJeF2T^S*3a!!xMhv~n*FCwhkU!I{F{>IOBH)*FRfbJ@WU~Ts?gvXcK#dw_{-aM zFW_yHHDN~!uXFqE?}^jRZCYDww`bt=?Gp>CeOM0`7{)1m<&#LIXx^lqojWa6pU1u& z@Nn${n^z$zC*Cw|cJ;rpGs*0Vh?keK;);XbuRb%IWO&<^%Eao^8 zum2YHXd1)uW^L)})E!|;hzqWV3N06K7o3CMe0awj#QRuJMx{puKwj?NWRXApvMe;(F)rCn8MY zw>&N_IH*Wtd-)=M%+=o6V|C_M$$Hx)1AS|YrtbRJt}roT#^L4*$(rYwssge$Y-`US zzkI$h85B;+mv3X&NbJ(D&G|lJw#Gs4rK45VAoF}~=TnT?mgSq*EAdISXaEqS^#kVO zbV9gQuJeoe$FjZC;Iqt{?iI~O`|{=Igf&6Q2T3~V{yrTs=@={7*lQN*z&yU`-q7; zf2-9eC-lU)vvA1@>mEWJWA)%PO@0tmu>v3IU&ThW|=G1<8{ppH|)be|E2Z^ zmGz=Sv@Y+Cdeuh<5xY6%>b28s7ZJ_ZiSNCs^V=_uFD}1wJXf&jcJxk{c3Y!)Rx5by z==n+)h?`+hxYDE|Y=9CI;mwCw)GMXCBlhMt%53^9RrY-Ixwc}V?! zuC~V;olN&o&zFv!%;VoHL*0WH;k^RAH{yN$roUdc<5co?kN%r2F%Ek+T7NWBKKuLi zjb?8`RJX}dJ)_2FsceVC?9az9^1Rk;Ol+V1+~7fLJ~Mm z{6h%Cc70B&nysl(+4jDJ%}exp6CAwOCHJ1lS(j|HTtygPBdHJZuMQh8z3;Fr-lKTW zlUFaup3Cd}!_Ir3DROcO={pvj?7uX@X!qH(CztH2c!rt^14fWFbkes2WNB&C;HD#O zn1aBUyeaw9a$Pu~&!ySI#InVtTq~|UuWM&;;?eL<{^>;h!g&|6D(6@%p7%yYBk&Do z=n}ANq;fKXk}Z}$!fHB4EGl4-ck)Tm5hlHaF=!#2;mF^f@!BSP_rOAq)b34s2UPTyuNZy6fr8bDOh*qV>{3w;bGq z()PE))ELMX$p!R|)uL{omu^Fqdl4f8+1kYs%6#7%@41!5yIC`?5j+Ex}t~@o* zOC8Yn4!E{?RK=-#m)f?_UO#I z;vPX2z9wEaJ)Z#rKQ$@X2zNP8K+i$|T;Zkja zos-@o2^Sy3Jp5H=S{&i(()AAScR^BgXJWk9S~;$mSv=z#<{a4DcNiU+Lm#P~((7Bn zUD`c=C%Xq9Kfoi$=A=43)bF%z^!1ftu^kMJ#ZyVB(Slz}H~B6wuedVv&}$bZbP z&MW-Djqlds&nWwrllv^<0Keh>lO?10`E^B?YdVrG-r20mB!Wut7Yn*_5^~-jo0)}P z_tT>VNTV-o?8~Cxv{)@&JObe5CD~&Mq+arZ5k~R+vKG9WzvFi=lcX)(o!1xI)&|a8 zXJdc#zLm}4BP(#PmfZrzlnU-xjHqva%b1`&y`V+6nS1I@(Y<-Mt;6;5u6r3>%gW-{ zny)V2wBd}s$~17420$s38SmstR8LUSut1~6U@5WDfe*(ST-RBdc$AkB=Y6~9ZTZ)6 zy~6er9Zt5!HMeX$y*>EnLmv#T3i+a9yUSygR6y+kH#P4U2!(VbI#gK9=bqr7z0IRp z^TUTa3}R(Fuqkdolx90S2F5&&3^pF>Y9j+a%_<9+GI?h*Xg*=vL*TSAx)`Ihh=oTQzf(r(L%mZQ5GnEEFq6?Q$v~+ zf#cC*Esj!7Scw`(!V*Z&JC84qz0NMed3f|#2d?^L?{$0g+t;hF{Q8?X2pg4V{XZeH zi|PmOHwihsTY6N~_n)0S$5x5SE)H!quuSoXf1=oADxD~YC=3eZ2r%sPa$Y3Ql6H#j zM$4f5Bur*XPETMTffUGuC=e#cP+I~e5Z;*>s{K+$ghFNm5Os}VZ5dwXQWj2;Uq`0* z@&3tNJ32Dw2!Q%=DhPEEp3{RKmN*RP=t7?pkr9HFj%!4xQDt2i={ra~j$OzDu{Z~2 z21B4Jl)cxzL9~a`P~{<@8r~cwF;i7}BGN|Z(Y(I$aIsE$k&>7`pCpVl4`6e+NJwuK zz`Ds3^!I&JZe$;ba4-rpG$2*;mo7u$M zWpC>L*oFP8U-)~<>&;O@4pDu}u#6KxT@4@&9cyJ?*p%!LYeCtbj@=G%gP$f@@_xhW zjaxPjeWY!yxY3&lDuBCGd~J09hU>Wr@s7;J&Etf99+qk$T{^nW0`6Snes8yQSf#f- z?bN$S{T;1Nnfs{ulAEY&|1}#~o$}FbRaH31dkxEysebe8Z$QxW9lXR#iE+J;_sYMxG=DhsZAW3v? zw!;wt4Vjh8xBXBYJoZ-VEHmPPyA8WZhLa~m9OcD2@e8XT64yI*Ii1r%GmN@|s|xm1 z%zhHrYU-U==3e8V&RTozL3a9DqNqk7t<<8|7=YMsrJ+8EHF=!S8!z8NY@sgEZ7KEh zGl?tRu;RABJ7~84n!@IQt5?q1F85$8tUUM3`E(v?{gov%DfM(An$rT}gv0JME@Pl*}wSy?ryLgU#oBR35)rb-!c; zg$F7pmPCM00Zewf2%OL~53$(n7v>!7I@!Wf_^sMZD0ie=t%%Q!^$9c&f8Te{A|?2p z8R_wwg2Iif?-lB+-Oq8~@8rd^m z2Ut3~EL*c=FJ zcUM0<*4lLKsWmdPe#r_*w`r(=$@`TIZ(`C6q6tg$sS9m*wxTnMHOt)K<#wfazBJdE zCBy=MqF$37y!Mw(#8agg3MND2b-L#OpL*c7x>-aBkY-SW&`@VesxyI#j zVSPN5w8;3IWXg$7=c)A4Z$OI?jbS1VUf73kn=2y9Um|mXKTJsw^!2`y**)pPsKW8p zi^eq6gX`vP-@VpkYvqQAH$J`2v3R<7W3ksnK@agUv3=nP?j1(9s2IyntD%O$ccIP~PLbW`VK zEM52=#Cr)!MgWDK0mh9^MZOa??_!Cw9JjlkH|PQ=HolV-#pK!1qnU3RwFa6I7h&t1kX*aw z@rbqAm43YO@gZk8bf%>Zf2U&Nj0@yKIMY|@xzo&mv+4LPfV7o`2O(fdf2e5H@i0sq3zmHD{|4usr2 z^FKX0c{bBEMOm^Kyh{+A*;`NOB=u3EkcBY1S9}RN3t>Xgds}3SpF}vkDK1ErA zRJEKB?M)s;t9qnr-f?=erd52zGwHe)hCWwwI_tvagqWM&>4a~Wc{mEQ?X0+`Ry~ciW$m;&x}7C$0sZ{pxob z6||bb3oyCrBeQ%?tjFaUmkne|9I8lh#mAoXY8yYp=U-bJGx2HlwAq?;`evW0D`PIS zW@GIN1@s#23l5Z{Y=blu=I(*NO8{A5i&*<+lhbl6aKJA(FX8OV*>mHKZUUWYOQN00| zrH4=s%0UXoY0CVvd{B5&=GIGDaIW}qc4@SiT=zgRLA8CjaO;Vh8(;KwqvcDD-Y9uj z)LCv^0Ue~ibFb#mui|nwDljp{@eS*q^!Q%Ep-c55#0!_|dX=H8I$TpOoVilBAr8O2 zz3{{7i`n-!`z7Bd?>w{ucq^vR^{{#6>*2^gjA|uPa)KwyIHhC8Eh-3DDnrWeD$Djm zmCFR3^G$kDvLz*=+5FA?A?m`?;6CQ{4sxuZgsm>_xEULp-`Q!qW6b-R@{1TA&3m)Y zyOXus-mK9|js!$?;uCkdA+X1Ln3N7_1@kTU1EFIvGJ9BRHF6(^wr~&TyE(PWFuK=t zm;L5tR-Pd`8*6*Xr^%!q`&eyJRn>3W&kt#+7+D6Y+yz@PLhQg4WXKlhil|>pL#4O~ zo6=l3l`7B+?qSELmzXr#52=1B*rx09s{d=&S6>MwZMR~#QLJb;%11Y9yP0C@fx`8<3NB_5f-kMH19Lh(%1E3n;^`9A-8v*W${O?uv? z1=0hx31jRSP0l_*GG+{-hQ2Av;Va+ykZ7}J+slxFJqf>@y7h77=-taL3-%f*%hrLT zM#J&;l)3M1mAOcRWy($ZLhZSSlB=YBsF=Ji3)^)`MoqLAb-f}b9g0aD7KdJvITRb6|2Xn-X#cx68$VU_#Gs}x2w5R`t(>PU0Xk)RArPZigai0D zMi$9qTq)i0q8qSd=I1#{y`6f|HyW-a9dmTO?HQ=-wR`^B(rqs1=2b1dJ?^Gs|E155 zOr>4%xql|F@J>(dB7ig8nI&2=UNc7t zP{R#i0~48=$q_lYH9WnKRMhpnD#ftq(UR}QGgFhVOl;2%4?gAP=Vc+jPj@?~cZC#b z{vm!dVEh~@V#jzbaT8uf=9ht0W<{W3W6)P#eg|tFlC+PvgvWo}n%RS2=w-t1@GO3u zQ0SJi$Ed6MmrT)+(967GNY^xGawI`q&#q2$jsq@6QP$h^L_vA2hp-MtKt`}2{ zkEMc`WFIM>s%|vjsme?>_Q|>JjKpDe@qPPefz z!iJz3m^Th%?peeSKa}z*)%Xq^zVRvFl6^JMi(BA9H}8mi*X&$yzY5;9If!v1cTMp8 zHJe1CCflw~`4`Q+>0$(BC5?9Slbc1c@IoG??@Yq=m+(bKFCkihQ{VM;((|(pR;2SI_9OO-t#$0Bx-UX4JwU<*z0WdC)Yq(SX&Fm2SHvtK8VMqr z(sB5M=8Yg^8OxR9aR-9yWF9J_xyWo_Yy+3JoXRW62VMya({r$GsYvus=G6j1!Qr1? z?GL4K-~{26{+3hAmgSCLw0t{U$zeW{+-@d)!V476D{r-!26EAE5lh1Zzz5v<35$80 zk%Q2Y1l)clF;x{U3>DFQhe2B$6d;60n403#IAn?s*%i5~j3nUR;$;shqlqA6rH;28 z1gHpCHt<_VQ|h|o4!jVs`e*6~$(3i9;E0y`U4iGSs( zmu%iWz~d$u4cUof@{h0C?U}a4YkR>W+chc;6OCi@F08jA?u065LOl=3c}b(_P^s-O z6El{#VY3C)Yq`pI?ntuh^GHZPJL7o!xz?}F-Mhn|dm_KYjvbnRiA`Tqs6}$IB0iLY zJc&wcYELRv9lPlq^UWq1mM^Zv$EU8R^3OBpTR3)Hy$l~YTJpdQ`*@>A*z-qzQ=9qD zv-WH5w`!|W(w5$k#*5C$AN^4BW@?70h^{Az8er;~%yVRI3(U(Q9W6LKtuE6f2CE62 z>P|DW6V`#g?kaWXOT0V0oQ}7D8?0h|+=S=&VIC23QKO!~BzBM|5!GOt$e6c;QB`kn zc@L*nge--#m>m~GE=$d8Bv;2@t%+esl~2cvn6$V@o7l2DK4oQJy5*s60xsN#WS$+q zgDg4^uJQ9o7de+)d()u0j(?<&R7<&u-Nf5}e5Cm5w}i}$5IV~yDq_akGd!Jd2Md^%?PxetFs2 zVJZCb{*dDJ#JOhGH}#Ia%Lw_!AFS3c^{I7n1nHn@ z+6Fa*Hg{x>4UiB99^jpYIxi8IN0`7fc*}cdP;X{gtYqyAG?!8|M~dz8tB;RdeA^gM z;uVTHB;EXa?Y3=BHvK4?nnwZph=?KjEKiNlSRrB5o=)x+EDlbA_$H!axH@=yZf3hB zrHU}krORmIHSAxtc!V@#;8m(+6n@!xsub=&*ca#18(tCp`L|vTp(@e%?^3 z4nO90*11BoA13z3vd5qlyl-fr*3Eg#FU769J?;LCubq-c^j9jpo*-N7-%F+0`HOty z&!}es#p<}sT>b(&TZZk>US?bU5;`67^viLlL(YjRz5r*q%(wJovr znkSEnCsppiek{Ng+sypHy^fvcdlS0?4&}{d(XI%O`$pJ#_jom&?Q`JY+3?F9RLN!Q zufGJHPj#DGY`8MWo;dC~EDul_LBpG9qYha}C-vRT5?*IzSWwEVhyy&vwNjHl-&m;Q zYu)q>y_SmvJJ)!9%=SH7cq*ftNqwlDcjNPRztUUxFJmKtT-G5KRPfTB#>GMlBmAWY zA1~vGqT%OR)jDP2&zxPDn_ZVS2^!|^Z4^xTQu5^3-m}r2)vX~q$7&D7VTUT1-X*gp zDD%MOfW>(_e50cg-t+LWivGpIEqT*}VNwhJ_;eH%#J&69~VIQnGy9lZscCpP97 z>u!EFK4(vd!Sg7wL%JrRKy|Cb(+OgC7gyN|(HV+ICe?dA~jm@16OIzgRR5 zU+yu-%o%ZALTyGVj)V1U?RDDrl9B2&jb4upZF6hOo@u=4x6;aPUT>fEA+hjaPefu4 zv6@;)9mPp^%RFJKbUFcE{eh`UG=~{S_>^ndB_a7jZS4HT$N9z;C9OW^Q}r-M^ET|1dzV@RNu(pU-_bReiBXMkkD_U zvCN8*{}_La*ZMGcv$f&O`?v2#$~pCr|xID-{1S*&vU=;?|q*Cd%yqZIPRn4xTj{j<~q;w`~7@B3*hXy zNqEnkrP~$^7)d(cRr>niT&JU`Xkn}kabsgOCne32B!8G!1F1NB{(*+yRsKq-P=PI) z!>Ff`YSA)meoi7}hmmoX=zW_}Z7T-HW{xuwWMm|!(_H29T8E0FvbXyQ?wnQ{P7K;l zHQc*l%S!78G|+6%PwRraq7wXEhuJra;hERmUU1yTZ0Pjv7_==qWILv_x!6U|!e(_} z{q|=*ioH&Sw<<-nVvpV@Za6b*J%R{%NygkqwNj7&tTt9|xUV~=j~qOV`V1gQELUKT z-qKH?$}KPUT^dtHPRJ;>ntF;m-K>gvxU`^Ejb-h;u_?VgfJ5;^g{iG6HPvPVhrNJSDjAyW?w z(>F?lF&?(Rmr`Y5T=zUU{^IyGvpkEb;AQYB<|_Dx0kDF1Hu*jm!Cn-Zb)gxDH5 za6bnD^(W(LCT<}p+G%pI1UAMWdA;3scT0Yh65E;L7w4orpJHrn?O9=OZJqo`{Uc{6 z+_LPw#+I%Q;d!2Ur{xJa;xwOaQJQ0_TvGuSIca{~NkYFU!`9L2MM#6QQu#FgmGx(5 zA7?G&HHK>$v!6HKt<02LugiBE9T)>EE3nrqTEb^vd*?AyIFD5Q{AN~Q+&purNPCxU?U|l0djKQ(>KN_gqTuQz;RZ>0;o~oq`*A?uSfvW8hXj-)q5l~q`kYo2 zmY<17dh;A9FThB^rDqCTw-n_?SZ=r6J#|ksPTbAJW!Ps^_lEVe-$wdw6;AOp@8XE) zTws}t?ab?+4xxon)I;pk$9-M0-cN`DBv)5G({Jrojk1!<#~kHvDfc{yuP-zzj^{$8sd(+_P60@vaXUO3Y#Eg$wt z<9OZiA$#+vO0Ja2jf14g7`>*OGwZIFV8Z4jufCnn5;1J>slaI4&(n$Lbc4zPd?$Qf^HR+Yw*`@6`ZVpoNo2sOM_9d_@dD%aL27$!O1Al zcBsViq8*_y!fLbw83pe@O;f3{*)=WgghokA)|fNnV+Sn#)%;$<`%Rut9|Gic07)LOyX$`%5kH#yAQz3Q1a`eek{?2n&Z3yi)#%PtV? z8hzlLoS7V6q)GBn&D&FXr4q5$p;`6L-&tKN*Kgi*VfB`v)t|P|boql;_XoG%-cM;( zP4?loxV;!}JU@ib*RyxoxTGaAl5Vse10^RRntrlte$K{aiwlbYG;Uq$?V9B(cQvE1 zI9wsf`-zM9Na$I>ZL5-vZF>~PyWub@5uNYG-q5oQH)DFgJEJy04jA6*0i*C2C2s4z zuk;va%-~EoM+X#nGe#~N{~T@o~ozu_q#;^Wf4}u z`u*s_I*7$2Djb;OZ=uJ9jZV<(<+}c_E_(6Yw1>LzH z`4JyQ7Fv25S$f@zuo9V!h zr7LeQ#W6sU9psAphNod-*1<8yV7X^LR$&p-_Q~hzn}%)(nKSx~atf6qRTI1}X&!%h zE>Si-EoM*ME&t5W-b&7j^gqegS1B2sYFY4;EZ=`NH@`K1lI4@7a!n;`pfshk?&tqN_Pg6P%W zenyQK%UfNK2ux3hrZ~I0D%{`7_uvvWghzG7gzB&EPSj3ZD?S%BRm-}1wOb~TWys!> z3&*{HZ#ZVFI{TGlu}xo}#Fg!<56>4eGfFz^s6@FQR~B*a&QqINSH5KH{a*l*1WHiS zlnM*w%@`c;nxfO>^kKijO5x#b0)$wIW3KR-m2HeQon>-^hR&ZDR+BExw5^) zoqM*Bi?#%hxEbM}stW&|JMy0<@#h~>VT;9aP4rl2e;`U}XrQY{|0?!2bMmr3_Xi>x zbC7*t9(^(?@9A=UJ=>2pd$4L|GP?DrpA7fl=sTtZ+Z#x}w}7GfJ(;r6R0C;E5BPH6 zOwv!v4^RyF4Q8P5V+SWYc^F{cvP|kxsl_wQ3w~OjaSaN8Z=QY0|9r=ppF0B^OwNKH zLPQd15?HU%q)PNCZOnN#Muae82#y&Q&M1D2zY)uIjp1~mS&JwE*o|umT%&T9=5v0c zpX7Dx>}D$a9pqXzlQNe0Z!haoWw4a*s1EiHfOQ^ZORc*FEJQrMK_`6|5kSrHEgY|# zs?C3XfqKt#G9`ZnH;TM`q-6XF0R4j>DgVu|?EjSY_p61DI|2%7p9A2wIn8Z@Fo7UT z9x#kn@64(XtEqtE&|j@VrbY+8G1cHalv?1RJ0#J?0)i_39&KNmHi2_t*<+?&kEGXw z$JD<>uMAioOb`b9y(Zzsh0)Z`At?#47Cm5k%ahdJABb4a4jzWspI2fEG?e8`V1~g+ zW(PG@@(1Em47gwHK;g#>3q;rdK)ftsr<@Gte&vE~A`7(%|LhS{fQ|bfcoqMzkF;V5 zOuJVB6g?&;h==>dfID^&1UvXWx$?JdF7Tm%RTYD&?qSc>{-oFuyxmZxz`7#Fj&q3K zep`E{+JS@3$$2+Fib`miSTR!}If=^QA%hyb;{f+2aEFqXQr>qR(Ld`g9YEwiK+Mrb zpqq+*nm(!i8`CF~fwNpCEOQCX*@-{Zvj4ZlOTWpU`%gaMzwE-c60N?M?Ysmc-8+9E zDhMeEnQIUk`|UPT9X*pXdYC^Mwb(KDl;>*t9d(*Jb+GE%AF+&dL+NA!7W~KEN|8#ufbH4lucAoHxLnXSsFFLeZd>q`#2J!g6- zz@O)Dn*w60@l^{vsCaZjON-i11b{^$^be+@GvJ?0?6udX45djY12j|nz61ZaU#!PY z^Ao(iHe=4O^`PF1xemh8fp>`7AJaPo*s8J3P1s$In=h`ni<>akM@WsvjR~n{A02s` z%{@Nk(CV5k>2cib)tWoES4{bgP6p0rZ8SYFY;Nk;)0jE(nZsa@cZtvG%*-IwF*8M@ z$L=qusrbBy0tkn82Z1P*>aTGu>Qd9?5;A++Qm|vj;^Ha=-MME&8m!}fL3@l3S6^Oxd-F(J`MPcoGmEYT z{TGH8f19AR1jItCfD+~*=vDF4Y~)PL(g)BoaloWte&jD1l5J{)fx&xH0ou?y!l>FW zzKqL#^o3g~j zh~v2j8t9TZrQWV5a5fVv>E{*S)1;9iQKyRG>c){-cea+_31Ex6zk?Z4_bl z2-_0yNt|stTBv^A-xGon@;@~MD*te#&MFU363|ZLt$>&j&OuOVcI~Cq=Qe;?PzQSW5(+j^!?c7e41-xh}xCo zhh-KipuaO&Fv(_ob?T>)rJSRtI9JUJTJ7C z`9Y*Vh;AD&tPgkIIKtM4&S43 zX+^f>uudgy1#1I1?R8a z63q9vVPisQrH-w>ug3y$iR8ovtoOrUYSUlW;D?j)B6_rB@Z_8a3wC+ZGuXq%&oKc> z0KR_XiNni)*~62K>(RSM`<9_)vZwFh)ye33a#16m{uDWXl@oy;`U+jfv(z!S3CuU_ zooBosL6H{R3d|4035S-O4gY9>g(t7^2V(FOR6%Bnn0t_!vzo6UAzwm6*DLkkS`I7A z$!y>6P=`2rp69T3;z&G!PUYv^z;JlY>+Q#U-or1r3QKV<{~On^+rmB|G0^ydXgnpG z)$xY?jRnfL`z{%r8=K<3&&Ss{Nu2r3RQA8KhLx^yrk^;VIc^Zvzil~Z08b?4@Zd2g z@f}6Kq+wDuE1+B zh*kVKh$Sy)PfhSIO@4F!oesfY{wSl^5-?MXjhV*>>5ysf_s^4V`&|GA=H&u^`yeJP zUBNvjQDE+)Kf!yI=v&v5H`QOg#rX{$)Ry_g?y&D|C=LB@jn5~Sg_eH|*9Ao|HzZ~eIqpDGb6Az9 zE7j2%5C|Kg4#1OYJa(h61VY`*S?ipV~nxkkO z)=6VgSy<57`lib6=Dq#9cE~rXWv7rnsocfVY~5f5gX$d73EOpTI!ak18EIeQnQ>h` zbr*stw>^Y&pDf)z(qvRR{OSH$_XouZ9`<2x+LlfK-I^M974mpv0US{L?2Gof-j*S4r8O|xB}1*#Iacv zTNE(86igb*xc$s>>@eFX31W+tas^^ulRL)?@iP6+Sx08O>$;!g9$S{5gSOB?`5&Ws)v5@Nr|zRE7dhs@UKWAMyFCRDZW@f&IQ<1@di}bO zxSGC_>eQlv%i*BE2am6KJC@F8Z|c3`@k&e~1|5Pp^s8sAc-9oY=1Yy|ia@!E6@&Dr z{Qq%r@E=wT|M&-aJ)qYK++qSZ$Wh3(++xJ58_f=OK~LU)n>w0aXnVIg{WrZL(X#0N zGV*K$vOAAMULJ=xqxd-oe^t;(yTS0nXN8uIme}#habPy1n?)}L^NbRlHa#`FZ^K5MdYE&Fdzuh)N#vY^(i{H@k0k6Pzn77EXLsQ6d!AsYDo+3L5@b(P$eS+vs zP}CIUfIoB5m3YkDpX(XyZ^y3uaq1Z?%@hs8u-qj6?hgd1Qp=N{O#55=pbF*N>je}C znj`%w_oxrpiqfgf!O3X||AD_8cDXJ$+VToL#PwdBISedD!4^o&SOSS)SqQ(5u-l!% zsr*X|{X>Ht&pu0m*awZDyPxwPFZN;6G^l{u2e}^r6aJ~hiYbyRVEDvbMFX?iv8{#H zDtgOZ2_4;#n)nl1Si$axs_G#zwi}JbkgK2(Lp&|#Gf`4bzA`Zbe1(q&9?YE}bhu=x zyp`YkNX5;|DT_BZzVowOsQI^D_PK2#5gw(iU0?>Mxu#+MPx}LMip&)H%CXrroAcQv|X&rG|DoGNaY#1<6i=M_B6S8uPnc~{z8_-Sd;m%Vf6Evq9V z79BdSKu!w|tAE)dR={2W#q;L8{DE*H2lega#B;^D^{Dmv!1YlM?it{iRhNY34xrYZ zgG0Zly>C_vFcBXp%`dweXro!*yQwUy_#u_YJ)P+b;uW(F)V@Bro!TU2#Fhca?Hqii z8MzUBeqiR(Mc?OqVAVLyAiQiZ)X&kd3Oa}O;hF44Rx3H1 z;h)0ViR%I%4Z4Pet(yH+o3$>!sG>yddgC_S4sTxP(Lchx&y2P*x{)#rm&53ToER_wr_$KcI@Q|OXJR3Sfmqv8>ILUftsK$h4?{QCS- z^xARTEgcKm))*QmZ49?5HY?xHXfp9>OIAbNi4n=85!%h4ZVmVBbp7f;Gnsd#9ng?sb|V#R#F#s4w_*zz8? z6>Qb`Ak?C%=Hd@T#A*)Gc;Rml{6n=4=!|Y2?`a{YVx*A@Iaa^4@&UBY5gl!`&VDYW z^K+!%$oH*``U9~J`mFV2VF)CWftGJK&@ut(I+AvK;Q(VaCc~sBCwrOu75DF<^^A_C zwm*Pzb`H3JGDWC`It&NVh`i$SB8TkE+v`fb2ZE1vPCtU;$pWfSa{d9*=H(~xqdoJrLXWl#Yeh^@hJE8JuwXWX38 zQIPzBk$iRc%`VS!iGvCy@vH0mp4VYVS5G^ve%Z^g=7xQ;TAcC(3(Jz`5aNlAz6BL( z>Bz#7>5dvQiUinbxB4VSkd$jxkrD9pTtJ#(XuHNmk?x+nKB5>xzG_YqHd*_|}5!%pKr)HfZQmZ4-mXnVb>9H;^FQ+C~ zd3il2ALFqqqu*6d7?q-`EGPX|%wB%Dt=AO?y0XjudMyU&;3v8z&!$-r9dU^Ov3Z-B7 zApwV)mxcGl&cCb5n9F@A_pNu{2v<*IBkyTpSU@>lbyiE0(xszX#j>w@<*(N~{{uno zwWgT%eB`c=`w~XA=+=JB{Uqw5Y84pE=kKgT`Q4T0C%cqfEbD zozc4v%)o59m%mB9w@FEwcNpxLGNc=D*T}MNlGy>U1!X3(gmha=p&uWfy1!|+`e`g)=J+euER1QWOIO21QZyxD1eUO{hs5?34jGTn|V2(_D33BC~# zY^ey=5tu~xo&8oNI%wWFl&qH|Eo^OH=BOr6kgvP@mU;7(fcwbO)d%Yz&D%sgyomJk zn<|I;apJrWM6e;lRGAM?)bLO@J9Xuc6bqQ3RPL)bl6rf@VI60 zH*qDrd(O}bW9f2?2f#QnM%;3|Zo@hPh2t=Qy`%b7&$x8%QtUl3s{rcP(j|Mz%U^?^ ztXJ+XbCUj(4q5JdILVX$hodXx` z3cdUGWlve7R5~_l>(EUNzmW2Dpk^EoRCN||Ll?#G*J8P!S!t?#$h+?u|#KJ%k;d&wyP7{xAhu!Wr& z~Fb8zi%%jV&~|lX6^6BBUX!KQdcQ9Cp&nkAY*K(qDWXH)uI3#;xdzSwuI{(1XY54>VncZ;) zEuK+!r<%9LH~W$D$4@(p7832Bg}XL={8DT9qJzmT3%gpSujoIz`EORubzDCIIkB1-Sp_X3 z0$*MWepn(8Y3jdNve^Bg2@C9(X`_8)nn_MiWDNnq-cOsM5Gyke_#4q#gQ-Q16jGS4 zqV-ZZs++3pI?|?`G%noS*WJDPfqwjmci}W*<CQcZl`*m5}d-9=$Y+=6_C-y!g|{sqOu)m3vr|u)fb9H3RCCJi9>3BHa$ zy4#s^Yv(tio&@8V*AxQnaL#(*Igcf}^;Fx!8PA}P8uT@+x^}^V6fq7;)b~*eKJ4uc z{N;E*NO_{KTkz98(~`&28)-M5DRoYyKiuefz9e9Zn>zj&MZ!=4n|o&j=N@|MfxkXD z-P0)AM!k{-u-Okp5yTi|ioV&4mL<5&^hgd6Lcy=4v%LQ7ll_clx_Jh27|u3M2`2jO zwyS7;&liPl;UKPctp! zBX#yva<_6`=aajiqod+&5lyaa7rGq9IF}cFA^9+klQ~h+U@QG#?qqJ!?W&9_-}90$ z9L41}h#^GPrcEDio1X2lLFGV+i!tHQH4JRKY&R;+Z6OPICaT(4xrKJurDaU`y4RE# zmpZ5Gc`4ktk8x#rcnXN?pG>{uuGblDed^dEt7*xHB@SC~*Mzftadmh>9r;Npe^p17 zq>m2D+jy?3yA0Je3ycayy05zH_w8uMpDJj*B#Kk)PO1^Op`i*rUP%0!IcDfNkq9&dZXpWl-Y5iP~pzBsXdn32%(e2zNX%D_bGsB+5C zK!7e)A>vIMn4t=R^J}pmSsQcLb}fx~SIINIFnaK#bG9?nJp7HkFv%{X;gwv;gNfdO zeY;$38unD7GRaJA$9I)m&m9#Fw|At(bd!5xfQ7=$6vWcB@xN4B5NFw;b~Wo78%aq% zzOAfP>sS`KTQJjEQSrFkqtPu|x}bre$>dE;f3)42wKiy&MZp%4l}_h+K`fW#8nm1frF zd0c0w|GNA=-mX{QqCO_cC47oT3iMa61#?3YieD1^WLWg2SsKm z$mjblj6Yx4#qGeZCG=;Ia}z%1tmk&CLk0495fO@Opy!~Y0DO&~SwmdBXk&BHInXWJ!9~IcJwr z7%@K(TY50eAw`AaaixUks;}4n*5n@f2@R{D+0TO+Z;2U|GaN@`@O=Al^#B(A89(wY z3v?p;zccM}%&0AKOA&cbfuH!?b`SFWsQ8p$OvVeqYcIm%>C8oT=}j)Lh4bPhk2pkB-r53~jH=d=t^`BWmj}dh{`v`H>2F!>xcMT`A6W52$7n>Spt@D>F)7hS&PtOTs+t87= zw4T~m)s(AO=*sy0FNPZwJ)K?aGrawK_kG*Dv7Td5c3j*y}Ob~5M%nDpfsu9ajAuJ9P&zL;@0j>uZ)&czIBeeT{ z{r;l+7q0F*mv?Q4vGI+bXeY+jeSu6_S;ZG3fp~ zEytvbs7;ce?$Wt!O!foCJ!@l&s!5?wHCNtPfB!l$8mV=r;46UZSb;v5{Mwajlcl8UJtF}yl?F=Iw7>nhuO8$-sP^h!H)+xFDUVLnZ z($HhueYi_K=cF8x)TRhIu{up;ip9M4B4afN?8;XNT?YL{#K(jyIZ{qK2O9moG$Pb6 zqD~e}YDHNy{G52Qb!vL_!Sw33r14?v9PQ!Qp?H0-OGXlxznMNv*q3L{ig`ll4_O`A zkM7>^@s$@$rb~JtG}N^$efcnEw-M}BC!}q-gDpT?1BURk_BWtT7A1$XHlH>=%je(iE# z;BCysaiEn&H#ENl%*3^jEYzQwTZeXq;O*s=$H1NTvEhNrfgN*NIa4{3MG1tNYu^of zo(N+$>I5Q#GGOS;WiS9B4CO;rd%?Cp!Cej3VmnPqp=EgKSqtn0g<@mJP&C^{=Wlcd>sKF>~G{lzyWEu`497jtVRUv1S3QCT|a_3P712p zmNgAJb4Mh+gOinBajK12hn22&(_qggVKzJ`Dwr&u3vRtRXrqfR-opKZ0l& zQ2Mid;bNAn_x?dt?Mx(g4Q?06;e13dYlMxexH_$D1&>T`H}hbF_M1_+CQk-d_a=9$ z@rf?tER~$sZs5BdvPXs3(49W@wE5JHEK-|FB#New?-B%^CoX{=#&`nPyDPsKuvVi* zKN`eDv`h%N4;-%&y>afG)1>?j+oRjI9+V3oih(xEn|0JPm)5^AvOeaLm7o{MDbMdA zgn;hG91knZ)F8#2J`q;sms*q7)OAO`RW}?koIfstDM_V0PMb?q%5GKMmnnu;L97_J z=Rmf>q4^^vGa0Wr+r5)*n^oP`OzLcD&7r#FJD-x6JDm!cP(~(K3uAU9ldf!7auZ*L zy4AjRkI%*iMhwh8o6UGi|$55#MOkG=^d>M=C1C%S^2 zgE+5r<`RS=7h$HF$(zvq#SBrbsLnR;Qc6cPHk`{xJC$%-Ek@8gbo66FlT$pjPPJEJ zpsvF_B*CkDp;y6FNcg_xw9Ub7A<7v??O9oyx?LA-z0ik$R`1pvys8SHb9Ye(sJfY5B`?5~2P_C~>X?Tc{(uOpi9wL+QBdrs~W}9`i&{=FeT&u6b83S{=D@{r(Lp z-!*Usc?yYNp1b*_&VV-JHaJL}aJ2-6D~cb~J-kgjvl2-2n=k7@k%=nADWt=EZQ?-zp{bmx#-XYGed|E1*Cra^S}X=A`r&d21A|# zd(T(X^D0MnHd5pFRmjukRz6s}k5b$pef6T=07SWxz!t4HYNK+6Z~zl=C@GGqL z)uxKmbAs5~1CRjr92WL7Yo;pav!V_SXeOJu$?x2{%SiIm2jE_PKDIA0&K!-O=@v0* zso49|D%pW5Ldi(Tnjoy1kDMfeq%VHHdzdYThaAAL3DK z)GLv-^9xJ6v=lvAU)<<#a@Gx2Ay>|x5hlE!T4g8&7*ltuiDkjvnN0Q_LYN927dD1r zZ_4DF#Id}fu531tLbe*1q%*eTiAcIi0|2@EBM7sRIh`%sPaUD?`Pd!S>vD*Iz>0sZ z`VS}Wtq@$b>T$^FeTD}RzHx_9VFWP3+ce7E6jOW348$TNY4JPIV+QIHy>CVxTRCwk zH6>%BacDyHhTd}?{Z z0M=PteY-6R_RO@=_Y`t7YGR*tgf3qCmI*BM#jLV=@7bQa05xA5;q`o8Kdsx)J~^jt zH)y~XQ>W)Sy_9j+XyH8mVR`jG0xDMInid$CpIq7tR^% z4a}CclxepU-*Sp4KD=s;mz=%93H|Wi^9v__(dEh|b50T#zJiDxk>k#u6NLR0;3OK7 zbOd9OkjsnO+uqOXKavHt+aU9kif;;K=wE-^qng9#)r6I;grV)KBu24nLWT)EE_ z<{Eur5O}Tt;!0Gn`!{5xOuyX%6R2~8ffGdZQ?4|G<(4D7xgXpK9r#HiL8lxu2F8A5 zI`<%B;@}L|qjh!#3z#|Zg7fzmmaf$dC<1xF**Ut2T_gOz?7FZ&K z>Pf+D%MU~z^az?XsC5`~!39C6-})l|;kWz$=0Th-$gG0~NBd(qtudqhf4j}Gm8udL zCl;ZAcLt4U_tze$gi$FcHFQ&&Ij?n@{$zQKCp0(A-Mm05K={o7yRN}^Y*;I9Ce`E9 zpw^|^+N0HjL(=-E{oJE5I%zb()3y7_(?$O;=INpnknkZr?kQ9?nXwPH`++b$=VV{h zF!j;jbp8MuR-NIVvK#E+Jkc)#SyDub%Z4r{H}D>u#znQ^+igthz=Gf(EMkj!aZR#V zV2Ie6_7>cAFBx%N$)~xywK1chOF96WmMG2(P@1K}Vm}Z@{?2A1nPN19HhiCw<>;U8 zMbsle%#MK-Fwx*BkDLjX*#f(>4tFi*6;`F(VA(V+)RV%*Q0v<#MwnliRUf;1;K3>- zC(}OWSs_MpRM+qsPmqA%DDbLR?IxSb+&`iSjGeGl`oQrHT{sggPvZ_x(kkOz>j__r z+d6#bVdVMJydxF%Z>@l1DO9)K`fXE2oGka#!^gdqRa-(FvP&OPWt;IYK-;D_Z@~cN zX%NI-$+8lTRYW3<%Dy|+ZJZrxG@ck>Y za=~(=sy`5!iC>JZIrVk~&Rghm4q!4Cs#Nd9N%)^_nU-l6jBmXuXS0o>^xs7i+5q)1g~Q4%7T)$OU89Xg2Kp6tgJ z{4HDwo!CK-XX)XaTU^S>6Xe%S z3QG-;g9IRZbP$ujGABgBW&s~GucU0Ffy?ycJj--)@fy{6_R7gC^~_Ff#xr+!cMp$U zy27e0n!BCWb*syM{@go_vvNk!3@~>q#9_{0P6RqHhng^e4??fQ?V9Y?xXYFI-yK$I zSEKS~!s?o+y4Q`Xsq$fUhc+HkV5G$3-B#6~zbcWJ5}{k!X=MEx*L0)X`Gm?>+*Rz0)}X`~cXy=sR1X{&iXdb2TkY;tb8_rF^@ zWADcgMWyuRyge^ucD7Yb+q8W|G7Eb;R`{#(cE8Bi*;?u6Zb;V8?PqvSbNO`vufS6JVCxue1&U{NQX7Iw$_BbT>{ExI_cke?-V)9zJPZlHsrU^OGq z$>AY!anVPg!nA9cIb1?+fYTT#PRKMc4EhQUh8B6y_mKw>a5Y`9w&Gw!H&Vcm5=WV* zqazluBFag#p9i$Pom?)fp>x%`i5C?11U$8_k)O3Qgs}TwC_6hk%U2Ac3Ua1YyjaHU zo1DaoeO2J~s$y{@+)hXsLm4lV+fGo3XnVU*YT_vR3Rt>!=wF+ZY?!(D`kpm)mf-ie zp4Z-foAaEaTVWIJ}bdd%~fw=9bGD!VP{>S}o#DdE# zpTeo9WE5Yqjh=zwu{LvzaLH)2sLj0dJLhTlN!eL@C652ceZ!{agniBd+0l^SiRqQ})hc_?C(9ws-x-Ty3w zDy^kQ0g>pW7j+j~+|*`-UcP>c@!P#;Tfy5t+XA=I?w<6E&#zyWHAzX>{otXWC&$>j ze}*l5h)EtGhUlnqf&E85@gCq40)%I6I9obHT9CUQ%`+~>y>y~G+55&RzuFEjv7YB4 z<{0XSCX>~jM%MwAev&5nI?W^^!mqrC9Rv6dF38SEiUl=?R?6Mf5%Z#TUai5!QuEoX2r>4bhf$idQVX1#A5Z&#?VmaFB<;zN3RiD5Y!=NHfMOR_ zsP>?G1O3qImw{H>-Gc2PFEBYi*h2aZv(+eyDh13ch zz|rqJLIJ5l1ukOP(WK{bD;w27q*9-^(aARXcX2inM{F!3_xh=Y_2d%?H; zfF=X#={H(x;<5Q*)hVdT>ulwiDiKEu+w}q42P@40MpQq@M>kIs{ZPbH^+2Udq}s|b zlBJ96wr6Py#2S0ux#*HI187Z&1>jWD2Q`I1D02;TR*j+f-c~4D`)^G+O0Nq8FCo+s zG)(_^{$}wwVmkcWG-7*F3=VS zu~mUIqk;HDR5(Zy34A$LRCQKq*hiJ4qlql+7B?NTJ~5H~IaaxnWq3)$OjbRm2?pp& zl{6akIiVK&yqy_<`5SZ}?x7H?dcv-fD{-nTqVIePKXd7DCuy-nIbGu;Z^D2L~+FRlihufvb=)_(6uU?N!p|LKoHos zbIM?p*xUQXRr$-~OHnRLwwL@fFU)PG2uK=j@2%Ntc4Pc2?MG-2(^+P*WY~sX&$@Ta=UR>VHuz zCIdF?FW>)hpZ7;00k)cGS@*RgDn&2Dwr6EmByF#o$y3krxBEucrauU}F%tJE>sG+o zllT8>HTzp)yWg}m`dv?$BS#*3#EqfV6HBrm3bcX^c#X5yEm_00u20`39Y6AjH@Ix= z1qbbePi2U607l~#p<(afwgBxV`+}#jm z?I3A4v<%dfy9T|-7=C!_7UnT#ew?UZXaAw-nOw&JDBkucJEiYi^@}}4N$CO zn&Wj6ohiv#M+9F#yAR`JH;be<=x9(@=;!k@cz_6LHG3rC(Wfe+I0 zA5Fi1$HEqXmzI-1BXr()YCuraFSApL`b=SHHDj=0$$Ojk=9i1xCDC%swdv=661xpF zn2FG2@(;w=_WSLVZ8(R3G{9F@Z{ZfN`8@4wWIqCfXu_v-^|5j`n4!fVovw zkj-gG2be+@RA|giMtg95=_K*_elRjEW>2WTlBS#`Z>sX?yc8 z0WAz_3LF93|Ez`K1DD@|aw4rJlWj#B(k5lQB?p>Yq65Rv>vp2oN|s3r1O?bcOq&17TI9spVbe)wE+L$w$=aI z+wQ`4Sx=Z-SOt7{R>~R@wmyHfT2X%AYs2-?l!y1P@+|G656NhOE$|q)Zig3U?lxN6 z+Ty+vB-j?2&Iu#6+dz&XTEb9ixWR2>q|jS0Q2)uk4_W(N_ga>~8WSS`QvxQBgR6z# z43KEO=9~aj#uxphdljo1D`dTqmIdu>%^a(&+Jd&Xxu1tWr4zODKWey3HJ-?hzB7v0 z^X1((30Gg)Eoc*$UG{?xJc+;*(!G z+bS1_i(9$4j(ojRY?yR>@PVPy(1!ZT56LFua$3jas1+M8NJ|ip(FvgY%hKg}@QPucd|_3h~Z+@&i%Z-2p8iX#i){Y5RRJtoP{rEx17iQtt^EwEnsAAw}iuyZ`Uc##&HnZbJbAgp1rdi-NB48evH|2 zQbH(^SrLH#1~JKZhn6iAJ>b0^(Zrq)Y&2;LPoL_#^|zJ+azBk>D0RL=bL^u$oXyas zn5F%gE(Pw_xPBGxn}5+w{=syUmBRd{{2dW18D!mxOHcrM<{4LY&14Cy(I=cU5B!3| z;6^cW0qs5AnQ^ryx+E)F;`{E$`RSpFYb{NMwuhbA>r5BUqQU7KFTcj}BNwUE5el zc;UFXS3Ss8Ao>86Y#Q3Wtwe7w;o6EinMXmU)H#p>Xa=Tc@OBNh2>(e=BDm*Z87v>42~6p>9<|;f^X?byga-xldB=qroNXE!S2jA1KD@1qtJPO0 zdobc-b$>ZE{$I3wTL}H-sM+uzi0-^1)Gx(*i**7r+#l3@P|}qG_GKpCjX0~#t@vr? z-a%(wmI}D8UFs420p!Fkd$%u)=Hy8GdL#kjq8psoBPTuALH>bwyJK0oUd`3s8-q(7 zB@^B~MRuX!?RfV6oK16hxb)CW5&JWj_jkp~>M72P!0i88q4Lixns{be+%@RsI9cA3 z1vrY#6W6ayXzBagZam~r;@-I>PJnw1F{7EV6TKV}tIiK#>VBQ#LHs3S9m3pcP3j6ail{t~P3 zFE-;pfz7z#%|zU1clo^sk3YYKNeHSnG&N)f-@B!jZf8H??Ok?q)bw;pe*Ivg9J|1gYp%LFUV&(3uKXE0BE0A9ibF!SCCro&sdkZej3FW3p zN9#9Mz7v;!^;N-TA^iKRg8b)SfM0#4|F+8yPiJqv@LBbCFusDgl(hTtplP~I>x;!g zFRQcTrU?z)HHn$KNkT_l_Wd9B-aDWPblVn>!zeb) zU;(8?MMR}p=q0fM0!oIC)Nv4L0s_(@!2&3C6al40qzf47QX@4WNPqy58X$BCB-8*& z_nKyrmi3u_L`_^82?X|kp=cqXcW736BqCV%K;MK1JBXD^pjf+=eYYh1==wR|rJ;Q;fSC}m0iD&?h#^qiD#as=LIawmXX8Si)}+v zX#Z?l^|$_;|MzJJXfwbur&gJM%mY)Aj1Ox}=Jt@^74RnsjAjS~sBk*J+sQHR^JIhf>X-t)$xF>c58uvb;1Qgd|MxKzK|z0&*R(N7#luI zK+t0Gr#GJaJwXcs9FHfFOddBNl{|1|xFozvz)N&k>T%Vvn+zh}GfA-&N8gv7^~LPw zfQ6T5ElSAYlvSQ?IU4zGPrmDr4=)z3v8N2{wM{O-PCr z;}#GHh(19xLi`Ag_-Plmw|^sIM0`FHh|2Dw_abPibSQYV`h^8(7JhAP6|ek z%sSjZ-D*&@ug<*p*z+C=llV-fU4P?qLn;5~(#!Y&vwiqJEo;O(ay-PxV?a_E#e@-@c^ zwtgc*3T=z%!+oq0WE9cRAKAMZ*x}ssHAtSmlDg8t@zx>r*Q(h)rsSK?N!Nb5R$Sa0 zFsLCmZsW`$os#_cZQ6-hDf!44*kUCxWJ!u2^I8LS*8NV5}($@3hZ4@r`sk!le; zdjt7`a)+UNE~PbdJ`sPR)NkH9z3A|)`e5G0wwSzI2XLRSgy&8wx_c*JJ8p;+bx>!} z9~W8nwd~z6`kq>oO-O^eF#f&YaXtaQhRQcgSb5uzA0mzOJ4Q-BglcwUrJNUGD9@jee$@q`Ulx!pQ1G8v?oc{U!t$C{$lUSo`zWzzR7-*vE~TS~S9wDq*GyjT8olB9rTFoQJu18-zrO(pu%= zV*2@&aqH9m@P@gO1sylXqLWXA1I@Z5jWXV)ySm@9E4kmV7dqwfYz0ZZvZ3om_*liy zKn^=UMhTU4v&ES%UE=qp_L`W-KXOPeTGHX^nt#q+Vba@tUaTU&_HgUofM>cft37=B z@n&zu2BV10>%9{fXyj^gNpP)Yh|rP9221YyxG>y4ndQzqbmfxutBQc940PJt9d7NI z9?x~zy|kFSveS3&yMmpRyI2K5%ugb^66TAdRq-f9M)JDqwa)eq90dfgmq~$TCF{I) zAb;}8V2iA!w9N=l29*pruOb&-BW*ylC)|<&zI;*}ROXCzKKw_tK;_N&tV`~08J2xF z&Em!SLd7yAq`uk3mDc%QL$Ii}ymS1?wM@0C)47si zw`5a?Rl2iQk?bRD3E0^gIvy zEu>?;d;ID~)859}4>LcdE?!avLE#S9dL6PT4@JH$eEvZd;;JF~;39XgJ&)Y9#i!{# zX@^CUpWWtAz@I^y!5Z6mk7JBFs1@Ww%ih{i*`A7~XMV*K!A)yO&PS8Bdy+G5cEt2Z z@qb^)lfO5uI`P}DP?`Z_Y}-9)--?I8rlm3zZjF+==kBc8ERqwWJ~}j&?A0=(|s2 zTQhQP>8XZB_hdT5?^s=%bLu=ibX>NM`e{kU=)bUjjvA%$eV@m&EjF3nBrVY-?UlApU9EW}bVtq^yXhbZ!IbyKqs8GfCz&|t?$XN-Lbrd4zXU+j; z;TF}j#I_^}1fZI>Nb7y5?Oxcvk=F7}NTz21VVIQR6#XY7tu4Xtsg48UVT|QkCJQll zW!-2@NEF=?#h$j@ARyYHuW`%)*hW5jbq+2>8`^{z{ls~F!&QmiG(UT868S67{b2?g zp2S|-%7dFs@bPhLoFQTv%OhJb3$s87+jkam*=NCR8CdTRN{g@E1mh~JrS;WyJ_zuh zod1%-zD`=v0P5@8j6Fa*mYF!&Q11WjzP_Z?@wLLEo7A@Z~f(6qsi4tymKu+rG? z2B#op1eesw^~$QWERDMcx5@WnwC>SrK4qVH_EtJCsQ;u%N(PtAuIbsN;I$fa+p@~& zy5bTab5>>Der3HY5~-6@C+_NWKE%{~G7=URe&}$aIcr?TpS;brg>=)EgA3?CZVa?wVIE@u|1JaF?)V@!~=5f(tf_ zO>|)jnu^OtbtNe>V#xWcH7f{C_z{gEB`O5fVIdNEy(nS?anS2wpM@RgM~?&c^Nu6N zsT*Q_7vDYn)IVbt4yJ~I&U9FJt)=jRlFg$Kz8Qsh>-Y8)2ihj%PpbT|Cv!Z7Y zf#E7_QZXpeY9w5^UJ+U^VcNh)dMdS?IeJ6;hE?q#y)YEfr+yk6XHdv$3K?q zX__rl^6X#VSn*?UrL$WR+mwYtU@-h>Syed=|CqYuNk@IicJs~likuaZWNKuo5yi~< zE$utBvdk{8-Z+63RwIeeTAwa2kGm}JOvjuDo9z!0Fj30v9v~UOIXDOQZZ81?z1}?( z%SS-NMSh6bSz(#ZRPCzTHE&3Cu}O+rp`g?;IxoXULLQBb#8Z5 zs=Ay1onWd59G&Q_k^8*B$7~{tFO>Y^MGEidW(P-X;?kF9#&Q-@jq!QI168jWS?hQU zF37M1ugK}AzkVmxQD||M|6vu*jF$$BqX&D9vO}v`k-# zUdZ5GsH~Lq&7BB@%b{w?g~%F}3mU-YH;ipOduMYixJm83sFth_D>F zt>1)5aAt@*1?I5ZE#S0?YI0ABR_8l}Et=C0PWOBwgF9@yo&`<`zXLLr1FhKMBktK+ z4xcr_aJIqcPV`$lMfW-$Vzq8c3+4|W_Qaz}sxfa%C#xa1( z0&(8~8H%E6$BPRleby?vSG2B_oJb>y}Xq@eP&ZdfVjaa?09J z#?Voz&$+EZH%x@{TcWE*rTE-(W#W7`LY-+n>?_rGWo3?0LNgr+%6JETOfFcC43vI0 z#Bch*F_|&AYC#K%q?q=7cIEU9H8-r$r=PLo$P`vW^v{miVN*A zKgldxQSn_tc1YtMSPGz>aXpBSGnsvUlC;=r2i#MkgYEC6>f)S(M(I0ZUDC`a*Ck&a zDƞ}SG+N%GO%e7>(Q5N^^v@AH)$6j!9D|C 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 Pzphq1G8nZY(qI37)1rA3 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/8.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d0ecca7395c1d433da6389fbc1b6185ad13bc403 GIT binary patch literal 609741 zcmeFZcT`jB+AkWHB2qNcJ6VWG?^Q&y6afJN=@5_zh&1USK}uAr)Gbx|!T=$JfOMn^ zp$G^_mrfFTk%VS|5Ki{DzjN;x-`)3)bMCo+-Q#31W=8VPnfbi!SDt6&{Kxqc;JUt! zo(|x`9~S@*X@7w8S%4Pc!vEs&&zt-&-r~ZA^Dh9FD|CM|0xn))0sO&o;Ude0^DY1g z0JuQ+uX_Xj^SJQG#Y=RT>8~&_GSM2;T?hPe;o`+VE?uOfyL5@xI*j%?;1UZRtC0M? z%WNhN^f!Fj72dorydr$Rs)NIHgm_cY(eEt-BPSO(53k5AQ894|C1n*=wcF}i543f3 zAL{9wnOj&|S=&IIo;g2vadmU|4+wl21Pgu@5g8R76ZA`1WvpbS=S zj#1&AuNeVifWQCvefr%6zh}Ykh46bX_`MzeMugvJ_!|v>qv3Bf{Eddc(eO7K{zk*! zX!siqf1}}VH2jT*ztQkF8vaJZ-)Q(74S%EIZ#4XkhQHD9HyZv%!{2E5zb_hswax)c z1&c&u5YIWF<1gjpcQfD!>J69^?x29Vc9Ch*Y9E$qFcGLU!PdDJw*xk7#0=_<2p3)B(FeDX{vAJJBkl+0G( zP(8PMA=N;rFmnnc^%BGqYaR8$yn8Itt^AIWOipKC-+)dDrsl54(cU@WtpVl1Sw!1) zvOoS;e7H1OwztVUmU`3m9B_4MgmU|%N4Do--BBejnH!dWSKsDP)m3nkTLa|pPWp2{ z+vBT%(bwe)O%R@ zHRYZk*PCRlaZBZwm}P3oqihB4x56wVNlL{2T;Y2t9eoS-oQw?1xf9UQGOh3KQ*_T_ zG?`{7t|VypIp7j`&7g@?AGMS|5_-3At10m0iAM(SJjJSqVEVE_g?Q_ol%Ed$hd~Wz zm}RA^5P@GMED6SIEkO=0Oxh8yQxrw z!N|639bdvd58-QeUW&j>oCiVP%zWKpqbXfvazL9Ka~pYEnb8+AmG&Z&+%3^B)_N(C9S{&)nx0C7kSk6!5By{=Ls{Ph7$8ZNlR11FGi`*NfjGqmZKRfxhOx z-2I6mHkKv1uBN{VlAu@M4m&}(%+u$wkDi9uvEMnjnR(VJ~Ovk4j# z$Rl0x;-J~~V!4}DcHm(VkgmH{Wq*3!_JI>@<(%yNTCEeNj&9m?kz}&AT(kf<5b4i?4@cz5*#IGW5<;D^nLsSUa{J@<5PrGW0gQbhB4CduYw3dCEIb z65KE-Qk;}`iL=19g%a{kZC14~8}DP|`Orb^DOx`w^AiG6{3>lxTF-DQ%DRVtqf{r? zNyfZbTxADz5YYif(8mNf0G2}ydK#sSudlWkW+)~h-r8Bt7T*>hU z17$mOGegCp;?ee*^|`1~#1*qOG#PUaptC=VZ4o&IhL1D_MQZZ9H$|NTu+Z4>YxShH z$bd8VZKy{$x7Ea&2;}%^()cx28afifW2I)NKk9wKz*m3bDOA z;B3owrI#bRoOoDFH(*rxneiWJ?j0_%{;{_&P2iSC{c}uMCng}<j4MJBd)m&faDO}~T9DX~IjihK5=qJ*a}s&YH_+N4 zpLF*JX}#@F)+Np^1?>!yByq!?Q2GtQOGM50xWyPQh<9|Y+Dg1(P2)rhL!mn);ZxD* z@Sh>gTUkGyzeVzhI0CpY9(VzJ9IKA6aj_*}G_-@qyHFOTV`*vf9K!6|86$eqD!L^2 zs8)=ECOgUHZl9XJ6xNx?h>!05c;TB)9g{+RSOS8ag?eWZ3l3qb$J5l!> z@WbWkA$jYR1*V7xbuYeNpd;-jR#Kcv*E;vRUhNcbHzjuGXX0&h3^f;Y-=19g_A=w^ zr>;v+BLS?&%EVmf0vB%Pqc%SJ4~}vN!n#+*Mv-ErD5I3L>=t{><{`LTGtr(6=G)!I zz7jme>Jx2}`@F73V>8k2r9!%mRi2clX0e2vm$Kt$w=sSBv1j4B@D5K+x=^9B{C1B5 zMlxur@^t_xMw7Lb%&|m+rYElUf^o1HE>p4;7ZPvhzF9zHK5lTZJ3k$1`?aIDQ?37A1NS+OgjT^#qK zfIh`}0;Vg~Yu@=3A!d>U0c-@2-2VqvWCVX>lujtCT)Z1e#rEYxS7M*bT9x$(6o8v~J zn?xQN1ZUkypAVfQ$l2K2B!0Vn7lAcN!x`HeA>7#sx9T1TiU_`}d)y2`?1bLN@%ZlY z`wU-^G9E9?e;)AZM*_seAG@^C3Cs0_$Y(ZdJn%`AY*D^F!y$R9rdQfmcNRw8qF%Xu zdc~uFX}3jasel=V{c;Yt&ZQ^ky2zQ+n=eb^tZ(`z=Q#U#sztHPL$rf8F>kQHD7!8? z6*qXH%CpS}v!g z-L2p)Umssd@zmEKhE^Mvl#f-#L--5-FTnqA*}(t!n}(jAzQMlUE-v266Z7LEwvd_G z2m5n&b4FY2oJYh57^yKsNhx1#-kPu5rE%78^y=7GZl&ne&sOWX&w4*dnP{jA*cd9u z>8FXB7VGuosR!WK)KhazB89FX#f?neOJa6W>90}9#iN?d;3Q|Dikfj13MenRq zL(!82#xFFxc%YM`XE5E^P%t_0>NiIZPhs;>O#ZZn6F#;u(BOVHX zDy+_+6K%}Y&Nl84?+YG_jP1{M{;>UkZ>S@_tXWEq}uDy4=8lC#l6(ZX;%(l^_^S=1UY|+aj$jcn$tnIW7uTk-SS4<} zIipV*N7;(@dsyU_S)enP+|5xcE9&W@QN`jzey{pXQ~gq3)z7++f8n1qF=UXF@t2=u z;!2l@+}Bj`Eu2jB(MVpk&|7Rw`Gj?cPd{Eg)@LvMjxb_JnY}fMQtOe|yP2Ge9@G5u zKXf3tc$h2%-A+DL2_IQxpx*I-^S1%Xx_Emuu01xKfAm0dm(_OOP%{fTPxdls&M|QE z4tl{UUh!8JR#JfQ=bP?uhu+UUE*S(lb|Ux84{HmodEUcOH*r0SYOjsWjF?~05lL*) zWkR?BejCc^GijTTm%Ba51dK!{Ax-@YbxP>Q^VCDr|4efR2hZO%rj7dBed<6#&F=Qp zIe-~;4qz0;8Ar8op94DG&H+pVRMrBr&flLSPQ9rt!(_9?A8^l8!-=8Y?ZusWr|nr4 z&(qM;2IrRtFnIRr?Si9*DN>-XJ$6%YV5au0pzdV1cBLB1RYPMdoylw)Az%3UzATb} z@CiY|fj!WU@nOxW*5>tG&4xqSLzm6`sr;hdZOw*v%XOF?WXQbj@oMGBFrG*=QSQjb zECMzBNzfh$J$5*Hfn$>5N$_T0l*#)W=7F75bXPAy1emO(4!q^KA?aZYTWuMat>EPo zQ0ZJ)d)(ewUtOOMBX;3k9mLGL@MyEb`)R>t7AO&JZBKMa{Y-*mrMO;c_id#DRO++O z4J^+;Xk-cxkb)~bK3JN|!T33NEW4~q$5K}!t(qBq63Qmgs=Vf6oyG2BQ4;>S@Ivpm zAfgw%+nCk0o_Dx+IB9{O>{L3}d$o(oMAVH2;RR98ll(<8ka*iXI98n_AHnGGOkKMn zP6;P;gKsN#{0`MWi6qLP?-vbyjgE`+lsMcxgRoK$+#~|s^<|NFiY2|-;Vwkv_ncVy z9}u+)Is7)K7UW~XTKb9_eV(JZXsZPI`abw&`DpV&JBTJQ8kn=S z2YWjgXVSd_*9)^SN(CT_stQE=>`PQ)i^~OP@L~c%DtKkw#EsOL%}i2LB79d0_IFPW!~3E9?a#om^tj$$V|oKzqWkJZ zoivkaU30@ki!#2I+vsSk9OhwP?NU1~9oo(0`{Eq%d?KJv@Q$aG(OAXo_Th<)RnC%P zE_l+1Bi&kbz*Jhz0&xeLg1PO%<(dB}dy+L}oT^M12CCIyU#y)1{qED{;u-SOY`SS5jqVLs~ zr^|1R3H;E4H8uWo0AFqBICgJ$9fF zroC7_5gH-gVuCNY;u_BLy+sJ0=hV?)_3M}B)k&qRL1t5jcZ2?#D7MJ7d~$0_&z8=X z!D}Ty@Hk11z&tGbZ7st&HHpK)NpGrR!xUqR(H}2-q9f5FVV0;ihN3IFJ$Kx?oTB>^ ztSgJiyhwsy#K8zja&`ODE_M4?oP+J;kE3lPzc?t&Vc9awF_03QcOCdGf+U^@%My{& z$Bto7*-QJ2kjlgc3a2cUVS}b=|0FGToyxmzb4$lj!+;cm1iP5^F}YTHUojt%9K zc|DWfmQ!xmqs+7j+~gD#9bNg9Y}Ghk=V37WqutC{zGx;RQrtfRZ+r<8rh(Mecn~B7PPhcs5xQF0>w1pR+Ktl6d9~z~(QRSy*LErw<@}S>@Q&6g1O%#!a`SVCvWK!Dpm))Oa3y!IfL5KOe#4P^htL0DX1zi=2SlkwsQ0WL zhx2iKz)Rvb2dHqogZFs@97WIIT<#t zyE3Kv%ks!_>*hOFrC(+@ug7HEuj+}`eLVWGKUU$}{kQJUBHaDPu1L|T2Neg9R+_5H zdsSOHrZKUE ztUDjCLO;0JEPwixq^e1s9+V4oNJv-SDRU-k+!6+6nqkM#--xxO5ByKG4evRM+S}0- z@l9}j(DpX`+3rjTes`PFw4EAuAED(MX#40K(PB`(iIs#F_z3YIhh zW0lqeAG|KodYrWOOl2!p_$=b)xAwZdazUr<3DI{*QFXU^glW3oNa@EJL+p%MYSiJ1 zhZW7#RHHmzswBsRhIHlfR{8ag_4x)kMRyO$Md_0@UNSLdJuQYPt%&I~bvlXZUjKVM ztkxZJ-F`XzX{9;&`oHom7f(ECyoNjcE3`&;hmWXBFpdpZqwo{qT^MidIeB*qfvO?9qK$35FxNYy}A-4>|C#8Q9El8kTN-jaK zs8|`|yBcI{doy_#^bs08$J8??-p#!riA$)t+x?Uroy5fi6)-AV(*;U304+u%q8^HH znfm24dF^b%rYKzTM-JqRrz-A?HO!zt+BjiQT$;VySevW?-j$+E_l>E%uh5R7Vkoq$ zIpXi%_(KMRx}x&pOH0nn?Svqo%N`$|`wZHHxvbdN2QH&REDLUwR@qVN4e-l}|0Gx+ zPM#3C=zTPWUl(@Tfisuozm<}tsqK9wKk634Ka@Mt$SNb3SsvH3l z9{+Eaq5^JIQm@vW1K!UbRi6W@tZ*P|UP}lx6P80^Mo`-b;DdzQXSf4CT8qlq_9Izb z`3QEJ2+m|PnK}S9c zm1iz$)Z)!;Mq)URz>=KxesA~XkJ50HTjEj>&_j(xA1SWb1Mb~12jy6a#sM5bupO6)gf=R#L1&H&o zBvzmU383gUV0M5ML*ncMl6{rCy+VcQ%J;ma%|$xAw9VL8xBD{vZO$>pCP8lzapjo> zyJ8(%Kd7}QJWqYd?VMHQxbLQ@bfUd)Qm0$f{fb*iw&)(J&?$26aNONw;Vf%?&%3t)B$Ft5XEW-Wsd)EQ$-c zgWd&hyedg*@Kqmvk)4)0t6`;gX@nZsVa>};{S&Lja%H0Ue%=cMq*5_Mf10$RzO=Fk zZ))WBL1=xDmGPzYB!tZ8X!<3%OK-->cfO^r77ZTF$J3%|ybvV>?O5J7C5txz8#66GX@{N=;Gv z%In?zk-ku?L`HKk_#EH?n!)0ycG5{9rsQrC{Bc#Lb#~99)^{ZV)&&pnRq~zABgOeA z)-Z4EWDplurpb?vz_75eyWKl0D`!+hSa3*Cpj4`ZW{gQO0{A)*84AYsj4b3s2) z!sN>mYADcM!UP4Wvl+rb>d=;GON@SsU-j|FRxRAWx1A4Yi}vjUc>is%^Eu#@Bh=y? zfEMmar;vKUd#0=Hhew%I#AEO@5D`Sl61?!w_2oco@$EYm(!TT=wD-O}9)2W2p{=5MHArRb3k!2CI2VQ&Z&Z5I|png{{h!-C*Fr2>%w1yx5LTB zv^DQJAMV+^xM%7J-UiX0ro@r9A zH{u$eD?yVDw%-Y6(*$i<2?~%Z-_)I{b}jHsVp4dXjU9$btjJ)TJwiUL(gd1|vBb~* zpFG>Um}l9edkmP83{fmwG$H{z*@^$N>~W=$d0EH2_{NVcRr+_{FqI1& zsq7|Q^dLoijkvN#xoIhH%pW&0;Pvao;!|VPM2dA#&lfa{Jr|or9)E;tu0Zjj#CJp2 zQ8dW;R)Ow-s>{e`IBF@J9{7RWj9ca6pfgQA8OgvqGl+-{!FUVoi+Q?Bis@~EhDOrL zVhhqX1&g2^SrW*UeD_p6^cA`C<1u&^el`4Br~zpxxwW1m; zgLLuWN8R`krx;wM+nBsIS9z7+%Q+J#3U`U?!TB6YZJ*^qh>?1J*9 za1{)A>W$95GjEz~{-x3>-kT5P%3S$SZpo_{m7V5npRU%YJn;Oub+(2wMKQ#~Szu#b z>QnKdPb%EoL`dM+L&;Vrd(!34VZJE$lO8l&(azqTH}PyPWp4h7-M5{aHHN}>N&B;m#B5l(=H^(n6$MZw=|MP5dKN@k(_`2fR_gU|=zTsz@mFziRzkq2# zdt3I5UH_LeVMikbG-^wE51uig_Gd<(0}fd;+673mXQxuV=T-xH~GZjwT zL@u1s6kJEkVhuFv02CnzJ}W&mVDcCiq}{puRROku89I2$&ybd`y8ts$8c2lPRbQeW zEqJq&OYjzxhz?d;nAtt~rkKw<6#uRlLzqV|K@yRqFdJ|22c>C{u&? zzc8j}z=OfuI?`TftTP(c8vQ2?H2xTt^Ki{3MF&)zo#^-^t5aV~@LX-!s-)oau+)n~~V=WC@ z`8uimV=Y=9sC52=%9rg{{-2s+oad34>)6KUw;>wjlyh_&N6Oz(Mct_visY$${8 zDsO5rgTzZSw59o+1bD&zdZY`-PrczRJrR%|yhxReD0|&xDg1I}%z!_m8nX&meW(m4 z_hZhGfnZ+d;78$L_SDc}%{eKH7G{gZL}N_K4Y?iWdCYRx_US3C`&6cjr~2f|qkj-Z zzrbg7yFExw9gAFnr5eJ2ljBZlxSGsCmhH|Yea#1D@C{$vc=bSiG77zULqO89dQ$pl zrPR#ctoc}-q-(j%!Mxc7zT)bD*vf|ltQ6u<|A(6Tgm_P}-bkg6bjSmOrN0mA%7RZC zZ~Tf+nr%v&CjA%LqDq118op^hG5pUZW2=X5c56v@5ZrNcuoqa#Zyws^{DoF@F<4!W z$gU|9EMDBv!4#uv$sNbB(UYjpojkcqmPU5KnL^Fa-iC|7kd}2(p(aH8eVVdj3FSbi z35F#OA5k-Li!5$~5`|gift6Q1)Dsk@V+?|oZ9O@uIJ=F1?2xIKdo4PBFLS2x9a*oK zU9}gu*_yj)mR`RaWvz|!`g@Ioqew}58eSi9kXvbx zp4^*Grl%olpWz311pPUn)Y|_Hb|OK0BM}EYy@EGBbKCbnUZG7g3cT-(wo;xs;d-fQ zu#9#c;xDQm?E{C#g8ugu=m9O_RIKc&$e!_;EPt@ewj|A#^COc^ufuNbQ+^cPA`R7nNI+7PzAuPlc(7a0|xbpSMTrZwS8)@w_R&){-nai8%1fj zOIv~TE5|!9{EB4-8&@B%KUz=67k$MI=w@VTr zGv><|V-@IQF>#$sij3)>4y!3TLi<)H8458c<4l0${^5YsV%QN?A5GYrDjP#tniy(pT5$JVZ~6RZ zX7k{!xuUs(E*J{G$PW9Qi>t90Iw|1-W}2X*`~7m;IE3B~tWTkM(^t44#gGY-b*54B zWR7s+a98xD;Jpe%p42fCk_?NDs-`=HMhf+b|?b?t;U;(dvP;S&-~b!{1^fWAC|-v<#I|Fr|d+N)hCtT{(4#DB7qHs#DEqcn!y^MRxJ8*md0e7U)4~$Nk)nMs_zzr9f$|0 z@7V8zAz8%zC~lo}UL`l*%MOg@DATtI;$z4wJ=Y^|Ag&a17p3Tao7e#Y1DjSHp$Ly;>teBLT_pvJZP>%a!kpxxJ9yK7?|wHwA7^ljAKP zSJkad<^|!3$01;qRpCJC?(xL}#}@T|G=9ZCLzE*LVT#Bl)=u2kQ4LBH8!}l%UOhHX zx3`_Xb2Ibkn%2Ppfr5-#Us2mm6&~8xxW%bvrxKEouafwxZHPauiYK2l%EFlMouv^* zpF>Wf#%|)qrhcFZEhzxTLlfH+LhqB{-LkPWE4}YDdJ;!E*cSuH8U@D*yzau}d*+bE%85|i;&H+yq z&H-cl;L(CYF3Nj5XIdLW;F&qjnASQX4Zf^;DoCq4kt86g=@gMlEi4GP1}1z7x5g6M zau;{)dEr06oacazA%1Y?$=PEnJ+0>A;+FRh-KD9w=KxpZnYAUCj)GV>)WA}uAi3UC zvP<5T2H(@!Y4s{6f*4dR#=A?g4wVsd#Z-?~Q8Z;#%9B5#S~R(U;IT5T3FeDlwjdsu zZ+z~}moO?43gSag>rLBF)%~mm>(Xi}71|U@!jWVrb?bM|Hf>HCnks6LMXO4Q$DNM8 z{Iy$tgJY|C+$cTWob*2J9z#92{W+l4c>BUBKXs5M(||j+aAGPgvr}t)eWRczru$f` z#kt&Vk37)JIVDF1K1tnq87@bPJlTy^nqL0EFdu+Esef zu_Q&gE_0;D@a5wBtmdvtB=(6sUWvThH*0?pL|bP)8>p$il@V<`L~xX*&?Ii?TEE;O|#Ro-hdyUc)cARy_e@tK1S*YNq$ID=zLR21&BGQnpDDC2 zkKo$3KlQaA(yM`!k|WwLQ*VWali%TXqo7w>L{PA)-f*$Tl&hjzV-Li-rEwuSvs+uU zpFOvgS|yF@l5AUb&BrS+FQhyX!4+P@_fk)FRQaL?h!gU#{*l6%qSQP+D7w~(yJ+Qh zUoC=GT%!6ci~5{6%K^nGFH)}#62Ff~DT8N%2=Lfjq^nKEZ`5mJv3RrW4vAIefTk1l4*2!J(!uCiDx5oPoTn_%n&{4|A_nCck`cBJJ%JdpwlhJ)d__M|es+)nW<3crxPVv`i~VQDV`LHF*PzXq1YnCa~ooVb3yFq=K1mWJ%? zvmu}LX5`+ct%-Fiq)@ZL&*5ZMN69m$Mc$0n$~`&$SOygA_P>sGKp!Q!I{tVZ>o)_Yar+uI%Nhp64z=^?77|j zkYe4tT&88IP!6$H;7{tM6ZW2Z)@ao(``x4yg#Vt!z?Ap0FNb86H~q$ns^`oqw=?JOc#hQlYo zdvzIH@MheCa>ts5P(+vMNs_w3Tts$0h()Bubv(4%g104|r{`#tLqchI1;kBFu+zik zGq$rVlXnjhQDWmzNS7Jb7?|VCUUD|`IfL~YhWCS7Ur$;Mv$B_k>Tqo5(~W*mQmg~V8d zM*vcUb1M7unddp6i?&Z+ItQ#Tw~51XqBvRV9Vm@{cNz4;zt_;*&j=6D`Wi)#p79(o z;@br#dk?_BQCiO4wl5`ztDaT1=n_C2G|)xpyiip!GsV{aSJQG73JwR@6kV!M}w5d7|{Z?Ixi{1FO(G^_8qBH7Nht zQ>tG{$V`4%@~N+d&mqb=txTCFM`Q|QMCCBNwc>a_?DxVrlrih4#m6)hc?4fdZm)6K zhM!7pLHXM_U{eImV!StyoZ2zN=GJzbL?5A?$7WJT;;g!y>F=uq5q;gF7~&nm_|@gz zQY&XMRi|b)A=pl~$0pxDN9#g-;hRK>G_?6@p;3#3_Gm=5-guWqe0*IV0j{{)^72I4 zM>RShgm0{gsWB3(Ozv>1{w7?Q-O;VZMt%IvqDv zjsbCm_4aAurTolO-SAO3J@xX|tA#>bt0W#8ztf@`R4?L6=uYXSULv5hnCD<%Z&eXHS1Mj9!*M19=s$(=PxHI!7TGq8`Dh0*F7N;}B7q|)#FZ1DUD7`nrd?!O~ZkfA)s@PT_O! zb(3jmLvKKDORojwwf^8}zF|~Uw8ChC604Jzns~n3icdZ`?F1o8^l)6PgvL~9yvCSn zWztvDZGPg9Z5h@mG1D%>-nUS6PXOo+if1KlqqIG+r+juocyo9*=;%IiZRayluZ;nQ z?BQK}b5Kw6dV^owY5k)IYcfvP^G2|cU!}lh+{TlV^QQFn`~B8O9u25U(HleV%htP< zrU;{!vqXK(p`v2$8Km?)0W&3&k6aIzAbY+cSw%q^S9vmIC9o~M^dHW=>Gc!c=g7)7 zIt3zd|BUeI{ku~V^=tcCr!;cX!P3S_?FUy+b;D;aVi)-+aQvVXZlxgV=Zh9_Ij!ok z9^&emTUKpM?3JJU=rq%Ezdn) z4-}P|7o8Oa3nipK+}jn?zRP!)?}+w@Z?A;jATOSRDIDb9GD;XZxo{K8-o^#v>-}}2 zQh=*up0nPt%9kRp=3(aCj)J%pnBHM9BCW1M8BaxEBQ{h=j~qo3Jqi!i_{Ar*|&j$p8wdMqKiaFf6)cTcYnwB-Om>?kCZe| z)N~!sxMAWS7c^NQ8T89CGVpwwS9T5{-%zEMA2uIB$R?+M!D0yTWQu5c zs8$V0dvG`Az#9mA`O9!D=Py$4yB2ZAnR)xKGR0h+C(NpTJby_l?cJcn)vd3!1jhF( zzOa8{d@%;Ytb`I9&(p6;Yb|E9$Quu^4CJ+3e^1J1593e^=>h}EK?zkYR=F!bayRoe z1ASn2f{YkOAbpP0-g;S}M7x^|%t6@HZdTvV;6ZY~ELqHW8%49TfAk(@kw9OPnPHVS zq>|J^vVW)g9OS6k*%`U1IDj|gylM)&SwA*lEA?_z-|=1A&wvXBtCbbFZ!;x9>7%_9 z2u8L%$oRavU)slX@y3$ex@P@tDvVTso#Tq41SR75FFVBz%KfmrW*eU*%cGypyPt7~ ziFZG;Q1_SHebbeANL?H98<>g875W!>gfM)SB2RvT^R(&-S0{O%Y%~F5YGDr=to+m5 zo@d+KbloZcry|JyWj4NxtRJf#UN(d|ei(-wiHOu3lDdT(~IUh~a* zJ&_=By*lnr@qRyddBfV|H(wQ)*WwgIuW9|mnVc}D@(nG)t-;BwF(F|zWJ+^*cmqmD zkvtZa_O&=Ipbi@bQY7AK3LVSb-Z}?d-hjEB0u3kI-MtgqgfqLiUXIM!!?>34Zt7kI zAB}Ii<9qgdX|-{I8_In*q?}r*gT$Wqf9NM=KoXbl$ljzhD3ESd)}|@sa)=nJAYyy= z`^~J#i2G?9WkCxX6VG=@+INAwnhYoGPc>0m9C&&*LU97>%20&~RuXtWiPKYb+kLf> zqN!lrz&YoB%6yrZQLoHmQ)dD+AxN|QB0}K~^Ja$GvpOVDZ!+`dErI%(JY*t885QiG zz@CjCuq57{Q)Q{*dmeqOR+h&(+9Oz{Ki?3{;=itUdu(8{=cMC1ny;e&aYc4mPFr(H zE%;u~*;NhEuE*&bGOF>PIOaT=wKb+LLNh!p#7DbUEQFMfave7oq)Yo*YcrP$DC}%h z1_4sek9H!KVbfb!l zDckPc+BZq`Jmd}q2cuk10)MUZ-|69&I)Yl}sYdjc?n|&`=c#YV2IDqEDoo?-MvKLC ze3PmIg?akHUj-G;_|*zJvw<2|M_gBnh{R?>%_9}w5)fZ{e^E*y{~Fz^@pV(QxCFcJ zxIBl?p+_;}NQXsbG{SaY6&DnVp@fkXaf@$cWmd;_G&~5ESIGLC)M?=ieE(wCD{28^ zILMp7y(z`RwUXC0#dy9Yw(J}ru6)SdGz^UD!V7bVY5^hD@gsVpNb%D8I=#l}9~9A; zy&o<-M|x=%D0QWMyG7{%cgwe?d16jgX+AZmD+BXs8$IYW^IFfF2jDVkE$Y>;WJza- zFj#vnyqn9z;7(4u4iOpI*?f2JaI}jT`h#P?#zQa4(pr6WL-QO79 zS_J)+jnw9Y!a?LG$~y1UlGSXxiN{LX0iu4QNB0suO>R6?^&(s0Z-uXYL#=G8Qb7}& zd$x58!ZYyYUpr1G^&l-{2H|LPk$3{n#EKh1(D$`<^h`Ldkk8LK(oi*^4Kwg@)pYV4 z@D5HiNhS*?C$~F+nV*C{BfH_77vl>q?sz*ikT?c^reDh=Kx4$ieChJD{PC_*&Z$OI z0e6}=@KxTd8!t~FGf=x(Tj=^rpMk5}i~d+Ux0s>La!!c^AJ{L>jncvXXwmfBdZvDM zB*UJfY+q>qf=U>Ve=@Tihg!jnZ|)>fMl&?GlZzFQm#5-k*${iFd9O}F z9O=+N%6PO=5x;CcTUy)R|;fz1X*AL-EA@iNdu{X z>U_|biA1S^Skl3!F_S*pB(?LY578&z`GbV1g>y`lzLIN42c86jddD0sjv(K_mlohZ z7VnMh{7vdj3Ri`lLgmUfd2{WBh>MZ6L5y{fUK;_O#(o6{MJW?C&s|1s9tR2c_;=KaoIyoIEb>FgWA zg$2ensB;`>ils35Y$0JGJtxjF(S_gZB%|LEYGS%xc~WzNf&y9XJ!UwHWPQROA-i5B zm5aM@LrjWqi?vv?n8z0fk<1IlEdp;;?y8$6d`w+Ini}rV_JTcM7s}5G6 zm}2#+uWHdS{qMbv_ms8hvcDtVB(b*4L5lf38OJ5eQ5;rWkw`AZ!(A$a;on=~oM*4W zE^uaYrrvk}hy@m+N9u{MSbx=;dlHUDY@R^7W%+H~)t?tT1-ze|UbLRaD%VYvlZw6@ zv-RGPL|r5_))%X{Xk}RxtBoT~14NCAZWc3i!t_}a5F&wMeM)0SgLe=o#_NX>-Oki& zK9&~+qAMeMmOf3_b8$s>jpp&|@UdydD!N;&TOmwz0?I~FJok%lck8poC#1MiEx`Y# zILPJoe<=>~{{NyjNQO3Ym__C`K??0>3f|U-4}lpp#mEiTMA3-0n-qSs?-IIz)7A2& z)l779IXS);%%wEU@VS26Myd@Pj2}p3Gn(-7x*2yD{HUdQ+yGSl0*+pySc+ckIL=pO z(BY2zVdr(L31QMNpDT_d`eDk$emZNLr?DDm`Sr%@qC?cZ=5m}QDK?-u z#PfBpEGy|+o5qC~5VdzhCg!f@D9AaWx#ky;72eTU!2Fc> zvsE>!-8DHjs7*9RdqRY`l8>fkNwLNATO&V)PPFTbl@yCctc^>VV3i{8Mj!4h=;&Ai zk{Inp@Ok>~6}HidqG}S=QIHDv0);hSL#1Uz5c@=>)0X_=eW|zHQqQWXN<*6jLR6Q* zMFW=C1B4hgvEyB(;#Wj(hxU)7IRi)d+1~b z8G0q}SJ&}2zN&MzLaHm5n&Y#1TammU;%X(w z6T-Rfea|LOAERkzDECWv_@*5BGihb#NL}4l@O=Yj8UUV)GU?MN{RIIdVjv(AHKKS_YZK3Tk?E8U)S}x z9*_IgE?WAl4nNJ1!Z7@D=Ifc0VW}LFlyxVr%DR)hs(NAiIB|vg)b+Xp z+Huvy+4=Erk7dU{oX}JXNyqg)9ux;Zm@TB^u{+ViI=jZC~62cuY zV^UsY!M33M6cPLkp*O|a>;OXq?(|ufY{nI4_`Qjt3RV5OA6GMt)n`Z>v0gaKaKZPQ z#`ar8k#=Z;b(b1nd(A%%-WX7T+fbuPRzgSqycw3rfqPU7-(Me}Eqr%e^3}ORx$#f7 zhmiI9&uc+`@#eiLA_VaQ2g^#f;q8lr3-5H_W(tvTITL`%st+_)Dqo zG4myaJ_h9<^jJ>?WJIO`WmwduxZUH-GU8Pv)~KI6n0~@gK_vxyj< z0vg~OKo(mPD-q7f?(!R_aFeXgA<}M_{V#=otrq)khSDr$Z2cbk;)8SDp=?$rnPMoZ znOxpO?*nH*-}JkB^YhyCK|rC@6{JaC8o|v7fu}IfS-3yZ7Et69n&ja8n++n*gnuU= zj@PgGCV9dl%sEKgTCo{MxEORst!Y5uV&yG5NNdw&QS_t#hO}q5qlAhkcO2$f9dV~Y zGtJa(G3il}RUPAy+IZMS5q7{jHY5Yd5 zid>+9xR4=7Sh~3L^;cNZgIk(?X&a?f$tfCVtj*Qmecl_;19=XA9bKw5h10NGQ#?H) z?%|@vKno>4OH$xGspE0@dESJmGvmnw^l{H;W|&YlvXFMer3_E-G&u% z?JkrTxL44-@<}2FW7+vFCATdEqS6{HFg_A$Ni}Le!k~8X*AQm9t);X(ypO5uaS(J14M`dB{Io(=ts z7LH>j_Zbf@i6Mq*Mn%sGIzy5!Xsz{P%nWvXV6pq5=wDU*?DN}UsoiQu>~5@zXG-=xx7C=Njv;=Qf8t!?*~IUTv@220uG3DUHdT+c72^c6pN6Hov1SV9C5x~pmNU); zHfVBHsX)r}S~86B(_8aHVTTf>iLe*Ms$0QRsT$%)A?@L4bm&*F9z&~PjZ6`?gesvy z!9ou*)z@7iIba*0TH^#89v9jgtTd=Y{(~bXvk(3{~Oh zlp8#l1ed6h{u!L%6+_(xm$0DB|d9Mw*-zuzIo(W9A3TLWb)&UHX z;o01QI>~nu*a|-l3#8JlQiPP=p=7swH2nr?YKBvZXx79#48BpY2`iF+Pe8!~jWf%P zE+aE}3Ul{K!6@?Ua^!?|F0YD?$OV(2!DRm|?lMxPhbz zV#xMJGtYr~+Q%{-txIW2T~_xRoYmng0S%#9+lxyGpB{YcFN0+b$85FUHY`j9F-<9a z{+-Z}c8lWEKTyFOGV;@Wo8!ao^YSC2wIUbsH-nNxZu>OVNGk*9TqvJ=U>W5su32( zi?|KNJ72ji8u(W(+cLblze5zL<{SkQ3yxe9!s z#4klV+Sfzj@bj9p^N){!XMCe*P-yV4!+5MEe@AHsod=dt6#29P28ws0`q;ydpTUbr$~;D2h9tu+Nx<1R z@Wn!FH-o>UjJH1Rm|FznZ0hVvV30bnoCv#s%4c1kt2CW!yFagWfDU!Z`5R(`Bo!`#w=I8c2d%%k*|XmRbyqeq$*$)>4q9 z8BzyU{#}Al6q4RkOQ`bNtZgldi7*<6IS+jb)ZP3hv_bQFH~>waq^K8ihrIC%-(UQ< z+LPM%6s2x^wOWixP8Y~4ZVm8zeOZ2Kff%|O&jG)Ag^pLE`ONBQ(+n3+b(4NxV})C9 z`m^v_kr$H#>Qzh|uA8Fif`aeTd|8H7&)IHeI{tps0Ag|sWk6BrN(vvF9r(AXe!(M8 zeV^oR+STQ98&~%L6BhekOZ^K1pvS}2utK~eLRQHn+7bV&{~ns*RLYZ@UcA@KykE)2 zra6Owgs+3$)r5h$&UcI5W5g$B`Yo$C$_jA@Nmq)Wi;W=C>s1`pS;qh-(@~JFj#{|thUU$VqvTeT$)*qdD|J3iV z)>`EdTc0kbPqmYwIQ-j40CKW7#!3 zW5pr-fd+ZjxY>!X8?^?OY#I1X#oQK~<~ze;wUD8D7Px^Km}rN2F7u_PQS0myXqF%} zrmG@^5A>5gQ5Sn8NVAS(K5M47=;DHS++YMNa@Q+)n(S|GN>qI!>@WHsBH`+$A_uW?HN34pAFX2 zz&0{l&TmfcDw1B#nLnlfK2Ov2u3lOjKVCZL*!pop37#iGGQh zZM(CacaiyRNydg&&=#2GMm`_4E2Hqkp1$0F&8TuyC6XDIn+KX)Qm*0N-2C#aAoFRB zvH4%S>ex~h@r>b(J$sBDbfyc}L{&qc8ItK)0ldROfOngpexI5(W;-ya{Mj0ZzCot7 z-I@mXMj;Qw@5b7;*yTP3paf|u0k8J>UoWfXSx$uLi0p8StqHQc#6bq%@#|IIe`~*N zd)Fj5FK$O*>%YAquv1_f z5y9@jXeufj-`m-62Ah7YJYJ)gqB;b7{f1C%r^}EuY&F=cVB7*8{{@c z=ZKP6s~q~x&4FJ@L9FTtoH)4ki;GIlR9hc=jHK;*F9!`1tMaVz5IHV-TVnmDXa&)t zL*O+U#BG=?hH_G-1J>%7uJrfucdiC#u@qCRusrnz$?}>r>^fFJH$~`vhowPPVxPmtP+Vuyz{ z7v6vCux_ChwrPLnZ97hCiC5)#cDqDKy%FGxIc@+ON=^q?x3JEnL$)n6y9SW+gXAYo zR1v$R%Lg=Bswb&5fv!ug+PSiz z9=7f&T@)E7M>))Tdt)49!QFgeNSu|5b>r0R)3~uTfb*;4Qpm2wwF0=Hi{aJ z;%phPCA?Y&qJ~JGBid2QQirWm8|-&MDL}Rubdb}uYi|WtrXndh#GTaNyf3w$%trva z)(UPQXdGWt<^n?)&dYgdJ+^D6sJ@v|YESQCs$+@%1Z8hajo=({Z+0lOKQF&!QwCXI zt**5I)Uwpvrmdbc$DQeSxO6X$icp!IlvbA^gG;7Q=@x7%Lt(yjN@7g{?x~cK`CXwn z2A&l^Uy0IjE>if%Cyn)Ke zIzs*?Ov1FvSSKqa;Bs8|&esccO6B@!h<|jMT)!9L0~_AEFCg#BF`6gcO;?b)W)`E4 z&)^4`IE(EK$|oqzkm7Q00raGu<%I_}tDHfAnw5m}F34~Q&cFRMuEb1LO9406P~ZiN zUN#x9M;%**Vkb-cO$F1NlFA${N?h*aA)&d5U^qY%x_Lq$DHKD$rqH7B6PW7Xd zb#h?W!AO&DmpQqdbdCoh(SJyZz%q! z$2^8b&*f8qFGIdzgX~ZkWq)SUC{X7bpr$!TTl^OFHK6Y!;8C-F?=Z#HgpHyIr8d{uNa;;YA5)fpFX7mCvYuWD&( z6@c1SMgmcvtlx^LZirxGnL@l(?V(&Bbuzkgb%0XOOG|i*b~mB|l`r*JfCHBXJY1>T|W_YLE)oo*L_nyp|Fm z5F&k%kF|U|%1uprfeT?pWc<8lqaMU95YepEkO=GBQN@|&Sv4iTA8Qmwb27Mk-{n-4R)jVF7eeKr~#3m*x^6eR#2q<8+ZlCexz+^(|B_VXcx(U)n2-dIi@GaF0-) zM)*+c%rYe#Jo`FI9{lir z1=5?U+W>Q zt&~#5*k~M8fY^R`NX{WK3A)2f^=B_-UL0mDDhUnFuZCaa;0aQsY%`bcC9t zNB6`1?|*LL!Gm&KL46ZY<`Ea?6e7(F#A3v#&o1yOC~(Uz;y&rB!318TZ|cPO`D-M? zmdbb%`=Jj?{J5j_u^XxMVSlS&WvpiUJu$drZ@#jb4-D-nZec61EaH?1ZHmg1{I&!- z>;m+U7mGSKXnt2E12^cC0z2sgs?@2?j;xF(o$*HBLY*|$7YvDVeHz^On%KB!q;ZSs z09loqBb5w$>pTgW&CZM`eFUT1S@$=kU^G_GtdD!s@2B6JBnDYn7gc|i%Ft8H@0ZFL zGQ5)-Xg-j-2dg{r9|_LqBHJ?t8_Fw_>IrEzULA30xnx0RA)(OaHxg6qb{%3hR#@w* z)Djnq`+en1R+ZU-5Gw?L=lE53<8#o<3&R&x(D)eyFF@(GMsr zgcy37k&uOU?bzY?dtF_+JxH7D*rw3yW*6oyo~gQdAHk1DEh@_MHpnLum2-YibHCc> z#u($dC1)$wzJdBXSC67DM{iv*!JsS&W%e1}IcgJ18rF$*#E1Ou-&Y%x?CW>&1JaCX zqaMGrC97vqEhAKNaM*ptZ~xJy2P~tF~Ufm7JP}(_>UCMQf87)fQA28z&j;|y4odVm}xsBBHxxc$X~{! zcRKsUEd9JT-G*BY5Qoxk(kl1URtMf~O4{Vew~=jKf0l!Ik)p4qTp>xxMNHC39?Bb`^d)r2l4PjAwvNml*?>YZTB+0#-eIm}}fi(pO=Th42Eo1F!b^_Bd&$*>8v6o>9|}GeZw5F=lcCYzla5c!!9EA6htfafAtV zsN?r~`3Z(`*%%v^NHD#~!4AId;-|iNiS=GukSb*$Z>ttIB{ZesEV+xl_@e7(hut4G z`66waJ7%{rDWgw=zhNY;hl$P9dhN$H`G@vNfU98rQ;s2lgdBF0rcyRp%y1l^p{}q| zoPcau_Y?TibAWX;#53!Jlhl>%-!7{)=8$SycJ0!lX$P@~Eq&;<3B6E!*KRA&7P*U& zT=eZ&Q%t%9&GjIr$FcRYe4~PILL$9g@lqJ40`zre%MxgzjSn%jHnfUgtwL&HSiK@& zD=KJeKoU4g^+C3@YPJT?W;r9t&>J{wZ@|D=o4?BHz|D6#8&7tqeU^XLF*7!0Dfmh!Nr*WO zH$h(Hpa`31e93R4&%%Uuu5EW9wV7ZpZM+^)hZEXt*j3=<*gBHjFtZotNtCtl<_K#jSS_IgL!<+%#8kP)wBPW@G0%W()c zX!@J$?VNnf*Bw7zW^H6Gx0S5EgsYeu_A|)#ye)zxL|N4^NSG}2W`{s=YvM3tyfBwn z^ZO7n4yB=|JNB2-;2{m$v160)!tFB^Prk`yDfSQ)oJWkSg$rQA_&q^s&g=ZV2Gjvw zh#~2C*7!AG&PubVTz3Voxvc9j+)%u3A345@Si)>bKCANTg%_&6uHSW94TZM4jtWq{P?|ZyU{uIy}QCEsS^}K67Fg98;sOK4Yw-*Qknc(%3_UL zF(3_+ZGe{r9l#C#Mqh}(gTRV!BG_qvkefzWltzj=5O?+>1tRbTBsRv+K7;;*$UXOl zM{1fuuav*m85TlyqSBr)g7WWYr84`0P$m zhQFLsKxxkD>F9CG6?6Q1U9tfiBYk1LO+GPRho(pE*bG9Rqt)kW5M>sIKc|(Qzxskz z{`HS?6Y887&$spY2HAWvuUz8x7-cgghVE2TXp_ZT?f}vjcPo6h6Pi3UJ#3gL8Eb-) zvPnDZkgRQF)HgNcd>Loclk#3Fe#(%uN_4xQe}~v& zD>Yq(Y)Ee6Gbzy+3kk2ahE%Cd9EnRB)(3QTH#8jnfMyNco+d|W{nzYpdy2nkt6DC&s1YbMG1KcNG0uAa8=vAx3$>!C5cw#Mhgx8Uwk{;zVrqgP4EbqW0InV z*b)ah00Qe236unPq+BQNB=-3?!o1DMQ%LbP^3_gixU+WHCBInzKd#1dMJy+F`R4Mv z{;9z|e{}q?^B{?dGiTx5tN&7%_aRbLs;%oZI{@l)?v^EbW_C6tz`5M$e1{>9rPbv! zNj(fa(cPvwek`=}V7$%6?K<0w_mg?7mF`KHw2NAl{h?5`VZHBM=+A5UuS?onXnXJ| zvQc8ZFfE9RA#V~F25VqbSRF<{V+guI4H{lNTbN#_7B1p?M?p$d3UiU<0iTU=*M875>f&67{+<}p00zMB77f9dP!<213qG(OQyp}vzE z4|S6!-Odrk+fO`Ptrqr?X4SS@@tFl3Y&fPsHm4POT2@o*sPC*N1M4Ic7w0Yk@oXiRe z3-XBbB)NugPPPNZ!%d1_R`O)upV+@@r&v(anL71?=`Bh{$s9_Sww5Rj5(f}(wy8NF zLMklxOK-;`SM`TK38_YmMwhs8yeD}G%sq6`5#U4LYtRb`R2u0eWb%sV5|SQ6>P$gt zriEx}#)R7X_*xv$;nCuUD88f*rNUj+_@BN1Op>f3sD(gzLDnBTRmoGjHsvp-Js+~CBO18eO zec_AjeCM`6`*_tlxbe4}CKXC7@h5=}>NYc=BznfbOXk&ny3Bpf?*44UKb|+Ngnx%w z+f2(GhRX{;M+5Q16V;hM*=lp{`WZm^Unwk^KxhBFW|d7v>hs$1Jzq{#2m_G5q}>mF zQaMX@NyeJF_t($_biK9j)Y6cNH&IwTjj?ZZ_*UtiDD=C`u&h*jgE+PUJa$-VUQ`-m>Abo`LdOHXi z#^wrku4t|~2=j_|^-O?<&5H$$jsS2n``H>+&u`?Ic;c9O=eG=>cRid(WR!)V*=t)a5 zjh7iaEZZV*TBT zB5z@Z5M88;R>AzwYxY!##)IeUsckaKf>_ApLo-%ilkB1C8WZ*U2*2)h10gY<5+|z? z8Rf6`4Tg7eOZU3)Q0hI)gDUdMSsb-=GeeDp9DN7mDB(I(_f1`a<$bl@#lQ1$z34Wg zCG&m^$=MYa3A!eGps8|jc3-R`VOamkOSRwp2wXvGTV%K2y*|~CGV3|G45-5`q>>o; zaO{U7O!FQV`{l!-JtHRP;Xj-&nX8V#mM7ZeW08&3pVw5&N-0UtSH%7cGg~N$>8>yN ztB%xqa0Bj?WX2WhX{YYjRz9|e6Fe;A8C-rw*gl6Y;pn&Q$)#r@)Gab$GcVr}@7tGG_UxsL<^te@l+(Z*{Rg+Ei8uP=ay)UGp~% zk}Q>jk@}~`c1*JUTh2_sW~u8C=uzX{jZB&Uy4x5>dKR?UUwf2iViJe{YF6G|EOu89 zwJA}X;_Fa7x*PcVl9@6{j6mW6NxPJb&g$2T*+y2vA!LR$@Gpq^Ju)sN4&z8|d(=N8 zr^2i*_qeNYdlnek@>Sj!f6eW3C^n#WJuQzxFcFVsuaObEpLt&)$4?0*@VdHO?0?4Z zj)ttgKnePO!d$x7kd@2G)92XafHd*iw#ncVGp0~}n8`6k?z`(5X+2Fy4jFT;2joSWY@`{375y!459-4kHBNaYPnx5*tk%^ql-H zjd;Wc^({ou?w7LDpc`q3HdpB5F345mBJK&)eEUT!Y1@Ht?t|L*riG+^I0m9BrvHno z=r(Wt&y+Xmw!&igt~WDvvM#mj5qbv;Gdghq8gO#*ci~b)J81zc9d^s1`0h7G`H47tmK|=TkFDw#?e2P^4Nm!O zRgxyEm9rM#7rtGT{!LvZPBLRBHJY%|@t&y@!6&V&?}S=lV>Z8mAGEbs&E|+rKJ3T~Cjfp}yOM{^}QFGy=Lq{Z(5KuremqI81oI zrG^b%tU4u3)o8BDe*8|&gNddX<+iLm8jI3ed>>-O_cZi29?g`=ntWdgYdx$nR|9zn z0n#+90e59kqDTEJx{YwA3-xDcS#qF!N}I6gL})5C@E-mP1-sGQZE^yvhk7xt7*fCE zdR&{6rx_gLwx6NiQRh8gO11%gQo=%;)rJ9T{BPu}EV$9;rKJ#z=V+uWiY`hBpLj^Z zlh%iMmo=B2M=F&JL}j_(est6C(?WqHxW5KB-LWIxmXl_8W;12oeag)(0LjhGsp9|K zvtRPLUFZ7f`mNA)hU3*N$?>rC$Pi1_F+VRAX^-kBWtvLK4;%Td6N8WPo`h6lqWvQm zMh~NCf(XEaZ+Qm1w^}ho-K$5KrsV%Gy^CITaR>21dK7f_WD9^6Gv_Cl|@ToRwZg&r*M?Oj4%Do6?6AHmN&tM zQA6`mdKy`*zyTBBD$Xu(snSS%An;EDoN&gUar>G7By)D*Fi}JlW2HfB0HT_|(MNS2 zbW-w>y3f}c_7)4Pl2qaZACVbGIyzJRbBJ+aCebo|cS&heQeu~?DNTFF&akJkJ!maw zS%0&chC;($%H8&eudt{RNVwD&R7IH+XU(gj&zM8s$=L=IwV1go(fx|XEk^T0^S0xo zO8aDoT`w4j^ZS^JB7dYfOVWq#4D0ktG9U0W%d{!fjq`p;!dvAkaMq{^gtyozw68=c zwv(a(qP9MrahxKLNAUHrU%J7q$rI;E@$7J|Y@iKNNptN~jX@4K@n03jnzPx>DzCgr zTBqH2<1dU{TpSLRZRofgI%?E91GRpk(xbfAs7`W`z0D0TVzg6fc~b-#(F~+ur+ZP4 zEsR%IY)zLgWnFy7LQ6%yK*&02!i?TMRh*t~qLiDzHbQaH(r7J_Ou5pw2K07u4sfx% zS6k>1F13D&`>5^a1uhZK8A5rp1o_-5R zhf6H|4|?eiOl4w<6mE+MH3h>Iko?qb&4Cfb{|I{@h}Q}pMxg;F(LG!$6f zM=PCMKQq)3LhKo(_yc)D#1}O5OfZF30~!J9YTX~;hrrVY1^!}|G8zQ5vOq!>*kPxB z^*?KF(Rzlk6m@7b=(=CzAbX$b|CZS4miahkBrNa7K#@VD0X2b~hWFhir#&9o3g8Y0 z5$SOi_u*BKl>fpcHheaA?Gtd2rYYcxA3GJdlT*#ib4jThs6U0XT&RADmkD-tllTbB zR~ZZ8I_`_KY3`O0W9{IzWJC_xW!P&Tm7;^VA4t$7^;AEX0!fr1%RzT2BYjAhhYq4? zkh3yr2Af~y`DhxJf-d`RB82eI5BDec`pg@5q3$nb6$>S0hn*gU{m2F>eJoh~R=e1O z?YRoPH$+lYX+8mH@hN9a${0yWc~6TfrLcwbB0DEXP!aW~y$pJgTL@X%zaFDP}RYy4CwxeL2onof%% zT^VXC{XwSZ2&hba#z`9k>u{8CzEyh*sxuR@wZML|k;Vdy@7cL#a(PsMcaZYl5s-y} zvkEs#^V)GKoOnz@D%Mh-XPbP3G zizP}+*q( z<4C4;;b_ElnqZu~@l3m8iHEy4VpE>er||R6D`5ps)24$dHfp@Yw`)ATNr!#$aid#3 zr77Gc#`=;&vl*g5PZGVO(Ga&gje!*VuA7FOr7sF2MRFtnw6!6x*JovZ{dIzdh;Y6zx*vDB4`64 zNDCnIz5>5hzOoBqheeI_n%VQkHP!6KWFT8S4SDT10+ z%3r77lO)&IURFWUm+6O(=d;s}Q5p@A%j^C{SGU26cy~X2$q87UI6joV!!8rZtcb(M zEG=T~-_O=K3DjZpl$gcG8mwYh*HKVls=9%6)5<@?Qg{y*DeL&cd?bx){brvv#T)S3 z9wC>_1d?+$yWwh^rN}joQe%JfFrS%-I3186bLpL3dya|NO7p7%m4?ak@_joe%+7*` z`VniZUo;x3ry_k7na9SNFg$^WMcF0aZ!OuQ1?QCcMQ~UZ?wA{fVg{J~Uuw`)u2KiRCM-Aeljsj&JNV@WWExG9*goBH$nXc@1bI&+RbrYq+gK>+(G$lvNl%P_9aPxp%;)qBXwS}*>^w1+;SoC= z7(F+d^?F$Pf);Vh5K>(I#VY-2F-Fof^`QYDUh42eXST6xKRb2wQV{sGL4ncCKJjwu z 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 o;c0yqBTCfjaJp@i;j~!r7CRDum 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%0DGM6sK_@{12;{FVZ@COOS>G65A;wF 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
    e4>R=`d%?7+tz_+LW*cy)Wd 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 VF?QfDV7(v5%>SntN96mP{}ZRgZax42 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt new file mode 100644 index 0000000..13b745b --- /dev/null +++ b/fastlane/metadata/android/en-US/short_description.txt @@ -0,0 +1 @@ +Cross-Platform file sharing solution via WiFi. \ No newline at end of file diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt new file mode 100644 index 0000000..1ac2fe0 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/full_description.txt @@ -0,0 +1,7 @@ +LocalSend é um app de código aberto para compartilhar arquivos e mensagens entre dispositivos por perto usando a rede WiFi local. +A comunicação entre dispositivos é criptografada inteiramente via HTTPS. +Internet não é necessário. Sem rastreamento*. Sem anúncios. + +Atualmente, este app está disponível no Android, iOS, macOS, Windows e Linux. Você pode encontrar todas as opções de download na página oficial. + +*O sistema operacional pode ainda coletar dados de utilização. \ No newline at end of file diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/1.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/1.png new file mode 100644 index 0000000000000000000000000000000000000000..d889d032f62eaed3e595ca87ecf4a06323ba75b8 GIT binary patch literal 84499 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≈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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/pt-BR/images/phoneScreenshots/3.png b/fastlane/metadata/android/pt-BR/images/phoneScreenshots/3.png new file mode 100644 index 0000000000000000000000000000000000000000..965932a6ccf3a7c6e82095615d58ac5b50da5e63 GIT binary patch literal 66675 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 w*6v58ediD!pB+d&XY^l2r~jYN`tAm;f zdkrPoi|76J9^?EtKld5u$D4s6z@1gDIp;O6IoBP7-zduv;!)v2AP_=1St&ILE{32IM;vtt*f;OzTI$AlX(Rx?x9%+Kj1jMlGC_* z_wMAp${Ym30FjgWN5eg3YuYU(Za5XX=au{Hw)yvtH-R(%B;CyT{Prg`S)FC&d!=!u zcO9+Ar@SFKl!C!Y9}g5t$8V98QE}w?y}MD^{7RM6&u<8>d^=~x3kK`j5uyxv=F~}0 zKg(l`+BuwBO*u3%H?nU$OmRw+0BiXF_VMHRb1)H@a=T|JU%f4iau8|USYp~%>2BQ; zLPjlUYf$p8C7M}b;oJL(a!XvXM)&;%p)l|UrWyWGgTpb?$hi3Uz@~Y7AsXQ?t!@em z3iMuECDzCW0ap+6o)nKh2(Lv?*z}KWDftW>so&q9n|dB^kOfN#*iN0zcvKBoHtVyzyj()8 zP$y{K^*xBr^TTMdVRvX}bab?CnK>a9AFHd);>dQXS!a@nZk?+QLj4BBo)rvPHSMau z$Q3I&4HbTsot<4Z>+7YgtURf%bYUDy&LuKL8<%4}Ax_hO)WYNIfW=$|q1kGV1{6&D z1ztxHIS*@USA3WWk%d5LTFWg5N07#|CnVW5gwz7%+3w#3Y$p06sz3B+ESfykX|vyN zp%@(ZLy6w)$#XOa+vI%=a%PJ`7))YwCJ;|;Cfn;n_G@i9Y#oj1#y4bF&;vRgr%ulShVZY;5QrHx#ecP@d&r&a~^KjhUI5l3l|=2Z!oM>P%VO zim-n~5-4aD2loQWmoR*yIrLmth zLDzm+vU1q0cX7<%ndW`ap0nGwHC{$s|91XQfD*;!ieO`~)}#c(Gv~EFYPJp9&;)+*Q;dL6Rav2jySPoQ6eN`mkTDcA9@{5HGJgx`}1vFqrE@)JbVpl zLJsfBCybo?rR`AYm0jP{I`rWx7TpVr(5m8^a%iK?l!>(UzS=a#o z)ec^#J2v$nF_&mu*v5|f?yZ%s#6f2icv#k&P}kY)v``p-tp8D8@4eOszlKuh?j8Sb=tRrk z6k(@`rST{(K7Q>y=b!n;9v&V_NMcPg4J|DJC?_lH2QRS1y|VPHj~6G~pClMa@ur=6 z#em6G*DKqV1gH7TI$~Q#p#TYOq>)cwF$D4j@=r78GPY5dk&hg^RkkgusNp%kRrg3&!sdebtu2_b%!)tK|m%+jB}?a|Dm z#xS4B3%Dw-zG9=@EGlO-NRMV9Up;pvNNLikA{zvBs#A~fsDYEx;^u99@^beGCJ1ET zp_S4C0Co9;xLNcSAkUQNrmsmYqNaT>wq;5spKrG;wZ|l%gcKJSi?8uBz7G3P`;>+# zH#fJc!G`lmc1{lJVy8}N6_98ZHj`Z6K`^zqtLtS34><%P^Kome1bBkXX0J<`d1W@9DsOi1; zev?zA05p`4+C_R~MU^FAkDBN)KU)ssR$3!yy=FXC`DrmrEKp1D>xlaD8v+qx2Z>^9 zvTE05)X?qAXfGHH#MSd~si6H~q;JJKk+zxHa-M2tQllt{f{BTV9Q+=U&B6~Agtu-= z1`##vw^Aol5UZ}AyeY0f=*ZEM5h4aA73k>hHUt?gs;g43lOe$@_dI$F`!*VohYoKSG;r_1I@PSuR(W)W*;!&*jYK|ul4tWAlS zwtlS`K>!{^;?>dS=aX@DCfHCz7@6ARm&c8xtGbx3BnX(!xqy96QHz;uLn z{GU^)!UveNj2EichY_Q(Z0caKui$-^Hk0IBdd^IdF?NQN#fEhe{~?T^*_vvuD8N42 zRr7;z)dVHEICaznLzN-L;-aX z4`543h@=+e9x<&bme(!+pjznPV(gd!M4v=mrO(9)vH00ru=P+1o`_?e-*11Csdt+9 zrqKp{bTDV9hCs?0W%ToCyqK>w<$oXlmk?-Hde#q2Irm6IL&v@)4F72u^&nEk0ZBJq z=e&~=6-9UVRsq7g;ACf7uheI8rO1xc7`>O`A?muV>^ycN3kTL#<@NsigTvgwex#i3 zVQaXY!sb!%=;+8u1L|W-S*Wq+`<=_vQSV1VUuXk>IPe>hRZ^mS?rh&E-Vo~Lx~n?G zC78RpBWA`d>S{Z#bhTo-Gb zPuTf!9b_~Cm-SN|+^D&!b#)c!@zPXEaZv5Yww`Go)XAv_zOnmO`)y6H(-vNnOS01~ zhsjeE8qLAeE~{c^sy)ole+oT1qlGrOS+}3$z2B_*^94R*@uo)fA*G_!Sf zvzHbW-SwMkrY=T<3CN2n!z!%4^5_=piLREB!(mtYc5*l%$!8+FK@;~M`z493DKZdu~+kTvsl$3 zuN~HZ7tzx_d%1zV>KQGob++}=_LA?ktvSqXYYqPl_S<-QGIQ9ILO!Uv!sR`WZ(NgK zSpOs^vs?uT5eN}CKmYRS>6FW~1yX3}Hoz>JR@8NuZPHLrPgON8d9Z>3ie!LR$*5LI zPQMotuq9nuT^5I~etOPA5ZR>DIqU0o9@a|}R1tE$8-LcF@x@QjORIydd$=e~L-oUn z&CWE#%Yj)sm}66GH?GmM_j7*N#$Op4RHlRO{J_^s^ISn&qt1&WF6O;{Haevu8fe?y4-W5H!$;%v05=*-Q5vmju zxp2dsQSex=7)4?h8ZX;mJ?vZ@&_BK>vGHQ(&7T88ji?0PzfE5->Ym+DpF+4H)0|d$ z!ju=>(Hn%u)r;|Vxc>VX7i`x4qI~79L8YT+N}Cb`NCyz?90l|e!>?^Ta;eBff^IUV ztKSI4)_YjXafnRmm0n?j=r)apwwwD|_^@B0u0wy5k|wk<7<2uHZ3>OzEsvlD&kiL95Qb=FiXHILYbg{$7~NW~4895oY(S%5E08 zy#Vy^U_dY@1?EwH9+_H_`I^&ENRX>Yonr!n{w;&Nny5-9!k%9k`<@(x>i4U-D0Mfl zQxti^TsS6Nh5BIvgb)brkQ;Wnm0Ys}m{ht%{@$&dRkO#Txb$8b=*0Gzr`{{2Bi>e# zWulnv$s&YW1}meO&r0{K{Kvp*Rj|DKcW>P^EGt7DSMcyd%P^TrqdwcB>0|cT%HeP< zmyc^t6v0so5@xquOW55zbv})x*Bm;dcKWlYlFlpE&vx^Z#N5JRFP-@NHyP^9{?|?{ z!Epa=rz^ydf1>B;U3 zV>!I(;uh!W^xk~0n<}Og2cK4DqpSNFVX$38r63#ctSjBYoXfdc*myjh$gOLi`UJu` z2I~MtU{Bi`o1L4DvGctTVTTUz7so?#&uNRfJdf9W7uFt53^e6EXd?3VG)E}Cboi)h z@;kz?E_2xAVu;)J?G4B`9c@ELlh>Y}gY&4X3;Lu(4MiDmz`GpU>M52>M4K?qqIG?d5(|M8=h-INSP) z8KICM@Y)Kicy$vZG?Sg1y}aUV&czOgY1I2*69mr$(0|i4J%iq z73xR`?mVQOcVCLYgZy%M->-l)^qtn0@9c;y7>?3l`y}zhZr7+YfwOv9AM5>Pnut>9 zhX>)$y7H|&wU%zo)o^e`pPGw{QU+sl3h>LhGsp6Z4i+sokng6CM0f;O+h(yd9SLdT zZs+AHTQw~snsukKbS7CslT|PnK(yR#7Ilp%z~-03>R;ppb=Ie8DqS)6^%Y#1fC=>#Dp^EcbzN)B2pJhQ1kHRH z^87qdbQiUo#mf!yWp46FA`=UXvCq1+9aqvR40Xj5WF>T5F4s*wX(HCQmZ_9{jbcbI zraw3vFqe=rElNxH4|{fdEg>~e-AQMH(cv=jNU^m@VnXs^rasnXSwRK1aip$qke(Rj zu+bcolN{hAQ3e}3YCVVxj=1l1T}UsE!mZ*mi`0_35>LC<+AXkq7L5gk z6O+!4&3%vC<=VN5>$frvYt1eAX?Lb7R@-yaMJMJL7U9Aw!=r*sA}wuJ)|+%`ygdDE z@05W$u{RL?sb%RBH;{)y&0jz<d!SP zKchDuVOvmN;=K&Q?BV}}NL$@Xg*-JP_9+5t0NY|-Bqi6}zn_x50Rh+d0r*>ZqN6e?B32UJ#Is8$ z@9OC+_+!EVb1q2yJIe* zYD(y;w#_j|X%iE*&E|Q<`8A6>UJsKW+p3Y!LLh#wHXz}ri(Cx>zd&vq`dqbc+Fpz% zgL(&nNJkHPP0TpaZ~_Vhq`olGYcLa1nfaQa?zF8+kT!xwAj^ev2e!8FHgoaA#YQyc z?X~3Z^G)?0sIGxsNvc+T4qEN0+p(S<2PCsm?0dBfJp;M-?j7v>;VPFK=BU^UHn{TL zVF0PJA3~9Ci$XZQjMLVL5ZT@Wwjp`pd08>lM+JdUg;R?;?!d5cpk+YY$8qc%P(_vI z)8|?*ANowKMG;@FB8$K8uY*jqg-eItv4Mu@O^tCN^9m>GPV0GlKkVZM`-9wCg!Nj@ zNH7XNtiE?$Hq9|8KN3I6$HnSQmB|by0wwH&2~lVZqd{$44cDE-(#f&lT%0z5&CUWH zhfBCN`ma23K)V=QvgljV)(FNIasKU1b{`lMiu9Vb!=7atU&^H5Dsieef*SbipU;<# z7!0Z`M@e|E2xx?CJ8rL)01A5VtziF|x9g+1X9uA@&DU9o z&JK=@bW!d!k0Tz7bO+C=K>fX`g+pY$!2cFiMC(8B6_WV)z5v!7Z^(5XO&bX5=twCZ zzwP018|~2|=9QI2FI$6igfvjHcNypfZ7*Eb<{vjh@n#I<6nfe$nudh?s1jY%e}R!;_>mOAOd+g%jG7n0&6SG(P&UH5NDj8=!&&gh1jbL z#4hlc&-L~9SR#U3CeCG<4iK}w=a&g~phyn(T&4Z|ue5%ns(al0*7ueh84&|J6Wu{okxfd_n_fqF`D-hyj<0b4i{o{}sWPwL9cf|1 zGKEfddDpFLfe4sWyVw)je`C=Gc<1$KxxI;Lv9UuTEA#ee`4(x7SH;GK?yC)X7MowM z$GgvOs{F{erG-KLI5Bv~p>cwpi8KvP{}{HySOsplbo?x5fdaIw(5m zptc&Iw(>e=-AG9Uj|ah0pn^Nuo^7mn-zJkR&{%Vs+9-xu8j0QxCc^)}R960X*#9E% zUj+V(z<&|={|5pR;M{N#E1I42R0JQ=mT;}ezP)XilY`p}A)L$&eSA*;Ty9L%?gXIO z+U0J02q#jmgXeksYMH9fO8QmU?e^7;jm?Lt6n=}Zz#%W>J~W(P&csMr$;L3*P%G4|QqZWKcs zyn2`GBCjMbUr?N{^mh%y^ySstZk%x^2yN5JnNKWr^LJ|ryBeCW(-RhZC{l(6NxU$ z>KJu3d`t*;p{`B*$la902ShT_(VxN59YD?$@e5llE1W0GG|-@rsZ6a~ zI9@%|QFa|kjA1eG{e9HYa3Nxm1^a2c7{4uw6ZMOlV|KFI#mmNKy5n?oWOy`}iDh(X zqyk0WM~5Ai7Z&z_<<%*yUaR82eo>NlzPy4v}6`71UBY<25QoUE+meS9QSoNnGXBp<|a)-WuqW4ayFn))ou z*dg*U&iM%^`J&Nx4BiuyQ>mBM|D-+$pk-qIQ zjejUZOg~kYH+K}H($(4Cvojz}a*y78K}(|^wJ_avbaY0+o*6_8w((LCKA@8gDx}|6 zUbr_uee&^2<#ic|k4~koif3YG25pm~RbvlEer7W_OAl$y`X-z{D?BnkSFT3{Pgz)8 zdb(tlPsjG2Q=a6Gw9Q)~k7YR+@-oR@{lI#+4tT z7sS~mZ#j1Qi$F*O2KJq)HZ@)>_j2jhdUv0P*U5Lz>g>-X5hkmtMN?C~dLBw3K?PvkOE0ZQB2$L(NdDtNRpji1}{9<5GO&hDtM$`Df z4w1HKi*(-uFyyS~s(&}L=t$vY_0n!9*Si}Z?0^K_ew8~kw6v6Ef^!j0C;p-9>tlcz zM_2E5N@5f#fxrmMy+XB{pMLdBXV2Ta&tf)&BB=@PAgrzM4;?cmEg0@Unrb|q!!&eq zASz?GE+;Aycnl6sYkE;S>gxLX+Vt3W1b#T66+yx&R-~SuHr*CU>Dv*UdFO;JoZ(sgOoHGI9R3Y>JeBGH-@X)eP777Yh0lbti@w}X}29JBg$CS}r`kYFIWzoxfZ z8l zPMr1UhSN8gU*+&q3lvTN^jI%-Tflx-fPmHR4;C@F{rUbNGmt1r$W>}~fzI#+?}UxR zfWh*NkBa!IqtFAdhrr{bQ|qj)HW#3@wtvCC?i`Jyta}0H6p#P3>_^y%m%X=qi36co z1tUIBh)Np~W;FdX_Q1GqBLY;N`BjZN z3-kLUkO)9DUYzbcw;2c)G;rx>JWPW*|HcnKSA)=KUymA_l;k*YuSxllz+UV_8N!{} zx;%zPoMD!5aHPnq5Wh2Jn3M;Jl6|jY=`oDj$lH1|C1NOI;kr)qcW0mmwo8XS8mCkd zJ3S~2N-vnI<5Bg1MBvhH%_{g2J?7_U27x>F3-z!yta@q666b=PMMQP8+iO0~7_)D; zDQKgl;rI5LP!=p5dw!}Pig!p72d`;0yMo)hk4UO?`@T17@0ku(zGeT>%9y$n;_Mu5 zt*lHZc#te;;Im$1k>YXQoblOpf4_Fv_c%9b#;^>9fsayxrDF1Y8meWBdt>=~pjjBXlFnTmf4KOxPndzm7|`Oi<= z+aCFBv|fSRF})3ZtBDi}oewXiq5|LK)mH9wwLb*C9+KoG2^Ip{Gqgg_=4{<)#B}zg z+qRrDjh|`ItJ^<{qGO^ROUurWclIlI3{JwSi|P2i-~3~wycp3$I|1^TAodI@kg)Y( zic#p(lPC!goF$AwC+zHsAEPBHMSk?grHcbcM~R-s+Dw|fc=R6|z4`gE6fyPt7hLeX0RobV2R8mEJyY?Q( zd7awKR5JEEKtw7}E=I*9M1fBUfOf4lvU)D5lUvB==Jv#`*L zhgv^?ab9WCm4LFZ%B?p;%0f76C^i-_6KE8ty*&8>$GI3875q3+E7lK(h_DCXNmw84 z=pKb{B5OA?%5s!NN*H)p`W-Uz;g65DI+56QJC&#Qxkw!8C!Y>N3R1SXK`yWg;?PV| zP?BqJ-%*>&oXj)v4z1ol z6J?7Idp2C$t~^g_mGmd(O$kr6N5kmE^ML4SEvlL*J1SQWK-c(qy6lcO{LEuOJ|>+p z)aqAW>A&H8w{4;k33(o!5*tfOpq&14UlcerFN+Gz5K>4OJ(jpOoCkkg{(ij_>-}~| zf7iQ@2oVeJpm4)t#LUPTgNXiaC#9}&$}ov>6@di%!2e?Pz1zK@Cit5VyBMowykAkE z<>y@ruzJ`QQIF}sN7n8Y0=&$#sy6dwiUf88v|;GB#)dLaLm?Vv=XihofIlGhW#wjv zQwgvZspm?y39C`ATQ=P}7InE?>k114B&xYRoxUaoq4fjG$9`Z?Wcj^?p)V#Eh0aC* zl@XObS#hNzVij+BM>L*(J_Ly(?;t031GR~L(k75xg{oD zx_4fb!_uv}8|MNM+%)2O#^$d*GagDCOG@TB?xJK?8uyZ+(1Y_3H(*8Quk6{XHa3Qm ztbE|CZ)&TMsEWf`-qBInH38Kk=1EEhI^5grTnL1ntTU^hs|@^RpW13y7>|J`CPCb3 z-*QpL!ficeO{ia6+t^sOVzwbVv5VV`@-^ul=APtrpv6-qptEj3aTRPsH z&TN|Al9!k7*iLf!)Az|k*wET~^K=I}V;3d%3%cz86d8fI%{$spG}@fuJ3hwEkHBze|Z&5H0;Um;$pU}c^h35;2{i>%|qJN zJm%Z}z$c*=8(ARez#8d(`un_^iS&m{sfdMMhluhHY2lhg90mRsi{_^73K<#Ks%d8bQD^pyAZ2w6y^r_nl`zsU>?d?Q4{&4rv&D|MO=h0WH~IZwB80cMKZnu>{y zb>1Rl>6U&HRT|QvJ!7C-VFzoEm^PImpd3S9S2!6?v=u<{c)9R!0%5r`fF4gUnyqRS z=?{jGw9}H!RSWnY?Um)Ec=zk7;~hAXq-Mvt?r>k(FOKkU3Zk&{GNP_=05TtN-05%; z7E!L84=Rk*mkwQhpRRx)>S^zhcg`5O8^jn1ZCFzw7OU{QYL&9MA^Ru*&;C+gS^gZE z?gN{;C;4JvK%~!GS^)-%f8W+-}1Fk$z zQ#=o<wW&gEb{ETNc2zx%9pPTZ13PWdaq@`K|G+&4&BHbIa zT*M4An>LXB_G76rBb!>^1U)X-`kQcx*CsbXIuUIqjQ6=fBsA8o^xx*GKVO;5UQVmH zNy8)3wHpI@mj$vsO@tzqV5y;4Kqg2kmmGGO6HFUjO5I*f!t7Y3&*;q6aFpyXyjTGs z`p>V3p`M4Sr-HWQm=RI>t!d-bnCa})1P%~}7e^a2WqCgftY*)Z^d;f;84qtX`-`$e zK-pz~vL1t3=cS0G6BlA*i-JAJ^m4_zjn*HmbO2wnVH;2U^{lNvHg;)7EcBq(Jl%01 z&nYME#mBd^QY`1UuJ3W_MY&^5@wJMK64p2&&sQVxzybE%t+56cQamLpw^y&|vek@d z-_*G6ZgR{tVE1psJVEo=*wbfPM!zsUqQYKC%}7cGF5j0s~Fa`$7;<8-Ypk5OzAia|f0YwacsIr>ycJqn>eZST&4l z-1Y~mFz083#L(l*PP;-*WL|;Yho7DHFNa5lx2KI8Ob#nq(!JJ)1!sFUqJ@8`Afe&nS2X6@;>gj#O!FY*Gu@a(T=T3&Kw7 zF6g~H_d8BU;x#o|oTZ46DEK_K%q@N1!Em)<&0<%q;hkUN?;oc#)c9j{Qfe9RT?E@p zO=)w_gqE3D1O+`JBAs?zqF1Mym1!={bSjwyH4#zKI?Xe3_oa3lh|HgTpRw4zxN*uZ zKu8Yp>TV^#G!pxAhMetce-rxdHlnwS7sMFD>(nOR;Cvzt{L=M&pm*kMuSuPv z^{K_>Cx%_(&%@u#xKe~*+iUrud`j90WO#->sUJcHtTb|B-@_P$_yj2Nf&z-~Li}Jt zio}qgxALXbz9pm4jJQPG<9`-q^WF%(6nXB{P_)^MwjR~5%iwGkY`I|?f+0>5J!om8 zH%d;}_I5r$P%(lbGb!3OZ!q+~mA(ymdrvjqrB)1wadEYH=HML1@~OXkzK+rl=zZtf zm%DV((`gv&c&KGF^Wk7M5wp=5&hO-Hu{LF6f;&y{3<0nyhgWEQ{v}a3Oajcy=*~OI(%TWeTkI^{WVmQ1`0&r_^ z4EM0o_XcE&URqTzoSiD%wir2qDly8`%1I>PHw&;us${>BWm=GU#*`q}Al@jS|GjLS z49}zY*Wb^b)8nFid;;SW<97P?cdv+VynOqp^`l~Yr~G82>0sK*>zK#7YavoGWlpnK zzY%S{hGez(A&@k<>J5laoXYyK^^@=6Z25ujH!nXcBX;QN66Bi=uNYAh zzur}ZwuJT4->)^Aqm)*auF>rdA3ly_4(DHPU1EZ>CnlC%?X5Nndv4q`hux4^_y^n* z`IDVM$>~XinQ)CF)!o1>5;<0y97{ZzHzWQ@2N^+b0(R4HVk`w(e0j%~x~3vw$1})T zDBa@fO-S>d9&q?uh}U)nbK`xTp&BJyF7y{4yzyS>uk&=e~hVm*_s-JVg4FZ$Xxj7Dm_i=BdTO)&-zbq zzvZwtDAz5Nw;ZZq-rB#LIB4|UPu89haYbZ~hKJJLcie2h-cL5 zRvjU9due^rG;L^{-!U-N0so#RK=I`M+mJA6aQo_S+{ctHqu^zEz`b4xD$4 zaDI9E1OJBj3FS*Yi3{+HZgBsZ`vd)^Y8k)Bv4JUz3nix}KaOiFdC zZ4jtqe1v!V^J6$Z?sdo4&&71Vm8?jQIYEw}eR)AR-fWxj`om8DkB3g@qonxGtXJ9q zBS=Z$_D{&qoMBB;XgNYykk@A79e$ww&qol*+Xe~XK-Q$vs(3Y9ldzNHUa|7d?>b<`o1O}bONJ}~n ze4_qnB+NK{GV(yaJ$mVyiUS~#$aru$XniWxvI0Lg6gDZiv3QUlLP&smMvh$dzQgm zbHD;sKBm)$Ds1{6KD8yVm@3g2M&g$RX``?o9+id+j#0^)UNw zcmepkgv198h{W5ck_YMD%j+Oj1Q=8n^2B~^sY_0FrXrM9{bF@(d-xA9%;V<-WhIph zH8Q8jIcv5M`GErZnHuyA;~#JV1KssRk8LL3T%1XY#>A9!TsUUGn$c0u8RTAkj}Mtj zc*T7&uu8|x)pgBSI-}2y@gZN1+-A@9BsKG;N)MPHL@aX8eoRj`o-1MZJ1!LBxlmA{ zxjd(!Q{iWt-C8@w{rpP%7G#qYAbdaYx$rugg;>n>ZJT3c&eT7g=C$WRxH2p{cbT}F6ujydG@h!-H_HDOD)j^`&dEvgALYQl>>IyC0?5GhzglZURwHQg z*m(4OVs*O0RP^;kFMK}z+8Bh46txj;xv%3#QmmK{H1faZkwb9z^sdv=RE%xi9JvG8 ze5eKRhD2`9mgJ+Nk>xoPjs&cCbe;p)5jFb(xkO~kX3vjy>z}`Ul#^4x22V|PFnIuJ zrUSeFTH#-pL|xDs?{e>|p?fmba~f|o@P>q>=6V(C{G+Yb`Lu7-4p%sOJkjmw83d9w zFO3U%Ctsvif7H@zmYaLqmfZcP^ab% zhIruZ5?fh`1UxTYs_R)JP0n62Py|brUl#TL+L+%4pBrM`;81~<=I>xGp5Z&bIJKKC zKVJv8BM=jf3gbv@X^^f$OWmkO1d=N?*nD)KoeReicnDUZ^na;<c)Qu1kBg#g?EAJ=_ksVp~+a)T)6#v_m3f` zW5;3eb=FR*BRREvq3-whgQbKi&6D7VF9uuQIarz$PtSLC%DZ{g2h`|}paV1{O9!{( zZc2wJvM^F~ESl!Y%HK5aQ7OKR*93|^KTS*AFA6q5{lEz~wtaRZBo9`(MTP=uRbjdG`_-WY1DmKGulIN3hf7ShoqH+M@z?&APr zU?3M5(cH4KHMsnk=9Xx#e){WK@Y0uDHTGtLn7FipQOgtC=^twB>>-C5^3owjZKYGY z^s;aMnmvj7us?JxRyoP#@miYG9DKS%q%+_3_vozF4c8l4PKNPzf z)u1mNQ6_4DJ&sIk^h7M0d-Yy^wtoBGd*9}{v?@*8JvEch{gy+T%(s<>%{s4M1?C_W z@abV6R)MrBbV-u}c1*w4MDOL8qr+Xu>Z%RP^xO;vjv}8~JB43I-Ml+st$s%`D zJI*{wX`FIpDU06?OCYU^#a5OiafS2qI#t%7Z^IbQ_7giEub7ETr{ATad%;;`%aIZl6{BiyXH|!{k~RT@+gBe`jzY*N z-a|2aJ#3*aJ?5*~&mexH*I81HssP++*%>VU$J|X(QU9sM%2#o-?HJi+Vakdi`< zyiR$Q?)GQ+hN@evWFSeVMW>V_YDy5Wv*D`9hKqJxc&J|8qa*?97$r72M5J2BvdoE1 z~$X8Lzr%m_(fdLK4BR1Lwe^B`7^@fLNJZbM#o}JJ*Y~y)( z)x~%Lgea8yxURU5l$j)0k?q`PQb4@cPPEN&yTShzMFn}g*+4g;=A_`rest?IMIn-! zsR434Q_Y8vvmhY3zPcaG?M&+@eMMQi){0RS&tirz+S6J(zoQq%6!xdsHi_uqC_Vp#$;!Wwwy}{ z-Ej+|^M#ik@~aV`sUS%Cm2UCG-3NFGg>8A1S2I=l*cl*ZY(KurvUv{kCf~jzt^C$= zzSOMYytodaIM04hchjfT+n*081$A;c8{RA%+oGxnX_E-d>BMug=8*RcYIP604Y_}< zgJ#zGHh@5QmaO(wd>K$oz-CouKWl$(AwM7%APeb4fBLtnG(Sw%>3VPReNa7IB)pah zx(dSdB<<6&_pyv;LI1}kbZ?FU_hd~CW-OONOdKlUcLNf+r%D6a+d7P-9jk;Zvn51% zeHmTF?jvU!?2BAdX`ow4tkC~`FTmRmdI(k8nX+TMM)X4Q%4^dX#Ei)!WJx(nflCu1 z?<5_gq4$q){ppZ)KB!EA>@`6_jr~bPAE}u@&MnFL9u)kq$i)^=%GYw$n<3$zWNQsY?{BNb{F5+~ct9 zyhGD-EM5W{3ZFrkxF1eM;Y4mt%X6oj)xb;I8?l&9ahTtf`pC_g#~#+|-Nx8`{BFWw z_5g!5N0J!5Y)-B&B?bNo+MfA+Hn8#ssjm(7zNs6<$~<{F{OyHBg&T3$ToxW=?`Al7 zT7hAkH%w3;hWKe;CoX#IA`^(nqgeh8mf>p&5BWuC|yM>$uI!bC_h_UP4?jBLC!W> zF_%wo#36hjs?zcRj@YO*3LmeYM0 zUA{qBLAIXXIv>3Lr5^Q+B)lVQfGd1h{sqo5YY0hjHGDt6JyDnh4f*K{QjFj5d22!% z=il~kvdv!(kd>~etNz4xN_@EY4YE};>~s~X*2lEL;3-)xIS^8&rEJnr>k6P#gWW7u zSZUb0I@!D0nPSsZvOv#DaKh`)yi}SZs28qvl_pzHC#KifCvZ(;0e0TsYv*<>^W>fj zufI;$*3{JAaWAy8BA?u_gNi9mKIEXZD<}4Mf3Wc6=f35=uEpd0xQ>m|CyrG|tV^Yp zJD+qnU&6g1I>grnbOESB+BVrkveoXvFF~6Q>T@WW%K=vwP$$()Nxw>MbkEPol2Duz z!Jkt|V#}^A{JXuc+|$FXgV;JoBRWI=(sHS@zCXn8Ihpx=>jHH{g0ue>s5%_FJ}QoD zXyu!%4JZz<7$l!; zv*7mlO86jN!3@{+qZ*t20Ukt)D1GV1uMRN>`_tBQ`64}O*2W^QIq?4v=shES8cXj* z&_ufO9&-glzgE(HptP8oaRw+akBuWKt)i!EJfr`XFp|VT6rB1@3DWdo&}Ykib{*<}W-;4FJ?1zUYLPsDqRKTcTlgu#48ls}b$PvOx!3c^Z=s zwLlLAd>r$j1K01%b%xgZpzdR4q;*Gf>uU=r zO#0O+?gg~bH9ey=A55>`bM`R{?yLAE|IxA#U1#UxavJ~I5ohNeGSlrR%ss`x*TVtz zTv~;j{y*(8oqNGj2C)gL>8Z*)50EIIFa!53n>;pb8PvU)l}Ca7cTKFjrmosv*SwE; zG~(-X0RiEQ%~O?cb@04rf@L*uy~k}Cc#y(dCv=cs@*3pVm7u=dKSc0LPD9=JGrZ;m~RV%DviXgQjOF` zR$0XNguRB)9P;hgb-RzlL?Bxup8Q)UY`G|N>5nNVRCFUbsWz*?*J`8 zOw_)6W8b&M>f5>cxvB}|E78?sK{=KI1|uW>`WrXij_=*0hj2#fbn$5=#4W{$r2Z+L z@@nfP!HZ-LG{JK!!z=~l@^(E1y=F`ard(!9#$M72zh*2g1dT0CnYLk;`H!69nbT< z8N=kwfa05f*?T(0>n#v3F}r-_q6UJKwbMpwu%iL>@ETpqFMn<@sQ$YkOWVAsZtkFo zPM*+4y<64KL3V(AdG!|v6_n zz4^6|**fo|!-}4@@{J%j{!PA(>K#qiklKNP2Lul+H68_y*VH`bm?j;aeFFLV928G` zKS&*QwQBQ=Grqs^)$je)H%1EI`|be>43M?}KJP-{>o(NZ*duV)6G7I**`qn3Vwn5o z)#B=3LyV59;$FNCMD`^BdhVb0tbv0C?^pC+0TqUasq}V@%YJF=f`f4ooz7GheE|}M zY|95gfC-Ff;TirdsBS=IrW-kW)HD6j#PiTKDOP*T@_-0(?;em5FY{#i4%TLDzWkAC z&7Jf-2Q(3AlzX)j+H20#+(Py9X8xTkCz+F&y1V>$gd&oYjn^n?9zReXJc`eus*wLQ zZ4BA-yN(%u&-c5ofhMv{q6TR|>O{;uCYdiWdBFt3l;EJp*WW#lvU^bIL(l{~w*hdz z`VojhUEyROIKu9G^A1l)27%}FOcC{mF3e3oTz?9Di2ED;WUISAq#MU*WQA*#Y(!$n z!X@KH6~5u^yLK0?=YOUY;Ru}?*;p~RB7Rb$n7i6+WWY<=xBeXfP#~SGizQs`ae^Fk zJ&TO)h`C!zt$XU}(swqV4$+^c>PA|%eF1)ZrGx5?M>YQYUdn7#;SpgfhPIZGrJTW+ zd@+yZavw(#K!S0vQThf%q;g=Q)C=G;Fwp@gvWI(H>2a%-{z^yo5An@7kh8{S5+5wjV?t2 z1p!G#LXqxLIz?%a4(XEaZb8sZcXv0^4N6FNcXxNgncMq$pY#3!=i}kGKj~h3&Aeia zam@+hC%%PN{==#fBtlSO8ITH=o23VeiB$W-e>4%iErMJVMIsgRMMY8 zBmdFu<8b8QZ`s6?(UG6@gb7-?GSw>GgzW?Nco_Zj88d-hz9NI%+z=AA^K^%DfmlLxSKpl7%VN*!bs#Y3ji#%VJ zZFSLG5nC8lHgoN8$OQ39F*TB#D$2$et&fv>25f6PKP$#`yMUQ_0iPM-A7`e4Lh1GG zLDIc*TN{Kglh=4S-Y0o%g$$7K6Lc`Xaxl*e9zN6r>1#R`3uzbt!~bHt-Jp>nc}~FD zkaL-sc&f;QruZ8WYqBV*ItB*@qLv+QwzvS}u;eLEGC4X^T~aByA*iThZP2GvCQNeU zA(g5~MI-){@fro%dj{6&j5t`W z$TtRjXupu+|Fd^N>0vjfvDom3QQ)f-PxJL>1=Zg!JKMwwJ3E9+Jn!EFM~p}0A+kaJ zI?2>L=lw?b_adFi=EaVMjf}|OIHv^dWE7hjFK!+~=WrTzFSCG=fhDk?D}#{!ykt0f zj>~VY1saSE= zy@YfS7%(792AsA_UXPIW-zekL?pJ?*eAD{b-lMEzcx8jW-;9Iti&j*%7c6+dYFatC zCZulqvzdoe#_QMA7o1RvuaK)iBB=0nRun*WrI$!9n!iTYON^{hJ9#$D#%s9$a)InK zM)1yb*0?caf0zYEu1zsy?;tSxQQLQ6pm5?-W(F)3E;(rq}|XYgG7LE3rzh z8e|?vj?J+gSQOWfj`H;=rM$LhV>7nwd`p`wNMB4%Cr`ZsmW*klTZ_9!v;v+Lfs#sC zuzCb!3Gi3YpjLQ(*?2`z*J5`y)VqIoZNfI~f-H&Q7nl`ygxx?dwciS9%S7Zfmda-a zG)-#SyuXfU>vEy}D8rn~+G4uG1FQ-ne7^E)yTY7)*qm~J$ZUt$& zY%G#s&glP|+95-XpKnSG%)|BHzzf zKC`RIhIk*JK$dKWY}C&ooew>Xouajo>V&Z9>ojBJ2tpuvE_lfMbFk5!P@N$R_7>RiXfb@`hl|qYx3oL;&QAmJwKK-}pna_W2|um#alcw@$Cu zO;M`quIDc|PBvBohF3*12nhju(4K_|T3t=?oCR2^IZkIWY~0$2)fWWuJA?#u&%K`usSUS2Z*>mIrjte&sx#Q@eAS^aS>^wJ1W5$|6-?al}TmL8TPG&OI> z25_wE*GNi+2n>3%Mk?A#LauMHgR*xuZ$Ib)@Q}W*d+nS$MlUfcjS?ml5DsFcYs(lS zXixX>+4tGSr@qa1pt|CzzfhVMWl!mh^M^Nx8CyOdbcbnR2?(pGuELd8n{SCjLP;+2s?An-vD{t8A2z}oZ^P#!)!c@gP6`zH4se= zudXp+{kI!EuP171v=dFOy(fN_?nGr7gAfJwID30mx({xNaYTmYDY5%{CDv&$Aj~IV z`+BnRm~x@~ zie8Kl{Ugk0?N%VWIka0}{AE+h8>Y);hJQF}3M7n;4!@oPPKXN=g)+se`^f_`MIO*e#U|bp76Nh?4x7 zt^Qp`*}eAltI%Z5fKS2a2z_CSuXEha#(-3blu@nlTV{`yZx+{vLPTDqg4Ze6S(gnt zu(27$NP;a3^UccPr?lNPsGD8Htc{9%6`#Q2w&^QG+t^NmjNpN=UEzH-@VPOV^ zK=AbM7pq?yZbA_NOyG};77tUeScAc*oAx?R4DL^8w6(FeH`jk63v1myC8sdDq(g-; zA+YbEJ>&VxKp=Gy`#94S|NY(1)#|xFgGG1Rps#fKvsPP6fscRGfi$=Hi+$4{s{|2J z=ktq6EsPI-4;CE$$&rj$B{T8EmiMkKf8rTu3Kq(WkUg<}4-_No0NrW2j*iv@N)hET zJX!2jKyfbFgQ~0$Z>%(6bBB#sof8qesrbPjr0eQUTiPd&tSg-&wD36DYAP-;XQ3)C96zN4^f&mkl zmSfbt+V3tyAMV@o+%JnH)Un|L6Z+X4h4^2GxYUT?&wLuTb+`8&P-sOvuX{E7@DEsm zgPG9pSvVV`{7_O3pnU*LNJaT36cv_X=hDC$_)Q7)03M6|dK9$^aw#5-WROddlyS{+ zyfmVX|B1Bq08)g9S-&w2DD#aY7be#G&~#hf?D1fk)u-8LcNezM-8NGWFh%nsF1%VJ}b| z{&y5gVh*ppQCmO*NlPu+(}r_yzNHNK{O=nV4zKJ~?HIpXN$`g#_bBh86~Jc=o>l(F z1bQ%+eoqNM6nf8;&+IzyNp-oIpxbj7kOBZ9X!8Rt`tQ}>^f?Mu-|bt12S`f~b0=qdSpT=tw34(2aQTw^dI;jj z!t`MGAMM$ei*GS9hx0&g{JrQQq!rk_V-G1egFKCuT3^vQZyb;Di~OF^tK zDwb*XM_Us~{F!X7-k(h=mY3gw!5wQYf80$4OzOY%OI}^^q+*>YznB(in*VL3pKU!} z!@Z>iLL}znGef$CNCp8?4(LC-e^QE5kdmlu*S8r5 zE5x?eG|Y*x)>apg+R}x1zKGjNSF8*rYwsCQTPi`kMva0DBWuE}hR6gdVdgRFkP><%B zp1h&Rgx-N|R-CrS`X8NGaO3Ijq7_?Fj|YMzsWUA>EJF)z2HpfHN6vjsi<2f1?r z!O2)3FAxJQeJ3qk>ju)K`TGNpof-LlUF{M!lf)|J^%4#wk%KFQ_jPg`z(S7E!v{NC zi&8=+!e;cVD~e575@$Ud15IM;@@b}TYAm3+FA9mr3M|=~EgX7!Ccz*? zhvDVnGUi;{NDk&)pm+AWCa^#V$qY>-+na43NUx8$7?D8>i4y}Vz zqtY_0!8B1oD+f1Nv;rj0=lAxae>x>4s;bCZYPDxoPk&lHas(2S!%9rYKcxx1doSYS zp4WybYZ=C+<+Rz!$I62&Lr=DI3HNh=0ix%1bN3^N7Rd1}3BEe8OZw^&=|(=i9Lt&l zs#HMS9lQ`%Wyjnkdhz7DmspM3hU)7*4z<0zMXPL+3cS1`ed9-_=UEb_w^C|N3Ky3k{jh&N`wE7(YtE~Msj?xEA$nCcj z3F^R4>HftO2|slWr`FMd;0TC9g!e;Qb~j=9()7@4131JtBp7-yFrfzoJr<@B`atOs z?Cu;oubieFwY@<|K$I-@ZbOvS;#ZMc?d1FS?|`#$)q!)(VC(^N;$Y@f0z}tT*g8xf zWI&ZF$ahFWe`fKyGzq|jNHPWKF=0TK2{RI(*?s)jGX@^zh{wm3$YQsZ5;T>;Uc>>3 zAYD)A4k7+BQ&hQO1dq+7fv(+4d>rLW8zl=-G98bb0?N5~fn<3lm3oisEcM=J*0H84 zy0^+v;oW+PZXZ^<5In1W;kglc=+AyNqc>LKy5ntBDdAOL9bkxtbK!r@}m-n4Qmk8g2 z`!x=c9)j(9Xl(ATZE35cr=to`As_9So1FlFXkRGJUs%i8P5RYggKE_Z5MeR2jw9hh z7~;UcY6-g80DbL$=K>hXM5$ZWiq_|*QBsR$tJI6X2?89y9A2?>uPO%`Ufyr90Li{` zJ9K3AHseT~wYyce#*)URJIGj3)H}Llut$~E&y)ZU!}BH1F&4=&y^t%6@&h>2@DbcF zD(QTh8Re^I*NxD8>QkSW5pu3PbaSUAy#LzX{kK(TZ8um7MZN7QAfJGa!^!YG zinP$TeF7F+v-eG#2;sqhrp*Ne4V90PV7khZK!XzKS3)pC})BSkl@YHc=$(aet;dO=a;sXC)SGkfh2*lxPN|( zg^?HR**6$$8gAEbQ^l22y%Kr=T}mzf^db!h(KKAB$^J;yMI?!*P_~x#EZimos z{5%B%fj;;=+rkyV1vC*!#uJ~vBt=I`k+>R~4sExzMLvqhnKRSUlS%}?e(C}oYLeYbf()P_ST*)3~IOeoLttgTy4+MRgk84Pq zU;5Te&V7Ir4gdXy7Nzasr&p;5z{JM|b&sb}cF!4ZyYD6j1E&ah->K3CTlJ>d*`Yx& z;WQBjV!6e%sYZ7UpFtWqi}2R1MaVY^0S>RTAwd|R?qTd~P5|?RAE-tAhto-ta3J1% zTlgX@U14_)5WxaEZ(TX!wq1D|zcldgAaMMC#Guwh_di?#+?1ndG<^LnU?5!s>~lhN zZ|i!Rp9m?yA}Q$A@M@nbe*kqgWlE|`4h~rDR@YS)B&Du@ICu6Vt&gOiZ=66U?b!Zz4tPO^q>FtZw{R z**QV+5M63M1lZ;!H8lq+AbXW_BTIGDr0rI(w~B{zIT`HkUw}NnwR9&t+I#{xfuQ{m zTzSC)ru;89&weM9u0yr^P4~HZ`T0W8l^qQz%94<{Kbl>(sbmMz9TnM-dAr zDrYU>cp{|#r$OJB*{j+e4zJ9jdiqX}($sWIlhS?$d@4$mJBp@ty`SGdY4uV+*irG2tD+Y>*l5iV< zFe|afdKmBZ5uH~>&*m9Ou6S^(-oo&J+T~JZGuDV)@DiMR{0D=c5YTvVlN^;=W)U;s z=cnAmZLcLPDj=oCkk>Pb+jxHTYQ4A;GcM+l$yjVR-JuKm?boN)%*I{*PkewtOR`TH z)R+OC$p28DRs?JuEDmedD5<(HWMLTqqi=l~6SK(Pw`lDFPTy_W#I42snFuKKaXxmd zd=`!URLu+-DwbhclP-Vc)i3LWEz5FnlKBn1clwqt^#DA2fs8p>5BR}tYH=Ip9zcR^ z-kgq&&vC3-KCdCh8pE#|KR?>uKSvEJH6=KoAPMcz6PcTx;isJ0v$Q)!m;Pe<{pkPv z;Lp;6e&U!oGV4^ZuJfp9Obe(eu!&fRitoQ#5V`GNs0b1g77!8@@9#uLB{w*Y2(RrZ z_5cK>P_-hzCiFA!M_5t0EyhzMPoaNf_Ek^E**R#WJq>6XOY&Gh7Qc-kX8H4ZV2(7|c5I`)biu_=pH6o>k2PWLS9t+KOUP_gt zN|9OF_#Lb5h~3tJ!}hrJxHSE&xf(0(05&X2`zORsZ3 z0Yco69C6tx;N{Hd z$j(gD-A*r%0JT;x9e3OjqDpSj3EUrC^qwV&kUnpe0g=dsBLWoFyLq&tpRI(wKKy8I zvLgetjA_+g={}*CXrIfNWN@S7qMQ$dmaaplLtii&q29`=zUlI!M|%DS+%SToj)G1p zc5-WR&ru_d1k`Uv;w}t(cn>{Sn?bTq`{nfuz{DF-y#K~F8d9HG@+ks?=DB(CJ`g!1 z*G*B|zWE(b+1+^EISIN4PkqLlgF)a_Fr4$m=gV#oAg`yryy2tB2p>hvDo*EYIz_>3 zhE|=d+5*N0K_d*MlZkvcms}REj+n`m6p-fYfuXtMhGpCq$1TR1gP^28K*Kev5r?UIgrD)7=l^vuDBW*PFTXXVMv7o$$^-<*AJSOmm+fnMoUM)Q zsObb;s@gjCkEPYq3N8*B+Un_SZ52uhUjC1i=IN#PpQtmU=yq{RO{(bq$)OBcYUEXv zw69t#kySxw=)uA&iW{m60v|~RK@<0Hy1U!^HL+@O;eu{3BSQ2ZW5)X%ge2#f51=RL zUz#8-ALXdBKCUx!6S1*P%7<9BhH+BwHVW;9Ng4`+KTVc&#x|yw?4a5h#EEWLFMLa= z89F-JCRVf9mdYU1d|G2Ve-GePe4gn zhwU}pWHabz;6GV)sc*!>D{^yPWB#XgJ3s(nGjK)#V946Cw*FzY$~?Ie;Ip9}GXZD~ z?{q9+G*ygp0cHNY5t)G$%fWQ}`m;_MHaV)Nm2JjpF$=IxHuxP!;R)QzAQ zY6}Djz|&m?D;GD8*fk)s6TGDM;qI~q`epOt;DNW_OBbv`1e+7_w2bN_x#V|&9$4$* zQTaJ4Kq=0)z;^r|D|8bJ(m@N?O&Eyb1OeB&0E%%f2(KgHf<-JLdlTsQ)#B-;bV6Na zZc!;?^vF)iRae+j{f?1;;OEBA&5I%?O38dLGK{uBQIZcml6yOd3*0QX1n)blf%FJS zMU^74O^b?2&XIuvYwply<>-M{;%~4?3&ue4#F}s3O#v#V@D>OzWZxvm#MaG@5{ssk z{7Nq2N+?Xc)kx+WjS0&DdQ-HYw2Id-l<~XWNH&TrI>B*4AqCMt(Mjwg<{UtOt8TV? z^C#aTyc@~W4la)^z-?iq_HhMT38osGMFNMLnNclDA!j+ zbf-vP<@4QGYn$VyrsDbEt*&Z1oS=omXYnzZ#e=t)ft+f4Y4rs=s4S^BY`ok!K|&(m ziv>VURw&FUF6$K3LV*I1ghzT6TtUfoSLr~n++d2 z_=LJ%TcxjZ;igJy&UM)v>$YWC=6z_D3&1U4LJ8qUck4~Ja+n^Bd|3LE9v-{9aA_Q{ zD%;OMj58l#|?mMQ)snTiybrOELetGK`4t{RrX zTR@@C%ea0n1=%p$MG=yI@BhG(9-}hoZyGV75UBJkz#q z21fwLG38DbGJzaEPnNoahXhWCUnd6lg}6L|3gB6#r!+x3&@y(jm&odB;f!g6IkTHYi3yi~Xe@wo3$HdoS@(s( zv~R8N7IT_(iSll7lSlLB8HO7$2p=x^(Vz=FG+`Psl%BuXaZQq9w=KF=oYw?Jr*{UF z7^tVHK}n6a!;9AI23dowWRYTyH@p;KT9g1yy=`xDJ+G(=1_h(Y>OoMYMS%+_rvv1H zbuf_WSvcOf@VUA11fU^#zJSx9H#XJWax6C2m1ZHLm$A&)`YQ3Whd^<%LPqxh04zWX zRTZ3g=6L&<<0WUI>W1G~hzKdDp;zT}(RAA0D4yeU2ju&7{KfE(XrPrNo*Gh?w4E5A z7};?F3&hoCwovf_KPr3`-&ql?Th`bx5BVM2IC5M{%8hUlCj%K(K*6{!wYXoYsmuO? z$-b+eL$x*Y@XtARB0Tn>bjrNU^mC-*##5luWSHNH(TpC(!v$l`UG5?-AVofyt!A|8 zc)F{*U5WDuO8Zsw68d>?^)Q=WW4_5PUG~lT+unU!mk+52Tj`iX4D+`u(fjU46W<8? z`J8e}GhTO<-bgY3L|K+A!(xd#9#;jKAP*-87Fuz1oxpw;_(HN}G!Qu0E;UyG7qTG- zY0biODIrUO@u|`KJD80y+Ro=LrRjWSQxx27*JjP0DzSY+zH{I@T&m0+w+52B!dxrF zI>n=_qe^J;f`kgrd;qKl2DEW(sx|n`#qRc(M=9ivS%gE~a(b`5jc-B^xLPjQdk{?B_(q{b1*x zECrfW)d5*S!7+-UQn{~4>k@Ss8@HcO8mL$*Q?lso(dKvziNMX_qi2CqNex4#SD#i} zFZ0o&mF78g3|-y*QpL3NBAzOLWul%TegLO)01gQ-{!$v%dxuwy z7F%ejl3%~ZY5`^OqMA0_Fx% zzE1j2z825Ll`0Qr7EIiD9iL>zgJOQLPdzRc`_D~{oE^svGS$qPH-;sERG|*NuH_w* zS!_(n3?PAtlJ|CAJ$>ZO?qh8MU@TD3Q6vtO8`AE#cOyNujh;A=4g{<}#`qkI<*8!3 z->XPDydsYATb|(jb@WF-NI>a#b$Z?IaeH?Nfb6B41nh>&l3G(ax5$=FP!YpQcheSn z2edq!gPlgv?GE|r4wklQg)UlSoB*d~m->Dhj+FYjLy_;#lDX@*->dPv>%|qApqCeL z_~f;{L9%}?pg!Toa^RkkOUwkKP5Q%duk2JbUj+2ny} z6Ual>e76i)sUyY0%9&~-$uLj{S>H7+oLt=iL+_LqMSg$oZ?rv*kN7F-5_d2LAip^QDf%OJTuU zDnVJfZTaeez!jvoajH-K%#IxdTp*x8jr>hr9;tVzF!NLWd#0-?)fqr5o{bL zbaWkyJm5xD`!g|=PX`b9P2u6D@=u{O05@99D_2$IuKj7+0!iCy)L9$bFn?V8wx(Jm zyZc_=KZGB=g=;t=EW=+Yo$PWF`y=2qfJ%J_?JH0z3Xz;$A^?HThh;f{83T4vDjydn zl=@jYTc%%iUG7;YLOPaeg)zXki-*si1%mi6wA1K)SCC{c*mbcSUnsFlZku*y?HuKm z%GnlJc&(I{#1i;D7alqIabcUJIzG;Mo%vY|#f)koN~cZTD{{g7$@fP;>*|8_cdp-_ zA6b1%V2KUTBX0s{ciQYrj_ow0VDxdi>{rm_zp&+`?*tdi9f^svRM7t9af!9P9Q$Aw zfC?S(VpBsYZ#rL23coF`<=`kUsWRHxy`FB>=>*~a(Nl5OkXQB6ud$y$3XPQuiIwBW zX!RebdgeC0)uuy(QWnRV#(Cg(&+llAomrH?uY>d&Kz5l+{B~n;G=YO(OtOhGs#myV)=PR6_u<>a~~r3J4D&%6~(kN+^wC zw{E2-xWz?hn8~c7s<_ug!7%HJF>D$33W|6gjU~N|DgSP2dA+#r)2!mCAq4q-02ivL zVkAdYTD3QAayVIdFuh|rubOSgcV2$zIn+g+FV;mZFS{EZp^#8(yS#}K8OZ~GYMcQY z2s+uh`GTHY!^KsqLfgoH!Ah^)KiJV;Qd|zsl=`N4GXgMTs3Ef=)aEU;zXe!H$OTPsgKEEWbq#Nd2y(D?qti-&0bqcrum*YjN+o%3!x zH@!cYa%7>DOab_9f+_2ym`1Ah8rGjG^V1swBirJOj~_Ry3%`}VcaQ^0xgcm@>Awzm z=#*q+6b$|Le1*Tzt;dY)wSeODqwmIHt!pONQ-fKoSI9yhgPzH=77HoO*OQ5 zfou~lAiVp({|wO*Ku~#cA0y!_L0-kkqF)xnir+inNt1`i@&dI+t!Q@yd|fr#!6FBk z1BGgW_di-HD;e2Xn2dETObm2(3@vocjZMFrsVJ(bE6W-f8H9zzQDKiNDU9XcMsffI!WY(P&^MpJ{~iVc?gGNv4`tx1g{ju==!5R1VRTj1nSNEPJ+LQ$lT$~c-p z8F|33stV=>OJpxYS=dofK*G&P!Av#-<{nRAZx7XH^(^qvzh{t8Scc!Y)uO>Rw)Tep z{vA^DdHZz*8|;t9>x;`WCDFD_9BP7>VD{hrvlcd{xZU&ZZp{aGW#p*m);8~%7xL^~ zQCP4%EF6?5kOZYhMh=agTw^7&rhrliQhfttNuEjD;|;@MlUUOe(=jhz=D8G2jCXnv za@%Zc2h>u4sT^=o2J_XRudn^y*|PQPaJyq2m(2w2vz`qt6P{m6poFG>E3P)dOXpb+ zGH6LL+_KJH8EWmBd)fQgCcJCFv=^JjjzT zTTfu-Mo4838rjZZJq6Yreo&5cM{9?r;rw2*B=NGANns&@7)_qe5~hx3HuujU@$SCJ z&V!yj3)E-Tn6Qz)ze6G2r{`99;-tKL^xz21_lme=t2jPnt7}>044AUuypkM^fcIk% zBniJu^JL(+#v%<~k7a4qs6C00s7hP!kN&hh?yep>T57szvCOGHWclAy&GqV@!O`(@ zT3@75ut+LM!DBgDJRkWUiie1{-u|w zpCswf{plbm0zMdxM#LM}qxDAGf83{}R_o zk+DNRF`5FpUbh+b^2F}@KdZl{k*=f&cz<^cyr$xbZ^tv_dYkfBi;=SmCFZ@s0Y$j5 z-9EOC&OV(n*aZJ+0ZdzUnBzIJKr1KuUHJR^$p3!2{FwQ!f}6@12nf%$w(+113NWC9 z-fzi0SUXzUWTtCeCqivx?vrX`V&zhHg%%KA*w*I4tiDK(^UgNcI-nj}+eCG*vigim zV^f5RI1u~aoUgPUbs0yZqd_UdaMy5^t3eA+K+PC5lsc>Y`^neOVsJ1frBY+~6S|d+ zH6=9_1AYF0J?8&abX~4jH2%KD`MR8(iF^CIL`(Z}>R*%s ztkyox3VQPFprn-XDbr#6Yy@Zk2R`8akqYwq z>v*M;w6DZ%5a@-cH(g_Xh{wx#JA+O~i|Ok}Do7xHkk>5U%}_-_Of>(!%FZ!?wlV3n zcCo1Y@L_%$(%0_ z&%YuO1>9L(kwV-HLB?c}U4G&;UHN%|&z=Eq4Xj8d3yH3&-p2YW?i_E&Xy@Ggbjwgr zMp`W*VPL#BFfE3xCMY%x4(q|~Xo)!U-0&X&9v#NvOdpj{N9ITccQ`<+8h~B7J;Yvs}TFGOa<&-=;GGGtf03 z2V^}K6*^;_RYIMT6|0^6XVYie=r5ph1Gocv$IQBbwmSlq|I zsR(2rdMb(|xhsS5^{()78vnHris0;f;SwMF!h|c4yt|{*BQY#gQ~v7WG9QV_YDy~m zV+vqR@FmHkr&Ygve|-7)!r30}*)L#q%FCj<^a5}z+x)+)(c}FTV$jI$yV4<~FGTWG zL;+z+xiMH3Al`q)QynZ-ukWF$Zzrj0?=Gu4=DksUJ;)$*T6l8t?nf{4f;ECG_f7%b zP5rDJw_1bR^n~gcV=e|Vu!s|z?DwY{D3}gmQ+F(3toE zp(4>gY|HVcyr3TM3Dr38gVGW>ekb>6xQO0w!aE5}3qh{Jt)6IFNQZQ?v$LXQVq`9s zJ^1D563hBj$I8I`53mtmi)V00$93oN{u^}&nMH2-?3KO=jfn&F>Y2;aEeu0WWKi$*%y-lwi<-mw|WNfOLJExGs`_C`Ncd3KOh#!=; z!x2HO#zriZ3_3G-9R05+*I)}lH|Wvt&pwdU_7U*S%!~*LJ9s^R^agvBnA^>1eX$Ir z5L100BX1gJZ{21-+_-Y95fswVfpG$h2W6kBkiA4XEHvI@Yp7Q)+G3%P0P;kvy<%X3 zJmVaz%P(!WHU_<&O}L(~9$t9GT(t7E_qVrF__bl0Wv6o^ChqMRt}id*&+#(;Zck5a z3f{vFAq9ho!nUUgh(K^w2tVbJJtqXwfnz_zz+zF8q}#U>`{b$MRgtiOZ<(i#c=ezf+ASG^LerNS1|vDh07*fgpen$ zFuKPH0>rA>pd1$Y1tU6y8XGn>F^&J~C9~bGN~~0NJpL=D*no}dM~(bBySCVZ*~1b6 z0i0FnH<$4~gdc7KQJ>is3CRnod>kFF{*I8%Kp0pbm#9f;{8)Vo_~#Ve`@M&dVc2JR z;^Y|n#VMW=A@%XKkT0KU^YBc#-h$hP;Q=Q98|#|-+Ddw^;$J!CY1QRwB%v{} z_}gMNItDsA7A837oE7z@s?#;~{+)V`bv3SKh6d4R0#{0zKik5-GGIxoH#&jrZ$e2_ z2PR*I57HmQ=b)9I4O2N)gLo)fTc0y zigs|StD%kKXtb&0=gF7dYFo-U*@;Kjb-%k_*cI;YqRvy@vBrh?yWvR?|4XNjWDZ1p z{WP@X$juWSA-x7AF%o7JAAP$Q8Dj&$n1HL8qK>8JJO9{kZT!(i6y8vY3=5UB++6dX z6@J_Qan|TtzA^-HJ^+Tz^T_(Cp9OD#Xm=N|&WvnKS;L!jHEJbgl^MgE(mI+I3A!`H z!LQyISU6zmelVj*!^ecNHszdL-EPbZ_b1-%E1C;1?O8s8KI6lCyw*iSTVs7Kqb8W= z6AO!uFRL6j!uI}?6D^{%ghi8YQl5zNM~kt3Cc#~`=J${qv9s%_e;a1*&QRd>cGa$b z?J+wKO|b^;puH>v)fTQcUVBBcDzcjpph(8iIOc3KXx*osr z?nFL19kJ)!Pa8JUfvs%%k59SHTl`+NMLpDf|Fsm?#*nx1b4*es9$|8|?tSOm^|aDs ze~>qrQ9OoH_~1q_M?>GPx9~^5lt%rV@NU7I`c2zfHG1G>r~3T07++LI;Z_lY4h^mC zF?j8kn;c!z7saq9_x_`0Skn+GPcA9eFD21CqWF;DJzLFc-Oq8%0Xf-9pqJ{%#wmziluHJL{D z1A>XT4Srx&VLXxt_=|aPG#V_AVCk{{yJEXec z_6*h_)%mmDnSz6di{ou}P(R-CC%8r92Npi%or;qW_yFvKjktA(Igo&0P=6FKaB>&~ewx4gGXpLgH}O6%Zq53| zWm4h?Hy(9>gK|EqIJI|B+||e(@}oweS2|Yk3r&5HC{R^VIdV{MVRDhUa`@Pe`wsv+ z0hTArVq z0UL;)FRRDQktmhFdg$aTASh-aB`~-h5#S=NDUu;er1=_nh0%0?5@3V7+W=k!V*W=0 z8G38r6NCS1Qd#BZWc`j;y@jOKw{w+w{5=|Q_|Mw^;1K*uE1l{X;7_FTc;PKI&L2q< zDF%uOB?*hu@~%Lp3sT;T){(TKqqHGE-~Bu;fCqhsMU6TDxC;Aljlk9N3xgciTVbwv zqQohu>hd?p&Fw8d7xUpS0^RB}3UoRG^g(olFJApE7Iv5z?vbDVDXdEmfK#QlrDjVDo{xNy~`W@l;W=_{IJU{HD`0+L%BLBOx8N%6{(gX$&6KhWQb zV+U*}#6{{)ZoKfjAK#?VMZ6!a|L^}Ff&b4(V8lCX7g$~ZSHyGA zs#o0{5Q_4UIr8h`J16Mq zq#3Zc2NXgnBikzuJxG*aOx5>q*aJrdcvh-YO6VNTN1ywx2>~dV4!2*SD^Rpv?ib39Wy*6@H7wvPPfp@r)F{rr`tf1(85&j z6J zG!%T)=!=&Rjkg`&Ra8VOjEYii3WkbIb36ns1iLf>8*}5l%}cu04y~-JOq)qXVRW<@ zQ|^qItKxox$}Agke`}1xbiY#5wVu19MbH}oZFh##Wvg}7#3KL}NP&*_V@xxlj$Nf?K{A`XD5#N(~k&(wxps!oF&x}Cy zq5Tf;FH0wX-f}jx=8dLG(~AY&-bsI%@OAp;`0=Q8i(+$%^ILsw^Q;SDp|q>??6>1L zCnmaNKVT(;fi}WimFQ0QU#yBTr%wqo^omm4!6dPe2NH7V@z?Qt&_}1AurtTfQoXzV z6CUH;-aq4VBJcC^VaP8=Hm(MbuR_7}`yTmerN(Q`4E^^Gk}z#BBIy=tub+sBb|36w zr?z%Ly#nL*524y@UBiy#_;I$gBfF7b-^gte3*Lt>^@QK;Kn^FR zv+>$`kZYY_?(i_fip!qZF*YQl1hmPe>R!i8KX>M9Z?A+B{jKTb4Tp4clSqFLJrxaz z=|Q8O^VEjyJO@*zFsUb?es#WA;@Vl?$Wu3Hm^UvBQo80A!Il=mXojS!wQNoFME3k6 zDhS^e_1Vk&LB=ph9OYO+lP-z%Yv^Cuho5NxeInViYDwa3OBTFnIT8LhfIl_Ou6wP2 zbLLHXthXim4v{+N>Bf*~=)%P~EV_8scr74B5F9hsRHXUNX-9-peU}TFdqxfI?)Lfw zrW;j!dDzzd$W9umaG-UtK+3;pHVgNOJdk3QYc@tA9}Gr4R%3hYHLMA8?=@On+#)BEt& z^<4<6Cn89sQjD;3Ws$uY84btI91I(SDS~b6%!el&Q2fQsXI;R7wC$^wre+1VZVl6q zFWGD~2MS$+?TNX^5}xz>G-_U6vL!R77B@>>+cp>HY zNJx(SKkU8bSJYA0KRgzwsHlLbq#|9?T^8Nl3ew#Stq3S7-QC>{gNSr@Ga_9xGz>G$ z{0`T>?zNtO;CXYei^V&b@0{;GJ3jlf_c=TDj-M$&0_I62DZ-#Qk9w!8qmh~DmBB%S ze}?-zz2=A#Lq~Ykdc3uvK<<^-6C4^g9#?a81TmbM>nf=UyKUVyd3;NK#gQNEE2qVP z6zjTp{y6DS>hix;e#bs?*1T)aE7pRLa%AlHa#XfjhTD`U^-R_#a8-c90bi*;2&U2j zzmP=7CB(-{(?36+D!e=7-<{Np|9rggZ8M>d_q-U64dt99yf18h1Im)9|4hcfkcxe1wL4nb{%3D$a+h8ehyUiSEa2s6d@(P%n3Kb#W(fXS2sMFcE z%gP+x-gzH8i=gW|rhUcip8>7U>x`DHLtor5^Lw*Ylh{U;Dh8yVrbb#m@{mkpN8uCZP%3p3`5luV?P3mWx53 z2wDFd&^@EHpk;RN$ct=NErY|#|K1+0bfBRdMsV(DQ#2F46N_MGWGycz?O$`GOixcu zrgAwN>O=Zk&NCX#*6%3g);t7etM}Th>1+FY+T3(sw7+Mwtzp^Rh*s>Ogth=QxemKV zwd6L}lAAc&80_`!L$-|$n&&yk7nyekFhSR@7R?{MNUzqWywi9aq3&Uf9JBVdf;-@< zl$aO9KSZ^g947+@-{K!TxVRcsYn!Z*xKWD!_z^bkYAOEkX8Q_(==pJCOwv@2gOSn7 z0bGs#+}*=^u_5p<_|8}ARYw#MA55<`6R^nwT$F+iry$U_m7raRYJS8l@&J3r&Q)c0 z|EwHLe3a3?W>wE-*gRQnwZTR)ubYs3=iBd^(2@{kz9K8jtJo6^^iavb!D4o)gT5y9 zme;S*@kmKUNubmtDPnx(^_6v5_lj2z;>u^wr#>5W0Ot@*pxR zr1P);;z%*LG1-9L?_CU11P}7__ynq5kj**^q7P?#lVO}Cb>Vzagps;BquuU|_s8|G z?C-NY`g-id410{0FR3AZSy!;#?*SM0YprIZXC?{a3@L}b{|Ge8ifMvY%-FpuxAB3y zpj=;Bt8`wnc6kNBOZ@+QL>K0s7L-h2GUK+xS6nD#QDJ=cg=m9KC2%m|n=#0zg0HX! zq$#-5Xb7|qaqj+U3~9qQ$}aY@=v3xq6eI}K0n;XE41EmASi5Rwfi!K8N96xB^pSk{ z&O#eS3NM`&=gc)(12HAzUNVs6yUlw)4n)4+deeaH3wQ6`q%715l@NX@$CR%7q!7w}4v_-Y#JcJNw5 zuHKfk8}R^45TL0Zne`}BD~5U;Nxa@qeP;O0eRb5o5&1sAwk_pf83T%gh`&;ub1 z%g89;2g5K#xX|D&`H-R$pKWDs6B2-Vw-M_xH6LXI13>|h!Umz{2g(tn4`l-DAY7?Ff4j78DkXpBu0B2ru91h)nAP7 zv?vY{l=nc$cuWhdsSB1I4Q2}p=o_*}psMrkZ&59;Eq};nyoeVp&)9FS%UGctrPxAz z+$Q20R^hIv6L)~$I&gMV$I!pk zhIV%34?mz3bK1t3#O8Bb&ivZ1_z+U_FN!m2-TK8BpY*{r(FQ}izSBE)-`|}K|1+Qz za`G8&U+KHFwZox;ZaL*KAGFg+4-cGfkEpi)#n&8~nbnHE=}gA0^W%_(g`58ZZkA184y1}&OvN0KX4{r59w+~c?Z{FTH4wC`d&#HSGQ2p60#-hd$a`>Dt6R)xJF3;l z`DtRGoz&;?ljjSVOml7>dp|>aKR7)X9qwX-ZLqC^{&trBPuz6>lY3iKpR6aoF&*3| zGR|IFY(7RTnG7E07AP@!|8Fk*O zBW!NuFLeF<7}!3zj^5jg#}Omh5mT(PWctaL*ZW_>OmjRAb(zom;FPIX$yhL`mWGgl zxxC@2%UfW2}_`*h5}Lx9LGKulW7*u9-(~ z)nX|H*v=MB%{AhlpzG{lo?ELKu-0Uq+?G<1YnGE~EW+#;`a4RY0@wXMfG{_5AJ6WR zXbE7M{ORH06i%3cZo-nO_2(LglVD@dIzEk~3ax=svS|bUCcd7wQW?`%x4-tUl^DQQ z+oI9QHP902JVo-OzkP}Ammb9yUSFv%PPVbHw|9Su5(m+${i~iGPuB}c;Y84=U%J_S zH2?V8?ILG0nKV!SY3c7zlcnDF)X-niX6)S2y=dUSGPBtS$6{A~eK0P~eH;2GlmCGF z-}}BaN12IM5&r`EWQv-ErS@2T;a8ZXVZ^HXPSL|a8tDN;%N-LpbW z32$E$cLIQVgQ81#0^-EaoWUMOwl=o$TAeM>aX=vj({bH;0SnsIBnt$8g z9!YF~lUa&bRghP7>0|P}y&}lK!*m`?_r~gSwCNc`ilXnbEEvLo><-w8ugEiu#HR}2-#O=q#+gJSNMzL?v$ zoMp))2LarX;5yK2yTt|#d9lrsQkIC_i;ngo4GRAoewP2y9lZx`O9O>FZI@L7WVIw5 zK$H3M_4lkxXb6!SJK56yAOY}2cfM2)s{>}Bt=d&=$$cv^F==o*U=aC1iJAmeO4=<1~l+ww=k9FnP9kz;whWPmeF2U`9n)q57Tk z(MCJQ9;S7HNa#fH$X~xB$y0{W+Y)rqfQP0vJw7?)hq(m_x_;qJ5b_>tDsNL-ewN%7 zN+#e8c!TYj+hc4D z)ET7_|L|2xSy(mL4S%m3c)AeK--+&D`@v|zQF&1KED;=DuXS;8e!e&|@@uGT4v<9Y z5t>pN>9w)BU!#+rl6jx4W&NloWqOK}NEP~q-4A=CC;)(6Ga)6~6P}sU^3@I2NqQR~ zIe3jiT~$qjnAJ8&x|pjpKQHuT3gJY&&{$*IDBmDJTg|@3H8cw{KLsPeC`G(|kO$)+ zn?ERzJ|qYR*8QV0GCKRMxxM&L-+6<@-$LJRGM;z;n(kj&$XpZ&47ErkEo~4~C02&s zdY{z$E@aobBm%LduvB<@Ke7PpFmNP9m?j+IOG1V#T8?P-Pc3atl{Z%sH@E*-KlBNx zFbS%8yjb`A!mdrH($(0>_Zrn`ZKhMTMU@6F?W5f(^Ow zq8{LKyjz8dy^`N%kH)d5`JNgPLuYb}`DFSS5U($?kbY_qu>KntkvpI{cYqNQNWk0+@_C>o82ul4o6><%Lrbm}|* z;_bn7c)UOQ^9ul%<&UFDdiVY7N^s#-7UgnuLhhIWO)DQ3R%Xr51Au2dNv_|+ob^zN zm8SB0+=RaNZ$C$bbTTojx!PT7x68YA(wd;dQ_fF@7m>JN0AIjngWsEvq#u53E z5lt07r2*iw@6+4smsk*5q@C32XcYrW3KhmS*4uP_x6^5w>rfub$PtjpU_~4)cZOOm zo@pb!iYpp&DjHt#VtE|SZ%RA_;rPOGG`|DyG?zs)&P#A-Y%o`8l~+_ya+SA+ zFXBIrQk4cUR(Pz$`LSKrVOupDS*h#*A;)d>=UXB{ zo7$=jIyy2wFf^UxGp2jC5f#%;{vf$U{3W09*oHbwdZKJZP83R!AY&_g$Tj(DEKEXL0 z4#(efkIa}K7fOSMjfK#EEF)+F6A#n9U=#3|+*~W3Mb;oSz(2{Wmx*M9I!~=!+b@|4i3}acDKq&seInw zBI+)9DG5;`y;7|$kj9652dcuhJtb`@?6&ye!v>gGDYf#2mU*{5q=556_U4BCh1$fR zkVsItyh1h%+al0f`eY!FKk4NYSyNVw<#6VTjN-u{p%@jvYm#tYrd!;Y>cg7=NS_XF zOz8dvy5baHk|64cG2AEbnE}E!hLtu+=lgbC z#mHZFQtvmEH1YlQ*j7HHKY#wj)X?4c**{Nw6m3RIOcEUgoVRUPPNn>F?K`*LcN&YO z@i{HW2XxW~`!dn-ih@sUZaBn5-gxP;{Z7pGKRsrC2$UHv@_gDx|K0UrdL@J9Q!i~N3=?K(Bsr#AaF56}mFzS^iR zW@|f?11wYQ5=(C~^AqbG^VAD?&DCqY7SCcNbx4%8)h{>FZme>^3@ByF-`qn?du~F4 z;n%>$Zla`XlawQP3y)R8dl4-3kJ6}5BE*U;{SXGlhVnEbVejEvw3r?v4IS2f98@oaYT zm@34t=_-)Zf)Rm0EtGndnA>pD2lqb$R}i9E^mpzH96Oh)sU$_2-J|b=Bp|p?N62r# zTT^r~X$!ASceE(5%74&zA7<3+)t5a`%xi7CUDnpMD`Vstki8 zVa7lCT$drhg;EnrNhzdOyF-uY=X{TeQ4&sHsn_LHu}aT=R2>E%REt_+C9=g_5&b=V zFCy+dFrOdLhKPFuR%0^?$#=OlapO*yw48La$4=ST_Wo&XK@?t+QRTNPs)GFFkjFHh zjnVogFF>nCN^`-V3aURK5{c$Eoai;8&G1gQ0Owsb6@sH36u6CrG4ml99zP+&B~>+<_vH}FUMm|? zkkO-;^r7{7ZxZ`bKZ2MP{89Kx8b;_Edy>K~9kjCrg&hHX}uq7Lt01N63>`Zy22 z&*^W#iK+2CUz^L$Zlype5<*5^E@WTN;0jM~&6vAJ!)~}(x8>PKrf^CwnD<*6Kpgsq zccl%2L7ki3tv;`g=>od}m!>=@wz5p(exCb>IGDGPuB%I)VjLvU9}R=EsexkJY$HQo zmMt}Tu60oyR&)5H-veH?_FMAS49m6g`mSWN!-j;5JZo>K1UMSfJ-z~JAtVZSAw^%`+!8mtD#_H|SSNh~ z$OUDC28G$5_0oTgqQ zP%qfaAph9vPyKZuO^H@3&7ariGe3L$jgxk+`jfQ8;^xuKZeJM4BlHHlAb^B^mt)tn%DNUq~KP6E-+rhF>5!yofI`z15_v9G5gr#TKqg z@7k7#+i>`b1=igY^F4MM_4TzDq^spcjSBA#R3??|uD%d|MyLLmiXT$?%H;2V~*Lu>$cj< zS0ls2-65|s0AIN(Fe$c1bo1b^^gXEGT_McfZ$%b2_Uq8++IlbDq?JMu&}SP``9`?OVAnF(M;6 z%Y@_*eQ>J;csrPZ9A(C#@#am5@3h3xb-$-iQw5b+@|9qdwy?3P!vxZURStkvi-hi< zXN+V(4*euYhbOsRjAWjp3?vo#GOrzQ1$$5l-j_eai?Z3=<-ju(ct1uF*=^;vHo zzJuPHB_Ob3mOYWb4=GJFxMaYGDCq$N?5^d>?xyLcNs8~O>%^r>z{U0U?G3u;E~mbes+{Bw zhl55wR2RYQ+Q*7rrN5~b;>cE7{*H0%+w{`VhZ~9Jq2SutI@OGkL!{_+i2hZ#=rK`9 zr(U(!Rur^a2g^p?7u1q8Cph>yt4B}Au!MnuB`@@a*ip9Ay#_s-eDTaRv)hoSs{@{! znGg29p4!04SK%6<`TvjKwvqLt$@dSL-a%`_r>LYs_R#a0Q!ur}DmS&%<%s?Qz;1e) z*p{8kGpgwZ{=yOqyZ$yo{o%QiYvKf7(pkV6oxD)AIeJ(OT;*aZ^ys}q0b5s`6t_bZ zOrkX*i(%~IEtes6K|#q&IQz!x<_P8oC}}XV$5{+07Hjf~ec{u=PHwRxSHZ!U8vqq% zXo{u@Bap0Oj{MfNqRg=X(=r2(2FTjG@2_W8RNid|MEG!bF*Nb(p-ew>4*?0g8($c0 z_O*L>Y$7-OrvCGa5g--k19upfu5@;_1&8^jro=_YB%KN)NKoF7?7juyNx~aOLgjD~ z9!078Neh}Crpg$^k9QM`UnW`GD!#WUIlH+`X>o%30^QXfDY`=&_AoZtFV%zJy=-;C zEd!R6e#k&ACm^OtdFf-1X(e|wsBK&GcIpK?<7?FC#2ovyHbvj$2PHQx-PpKTD;CfJEg=-LT0$^Q!Y3G;SJg0RN@)p^)OWM^3_4LC=JU^qpx_bp1Nk_NFGA8HLej7t{ z$_6*zN|fvR>(fd|E>xQ6H6brm8+-y%^l94*d9Gg2j(o4K^}3(vQxUI`pIA^{yq;-) z(8uH7rC_IgRYfO>RbRapLt0w!GnTe9mLjQTBA4Tg^1W&ofB@1!s{)mzlnb6d+nT%; z4}skO&sn06pg6v&IYjX7cdrv^dNXluWejnAQkpbnMz7El#tj+i>>iC9Dq~!CLuAQ! zt)-0w-OTeVy(YrCH=^+ws^UPuywlZl1ld6)Uw7m6VL~h%H^Es<{FNGn?RPJ$j*b<= zPm_B8bj<~0A~hL^b92nh>7F@8WHZKf0^@z_e}g+Zv}x@>L0}%hHHgTSvO6z*Q|{=E zS4D_=9d-|SKkt{k12Fe1IB0F&9buEYVd1}LNayS!(Lc%^IgQRfqRkrO` z;_T`*kE!rykc?}`xVssZO-hJBs zTq^tR?arpb;y<77=VX5W{Vxi*-ovMMif4=~$DfpGndu|ESVP)BZpy3ULH6;k)?@Q2 zvmH;5O$e}G?kXt(?i9j3m+_8xN&TIP((;R2CJ?F-6EEQpRQnde8I%Tls>>v zr2^c&unu|#AtARNa$b-g4z6Zv#AtRO@6D!mzM)ryj4)rReLWzre&T=M?tN}q`w-NL zH#dkwn7HV|)vX>7b%#z?|YU)^HcBJv zKE+I~vFAw`A!MKT%Hz$0$kcn|Uc&+?loneyEiHENm0s$oXSW)In)a$%D%Ya}A zaYsQvI64cTex>d~y4ekYA~HfOoG#*-kWo*H1yStN77n;i<@dv`0U<(4$;FoJ-_q(< zs3a=JVY`PnN6R(OvYWY;i-7|KL7~uiRUcj0-)VBRagS_9b4?ZP?m@oTItZ@DoA~2C zJtf~}qg8sy=p3UYRfh(rWQAsCEm@vHMEtMpK3VCNjCB92h=a2egR>LT!4z{P_!4P2 z!l9;K^;Lq`m#=>mK@tZmc#}O^S7P`cjH59>&+sXR>B(Is@xIsS5=Zi5^b$Ob=XEWo{-`dW^YaET#xVog?o8q`Dg-LZgLfq&}Ady{Hq$u|~ zn&M%OOB1T;@6s8~R|G}ig?FIOr^z`s>rrXpkAp&AoGn)Q%e6-$gxE_V6M2{Az7xP5 z*{<6GNL=8@rb1FXZXE zR}%G%#>2VM2T>6pG%sX`1PxV}IE9s-yK5$*MINP)k-JxZG}Z0zxkaMf2g(l9YCx<( z*T#mE1l>Wu7Y84EnSN!7bjT|_yoEf4ZX?6AKpWQRFI)=h^cA$(PGt6n#cdm-Y z<+TLlRTW)?sPDw4y^mgJF`ztSQjYAYTS^0BwADe^zHB}x{`|?d?s9`l;Syc{)ykH( z&y|kfjdA-Jg=6UWANrpQ^dGI6Lcvv`v!FoXV0*OuD6`NPrb#Oh7%KAWKI zz)TV{zo@HlIplf3xqN!r9rKC&f#=FL$r(?(5bmD}K5flRcH%W@EkmfsV|o_|g~KWVJ*0o^qVedNwXDax&+jHW&0HSPTKf z=6wJ4e!~K2fT0zJRbFNImSHL7@!fz%p%rVb{W#>zo1EJtNh$mT1-kZP(i}jP1@uqM zCqTylo*8bQv@b^wKz_fb~{)zNDH;6?KbRvP9YVd^UyURUv&4m}0J z_qs=kZ1?G)@1ug7UzFTe)pFK10@l%=j;0J21;Hf&eLaBQVNq?Z*fy+nZdzo0|Q?tPWbLGf%d=z ze$PxT7G(?#l7WRyyTNO6RDYgP69tHohRC=0r&})PtFxe|)GIcjr00B5Fo+fFyx!A( zgQ1)BcEFJ+F7S{r&8Hd1AIP~r&;BGS>8UU72uWp~KeT4gK-dJSQD9KZptYoW3><4Z zkC>e{6dWy~a6w~NKx9;S&ZW}s4$K4m8U;RAJv=y6Y68@k(NNSHY>6_Myu)VYW19ym zYM68YN=}6S>mcX##%Q7V59aI3OsPL>_T;-Zpq~vN|NP`Ol6Z+@qGv>@{iXrkEAJ}j z+%c4uEFd9?%-DtN%$oo0yaHDMj?;yv@qXft7*>>$864;x?CC2kC@ESw0AntaJB=!} zz=YKa^fL9Ocy-GLIP!0Y8W>v2e;) z^m#&x18Z}(#vC}cmHocwZ z?ZJcox>TT0A!4b8ABCfPHy2(U%k#ai)cQ?&8>|wvSUAdW`<$;ufaVE?1BpwgBSZ%W z4MUk6?d{(K6FHjo`=E*f$300c8-S}qTCdJNWzd64g&FHb@L|@)Iym%UShlneFg{f4 zNLMV^%rqiFScsWku`!~0mSwFdrX-~WaJczqrp$bHvJYL36aWWL6s205+JkdLj*g4c z&=nPd&Y{(vT3uI6_JWxk5>OLwP=g&3L|eVttz-SVh0cSu4po)*#NLAKmTkyRwP^LqOOv zM2F3A{9I=PiB8CcMo$>mMhbMhQQd0lNlLX#h$*_Q8A?EUCUDtOvsHcCR`5n9S+w}f zVq;e^zxM5)V{NCVbmuPo^iaVWk{_SV%)~f$b64#@qsby!qiuWL0!i4-r@2eh>!Y*FbcPe0L>Du#-dku z4eN~7EH(%|PGk9KB73rqTZK)kT>4GX0;y_h7h`L!ib5NEXJT{1vULFmL-ExMQ^kXH60h#?)Wlf z9(M5B&UuZh`?3s_IJfce!5xrwd-EYJ&{12T-{ooIx6W&yp-=wU(x+9Xlkyv{uCBI- zV*JBf(cT=kZ=44W@;}SV$O%{D4D$Ava!Tjx(!FP?@bukedwCkBOK}b(F7+71SaH2A zvxo7{$nnHcIXQHfv78W>vHB*!t5g@avWRmp@s1#Zqc^LgmZrZeO1f>0`<~;c$Cz`Y z*Z7D$(;TPBa6BtgqNYP>ZsU7rh?6f0o+@(`Bs~$JmytxL(L)|SKHPQ~_@a|Da;SdX zG!4@%JJfdAw9j3V?#;nQW6aJK{D41~pX&G&V`b;IyNC>!URp|wR1WP#4D`4koVW>| z37j-)!kM~^2pNl~Nw!)}4J~3ts5T%VEaVo84{lIOsvG5W<(AnYsD){Px8yl%o-(O{c@a zC;Md78|OGIw$3iY{(D_OKwyPFKNSc~@N5e=OKRBJaxoqlrkXd%(D2P*@hEZ0%(q0Z zb-l{U4&iRyHoXM(#RdJdo^9GYS*CIpu7l@JFVq;V8Kjk6GQakoN~vZ?zwKVSOnZ8& zBJFH9pBQ5gjN6V$fPOiMsW(89^t z6MYXcRLULLDPk!I>oQx*N0LdFR%ZBU z<)4#c++m@i`qdk(=cZ%z?63ncWB%xF5A@7G!ewWy((m5vZ0Cr|fED8Fd(wL_m}72m zyrKQ61wEDTyLpWOUqP8yk7p~LHbRl>;pfiB)#WWHGA}jwE|lO(Wv8*I@Mtup=LcN0 zP@UcQzx_Ou{wD`*pENX150RQaLf-3}m4eC*&*$XbzI{Q%X`k#|ou#sP;B-)%*y+xXPEadmYp!_PJay}{`&QU8T<)UI-A(X3 z>PU!kw9fAyj^bdeXSj`JDHX3TUUtjtGn$t*dAdkhgjS$YPsUMCZ(%4j)Mmckx6N`8 z6R<^;mvdRwW$}uhHr3G!3A#%8iVWMZpIj`}%9B!JVqy{!em+c3Z1gny&=sC4bY)VV zed@Atr3u0=UG&*)=O(S~Q5vO|+jm+$>nvtlz$dpSOI3?MoUG>L{Q2|k&$n+?CjGlh zskK5@Zl>#qfq_NcI@?Q&l{_jR%vMl3FN;3RXnhw7-s1G(9fi9}**cR%=;Q4fn9XI! z_C%>Z^TmB>IVmZr@56n4ORd|6uN&T%F|7b8{C;J)h{#( z0IN(%SmreI~ z^ByicIj`tV%r>m&Vcxw}B)}UC>Q@vzJ&V%GJseGqu%0cku#D|nQ;BkNa;itpGy)}t z5(P*PQ zr&+wNFpC>|J|(s*7O~J~iHOOFT5d~8j~h(nU!Ni?XEkIq@jZ=7__^O*jOTsXyC2FE za=56B2wY2!AATl)SvwkjUV*c_3xW8I#|=HDs;NdkKg{2X^8D;v^MKEV`= zb3P$ik%T3mbVQk3pq~|h4POt}ErVBlo=STev=7HH8hg4Rb!sTC?2{Rmtd-FE4hOr$ zbi70o_(iF%UrFapp?bDQYg4U%XU((f!*z?P9ObZWb^p#QclAlqEY-EI(JW=^YzDEW za=KIZLCaBPY(G9tv{149&AQ!G&S<_}8)h1x68g6?|8846FaTlnj2N4+=SRH-QD0HUNItFN#j-+PTRl)Hz-ySLXeAvzu91@@oOOu!P6>I;+L_(H+y% zobg9{Y$CW4RmEM^de_p+63bAawh?fTOpu@-dh-BB@4Te~eH#L-&eN_L+R-I{ZV+V3NZv#~v@vZi!116+keY&gRpC zQta9=qocS|=uwT`IHwf5oS{mB(auB>bPHv6f7eX~IF+-l5AT*m+|Np(*)dzy>n)d9 zNhVt6?f}zHQq8 zL_9~K;-g`yFyoCOsaIne28%=yJ1$u58%=I|#6#M7a$CL&C-J?i`NJt9<=>HjBlGbW z_1WqCsMU!sf6&i2JoCs74{G54FZ~v&`x~UOC={KWT1@)HkwtQ}s~}|roiO0Cwe09x zZs>>}oL);t^_<$|`JPw|_?U%~HBPsZ`&th#?!^BI?f2d44I(0Xd|K1{ldNn=Xu?O4 ziUopiQ0T9J4RSXZI^HF5(cDOIIPByeO)cUyWPrGrvV{B=eQ_)!H_*n|W`jNjkY?u0 zvg`RpcX5B*B?{qfYl|3kTk;(CkJw0tZigZjgpYn}<8+T)OLg@;*Jy7c*XokXSXJ|! z-3KotFzA29xR^?-=`>yxI$O~|?6{nRSy2Gn&~<-@w1pk=;NF+Jzu3iViwaK&i-}m) zg`!~6*?2s~ngmbi6%sYRQM{LI!)#4?Zr2Jh!9Tr5=d3)kG4{~%=64*(Rus|vMYrQ~ ze(<%O516`0%i%?PJV`~ba;o5;U6X(HeyhyQWf+(key(J4xE zMbb;~B6`&L3?!d23Nn_XCDQJL(?kS9;0R!Aq^8T+`uDohsK-PdR)-Wi)%4M0c|kW~15b8h+2gBR=1*G$nAJ-j z8t8%0g;pD8)y0`*ZR`oTBF5JtF%Pf4@ZUeDVXup2^l8#wmzW-Og{q8&f4H@N(Fo+)Qbjp`l%}1o@V0XJ6lmUBt{!R z7_NW03!(j&f1k{FYND{#j>s|~o%q?0cT5@#ZEY@n#{0Az0i^kI$s8_SZk;evNU(Uu zb^C&Ipv0Z(h3RK@?f+;c((oxgnc%_zSl>TfaNO{Qa*_YN#srj6FSp>qo(@v+3nODM zx*BSbpX!C-SZoTMZaKf$|F?Jx@*a3){v7oZC7AN1N4pVh8cjA)OqTZ1O=V70c)M~n zXE1@}$PdLPSqD$QF1xlRTPFq}7iwd%J`kNhm{w1XJfgbBuLXn?RFfv@cE>{;cwk=v zAC)Cxk??JD?uL3BxG1B|+?Qf_+TKzskMA;0*sW@qV-Yx^yNxIiW1dvg(eu^2TY`Il zUq*H#a8}VD?tkrESXl6+^lEw9kN;8ZjvC~Fg=8HXm3Z9WW*CcHZKRmPF63G&UsNS< zY~qh<5@G2}z*U)RT~?=@m5yp4mb(#Nst)w&H@lK(c9y{~S+YYy%q{DSgpx4e!aLPP zA!tP)MJcQCD(KI&HU<&6aH$RkBX`kA@Fdnf_3mDy=2Bl@--GhT<+FGmtFeN=rG0U% zM_tvpyKuz!xmxCGElU^Rhbddo?8^#<@NymR%aOJxvda)+QlN`3O5a!0NqC&L+(NBe zEY&#t#M&Y-kIPjv2X!0V2Q&?Xrq$$24~Ie&NnT%SF3#18`r^W1tsbl1765``H4F83 zp0JCc>_G&pFr6+NX!j*ga@!Px;Kz&K`a2Sv5<^TWEoQU6+XCI5DpLo6@}tAy#9O0R z-hbK8Ff??(%*U%xf0U7H6kk;;-=K8uT3okhB0R|_1>jje7)DpviuWXlK+Ei+`q>_n zALW7n9%-iPITMJ2kn5$%5!!DG=IO?N`*vG@+vs!aQv+YfS zsMV0MqL|ofU~vaCVX-Ru{cqiMu1)6+td0v|($6hL1FJ!FQZyIThG6U6BK>+bv(TBcs z^%l_iRLdk8^iOe`OZi^gogCz-D!VU0JM}H8>)7CdFa{Hw-<6=;`xc zC&shrI$V(hdaZQixt~o;hLgC;dq~`m8tFYK7in8efhey2|0U^dacL*XTYvw0F8}cD z8i-4t{?UEXw^-5gS9s&zuJ6z<>@p8XI&+J87vL8pLH*^esPR!_oWrys0EX6zP*>B> z_dK`4<`LfZJ9T>?PjfxbHDQLqTTHA*T`$L?3DZ4{()W`9C4#4C|Ng_lpxZt1N&s8z z{q9j6^x~(7H=U<&DGHZq?!*mRPM1Wc#3V#VH-B2mdoLRop8Og*({IP3TgjQ!h+3Ba zJO5>in(73CLkfxjU(dd?OFlV7gBpS#D1OWDhS?dS1W>IeU_&dY8$H=lG_;oMI$_LD%!Q55q1+57$41Me=dmYzb*`qRk0xtk%4jg9Z!tugBH z`tH*|#k%fwQvqgVOZIHc{{aL7M&v{S40pJuVuTHBJ9h?9ceITI*_y`p7Ujs8z2wc) z!-eV0KQg^7HfwL#dV*>5|Lw%bV#wnr!vS0Sx+rqowO?lDBjRW%%Ww7(2k`RmfD%Lg z(*8)vn0GeU816LrTqE~-*6g}QF|$~6Fsz745b#7y*~}l=&eV(!-&o7{<)eoSxAD7J zO<#0mg#5M=eJ0|XF2kRB#?b+KsP}ItfvnZyD6X0v*O7V3EeE-qaiuE-*0Y@QWH|C~ za>=p7Tw7LZ#X9A-dmkP8CZ6GEnbIO*^LB+QjVculAT-ejwyK>EHoFS{t2Lt}5Myzi zKiwnMKj{XEFw2n6b*0}|-Z2YEm6n$7!#EI^q2fUPym~o8GM4EC=i9}_>AIG@LAsG= zRTc{629Tje`@9m#n#|+9(V4GOtoC4PcPW+BtIEdUz#FX-tjweYZ z%$gg6rz3#kb)E}Qbxde11au+Ly1D3w>q&*bT1U39BvTA^;UMg<)+ zGkQ)8ez4w56Wo{uiTO{!F0d(Hzp{>FucI2C%Q$^e0;`U}IgjN7!08 zL2gQA3v2yJC@fv7g1Xd97ip2s{wS}YFvRM%#J9V~7u;9|A%A$C#P6;0QJ$C>!hWbF zz_VwZU+T)5{_Ln-4>zCRUWK)y(G zMFu>z3Z+TQ?XNyv(Si$5cv~8@@+WN@P_T%tDV`Qn5H=Zmdx50PM~j+F7cT&KDl?zI zuEcV+St*o~E)VER=f5Vh5YbUJT#!sI%Rf(r&h>f@)`3jX%C_;c zHA0m6b7eO;PmPoIHrC*^o8$NDwlEw_5xEL8_E!N+Kwk(e9OZK|=K|ndI^S^Qp0AI+ z=S3AbqlplH$iw_eh>H^p;cT5pUT!o|`LJL#+9%8)n53(h7O>F?{4mDO@<;08R@-jm zF&OZ=b%+!r7g#?qGmtWD!hD>*<@fe0hz>siyc(w#acj@=I{Jp@@#eGh`7vFXu)4l( zYKmBjO>DF{T6fv;)dPw%AmG&PBXW=|4X4~K`oEL>|6d_7{`(&PmB4=`@Lvi1R|5Y( zNuZ6`0l)dW_^8Xy)ZSq~dqiG5o4&`e$Qk*nL@(aS=#;jqtnEZ>bsh+b@#Xjeb5_4eZg-@jk{n3Qz7$z|sOg&?=(M1kX4pR}~} z?CfkZpB)y9M&>J~i<c-IE z;2`VgO7OqWxXqOw=C)uC`#Z^UU(wM$c+Op*UaSEg=(ATl4MQWEjaV>{{udbe6p6qWOi`3@%Qj#|b{ zjpgL_R|2-%Y(4K|+4P&h#Gc6_^_`K-j$dDH7xt zBq|D%iDd%Bti?!%M7pSV9Gm_{A9Fd2Ze7Xi`84QyVy)G5cpltir?eb)QRKce1wIdi z0`iCL$znt3TI{sGoBpzYf#J7?h6Yfz0YBh-UA8AI(5HJelHr)$>fx%Yst2x<50bJd zj`QS`Pj{x-lSGdOxXgyrT8%n`|4x4U_DxkmfL4o~!|0D4iU{u}lalbo>7M71z{a0W zl8MwRAb!3D`wmYen8p`GMOhK7%njtcH(9L7E#h&!`SyjiBZi>rF(%yCmnT3TQwlnV$2R}RMT z0-57C3*t+TKJW;*OY%De2<9$6)4{=k#8aXl??h3nL|^V=;((~1)|ijJB+ms~H3T*g zh;qKpMpi+gOtah|nb+pu%1UVYkvKd*SZM}od>Iu%C5D}r zZY~-7-(CRX+KrjUyXIrDAnQd#bTmLY4>I6l)f0fw*UK!T4omJjW&)DsdGR0XCHXAwVr#mU>5=V z-i0u^124%>2l#QPMN--zJyHxsl?efLvnfIv`C}n!1Pw~rwF~NW;0OGaU+S+PQdb`?Oz%~Y;Pl#EHJfiJe2F0&ZV8%*GM8*`m_fP!SkFqT>K0Xx`dcDOb8 zqr9S`-B^yab0v5l+y`wVmxg!$xib(1a719W@={VWK$L;^$*xS=4u)C}qVi$*?47l! zoV5k$GcwzT7j|tK>x0Q~$9~q)W5i;!UBhzVKJf=2=e@bworOlHD|OW<(E?tsRJXni z&}Chr&){B1@=LwpU<*%w-5`87E*r;!nulXG%JdpVy)SC4rr9n&)LG9~*)RW&q>;o+ z9WB-<^;mG|t_3dx3_MpheyIg|^gDn+GVD1CqBKntIEQe7^@OQX-Tb^fx>v8P7n@vw zyHL$nxLi-RtE#Rx<~-Y*KU;7b4$G4aeR^=^_44vgx5o43lX(jZ3&C>9_-s?S%!Ya* zX|flyve=q7vp$;3G!$$;1;y{F`@nOqPXc!U-Vpc<*oUy^KvDX8dS-woftT!#pu%0A z!AbXBgIW0a+%V?{67G7yXuYb{!8-xpz^YSoUkezSGhL#6)UXn61zrt&cXf63bg6E9 zTpX|IK*Af?4%h>?t+8C~YEu$s4HnhB0l+w48He}9@xe+r(&Fh`u&d~k9a1VPu}{Ch z*_&75L~)oS@GrMs{A0{di8^x*4-N^r+Od3v)a~hV!^}4Ui_LD5ZImlrVY-cuYiWJ# zz_V@)r3$(3&SXgVAFlOptggO;BY_C63|t)TV@T++G)L)uJPOuW41}+uG6uE;1icHO zpx>IQ@q&3pJYZa;@$81!%5KX3WK=JGdMMqMXHI}_pPrb3fv9JQ#cab}(4eweKE9Fe zOZfmxVE=d6?VOdU;1@O+6`@sW)OoTqy^-uRQJ@TL=|>)T8l?{-E$v!X2;25Vp{lzH z@OMmV1t13a6Dja71L;x;IDY=L9i5g&>3l6BB*Y5%Ti}e04{L1Zd8LNaM1(L;wx>#k z%ttajPPPM%G{L3;Hw`w8e=8?C%@>QBtu{kiAbWdzfvctf!4LfTYb+4Q)?BR>ke9*# zWA81zs{W#HQ42v3P*U2WOOTQjL{XYUcXxwyDF{dlNOw0#H;9yUcS(15zs2`=?|AP& zcw^jg5ywzC=j{F2d#}0XoNIqR+kV#b0X7A(btemTJ{!httJ~ z`m3{bXA#m@8o%L^Rnj|q>XrJGO3kLuzF~`>^tfGN?+3RGX2VKZj3wb!0raBvLwW{i5UnUA z#mBcBH_T{uR)K!Q7pyDZqfu>2vFL+8XpA_$(|L-;OJn*8B%Mxxq{-NUH;E3GE@RD( z0GKVjvK4mQ)A|W6wqr%Q9<1nuEHFI$Fj$o0u?jn7Fv1m(|0e+c)uN(rzQ)T;CtNSj zYES0;8lrG-x_`QyK(?7U1O&qq4L?0CZBsf9?P#}^4Ed{YEe!N3y_N752Jht2rvokR><*ZdNq zq8IxK*Ul%i-pIzu84BJQB>nyUH!JF$zKT<@TRJQRiz%CtX6M3c+s$!+4oFG%1?M~p z%Ul}C(~dN|i}HF8b;OG-*GuOv=TbxT|xVW)j-Zf(8Zva4So$dGuJ zgJbr?Q#<5sMHhY@mh-5lH#!0H%cU7Ng*4%?{K}045h=hq4haG#%{X|AZRzt zZr~ZMLcQzd&8sbP$mtwskJ4kzXq0A=M1+M=`=g?wnCSnCFxHlQ38KaF`Mf!P=u4YV zm3RR^VwsFYgAbh`k5DO+DCL1{)WdguVeu0yQ?2&QFe6UxcNwgps}A)mEV#zB^z>>1i)l3{aHV+t!647p395`S5!RZQX|~ZB(++{citH2Le!dYt(>#pu=iX;06E>R z_7nDb(30VOwvd6m8+|e_`BngR+LTRXS_4VYrjOpz?DfbvJ70*gPyO7+=VD;USFd+v z3hij+_>(OGTeqZQiQQj{S@kYvD*r0 zX9wWI?{U8`0_rqGaZaCMcp;H>MY9@*goME2Ct}%y(1T@?5TWKst)c;d>%s5|jI;)K zBtt_(fXz(6#2`|h_6SBYAHk5&P-IB9$5VF8PHBAOj?m*Fh+HmMZydJ`DrG4kN=~&U?YDNMn-POT>#C&UzdbO=7 zAOxrF#uJv4Xcj}Ot;*#(2ui233g2`{X8fGacH~$-#10F=vq8p?{sG`8erdh~f*8ni z1kgTHsND*9n|4@6VtQw5 zdjwi#ISeW^8+GPolfWg5*1J3l*n8--`!y$R(fN>Ho+Z(b2Y5?@t%*-IwIB*zYfnQ%;Hb%T2&Q*ME*q;i_H9bAucC}wuLX|27W9t;7Uhxht z)qT(qCP0{bF;fBlU23}Hv_zjHrj0Tm!`!b`|H>H zKy@(ho99CK!XVg9S_+j^j=|c8_{mi&rJ1SiiDa6Gl=P4g4?0&f>qYcOz6r9w+lgr_5=e4BZd`z**$I?tyJo-psfICV3l>SpL_SLo*!^vxGGE>(TCrOTmky!Gvck^} zTn13_CK{_oi}iaL>rRsY&9a}T0zI9TGwf8}f;{}=YAvV0J<}ZY2&_v+ep8BEhB(65!V`~trFpQ@_s;8~j~8lRb>L0P_+|RxLkrLGioK`@2IhnOoJ{b^lDx0Lt%U5I^CjUl^2@K)(~ltlJJ} z3_~kP-lVAaGcF;s`{6TQ0rSNRr~)=V1@WUX`pJ^y09fB?2V?z1yc<~zO7I^23AO}x z;kP?sA75heG;5uSE%F@tUc3(b@xuamG16jZH0!z#Wju=b{*CxQuD`wv79y?8SR-lL zCvolgeCe+BBPQm&30uOS;57yD516h+Xq}8%=Win>pK}8e{zev~ke1dQ08k4oUbD#x zP{=fTAI&~|_)tMWIC*b0$KnmFEVO!@K!SA9C@fdQ$?MaVl%PNFI$>iopkt%zjz??k z@*!|+PvujnKru-?0d!>7jt|BUtOG0~+)5dOu}h2@07VAae(lA60mJ>l|H)&z8_wvI zJ(N>WM_4x&5*CJQ_5=6IBftoFX9SvNbet@}|I0HeSO(C|`1*}uKMiPxs@j~l%)88t@Fu29GhEbLlg zdl`w-Mq$HTjCmb_HCyfV)j5B8;mS$40Vk)#TS@y)96|t}1eox(YwT%ln9-e2k9`E8 z$9v#M-17s~fzG$Et3f^9GYAt!Fo`t@T?F7Fx{7M=?hdRBCbE_6wtG4kh>8;t8yh>K z?&h+$(02F!!|#=plE8q$^8pBT0xe};e`#A`ceD4l(ptaa@*W^BPHIXy2C6o^p@Dn? z{(n!b6OgtXRDSeysj++o6NoYRK?I)U637M*<0z!Tm*&eQk>$i!L8Q2^FW*{OSy^bZ z63e*&%sOm~xd0QxSN$x-Qk$WP8+^T48fKR<`;5%4d@|Y5EI!6pcm|!^1R?&Jb&BY7D|}_bh@u68@hl_#70+vEd{_KnIvGL z{VXJdg!qQ|qA}LI+CBrOyK_6>fn5q7gGvSD0fU)8D}#@36nBFx&4<~_r9Uq$2-(eu zCpE^(OqHkkFCeXhfP08xHjpls(zOoG73}91I{yO_8yX{Dddm&LbUK`>fN=)WaX&wn z-CV8Lg8}#mz>8Crp@Rm_sXk4lB@>p9C>S5$f-n&+sbX`yTITuz+ai3WL5{t{4d^$nu z1LU0PLB4oG499l>L&sOMPx^P-4ly|nMiVqnK|#^d+S=OOjPx%4`6 zkRS|phO(sf3%&~5fBX#%?$O&yyl!JN8l+k=DR$Uj;&E}ju|w|j!@RA$y-zb+AXedx zs1U2sX$x^~74zJFfh4~Ue4Ym~Gbl$Pd}K`0Nm#o;>`wQW@hxVkKLlf*#oze?BZCzB z3&QgJ-+da*^Mlv8bs4oV>n`JcNfvdD=AkeFGe8n%96%sVJ7mCR#Btg2u4SgUqd7rl z1jKZ(wYBZ^?1%V|xA^k_1con0I6WRPuZHU-p#JZxg!E>S=Mh$pCN_jl^R%d|`?E+F0B zFo)aHUA9}3r;rI5H1txFA4pi>`*Tyjt#BHJs5&-OpT&GrGxKEj-|{UxQPd!j2X3u@ zh73S??)UJiTfCW-*aOv;2aM2Ssmy4I#?jjrco+<347bDH##r$&%aSP{3{9Q*Y+$tK zn-%1@k6qLMs5jrK6F=o#xgpMA-QA;CuX8@#Tf8xaL7DY%?{}_T4+4omW2n$L+8E>S zNEh%#1=2VlpUy;I1ks0#T@Ta9Mwodof(YmfkS5$>$Yo;rAW#JYdH#;n@v5b0yw7a= z8b!py#KiP**(F}@sq;X(!Pl7y^Lmoh8xMg6yCaMipX~a2w0gTDdyW0e{BjY)Q=&1H zd?b^#&Y!{~2H`=QGU5k9@j{Dzfi|y?okJfcv z`>130gkwLxZk}WR<@`p6?o-!<0;zcYaG-7A9T|bs^Vs%SIJ--m#UV#Ff;!PqEM8`& z@D4&Oi}0J|AbaIs8EmYf;?qA~Nk@PSaoi481m(5eJik@iCMnN+Ra`{L$uT&y5TQ(mS^$Dk=)zaMF0SYJZ+G`|3AVF0OM(U*H$GT%1@M8D%4~ z4t91TU+ar&z6j2&Qy6;qj4wOG%#){B#uQ8LcU3lJ;(Pm0KT(R%tU%7>aWmo4ZQsO( z2szWQ2L}g$lpB+k13f(j;&GhQ)6?1V2b-Ild?)`r0HMK{RESp0CaYSDDLCwV=;s`X zxU9lE%28mex4TstoO!GH5ZqW{{2mA~8xXME_-Gh6U*V1__V)JQeSBkLVg^rnU%b!; z8APribO_k1m8_+sv#`FNql8UuS6u+XB`p7)jL((Z?aEoKTTnz6fe0DgP=53cXq~sW zw=w%mDQD-J1HGjYrJmki$wObKcoGXVa#mIw&{+N7d0@V$>fP#_~?GGOASk0{i~C zi8`_4B3MK2PdPX_*`Oi=1}q}u2!z9ZBqSg8?2xnG{dN2FvxY@8dBqlA7>ru#j5F5Z zZ*s2Nx9+uL-))w!w9+kDMtxGGYJaL8F&O^4wN)tE0m$m4qVG~zofVh$l0S=TxtZ#! zfVPp5(bhNN!@V7_=&Y~LBU;L6Ukj%pY)bHk%!Wh+{_M%&u+}?&KV-7ecwb>LPDZcsEC5qO*VpwoxNwD_NRKe zH^A=4I3_xJ`u+2>ELZdW^%WJuX>ef;Iayd_4#TnolV&$J^Bfi*?9yXp9SsKg`%eN_ zgMv*e!UiZ{e=imJVbZcZi$rO%B{i<&uu3qdbhc2)AKUr9;cb#zKB$r^z(+#Ul}ikQ z)f-)SczCkdf)lN}WJ{m%$E#wXGDs@_0%0tiVFpX;XG=F4Dr);wcJ@Cww@vZ3cE(TA zp>Nrc!cJ>z&CJXYo|#xlXR;z}E#Pc|1haVv>CGYW9IP9k%pcVc4^>>@n#K0i)D8})I_V7`nQ!;`ZBSm5^ zRYfm}AglW9EGb*8CuS%loK{pK&0qS@`ugBzA<)-tEH6h?V}80_D_nBug#0%74$cVJ z*Qsv#;IzcE7$UZ8kQZ9DFQi zs?atW%wjw&dWgd>A;H)a%+UV3!2>xhwtaZ`2>i?*7v9H@9=&op+JKdVU)FAMTZZc+ z2M0$ckJIKjYu4jv6$Uc!vz6`-0Vy21W9$%k8^IzJNF2;Cyar*XHiB;z5Shf58dP0f zEu%gg22Kq;W52uG?BDON{f$tnTacGi=mNteZ53*7_6`nNyzA@h%D)#k?;>M-93bKR z{A26ccUVrK5>;3I98dRjOFKsK@bGRbSm1zYA|KFw@$_uw0^!#}Wd6|_7*G0);Sb=_$97^7xsCFKr| zyoJRMpl-FzItA~+?ye%#xj@_eX>8Qi*4AZ?s;zZ_u#_$S`R|_wwG=oezH5)n!2)<= zzoQ{4>JKxKkdR>1_=A$BOM*aAUMGR7XI|9 zu)G|qXP)B(@0bQCyP8{Cw#G|EjOJyacmeijJg1GYiK@1_`S$WMW%%=*{e2?N&jt-C z`bOe}94e2#fgtxMWTl~_6J?0l9xZ(L=w2G45{N0-D8A;oK|wtir~4AI9J>o`p-=*0 zHRydycqaDf8~8mrWk@s>o&vjI@cEPSC^-Y|eus&Pxq9y=HPO%r6KY$|HTeJnJjB3Y zV`Dqo-Ic2TsBRIO>Vr*r|Ni~yDjQl>)>8OTDA0tD8&HP{mpY*!aeQ8p1T(d%?k~hY zFlsJXY#@Tr(b03{3#P$Zzcb8Zx1|EENVEFay1J_-A8bY_6a$AjIQT3tKl0_vt<^Kf z4T^>jmqTf^lc;R2AmhV~n@>RJC|K`TW$AjHdTU%RDP+-JMOhR%w zAi=j-=L0TOAowG`n`{C8{?p(QfkalVbAI#eSrX_kcvt`1Rj5eDvl@p-YLW0bmIwur zYSC=1uHKZ`;N{1V$`utA#l^)TkN-4tgc_P^jlEPXLj$JE&c6m%S6A@)KM4yLm6snM zAIqCMW}kYi=|Ei^=w!b*c$ZFKeF0JZ@#6>7MNykMM0Is^HfHM8+s7_0E^Z1guyC82 z1eKL1ZfI0*iL76}-9J{L-aAvJaXGAo@`0AWp_NOHC;D z4UCN`5+e2d`I8J}q!QmRAYiIkU*gjy%d1xwe}6pd_X(`8uYZby>M0;9^B=4&sk>d0 z+nAP@mUit|9Rm3VNhpJm@)1wqodP*nSp8j;VtuCm8bl^NZ<-7Zl!bZ#R{Zp3VCKPb z>N4l@^74X}Qb}~%_u%mGrczdYJLD$G7(SQ%Ar~ooP-X2x+i88UO6oflj z)l(E`=Wj9kD3DzsXz?>jM}E_s5{!F;f7Ur zB(y;uB+gBK0X?imOY++LhDz|0$GEm2ws6fgJ-N3b%o zx@$nw!a&NJuPmzF)J(E%ay+rldZGH}3aOtvffE1%1lm4Ymd+)ls7hqnpRSHD%DTF` z^r}@XJtI`pFMkTREPqmlD6wfF!A)#Z0V4veBVOM5n!9kq$kSV&1o>rnAuvG=mKGPk zW@YW_?iT;_$;aQn#_jqFpm2|lCs&3BaKH&*7yNMtM@JfFALE_V=Hr2fqC`JO@p~4&G3*u8!Qlg?1LDj%iKpKLA#bZK3r8y~|J9qCw z<4+G?Y{T2vS{)bu27~ zxG6J^mt;Xf*vID+Sa=ZNunL~5jWXn7Q;OfzbAfSy{4Ojj>+bG$1y`uq4l(xge!y({(e0(%DHDTog#CGmqy#)yaL>+XGo`!}6ltO<0 z{{8$Ly%bFtg#UvF50a9S!2U%?MeR@Z6BiV0f^@Y$l(P)U?y3av8-YMT;w=C;0o#pR zgnOpO!5ZN61{EeN3Sn&0($ebcT)}yQcA%;QsV-RGR^|ee=lOFj@Qp#Em`vAH0^x;z zRm?$dK>dg#q9P#h2X+F$gRfKd+Vy6?a_^g$a8wSQ zRfFLJH_XBzH1FU!Zg9ZO@(*|(BHy5;n#bb*6 z-<7R>gu|WS_$p#7IJgPURQDEyV}IdMRL`VtVkOb~|M*|uHAVhH43u^$y(LW4U(A28 z#p+$ye@~IKC#H&tJdh;-P&_&-0p+drJ{dHGp=c@ zYi6#kt8cpNIQ@#6*HhpzNz9`|ItB^`sfogyv0n(z{7KCd)j2jjJl5@XP6-gm%ENu8 zXfN}ST>)M|gM}4VG{2-H-&|OfboSWQn(&R}8S$9Dr$WPr3UA^gb*JYv(lNmXLe zg%9HxsqP|TJ@yADpL9fH%itl8x87Pp6AaSYDMqrfG|GwwTt7zs4pe+YPI^pjNHC6Z zbEfM140A0}eV_h09ep@txi-Y7u90YcA`-eK=E^0UG0e@uG2DZR?0lZX9F5MqjOMus```aBRy2 z{^z1CKFSCykYmqRsmapQz=KvFp}0Sd{2O3G-!+dF`ntHNKCCZuz(XMpGr|P!F;X{XBz1kWNyAq6jxWTFDh*=K6$y71O5Gp z?>LT;=>CeCIahWnfbP9M0RiD~_LiPb6Ea-3B=3*RpZ?K9Dq><4>}dm{VhgM}l}21Q z`NH7aZ8DKB<<-T-wRvSJUq1Xv(c0oh9kGS;)obd&(nGapV-3^n{n7Y#;`UD`aa%SW z>c#KHwWeCaN`eQkZzksVy21Xo+vl~(H}zkaehM$vUvH7@4JR@OqE`8&t2b*InJg?W zrEXG5a;TY!r?<%H-Bo+StCc!AsxTpSEAs^Q=yBSuB7R$pGDqc#MC4-x2I>;ve#Y|= zE|kfcOU-C?Qs`b;U6sudaC}hnYbB?^gF!X^dhw2(otPposmbOzadK93a&S(J%CUvOIfa$Mg@uVSdZ~W> z@y*-;z9>N`Zp6;lW;-5E;~16qU@c6>ZU{V2E+s)pv#O5UQm!_FQs9${4Rgoe8v8{actbhxH2D2e}#_&zsxEfM?valT@Xkqsl!M7yWb zv0~?d_c0Jkhs%pq>_tw)w$64=m(}o_fPMNU{QUN;Gv}Rd&z|B&$5^TGI)*ACtEp6JmHcg1 zc9v8b8nWqX>)DO06y&P_6inJ+l#bEbAK!mbN|cfyCF&wk(mYQ?I8aj=45SATvE@og zh|tFTzV-7(S4?^2Uf($9kO?f(&klx5ict4bkwND;*Ev zX<%%yE5=@b)IxrQMkL(X<)||X%a4@PM=*^ldhm$BZoYRUYkOqA>oz(O`v9XS5x=5h z)Ys+ijq$R@aoxkap@AZw#Q5ws1Itowm57E4E;j!Oeq4flH?gI+cc-asKug^L01Ngv z4(GXz6Ne`rH}au3d_sq5zkF=UsQHH{CIqOfHr^`j^skNG@Fh9zm=INEvU@WE<<%!^yC#AHo8un$ENaM%~r_FWxXcM_A zDyk8B@c8&tpFWj=Fc_ElCiq^^>D4W;kGZOe`5fBE$E*C0iLkK;veVoI1?>s8@pV7U zG*!g1YW6emMCIzSjudfkGZvM51x4-jQIhxLr%A#(#XZi3T?wyQSZZ9;h)eFhW@SSS za2ED zL1JQ`K8cAvzSq#yG}tsa*xx?h-O$!O-OxAIToMws6jN(Uz0+!r$L-@!bzn@TJhJU6 z*lK0#IU*mtotc@$^JIt6Xgqf;Fs>TRqSB&ce}8|{scJP2H#J%(A;T9^)Wqg?`ua}F zrb1Fb!cDpS39pmVhH}j7_4M^;YHjAv!V--m?lP(m9^k9Z6nx5aL^mGF+g_Z{X(J!4 z7}c+*yFMB$d`D=ePWvC6&b2V9sgs9gemB6pUn6I`H9fyQgYdf@%VAj~AGD?P@K&0) zV4B6}n&}auyWS5;nU2Cv-!;wmVhdrAj@6fQOnqz;Zl#~FwXkx1|2QZ&w-eo1Zu4aQ z`1y8DiPSk-L1l=TjG9UKna11q>;}Ecv~rh#w%;tZTQ3TA{mN3_w!!t>gG7aQ=v+eb zzRoKsZnSv&x4Tm+cZJjWOx(ovM0N4KY5%RB#N-enq6AKt;l{=kly$W_XNT)Lw;(bu+w*Qy{zpdkBPa$# z*|1)r0!900n3UW8-%K(=xdkmLR+vEV;-98C#{&X(L#5kjO@cy~rK=+@)mIE@x2g`D zQ)d2YvW0D;D(E%$dtPr&$qL`b!G7<%%Sk)*KMl{Vj?`bTC5+(M=KcNqopGsaqQ*fw zz6XQg>?rn4!Z;TPj%~5_hoH%`5p_>hG|oW5v_}B2*_E6|T)xg?R|~~o%1Eqx;0e~q zM;oIRdQiq$jsG4K6@^K{n*Xj`4YY4%0?*k@eMj9{vdmqoKxEC}XOH_JmGlNOf0R+% z@H>KGmI6V`<8+KmlLeN13zs=&t=qQR?GF2q%-!{Zb>kD9WONZ79l;EY&Bj0NtraM} z#EU*?4Sn4$lY@d2QVZ*yyDz$BCntHbbGrTgT#n}1(XOwwwZY0VME(&RYzbJ}s`;$W zW{n`G=HLSfPlZH8F%JKuer9IvIjj-@Rg(7%5-Rtg%n%U6LcpsfI8}A1mC(%Vh@--G zjwCq;D)X3ZbSBdhTSzE?VIDsB;mSjel3$cwMypIn-Q*KA$4Yd2RsDc64k4 zjEHJS8wp6@^78Wd`0}vd$jQlR+~c-AIW~4^+6)5`he0oGgtPf%wX*9-Nm2KYB=hTE z7p?LPN9Wrylx`e8cR#*=pNv4^RNE7IzC;tj5U;$~9Q$)2)g3>7CetuQ@2Yfd(0V@; zY^OdQkz`3K0S_{jdaKnxQK9f!TKnSku+H?ZDD|EK%gVoqd#G-=E1wVoU6SqSn5Z_A z#bjq^hi<`^1n8NFNC(yo{$|6MJ+nXO*!o@ZrY5oGjiHIZe;;j*;~2#V1(Gl(n!7+I zy{>|lM&?uSQ;^y4xz zf-C#wVR|P!6M78-m%APiextRQJQS>7m)$%7?um z4EcfZF!m#i`^~)E2(pJ%BjaVpKxv3N_Y4b4EgB;H>aVgTiDFONat#Ogy7#kSzkuB| zsnx>HtbmY@l_x}m(&8#&43EWsUGO3g!UZDVb1ecjz^p>^jst>RY}?#}Q0 z?-GVzLJjWB`YA-jr9FA)s#2LB+RXQ?vX#QN@HptWrT}og)P13oEB%_nz ztGO7mb#^1Aq8KE}+f+EHo`@tFs-MDX0!fd43iHF?G_M?dZg=`yamlTic;tD`2Nk`K zQ9Y9{*e=(G%zJ-4)3clRiG!x3HSf(EOg8(1TC5pB}J2a^13sNF;_l7U1XCQM?)`_weQuP+|1v!Y8LBZ$=Nuh20H8(6#Yz8Mo_q@|I88qoxVWUSoMDGsL`1f_QFlCdnO$p{ zS?&4Ksfpf)7SG}g_wIx@))yaLQ$_$s+0hIJ5-p2AbX`DZ-B-~YfhXk{hCfFU(9iRs%(mU+ zj8{|J+S-Cm*_O7JmR44_pDlh65k(y38!jUKw1XW;GtTEziTviZR&9mbfmi#OVlm(A z4~PGe$>%#RYCSwrCVE@4$sJra5;2P*(iQ)-a6iL)EH&GK6rd?zMYRNf*-E&O=5k*bmf?O$9K~NqKL&sMPdDQT_uO|7qjR8 zUk*v5GL?v(%kp0bpw&=0izSvUf*~ ztory0m<<~JeT%uKT{WI6W2Rd_fj#{xEH2AkTutAk5>_jpcJU4*HCNG~?k^b}oN-m$ z-3~O>#gmPybY*WVXbdq#A!w@Uaw)-;;_4MnVG85n}xhG|_@NFVd#5BU1?(!7_FGIsl4 z3~}E%J6Vr<@chmF6)s|DG6Khu zS#kf2*XurRG0s<|e8kt{pPjk60}*C@{76(BQc2n`I>cL*w+gi?fKU_&;;=0`~eSWq1vy(mOz#i(qOE}j{Z zRHWZN7(geyJ5TJ-pj-}!n^>Y+>$n)!K^4|cE3a1jL=8Ds6JJDFsb%VsxI;%&^|SxX zM9>4z)`zcx=#btLpgeeRy8WB>e&lq$`Aq2FzePUCoPm2yS@QCZyiJn3ZC( zBW3cXzjaGVTUR$s-5AGHAb9!dfjv*(LC(EN2OKl4=jCkd1GZ1?Jx7~f7J>U#;wN*D zFnLwJt>W}49XYEi0N+#UtW|chZ;&MZGwuY_bl^*^o-8CdDr@uYk8=Oc&h_JW%*-cW z;P>swF4)?YW!jlfnTw0&utI2*l~>l+jk)k@UcPv}zZUl|Rpt!!E;xroFKNiBU%Xyd zbPg%4j7oYI=l1!%u+iC2bWVjwp{+$LDrOji~U~??t48`!~D%BYWU#J$r95N z5lTMFT>xI~`GFVR=lk&gG)VB0MpsyZ!n&;7rmUEWb@qc?+s990m_e?1q_`=PH2?Ea z!Vi6XZAX=&CMFcd6qUh@G~^1m`jjLo*h(SD1JypTa_DY)?*KM; zy;6kh+u6BsklR^u&^cIgurOEx2b%i(i<)|a@%*I-wrxRkZQNI?4d(FoK3+KRllb((r>LwlycB(^UiHZsb`bkvS z?hiMlP>z^QB901gQ*CqS$nsQ}dQgb)qPk3GFaPcj6zZCDcWxGq| z7ANHP$ihNrIE*ImGR9HPrnsa;k|wOsayO_kftc6ftboMnMM`on9!>NA-V0DllK2$m z&w-EjP|=M>k5AA)XWvzR;SWpOB}vm9mEw(&y|zSyBJj4j<&>-Pv+M)UZS}Bg%13DpiLnfmv+-#?eidFvi(_6FdYA+^tQg{yRMQb7k}`{hcEX^ zY-09ST3UWVPi)q*uX(*Wm)k0&JsacGhg%alZUtNS@1KEjlpq%Kd3UeW z3A4oZeg9aWT6Ep@iqsZT-PKh_ZYP~SrFW=4;|8Bq&BJ#CaKkW(OpNujl{L@A9Hj?K zHgA)YX+uJ!hfUAs=hA3F1icC;LUZpeeWz@SjC6}!Z$015CMge1GCN)TiFDhbOzf5I z;&t7%L)^h&*m`-sO8p_nT-)FS?R)&MSXl{pKL7UbsUH?kbl1?)pb~=}r;BP&nQ0u) zYToNUd7Kz1_`Y1F)^dHrGjaH;3yJ?%QHh1M4aNgBdF7U3rJ>{2hsWmqf7{yl)g}0N zpUv)-#t>ak)@g5FU9c%nrL3K6d!4eIZfKb6(?!4y88dZmZs++fNC)HPuh?Tww!UMS zDmhfhGqEy#5*4np-fq~sM2^TIw%(r@Il!DY9;*q?D;0xXcNQO40&9`$t_{WX^hlBU zr6#`MH6mjg3?>E!gp~?peRn2!U;!2K>Fs2^jCs zqlxSjNF|wSLtT@Tbnx6jMH7{OVa736XUl`9zb7@-`6_#I5#;=jhOY}#p4cu%V>#%5`Lnm1yERi1%;9o+mbbls7IfO!Q;)GV(J|J?|LB|TZTh`Q z@z!Db^W#;yk&)K%b_4}V&)i(WWX0j~j1vYiPq5SM^NVk8s&%Pi9eUZ;dZLczEvd)% z_&Mx12LEEF`@QCixtjgnaM`q)fA_;=g|)ot$go^ESq)c>m|r@a;o`{rjFaN%B+6Pu zKL7M$zD<>@K=jGr|{?Ke&*WLJ5zSJ|yirKJSf*$~l+M8&HK z2+VbH9ouc3ZwJ-eEuZqDxl6VU9!zPPml}@&$TjC8(oz=|etrM@u2uZ9NK@o?p1u$q zFI}l>ylq5^ho=`s5G4`c5{p?=V>_T;IrCihb{7%m>PQAZi8`ED>M205Pj@8H8>Y@? zR_Qoz8{Z*sX-UYcqp?qcJ{cPa8+t;d5zmv8yJPDQI=p7ykqP1aO7Vs2$Fd+_Kv+7- z#^xYan4LG~)#o!EX>4r6z*^PCK-0UNC5DwYt9 z9hC4G8y8N^5;wgwIR1_0CKmVxn!xvmz?5xW%DDW zsboWEt-6epW=%b#z4agwLiWs<{a^il*hEfT6S`gShuo%kw5T!^p`mN2scR@T(OL~SEzPHD!L}1JP9vLB!Ek-H&&gVw_69bBlA7hi zcWsre!c~Vk-^GP-e1jX0-G}SxDVZKyl{gaBIFf2xlVY9Io*cJ{+%o3~+dMp%v%=2; zAn$;*a42;UO>uQyu1#!K@7Hpx2ESsi?Y6YEeMAWeVewa_@jkj!&h;M&ePKmm9T}OA z3Kfx2e|3snYpdxa_Y22|&knba4r>$<;aDUj*u+?H^UO0|IA5WSafVS&In69Dx;{^d zLYLZd_W>rEXL@S7FXsACex>bc|AqT;-mIyqZd6mpNq+w62xq#bdOUy_$m>Q3Tc|HVDb*1%VV{{Uln_2v^R{wwWlvEc&0&A2ohlcKxRBfKZC8ip0`K=`kMlBit4pY(w3`=3 z?cbHZ}DVwc;WWp{?{ zaW~1sJvV28x%^9HyG=fOhMgjcg27RRtND@rRB2}@M!h`CvY#3l>q|;awpKm1-NI3kn6LNXD~+ z`TI7;hI{E@b}wnF(p=WV1BeFkGt4LJQXC5!+Ztwz38b4mJrp0b&;14#AtF~M1qIz>^T zl&GgpkBE!R2FTRu)Q&cN)ln55e({1wjp@5orfN=*(pMdrj@4fK6yrCYTD?f&rMVW` z=0T~m-4EoLD$#TqqW^4!{Zt%ocQv0$=|ifY^*EC)D}9_1adBe3uIAz8A2VsalUXRu z`?%msyH1ha{W?X9QRKk*6U(l%0=JXZrb<7;TA4%~xF5p@8`hH&@1_GBy&d4^hI6KH zAzjCh^a(LmfiB~s!`~!keEq-p+pKst+)T>j^@Wz zj4o39)A8s4H#(&VCXL<|pUV&a+egD6vwURWgdNiaH_l`U zzG$j47HOKWoMBUw!6bROSVFs%VzYfY%iBUu)s~IwoD)%pedk)Wdi;-$NO*^wYZp~M31gk?3`u0o9^+iOc$!w$E!B4Dj#nhJ2>UKmAi^@9ue?bMn^8d zECo#yQAv1ReLtfo>PLw8)2PCu#}6*7nztuxoe!r_cb}Zm zv6)>6B}~>isXMO)Y^m-$(Ytv0S6Ol`KU~_Lx^_M7!kjCC?P*`w)r>lLZJQo3Z3~Nk zBH(ou?hRX?ySVEe`X)+I(fz65`&Q?pL%V)-)Pglx*@%nnl~0y`8f%5~2pO;7 zWVyk&v7i?Ny%zoBdHrx17q2R{gN$-~t^?z^U3izHOYCfd?v%aSN>NOq>^eE~PH??ZF;eL1)MwY9@Bziy|~D2c{}r#+iPRo z&0;mkIJNpYhSFBaTL$Ovp}0$y`ucG^evDhYT;JG#ap-1J?>H}qu(Co}747e1 z*Z2nT(kKn&X;bWSX7B?H4d%w~|@$rS8hlxm3iPZSEV~ma*&S_@J+mQha15n*l{2 zFM1m8?x;L(1XC_`0jCt7c|FCajBVKc>0r(xZC80=nUO+yAcxD!%BNE7X!;2|hFGq~ zrcs4Q-7~_LeE@kgd{*kK-BBry4;mO}+fH!Lq4qac8^8;G`r- zO_Oz{qxj8z)A>vLsf+&#LkYJ^zR*@6)={LTv6YQ!OY_S^xSgKd)s;}^%h2{gNUczO z-;z~vuC-PYCE;{s<~T?@$AYQa;&N6oxvQAs$XXgtj|FM2c~-|>4X`nweY;ZR%n( zRFF73iEm!?*O-SVf+cLlUCFHm_FMmr(pru4 zu5+n=v*_DL_k_;z>)%1t%?TRVH-%;zl*&?wCxkj}^Y%=H0ZKop99I-RcA$-lmb0|% zc6n75l{5VwZpiTX_lSubKkUk=i;$Itxt-eoNpG^@mi*7SyhoHxUv;gVu=1{aZ)Kte zIfpD?d~15y#U2tBMJ>La zAs=r}br#e);o@6czaDDX6a3({W-Zu1B>i^1sMvZBJ1Rc+AGx)$OhMq_*Q>e3^-BB- z*Y*6!OaMp<^!3H4%!Tk7i3*Ojp`&1d+RvAIpG?alfy(x})=rd}sC6}VwY0Y@n58QH zfC0GcflpbBNQToacZ-*Y*h&Gmvu;NUmd zDhetFq<2CKB{U%r2m~_QS+i#Tz^wT+=fnB1*Gl#&d!PO8=Xu`e9ZmEygQY8GiaR|0 zCp+89TCh)%aX@%vwMgI3T~VjYZgf~F`_tz7c%>B~tOigD6L&|yl!d98PAE{-lpm@` z%Jm>B7#RhC=4Uxu_l2HH^fV~Ua4Awz-P@Dw=^!d3rSxPQM4<0yZE4HyS~`dhUej$- z{E3-nM_)v=9P6XEG(uj-?{|3WHxY?(kTpid+4v#dzefY9>)(4j*DY2oBPfs6c3ES>}*deAT{~NQ94Jmjr~U=}$^drw7d0*TL{4^DX&FEt3;SMd z|Mh@E(NhfqGC1&MsxsT5ynm2zFCUYCQ6k%~w9;jT5vFnK+qa(veoH?I{u1&ha;)3i zQChwQUB{iR{(6R=M7iE8nC^|iZCPwKRC+T5`OCbwPc|yOhrTt{n;KmF!CHEBH+n~^ z_IxX0Fc%JOAzur;bTK>oFqo_1TRxmw0%T9*OEP&JTp% z>{d&;p)}B3PXe=!pBdl)P@`9M@lp^zWjp=&0}ybNGmF-YT*oxQbi)q zhHj0Dc`X&|?>BZgj1CEcPMHIEFj7uf3w>yFIpv0>rlBFWfBxcYW23u0a*M-B?-KaU z|Hj(3%vDp-rrD8x<9$W?PWa#z?}=_X`agF%<9HeU)I-811lypgjfx%v6VKbn_e93$ zVCSi}7A$k@(ee{I^OrRD?bh$#o}_XlEt%-&;rr!{MB}5wu>!|k@3=!tX{Kkt#zg6vuu@2>;0dlMMXy}Ud1jlMCqiK;LN#!&+_=6 zF4c|)gx$@abBmB#=z+}W2u;d}WjD9Tv@v#TsUM=vMCx7YRCijeXA7?8u0Cc~y@I$O*ADwdV~h@;sU&ULNd3>=>EZmIXR;@IWC6YuVNK3+cI7Z|i$G@^RM zdLA+ESJi<~P~m^|nX#}(U+I=jUGJ0-N-*6JoebFYwxz@RAEiGoZgHtDbhX+0wqptG z6#}V;^>w4A{e-HAe^J^;*Nh_N0(_Vk=wI2L#f1DnhlI3*x^{NmeO}=*no?(uReEWw zVn(p_Jl}U!u_|CL@8a9`*m9WaN_*n=+Xf3~<@ZE7;u;ef*>7PfZn&?6KP=+A6xJYy z4}#dX@`(7$o-H~g`;B^vJoK2pTU$;2`xM=UA&?4Rc`q(Bjf%r>e+rFxqqgBpdw^QM zA>B#L`9wSj@C=lW&&jQqr_m#C;eUWFemT5`u5Ioq=%QFzSXI~!0VV?w6)Mxkk&eF0 zi_gb8#m@(-J4v4OMs^24nMOKy6WRScl zu#qtORdO1u`119ux{X>pcQ7Zcvt-`7Q^RKDh(jOl4U`nKZQ8UMC(fRG6LXvmr}fhO zaYTObY;J-zm)+((*BiV}*8^xxJX3ll=EocD4N?3Rt0oUm?M%2R6|v5pItEAl{S@6QO6<eWr6a2wHgv096(E_MaD zML|V~*O&P8QX@#6F4FvLx{Qo2Y0FtDgtGAKx<_Jkgm3aLi|M|sIW#c|vHDGK^n6c0 zWAousAzC7=^8U~}S2Sx?Nr%k4UR}{zX7Sts!dk8eN}HilY(6`V*zI%Z^mxNkpmI{3 z;qR{_nWkw;HG(yt(Hi-Rt?It%m4YMt6U<&-{hr@EnV$5LQE6?{zBS~Zc}@DS*lz?# z-xsnoeqK)%Mk};;+NgKy{QBzJ<-g8^0=V+36@%w)c&jZ`WYUteNK%86W@gInHr8Aa5TxYE*LF8gLWw|Mmj7SCF@sut$cbn@~mZJDn=TbJIU!_CHxR71+yi{2%?f@w~yS( zRC{x%8Q`Mp0m$ZF7!tGI7p)%sq|(<0woRkTvCi*1-vqs!fb(oG?ZpdF8bLk7`;?O} z^!2~gL^C7gv?-DUmC0=FdoF15%oxjK+?^roNQDbir2(ms1p}9adC<0+dUS8 zhn_YJoE&<>i%MqT4V@I?C8eY+rF1=KUmPDfcwIrk&nz@_(L6UgI?R!eK_%h#P zr77PCY-C^<=Yz8961s2gce9b3o7>9rimlf>J}s2VOGYC=L1P!dpVhVI5asqH`uHTN zrs|?6%m9%G*7x^fM6kIisZ4BB6_R3iD9BCyF6QH+L&UqY7Jl(@stMTLv4P&3qs6nm zQORy1y_oO~+@{Ux*9V17d~cV}Ho@J)&Z_C7M(&~AfBR`8c5nRPi8<~HFdJrhi6j@L zYX)Y6I|9(@a2*XqiW#Y?dHLjgWPm=vN6Nl7<$BF!GbSm5Zh0dPK=z2I$3{o#o;`c!LlARIzR~pa=RwDe zohAkIBX$1m>VP23Q&0eIT3`RV%c+nttS&#S84Z?ndTWtQ*v0H8v<$7;m*3bd)B$`1 z2fKMe+lN#HTy3DKXEAH2&1^SZUvJM9D;B=N09Ap>U@LLx4)gYv6%RT2{{417D4p0> zF@R4=!gPZT5R1+a8e?Ti>7e^Zm>p#INiK*0`)**hSI6KAvEV8J4HIt{;2%gKdLQP6 zoqP!i-&!G7X@Z@*%&d}tM~5sxA08DGvmwNJ$S|cETGD>{3{~fxMyZt@CmZ&P=Vyy*)pIuK+^u`9n`uHx4$Tjissm{_1F=H!t^ z-KSu#7cXgc#IyS5btQ(ae?K>t;BIEc?HJ`XV`$BMjeMMY^D2HaCB%r%T;=R*dfiK| zEvqe9-zd(2*Zr!nSenL0i1eIDrc!uprdK9ETFV4T!gfq+ocAF;7Tfqh&>~b1l>B$@T>uIWKx=o&) zCqU=9<;&Dd7TJREp70pk$X}M}>!ZUpkODo6O4s^b+RCgbvd(^~aDj-X7w^o-YVd%j zzq9X3@iUP7k;F)&de?1~eRBe?2E2aa4#AC$1t!Gd(jC^vPxU$ahNGjSZPNJ&`ycGl zz*Zw$ZXom9^;TsVFodu=*G5#n6S!Cn7v&!M)W35fCM?W5;Ap^Dd52C>nUqd}3j%@Q z(B4l}?Ex3h=v&!D%Sag>JST5B_f9@SyeI+O^RB;T>$*KUKmqQ#;P&BcL$k({UBu+h z!b@5@K}m_xVQ#Yp6zbo*r2;0gdg{$FTh#c}xPiPtyXBWNI$=SBnXU^(HzcwA*Hs)d z1OCI6XzI$LLotTzZ@y0Y!50?S*yf7lf}`3&Zp~2?dI?wl{-smrMPo3Y><_1j%tT)r zMUc*`(iW_yOy-TNg<(HZH(@hj)-$A^xu(+dK;k2qc1No@=wLpN!@G_wZ0x`@Qj+Ko zr>!EH$5BiA0FD(BmVtS*vzO7GUV?EO2 z+KOi84cDDu%|oj~9(&qJ$^M)r377Vb(RO|Oz{GD-!uVxGA|ee~G}Vlh)$+e;PSloq z7)_=jZ0&~px@rFYF0}IQoigDM0x(F=lWM-8zV9VvXu1xEMTZRUDuLK8uJ1DhbA?wO z?v8KOE<;3pxH8UBuls>2AAj3ACf*E+WS>z42I01|*f`61FP{D1#{%j*v2gDQZ=|PZ zNC+<AEy!riqdrXAI@wGx%FS5Z&Cm1%~E~-$-FMiyV<@KJa?*} z&SXhs1lv{S^ii#@de~lfUSu^`StLuq-WlBb3T2QN7aIO}Ed0iV&knB?6AbG;9X6o(1Kr8)+rnKA6N ztkJE{@k|Y5D#U^BtRF2TG_2oYapmZ0j|(P)N!!#gD_VcZXfVu2aBKM4{k!d#cLzr{n6}SZ48gEw5%@1?cJNABRGr$6cN0Ki^P)b>)jJ5CZN0Cg}tt;P|0j zNv9SATGO+Ztt#wf%w0)I?MWBIrH&6fGPWHxH8RR};^M4S5)(twMaS(NL4x$K5Xrfw zE;n~M_i(HQ$zC0#8fc%Yx{ARp=OzPx8mP`hZ)+&bLd1p4shKp`ytgtiGS?qGAox`< zrFGV=N$gMGKRl9}Z;jG$PQc1~ub6E3$UfC_0_@gHh%#z10bH+}A zjlWz?pAQ0q5lP6xEr}jgF#LdrbGmLD;N)+`mdLt zSq$u^UjI+)qiRoc80^1)WQdm-~7Ax8Zco? zaB*}@$Gsf_WdO_w#?+;y(#Xij=a-=c){icz7C-RxBXt8E+iz9wAH$4K2bKN|!GD3o m^1!hyFb;*y{_mS7ng9GIiLg!z^ZzL9u3m!uQ+)Ae + + + + LocalSend MSIX Helper + Tien Do Nam + Images\StoreLogo.png + An open source cross-platform alternative to AirDrop + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Text + Uri + StorageItems + + + + + + \ No newline at end of file diff --git a/msix/Images/BadgeLogo.scale-100.png b/msix/Images/BadgeLogo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..ec54700cd770b2680fdf83168c01fb0984dcc556 GIT binary patch literal 973 zcmV;;12X)HP)CCw3`6dwtKK_7)6l%al1Dd7VwdZ;0YeMmu2^pl^J7AD~f2^E4A z92@kbFdH8q{S=5!nMEi#5jr~K8+F?IjCW?P&gi({{Oohj+WYLg_Bs*{f=ZQwoSZtu z#ib%VJW9lDwttwJ8ApHrJ=pDE_d70mjRpswz>y=zv9$CJD=Sl2UtdIM=rJrTSj2u< zm8dK1xbjFf`PLk&$YOY`|zNq~*KJ#KZ#R=H5qpdl{yu z-}+9FoLq^bqL)<77QTP)-S6rO{QA|0fPe?Mb*mHI-8zhoJ>Q!kCMF++g)gzTW=C`L z70k^I`klaL`-1xVOq7@R;p)|=)Yf@Q+U8EcJ->FX1>4(OKFB3#wdbMHoTf?xV6~d* zn_+PKJd?Dx=Ap9kBXyx3wY4THcFLK6f2hgShRMnId&p0oyot+~YlvK@h%YYwg~9L$ zQ&Y{ZnAJLjSFf^=l9ErHk?sVnmeJAbJy*}jc!8{}yI$MElD&St34?=YF)&a;5ywsv z6N$s*zB)^crRaHGXXQ71l6xXE^A0SQ2~14X?b-<p&}?5x2ROH0coK?F*om-2+l z&}dTqCYKQraaxgJX~{}Mo9x{xSc->-*E5nZF7_5ru+9&Q`FZ6T=Cs@AB;kr|T%O<| zVx7zGc@S1tZKR|RikR8_iO$DL!g6I-bYnvd5$oI^7>!TJ1?-Age}5^|>J-VRpYw$B z5V6kp!|?DMGPh@5cGj8O`IC9rl9CFDv`=`744zPnWnAc7rP3;nb6dD_C%MBFSF6(z zAFs#Hp9bp8P6B=`va|0aFz^9+NhbAQPU4^meL?+fLR8d6L`JfF1H=#Ip6_mpT73pp zRYSxRNM`qrL(T;J5_NQx;r8uLl$G@fS7hUo!4qn+^or#ROkP@QBxgQKToqVe9(N~T z@JrOyr4xS6mfO&9i7Nf)x1{}Lo5 z=-C!TvI1A^dOe9oyT}200000NkvXXu0mjf{ literal 0 HcmV?d00001 diff --git a/msix/Images/BadgeLogo.scale-125.png b/msix/Images/BadgeLogo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..4058b451c19c4f90ef48226922701ba3d2f8b17e GIT binary patch literal 1123 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 YKU9V_K$Bg;p#T5?07*qoM6N<$f<})zOm_49W_M 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 literal 0 HcmV?d00001 diff --git a/msix/Images/LargeTile.scale-125.png b/msix/Images/LargeTile.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..0da1cfee319677979f1c1108dba03a0f61ffb4b0 GIT binary patch literal 26831 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 E4^M?Ad;kCd literal 0 HcmV?d00001 diff --git a/msix/Images/LargeTile.scale-150.png b/msix/Images/LargeTile.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa784f055ca5d94c59ef9e86b1a29446e8bb30c GIT binary patch literal 37602 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%0AWj@74ozMM^8h)z#T5DisbIXJW@JmO2XL`_0%W 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 z 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 literal 0 HcmV?d00001 diff --git a/msix/Images/LargeTile.scale-400.png b/msix/Images/LargeTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..0e2a374e88bc87d5dc922798d797ddb871451dbc GIT binary patch literal 155098 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 WiT0oHt;-$&0000+<1;eo?(TxFE)}TN4ba|R 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 V7N%CDNx}dC002ovPDHLkV1nkeyiouE literal 0 HcmV?d00001 diff --git a/msix/Images/SmallTile.scale-400.png b/msix/Images/SmallTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..796ee4772d13c5b0ab62c79f99030ab16d505390 GIT binary patch literal 18080 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 literal 0 HcmV?d00001 diff --git a/msix/Images/SplashScreen.scale-100.png b/msix/Images/SplashScreen.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..8225797b52a03f04850cda8f295ec2890acf9690 GIT binary patch literal 20843 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 literal 0 HcmV?d00001 diff --git a/msix/Images/SplashScreen.scale-125.png b/msix/Images/SplashScreen.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..bbfe6d1143eaf83ec4ee7f6820f60bc60fa1ab99 GIT binary patch literal 28483 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%0DOzxHEwnnk6N%7kEBU!I2ftK&&J&Bk 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 literal 0 HcmV?d00001 diff --git a/msix/Images/SplashScreen.scale-150.png b/msix/Images/SplashScreen.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..753e67963bceb5c19947a6b26b9fd2755f90c74f GIT binary patch literal 38794 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¥E4ryL>(PvzS;^vb4$mjeJZg<@ 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 literal 0 HcmV?d00001 diff --git a/msix/Images/SplashScreen.scale-400.png b/msix/Images/SplashScreen.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..0df77ee9c03d991ce2d6862d67074935805f42e2 GIT binary patch literal 160133 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 z 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 literal 0 HcmV?d00001 diff --git a/msix/Images/Square150x150Logo.scale-125.png b/msix/Images/Square150x150Logo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..62d390ef32e9345d05101fed269fd9010fbef665 GIT binary patch literal 8692 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 S+|P6X0000L#QXI6OyuR=CeLZ)`5tm}?;_i; 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 literal 0 HcmV?d00001 diff --git a/msix/Images/Square150x150Logo.scale-200.png b/msix/Images/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a0113b9e3df94c625354fd6777f26118c9a595 GIT binary patch literal 19265 zcmX6^b9AK5)7{TeoY;0>{+qP|Mqm4J7*c;onZCl^GzweJZbIzRVermewslIjV zcBG=b1OhA$?6+^<5TqnUmA`%aPWRsj8WQx2r*E9=w{J4gQldht9^cP%pnO!-R=@n` zC_58>gn<75PoU_0nl7qOfqaUCYy5f&~0>2*m;y)x}W!_4@}2$*j;X zFJT2q#^kaq=SvgG1S0C@@to|dBi2mb02{q@z)&;CpR34Bf)QO-*l|?l|msTgjDv)y_EM z+}e9a%E1 z5;HO+@uWi{8$v^R@3!uLsA~GNKC!A)M@d>UMhl`ufDI<4m{d z5T06c*zWc;F()Kd;tk8rHkOn-*vv%ggBV+ih=dWXP!E>+>y^AT9~)AR$?hZK*ir(9 zMilSIl<%ZMB3s;8Od?E*>90AmIQRP(7{q(_^Y!G@q%V#V2g;A3(3=` zBqMJWmX!3i%BDA{e}U^V6;@NKy|vXLlTF;Wj4N?w$6@Rm=L7BykF7;dWFgJm=oJ;6 z7k4>Q*;1AIIP@r^;lvVBD13(SRj8B6^6c<0ZmI5CQdwkUIaM4T7dV^#ab61QuYeeg zaZFOw?JW>9c6>Os8?f0|g=PSp_AE|MIUrHi96E3 zV$rehIB7aQUyI)#GpB|7ktC$K5ol`qs49tp9*rvzhbO*Ny%bsolU?q(KRhIz)m?_I z1DqGvTJ_uCKQ9J4B+Qol&E4|XuV{eDj_QGsiS_yVsK6F@7g&&&P()21<3Bn-UpY!l zR4QuV{(l2Jo(8CmwknZW9Fb7S;m`^nkIB>pFT6be&$QV?2O2~yy2jf+q!DaxC*%gL z9MJTT6zVo7Q<AkSze;`Ky?d)XQ+@0i(z1v+=^JUS|3VjiBa{FkUe zHclWL*0aSbQG;y#6JPte_y;=jT1k-gnwK8qfxr=~R=PFDJ&dxoT2`t?D$4 zc00=hs9LO-e1j|;RpCH>IN$8D(`he)qfrus_b6&xI(NWMMf~YY48K_OPBOq(T_uxW z*bY+rX=KDh%E^iL@-mdlA-26cpi`-}@O^L4mT1NbvB|Ew&0C9LYSgSfjL<(@H1}Ab zSgtKn9XC#^k%x%i7w+o42DGF!!iC~6$18UjsFiOHAFqsn28$Gjr$@-ioc54ZS}4Qk z>m_7V7A23Gwy+3-sdAtLl&3oD&D~UZ3dad1B*O2YIQ*?&W`}M*cN5WEjz;0L6lD+$ zfP;h2x6(qtkLD1c!QrP@%X5}Wm7fd))kxLU=g#N8opNEiy*TDKpB~wpR)ZF=rrUsNvf37Egme`irkbf=UP80-TC*9Yhg}2u4{A-yLUu&TC8f`ZiqAa`D)$h zOFw&3E)Q^aNK!t_5Seg*pC3Llp*|88L$=EJBrhmHQM}+O6@XyAagGsDzkj)3UuShO zDzpF+6Ov%Uy8KtVXzA#hS5l#k+3)$kX;i<5hgg9rD|3)CGM4`MVkFGZx0#DCjj|_b zK0KYZ*qv#6z_M8PfOEUdj^1eRQX7`834>GDj3M|S)8%5E!{-HZ#g1LXMzGVh>jwYx z%^Q>;z`68eSx@m^GovUG?3scyx9ZCWk4X_oJT;|_t4MtY^IrJD|!+(Ds(=SmW^$Y9>OK^I60*V*Sy(H3Z z;l4fDCof7Sa=XQZ)}HV9`Z|Oo<>lv{-*nEFM2LHM(4nH8rJmXI2bnRk4eXELQm^X< zEL0qk&{nKoed~v)@cV$iKWm0mQp(wJ0Kyf&d*666(7BHqxx!#d=*gD6PM;amJnNrp z!Bb3~|CG(*_#yc9PUUu4xwxeHfLU2oByc=yI%Zqwj}dzD1@*3Na>n&9WJM>d<8*h#gbXn551w@P=6@6n+oCu6`+w(0h8T2UPy>6hMtCNkZE6-p;6}G zjgr?>wd)w-8b+vYp;lE|N7WItw;L{<_9MF8Iu}iK;-FGefj~_}lsxS*Oz`-~< z@nj0ZD7|X&LJS6J#3Om2wP>~zUoS@J5?QLw?+;^mq zFoA*wYP>iLAQLl#9j4jjd7xUw;7)I7vUC<1`#(m2>*;!QBwBis%%*bP0X0LqcnC0Q zuY$?Yk!K+9+iB~eY>9dX%K=oSE-(Juqc6D^zg~zv++qT;@l3(M4^-Mk>Pu9LeJN79 zP$0mGoGN_}w`JSG1WVt4Hs#7?(BOJ|YWnXC?(;b-N1h@Ct0irmJuK##0uJZpcQ%`r zhIt5*94MDvQB0dAtC{fbGIR!;We1qKQW0!w^sJ;}exA0&yizX`pvR3072SQS*!(|A zP|h&)xbE>M;d$N3x~nKcT%t>};_MhNV_F&>Gb$XOEq=ezIWjaH$>3&1982R5r`717 z#R6d5(D$%l2PI^`|MWGK>a}h~UEXM^RlDWkIvuoQVN1$v2(N=R_`u<^P35!08CT*|Rn{7+oT((GZ@e2l&3ZiImE3t&i6;l$sBm($Ku3 zXg9snY3Ja%I^P(jZ6}6@J*HGmCLt%r68#H#yHcQ3h^~56H1+ta*K@jL&lI`9vm*ZE z3%cTRNq<29u)r5FpbVr+YhWfjt9be`j5m+$%J-P zBt|r(ZPUhbZC|N5hBMjr{>awIm{!Ceq9$3{P3xsO_1)b~l9}>g1p&{rYGbux1NA(E zSX@rHSe#DMh%gqT0kiS7WBC_*SQt+?Ncn-6=e^bpW@BWRHlDi0vy(ZashgYn>tRy% zo6k2ia!n30lv7kX3iZgys}xk47k*mxqlF6GTK})5y2Xhb{JJ{%-TM>w6Rlj4rP>Z# zpow}1+|G{iO+OlU2IrMyV?>%4xOI0x*+6b8OZ!i6aR~gl575D#asJ@!6Ae25y6;cq zkbjPFFe?=xEne6{Kq-(a$iyQFWRO^Yq>ADP4e%_lHT!Gy4vZZLfmJ=CA5P*IDt_SU z8}Ian-<;RaFyUOOSZojL>YMC~%Kml%lS%)STYRMre1cO49nGWBgu?&>;hPNd5Ty()&A*!0kPKgLsau>5fR!NU2}|n(_^NKmFr$?U2dA}p1`i5M?yqgv{r&Sf zry`y}n><4b1Bxwa!wjh&KU!#!X_>T+nCxt;E=oKJ5?I*ky*{L&y&8Y~@Ye?{+Qqzq z+?AMT$Gu*l)q?vaD-rH%fgU4jqt7G%ramiEqvG)*#cduA zTQ9tJcYg-!4ZO+Mhc$pqaa!GgSXsh4sS<$v@h@`A{AvO<~-YsHxv>dZ0R)EN88u5#-cOoY)l6Sk0@4 zb_c*5U+R`@>~{Er26Sd3(e#A?0Q&(Rd}rq;NxSb;FbLAUMU!>{25r%(C#Y$7KVLM9?Q8PWX?NmH zZcx$CkSLs?z~i_;UaWQfC`~pcPh@0A=(CaUPocg_#Gf;0q!GZ~6|2X&psOjCM0Ef+g9Ym(qC2 zqNoQvowp1kmX2f;608ka;N)a@eEmCD$#ZEnwTV8 zcpV&tERz|@t4-R3#Ka)uA#@q7vPy&6i@lY&@yp_GPBz#(H`{eU%Q@`#d$cXSphAYn zi?z_RrL)~0sODd#?Gl(XMlHO%57<2Sy6Y{>&>A&*>7~2cO7j0Z;Vh0x2lD^iKcpgZ zHrxCZGI|KUPj%u#P5A8vF_wmqf4tAzw!@jgEW!8UI@pBGdPtZd_{BVOMhj*NUZLCm zX)#+w)(OlmB*@}y?yc5^BCm<>OH4{hsVCFQk!tXxoPkZP(p!w_?JG_0bA+wXm`bhM zG}_0iOh|yfzj!ODbZz5rq3fyNH5$0VP*$FmY(NE#D!2xI-~WBvy{fV|XkTEvMtFTz zQ`bcK0#V_9wPe7;o=gsJ;<0Y(p0|K>t2(+f9HQOuy4M56DO_PorBcOUSm6HknYaD4 zXO@E@ z9?KjAfrb;~u_&Pv2EY;(fWO(JONV@R0Eo3l1bA8KqlcO|WpH@ zGc3QVubBis#Xuk_mn4HfX$hhgT&9LIUnYIv9*<}&0Jj^ZhHz!{*krc$xni?gwqz9Y@7Q;T52=;aMnzb3f?YfyyJdu7QjuhpHNg z1UjHn$D5ePE9hEFTB3(kD?guqx^jgLkG~C&DmqO*!-^$I_*u6mX=8qLFwv1@wjYxg2n4yc{lDwWF4%es~aEn z*_j4QxC~kLWA7?@SpZws-U)ZiKVvYLHe@gG{QHQ+IZg2P4@lix}=q2*@B9f&X`PwS?`J8$*8x2DaTFn zw@>C2?(oi2yA7t3L9gAGCcJozMQlPsH8j$d(A81_+~*=Sm2&60ZbecF&tLa=8>r?-Df4E*Yz;>X~Xh1t@>3|j(85)c0PF_>S8Y$wA9g9HSU!h?5 zTOFB-qjt%t^`kel6BvbH9?1)iH za?dT+_aUqaagy^@Zw$E}y`a#teLk)D5)&VUG%>sVte#!A(FAln*N|z^qM)a!W(WN8*||-@ zLQRSZ1k*6?3$r!CpszOA@c+_w!Fo!T?c~o*-S|Y?^uGGu#x)hG7rrVb{X2le_EVf# zAIxw%_(6iYmbgkM#fJe4rv7JO;FDo*h=5CWr16jdan0FJbc~S{98m~#%o4-Rj-3pC zZ{{CA2BmNyYU@CNGXk7esM2TvtuiBnAtLUQQOnam#1bQGEIG6F`_(^Q**dTJ$V@xT zJ*64~xVHlPFdqURwMuE{Gjp~?D1ul_`dsn5!+OWdb=gY24;UDYIHN~TG(-u3O&@2z z!MKg+Fa&)Ram(Um@Gw&u=B%@P_p2_$wIID&T3K~|A)y|N4KHM`2d~sgwGU^{C!OPpArwu3#S5reuds;ap2buOa=0I{u?ABko_EG4)0mv?T@?eG-HS zl$`bCB?|tCetvx+Gx*{Mq0t{xn(xnhGRv)Z+OO9?3sx%JcwBKpbNTavN9Nl+UZJtd zdHXPr7exxi?}iIKP`f_c0_^;1Xl+w85`MQ4Iv*j5e7y2A+bp|0zr}aFv`00p34T_| zyNB8#`wwC1`$Px*n1LMVzv!!5fjzl=U_BiFDNp(5XKPTr%3m&}rC}V^t|2BOe;%zJN%OiB$VCybJ*lb7tlJLOgm7jneAviv+&*{ zB#uBRi$nKsJ~=UnRNmNGCI~sq!a_l#Odpe`qzmW!8yvKa&)SxRI zRxS$PPG;9F7l?a35lHFvu)6HH1c*#KdOkYdt4VV}nW{Jv^o?hJP>cG+3lDh0Y9H$2 z33R0UU3R|kP*Lrt^<;POtw1rStQ^uZ#!tmlGmeZzD^)Cta2}0c`_a@I`Z6LgSxm1T zFWM3vPT*3QWNfd?+u1eEQc$(uu^vsb*#HRl27N_h%N)xP zcXI8cAS7g*m~GR$W*@J(Twn!-Mc3*Wy^yR^sTy^}3kPc?b?vsBvK!%^StvhJeBS;!#IQhnj?d0$FhH*bCREyFrSPM zFRn~wtLOctz^!fAqe1uzbBUt4|hHL6f|tFrPn^BwMvffgOHIfC_ueFF4XTei&kGnj|=e#snBlr zC!xP^2a)YchS5Hl3;<;o%UMb?b=Pilpa#7)nHaqM)*rUPTAh~qbzKlZ;Y8DKdA395@Q*HUb z7BQJ%2Hnl>H2O2cW_^`aGW|ffv<%tIUcQRo+d1cWZV1a4C?20LQ`e^z{3#rR8rwnS zm=nJr#C_gX9C$ptFiOeT=B?U|Z}&B7Oogt%-M24%C%Sb;Gc^$RlFZz7{( z+~|6I!pDYLCMB+-@+vgP0@LULwY3N%vAU6!m3^T4EYIE()8CU=B|gkawv-_TesT}u2`NuEsgp0HJ&CwtXI>@kXEpe}>>C~V?t z|MrpkFYX$f$pB%sSwCLiFH^4fp?yAY;Ou1H5%To8pw3Fd)np3|^B=lBV5GK; z(?CWs>`x%BA!fLwCf3M?nkti)w15g05=k7RSK7D$A0Z-SBj#^$riU(os6A5L!y=Zl>Ox6)92a=&WK4{=S8*K-%(?CEU5Tiwa_V&b zQ!$L*4?XBcf;rJThyU=*s~IbnsL`u(JdBBJI5f-Kx(HHhzWn2)cIkK!Gq{?;b;G4z zbsFG&#Gv*p@;9+3xP2Bsz|?4)b(I@q=m2&Q3`w?s&Hk!HhqcYlHov9kEB$qPCinhxK_h+ zhP}^d8Qb|P3_^~i-Xh$->5JcH<^Fzr$odn8C97<3P|$A}UDa-U@CvgDB8$d{5J3h; zg62sJo6tnkBZJFzse>Jg#Lb7Q`pCqc%*_KjnY!FJYq0@Wsm_3vneZEnEd*f1f z5d?cQck_nkagQ6C%;6+$)`mFC^=?y_th5^tyEzHQX1AjK_iW^83U_1m{(f(<@ydP8 zt&v^6-Rfqw=mWX4!$?Bf$JyL@HJ#6hinfIuaw?y5=3b~&7)S;X^wis=0W?}6R5v*0 zUIR7jO}RX-y|V>;YiCV8X=i41LoEqG@08j=CzDomF8@|{y8fi{D&7nXVs)Ti=VzCL zPU<5n%1r0|m^MW8L@jEtfG_5DZ)hSgm7P<#*rHL~-hTQc$StwLm}nq+lc_b>e`Kn95d|=_|AX*c9oZwYhPp~9(RtE zQ=Mu7rcztGVTV;25KuBuhF^|YUu!l|=5mk9??aj+9t=5kTLzCeW4NU1!G(Kk4)f__ zJRn&p?ks9ctEBXCQksC;^pAuzBg%)<1rr=bd{&Y8krR@A<%<>9+N|Ij-!e zZ5MH)>umu*y;<>WiE8Fx>{*|M4T)8zkdQ5ZxLqI%&WbWx6NCKv;&Rc5Y94YWBK~@G zb}PWKh=kY>{6n?NfSf{r$jXzh5*{&5STuytZk@^nE=`Y6mf1Yy7=eYZ(r3)4BWHM+ ztXOXQnF|G_5E%z2tg=$JSgs7Uw)R7eerf}%gp}S=G{|+D6oA5%X(U!P%&$3~cZtXD z@MzQa*K|xOnL?LJ2l0q?jXSBQnm$V|n1Ekg1<)dC=}aRB05I_ziP_VF#1Y@WBb*%n zDV-XXB~TCeEAmJXY`tWs5Y(vG5oB5-9{V|MB?k(jq@C8Lg2M1Qg$LNQE`PaKI`Nq` z*sRX&tF4qc0e3icSy`^mpLAB_1VKT7tqdNB=!Xl})A`)E2KNtb#8Mij8ZwF!N)l4A z#I&^12JX~elX59e_xj@lD>f}ru?4emyPnhKT9|X;G`O2Sf?#6R`P=<|i%O|@@XeLU zM7*b24tlG_bCIA%agg_+>Sv50_C|eP>42rALDtwFlc+?SxI~$llWN%frJ?Sr8o$gH z4Q{+z!+ZrrWbLQ|`JN=$5;<{W_{O1c&7fM3Ga1P9Fu94(Q3+A0j){1S=pKh>F;gt# ze7<4*=PYiET&558#j=s2+2G}6Kt?@r;Wx1+XhU&UQ>W~Xh9TP*?_asF;b-RU=F>0w zPw4(cj1qfc!NSeLLoQBTUctav_YfzNrsUOZZU_mB@KV|SDE+;2q@e(?K>DiyjEbsG zu+S8pvgie$Hi#&23g%gYX{aIhH5Ume{KXwt%n1}=dJh+Avq1@vtzkx%F zE43@F{*E%PH=Q$2ppoc|!=vrg%Qzq4Ngc>NKiEW+4Nj(@T+(83KiA zcQt!c^z(L)?afYj^M%*>gHD$phNmZHlx+VJYK2;G9KQ9j<5lMbcn_+7U3%ChCW8~& zLMyGLsw!&UWOpLI+XMt;Q|B9@7j1s*a{cd0*cOl zuw)h9GvV}+RS#!DDqRi;4mthUh@A0+zA`Fte&iheh&|xlB<;4MZD` z&F}%Gw2lr?PgRlHg~w8TlIi@Bj{hUUu2bLO&$BQUl$h8o+3b+W(fFg>_*mwHF$`l2&ttL%W3FWu zv9t$lY~+;2(jFX-r+a(aPbNnX&K1 zi(L;56_)~nN|G1Z#*?BIhwUrOTuJ0s*U(N%ESyAKHpxtqon29i1skN7WU_2v)s-vH z-Fi@Jsw;Tn>3Xx0G7AeskCj~UvSwQ+E;k+$9n@l@wIHo+n8vQdexd<}dqZhawuBK$ zR4Hdf^q46|mtrPxg`v-g8v#VP`*?v#C@(|jkC{rC9V$p?DO+Z2*F{K2H974KnxfKY zX#)`n#`^=l%Uk`~ZFdHR6JCKSfX@7MPCe6_S{(ld4;&R${DS`6^7>LeTf z32n5Y{f7|yxbV96&NW?2Qm7|dowa8Q#8hTRof*d*Nd)yH=J`O;0|KW%+FVd-P?H3# zj%5a@6%CbD1jT*$(C7pRqe&TZo18A!aiz0JU^S{MMehz-iPg0YP4^GYh{+FFyfy3a zC^iQ^OV# zx=`gr4gnGF_`7tdL%gR0*Bpx z9-V)5x{Lbc2EIEL>JtMoKl}bHasE}-Tv=(RQ)^QLR_kvCEHCe*(k!#CI_?b`fhy>x zSx7I|lamU=MggQ?p*A*P_Gw^gC!XME`D}@#u-l^;NM@$cVEvRwaYKLP!;sx ze~|;Dqk8Z<R{l+E4u_ThubI^OM>$L+ki<(d1` zadoHD`HGh7MFWn2PlpCiL(LtNN^8zJ%0!-!tP%j?APXdr?)XNyW_w;`{5}b?1^q?r zR78!RE*mWtPBlHeI2I|lRMay`r;K6YLq6Bkh}nbP)ivc3P!Ua$!rR~|sest`v*m^pQ*iKiNb5882Uw)czgSp#6uu)h zFHW{Sub1rrI<0=b$ToK>w!x;|UG06f&dOz)#@ONpHZ&}TafwoS+I^1D!e6kky9pV8 z-(8y!c3vOQZI-8hl8V10Rab8i0JIc~XN{(E^)(SIe={zrQI`fFTJTXDZg6jEf>qYu z-%pry>q|8#6W$h5CG&gxiM~Aw0ULZ;)|#?Qf*oq(BQ1Y(+S+Y)#2$>b8{Z!@ZlCd{ zijG|V+e{O8#yvQIdHScL4a|U3S9Xfpoj9f8>6On^Oij-lD3*Z(I-8SSG|WEdNfYlM zkncR-Am5+V_aBFnavz2}#1)m=_e7$}jkUL>S7{&hOxa_3-DiM#zvVY>nh!}=(EpO3 zto7b1rw7P}JYL09Vr2jNvKX!#L3A-SB?uL|GJ1P-KoJOHS!sWAzCUFrv}%lAFL98? z>zgP;#p7au1iw-=XlePr&bcwa!TL8akS=MB=JK z1Ai1{-g$T&zIlOeI|H!sLEP*xt?e`4uBXlOj!swv?A|ij*$H)^0dSMegCTQi3yp`r z1(|o)T?WUIQZSP(teR5C8WlBCrXq2lm7EM08o6->3-!|#PTkb>=j?3U;tN432S~_B zIG)XYoWCUJIF2O3o(+4x*@;|Syx#7G3<2TUFtC1g(FPGc$8>vF1ETU9kEeHxfj`^U z$99=Q)QBuCy^*n=g4Yi-z;u8yVxs+}8Jzaet@Tqk?P1xxM#ajyVip#AsIU%JJrH9V zbh@vUbUGP`v4erp>S#j=uh@V(lgjmy3^dT-NOkR)zf}J4c*9Q54z*V0&{!2R=>os( zs$XhqQjr+|gNM`k$rhVF)NQU=Dry|Da2hJY$RMe5-*Ou}z|MIb0c28&3WZ4btKDs? zZ?YN-2_Xxa9qk7mA9g@el1-}|3ulW#q>zvhOmE)@lcy7fDh+Py#ExW$P~|8x{s$W> z>hD7w?Zh1rIZ934eA9>2$?UYx>|2a~X_6^OgW>Rc?;R1#Puom=2oifUb2}fh+1QpE zEd$xfwA7ul`cPnq(Pbq8;#g$|PFcp2|53EYLyLVYt?aK4ZyE9CnZ&*BzmuK6WpPX- zuHiX@hv1uEF-rfSi(B=BtGEd6|4^6>a83U4&vlv3Z&g*O7SfYSH5!3z!Nz0bwOqCHT=hs-6P zvVz8X{t2EuUYigiXowQ0%3l^)Rw}{7zMGmYJ&nUtQ+?C32a5kP~FAW_)gL zW@vamDC;wcR*R7chjUsQScm6p=ZHvd(q<_%u>75G|V1V=urHVr!gcvGA z1D=n1tBKEt9T5U9FfHIzkV1vu_me@W)`i+6sz$xV6ffy;B4I3=%v&r-usdrbZ zIBQH*^f4{Og z!X;ZUdsbddQCS$&kwhK<7_@j!kb)og-*@*sH@dx<@7EURHP%3PFw$HuTYptGg%c^K zrnb7QD?6Mm(w{bKlx^vutdZS-k8N&Z@_Whty4ox>Fy0d*oKNN8d`u8zlFQGB zBXk2-QR_Ety=lonz;_{+Tm+H3L%n^Smbt_7tLCTPSKGCw^IFj@`?*;=<-Cn}T+V-e z2V?2|OcT#R3;#Od-aoqf3*+NRP5-sCTCz2Qs9HT%JY-%TE`ir7|F6%6kK}n?_;ADz zTr5UCwzewiLQvD@Xv#mlsOW-B>ndNj9ciCKN{K1os30|$KuGw3K^NZh#N#_9rA7?y z6QPHPY}tdJuF(LK$KP{J*3N92CAN9{sRL@Pb}`}n8rN8mTRC1;M!f#Fy9@a z6fC2$f4DZLKmXEh%8m#KxEUS>#9UuD4v)3lv1O%78|Fjea{5Kc=k#8m*XPYhu>{1` zLlJJZA)WiEmMwEFp!E0C^+ux2IAxizEU(sCveophy`iB}?4irn0u>X#Ar1vWWTOA1 z8{*soPlj?^!EWcsHSqL$6tB^PtC(MQSUND|jl2Hh$%$H@gMfy`i5?y{;MqyzZ|FSi zE|!UGh%Gk0Ll=)H5Yrgabg6u1i};=wWHb+b-Wt#W~W8vzWaSKF@y`K(~7swVHF`f)yi=V(T|PAJ_1l%x+^FW%gjzb#&NreckBSH@1QRP{P=y zwRJdAEA{TmPza(@QYABMN-U9)tqs0$%gao#3;MkY#Gek1o{^iDo=5iMlr{|kjjr5I zPHv(`{+Rz|y=K5e;p$sI@{FI=aaWX53hM^R)dXHeU-?u8-6A^NY6x zN)nICQIu-$p%Q5s|Gp~iEfPK-%FcALqhFEZn7=s+#Xm4~+b0*dR?zNvIc4#wiOh|v zYu#;qdW)g{`|OBBW9~GV!>wfPJ!?Jc)nOYvZy_f^NuIc3rRmd1Zj&b~wt7x2=^LeDL@fdqgH7p$yXLtH z$;X?!#L;A4qyQa}kNe4qATj+#M6EmHWdDrs+hd_jy2bM9tCW+&YNK|rVW0B#oPu}1 z^>_?Od^r#=SY2#xO>N>rIdh66G4v08(!E%*o!-VqYpxJ?bnHr?wHTRsF@N4Fjjbk0 z_`}+yPYy&?{KDVX@O{lGDk4)_(BKI{Dm6l<(2OP1Cb576i762eD`}GNkgXmJN)f(J=Hxe zTQ8;U@8wmFp=d_CBDjFqVX_Zc>r#!l@hWGPbzVW~BI) z94BLjG9D&MYz|K6YXH5Uj&?bQcQT0d^cerBlp>L9Yg<7>C=f9)0Os9@LP5%AEt}N_ zbd{2hAH2NwN=OC|ey$#enPM%Tcd+t#hn{g%Rwi-ciE78-U_i#2(M{&8y>0vNI-pM$#y1Vc{A@p2 zzxuYvU{Z~1D5Yw&OQ+Ls!%;}bNjt4lmnB#KW%lMRA}NWj{gzLDfF zv{rtQ42q9$^>iqzQHxPh%`!4lO>>1H>QAqzeFdzgb6bsm7moken**EmA)}Y}f^%Rc zv&*rNiHQd>_eoirZsx*yL;hfR>h~drZ?1FM6hlN-t2GQs`r2qnaVWkNWrs zc2$Igikm-WW)`+RO+2!6HL7w*%i@Hg)o>irWNR+9Nbx4TaQaB5)s<}Fx?eD$#5P`U zWOQ)Mbv(l(^EI@oKll;dN|>Xf_~4ZOP(9#5*)(w!IE^d_a#yAfQp2~ z9TgI*S<95*sjl41$5q9FucUNGX4?#T3#0DHoRxN(XT+tV}M)W}Wo2 z2l}%@#is#@q)0tIhFpFhsinm`83H!B7+G!ImykG4AyR0Nu$tHm`k%-%GbjbkPf)|O zfS6>;W>6+md*#-GFH1vZYS5B_|5=AdPG0yD;}Iv-X9mQj2$g1a-LYGq&BBL9(x)=a zawX|9VCJyP4*f&K+tRkkuuDZzIbES{9ja8gI0J&>Dy6+-wt0PJNH(@a+IFN1@Q=T- zDZ&Sh=1SbjtnZMR5PFO%HCeIh&1!AZgURhOCnDT?Dr&<1C=d!(>hbICK5}Qj_0=%| zL&w7!17}OBI6{J6mOEbLKmu8r#Y;j1o**@4C)~5e36Rb~30P+ZR`xIZ^yiKG^|ePZ zA3t13n7o)JHKRp$B2t=9{6Rgca=&UPjnrCi2F6+N%*+)L^Gy`l#Uj`o3Z1yu>lHcy z;!p_8TfVv=i6t?3KEB4%60^G<9BLJjiD~5TweY?&w6w(xQ&`iHry^+-XU?!$%e7{x z-F+#?=n*#LIaE4vr(5c59(G86Z*dvDMllU`wdK)K!nu-*fq%aCd(V!!CxN8+x@|5& zU0;wbt^9>wx^bssX=&X}wqL(|I;0{o`tHG_Yps`rmRDjy$Bp5=X=GlR>Yu~NeD&sm zF~%$5p|~p&K0ffU9(hCwJ^(d?`bHQ=401x@yq5an6PLSP>;8ZL2AvLsfpAf6{CS=`?T_?cN?Mn7rK>!J(!^#KdxoE}VZuhDDA0FDxOXkbsf1E_FRlrEl=3?wuX{cdE$B)WC3^&3o?NKp-O2}K-QXt zrr6kuC(dAOyX+%fDhTd)&Qz@tJwMYW7-q(P7piPnP2NZDC;+cDqLKiPj>4YMTtk{o z&;%sUp|4a+S4t7)#c!W^<6$ulN^S~Bya2S@`?kK&c+zc5x#KGaPQk_CYIYuN2lm5M z;tZG@R-JsgI9#o`wHgdy`it-*uvV4I&Y69l-&*{9v0=)Ni(|RW29IZI5=%F=o7w{_ zx6mtI8#c$oopR-KPtzDOBq42e6oXYxZ3|EsjWglqZ87o$CYBm)_L6qy#@lDMG8Y9!km-be~C6=m9pZvL4S?;E)18^tT}P z9{?h!=y<`9zCu9{B_Ks}u6$lqB&i!fD%oo;_Q&Cf4LjEaud1kMFQTI6$yq*L zN}7gXG1Ag9uwumwj2UwozP_JJIy0WbF(yo?*tIq@GX%lG)8sZsN}7&f32fQ2439s4 z5YIoq5zU)-*T43#Qy+A?GE`I)8_PtFnW58ZP*#>&;ghi<_WPlUnBs%@i1Dchkfo&wh>U!PB7;LBTBrz`x?mZ|&(A<`@JRUjj=-2Pi|9n@ zTrbfwxak_i$15)hJAfzy$hnIVg9jU_+-BH4Ze&6+)UK9+DHRH=$_`0!F3JN5}~ z-{wx5B~-6cprSa_8LEn6?vX=&F<@GME(3hA}` zPwi;c%8~w8OUKodM93Nr4y{R$n$zY%;^an;ZRoKD?CiYJyg9SUnl>B#9JlHLXPy2A zhgMrgHsw=@6op&2HsR>e-y}GC4@Y^q2B%N&L!UnPU&d84g>hNgQS8_eKMe(n|-?v*$8cS+)AZd0PnyrhKP{-Tt=2uwnhst=m!(gsykqxmSqm z(qtDGR*#Xr(c^(Fv14RyUH5wx4H$B%>jH7FZKRL%y|l*Tk9S4)?z8aXi>XLS3C8Bl zD^XOG4^!>n2?<}Lckd5teLmqcvrVJP!-Wg8@%{JfWwO$w;evHP_U-!~Cr|FhfC2wP z*RB)j6~jvVnzxtL>T`&WHqCI*&dv`0{%@gIufI_zsGTLCJ~tN{asz_>X+wm`7;PG0 zDSkZ3Yy1TB=FLD-(sJzFxdXYmrnm4nDJhjgyW?6+kEWVvlcUEETR)FfI6jN(w>?Q-P*PDg{tCA=no+@^gR+R zUN-IlaKWk%MMYQfpZ^3>XZR9JRbai<$W4mw(YYq}YNGa=-9s({{O2^-S1%-kA?=0cqVpSJ9eLnROBmRfw%e%{M45#sM!BR3$ zKRpry2E3)8PQZog{s`frt7|tBtxxg&_y3gJBu?Ytf~8b^d>+9|FRdW4vV~!yBp0kd zLdbT|wd=b`Pv3#q*kf{=#A!HOu$0ORFZ>;rmMvkx$_e*XEm%ocGP2p23R(y!lQK7FB)2zOC?^jJrN z)lF`5I1PgfmeO!_Z4GyKU%AatEP|J1Z{HPt`;NlVquW)bmbYr)z&_AwEkr8{+mz_sxgT6ynj%m*Bu@R{f~6#Mx)S{I%R3axOoO-gQ&6j&t8#=}RlVQ% zGE(M9_3VGcv0;h-Dk}2mc_EULE+RdB1M>4v$!#X5{&2xk7CIa{6h)6wu(46W!{aG> ze1gKnUT|}J0uBycq0u-u+3~H~>nJVAgJSvAPoT8)0`~1YjgpcRdXdV>DUi)hPNU(1 zrBuqww77BOBt1Kct5?^P_uxn!)*gNPdc()3FNxV;5;1@3sCWOLIW3N^OQ39RS?#`a z$jbT|si}Jr8F`WZrT|*)Z4z_S$&1Bl6kM>(0j*X;TOK{jLrhExZL##+ki@TV-(GNc z??&5maB+Da&dx39Z&lQZt!PtK6`-g)l$1ljGzk7PRQ|RaeN5}3^tKHF}MJKdx-;z8u2Ytye zwc17Rtyx;ykw;>I%F2fy7i*aCS?I@_*j8Sij*5x`ePIUnJU2HR7cbr-@A9Hvq;B87 zMqU)Z!`Fo1g4NVWO=Ve9*;c(QMXhGumRi5gj#b%VCAQcd$u@1A(6wuO*x0yJsKvz0 zi5@*+W#vYHYpWMIOG{_^TdlrC7u!c&FtI8ty9vVpxQfEmWb*P#NDTAod8)poSaI=9 z5}{=JyBu7(l0|kF>j%dTWxY!E>4de7t@F+?7ychIW?+x2W|`Fh0000v)evPxDP#nEgbyD+Aj?RLtA6+ZrTyO@94zpkF7veY4^hjW`Y8}#!Bms zx?Md)ZDnI#Gr_>3;*7`}WsSYT-%Nm zbS*guX}S*bZ*JdL=F6-F9{Ztm+`R@pG7-$az!g!GuH4~RQp;4}5sg*}Jh#FYNzf3x_?E^@9VT;X);0App`z^E?Fy@x_h-lFe?NSf zL&0e!Uke&PBK227sjA(vX3T*(%;S1y5~tY`c}5fNspufkDqOx}(mAIp%A_$Na0$|B zr83e~%CmD_vYQcmcU~6P$n4L2Px=WkKbP+x=UokvsUX2o-sVOOIYIT(NCE#sK!{X1 z4sTr#lYIhNlTe*Po(DdHj$*n>Y=iA!@)mo{M!($@Cmm`6YR<7?Gb;&fHrOn`a zljL*uhXqwdZ(BF=hv+B+iQha9|GE8|)`TMqc<2@-g&%knztsG0^ydadhQcmlJa!y$Ej@9s1|)%Iug8pZuIOi;Cs6Alsr_^|lWWeU_kK+9MQqSj=~KwhpTL&T9I zgA}>)rpv=n<}bz@k5Y)lGe^=?X`-^pX~M!X|0i!gbC7!l!9T9sA!?wtdz)y>$aUu`I_uuC-35zKhAsRB#$7 z2nMIW^4sieLYcD?MSK$VGe7)x;S8K`G3DN&URka!A_0!@j>GtC*5`M_Lin9-%O*aIdPy%X^It=Q z4R6NzLvoZoGNLvJIyym)Jg~FK%Siy`C||I{q{GKa1QOSA)~R zozpn1!(B@0>1E4JHbmnGgey|ANXO~&r&bv(_wt?sE<1FpAHu;+k6F~Hm+4+b&FSxjiq7k} zLfQRo(iY^+&B-GoBW1+x3K4jfaFnUl($`I~olkJy zH2U&nn5MEZpNV6Cs7iEzPojSenLuqh9JEhYhJ=)Hq;}wc_J8%eOkSM9Wdit0dX74>B^3v`(|$cRa7)yAd!X6is1H1)H6*f3R+@uMO0nlNkMRwBw}#xWKU&^ z>Lvat3jul{AZ;^E0*YTQ`>GT*nkT;)_O=}_DGaxy_`=w^9(iuAWqRF*z|Kza7Ws+- zogI{wG!P}Rwc{TLPP6QRiUeyW1O}SPYEb5KCB%)2n3!-D-MQLQZd1{#MhlG7^wGmP z4PuU`g`s1tl+|}2=^Zv z5UHyl>+Jo>;>!xBNsb*Kx3yhK_?Sp%lzm(>qb+T=pP2S#GNLS`Uz}a)`+St(MNxzT z@tgi(sBe(Swm%J2>xsEPds&%gVG;H)Tf0CulOvx;|7A--VIfIXmAhwi{*(vF?rsaM zf+HhyCgOBm~lMbo79Bcb97AZ?+$0k@gS( z^{=T<2VP=g za;>(g7za81!%O%dBuwAF?v}roO5wgWOEJB@iH_~wSj{nDlm8`oWch^y}23N(ZOH4@_P?2$m9_#R3*YuDJ8sUVU7RC z;-Vr?7I8?GNm^RSe;Z6B;O0|NaY7y$Np?-5Jq!u621(+<&MYj%WM``sA%oMjL;w2> zv)dm@P0dbPo-sr>tF)09Dd_6T1w>F0_7~F(L~Z@wwk>yV?!c~%#F{o$0-T1f`c9YF z4GGXeE)8&lN)Fa1e2_}&@d;+&YlQ!Q{e^EeEG0!LF6)(#F(q0yqkn)55$1J3oaXGG z;(s5M_5q=qKas^>VCf(nZMSxvHK9A;~r z-`huK8GA@=zy1KVRJ{>4g{wTv5emTt&U9RMW^E1f_O?YzC-Y#UG3?1$oo30}A`m0Z zEHCd9@O-b-v%k~y8P7cAKOkZloKGUEsv@CaI7L%c4Q^=v34?>FA+D4%M6pO@n>(Km zcp6jb|5g+h4aSU*Z{?PcA{AT>rn@0{N|H7Bi1Rg9EWCmUp5anij0Ssp3hP7JF%)AwdZ{(=?v{7Xgm` z{#_pLe^B)e!e2EP5t9;&8fE08(2<_DuQEkUcWa#9Ug-GDw-`coz`#zUFpyBUeh-nn zV|m{fgXfA(|2~RWM|_I=G9_+yS#s3o%meFqy~i>=d(9Tf5UK(TKtus_Z!SSrmc{hq zKiva=g@L&tMD;LA-$44sFfYpgeu5{yGjpc|11_q6`+=W>>y2qL(@J%jFBIba-*#r#JJ;Z25B>lA5s4eF z7cGz}(Pu)%{SsNfTx(3q3V}c(Tb=i5c-&6v0ke?UKm7;h$gUpzj!(B+##6-n*Vk`E zjjK>a3MPwiy~ZCd;#m_=8AWndzEq|+A!8trUo!9)2cW=)pGFX!=hUA@7G3PCQwzx|7 zV&gPm>A8f*by(tlTrz*2eu^1M>Hw#9IfCUt__7Ubn&SXxYI8tKZn7^5WWt4qr=w-T zWx5b+^|}*y@nc@c5ktcDd)%L@b+O>DZ!ij8@d>Bb$_5Vy!}sl%4-F58wYs0XaByw} z4q+;`6uYN3Gi^OL(vMvAD^RC6c)2Nr7Kb}Gr`2s9>300Edw`v zE2wv-h={O`&+H)adL@1mr}4jV|AdFPzufukhJ@lCA7`ny_(wxtN(whL?D*Sp@j^lgi`88=QkL+-<=bHLOj|Hsmc$O0dCMHsu*H1z8LU3KBEo-y z!N>OtEiR_U&=-QK(&MM3zMvs<`@pPqBoqn{9TA_}g0l5`!6vWh7n+jd;dCIXFYMhCLwcp8h`!7S4UR=Dgf9IddX^0F(mWp`C6F8dPZ64I zZ_dmx6AEuim{fc|KJKTbI~Lc~rK22?3|y4l@>JHoLfbhpcT%bRIf4mgjl`_Qt*h5f zs&a>pPoPxY8f}A@NQdbCkFemkQT#dx9{o`<{JAD!=_4|1m9%2Dgn|MJVGL5GUTVP2 zp~LWH)=_pAPJ9Z#yE3i`9-UJtQ^^sSo~h7!fb;%5vAM z4K1?}T&Ev}>#zFsysvlUotp7NlsESw4OV`BTnGpV7NG(>Xnzthki3qwkyTEgu%aaS zHDGg$=ZdW{et8?SVu>WE?!&_%4qiB;P)HVdFuq_;TZtCOdt%XWWm+2)hn-C6;zi z4om0wk&WkQXj%I&WFX=1xtz2z8IwZ(Y0`m#sU>VSj!VCNg20>xl1k*ubl33GIAPee z=+@l$a%lq0`gM3q+jh6{w8UXnF-J%q*=NCS;_?oq;rz#o4Qel%b-7nlrznKerBu_k z=BitQg^?*1eM!MeA6?q!0Ti;(bcaPn)lg7LVCnw;##=*KH20WYaPG!u63~QIZO|@u%wqP@=1bA^&1ytopfxBO z+f`rEq#~`WNnlEW^n`+})~Ab27Db2lyFgH*FiQ6pT?uecA5wE{|GZaqwC~y$S{mp) zEc*MHFpql1QD}Jc*>#^X8H7oxZLlt1^Tw z#wI%$%=(tUv-mwMUaI@@6FuGMZ!?y~ryTq1GZhjNj(loVOdSc5Lo{yJdD?o zQ}$ov#{pvJ$)kD7XS>>nsn>j#_v(A?XiS=$v-Hz{H81~BEX1l-`=9dugAGtSP1`17 z8ALlp6+Qi}%TbY$6D_Tdb4RzM&Y+F7(?VxwT`_P)#VHe~rGLsCtkj~$_cv}I?%gZJ zAEn2sk^YJIHt5*=*w_-gdttEs!mqG(H~oG$OwNGjICZP~Xx>cxNEq-#OQ>XuTVcrF zbL-SCp^CX)gz7$=2`L3H=Jl4RxFq1<0PJa0qBfR4c8Dpchf%b49RZcMuj-oA=$ueE zkZxF>yKbypp>VBvYXTo%teQToh&*miLC-KJ(}6df5*+TGLhH}ss<_edOaooes6J@50)`QUT*35tQyskp(nSCZ@yi5TeMoSYD?1tgpbAqfzc19E|m1V`8Z8lcCPo z6fEfOT{2SFc5Jfg5Plcvrvzm-5~VIBc6fU{LVZDCYt)atl8oSJSyQq)ev>mbJ(gBf zOz>_&f+g7CCfI1fYWvJcIf;RzJ}PS5W`2=zRMcQzA{-aCiFyS0b9Ia?U4c3>R zqS=RJuHl+)$K|~^D04tZ9KF(s>a0*(yB6;@Ohp}?{6d&%g=h58qG?zJl4pF#b}_D& zFXHU%l0vXELiZF;#ZD&@oE98xi-lvpy(u`8aA@w+2#8Z^5?eCKQmCSd7?hp_vZxei zQdC~Uf#}ayL21gls_-Io^c%IPsa^-)?R|TA2kKh2z``8w^09_K8{AZ^ps3PnW+}sL z1r$bnrpDDTX69WG3aRFTmV2@Fwi|-=))|6M;o(XNfGv_W>S97N?Mlm6#n!}F@jcWc z8Fen2ba@C{=kYWUacdOh86{*#B{8(!YkMM?!C|fkBk1IGlu2m|F}-mSFE0v>3P0Vx zX`e(bg~+LeOwy_BPDfQ%>S|Y+TgM$x@U{_iI~e|6)_!+3Kxt?OJn%K!N>f!e=rG40 z8)xj))iwh+&4D-c)8TvP;~`smgp3({n0nn2y_OkLzW{+rGTio`YE>#pXzm!vHf(#i zpJh(Ek&TU2%k5emSav*4J1#s~qGnDyIER3B9ubjM%Z8+{Qr!6pudQm2HMw?to`mdA|UO|ky;MRZ02vRDs@13Mqk+NsH8eW)g>e9OEGSxYeqKE{e@6jBcWAF;*w{x2gVmK6 zeXJu*9%ddP>H8>qKkHPKVGdjtGXaA}3lmPRI-|P-2TpFG8I5hThvUvbSgYG9)PUJ% z>S|y?hqGmspv+8D?d~@idgw(4yO=2L14@2=bWcy}_3kP31iVmBuF0F`mPA#Rt zv~T5e*rXJ@_fCKRm}^&E=I3qWIt%bn+XHK{n3)$BH2)(-K=Atvfw;vLBFiCweh~)0 z7as|-r#H^8vM2QDc0I@<^$(zGR-jl}9fa3@VbCjPLQ+P6OGRYhv_$<{vt(-07ueN> z2_m-FVaotXfCI3frRO8Qm~3^4(b7M$VPGIoEUN3h;RPy*?QLPrB)IWm!V6NafN}?ID^r+__DO6RBIaPP$d#D zjGO$B-Q4ho$6w&0qm6RAyA7-w(vEte7&O`N?PzJ2g9N<|rDR9J&`?&+Z?aQpJ{Y3r z($^*(d2YL)P;fSiihHmojW&_^BnMWfRUZo@2n%uDAA4aTzl90UV(KjvKgr|IRjq?2 zQeUzTqpGfT@)FwkxDOG|*yZ?56GkNt7#kvsoeB9e*&hUiH{w`J@xJpH|A6Od%>-*@ z!|dp&C?r?c7eZv@=(OyEoKGYU=mSD}ypF)PzGKD5XU;7tK@{3*bpHKi3cvoP_(v+}Qb*U(n2Z1VBw=XUiu7Xos1I4yng>%~2IQyr<;^U*!^Ohp|9)?@v=dbH zG*$1q!7#Bw!_l@$E|4-3x4#gUus+fB`lyz~WibLBWG}Coagtg7z(H%utG5bHZp(y z!W$WZUADDSm+T5@u!v>&Mt);k+oQ_>_g?t&!g#jg0tW-*FpH=Ks>?lIrIp6PXx6EK z2@RuR`|>5PRsv|ueB^sdnLhvfK!jRQc8roaDHBp< zmi^!MLliO)>TH&T#WWXN@@5L@?I!DY?)Yfk80=vCS#1cLR$*c-;Nao8iWGFX)ajAO z4{8#JN5xcUbMo@?h%qr4>lZ&T)@t&@iXkl4Y(Z96wc_HPf}LmgUlv;TCK`5bqWdpN z)K-x~!HYZrJpdC~D?_)=y`E`2A=&^6C!<&Zr4G36OyXM+g03ANK0$0j%_aS!vtCRXuDr?<;86A872&wQ5-=}(_ zrg7-oZv9W!0SZO8KgQggf%7mfo#ZZ4g}TJ>$Rn}gcae~%C!_p|3LUG&v_W7M{JIr{ z_#A&U4UKNZ$Rb$78vBF9W$kNo`?7H5IKk9YF8E5lKf{CnEjUAP;mDze$Ijb6{Hl9# zZp72C{O3M0eTkQr!5fA+HaliZ%)ue(K^&bRJ**GPhBI$YX1S3rGI)Vo#;g;zpe_Od z=}N}-K{o`_5o65yV|$y~)x#suyA~9xgRr~X-|BIRfPg5q|Cc3Dn}IvT7%PwP zgHYf(LXb8gm8Th&EmIk6tSx=? zOLS@PZk3J0HS-!EE=UbN@`{E%%geCzYBv^3me>Qbo_zj9VgSU(w?v9-5}%xO@OWMm z-Tve2=?{tMgOalX6q&HmQ4(@Gt5`y1=4?3VP;kq83PPCQ|IIZ2ThRUt{d)*e#<;V* zk&Qvpa-~k*vncj3dyG8(PFTk5>I8&oS>*~AQbD0y(Zq(gYfZL& zVb`>(#Ny8Y+sQQ1@-DyXciqM_&S?V#hk>gMKwE{fDVO`$HU{^D;Iyks(%E zZ7(V-%Sl8}_=hzb6ecpsTnD zP8T~N{b7hIM(>BM-l^X8ngB&&kTEg&Vr_F;Yqv%~*@!aiS=U(nrvT0%7?&vMRxS4%FCLY5%yNvz0AF6J}VASttP2wUK-imsCKEEB2qO5NnHxL1A z#ezV*0D@$4y7>N;<>gizY`HQ!Ht0Ug-E=tkFf3bA+{Mza!_W!A7DK;N*JzZuv6{mfwG|*9-)(z7zEp{-eMqyPBh5zz?pbz zv&x%U0zxZhXJ>ct*g{#Q3UEvxMWUj7|901;K0 z=+>pN$slCuRAqTKEeuApQAS25tkc`*cPMhV9211d*{}l%ky+nGIpO8##9GvJ7Y}Gw zN38y4mG_xmbVtX-<1MWglH4Kpc9#S*a@*sg;3CYQsP65r7=M9q8X;TSb$&(OOha|6 zp=7Mhm(kQD%l5vY!oqp`2#L&WCBngih9Z_%@C`05o-%G}Xf*+ue{*bmY5iUY)7I9V zcT1i;=qZ~~2(oU%);uNo^QV_EZ31I5N0=dXLS7vpcuc{qtDVn!09VYYZ$*IKanNS< zi8h(&g+OF{{;kxMEx3w;#{f>jU0lLHvv7wqI~xIJ4TfF}Vk9k#&=_PSJeCCQd@ zYZAYgQ26HjY5l@#KPt*V+gKtfDaohpP&S+)**cQ3T6FhqJKeSJ@ynDH=b9-lQjCf1 z8As=^(QKqZb>)BgKtvpiS)!Cf2ENj()YF2_s*W3_QqWHtj9&ub==u56Z$xT2{{2(> z09$QPahP4X9|p7NoERS;(&-&LE%y=@SGbPnguMkER^Y(_$(-Cq3DDi>AE0B_LMu^x z<(xkeq0f0|;K0wArKXc*rR_C&6goLkHRgbI+!pvNt zAxQ)?F4!!cnm0si3)XeHE)=@DevyEvMr)1R&nmAp#X6bAAHBDSTE_OGL0>RuAq4Sl zK^7^zX$LW5kuxwUREC}QOizDUU8`ZR1<+V zz>-z#SKF_5J~P8tx{TugW<_G}e|_!*qgM5ov;1WQNc4jhl9XWqS~?va3!wX( zujce+@!$83oiHLY)~0+)lwpvv#Qp#BtXF@=-yBzg(;^1sPrIntEtOS(qk{0d{qYZ{ zmikYdwjU2M$}M{t(1&Gp9jTph1WB7f{9$)io>XEMked))X=HA=egH zv#i-9QR;!ZS&)v7)LQ>{%Kf*%)CCRh1qCm2^R}68?+i44^8h0yL#%>=KgLppf2>p%d=Zdd6La=6BUKftOxcYDjE&9A z6sC;l6p>P+toH)odpv*bl960fkUjI86 zDlA!w`ztH<9a8iCXhgTwJx{a! zH9pA|+PX<|GWIT284X7>FO}8jY-oO71GoY>%rE%|ZiD^Mfq4SG@a;ZC+|7b(+aII% zWQBzt2r^&P@Jb9_X_*$a&+wa8WifQ#iQU``GX)+|yu6A2Z1v6h6B^Dr*;o+WS2PJNYe z5KUCBWK3M77q!mcpKsIuT}e8;zQ+pza1wI6`-1Z6fg2??aS=%lwS6cIg$4ZRdwIv- zM?O|Aca&6?ccjC~ES1Us&h=a0A*NHVeb4b3l?qtQ?@fi0GD#$1_K>%G$lCM$&r=iz zq|zBfhnSGp8PQ_O4`?`ozeVfw0}8t8{0ZgW-pdEgQ?~D&Hv6tf~Mu`H!k56y)Tg=;AzWZHla5dAfbp{T{9{326rOB zY0GBT^gniorpVZw2tT9T=61Y*paN!L>QGGEQGl|SHe9si@D;pWQCj8p=WIm@tJz+m z2kO+xvPovS^@{c1`7;+KT@G~0aI{_6zt0x%5$7L%wVyiOov=8aF4Fw<@;qS%YGw4; zexWPg;Z$VP^Ev?2*npR&{Q_SegT$=s`bCF4WM=!!R>L|vWC{z{`;SWD#7Bj6VgY_! zpj>fRTHy_}XSQ-lwD-q%Ca%J!xI=q;-y@%%Je+nz;fPPPRw;plz%FQLKsPlNoUiQw zzT?brG#=>y|SuvaP?M1S# z&x$ZF$oUKap?|aIV#83s<4DYbg{ABU4G5#C+1U*q$3N|b^Y;@xO+)6~j%gwNf#iL4 zOKUOh9$UW;bKbGB>4`&_%s`8=LAIbmlQbO(m8RsXQZ&@$SY%tCd#Sf^V)H=MiTC-9Ng#+;G{J zW%Me)Z}PHEKpzA*zJMobiVkQOhw2v657%S&*iClWeNYSu9Ubz(x`Eoz-o(lIEp|wxo=L90jRMjv%?4)z1rN*m zqfmM;)8*uc;63M0%OA!VA{~CwHx*t!8<(6tbKkjNE;|piT|ik`-69GTY@X4kpip>Y z{c7G!VWY^pIQd9xNTw8a5qD~Z+)ex^C$`$1Q_XfA{#e%2m!ZH$l7^t3=yn$Rk9-=MWJ_o=UvVn zJkCq1$bvO{ett8M;(8$bC(fT44#TzvUx6D58gX{O!$S=PW#M1L?}5e!Vn+IO;*C3! zjg2po7+Rg3$Y1n^Sdj{Vp|4ONvxitSkZI|EQuNkEuIdT~6G*b6ET&%koVR48WPHbR za>AT1SXOpVyWD)y*nxp8 zN{-4|!FR%%-sz!-p`q)^`Hz}5Yf5)u za0t4}*4^wypRqjFdAI(NvqZ10-^Yc8iQ6n1r`IQ)^s2<@CWcxBgfH7HscD|~0gVqtEq(Q8wg?eKNGSeoA7=Sn_=luv>RPFWNYN}g{RuJ_ zc646*GX^ZI`5u=H%3^U3Jxh(a)76qO2ToioLKg>*91(q|Lzs*{(NLR>$$bKihb2IoTW-jx37_vh~xCnn&A^WT$M9#<GkY9$8^?e~@=o8Wh|DJ?_KrT?7q!j`shCpHd$!5s_fVBR?*Vdf zSj@(T0#bQj=Vn7r7^9WDP@R)Af{?x6SH$j2pZpOWec{$u3K-Io@m1vy_Fu&}u7YDk zMnG)I&)?Aym(*m@#ZdPG|EqiO9-o-fhj+RY({G*b0ct9U`h%t2xrD-muxQmqfylc* zRXn!mrJ>_LDRMno>g#KiKC_d-?fy$s*G2{EG0o&Avf7=UsNo4;comg)TnTGjXt98< ztxJU2`rNcOj2&4sKR^)$Lj~|+==cJ6elgoE6o3<<;74<-E7ulT-V6?51P2$+dA#z$ zS5@%1MZjn(8*@pik!?l~3=jbsa+rlMNVJb@=#RsKn4RoX{aptjc+{*`cAawMr$n|J z_=sVx}+x}LN`7jJyrk9sLZpmw*p=YA9 z(v+a#;nk3G%y-fL^kf~^f4pQxS2;4M=F{(Zu%UBeKg9Wu5iqwn7zM9YNx8W(RxW1U z^6CB}MzUvmW7pYKFt=W|t;ww%hX6DvV0+t2=iD0>I<-f&Y<_s6iA=Z~3bvoiD~?R0 z$#mL(tU?Sh>V=mdk*V< z#@b`O0ae28{AT#~*2=KNgMIuUYj~m)QdZ`UgbY#V6WNZ%7JwSFpAyknFr*JJ;(%f$ z*M6x^(WF-Spr`A{0IAsAgvDb5YCJd_du}cW7=U7hpni&o5PvB>ybR$}esbP6@n;0C z+S>n>p5EzbfH-2CTS)D5I(~yg3HVkAQr6cOf%#i;`zO%Ts+LGWA?#{Ks=Mdm!JsYr zKM!P+xwxKV*}0OqL>IzTmWCb#xOrxJUQ9yPhlFY)t0BM-zhvb49Gv*7xnibZd!$^xKldf|5w+OkWpF+ zos_IW!Rv`Cm^Pm)mvr2J`~o#GA>5bFo-+c>va%vkeByTa*JJsTv)pKf6(7Hqs_77j zoGdG~!hCAI=X$=3lWcdh1+kp?b9wkFtU#?DK|FdxHqiC%E7_V;)!$pmH`rxXFy^fjDdW`X$rAdc2ZE zO=t8E^S~shxL4($6(>JMS}+(ano-H_k(C=ugo^k*pgzmL+j%<5qIucb;y{31>N`J8aJXcXe7@ZE zy^&1@*-P;4VaNmEza#)jh>zSeL+tA(qRihpk|y6yl67N-R7>>Rb0?%-PZ*{jq&|oq zSTx?Mc4E;91v`4JT0iE_JjmKA;C73?v`S}I&xOQGkN?c+bxwGFQe&4#gkOsCLCu~u?%Ss6=TH+BlKGhH11HZNAe4N3nXMGTE- zS9{=92zPXK`}CHuxG=Yf-5m5Q(eI;%T~+=;)+rQJ*v|yOkTO3H;kLTe{VZqn&ZqdN zwMtEz9uv=O@kKC3(uVpJwOQjCL>Zukr@PYn=Oytj)whO_kOPr$SyIVK3W`G&t$TLs z)|KNF&wn5!dMun`GUjR|baWjK)p0ViWGV=K)?}llR>fLXzH{05Z!ape3zD6*j7TbU zd@(7q*Q$;kI^LD&+uM)w3Y;@rM|_e}gR?upz%lo9czYzQoIv}afZk-LCy9&ABxcC+vS6+5XK7

    g8r4rLz!F(URp_7iz9Rr37LurIHUA5NFmyc6d#+60#I%D>jadu^2bxUtkPq&lU!d=$N z?RtA_(EDE#r(t(oi1+3bgQ`#X{v0ian)}mp@*Eo_@7mh=`OygmyMYHQuP1?^-~@=| z(4cpG)a5`P8Tsd1!05V>s=+2{3$IeNzaE7?T7LdN3Yrpvi3yrAW;&DUe58QnpFhKQ zcATwyB7%Njj%{{1FA3~D7f)oxk03bUyu7; zNOaEu-8o6LDT*bR+>DzmCt_u87gnBs@Bb}+yM(2ocvXnzfNPXdyvxh`s*@i1R_wvX z=M};i;&no3pWCeYU>`keQF0KnJb&VgPHlO7bktX8+C7jhxWbVpTlmE$-o%Vk6 z@^Pg2#V;@Nl+@mlMda5EMgMnozJFwVUcj8; zy|HyU`tB}nnc53lD)WM=E#n`4M9Gh?ZVG>{_fd_xBGEo?0icXcLrM7=XgP(r9QsK^ zofZRiBccaK8$bFZmmYQ5ViqeXf=U>zrc@&Z<9?guQq~8x=?M`-GfX;~q!^vq;iE;D zfQm|9ID{_6qiDi87(67(nuo{-RPeu%;QLDcng}6&SRAe;7}>?9xO? zqc897MU%~661CGIH#eV+%hdm|yvzm6&1C%m7g`mKP4V~ja9;3hGJl3B<6QN3)wIfh56myE>#vX z;IE@>ikG`%iQ_d zYw$hbX=^u(=!;F@F%Z%|jFT@b@st4|MdOh8zo;Rh-prET>`_wxRxarX!knvjVB1fX^{4F%U+F5Ui{<7vMB|=n1w>vAIZ+{aApp(wn009p?07;^X0{^P?KGz^W-&!BdMSR zcdEJU08`aJU@UcOXr-Z>-03bPYLQKrf{rfnM2wk}S%>3`Lf}SM_9pIh*7BpG7oCfM z9`@Ju_xt;p(ZTUR*`oNsX0KFqilVPI5Xgw@=GRa4O!M*jeYdWFionmxF~D}6CPgtT zzOY1+ywhQ~Rh{a5&zD7goIT4G`M5@V5-Eupxx5@r%e*NnT92cq_L27kynF!FtW#1- z*N=&eoYaJVFMia0tkC_ya0Dk#&V`77|L&Fbo|%9BI{DTZrvkMZ_kk=thD$bZbo)E8 z=BXTOMvH9wD^5xJ_P%h@Rqi)&hxIx%YyL0N@)o(jo+L(u<;J~YqYWg~)G(`!E|UV$ zBTIqPBrPs}vi$l^Mow`zJf=3|$uHi0iOiDUVO;pud~$cp0mu8*tuV67B4|8?NzNFd z^7hu!%uHRZgaP$umSRIg$<-ikci&6_3D~Sq$KC}56BmyjnUu6KA1)9U92~7qVnWqT zL{=SGWXKvTiNrd10F!ZEQ|5A|oPI=F=SwIk*gX`2Si;8M9}?inO1?1%!MrrJw8YZT z=w!veSK&oST&paRtWp%WJrknqd!8v^tR;>Fgjp=?^Web*nsXmrIQLS45GFp6Sc^Ex zEdQP+n=ln4Be9)w33J5suhi7k=&)k2$X^B&du)TlaFq{#1&pe%cTO>eGrWJd9xWvq z@7H-D?3`M9?m(Wlu9~%(k(3k{SH`O&SLI>iG#zu~$REJ`fl}I?miX>4+X^+>4 zmmSik04?0Kn2g)C)#NhDKW7_bbsjO{-G@E;~E9Rt7n_0ei(TAT3qv zKSF0^<>Zx@lfc89TU&_J;-dcsgH7d0Bbkhz4|8;SZ8s(Cis4)+cTDPfylB0Aq2MbK zp86$ZWxl}}8c|az1Wkdxo+vrJ!jz5tqwu@M$xe~gUa~(7cMx|Tz0=BHx~(KOiq1q?p1XG?m|fm zGrU07{7%~*e&$pOQ<6x5{Q9OUEmL0H`UEypcNu1lk))*Yj}BhAQE$d9l}N)5j?B)AWPCqcwoY z3th8ANXsq2kB%UA#e}aYD9jb60lN{Ysge7<=dKsCeGK0qW;%x(A77U^#Gqf}Izcn_ zq>IyW690^it|D(&OvJ`!B%;4AHJ|<#zgjltobekPq*(GGcTXyvF@rFr%nMA821`27s1 zvJ8-(HOgAW>9&~3M5Vi|^grT^8+-dzQts~Xoz=lJ+A`l5RxdFHY=EaFV-x0(Z(?;m zAat;liVF1XY^8R~WI!Y?!So8utG<1iQoCD4PjcqlyZCj0P8;z63c4M=#zNhb(Kl>xQ4`%M% zxj5&{8zLg?{L_cdC(zLmp1ej|ny3k0X+4dQ*`Yf%&u{?Yae^Z_B7oIk`lOWurKl*F zkyj_??JeKToI|*;+OG6Yhg z!j~&h08evacQiu{^>Y)Rj3p}S_g`BU#9+SISc!tBa){|^uF|iol8f<$Z_XTDR=Vxn zHscd_296EM(YR}!9`KEgx8!f=Y+<>GetU8bH$Zam#(}%ZtB%k?M#Q0XDkB%@oBdjM~rdK^Opj1$(4|SeA z8Q{v!GyW$vE}RK5n~a{KK$a~+}3 zK^oeS^pXH1nAv`(<_H`&m)t^E~|nwFk{wwktX zX6ay{rxy-C{E6of^Rt4CvYtC5lO2MLO!MLRYIa%(+UL(Q+canx7@8$7ozh5ha9UNd zB2p9hW8vywUxe0N$I_SLvZS~9(nd``G`ev1_Y42I-s8e1#H7dhu)Q@31!Z%O4@X$5 zKh|zuUi8t-95rlY78Ny4>eZ?ZT~*X-jtN&Jr#zoMRykqrfZmB-MPiXVTRqf%|Egtr z>HAk14Pe>kI@^a%tSci|&or8Reh*Kt)Ii>YtJpKMy(kj;-j)@_pqCEFf!No@5w--u z3($qpqhUa0k(YG1aS_=2h%g>+C@bliYQV&zstc!{%r`NdsuCCHNy2*y0R<}NZ5l}?8vW!0? ziCdmTDq{-@agp2YdG$nOop2MTu+r{3w->CVBi3jS5MJVKQ)B5`heppFO7 zc(b9AhbVy7GG%C(8=SjWM+1kyeq#8yD_h)|nKy={qn(m!AH1QMZmB)@{b{~&#&Jae zu{fR(ANxs;V9Fa{9^$dDnjHIX7k)8sbSLTKo77;E+HtREUBnr8{K8Q_!!gOq->#l(4V2M?rxQC&}$nfbyMO6sn z@t|R1MUPoou><;}k<$ush5jzM%;Sdt1QQ5hI(hLmo6iMQ7c3Qfc#=jTzKNab`Qz7G znX#S^70E1%OM9XKKq|h5CY_{Jx?lx}f45cWAL7!hSIMopRH63pUE1jCsh9E`Wi09{ysU^$XKx6*b^4L8mz>ZQ; zqzMfQqj5GdUHI5_eJ104p$V@hR2l8BLj**&#ARi{01e!Zm3^asJaStpgK=E)A5s4$ zELyg|$r=LyVZZ7CGfRLEosKR%waFJWaZb+~(8DQ#K3{s(!r3lX)Epivt^bcf-Nd+SehlInk?9@*U zQ$c_RM7=WrWe^Y@^e!m&!I++&pR*H|qz0NZkM@DVHljK@|y%5 z{=iSz?Y_s?y4@fH{S>LI%Kd%1n=5Zuj#&L{sCQ$b=GD;QVS~gZ5q&*=qhL10p0)uy<2@f%zh6S*ncuSz{B}zA;(T zyTt&J4+_dGW{qLSazFvW#5yicpUmzSOI&;jA!~wu;1=}<_Qzm1_m^*hW~_0F{4?9z z?+}%Dl;7R|#*QyAjh6var_N<$QU(0zb67b5dXn5t{DxTHN4IWVGA&HT?MZZfBjQ=1 zkjdjgxU+NmGEo5stVm195Hk3rq)i~B^um?V+y(l{3+Vd#FtI5qP%#G=@=6ZKvXlo5 zM*f5VDg81b?TFa!_JF+VE}1qsZWBaF202y_%JpT_((o8K_DcQ*g^7}2%@gH#fR!-L0en}J@} zjeW*1Mp`)Fd#>VAQUb<%c;r<&zOpIg+B?Pq!ElJlo7&i-q?Tmx2;EYPG9{%PBpF`7 zEc|Nw-1gK3o7W8AtYSh)azDdEXQrcQjQ? zjy0Pdo*Y_CRYbIh2L>z%_f&u--}x*P7-IS3bScKXr=JS}X8^D<1$uS$Re9CBk5TTr zg~6P-4yR4MjNxL{3_>j zKC7|224OsFGDXH;VQCP?po;EDl~h>e-CL8_*-S5gsSiTD5e9}h5m-z(fbk2JM_5g4)~DjLUdtMhuQ}6!}JU5pG(AO#zlK zecTDQ~)y~(jEZn=kD+klN#W`(bBggqE$RF+?UV80i+B~ zT&>or*&8Kkxq3d#eAt!*gG2$(4oD6T7(Hg=U)^i=;va+IcwcswN|oIM11kXLh>g|C zTyT0i*+0}w3^ZU(m(wS|^y^hfDE5h2aS;x%j8chB&50G`vU-gGCbAy(^fUoBc8i1y z&o%A{BT5Kh*Gp!s`b%w2DDVinLDMZFz`F&zN;yEZD1q9XegRb#wpHQWq_vz2LTV|2GAKdXV^ zH^ZI5f6Z1QX=%q{3!GncfGh{aWoTrinA7c|elu2|lkHv3YZbQ1*PV-)FF+A8=!@QB zRrRl(G=A$d24g^1=lq|Ng)2H%F$w*-lY0_fGk}bS0yuHV8fWYl4Cz1-8~K|JYb_rp zn)ts*i9o_DlUKa94h$q$GNi7$tRw!#sPnR8`1^M$`R4f25DivE7>npK#~0W7S4ZVu|-@Da1k%aTpm_E=4r3^@nu z6NbH488oiIMi>(QdFXA@5nF@0x?-j`|FP&@ew=Ag;;`Hmc9GXRGiIRG zIvm`9o9QF^lUlZs$cLr=(G%f#edwAskrGDy%E~Ov8hJ{p`M%a0OK;^1SXB^;h(L== zu7q4(YS9RB#MgWt7+oYdx+Qab#q7i~KCVs9A=1?=Rlb_>sZb4}(-=g(_|>;C>tiDz z*ysH{E8l3>&C$^_yr?K205q~7*pSIwd*uCqgyO&C?H3{!3H$8Sq_I9bG%h>&w~D~w z{M>cnWF7YTcQrEK)5sqfzQ^8b?`2pqpr>`~?u@^27Iv0Zueoy6u4z#^&q<}g-H*r3 z|H-8{O~n_CE)kYkQuY-3&X5PI{DB;;CuG!TFGZIEp(^UNLs4EVlar0Vv(rb`+oyZB z2n0fgi>F;%dntCjvq}f_Q(_ku@6oM6PQyL?Fek~jvzM2ea~s~lB5p9YcHZP|XRUF= z#0V7#1t%U0G9Fl90)n%bn8JsARUU&fy80!}P@)s2Ks921$0tWVBqV~|ouTK$UnqQq zrKL=mI#SA1KS${qk4}KPd0Yw=e%G)EQUgwd;9q!94PS+VEemK$R$IGzY9ONc=)U_s z{QA+~u<3&fD!d4o>UJuP<<;?Y$xV`c!-$XE%XVjQXQ3pi)WL!a&cX^`?}{*gU|>$? zZGILy8F8(v3o0tQNvZX8-QM%r!Lm8a>N00)I^U;nuv@6Uo-aQv?EdKK7H-t2rVi5e zarYi3QQA8r$PF><4CD)$zaR4QMm9HlWB9Zk!HQ79WEurg^|O_OpP|!n16;AVa7Tuz zDO6y-QZ?Cpj4xqmZedY$bHH`f+@1B);HotG?`ydtCOBMMkDt zNk|CmJ&La&IazmlzPvlPw3JKkwR`JwWIhBWV+jPBxrf$HTS zfz~Hc!NJ(t9S_V-F1ovud|Cub;#M#qZa&RPGJ(5qKxvzPy0351@npek=oDfC714QW zco@h1tkG6UX;v4vPqIV?S_3-q>V`?TLB$F>QjyrNr?|rf1TnS)r$B1wCz!jz)0MgY z79I2Q_RZYYHBfh#xbtR0ce)=+)pZUpZrBb}?L9uoBjG=rTUXO>UQ@g+EhK8&uZO z-dl>0zrJA}pS~RY9mK12e7@tGIX!(ZDlKj8eAoZUN-2k2-}6RBSW+1iP2vs>`cBnU zgy)Jl#L37g@y+%PB|S&iVd1+Tpq#m>um4KMX}6s*H}zvX&fAUKqEYRgtb6-5m^!Xy z`0XUC^JR1vT9q{Jr+7g|l-W`OYRt_;LoPb?mtzC5XCY2!tI+e!$?3hZik6Jua`FuJ-W?T3A%bzha!7n&PkS zu+N^zdH*)I^iZr!69mxY-t$JoA8C2vq1;Of_h8rE+-V*YpjEjE_XRkHMVr(R1PJkG zrkWLT^2o&A$U3h?Dc@h;C6$!0A40JBoLt^xhvrUX@gP7YEJh-KdV0F^QFw;|2EwMf zLl44klG?;{8q0ecY1~b43#T|aBeB8R-y?Pnt<${PS`N(1c3Cbybv-tAXGO6grfYYh z7*gcEdQpOLbHVa(#LJ!wlek+n_mi)AV=3=kr0OAwRaK(LCms=kB-C@NT;YcppsfM< z8zp-(wrGP|+o{7tpj$>XJNR)Fnt=Vq8^!A;gD=nF;H~eI8evQ$`0!>jIdx^=1@Fog z#>s`K`1w9%Img)LIf)XXLa%1kERHP9zsP#>;u8_dCcO7MaIN2epH3V+UoMspj}G4W zdU*N`P}_d!Ck{NB)1(Ca?GPjYf$qW|aH&Hp&F!4K4ydwtg@BG94xfMDVhD5^W{0DB z;zaiAqUZb2Ad_X)yubtQ$>yc|D!3o%s&>-t0tY%d(ZtLQo1OVUmz7r+@AmHtjQh=R zGG&@qtn^G_=577lT>V6M51-Kh=06S8AYV=j+)i;B8AY@cTmd}-LLIMLV@|IpzN-U| zh2-~x`)|1Aa6H+R7WtG2bk)sC@8aDG2Kttd4+le>+GaFDe0b|(>+74vwqCR%7oGQu ztV~yzTW=&kB6D*S0CSiGmn#ma zdd=5&qkhzbJI|`N=yBj6`ZQ;VaX?PD&;_6bOXavGM&mCt*YxidU_N3Y9~swtE+l;whaH;nGI4L zrzL!+M?x+#vpA;J(CAan4R>^GkXKtIs@3B)EX|Gp?6OCvqHAnNLf&v^)$_wU>hDP* zy;5;1^!z`6zAX>E1l~%%BV=JV7*zUi-NTeLyZBnSh}73haq)PW`W2d!gb#d-^m}M{ z3xEj%gmLNqOvzBncKmMgl?&^h$-fHwF#OhLbT$K%g2Taz56y4zmWOR?o*~ zPt?#r7nSes4PgLk`h!TmEr&%2ERVVbHZ1GKU1An=veC9!KIHB_rEaQSyM7jZg>pgd zHU}<_TL92!x|ttLJiGHXCBr8yy1To;HF*7LQSt%QbEB6f7(Sqrmz+$^dneZc<5viA z<%*!)a!K)=thU_jh%=OV%|Kd18Yh4WCTQm|{^p1AQ@&*J5L?^1=F#;l?&8t|!SQ)^ zer;{{HUnf|E6t~ftm6Isi>oC4adRaQsHcZ>01f`O-qtPPRSOa$qNKe9V)~HL$?*jz zB3)qhy2@F|LQkSrp}X6mx%iZ>W_0h<`*z6=M7ikq7tXBjwW3l|YKIGznlHw_!}hf4 zm_KuKQ8|6y@KIh`X7_>1M~nNc1M+RWYDmD=jF33_tGXr2;UF3h0li~GbgYlMcnYl5 zSVw@=&ZBSYH^00*e%v+xNzM67jQa8h(z?{ynd#B?K=aX`U#x|SC|32*rzmNk@d;ij zZtr83>L4%xhx5xsh7Lu9l&S5~x757pc3>*@RJpT>fsyLD{OYX2zJ$P>#?Cw=dvgQ% zcQ0j!uCA#;cZI&jpjI_}s6EO*2WFk{;4$=ievku~;4D9cDq>GVRCJ}JP~=H~qy68T zWXn#K%(`p~qj_U{kgxdbM0=LOb{c0;1?8rnV>8q>B2oN*+0*{16E+xTxP*T^4r@7 zPN%X6n~h8|Z5M%UCRbtRw1O0!HsQ)j%7=PX-R%zD+BaMC3^e5Xt6BzE21Bov35c=N z&y}4&$Z~?jcUc=7J7s~I$yXnyDX~$Regh%&7~P-g-(7ws0Xpa0QSyi65fvA+XRAKH zWjzPX9ejg=gB6aCpQxYFUFg%}2Ylnis}+8}UWGLAsMl==2(b9?VOCf$#kB}WMWHOa zy{`#G^vDMOG6la#-oDn<#tZ{bUJ0I*iyLPA0$|g(kKZ}XP?yqFyIlFibZi^kr_brT zx9^*4VDXtap|}T~{q}Ae>(VcZ?3Z~U#=;j@1!ZJRsc^0Hq(6>;ZSnvKkereUrP@O~ z^*2Hg=rsDFQ+S(Ix1)J>=5t$cOW6KCJ^V+HsHaSuOpL3?cywfx*xehRw<%;f8x~S9 z9v;2t7bE9d8{3#!%j&Em6kc&9&MfDZg0`WP+nLKBSW(f=c-w#gyt1H$!I#h0Ky;Mv z_;`&TQIR-HG0&q&{rYgl>;AZ>kEyDl7EUX$();KsW3|c7(|F4-CB<@k+lUkJ+j^F3 zfqub{Kk^J9#px26`Z68UdQVIDf;3oBnx z^Nj))J%a9uYcdD_Ip=)3+_QQ@r*U9tmJn3CNl{^s^ghFSN|%J~eS{dyW6!CcRB5cX z03$4XgdkavBVc92FtN+7(l@&=qG6%JYAY+f?)3E%?6ijhSL3ETTI^{!xuM44S!yn0ij+!6gF0IwQ@6|$tvsZPLnpA#MdAA^ z&wes<+RXX0y**0D{RmsvoK>}&Ig9@%}{Md zMERz`ysVIgVb`u32di2i7h}~+Q`3hY_BUbi#KzB9B+q&#_37;u-A6!vejRT6$`Cyw z>(BirPtyAb(3bkuqsBuAdmrx=#f5+#hX6Cc*8G{{T;{kXTEN(z*c>l-hUuw!{_F`y zhBa0>Mgm>#pHvtZCX7X-8PsDRswZF8oWqtpmrjJFj0xiZTH!rFhfi&--lVesksTGb zpBmqWGOfv}U6;v{*L`_|42VNa-jX)wfdxUn_l*_*kB5t^kaHtizd-8Rp$>K_W)f>J;+{gNrG=pWYv!PP!7LTnQeR2$$bG3ql!gObhDejc zU^4E})@Zw}U)-*Ftb2R2WIp(p7_=oXUrJ7u#w|lB$36o?^xayM*$M$ z@%4Aiz0?|OS2?X!py(Jp+h;5$Y*_KqkFa#@ac$-S0gwPRco3r8d5*_v76j7cn>)rG zA*E^kL4=JB#K?FJH8tlo#ElC3BLD=5J>7 z5rI8*c#jaQ?AfF;QZ(`lkbr}YoZmch4>G8&_l#~IfjD7-sVtK#C=($5If$-r4P7?= za(gdU+Wbut4GqU_7#+O69zQlG^CMQT+Ds#$c19Fe8v@j$FNp8K$|?Tm2MRECew`%q z*y#X@#NJ*gFon9tzZZ&2vYtPAmF2E7m8}+iWSGxUSUoX^yt`W>O#~H)7_g-MoFXCo z2#aM(HI=Wj@X;q((os_nMgB3GFOf_5=e8Ddl&ef^T@B ztsf+`vr>hyNJvgoi@IWF=5Wwry*jb>YJW7&Q>kl=+~q%yDg!sZ*?*#s4T+wZ_>P3^ z9J@(WSw*aDr~m|q+))}cbrmJHwzh?6lut)HF&FZ=zVe+}C5LjtTI!=xsX$8ZKUjp@ zmVLnBr=?!Pq~-xOGdnc0n>Wr3MSnpCLV)Z`*Z8@m@1xNU$@hw~8IW4h1ry?OrZJR# z9#Ta;@K7u2PEN5F9N;z`BflgvSUQim59m?I%Ee}Tp&C2DrsDhymm@ASJvi7q-wFhk z>~;9`5d)suFj+Dv;z1+6-LWrD_@1VyCq79}(MWj_!}Sa1t`JqyjQym!(s8)_A#Bhu zFDQK=4ILNv(P>R(g~qHwxH<{y^Jk{!XG1-_3Pj}j!h>E)QNx|>JH4x}CS5!n5EWA+@maswRY&-o>{}0)cSkBXLAM(M1zH5P>KRjkh zK0T2#yMloANhXrmxdE@;HYd{ktevP>8VT%9&}rkJ5mxNF)PAfadXemijA8-11;1KV zO^+nS&fEf~yK>a(87f?@-0b+gWwTA;;rY7xuHJIsCQ;s5YXI~@>aXN^m^A4)o3+$J!y!itYm7hJ=Nb_i)?VBdavkU~Az)26FIL8> zQJ0q(AmY;HM*{9KyfiqNOr4`f3nyz_5NAw0HIgF$PK*5t*dwh8ZlE-pvkKN7zuqzc zL7*v|bvr<|5ZUgl-)#8L{X~PEL(UQsv^3z5V0aZIrKeXwS^8(?&sR3$6h1w1T4C+=ZMx-NH6m4uj%JMm}PaWL&ri zD%h;YoRV1t8_^lJoLsp)4KU`(;2|o*z~RnyL#TFvNb3>Y0vZ~e{zyhk@)(=@0@#ZUnJrl;P#)v==?Uc$3oZUZ#L~-jBSoY-p zksc{|PD9dHrmRsKjO?eaOd}v%0|GgPZ077njA0i4E@2^$jW^LvV8d)I4U|R=7W_?G zlfLZQJ$rYGV17;K6<#n!RTINcJh)RhB+gm!Rm$nP3`h=KRV$1mApBZ>EzIFDi=?uY zwUv|C71gR1Ckmmazd2ZAO!8fSLV^^51?aM>WZ~hyxqz)3X0@R z_F~x*?CEkzkxGMn3XEyh_<;GJTJi0H$j0uUIKa+-a+{jSom?_*wwQTBfoN~5hU|a? zZedKs*w8TbBaDZcH?K@1tJSkWKnheZYzEV+}{%Oe%=Q^+l0yIaf z2+4?Tg*J2qtp338BmQlM3}fg5*m6lHC7629a$Ed}ZJ7bZS*el?7En0;>=0h_0hMlb ziaJF~p)}EXCDyd>BLn zba^&F5w8du*gXcAk**=o%eb9k`5EXz{5)jdGg{~${fuE0Nrh%RB%j>VNXaGa@7?Du z?yM*dQm8Vt3k(!^jLRt+VO9Ihg#gP#CBLWnWX2@9;ENSg0Ab9`EYfn`K>gfr82Y37 z+kQFwg^G1}jd1H4eD@VSpm=zdAO^Ur_J-SYeKfcQH}-MZtq zqJf(j)nnY2oUH;55Jz@Yk*21@QdEI@K3&80K(({|0toZ zaqKj(>fv?tswYCv`*+P=_b%F$!hq1Ru`nWL$uGuUuM698{;OHViDM`qdCJd6RUKz?N>6}1QzQ% zFdhkUc_Bf^D0bO<_Q61KwLDU)BtTR8nEYGzTny{r3GCWT zz$VURk4%SdvV3op#a=ie|9jEHBBKnV+(1i&*xi_jw5oy@?gQv&c5H+@3krt!5WS=N ze9`W6r-&Xkh7Vbc7+LkAoS*NY8anLaiXXX4@)%eG7F439?D*GW=jL%~(<6(02ZvG7 zLRimSR`3SeD2tYmWj6fB&nt9|qo%VGz%5vyWFYP{J%s#!fO9ZB+) z;S0I%*2BD|g>$=JD#bVl0jR~5D`@ejs->=x~@U;X!#oK$guFc?ze2LpO? zq~_&z9JxylLr?QD2LZLXCVh1VM7iRT{YthMiEW4axKw4Sj8iEw3<5}gahRh<9&F?j zcJouaq%BouFqEWboLaCk@L#Xsv$?4gZDS1(+9_fEv$kWLG}6T3z%>Z2SY{+tV+%){ z!t`Aon#wC*YEJ9lywj22v}flK2+AaDTLulkoHYQCv<1t|2Bxdh3!h>)3TLz`fGiam zm{LxXl%Q#4P)W&#sKLXaK~IiKK=|jYKle`V?U&zzdLxDm#}!Mldzl?-W_a^={VaxQ z`s7P~n_WSk3dqv8Mbm!!=c)T>GJ<;Q5U3|V!8g*hgiqnq?%7Y6N`!KlW|DKoF=5HgxeCo(gCIuO77WD7z??IA)FA+(SR7B|>$?+PWrf9WKunb7bs? zp&-9pCPkA}%+LicG8}qXzn{rx7a=V93hE&d8HF0=p#Maio;o~pkh7WZNm%;%?&sC> zM*mw;ues2jOk-rCG^!0%^Qj|?KeV4QWqmykkR4v22m(u$-Au&pdMtq5gh};nS-0DVo={%(^NzDuLw9&#w|)z%-zRIqu)g za=Xf2dY}MarUYeluc7t>S6o_IDyld&ZQ=lVx$Ky6+L`*j0tHL)Pv*t4v2V5EQ?f>l zrL0^@kH!p7R)CA}hu^cG6?KQILHj-28}E6Nr@=&A>L*gDC`$^qplE%5tvo$M?X5%8 z-u!9hJkt{NZwrP@3YW#hyLZKN0Uke3D;XnGp>Px;jg9onp5!Piog_g8;zgo)y}8rC zJZ(R@P`Bb0_JHV)owU-jL~Dm^+W7ZPlVLR^!Zuf+?%U&_|0EKoCv!cp*D$+3hcRsy z2;mnSx203s(oPpU&s*!FuOCK1QDlsfOI@QZsN-v8I>|n@Yvij)J@=&+5>@r+FC?Kf zPO%K&npde()TndB!alZ#3j6=P9uq6Aou0gCpIta5=*}tWvEN;3G}cfbc`|c%57^(Y zn_Hk5AlsupR}N(xZzJD-HL448cXxjX;^ueK#v3-N=l*d%9Y==8%54>$qCvt70)3~O zBmJ!SUM7Ee?PeRyu#bh`ROSsE@@sAm{or1=T(-S+b!hH10Z-z`q)F7zn3$O({I3kA zhY(Lf)%`$0c?R(98$d)Bsy2l)r`tx9~U-M$f_{$xh3 z(AvWb9|SjQGW1BZLte`IUxt-9W;qBiNIKt^RT4#AqY*V=MWaxP9#|4%Bv73ORm7~5#_=_ovYTv@bD-x~au-x^+3#5Klmr92v?gg(NmkMfFY!M$ z8W2)_KTN1(D^2FhSXgd+6-zzlmescz{3A(%J|Y3R(ub3vyt%IQjErr~`IV8Uy~j znZlU@pi3PT>z+5TJ*eu(#!@f6cWnYCl~iDymcw>nwr+i(FRVIWFspk5cc=n%X#am( zL{xCvcY-5qGbhXY`Q2MG&UOzN*BBpl?e zt1)z9+B$EU&{1jK4H^(2-=XEq_;?3!5Ig(1JUfEl9#lM<4!voVcbwjXhhxCRyX@MZI37$;Iv&q) z$KVuK0@E5GL<***bul-GgBXJw-D7>ebK7x{590Sd+~`C^aOiY414cJO(NDPuPE#Uj z1?`#y9X{sssPAuXS7Oo=-p*^ubVr^tX>lMyAS}iVyR6mJ(#$BDR|6*g}8ZXbc|)8zUwq@nEzPM0z7{io8dJvCkn;JTeEHZW4i{=dHA`q3 zV6(4zO0stghF%ytb0xMJP8?Qs;4otAYJphNe+at!nLOZ?Bt$t(@Wqf)o%) zQjsL5n*W=PGyp!Rm-FFt&Gme}#m(a7k(H4NIK2>(&A35#!~`p~Q?_QHR={C`Pa4#7 zH?o|fgrWBBUCg`)BtmWU3=REM)%dm<1pV)UiUhET?xG6PcW+RZs>lD;&qso2u?KV_ z29!D$FB&*jYZheC(v;~L6iOQ`yheeVm(3p~r36;aHqmJ+o+puJJujviai*-UiDrc8 z6)0(P97p3l_=t@ibl5qlWUc{@|Bt9-;js4}4cA|of8SxP9LBo%rk0f2~5acNs)YkwkR%R^mg4yQC zz26|9ywA*1*YZIBoIIJu4jr4;1egGaW!xfIuk%j>M>{FB=;Fe{Q2@#yP^XvL$hKWg zSX^9uF!j^T1pJ&r4W?g4j_%JG-Y0)W>Rr9o59T&*x5rMB6qHA&>TpS;3ipu!ykIF! zrn|1ALlThZ`@-WH`a=7S_zP~8E><_QY;~7Km7Wu3o%Cb2Hg;?X|Wo$_4aPi8fxuQ{Ck}VJqppm^lCuSXT18Ws%?@r4A~K#oTyPJJzT%6Wly1}Y6DL~H#sL{y%ly2jdQ>)(CL+EEKj{4C4kq(F?!o?m|ZQijMYw z=O}UVoM#H?p%fgwy>=H)OpsVul)(XvVvsM_k_NGTmWj!R;k*4L(7&9$bRA`7yG2OP zxd3`7={@%B))K*Sb3IQ_CvNGfsY^%ZtI)~v^jNN262s*onP3~;_P(VT((#$~cB0zL z45QUGHYd0yQp1A;xhe&rU*ul*?Ld#a;tmSbg4CU3W@8h*;dQUZ%H^>NfQry!O-6OS zoI+U7c-)`Qq=0U$p4X>J-hF9uDJvRuML8PRuKJ#9*KpC+V8zm$`*fXHw{|6u`td#k zkx`S);t&*{-_77Zx$r1N8`b;QjR~QD&+>qbEHhs#yD%syhPVpd!2X)$ZTu}bZ(8=+ zJ!DwIg_J{W`4s!PRU0Aug06-p2}wiuJv?a{?)vc*3!LG6s7yD3o7)S6;(eA%p!bdr zuRHznvZ)|7CihsDKW**+WYP$|sR`H~sHoIiA-zy2d|2nUWQiUL!fn zn+nX2>^>iGQClHE-=pWd6D5@rCB4Gp`N9EhU3>zL>+Zv~)=!VGn~oKkiLe#7x2vL8 zH`+_;JV)-)K39Y&J;qXR;}Ka0YrH`Pvo9~Ee~*g!@~`YFF6E(p8S@mh&@x@0+FsGVDQChe^k%I)&oO&6kK8a5O3Z{=udkQgqSXnW~+I|-B z6-=WhF4olz^*uC6>}EFSAAvG1L*HOAsZv1ensJ-^t?A!su?rkGFh9@vx@Iweqoj&6 z+o6rB|8L0@oLDBx>gG=Jwu`1A_9umpPfSehjdkZPEGW%QU-8T|Ag@|~($5}|t{v7` zIiqeDsc~$xGYpO<)Mjb}r$j!fGpJ%{pshObNR5qMOpTB8@oP~>!rneUx~S6;QRY-r z)X1YDfbwn-m()$^dJPiq3JmR@8QJGzT%u3J9+5Ep8W7aP%yUwlbJzjwLc zq8*>K%TmhD1!DC72MS`tP%5=^j_l4YEYvP`_J!C51nd5UTqqgth#a3;7XxU5XZ)Nm zV24Yr8@8;xSD(8HuJ2W}QWr#=xzocOs0zfXA3gyfUv!Z$(k}`#G!xOR`Yx7QN^B=} zW2F|O8!OipXMCqC8msM%*;npo+EJ#?lr-|VN~8nQ{vgz_Oa}|n;&ai1;7PBjkGSOg z5Tree)pp)0Sg%h`oKamD8y9OH=dCncaNK0(1!*BXuYVxM_KtJEl?s?0qP7)p(%~%% zOCzOA>jIJ|-CO6{6HA1M;7Y=y=JC-oLGaRtvP-|l-yeQ4uEI380~+yP%q$ZqUxJpk zii$F+XrHNB({YT9Uc}5A?4 zi17NlL-n;Y5{+^@E*sE)uYfpuQI*De+7LZmwyJgHwSYeU1)V(0@uA%56BE<9j3#{R zQ^OXWQ;!NjtpSdQE_+zH_zgv2;=tz?sfLPrMUg~)$w~s8i4txswjq*b2Yq}j`R8OT zbqhG<1q*p7#_l)~P%04?%9jWLw|1q?2E7Tc|H1YfnWLx_^@2sg0;`@dQhPJ0+)wG( z3<+XeGiLz@@}vM~5Ukft>hJzCsQuZ|0XH%tv((LpXX8?^Mgg465CsOO{yMe#QdXv+ z56IQSiv|ZvQ&B%|x}LY{1EUA4Vf~csl{~z`%e5+bd+djl{p!}zgNu{K@8$JPQOO#R z2E73`bkMwooe%!(tS)errSA4ZW%`i2Ek#Z3GDRt`m;c(D*`Z_g*X%uvAjDr*NL>mD zwy>k*6coGzGCCSm`I;FO5dU^G4jP0;1z1V<1xbz z2yN_e6ciSc@V%dgV+7e-FN`osUv78X%Lh^eqR0{umcOIi(uf6&h<<#3i+7BGrl#f; z7Bvyd4+Bez(mb>o(31C)h22g}=$9#>5OjX7FeSpL?Nnepy%Xm2ej)jm`-UH_xYlxI zIk%XT!oFtI1aosEXw*o;cH7i|$N7oASpuMSa1hEdIEC(+S!y~c=}-)RnhgSiE1yqz znnB+-U&xG1bAo2mo|Z0X6;U|we<^a7I@J*R?G;4VN`N)ZB{nw53mD}v|K^x9+K$H=qXSH)`U52fhD^kOVt8EK*c=nDeZL(&CjE)jz<6+|8nA3airIzAKvRgExHw*|4%g_XO!nP90#W5TIAP(; zLNWIAtyu}DQjD9M3|9X==XO9cHVQZ%5gtLL5W`eWboZGO5hEnefGZ2qNcfu@@*Y59 zib}?uupMx%U9|=dstnKKV);a*+oAtw0uYVHeIubp7Q>1hj1f0-8nZ-41GO-*81^?> zivGR7Cnm{7fkBog`BEsqLZwkDtAPr2@ykb9id-`%BST0`jIT4rn1`q>n_5so0jmJi z>+f&=RAcreKaZ=#f$*c%go({53Vr9m%%)2mFwv}{G;3)?!>`vjE~K1KD7n-9z6mkR zi1i$F;-2l(EToAGWtA_{(KHw_4vg#mb!w z4Ymp4Dx56SZ{g_t)_DQRzYiaOF+Bv&2Nn}MCpou2A6}89{&w1BO58eMr;m(ARva*~ z0|>P;QR2K$F#z8<=KN9B^~dPPV14$%(Vn|c_J3_-9egmfwSn`d=fSb;7TMYK0^p@j z;o;sPYinAEj?3gt*-7lt&fn*x>g^$l9q?5xzlGh0*u?BiK0zmsu|Xx2#`Av9;AKqa zwTk3jlNP-L#O;H4TXG1yBih=^kbG23JeaxHV(RKPx6*)9bFtzi1+)IiL*otc9VE?~ z1BZ8Du(GZtFVj#=)q+h*=73|fHH=ItNhv6ZYHN9R{}Ks{4k7~tc=_`D-1)&?6U#(J z)u2Fb*47ff6Tn@Tqvq#h{1s3qZ_+Awps)dvmP~576I;>xomDv zTxMOw)Y-Qf9w+#*twb657>Y|lLqpPQE*7AR!RJ-m`oD#%H*-y$AOWs5=;;ed3$hYN zcx&qkHf|fe3}1D^Ekeb}h=f+RPVkg`eqxw*q~5X>S!&L~8tM4XR`1+gN@|vjpz<6F zyS0*CuznK^?YBSHy<1y8A@ie}+l+X|Zn48AEctD15l;nhhmP7)7S##+tuP7Z;*zhm zvh2(vW|T4fbTV3t*TTW--?X*offEvi?5@9g3k<-q!p~D?*MzU6fW)SV@K)`> zHT3aGwVr+a00!Epf2_2C$H)J1bd~{CHCq_|5NQPILrZrf9n#(1aiqHiq`N^u8le_#=snO7Eg_z^~>x`3x>aS zy3w^J^#yXESp*+nfo53wjp;?5$TR}HSR&rw@Nn`w$!Z>wD3b>C=Ny==8jn^c2;>eG zv~f z;&Vh;WHU!=6O0O=SmgQq%MeBP>Qm2Y1Fp^YQjS*OES?7Jq4)BC{r zd6c5!X4EJ%L;FjJdEUQ23LDvxR8!+Og}$($!lNf~|7&YbQTVyv7M74;lv8%Z5FNYr z6?A|9<@@*Rh`|kg6(@YnQW%SIN|8!o=^i--!F~!I)I1{GZ#P}%hPBpiczk^0+e`J? zP}?#EpIP);f-UoTG3a_}Vf`$mS9mh1uWk&1gnA`_ zVGfDoOMp$F!gYBm*5tZ>y5UafcvVC|Fb4B)mjBp*P+eGaGqQgByfyKqFKl{u?%44_WPf@YD%Dxq^nwR!%Y`l;s^igQZEC1_@M@vgz2I}R) zKpsrY^~!~^1~dOsz+jLyAf$6=( zDn!Aj{!iNnb{8HM{e_^QAbDzCm^sf4wRRs&Y+#(tuW_-0nvJdiS4^D{S0cL1UGS|Y zggq3(;o)XDHb(;_Ky<|~(wTA@a}<2@nSV{{G&?&QXPJnwf6siXI_g>MTPVG{Y$j?Hx&3@og($ke{ZW4U;hIxEL2F+YG2~&25rQW zxYw2rG{kQ7?dx~Vm1a*(y+%e>eT(6wjH&Y~i}_7zeb9VDr2WD6NCs0s^|xJV{(xsoya`vV!)pj)K+|V|EE(Ui|lGM%FeDQ)|z^7FrwM6e_k$kso?Ct?GIOZ&yRi+dm16 zI20g7@v!C2()IB`61qLW3OS->L>2q|XwszLf-|vg zB^IhLdhR}@gR@@#9oQBouSw$I%*>38t*r?r1b+qX?Iq`^nn}a7 zX7mS`v5GmnI`Lz~m9k3+ppaCK@Q-ji*_Q!J=78NI18c zwEp^=E6U^*a|HCsMYu%fGl4*Y1-)-7Lc87i0!@ zpVcL@$mKg}$DZ#@0da`)7~P2U9WQ$-ntU`hwdAQuNBp@t1xFr%3;ZG005GkgI#FwD zLiBz?STrs132Y%58QcX^j7F-ev16uzNe_iR?O|NeF&b0v&)In2W#`r>-C}=C3Hvug zBoZ=1W6sbS_Uk8HLz7g*7G8^=pQve|>9bN1m)=@FA_gD{2oNL}_ zReX*P41_sa_k*vlc2J>#`j7N=pUR(Ybne7_D8247FYW2-N(Lu$%*lxtP*txL0<$`L zf7WGb`z>;DCHnD^=Vu=dnSelAa8efE4>PAe(fKbrS9269ns^wB; zJ#Sbyw_mJ+224N%B2T*^s_O#Hr*dx5lV8lpB;}f{VWGH~H!L6k1&D`d11wTD1vxpA zbv+C@Z!tQqp8UINXXIt?!*iaZ@D-rDAdNuo6hpsy{4Kcnvvq)2_M`r+$VL;^el*z$D^ zvUF#LEto|Zp@#7Ne$kT7aJ|_5=rJoiaTx~$pCM=@(IU3CkX7`8fva02MwYcHRg~+}TFO6T5E3pmek<}q*R-W!x?&){I&`_i zg;#*gIK@}A7dA`5%^hoBn~WfJ4R-Z_s06rk&Kr}apH(34Aq^~Rl5`1>kY-Po^(0EEm zNl8@T%M~WBfwp>*$7LVJ*+jO~6m!+w+>COSCNny5t7;XtxFUL815ht9lx_EqhB<@J znn1u?Kp*h4Ze{Xd@$nJ%5hf@Kh{WjmLhUK`!se#!ny#R&tAySTDsB0Px}R}bv_Fka!$K#1R~KH28pFUq6Ypz!f8bH9w( zF%7@f2C=d$ihQwBh28*IUiF*FIF;9#iXUfVzh-S$rU){a!}L`?JMtcTmoGET)-~lN z$V!I?2yrNu@bD2U>oficL^E}F$7B2kE3M=p35DVj#bOjEI5%gc-xlCYY`eA;x#pFZ zXA{Jk9IXpW#>~w8-rrF(7!QCsd

    )K_42LzXg{>& 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 IM6N<$g2!AX$N&HU literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-20.png b/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-20.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc291572df0910cad90f4f3b0befb04ebd751c3 GIT binary patch literal 779 zcmV+m1N8ifP)&E2!5gPkQ@4Z8-uF8{JV)p3fx-FS^L@{GzxREfcQOj0zWynK!47!6 z)ndK5xsI8c0nE-mIq8UeEaLOsMmGB!8yg?6xHt@try6^E8V(K)P+aW7{CrgG^LiWM zcArHuIeZeKMA^JVb8`L3b*-oo#{0ZEcXjO)0t5X0D5Cza!yh{fYQMD$tI-O7*~ zz%{dzb#={9L(Vv|W#YQJ>!_*uh;aBaW&2ZPy1F`GZjnhE�S2q5&pCp*P3K?C^LL zw6;btIC#a1xm@SyV{I}u;|^`8vbxFH`Tb2Nl9{Nj4N|8sV0(K`tQ#60(C?;f}54AvP-gS%M>OG}@SPJgx5iNq^tT3XI)bk-S5gS(jz>2wOCqwS7ZCi9E9 z9_u<(ltz@6R$^^!1gt9-Z8#htY4nM19?gu&c6Jtwh-3_uEzYH@T)pLIBoP1q#K>RX|q#a@HLrCReLcxX^lAhJj{s^#8bmCy08;FfJMtvVre82uc;hM zqGpju+tE>Xd}8zUO^`R)PAD(0LQ#<<{sJ`ZuTTaxz%ft^`~wYQM?3qMXCVLp002ov JPDHLkV1hQPX_o*1 literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-24.png b/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-24.png new file mode 100644 index 0000000000000000000000000000000000000000..ec54700cd770b2680fdf83168c01fb0984dcc556 GIT binary patch literal 973 zcmV;;12X)HP)CCw3`6dwtKK_7)6l%al1Dd7VwdZ;0YeMmu2^pl^J7AD~f2^E4A z92@kbFdH8q{S=5!nMEi#5jr~K8+F?IjCW?P&gi({{Oohj+WYLg_Bs*{f=ZQwoSZtu z#ib%VJW9lDwttwJ8ApHrJ=pDE_d70mjRpswz>y=zv9$CJD=Sl2UtdIM=rJrTSj2u< zm8dK1xbjFf`PLk&$YOY`|zNq~*KJ#KZ#R=H5qpdl{yu z-}+9FoLq^bqL)<77QTP)-S6rO{QA|0fPe?Mb*mHI-8zhoJ>Q!kCMF++g)gzTW=C`L z70k^I`klaL`-1xVOq7@R;p)|=)Yf@Q+U8EcJ->FX1>4(OKFB3#wdbMHoTf?xV6~d* zn_+PKJd?Dx=Ap9kBXyx3wY4THcFLK6f2hgShRMnId&p0oyot+~YlvK@h%YYwg~9L$ zQ&Y{ZnAJLjSFf^=l9ErHk?sVnmeJAbJy*}jc!8{}yI$MElD&St34?=YF)&a;5ywsv z6N$s*zB)^crRaHGXXQ71l6xXE^A0SQ2~14X?b-<p&}?5x2ROH0coK?F*om-2+l z&}dTqCYKQraaxgJX~{}Mo9x{xSc->-*E5nZF7_5ru+9&Q`FZ6T=Cs@AB;kr|T%O<| zVx7zGc@S1tZKR|RikR8_iO$DL!g6I-bYnvd5$oI^7>!TJ1?-Age}5^|>J-VRpYw$B z5V6kp!|?DMGPh@5cGj8O`IC9rl9CFDv`=`744zPnWnAc7rP3;nb6dD_C%MBFSF6(z zAFs#Hp9bp8P6B=`va|0aFz^9+NhbAQPU4^meL?+fLR8d6L`JfF1H=#Ip6_mpT73pp zRYSxRNM`qrL(T;J5_NQx;r8uLl$G@fS7hUo!4qn+^or#ROkP@QBxgQKToqVe9(N~T z@JrOyr4xS6mfO&9i7Nf)x1{}Lo5 z=-C!TvI1A^dOe9oyT}200000NkvXXu0mjf{ literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-256.png b/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..19229e8829c9ff5b2393631fe4fbb5910d708d25 GIT binary patch literal 15332 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 literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-30.png b/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-30.png new file mode 100644 index 0000000000000000000000000000000000000000..4058b451c19c4f90ef48226922701ba3d2f8b17e GIT binary patch literal 1123 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 DI_Oc( literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-48.png b/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..c563c44266962c45d3f58971488f6e0c3b02634b GIT binary patch literal 2250 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 literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-64.png b/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-64.png new file mode 100644 index 0000000000000000000000000000000000000000..88d18d66eb10e41d8edcac453bd029bceffda75b GIT binary patch literal 3124 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 O0000Y5#LxAyF*tUaf7H_b||$aAt? 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 RL(c#J002ovPDHLkV1hLYP>}!t literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-96.png b/msix/Images/Square44x44Logo.altform-lightunplated_targetsize-96.png new file mode 100644 index 0000000000000000000000000000000000000000..71384150c9c95ce5405a2bbdfec1e5114a4db2ff GIT binary patch literal 4685 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 IM6N<$g2!AX$N&HU literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-unplated_targetsize-20.png b/msix/Images/Square44x44Logo.altform-unplated_targetsize-20.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc291572df0910cad90f4f3b0befb04ebd751c3 GIT binary patch literal 779 zcmV+m1N8ifP)&E2!5gPkQ@4Z8-uF8{JV)p3fx-FS^L@{GzxREfcQOj0zWynK!47!6 z)ndK5xsI8c0nE-mIq8UeEaLOsMmGB!8yg?6xHt@try6^E8V(K)P+aW7{CrgG^LiWM zcArHuIeZeKMA^JVb8`L3b*-oo#{0ZEcXjO)0t5X0D5Cza!yh{fYQMD$tI-O7*~ zz%{dzb#={9L(Vv|W#YQJ>!_*uh;aBaW&2ZPy1F`GZjnhE�S2q5&pCp*P3K?C^LL zw6;btIC#a1xm@SyV{I}u;|^`8vbxFH`Tb2Nl9{Nj4N|8sV0(K`tQ#60(C?;f}54AvP-gS%M>OG}@SPJgx5iNq^tT3XI)bk-S5gS(jz>2wOCqwS7ZCi9E9 z9_u<(ltz@6R$^^!1gt9-Z8#htY4nM19?gu&c6Jtwh-3_uEzYH@T)pLIBoP1q#K>RX|q#a@HLrCReLcxX^lAhJj{s^#8bmCy08;FfJMtvVre82uc;hM zqGpju+tE>Xd}8zUO^`R)PAD(0LQ#<<{sJ`ZuTTaxz%ft^`~wYQM?3qMXCVLp002ov JPDHLkV1hQPX_o*1 literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-unplated_targetsize-24.png b/msix/Images/Square44x44Logo.altform-unplated_targetsize-24.png new file mode 100644 index 0000000000000000000000000000000000000000..ec54700cd770b2680fdf83168c01fb0984dcc556 GIT binary patch literal 973 zcmV;;12X)HP)CCw3`6dwtKK_7)6l%al1Dd7VwdZ;0YeMmu2^pl^J7AD~f2^E4A z92@kbFdH8q{S=5!nMEi#5jr~K8+F?IjCW?P&gi({{Oohj+WYLg_Bs*{f=ZQwoSZtu z#ib%VJW9lDwttwJ8ApHrJ=pDE_d70mjRpswz>y=zv9$CJD=Sl2UtdIM=rJrTSj2u< zm8dK1xbjFf`PLk&$YOY`|zNq~*KJ#KZ#R=H5qpdl{yu z-}+9FoLq^bqL)<77QTP)-S6rO{QA|0fPe?Mb*mHI-8zhoJ>Q!kCMF++g)gzTW=C`L z70k^I`klaL`-1xVOq7@R;p)|=)Yf@Q+U8EcJ->FX1>4(OKFB3#wdbMHoTf?xV6~d* zn_+PKJd?Dx=Ap9kBXyx3wY4THcFLK6f2hgShRMnId&p0oyot+~YlvK@h%YYwg~9L$ zQ&Y{ZnAJLjSFf^=l9ErHk?sVnmeJAbJy*}jc!8{}yI$MElD&St34?=YF)&a;5ywsv z6N$s*zB)^crRaHGXXQ71l6xXE^A0SQ2~14X?b-<p&}?5x2ROH0coK?F*om-2+l z&}dTqCYKQraaxgJX~{}Mo9x{xSc->-*E5nZF7_5ru+9&Q`FZ6T=Cs@AB;kr|T%O<| zVx7zGc@S1tZKR|RikR8_iO$DL!g6I-bYnvd5$oI^7>!TJ1?-Age}5^|>J-VRpYw$B z5V6kp!|?DMGPh@5cGj8O`IC9rl9CFDv`=`744zPnWnAc7rP3;nb6dD_C%MBFSF6(z zAFs#Hp9bp8P6B=`va|0aFz^9+NhbAQPU4^meL?+fLR8d6L`JfF1H=#Ip6_mpT73pp zRYSxRNM`qrL(T;J5_NQx;r8uLl$G@fS7hUo!4qn+^or#ROkP@QBxgQKToqVe9(N~T z@JrOyr4xS6mfO&9i7Nf)x1{}Lo5 z=-C!TvI1A^dOe9oyT}200000NkvXXu0mjf{ literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-unplated_targetsize-256.png b/msix/Images/Square44x44Logo.altform-unplated_targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..19229e8829c9ff5b2393631fe4fbb5910d708d25 GIT binary patch literal 15332 zcmX9_b9iLU)1Ax)6B`>Fn+-SiW@Bq(+qP}(#&K+xcarhTz70Ki=;F7#8$72+%d##O0*W$<%( z-EfxH4@Ck%B3KODE`bS2sudgUkBEta0l(q#J3hjlKmMSAcIUS{`p*(lX~yC^xd37k zKa`nO<3|q@_7F%Q$?(LogR_hGqyt+Tox_HM^8x=Q_iq@#UAanal()BUBpe*Tj*jiA zW6$hGmB6Ayvb#n&O-)C}l*p^AVyDf^!+i=8e*UOvsl5ZrF4Hj~=Z8&4O;Pm~HA7=c zVzvhydL5a%>jYRs!J;|{e+7jcfBv>M^J#gaiwoB21}o}!FGy?agsl^Gzf2VoWvt>@ zejd8GVWBJsnupXQ61dEwIXSgR?Ny%$$auXspgLSXp7ay!PYnDzbIVeHEoItsH z)Yk4S8l8Hbu$&wuW^v1usb?`8-S@e&u2~YSzgE&>R_ghME;pbJ4g3DO z_USKH;J{HK?N)Yr7k0Wy;GK+tAgWjsIo2@OTSeu&iGH!Z)$YkiUaEcIMkVH%epT`D zV@O%kBnZO3AJ_in==jOKn3!-+ORt$6HJ;WuW5Rs2vG>iQ*ntGHYe6c#3FPM&P%`C_ z4FA)c&!gT|>Y{kfBZH8TPQLSl{osm(`<2>w>`3U5{5Q#IIuZ$>fs*r?r@5aH>36FJ zeCt~q4|-TGts8(-B5hadzj>vx(G3Q|ezJr>_zNb3w3}?x1&K%iY(gO4a&d9-T-8Uk z{@!hgv|QYL=m~TxV`{7L+W#g}^^>jhgA4h5#mjs1!__2kJ)o^kk;CgHaHfz0PY@8V zI~cuey8fawW&S0eP1uecb*;lIAKXR;ZrgdfCNW)m8dN~uuv1dqo*Y^V+4O$B-6q1i z5&`)tST0o&%$HsY2neWfD6;Fys~%O(?(eMH40f5aP+LX+AcYj*luG7p#VeGZWQl>b zWlKJ-oNv*cNVgV~;;F3ToCrq&6sR>b!+E_D=JsqI8bK=@(gfH3e^qFzt>h}afT|E-Ph??WX3*rTAQyz?4gzxQjV$@Qw zu%zq&*xjF?eb;)a(SM+hbbu4EwbkNzJrlKcxpX;XO%z`i#7p?*Bp~Ro zU{?a0<@140O3D_;euaDY5)HSk$E%QIg4wB@7TE5=-ycozBY_QmlJ^n0MqF{r=vcmd z#r5qrYyIl|Q4s~bR?Y0zGU^t#t61KK^!pj_2*BE<-MYj|iyHqZN;o3kDw)g4y!P32 zCZDp!=@m;`n{K?4zwA#{T~z298Lss8;&R zY9?XYdVQfk1q-aG;~k~riDRVqDkr2AI7tvW_KTm-=662Qm_3E=T2E2k!+3}FB}Q^U-$#fZEf7O6SPakw#A`Zk`j(T zM+|=vx0@XIu;4n-tXnv0_GI$h4ZPo`3#jGpP+CZW!6=bYdW1T-IQ= zkjiemM;cGv%mH5mV7}mqkSEHJyHYZtRbeJx6*E`CEAbmhTt$c+v$FTzl=PI6yWyLq zV}XF@47=Lc8596>xY8p;VXFy&!)XtM?J`k%l7^!9Io6m9@XtNA%hfD|#poI@=YsX^ zP|8XO?CS4_UvHiK+3Gy0d$D#gG}1y+6eh9d3Y2SiH$ot23D#d^qn1^{RrJx(`3&)q z(^YZ2By=_r-k%{2g38SNilJ@U^JDK-+uXZn$ACm z6&Yn@OlsFGQ{bnj7Hy)1Z-SB^4g%(M=cmfiQZ?ein44d%Q}{LqkWsH^5d^|9_rB0H zIDu*qz@0_GdE#;VBClGV%l`2)df_5g;{##q0N;07`6&grnVr2AAUf`@}n zQu}oM)#K?&YH%XsvxZOJs7ePSH2NaCxY)|Y{Qaiy6`7Qk6`qq*e-Kwxf3}b#l4z2O zt|WJOaxvTM)hAaz4?6jW2?qjnYbnc_B0wZ6H3pYedr$j{VrJ&SK~^#QJEbB|mBSjbZlw~ z>kFgXLNdy@XbZeQ@rh{~S|e$#Oa>wvhDKW3i5+80NdT#g7nt><7uP4-jhk+7srF1n zr}c4OE5DljLhYhmTp)07ImT~4 zeQ0)M65kh(y(5mo%I_wf^OjP*ULB@+LA}ay^&%pgKqW3|1uu==X4@NSqF4ufB+Eke zdcDaWH&>zGU!PSwy{jXS;p6uPi5By;T9y8lco}hr#PjFnvd!GeFV!96El>1AIKc~y zr*7kL-e9bYl}kfERxO>M{H_)&AamFoaugDoi05Uf=E3{g>@O&xQl|Z0P0@LuhDZKyV>hBQY7`19w_(P|Q=w+7;|QF-I>(}#ylo)F}}!`I8jZ1edT`Rbk1 z1I)jBgF=TMh`R&Ly3@IfmbM)VdGrvvOg@fx8~&VcH=m4U4~xe&)t+wb`9&tf-h6)U zsx^DOQYkY8*49x*I>B1Fj2O6FumR8+y(jbkzMA9`LV%E*2Z#O?9e>p*SNN!3%5VA{ zW$@VQ3Hnu&C7VrubHfZi0T_kS+`w|S8A?nfZegK59-ez8Hsx}4%GYNJKQ2h$``Z{o zf?w=n2652*i5((wfta+=^4r+u9}^L%S)Mb9=#*taA)=x~%Nt5{(%IVW1+F*4JeDhU zf{6|Z5c^Qs3KX*6-b}=Tyewzt2WL!Z_a`#&g6rxu)g~$A_>nudW9(uGbv0Vk7vL zjWOj6_mYMtIwG^YUxXVR5`YCz0s$ZI$O`!MKHEu}ABsg-atH^Ev@M_}-JYHxMHIr0 zn4T#cJ;tWdL?U=z2s-t~jfnhwtk5vdo_C%CAvK6(mSf4M7dB@8q|z(wcaj()qG+d6 zC0=I9Y+{p1Yhse(82P+t`OqVyFEMk0nY@i#d&AIsh}1PLvGzbl<1w_`GQMWY2QgJj zv%T%ZEDycQjq{oe(Jh>}`$b{T4>#eqyBWf!R`#Udkl(H3yIpU`e5$FF!{juWX|7HJNTU)6+nux_=x6|_d5S4?lq$K6(u~S3$Z0S<2{zNxL*q3*q zkGArxr%WxQxMn12p9i_?0oc`WWWI7og=gt^E_nF#CCh6eC7xC7A`TWmwm%|7_iC$C zzVX81pqj=W5x2%tav`%VS}pm<;cvBxYk(y!z!GAz!>jXKjS7!XeqC*i%+{=|#x!yg z*{B=jME6KS9FwIg+{v8VH!=H(TgnVJ2kmM@dH&NI+e+PYCS0jZqBBGUsL7x&w3FKLUPwLlEXuzD z70_USyju6GVgN&2$$B$WHb_V61a+wQ;hbMV`!t}zs&Qz=s(ijh|7z>EYMU#-kPwTZ z6A&02oZNV-KhzvsRB(VDq(jWW?ffPX(=G+IM1!HdE zE&WmY+seu$?i(afqsCxR_Ub-EBFM2YG9eB2R|tJq4fUe z&6!DtmKR8gYU}kuav&y6<>-&F(1M~_*4`#NhiYBF@7v`(!0cHwCi6Mqvc9*o!4im{ zZAcWu+wZUE^F9Uw;aRx*y>`MdIwJ}B9tDfl%NKq9CWasMF#rUj57hP0;2MxGOG6go zB_`P$q`B^Ti+D0eHGEs!i32u-na0gV`{7CmfW>?cg4Mi@MAD~|1ua7Q4AtNj%AAB@ zGSuxBHxBfsw^5kMo+xsM>v})Wz~u2@nkjyZ?R#|e8E3av7vUyRnLMw;MM`EtOkGU! z_IA=ePM2&>{m_VJM9u!9@iho|4h-1Fa#J?LP}gD(`Tg~4(Q#<+c-o-t(-jj1LofZ% z*w|o=k?hX%A;ZW5H4X|R+WbGd!35e?SBha3K&HpVC-sL7+(rO)KA!u{9uHI2C*j*0 zaQor|RJX!)v{=c6c|*$!)qZ3O_o}yAEF0&D$)he_5 za6WtYsrJI3`6;|ibA6puWp9Md^L~efrnr#1)bE3NIwHgTUkn@=7@1@gURf8p zn99oFAibzvqCSsqwJIZMdL;Jr6zEr8*4NP9VCk$!Q>Ug@K;-&cLBz;re@_)sun1l- z2u>b{Cpm*G3+YR9=W&y_7w^taqTb`h7f<@BXihJ8YggHCx4)=5o~QmK?8Yk7=}hPe(GkO;A2Ns?QL8cJqLj7%VslAlD7GH> za&Mw{I8oo^Gji1pawdsoJi78_Ad?K#ZIzFy`+Kn-(HW>6Sh^poMe3rFodv`{dUy5pegkuaw z@=E&Fe^@3x;SMon%7cPgKXu|5PC9R1QNgL&P}ZtQw|;(jC|>c-ad)|yRMELh(D-3J zr*H({yb50}Wp)4H9WR*Rbu_ij^>FcyOC>W#R=HJ^>%4+Q7A9cQ_VI#bT3@CWWW#}i z!4iFOs^3x>QZ7E=4uQjU_qC}NMk6CSQ0cVxyd{yrCLjVk#z9hJys7z^$#4j-SbkUM z;2kwTSZQAA$|%2>c<)d}u+_OT4yR2fbFFfztr>YDLsD)@@L6wHsZiD?nnuw%7RTA$ zH#rG8Q6`P8R2)zS7gdh!J2a#wCcV$OJQ%byIImizi(!N{xLH9KnYIw^3Mt@8bWE|2oN2i|FS!HcqoDEY9A;+%YH??uOp^v4Y*|LR7ax zU%z{D5-p#%A)N5dCJnyb=!ep%N3_yYgu-1550AT|U#N)t3!mjum$Rw;nV(jX>}2m) z3jFZsYpP(|&jb4Qn$Y)kqoDV!sQ1@Fb;YNz3-AIWB4`I=X3^o8dDPZk3vJ>5x=|bt z-(j?}_XRbx7r%ssZN_Re!P(hq9JR7(Vg5$VbU&fvc{y^JGBp>tFq)nZuY*jCk>!rW z{~Dvwn7Cb9xzTsN8eSG-gFZ8JQ)N1h627^a$HSQ3_vyB`&)ZhUn7>$CySS5PvoPhg zBDIsES1$h60)dVmv(x!$belMsXEZ7XPDsM(>l)p%!-w;mZ#l8C$$}6#9U=Jtx?6S0 z@>^{g2duy%R|fnHXb>nW{UVu%;xYdW*BKaJvOF~H>&ukPVuqlv@2)#b$u=`vTxQ4o zH{KCf$MYJA*JF@Jy;i#&R!L@MhSxRl8KqX%T^eq`5xVEJwroQ zd!$6!RoPS(I(86BvxgJ6YikHMp+=a3&nl4m*t(4Q!`_7Txr-{j z+?Q`6^_u@ZH2!3ZhQ zFZV@%0VhJ;3_mD&uKVokthnL8XJ1HSgtY+CUMLVS^s_(w1BcC$>A&P)n|;|zr{gbU zwV~CQjSa1<5n9nIpU=3Zc5V@~T6{zjKpWVWVMUoM$Qcziq4(uNEiPPI)GLkrkzHNG zs;!BmscdX$q&Mvby8QI7&J1`g$w5<71K?aGa^`>oP7vUF-G?4G-EvQ* zo7NicKS^Y^CLlLu8i}Vu5P{_+zd|l500JOud)h(wzuRDa2j@*svkH+CTi{Z4g9*Xz$?4bUUCvm_+U^*O*}cosKRDDBGS_ zIV2^{W>0tGs8kRm&7KX~DoCo(Kb{%rL8m4X1dPC!KC5kGvvx9r8|R_psII8ofWL#N z})F(cUp|pOEsmrGbK| z#e$h#=40v0(q?gIup|JZ9KGHS(~UPP2a8VXx09b}5H61ut{>08!5;@kR|e_JY!C!B z9U?AEk1xb2{L6DfgNQA|UyxD-59n9O#lYvsW6%uc@)tpX#IFJgzoS``yys@{IKpUt zTuujhqA{mS4OZaKG?TfLDyc z2+v(SrLt0I)kI5|`O}aFCvzE3TLHlmX?e!rl|tfKEo67I?Cpp3*!Wa20THKa4}ou2 zy|)s0dCK7SKJH8W>>dWn$0afa>ZyP8s(t-*eI<(ebbhbIkXt_;FFP`FnZ{XkY`);L-HpQEGkegA0Hh0vVYIvHgShmhE=J-zb8U9|30y zHHL>7_H=e18!e3*a}jVD{}2WU zmv#pH$-0alj&s@0iy@6?>!)O~UQ6s*irG3|PQIzhYG#Iq!xaNEwjT|K!wWoKNXI4> zF)YpfDL30h8Bb#utTm3KiN^J3wO~{9cVlZs(bzdT@e2hth_q6_MTdml*z=Bz2H5Ql zNfbo=iE_X10o&2j)#LGd&3*E|O$d^e-4V*@qD!ziHnuO9lXm;)J>7Rug%Zbtg6kDL z-)mXGSW*r`o``gSh@w{02U2K!Osk7e2&676zTIICpVvk~>L*=`a*Y0~R86O~bkxyn~cdWxgNMZ(!46aD=WYJ7h0gO03v(QnEKEH-mAg-={;>Q=w*&R-$f zESGZYXx64q?_JO9rIosfM7I+i`t4jQVUdw_;7*B%0rlprxuRJieVvpz2!xL4$la!v zk#STEx6N=t$I}L>$vdZzRhvzAyV6U|v)E>4$~F}xaFkL@qCuTs39(vgnCRYLc%y7O zo;BT%ts!*lx%2Xc@*nHe`4RAOL?;O;P&qWbPk;NSrQwBbnihiY9T_`b|ts03z^9ucVj#abQIS;`In^EtAQ_Xu(HC z>eb_;;QT*DVtt=OzkMy0#loXG8aS}~{JoNHKV2w&m%&zA^PoCkG7EP&L7*>ti3O0I zv`rpqiiP8L(cN+dJ2%|EfeV_|q~8Js62HLH2&~#{lTM=}2P7o072unKktnMDiN=nO z^5bhlh^t5B{H6{dLhucaVb4}~*7o}&nVyX#6XMsKT%5bzK(WzqmC^-}N(H{+N;)%> ztuDVQOHAVHD+!4U&$}SR(Mr8b_gG^M)eu}vgrtFx$U@&`r_T3Ay@o>Tb(EUck{M$V zh5*`Ig;rKijnM-I01>y0=FuhPN?2&FH<8XVxvE+YASmdrx(-^X-UXroUeyxnwOYSQ zq!G&{S5=|jaY&o}kdPMY`=RWW1)Ei5LQuuHLk|IhbMN6A?P@`7CFN)WTCX*kIjP(4 z?(auWO>G~rA#cBP|Cpc7`Gt43?jd0IOG0?DB1R)4Seq!^zu`*+Kx;9tIFM{xay5_eZw6%3{clM<~ng&&N5?6DEDMj?vO+n468U$F?UrsUanVS0Z zpS8b!d{`y0ZRaFQc^<5a8Szpdq0&GWk5K3ZPZwXz`+ItN9)ZyFJ|SIn-AHIhp|n~Y zyCyQgEW)8*l{Rf=Q}gdcNa9F1`YfT_Tg7K`a`enhr*3^d`6nne1#J-GxoFG@rtjUI zYQ=GL3-mEuCS>v}v|DV3SCp(EbIvr6Ab*o8l9pV$L_%iaptwZZwSa=+q=U3-9l;yq+I9Cb?OGiAkkgR!pR=ovin@#m(ejPJOLMd-=E?7WT9Sd$dlD2mJbH1`~cWe(UZ>FoqB3h8nm4NDo zt<(Mw1`&FD2bh3|)epKWo#Nk}HEq2idn@E-Wl;ZDu#B)FS(Ty|pW?k%`&a z!!*?C=?{Jic(UJ3ow5!M%O6sbTwFXI&wKp8XIXPv@xbgak;wA?XWQg*US8? zzxuH>Q4IVkZpxCbzGO(s$A{S6?Kwjlv&2l9x!8xJy^e0bePA4uCIEsA((JGl$P-!n z>(C(1l#47!OzmF_>nrg8j|f$e(3QY?Rxmn4miy z3`4aI0OM^8K@ADWyTkwl&9604|SqhUH-pja{%yCl~L z5bPajtE>c~F{M0}!<#biSE2aYY!YZV-Y(ENEr9dlqN!VfVc>e-$m)c6D zWSE&{`1aph;EnllDRJbuu{J|$BdSu>hr)mNB5~&$Y?0a~CfQ2f@CBO(C6S%^$8J1Z zo{**%XVjNqw{s*c;FVUlXz6}y4~p!=Ik#^n@3JS<;n4#|JYpgR5@Dp`N+jB}d3#fV z5fTLWhS*8Q=FCIeO2_bjz58|B8U`Hn8;@*vQ(Q;vx0IIDPJ7xr*q8%HF5k1};J{(n z5G(J7pw13L(njn4Q`@s8Rs_PaHHcGmBReN0CF!$e121*^YA+82 ztxFED_bf(GCce4Rq$XFs)U9?t&mG&3U!>%tlBHBrhGfS5(ft5_=qFQjVbrLgK%X4q zakF9eTX(YxXtz6{{@)GC&K}U@U3_~J8Z{(ldy~&A>8Fry*Ip+PkeP6+Ev14Kuw_uG zC{qCMs@~|zEjjxmLj=IkL?^h2Dyz?}LX8qeT-`eN` z%Yln`H#dL317j1M5+HpoR{kBl+#`bEJ(SIUKz{4d4HdSpX?cv?ZTGcNR`wSLRA@e@ z?ZESe;YQ)BqZ=Lc1To09bD;y6h{bfjLL~pKkv0242sgZPT35Wsyb|IShpY_yKXE+2B63(|M~oTvgz#4vDuWuL0Dj4(rRr8daniv zc)l4`>BTO5M^Axf3$ zz$aFr*6Eb~2FRtJ5IpS~antFx9v}$u^m=(I*XsNX|mp2lw8i~?ufBc&rQ7o zk&bcjzTQ-=VD@7~NU(>r=G9AeHXtFPA8UZgg$4_*t3P5@3@~yCSB+=JtkpM?u$g%J zDpBolNaA>eA{&lF+5@2a1*gVtvyop%V?@gL!4*`=y}dhIpt)(Xn2|EdHD=UkzPbtEvAY#&q}b9&ya?#8BeN|8Sud{cv9N%__KSpo%9gD=X;sP=(e?B1Nsm z5rkBYM)v+ef&O&vg%PuW zv}W@S)!(>A62_{KnL?0dXoMu3_uF*G+Gj2pP}OjKzmLAUG5>vXDW*3Wh4)&J6b|PL z>+z5-RH^+wq8kiPuldAJPLaXT>oPakU}eDQNWEE)3UzXDvtK#n@cVJ;Go;#BS{BTa zCVo4IE4YKy)Me4`9#1=-fp-Z3Bz9bzA@f$}lPA%)`(n~!#Sc3FwtF~p+S`AZVy_7> zMR2suZ)PQtoEk2mmkO3KsS3!>s;)nuG5; z)}KK-`s1l;ILv!YOpHU@cHQ+BSqeX!a_UGlIlSL6=1*7|b-Uz88ZDVJVGea3Zl?1_ zBRU)#!B^vegx8C`A2TDIHC!AD?96;8`7fpH0$&DYl7g0&qK1Z+kZmp-B+^J@6Ab?~ zeH7H8YI3^WFuPT6yPlShD~V_%$%PdVQyx_Cay$0(-8^oVq7ZHz^Xah3Lp(!CCJL20 zU-Db1HChvkMC$hDY6W3$>52vI?DSXuiR-mdFIU%X_3Zrg#^bpi(^M+wiqyUqmACQL z@=?aZEAUu!eBS|9S+7g9yIOP{sgk){% zg0F_{0J9P=JRX~r{0fGeTFaf$(~EZ?lR;tcrcdNEtN5Gu=R3~D*HT4IfW5;HaEuhV z14oq3S&MCFS4wTYWQM*w-&JE&slU?)(X`o)y2MaMy4HM4lV7k;V-d-;MaDuQN z9|1^&Yv3G=ZU1E6kn6*b*JC3<`Baopu9{-ZOi%D96hW9h@jZ$TP%}ZCWNKXgv0h|MG8PkbpQoPZOwI1KGdP<+)HBF1~Lj zpx&GJbf%$G?H?N$;cMG$fh zUL#8%#(44~ua4xw7sYp`#`)Z&SS|PXBtaol`?ZU1H(&3dfonE zt`EyA#meWfB*1S0?^w9fT$mr!dwb+yxS^dGGTRcT+E84!?fJmy=zcy3R17#~*Y!~N zxRG?pFZ?L46MqOq@x7_CR8x$^bHV4*3Pphk`a@Ypz{`cf?LsKGg75JQB;Y0{))e-9 z+Y6S^sDK?mJgS^;Pbxn$6VsP!qlov4%OYYhax_}5(X851#{>qQWN#n?K})zLU@mF% z8yK1Dt+%+|gH@uCC64Ct8xe%G6qrutr#vu|e=7e4@~vl-1+%unINZ+gZa}&q&=6AT zvyJZOM+fOaBOw?<6B85b2_b6eX|mJFlSlw7p>|`%-rvCS^1*~vOnf}NMA{w*1hF-o zE1bt@J_kEj-0dummI+`WuMCg6N@KNPw70+DZq)h@!n*1Yt?Wn*({BF|RGK@SGW913 z%zhKA?}&&%1w*#_A8)AO!AwCAu>o`%9sS@)h{@?h#uh~|xH z<6$otm*@Sv>az`8b)MjBOm8IHLj_BnY`_t1aGHjbcmVfr z4D~chWquFmr9GRSKwcO2P7_AMt+QoG$2V!heW?6=+s&@TN&t(+Lg?Ch3JA^|F=`+K zseL(tHg$6Ob9bGp$Yy+$9BH6GG>+Fz^Lkup}XB_svKyBx@wJ|oFwz6H1WpDrXDv;(Bluq5e6$&}Js<2lK&wK+75 zim-BX`3iQ??IBvH`_F4u*jT}$h(^aUu(B}YIF&t(m-6riq#2w3Mu7F*HF51j3XE!H za5(|NnlwIFw|S^i7I=8?WADpcBMNSfm_ee?c%Fb`$Ills5Jl(!Z|#$PtJbIa~2K64mHnSuF`n|&fhDgOA(b^c%) z+QcwI0o$w7WS(Yjz87k^2^4ff4#rJS$BQ+D@l-D;$@}k)Uk|W@mp9u?Da8}YKhK~>E=C;&UT-JY`p_~m3 zteEH@B&r?fOgFJz1C-2wPIGU3l%6;zC}fuie^TSAc9}jm?MQt)Y_%%lm$nl znr%QN!d41@{k{z5dcQZqdsBIL#uPlT??fPf1^ORUxr8Gi7Zr zoAas7a|I6z6pF7|u4D6?4Kr&tEP8Fd+(*U~6k%tJ{0d4+lAFlC(ND@K#5QL)XYB^V z-2kK){8IEbE+?L_Srn%}-#<;7vm8WBl2be`-##C`FE3q^HoaDE+RCJ!2Xx*EEm$l& zUcRT~zW(`J6N2kQS)tRJ?V4g4wzVZ^{$}~FV&whLm*bYh{c~aG2V{G4nk)c5-y84C z1244AB|W}7#gCL8^y!Xw60l#_9&kL5*x6xrKkL5P_qcdFKQ3yGi{V6z!V~Qt9gV4I zeVEwYV8!tn2)Ia!hvudTyXP^kMTPzn5fCep!1xsgiClhnar6$J00Ob6SH*8qkb#X) zIXXYT+n$2@QZTzf@)x6%IYcv%OKrCPCEhp^{}~ev4T+R?wAmy11fRop=?0)bBzQ$> zQ4(YXRk(Z>lJkrE5Bxp$=%!;!;U4=-&v-e>{mLV~c!RRiLX&i%eteQnkw_+TJ0A=t zW^?=ptohZM&GMZ#7VDE{zfTeG*2zim(vnU|M?<2QRS5aa>qGxvDB@MFuWnG;b#;(b zGHo$P1XvDsP*Rk#kzXC~vwSvif`X#?T{JbqBP5UP!ZR~!+O%tg)^9lQb_acgfOtb@ zdP(rjDpawF4XP7D`Ks*vl0(=DaEEN8(`H6(baJguaT?{v8&QRR9Xb3 zG^L%{+k(4}SjDD;Jr!LifKi8urUd4G&h1Wfq9o>}eLjl$}^m{epUot58~yxFon z00`74dCVsIm3qtXa6ne$ZsqwSwy!^ey~^d1B{0Zqq#sk)?Bx|1tls=xrgNG8;|p*# z+u@KAOu-oAMAhrS>7c86F?^RAY;l6$lTA0_@vWMGnMsmPRjdm|;;V($ zTbK-Ih6r3SzP$%9S}s|ezp0PERGpdp6=fM9(VeD8m9A4o>wV$0Oho`19t~a zh#9X&aVNzWp&K-lwTid4?j6az2Qzs~Zj6ah)?oNMDZz$|Q#xGZwB9$CkM-$_;iunE zfC%srs~S&3A5uDrhDOvrOoVBL^?I?SV#4un_i(Wt6(u&E>WahtWIFMD>#{Iwaaucr z!=lF@qIfr_Mn|{3-hoYKE5}<~-;eQEtWQ|NBq5=>J98re0_jyfJ`ASJ(`+{aw*757 z3E%?!Ug0G7{rxM{(EU`jhxeVQ^YPHoYA}^im&PfG{2Y2by^SAgGqX%~O)74#cLTuQ z6_x&YGr%64yWjJlt#P8DqOK0R%-DX#sLQ256%$@>iK{l7t@OL%;Fc z+7dqPymz#+4P1o5*x2l&9k%^RsHJufQZNDxMU<7Zb`vX+P(|bXf&-389)PTh}Zu668Q|cp>3nrj%Fs5s7STtw8p;l`DS^&)tiD09<^)gs* z_%A&*9cG9W$Q)W@bu#hsMtz%#B<14_GCu;Fh_-DpFFP856Xk9ms}~wJOguZ1wF;Fe z)V2C5j^-z24+Bj`bx4{u28jf*Iy35gUmeA(?31OVy&%nJ47Lt5mFzz>;@|Cg-Kvbe zoDMI#Gx?iG2@H+$zr`Wf*0{Fs7a4SWgS|Pt-1(E*ARnR!YO*@bB^f#w81COX-mRToR6nmJwE7_+F;UlxC3$d?n@JfcyeuozFEB z-`dH*`tkQ~!cz6GdH3Rv?d+10)vXIcKkM~|4J3npo9Ou#pRNSY))+=ReWLHGC=ezf zPI^~HdHKp*gTcO4C)qH3E!)!tA53pvEvov7!la zp)7ykB;V=bR!9tp5E6bJoOrWP+o_h$-C|>w|I%CoRk+QgtfBx04#vaCfg&wmb!bR| z2r7#ed$;GkXUk{lY=^L%^i@4b=el;UZm+Muo3iWfIPTx_Fo#M-mZAZSY}T4#Oa?1C zMx!)xf`8Or)UDY2`to(Rdwy!(qAg*0y^5&GoRxUnqspqXQ7UpBOkVc#R;uf20J~J{ z&A$!AEOu{xwy&}uZro1o4ImI@`QfnBW9fL^FHx0)&Vbl~Ayhvr549T0s?04J_x>&u zb%T5BdjPw@-y@RSvcR!g9|xlNKi>o*upFj}r|tLlF>l7@vbhus@qem)^%z(jDXXE6 zR@l9iJ?I=KurWyk|8KKBbZ&0VboK6E?k_H$Hi@*kc`mxwJ95@;pt&O92*xAF49uI? za=y>E=XH+5+o7e3|CafNtnEsItkq(vWEj}+Gho9I>W-Lp3uUnl@`Oph&#;OhkEbN{ za8ruc2V=2~5PcO3Fpx;MnNwqr;qR}kz5sjGV{X(GyTua{2uT8n7L${sZE6ki6MeFV zExE3B`)Fzsqjwt$J%e-NTxN;*vXTk?1hvEF1Jg^nl$);a#W!N`=k+e4d z+0Fc2jdb+5y{#Gn8XPRXPD{Nl(>Q@Y*mF>}#+w%{U;^2@F?o_t( zUaRk6!o>^b<3mHqVHw=##wpG3AOIPE7GkmEz}>N^F7tbWhG+Le`QTr`SS+2E-;1k< zOa5!=F4lNRL95qm#MAxarJ-yV8JM6#Xy?POHEAT5)P+A;Am|gGUY1|=MFEHk=INOz zHVvm1Dm{)J0LiI738-Y!|FU{PRq;dU#wX!bxn857`MF))ddMoH>Y7!{=>rEzS?Va} zQKQC6Y6g5@!@_djI-l)wicE6DjjCbdZ{ zU3y+B-Fe@Wn|7Nx-#1(YTK zNpC~s|6IeYY;TCxcInEqd@3%U%4=&&mxP5nvAx#kTWKg?cgYXF+)?nGn`?~C%h8bX8$9jBRp9Wtv%S4r_%Mq7{0SYR06VvLwhVu?xe16WG~N~ZJFKJbj;7V!Vsl1Yfy@6z$-bL-$Z^cW3i-&s|iz4(Sm z<4=6kG$6DEW)43jCv%gEN*y~R7+XwKFUlyynY1Se=+F{ zq}_JHUQA~T*>Tw~g!e5WPF00z?q2Zs4v9pZAE3Z&b+EF`e?M{} z7{P6`Z@ZQG*4FmoXHtjDTEZ1u zz%CNq7D}h#zT3DNzsWlY{g6lpPvvsJt5&EVsGL16zAlpAz3k?_ zDp?WhlrFs&Hrx}hfm2st@Kn17`-1|S%%Ui837D0>{?c-2^yX73+53WCZ}iq$bEmwG zX14R6bW9R}IkVxAl=<7_&oISUOW5PamL`_2xspwTh3{!xbb~1y5g+f%N3|0EfYIplSz>EF`)R#oWV+%Aoyw}= zYq4luqJ?iF2=cv|3kVVQ7^M*c($16#tTud-LOiLS?{I)sQt_0`HOSv+PdVx@eHdm` z1;mEr@HrThDq^m;bgDPzpfk46O3N1jGpv9<+aKmJ03*l0WfGHhSb8Q!Kk({O{ z1XyHz1eO``cfxRO3J%7`G$(&C{;9;re>=JnfRc82W9J%P$eLHTK; ilYIh8<&GcMJ_1$FbHs@T3*hQqfVi-XP=%nb|NjA9Z5!19 literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-unplated_targetsize-30.png b/msix/Images/Square44x44Logo.altform-unplated_targetsize-30.png new file mode 100644 index 0000000000000000000000000000000000000000..4058b451c19c4f90ef48226922701ba3d2f8b17e GIT binary patch literal 1123 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 DI_Oc( literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-unplated_targetsize-48.png b/msix/Images/Square44x44Logo.altform-unplated_targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..c563c44266962c45d3f58971488f6e0c3b02634b GIT binary patch literal 2250 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 literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-unplated_targetsize-64.png b/msix/Images/Square44x44Logo.altform-unplated_targetsize-64.png new file mode 100644 index 0000000000000000000000000000000000000000..88d18d66eb10e41d8edcac453bd029bceffda75b GIT binary patch literal 3124 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 O0000Y5#LxAyF*tUaf7H_b||$aAt? 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 RL(c#J002ovPDHLkV1hLYP>}!t literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.altform-unplated_targetsize-96.png b/msix/Images/Square44x44Logo.altform-unplated_targetsize-96.png new file mode 100644 index 0000000000000000000000000000000000000000..71384150c9c95ce5405a2bbdfec1e5114a4db2ff GIT binary patch literal 4685 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 literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.scale-125.png b/msix/Images/Square44x44Logo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..110f91aeff05347bcf0009e4e5ecc8a52e450ed9 GIT binary patch literal 2648 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 literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.scale-200.png b/msix/Images/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..11734c82d0d62d13c36d102c94fba6dd690b90fb GIT binary patch literal 4383 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

    <%di@@)W9*W71IS?Ft00s|c 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 M07*qoM6N<$f{bIGg#Z8m literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.targetsize-16.png b/msix/Images/Square44x44Logo.targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..87b19c8ee265657edacf8d6da8e3ca96d3489b1d GIT binary patch literal 622 zcmV-!0+IcRP)6r6QeU5kZ)G3s4fLG|quTfFkXiP;yYGO2f^Vijl#0Me!fA+nZH#0F%sdU|ok&zghnp)NQ@Gyz_ z`DZvkKe+v>;d-t?XXjUJZ^yB}{|yTZgD_2>+?SBgXH>J#_Z)t|g?RiGN~M490X69B z3!$au0oK;OsGDqdT|VV-nM^_kOrp7Y35$!}9AXb3GMi^+I#4YBR(G0K50B@Od}}y4 zN#OGGRDSz|+1aNU9sPkoU<%Rb3wr=*6WM9@`(MMd-pLB}>YUH#5Dve`=H@3{T%<8K z7Z4U*_6ih?J3GbZfq{uK>b14^(BJ=2*yz~U_#i+B*xL(AZ-b%KreNHev@L7AqBE?X zo;TRqnwE7ksH=O3p`q`FvWjX`Fz#%c_wO7~U2VeaeIm9-gq4@QhM+=OWeca>*?d#( zcQga3R8slOqS_RUJ6Eb=v4G>_pX#|#_=|KpX_O_5R#9yVR;eP9&&mZ>F87OW7}p77 zNa!=IqS_RUJ3Gj1P9)x{v#vLa7LSE}*v>(FdoSABCRIp?K&z-W1>?@7?I2fGc`!U2 z#m>$;R#vVC#9}X1Jee?tgg(`l#?9BjYh-CW;sevI;8KJdDM@hvjl?q{bIpikwAJSwEv~7^nZvX%Q07*qo IM6N<$g2!AX$N&HU literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.targetsize-20.png b/msix/Images/Square44x44Logo.targetsize-20.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc291572df0910cad90f4f3b0befb04ebd751c3 GIT binary patch literal 779 zcmV+m1N8ifP)&E2!5gPkQ@4Z8-uF8{JV)p3fx-FS^L@{GzxREfcQOj0zWynK!47!6 z)ndK5xsI8c0nE-mIq8UeEaLOsMmGB!8yg?6xHt@try6^E8V(K)P+aW7{CrgG^LiWM zcArHuIeZeKMA^JVb8`L3b*-oo#{0ZEcXjO)0t5X0D5Cza!yh{fYQMD$tI-O7*~ zz%{dzb#={9L(Vv|W#YQJ>!_*uh;aBaW&2ZPy1F`GZjnhE�S2q5&pCp*P3K?C^LL zw6;btIC#a1xm@SyV{I}u;|^`8vbxFH`Tb2Nl9{Nj4N|8sV0(K`tQ#60(C?;f}54AvP-gS%M>OG}@SPJgx5iNq^tT3XI)bk-S5gS(jz>2wOCqwS7ZCi9E9 z9_u<(ltz@6R$^^!1gt9-Z8#htY4nM19?gu&c6Jtwh-3_uEzYH@T)pLIBoP1q#K>RX|q#a@HLrCReLcxX^lAhJj{s^#8bmCy08;FfJMtvVre82uc;hM zqGpju+tE>Xd}8zUO^`R)PAD(0LQ#<<{sJ`ZuTTaxz%ft^`~wYQM?3qMXCVLp002ov JPDHLkV1hQPX_o*1 literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.targetsize-24.png b/msix/Images/Square44x44Logo.targetsize-24.png new file mode 100644 index 0000000000000000000000000000000000000000..ec54700cd770b2680fdf83168c01fb0984dcc556 GIT binary patch literal 973 zcmV;;12X)HP)CCw3`6dwtKK_7)6l%al1Dd7VwdZ;0YeMmu2^pl^J7AD~f2^E4A z92@kbFdH8q{S=5!nMEi#5jr~K8+F?IjCW?P&gi({{Oohj+WYLg_Bs*{f=ZQwoSZtu z#ib%VJW9lDwttwJ8ApHrJ=pDE_d70mjRpswz>y=zv9$CJD=Sl2UtdIM=rJrTSj2u< zm8dK1xbjFf`PLk&$YOY`|zNq~*KJ#KZ#R=H5qpdl{yu z-}+9FoLq^bqL)<77QTP)-S6rO{QA|0fPe?Mb*mHI-8zhoJ>Q!kCMF++g)gzTW=C`L z70k^I`klaL`-1xVOq7@R;p)|=)Yf@Q+U8EcJ->FX1>4(OKFB3#wdbMHoTf?xV6~d* zn_+PKJd?Dx=Ap9kBXyx3wY4THcFLK6f2hgShRMnId&p0oyot+~YlvK@h%YYwg~9L$ zQ&Y{ZnAJLjSFf^=l9ErHk?sVnmeJAbJy*}jc!8{}yI$MElD&St34?=YF)&a;5ywsv z6N$s*zB)^crRaHGXXQ71l6xXE^A0SQ2~14X?b-<p&}?5x2ROH0coK?F*om-2+l z&}dTqCYKQraaxgJX~{}Mo9x{xSc->-*E5nZF7_5ru+9&Q`FZ6T=Cs@AB;kr|T%O<| zVx7zGc@S1tZKR|RikR8_iO$DL!g6I-bYnvd5$oI^7>!TJ1?-Age}5^|>J-VRpYw$B z5V6kp!|?DMGPh@5cGj8O`IC9rl9CFDv`=`744zPnWnAc7rP3;nb6dD_C%MBFSF6(z zAFs#Hp9bp8P6B=`va|0aFz^9+NhbAQPU4^meL?+fLR8d6L`JfF1H=#Ip6_mpT73pp zRYSxRNM`qrL(T;J5_NQx;r8uLl$G@fS7hUo!4qn+^or#ROkP@QBxgQKToqVe9(N~T z@JrOyr4xS6mfO&9i7Nf)x1{}Lo5 z=-C!TvI1A^dOe9oyT}200000NkvXXu0mjf{ literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.targetsize-256.png b/msix/Images/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..19229e8829c9ff5b2393631fe4fbb5910d708d25 GIT binary patch literal 15332 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 literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.targetsize-30.png b/msix/Images/Square44x44Logo.targetsize-30.png new file mode 100644 index 0000000000000000000000000000000000000000..4058b451c19c4f90ef48226922701ba3d2f8b17e GIT binary patch literal 1123 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 DI_Oc( literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.targetsize-48.png b/msix/Images/Square44x44Logo.targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..c563c44266962c45d3f58971488f6e0c3b02634b GIT binary patch literal 2250 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 literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.targetsize-64.png b/msix/Images/Square44x44Logo.targetsize-64.png new file mode 100644 index 0000000000000000000000000000000000000000..88d18d66eb10e41d8edcac453bd029bceffda75b GIT binary patch literal 3124 zcmV-449oM0P)ZSCK*p=^u$b@WKN97PG6(kQ(Zd%%;n2VT(`&W0rI3~u zf(~l5Mi;H?fRd6+(6i@Ii`tOOuUX4@f^{8m=FC4JBxEd3fqrJ)-_TGA85w_(xK~=R z%mF=nCcyadt6=ly5zyRR!@I6hJ%UY}hQOFHUqX0z5>5qS&ueXMg`%S4uz&yC(AZdF zpq4G9q@0HA>>Y6R>K1yMIVPCr06RNRNJ!WKp`m|b-(Py^b+~^08@+X#oA1NHgUN98 z=n`;u?}x@I;o-x(IIL^%+M~8!a1;YPz{#l_{`~_e6xZSL<1(XtaCaXFy?Vv4&#hb2 zVb7k~P+xyTtSRCh;Nvq4l9P9Wqoc1znLj$f_c2*kqVWSXIcJWYuj0?JSHX;I(K%0!-rGwTdS#N zggGEG@&gz?e3jm7zy6v5H8qz6wId}cwwySz7W?%f?^%nx|ea^S!e4AypV-~f$;7DG)KcL2@#QKR_7 zzO}Ule)!=X`0cmN=Ji}MDB=A1zu^=-1=FYR#i8%2bu~Qv&(PHL7+0XVh8i&J0E+e$ z@N}V4J%R1pr{Y5oSkQ54QC4;wHf$IM^XDG}2M15BYp=XA2kzX-gDY45qwiMz4zRQ9 z3U9u-lQ*pB&A({Icc8X54>oQb0SgwK;*EsKlh?xCyXUY@f$nYk9gvW)4qRM(dF3?h zr82%#CohcP?ku*bRCSmG$U)%JWe~Ns`LJ!<>o9NLPuRAdx|~*usZ)1gRvL*fv03vL zz5^(|4Gn#RSDu@@)1o==;Smi10SOQoI0U+P4`msjCTMC^R9wXr_&gLA9>)JO*@zR1 zii%Tk?AU5dzdzC{_w@~hh=`?V$GI zJp+x_wY9ZpoB@5};!-gkF2~K(I=Fl}4bx_EiB@*@Czz>rVeQ!1$kgSdMlFZDyfk!n zLq`$c0b92Yhu*y>;ahqcGdu-La?DxhDTq#)vK|c&5PdJf#ibi=v{s|@7Qw!K%b>V; zmx#NSaPs70$jMm;efo@tE?vCQhPybr4r&@t;5(qD{7|w9W-b@xVib_t}hW| z!xO2RmDU0A@oUleC6czOiJ+hfkd(9!($gn`r7K1|q;o)2)N-pD-+{h;$6;*PikqDo zQZy%x1H8OmV{`slAu=)!-Q=2vQr z8@C#6+}Mi=RHeu}Wta~v#_j!VNJ|^QG2Wi2YhrIhLPj$VkG7gZ5g0hb?4`~Ubnff| z(a|5WAoYQ!uqpnJZC!8D|34!#I*cJ6J`0R)O`nhuc3T)FlmYTb(UCL1F% z<3)kcz9O5*}Nv`td5SVj5k&%rjJ&I zN+m20aC6hP6L*yyQ)cKoKql*A(gDQb5sgJm&hy5jN5ak&InG1tyHfd(gX-!^-b&!) zJ?K?paXOTrQqigFI_-Mg-($sut9ozDwFVd0Mu7iU!khe;F^{3xg%?HU^!?_cMGiD3OPC7!jK{Fs!J*>uX0dT zm8~uyP0s%P?+ESy@%CrWuE)LkCxY*h68ZVW2b2r0f9A|e2o4^u)-1{8`5Xq2QmCyh z!7qi7k+BemNvWt#enk60-Y~x+!)8U{9$2JFbL+hF+yo+ z{aG|M2h?ar#{2NrTi=>>zq!cFT!VWS(V8G!-XFlBLo?X1zDm{D<^Xez@4)ZB?|=&z z1~cmVS)i!s1U~O0i`r<{9!kdw)1d|N_C#G<6LNV0q^D29_|qgsb5foQDA}P!QqupR zZ{M*Jw)+%v`7f|#%SgeguK-AUFhVCb>FE<-{P_PuWaM;7+ooYpZ(c&<3Hlsh10Ei) z;!@$yq-dnZ62lVHNH}~r8A?hn!h{K*GWOOIs8r2x;=~#_cW$Nb*}h5G+B$-_cO1C7 zdcpnscX7$j(w#bd2h5ps7X17MYjof-96$a=d(aVn9Ch{TdMGa52hq{XAtq*yX!3+| zjLVnz;8M5BtZ3h_-+Ua2pWzE|QEMR9q+#<>UkXq2uML2 zHt@>x^D{J!C-5C`<;o_Aib{rFy`r_sNs2~lED|J%g;H6^nA9 zVgUam@7n3ppX09gCw;dWUIs~ZO~PZ+-fDt$cqBz5H5LhyUIfsvr#G+9_@bgrICY9I zr)`JvJb+Z!j*iYSV1V{nA&mr*qLCVl1W6K!70dz!Jeu?RmfM>*&#>IVNdHVFLP|Jz za3*dbluUc83DV(_6wTS$10A)HrCt3_{hfad(}-IIkFPY|;gP%_mu36Dv8tNB9((&0U8xVmaTla@M)_H6-Aa7+@v z86ws7?c3*YiQKMcgsZBA9H!EFq9^NIQ_}W_+wvlw^EaKEq*({14@5gnMn9j2XGZtiF8+FL`1sWL51 zj=B`zvP{-f>!4B-G`EKgS%Oi11mp0C#^OJ}3D&IXt1EpK3(NTc!^V@GZ5hvaF=*2) zeF29K%{K6C%cwlC_D^S{qlJsD3?VFR8ZN^NE#@r^z`71dON+qy9R^-r;o##Ff`9vf zi%WN0!n|+_xU{b%HjGJXX;I+*q6Qv3ChVXwIY_ep-Xx>u* O0000Y5#LxAyF*tUaf7H_b||$aAt? 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 RL(c#J002ovPDHLkV1hLYP>}!t literal 0 HcmV?d00001 diff --git a/msix/Images/Square44x44Logo.targetsize-96.png b/msix/Images/Square44x44Logo.targetsize-96.png new file mode 100644 index 0000000000000000000000000000000000000000..71384150c9c95ce5405a2bbdfec1e5114a4db2ff GIT binary patch literal 4685 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 sM{Auk^lez07*qoM6N<$f&y||#{d8T literal 0 HcmV?d00001 diff --git a/msix/Images/Wide310x150Logo.scale-100.png b/msix/Images/Wide310x150Logo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..3327c1c8d84f75bb7560959a6eb95dc51c0f50e0 GIT binary patch literal 8218 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 J`7QN1IVT=#&zvp;2(?l6bH0 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 WsKo9mO$HpZLeo^!RjpCB3;Q3jbX@TO literal 0 HcmV?d00001 diff --git a/msix/Images/Wide310x150Logo.scale-150.png b/msix/Images/Wide310x150Logo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2cbc8de3779175fa04f5ba15909f899aaa5696 GIT binary patch literal 13661 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 literal 0 HcmV?d00001 diff --git a/msix/Images/Wide310x150Logo.scale-200.png b/msix/Images/Wide310x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..8225797b52a03f04850cda8f295ec2890acf9690 GIT binary patch literal 20843 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 literal 0 HcmV?d00001 diff --git a/msix/Images/Wide310x150Logo.scale-400.png b/msix/Images/Wide310x150Logo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..545e9beb4a7a687752a1e14d8d0d7a8c1b81af05 GIT binary patch literal 58965 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¥E4ryL>(PvzS;^vb4$mjeJZg<@ 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 literal 0 HcmV?d00001 diff --git a/msix/resources.pri b/msix/resources.pri new file mode 100644 index 0000000000000000000000000000000000000000..e553f03ec5e66b308e797d6558aefdd678d375d2 GIT binary patch literal 14336 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 literal 0 HcmV?d00001 diff --git a/msix/resources.scale-125.pri b/msix/resources.scale-125.pri new file mode 100644 index 0000000000000000000000000000000000000000..5ef0e7dccaa1b44b45d80d61489f90f2774122ce GIT binary patch literal 3776 zcmb7HO>7&-6@I%*OS1kd%lfq?YpfsJu|;Z0QMTkXwq@C}l&7u_kJi?_2&>sj$?ux z53{`77#CxAYvaW*TjY+3aR!!rKE?aX?y7#kL&Gusl+n$pqJdFKJivy1XpJac~62L=rhx*xv+5&JdZBU2)TN(x)g|{cz zXPOQ?NSoBlzSfe!r|C@^W`EaGz?XpM7{wNWPXhO`bFnn=S;XfwOUIUgCxA!To3YEl zlZfglE5xn<&(UL=Vn2;71CP*K@auQ672q-8LH0rHD)1ET&^Y@f_ByiQ1bpvczf`Ay zh5h|{ugs2N*xb#2qcUh-g3JkaUp);x4?M_zq)q@cp{t*UrjS{OOsGx*PXQm(FH$G) z40icAdq+J3JPlvEbe+0@g)g1@uMwvSWXl@jFsF0_&thFopT_NuF3Wg+ggvU^FJS)+>EQRUzrwbf{68`04A#m}7kiF5XK9gcV~;eY6L>-T zJE(L4&tqRY*`#tDJG}xt&QeMbyj?_Y4d^R$99V~KefneUErV@4h}%=@2R={VN6s7~ z&2;3xh|fLbQJStvzaCN#>h}roB+Dqh(7YmLveXB(hFJBmr%E5Hd>Jww`T>0h7G!`= zvVEl=_yO<;`-LL-75u(30Q?aAG4^NW1gyM-*lPMa*xPHc;t}lmIdbhfVkP$FUF6ga ztOeWIUz9=MTflwnNNMo@p$yge|51kP@}25Poj;_G*7?)wSe?J1j$?OIuxEh1p`L>G zr|2f;e_uT-aR&HL>a@h$z#pkIz>~0ffPJRU0#5@Ev#-=SUAZvks9W4_mMhQ0y4o7kaS$j^10BX^;H3Ma%QDr*!~dXK(`oY+LR zJU~S~gxBKx(gFXvkefZ!i)`vg<_sVM2C>^ihzw4|b<5@<44Bsx*=XqwiIqw<1sV?*b zvK%?hffHCS$LwriP z$W986=0@C;HwZd%3+3j7gLR`#|X)3zHu-!{YIb~fPLtqlLTWClFBq?gg^Q*29a zI$chu8$2X%W04))92b+VTC2Wat{YuOnqc=`B)+w8MF%p^#jAjP$=NpH=D8PnzL5*? zYUUr{mLxXXv%R2sAP<*}klV79j7q75EdtfrtPaUl3Z~sGf{HWkkh?iUM3I*{IpKcR zPo{M#?VDl5cRe%6H7of%aI7%2Jl80iZq7#ezhZS{m;_S-ce3hHaKy+{ItH@P0NxI$I8}dC|-;lG3r(gQatP z`07mIYchwM`FVN|U!4!p{|fEDXq7YgNqb3zNHvZ_c}W%;=BmnV*9)mlqBh=Ed~H&V zd0r~rHp$w2%{AX9Qn#soO0)@7=V+WMuO4rlKyBk9-Xf+)&tDvg|Ec0{srcXeKStXt Ar2qf` literal 0 HcmV?d00001 diff --git a/msix/resources.scale-150.pri b/msix/resources.scale-150.pri new file mode 100644 index 0000000000000000000000000000000000000000..91454b6cc4ffed3044d0b705d63bd5a760155372 GIT binary patch literal 3776 zcmb7HOKcm*8UAONmSnvu%X-?9HP*v+Y>`@0lpjfx#+EHxE@j7(9ifej?TQ>yYwfGM zOPT7Wx&%dgXb%mF910XcFTFL#9ugoxF98BH={*t9TT!%^0zK3y;C?fF(@uacG5de> z&;QT-ubCaXp=$=AogrfM$siFYqEFC{(evjZ^o|RGg2;QO?G^nWNLJ%H1XAOepdg~W zs5Hmr*q!?LZj|2@u7z<9mU=$L`-|S1ekdZ-wStV<)PKK^=x>mzu5ZPb9SgUqPKW(O z0jrO{Xy2h)g-BCBopg9qeHb`U#KUT|ia(`2U9r`OL{gWiw@o@tD`bFs^z7e9hoE2Q zzw})`nu?=biNOZBrsNTD0`KZP-xMbqBl$3zr%BLv3ZiK4dX_69M3bxeOJ%3Oz>K zM625(c?cnWRdrYPhU80D*cu%(s*xF^>omkK=&!(^Sz4tjeoem!+zTrcMmHkHXc~B& zzpY;aJ_9_#J$(`Q9OmKtr+N~268I$ly`BOdq1!abKhl?g`)QrJjNi~G@Ho6Z!9UXt z;9=UJe*Tr720l%1(J24Bo&mlDyuc~3415xJfS*fbfzKj7r+GH90z3sg#@|X@2A)P# z$9XAn1$coT(G34d;wtbMy$!#9o45u%0X)n<-gWAG%rEs1iz=923`an=0DV?fVtE)PD4}5tU)Hyrh#XGj~N%K8+Z;` zKF;6O&H&HCmmb5Q9$@K9xA7k0G=*weMI07bFYr9p)s0!?N8)YZbJT@d(ui9>{~a<{ z#~;FzIl8Rk`7v@-$DhOgIqZ@g_3^*Lwz~X3G3OlC%25x0hB@bHnQkFRI_m~rQvMFJ z9^ggfrJGN)xbqQC6lKCpjE`Gk3V4pl%cDT=`s%JTd*Jpe3I|8 zLE!tqWBlh#@~ij*HU#_t{0aU?b^=yjLTq*8UF7x+Sn&|{{0z1B9mGoJ0-HqqcOX_Lrq2KEf`*R@md{uJH7 z{2yp%70v03;1Jg4tN?i5An~mdEi;#QU0a20L+0;@_%XP8uDHGdBxube?-54 zim0BX4Esw%FM<4zgHE8%PJvFLKMOjCdRzdVM}HCY4D{qVgN=qL5gJ3D2#p~}gvJmt zc@8n;hR_(YLhy_s-h`Gwh6(Xzh%=!v#F)?+VnJv<$Solj46%^MP!HV&UBH=fo-WWU zbP<_aL`9}x-xAikiuqo{8TvZ(ZXiQ9QJ-r#NA5uX6i$d~?5uI@(!2Cs)Wim=MmRL1b_uuGx-=sDQ5-6`gV%i_o;9NW>A zso0^S?|~Uu`8}%yjZhSYXW?DQJAM#RN~qi(XLexVMOay5yvn2$#mvwD)36AI+>Nr&CYTrx#Pg9HqO&se4AT2 zO}vuMG&(6e?~@2aKTKwg<(FL($oBTkD6qmk zN2H3ORif*%ayBf_E{Z5l?bu!i=Sk#yw1z@z$SBUe`w!PwZ*8T%PgW45A|LT77h)%c zs-zoMp(JuB0hP3z6_&(9l&tD)xt8NJdx2v`yIc8C2(LQ)qp}r>^omhIYfQ1FxY=wa zn{Dz?z|BRradTWww`*Mwf=a{a3d#i8_fYuuz8xQ^I+w2!>ZRZ~gq!DH><4Bc#H*Em zfLoGGwD0&~>p&4MnUQeRRx+zwC2A9>?akVdTBT$;ts>ZQmJD`MIxf@jw`iAA()CD%*bGG++F~CXEgnV( zSj9Et&{9#U2SoL2TfbGj96F|Bl|9_WU%K#qK14a&uBdy_$}rQ)vG#+db#|Pq@{#xA zZ@SmZJAM6;-wMK+DZd^)K(f`J`gKuKh9;?$msH-PC9OAkvzNFF?JSy{N6N}uWBvZG zK|;eBtwBnYYeK0TJW0E1^jM81YE<6Q<+#+9l+~zQP5LQ)`MUon^1n&_k@iff{sO)_ zGx(Y;;AVcF-p5zxBlN#S`!8Dc41V0XB_foXNMc*5jfS~ua$Aj!)FDwH@7R1DQq6f@ z*t#8(_4!)&e1}NGrp77JAyAv6d8WL4ymxZQekA{=%D<)Zf9wAM(4#9= literal 0 HcmV?d00001 diff --git a/msix/resources.scale-200.pri b/msix/resources.scale-200.pri new file mode 100644 index 0000000000000000000000000000000000000000..e7ded80355f5bf99fa7498a2fcd775be28301ce0 GIT binary patch literal 3776 zcmb7HOKcm*8UANUOR`>-Wj$@l8tY*@wn!~0%8#T;YRi@_m$GBYj*u5ND{@G#wXf_h zWvZ9z5)|zrIkYHpC{P5w^wu1ENPqyn1PIW_JrU4b5VSc2=%Gdd_nYCHb^>IH+5ek= z{(t6w&Fs(#9K#Q+G!dgu2Z=ZleTsI3o;(4eHyjA$Mb0%Wx8S`cS&ioaNR4BHya;om z(j1p#x9a1iFjo?eiE$2=dOpMZ@4YqsK!k>4`e~!7|3M$oSCFZ$Z$_pS38$$}2mM4o ztB*fz-+@|%NK?NU#o$r(VcE|CN{~rDeieG2mheld-wIu#`(%+Im#&jXcOd0ZlCr=#V4JqoSRNYmgLR-nZ=!9Y z)oqbHgpj_hx+{A_@+B*5jgIKm$c)id8sg_-&%vKrTBRv|C3YUT7gomgZbXdHH1Ifo zHFg2`6z~LhV~fCNFc0Uyh$Vn0fsgY)#*)Azbdv`8$FU{gep;t4{dY79JPvP<@y}yA z@GxyqKmRh80zOHv&?x^pmIl56yuc~G4164TfS-wHfKMYnCwV5m0z3sg#$SnF1fE7z z$9XY+33!1X&lV-z;`^51G4nin8*jNj2t0xtp&^S8ArU@mp_lhBkhYmf=GY2X>)Bl>yj2A)Hf zkMei5Q^2$ErAODP2Uz;jt^WpbnnJa#A`T0z7kD1)#`Ia_N8)YZGt`AyQixkW{{u2t z#~;CyIl8Fg`3Z7V$A5$UbJ!(W>f`@}ZFTv7W6n9Om8Bm37<10kGTlIqVyqi@N%=d> zdVm*^mu^1Ijv~`nfG2sH^}*X^)Yg!Gg^mL2ux&tpfZTG}wvD(wq(R`b^crgB0A;45 z_GNr-qmDB4lJe^w_0bBdbe*Pomi0sPl9I{M0MII8)yE&Q0ZP+l$aLxZ^dnf11wPLA z*dXv-;4%IyCizwTAsYg|2mS>AGdl(=FCext{axhtC0KDE_WTmH_A+86^YR{Q>L*wW zw)20mVc_e)1N@LR`Tt@g4gP=GXhXhR8*A`KwDAUiR-0(>m$XS_Hw}A+_>0;Jcz=Sf zVg3)b(+X#S|D??-yaoJ;HU~Tnn}_)4+C1M=*M}`UUW{5MPF~peA7-B(aJ;*H~77VeF$50R523^3JahA@} zb95e=T0})AVc!zgx{Uc=z!~}?^sXU8*HNEqI7e5g6D$io4H-H2#r7#glpmp9Qq;`c|n`Fxhrfhw`=%zxiQZp%guX_@J)50ACTp! zY4**aOkt3tNK~TQ8ez%Iiy)-+s)+3sy+kT~IqADaQl0e5#b#$Yo!GHqRU79~3E$>c zP7|-B(v42i%6TM$zzY%?eK}c*9GhUKs8pe2T5j@TNUOK5-nn@rd-rD2$_QI;6O`c;` zEXVrUQ*6t97Q5`W$v@aByHPoDEg8Y0dS|`0mu>5`4Q;dzZL|$-whnDphb(v32z@iy zwMDWJm_@oOD`&%Wt%3-n8WlJ7qHvsTI9~)|g^TaWk1p zCe!4hfSZeKOOv4Dzi?z6cyE3@y(!N~W8)vHhR1Ixf@jw_p{M()Cb<*a$=vSYi(vEgpvZ zSj91-z*JGG2SoL2TfbGj9N30!mR;P%pSkc}EcA=RAc zsjb@~S)Z?U&v%G4Y-*em9RjsEnrF(h$D1cm$GD8QjOpRyCx`NXs{C6j|F`}heN!v5 literal 0 HcmV?d00001 diff --git a/msix/resources.scale-400.pri b/msix/resources.scale-400.pri new file mode 100644 index 0000000000000000000000000000000000000000..03a202db7d29ebb818289949ea514bbfcea6f992 GIT binary patch literal 3776 zcmb7HOKcm*8UAONmSnvu%X-?9HP*v+Y>`@0lplH4mMvQjWyg{op-qa-YB?m=+E;d$ zGSy3U34-L199k4P6exmTdTTBPdPsl(y#xr*Hupq8Zb8vr3iME;fcwqzO*;X)#O(jg zKmR}Tzh-vm1di?pR)&bt=YvF?h(1RIc}^1^g=%Pn|6ldQ&b02Gg7g1iV# zQE86Lv0L@=QfQWhV_=+v6+d6#{kPtlejq~KG5n0))c>fD=sU<%*Eb@=iiFctr-ObX zpVh~ow(lTbg-D5iDyi_O`Y>>yh=LQ0ZBK7JK?o|f=S$G;W2MEA)eK`vbOJ%3cZQ8 ziB`8o@(@D$rs}Tj4at|Rur)fORU<-b-qG%rBr7{8;O1YQIl=5Hxez+CETC!r~2)*urq)4(&pN3`?Q4LpY| zALZ{Tr+{bSOOK{e53uy5Tl*E_G=*weMI07bFYr9pRkc~{~a<{ z$DhEHIl36f^E2eAj{ge#=deq1)W^StZFTv7V$M0Nm7^a17<10kGTlIqRMri=6#F~O zdVm*^mu^1Ijv~`nfG2r|^}*X^)Yg!8g^mJiux&tlfZTG}wvD(wq(R`b^b^#~0m@86 z?aTPwMjd78<=C%#)JH3*(si2VIo1!&ORSeQ5Bv%KCw2^0UO;SB?H%OyWms_^_PmE$dj+wQdHDb}^<%6B z+xb^)82CEy06%0+{y*4Aga02k+K}&7#v1$)WxTM?RK!yqNW{5MPF~peA7-B(aJ;*H~77VeF$50R523^3JahA@} zb95e=T0}*rVBZqfx{Uc=z!~}y^sXU8*HNEqI7eK?q7-*W5N9d;Qg;hhFJjbY5 zj`j1W*p~Y&cG+!{f3Q<_qjK_EDuPAz&U$Mv*Vbtp+GrixXdBvW9ono8S?;bL`bMy8 zi&P;nigZ<0&W7Py1rbK69n0OOv2=c8;z6cyE3@y*qONN`bvHhR1Ixf@jw_p`h()BP7u^xyhu*4oTT09K* zv5KQdfe}Zg9+0?S+xo5I<-pc$qwL}?{>+8<%mC$VIil`GD??AmjMbHu&HrMbO_YuXr3w09&esN9pf_IGNy-*pB&2nsq$~B{NMUNhY2f- literal 0 HcmV?d00001 diff --git a/readme_i18n/README_CS.md b/readme_i18n/README_CS.md new file mode 100644 index 0000000..1b25290 --- /dev/null +++ b/readme_i18n/README_CS.md @@ -0,0 +1,178 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] +[![Translations][translate-badge]][translate-link] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml +[translate-badge]: https://hosted.weblate.org/widget/localsend/app/svg-badge.svg +[translate-link]: https://hosted.weblate.org/engage/localsend/ + +[Hlavní stránka][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[Česky](README_CS.md) • [English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend je bezplatná aplikace s otevřeným zdrojovým kódem, která vám umožňuje bezpečně sdílet soubory a zprávy s okolními zařízeními přes vaši místní síť, aniž byste potřebovali připojení k internetu. + +- [O aplikaci](#about) +- [Snímky obrazovky](#screenshots) +- [Stažení](#download) +- [Jak to funguje](#how-it-works) +- [Začínáme](#getting-started) +- [Jak přispět](#contributing) + - [Překlady](#translation) + - [Opravy chyb a vylepšení](#bug-fixes-and-improvements) +- [Odstraňování problémů](#troubleshooting) +- [Kompilace](#building) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## O aplikaci + +LocalSend je multiplatformní aplikace, která umožňuje bezpečnou komunikaci mezi zařízeními pomocí REST API a šifrování HTTPS. Na rozdíl od jiných aplikací pro zasílání zpráv, které se spoléhají na externí servery, LocalSend nevyžaduje připojení k internetu ani servery třetích stran, což z něj činí rychlé a spolehlivé řešení pro místní komunikaci. + +## Snímky obrazovky + +iPhone screenshot PC screenshot + +## Stažení + +Doporučuje se stáhnout aplikaci buď z obchodu s aplikacemi nebo ze správce balíčků, protože aplikace nemá automatickou aktualizaci. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +| ----------------------- | ----------------------- | ------------------ | -------------- | ------------- | ---------- | +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +Přečtěte si další informace o [distribučních kanálech][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Kompatibilita** + +| Platforma | Minimální Verze | Poznámka | +| --------- | --------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Použijte OpenCore Legacy Patcher 2.0.2 (Více [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | Poslední verze podporující Windows 7 je v1.15.4. V budoucnu mohou existovat backporty novějších verzí pro Windows 7. | +| Linux | N.A. | - | + +## Nastavení + +Ve většině případů by měl LocalSend fungovat hned. Pokud však máte potíže s odesíláním nebo přijímáním souborů, možná budete muset nakonfigurovat bránu firewall tak, aby umožnila LocalSend komunikovat přes vaši místní síť. + +| Typ provozu | Protokol | Port | Akce | +| ----------- | -------- | -------- | ------- | +| Příchozí | TCP, UDP | 53317 | Povolit | +| Odchozí | TCP, UDP | Jakýkoli | Povolit | + +Také se ujistěte, že jste na routeru zakázali izolaci přístupového bodu. Ve výchozím nastavení by měla být obvykle zakázána, ale některé routery ji mohou mít povolenou (zejména sítě pro hosty). +Více informací při [odstraňování problémů](#troubleshooting). + +**Přenosný režim** + +(Zavedeno v v1.13.0) + +Vytvořte soubor s názvem `settings.json` umístěný ve stejném adresáři jako spustitelný soubor. +Tento soubor může být prázdný. +Aplikace použije tento soubor k uložení nastavení namísto výchozího umístění. + +**Spuštění v liště** + +(Aktualizováno v v1.15.0) + +Chcete-li aplikaci spustit skrytě (pouze v liště), použijte příznak `--hidden` (příklad: `localsend_app.exe --hidden`). +Ve verzi 1.14.0 a dřívějších se aplikace spustí skrytě, pokud je nastaven příznak `autostart` a skryté nastavení je povoleno. + +## Jak to funguje + +LocalSend používá zabezpečený komunikační protokol, který umožňuje zařízením komunikovat mezi sebou pomocí REST API. Všechna data jsou odesílána bezpečně přes HTTPS a TLS/SSL certifikát je generován za chodu na každém zařízení, což zajišťuje maximální bezpečnost. + +Další informace o protokolu LocalSend najdete v [dokumentaci](https://github.com/localsend/protocol). + +## Začínáme + +Chcete-li zkompilovat LocalSend ze zdrojového kódu, postupujte následovně: + +1. Nainstalujte Flutter [přímo](https://flutter.dev) nebo pomocí [fvm](https://fvm.app) (viz [požadovaná verze](.fvmrc)) +2. Nainstalujte [Rust](https://www.rust-lang.org/tools/install) +3. Naklonujte repozitář `LocalSend` +4. `cd app` přejděte do adresáře aplikace +5. `flutter pub get` stáhněte závislosti +6. `flutter run` pro spuštění aplikace + +> [!NOTE] +> LocalSend aktuálně vyžaduje starší verzi Flutter (uvedenou v [.fvmrc](.fvmrc)) +> a tedy problémy se sestavováním mohou být způsobeny nesouladem mezi požadovanou a (v celém systému) nainstalovanou verzí Flutter. +> Aby byl vývoj konzistentnější, používá LocalSend [fvm](https://fvm.app) ke správě verze projektu Flutter. +> Po instalaci `fvm` spusťte `fvm flutter` místo `flutter`. + +## Jak přispět + +Vítáme příspěvky od každého, kdo má zájem pomoci zlepšit LocalSend. Pokud chcete přispět, existuje několik způsobů, jak se zapojit: + +### Překlady + +Můžete pomoci s překladem LocalSend do jiných jazyků. Ke správě překladů používáme platformu [Weblate](https://hosted.weblate.org/projects/localsend/app). + +Případně můžete také přispět tím, že tento repozitář naklonujete a překlady přidáte ručně. + +Překlady jsou umístěny v adresáři [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n). Chcete-li přidat nebo aktualizovat překlady, upravte soubor `_missing_translations_.json` nebo `strings_.i18n.json`. + + +Translation status + + +**_Upozornění:_ Pole označená `@` nejsou určena k překladu; nejsou v aplikaci žádným způsobem použity, jsou pouze informativním textem o souboru nebo poskytují kontext překladateli.** + +### Opravy chyb a vylepšení + +- **Opravy chyb:** Pokud najdete chybu, vytvořte prosím PR s jasným popisem problému a postupem, jak jej opravit. + +- **Vylepšení:** Máte nápad, jak zlepšit LocalSend? Nejprve prosím vytvořte požadavek, abyste mohli prodiskutovat, proč je vylepšení potřeba. + +Další informace najdete v [příručce pro přispívání](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## Odstraňování problémů + +| Problém | Platforma (odesílání) | Platforma (přijímání) | Řešení | +| ------------------------- | --------------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| Zařízení není vidět | Jakákoliv | Jakákoliv | Ujistěte se, že jste na routeru zakázali izolaci AP. Pokud je povolena, spojení mezi zařízeními jsou zakázána. | +| Zařízení není vidět | Jakákoliv | Windows | Ujistěte se, že jste nakonfigurovali svou síť jako "soukromou" síť. Windows může být více omezující, když je síť nakonfigurována jako veřejná. | +| Zařízení není vidět | macOS, iOS | Jakákoliv | Můžete zkusit přepnout oprávnění "Místní síť" v "Soukromí" v nastavení OS. | +| Rychlost je příliš pomalá | Jakákoliv | Jakákoliv | Použijte 5 GHz; Vypněte šifrování na obou zařízeních | +| Rychlost je příliš pomalá | Jakákoliv | Android | Známý problém. https://github.com/flutter-cavalry/saf_stream/issues/4 | + +## Contributors + + + Localsend Contributors + diff --git a/readme_i18n/README_ES.md b/readme_i18n/README_ES.md new file mode 100644 index 0000000..c509eab --- /dev/null +++ b/readme_i18n/README_ES.md @@ -0,0 +1,175 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] +[![Translations][translate-badge]][translate-link] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml +[translate-badge]: https://hosted.weblate.org/widget/localsend/app/svg-badge.svg +[translate-link]: https://hosted.weblate.org/engage/localsend/ + +[Página de inicio][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend es una aplicación gratuita y de código abierto que te permite compartir archivos y mensajes de manera segura con dispositivos cercanos a través de tu red local, sin necesidad de una conexión a internet. + +- [Acerca de](#acerca-de) +- [Capturas de Pantalla](#capturas-de-pantalla) +- [Descarga](#descarga) +- [Cómo Funciona](#cómo-funciona) +- [Primeros Pasos](#primeros-pasos) +- [Contribuir](#contribuir) + - [Traducción](#traducción) + - [Corrección de Errores y Mejoras](#corrección-de-errores-y-mejoras) +- [Solución de problemas](#solución-de-problemas) +- [Compilación](#compilación) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## Acerca de + +LocalSend es una aplicación multiplataforma que permite la comunicación segura entre dispositivos utilizando una API REST y encriptación HTTPS. A diferencia de otras aplicaciones de mensajería que dependen de servidores externos, LocalSend no requiere conexión a internet ni servidores de terceros, lo que la convierte en una solución rápida y confiable para la comunicación local. + +## Capturas de Pantalla + +Captura de pantalla del iPhone Captura de pantalla del PC + +## Descarga + +Se recomienda descargar la aplicación desde una tienda de aplicaciones o un gestor de paquetes, ya que la aplicación no tiene una función de actualización automática. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +Lee más sobre los [canales de distribución][distribution channels]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Compatibilidad** + +| Plataforma | Versión Mínima | Nota | +|------------|------------------|---------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Usa OpenCore Legacy Patcher 2.0.2 (Ver [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | La última versión compatible con Windows 7 es la v1.15.4. Es posible que haya backports de versiones más nuevas para Windows 7 en el futuro. | +| Linux | N.A. | - | + +## Configuración + +En la mayoría de los casos, LocalSend debería funcionar sin configuraciones adicionales. Sin embargo, si tienes problemas para enviar o recibir archivos, es posible que necesites configurar tu firewall para permitir que LocalSend se comunique a través de tu red local. + +| Tipo de Tráfico | Protocolo | Puerto | Acción | +|-----------------|-----------|------------|---------| +| Entrante | TCP, UDP | 53317 | Permitir| +| Saliente | TCP, UDP | Cualquiera | Permitir| + +Asegúrate también de desactivar el aislamiento de AP en tu enrutador. Esto generalmente viene desactivado de manera predeterminada, pero algunos enrutadores pueden tenerlo habilitado (especialmente en redes de invitados). + +**Modo Portable** + +(Introducido en la versión v1.13.0) + +Crea un archivo llamado `settings.json` en el mismo directorio que el ejecutable. Este archivo puede estar vacío. La aplicación usará este archivo para almacenar configuraciones en lugar de la ubicación predeterminada. + +**Iniciar oculto** + +(Actualizado en la versión v1.15.0) + +Para iniciar la aplicación de forma oculta (solo en la bandeja), usa el parámetro `--hidden` (ejemplo: `localsend_app.exe --hidden`). + +En la versión v1.14.0 y anteriores, la aplicación comenzaba oculta si el parámetro `autostart` estaba configurado y la opción oculta estaba habilitada. + +## Cómo Funciona + +LocalSend utiliza un protocolo de comunicación seguro que permite que los dispositivos se comuniquen entre sí usando una API REST. Todos los datos se envían de manera segura a través de HTTPS, y el certificado TLS/SSL se genera automáticamente en cada dispositivo, garantizando la máxima seguridad. + +Para más información sobre el protocolo LocalSend, consulta la [documentación](https://github.com/localsend/protocol). + +## Primeros Pasos + +Para compilar LocalSend desde el código fuente, sigue estos pasos: + +1. Instala Flutter [directamente](https://flutter.dev) o utilizando [fvm](https://fvm.app) (ver [versión requerida](.fvmrc)) +2. Instala [Rust](https://www.rust-lang.org/tools/install) +3. Clona el repositorio de `LocalSend` +4. Ejecuta `cd app` para entrar en el directorio de la aplicación +5. Ejecuta `flutter pub get` para descargar las dependencias +6. Ejecuta `flutter run` para iniciar la aplicación + +> [!NOTA] +> LocalSend actualmente requiere una versión más antigua de Flutter (especificada en [.fvmrc](.fvmrc)) +> y por lo tanto pueden surgir problemas de compilación debido a una discrepancia entre la versión requerida y la instalada a nivel de sistema. +> Para hacer el desarrollo más consistente, LocalSend utiliza [fvm](https://fvm.app) para gestionar la versión de Flutter del proyecto. +> Después de instalar `fvm`, ejecuta `fvm flutter` en lugar de `flutter`. + +## Contribuir + +Damos la bienvenida a contribuciones de cualquier persona interesada en mejorar LocalSend. Si deseas contribuir, hay varias formas de hacerlo: + +### Traducción + +Puedes ayudar a traducir LocalSend a otros idiomas. **Forma recomendada**: Usa la plataforma [Weblate](https://hosted.weblate.org/projects/localsend/app) para gestionar las traducciones. + +**Alternativamente**: También puedes contribuir haciendo un fork a este repositorio y añadiendo traducciones manualmente. + +Las traducciones se encuentran en el directorio [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n). Edita el archivo `_missing_translations_.json` o `strings_.i18n.json` para añadir o actualizar traducciones. + + +Estado de traducción + + +**_Ten en cuenta:_ Los campos decorados con `@` no están destinados a ser traducidos; no son utilizados en la aplicación de ninguna manera, solo son texto informativo sobre el archivo o para dar contexto al traductor.** + +### Corrección de Errores y Mejoras + +- **Corrección de Errores:** Si encuentras un error, por favor crea una pull request con una descripción clara del problema y cómo solucionarlo. +- **Mejoras:** ¿Tienes una idea sobre cómo mejorar LocalSend? Por favor, crea primero un issue para discutir por qué es necesaria la mejora. + +Para más información, consulta la [guía de contribuciones](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## Solución de Problemas + +| Problema | Plataforma (Emisor) | Plataforma (Receptor) | Solución | +|---------------------|---------------------|------------------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| Dispositivo no visible | Cualquiera | Cualquiera | Asegúrate de desactivar la *AP-Isolation* en tu router. Si está activada, las conexiones entre dispositivos están prohibidas. | +| Dispositivo no visible | Cualquiera | Windows | Configura tu red como una red "privada". Windows puede ser más restrictivo cuando la red está configurada como pública. | +| Dispositivo no visible | macOS, iOS | Cualquiera | Intenta alternar el permiso de "Red Local" en la sección de "Privacidad" de la configuración del sistema operativo. | +| Velocidad muy lenta | Cualquiera | Cualquiera | Usa 5 GHz; Desactiva la encriptación en ambos dispositivos | +| Velocidad muy lenta | Cualquiera | Android | Problema conocido. [https://github.com/flutter-cavalry/saf_stream/issues/4](https://github.com/flutter-cavalry/saf_stream/issues/4) | + +## Contribuidores + + + Localsend Contributors + diff --git a/readme_i18n/README_FA.md b/readme_i18n/README_FA.md new file mode 100644 index 0000000..67fc6b5 --- /dev/null +++ b/readme_i18n/README_FA.md @@ -0,0 +1,173 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml + +[Homepage][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend یک برنامه رایگان و متن‌باز است که به شما امکان می‌دهد تا فایل‌ها و پیام‌ها را با دستگاه‌های نزدیک از طریق شبکه محلی خود، بدون نیاز به اینترنت، به‌صورت امن به اشتراک بگذارید. + +- [درباره](#about) +- [تصاویر](#screenshots) +- [دانلود](#download) +- [نحوه عملکرد](#how-it-works) +- [شروع به کار](#getting-started) +- [مشارکت](#contributing) + - [ترجمه](#translation) + - [رفع اشکالات و بهبودها](#bug-fixes-and-improvements) +- [ساخت](#building) + - [اندروید](#android) + - [iOS](#ios) + - [macOS](#macos) + - [ویندوز](#windows) + - [لینوکس](#linux) + +## درباره + +LocalSend یک برنامه چندسکویی است که امکان ارتباط امن بین دستگاه‌ها را با استفاده از REST API و رمزگذاری HTTPS فراهم می‌کند. برخلاف سایر برنامه‌های پیام‌رسان که به سرورهای خارجی وابسته هستند، لوکال‌سند نیازی به اتصال به اینترنت یا سرورهای شخص ثالث ندارد و به همین دلیل یک راه‌حل سریع و مطمئن برای ارتباطات محلی محسوب می‌شود. + +## تصاویر + +iPhone screenshot PC screenshot + +## دانلود + +توصیه می‌شود که برنامه را از طریق فروشگاه‌های اپلیکیشن یا یک مدیریت بسته دانلود کنید، زیرا این برنامه به‌طور خودکار به‌روزرسانی نمی‌شود. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +مطالعه بیشتر [distribution channels][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**سازگاری** + +| Platform | Minimum Version | Note | +|----------|-----------------|-----------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | از OpenCore Legacy Patcher نسخه ۲.۰.۲ استفاده کنید (نگاه کنید به #1005) | +| Windows | 10 | آخرین نسخه‌ای که از ویندوز ۷ پشتیبانی می‌کند، نسخه 1.15.4 است. ممکن است نسخه‌های جدیدتری نیز در آینده برای ویندوز ۷ پشتیبانی شوند. | +| Linux | N.A. | - | + +## نصب + +در بیشتر موارد، LocalSend باید به‌طور خودکار کار کند. با این حال، اگر در ارسال یا دریافت فایل‌ها مشکلی داشتید، ممکن است نیاز باشد تنظیمات فایروال خود را برای اجازه دسترسی LocalSend به شبکه محلی تغییر دهید. + +| Traffic Type | Protocol | Port | Action | +|--------------|----------|-------|--------| +| Incoming | TCP, UDP | 53317 | Allow | +| Outgoing | TCP, UDP | Any | Allow | + +همچنین، اطمینان حاصل کنید که AP Isolation در روتر شما غیرفعال باشد. این گزینه به‌طور پیش‌فرض غیرفعال است، اما ممکن است برخی روترها (مخصوصاً شبکه‌های مهمان) آن را فعال کرده باشند. + +**حالت پرتابل** + +(معرفی شده در نسخه 1.13.0) + +یک فایل با نام `settings.json` در همان دایرکتوری که فایل اجرایی قرار دارد، ایجاد کنید. +این فایل می‌تواند خالی باشد. +برنامه از این فایل برای ذخیره تنظیمات به‌جای محل پیش‌فرض استفاده خواهد کرد. + +**شروع به‌صورت مخفی** + +(به‌روزرسانی شده در نسخه 1.15.0) + +برای شروع برنامه به‌صورت مخفی (فقط در قسمت اعلان)، از فلگ `--hidden` استفاده کنید (مثال: `localsend_app.exe --hidden`). + +در نسخه‌های 1.14.0 و قبل‌تر، برنامه به‌صورت مخفی شروع می‌شود اگر فلگ autostart تنظیم شده باشد و گزینه مخفی فعال باشد. + +## نحوه عملکرد + +لوکال‌سند از یک پروتکل ارتباطی امن استفاده می‌کند که به دستگاه‌ها اجازه می‌دهد با استفاده از REST API با یکدیگر ارتباط برقرار کنند. تمام داده‌ها به‌صورت امن از طریق HTTPS ارسال می‌شوند و گواهینامه TLS/SSL به‌طور خودکار روی هر دستگاه تولید می‌شود که حداکثر امنیت را فراهم می‌کند. + +برای اطلاعات بیشتر درباره پروتکل LocalSend، به مستندات مراجعه کنید. [مستندات](https://github.com/localsend/protocol). + +## شروع به کار + +برای کامپایل کردن LocalSend از سورس کد، مراحل زیر را دنبال کنید: + +1. فلاتر را به‌صورت [مستقیم](https://flutter.dev) یا با استفاده از [fvm](https://fvm.app) نصب کنید (به [نسخه مورد نیاز](.fvmrc) مراجعه کنید). +2. [Rust](https://www.rust-lang.org/tools/install) را نصب کنید. +3. مخزن `LocalSend‍‍` را کلون کنید. +4. با دستور `cd app` وارد دایرکتوری برنامه شوید. +5. دستور `flutter pub get` را برای دانلود وابستگی‌ها اجرا کنید. +6. دستور `flutter run` را اجرا کنید تا برنامه شروع به کار کند. + +> [!NOTE] +> LocalSend لوکال‌سند در حال حاضر به نسخه‌ای قدیمی‌تر از فلاتر نیاز دارد ([مشخص شده در](.fvmrc) fvmrc) و بنابراین ممکن است مشکلاتی +> در بیلد به دلیل عدم هماهنگی بین نسخه مورد نیاز و نسخه نصب‌شده (در سطح سیستم) فلاتر رخ دهد. برای یکپارچه‌سازی توسعه، +> LocalSend از [fvm](https://fvm.app) برای مدیریت نسخه فلاتر پروژه استفاده می‌کند. پس از نصب `fvm،` به جای `flutter` از `fvm flutter` استفاده کنید. + +## مشارکت + +ما از مشارکت هر کسی که مایل به بهبود LocalSend است استقبال می‌کنیم. اگر مایل به کمک هستید، راه‌های مختلفی برای مشارکت وجود دارد: + +### ترجمه + +می‌توانید کمک کنید تا LocalSend را به زبان‌های دیگر ترجمه کنیم! **راه‌ی ترجیح‌داده شده**: از پلتفرم [Weblate](https://hosted.weblate.org/projects/localsend/app) برای مدیریت ترجمه‌ها استفاده کنید. + +**چاره دیگر**: این مخزن را فورک کنید و ترجمه‌ها را به‌صورت دستی اضافه کنید. + +ترجمه‌ها در دایرکتوری [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n) قرار دارند. برای افزودن یا به‌روزرسانی ترجمه‌ها، فایل `_missing_translations_.json` یا `strings_.i18n.json` را ویرایش کنید. + + +وضعیت ترجمه + + +**_توجه:_ فیلدهایی که با `@` شروع شده‌اند، نباید ترجمه شوند؛ این فیلدها در برنامه استفاده نمی‌شوند و فقط به‌عنوان متن اطلاعاتی درباره فایل یا برای ارائه زمینه به مترجم هستند.** + +### رفع اشکالات و بهبودها + +- **رفع اشکالات:** اگر باگ یا اشکالی پیدا کردید، لطفاً یک درخواست pull همراه با توضیح واضحی از مشکل و نحوه رفع آن ایجاد کنید. +- **بهبودها:** ایده‌ای برای بهبود LocalSend دارید؟ لطفاً ابتدا یک issue ایجاد کنید تا درباره نیاز به این بهبود صحبت کنیم. + +برای اطلاعات بیشتر، به [راهنمای مشارکت](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md) مراجعه کنید. + +## عیب‌یابی + +| مشکل | پلتفرم (ارسال) | پلتفرم (دریافت) | راه‌حل | +|--------------------|----------------|------------------|---------------------------------------------------------------------------------------------------------------------------------------| +| دستگاه قابل مشاهده نیست | هر پلتفرمی | هر پلتفرمی | مطمئن شوید که AP-Isolation را در روتر خود غیرفعال کرده‌اید. اگر فعال باشد، اتصال بین دستگاه‌ها ممنوع است. | +| دستگاه قابل مشاهده نیست | هر پلتفرمی | Windows | مطمئن شوید که شبکه خود را به‌عنوان شبکه "خصوصی" پیکربندی کرده‌اید. ویندوز ممکن است هنگامی که شبکه به‌عنوان عمومی پیکربندی شده باشد، محدودتر باشد. | +| دستگاه قابل مشاهده نیست | macOS, iOS | هر پلتفرمی | می‌توانید سعی کنید مجوز "Local Network" را در بخش "Privacy" در تنظیمات سیستم‌عامل تغییر دهید. | +| سرعت خیلی کند است | هر پلتفرمی | هر پلتفرمی | از 5 Ghz استفاده کنید؛ رمزگذاری را در هر دو دستگاه غیرفعال کنید | +| سرعت خیلی کند است | هر پلتفرمی | Android | مشکل شناخته‌شده. https://github.com/flutter-cavalry/saf_stream/issues/4 | + + +## مشارکت کنندگان + + + Localsend Contributors + diff --git a/readme_i18n/README_FR.md b/readme_i18n/README_FR.md new file mode 100644 index 0000000..a50848f --- /dev/null +++ b/readme_i18n/README_FR.md @@ -0,0 +1,173 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml + +[Site web][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend est une application gratuite et open-source qui permet de partager en toute sécurité des fichiers et messages aux appareils connectés à votre réseau local, même sans accès à Internet. + +- [À propos](#à-propos) +- [Captures d'écran](#captures-décran) +- [Téléchargements](#téléchargements) +- [Fonctionnement](#fonctionnement) +- [Configuration](#configuration) +- [Contributions](#contributions) + - [Traductions](#traductions) + - [Corrections de bugs et améliorations](#corrections-de-bugs-et-améliorations) +- [Building](#building) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## À propos + +LocalSend est une application cross-platform qui permet une communication sécurisée entre plusieurs appareils grâce au chiffrement HTTPS et à l'utilisation d'une API REST. A contrario des autres applications de messagerie, LocalSend ne requiert aucune connexion à des serveurs externes ni de connexion Internet, ce qui en fait une solution fiable et rapide pour des échanges locaux. + +## Captures d'écran + +iPhone screenshot PC screenshot + +## Téléchargements + +Il est recommandé de télécharger l'application soit depuis un app store ou depuis un gestionnaire de paquet car LocalSend ne dispose pas d'un système de mise à jour intégré. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +En savoir plus à propos des [canaux de distribution][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[canaux de distribution]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Compatibilité** + +| Plateforme | Version Minimale | Note | +|------------|------------------|-----------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Utilisez OpenCore Legacy Patcher 2.0.2 (Voir [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | La dernière version supportant Windows 7 est v1.15.4. Des backports de versions plus récentes pour Windows 7 pourraient être disponibles à l'avenir. | +| Linux | N.A. | Dépendances : Gnome : `xdg-desktop-portal` et `xdg-desktop-portal-gtk`, KDE : `xdg-desktop-portal` et `xdg-desktop-portal-kde` | + +## Informations additionnelles + +Dans la plupart des cas, LocalSend devrait fonctionner tel quel. Cependant, si vous rencontrez des problèmes lors de l'envoi ou la réception de fichiers, il se peut que vous deviez configurer votre pare-feu afin d'autoriser LocalSend à communiquer avec d'autres appareils sur votre réseau local. + +| Type de traffic | Protocole | Port | Action | +|-----------------|-----------|-------|-----------| +| Entrant | TCP, UDP | 53317 | Autoriser | +| Sortant | TCP, UDP | Tous | Autoriser | + +Veillez également à ce que l'option "Isolement du point d'accès" (AP isolation) soit bien désactivée dans les paramètres de votre routeur/box internet car il se peut qu'elle soit activée par défaut (surtout pour le Wi-Fi invité). + +**Mode Portable** + +(Introduit dans la version 1.13.0) + +Créer un fichier nommé `settings.json` situé dans le même dossier que le fichier exécutable. +Ce fichier peut être vide. +LocalSend utilisera ce fichier au lieu de l'emplacement par défaut afin de sauvegarder vos paramètres. + +**Lancement en arrière-plan** + +(Mis à jour dans la version 1.15.0) + +Pour lancer l'application en arrière-plan, utilisez l'argument `--hidden` (exemple: `localsend_app.exe --hidden`). + +Pour les versions <= 1.14.0, l'application se lance en arrière-plan si l'argument `autostart` est défini et que le paramètre "hidden" est activé. + +## Fonctionnement + +LocalSend utilise un protocole de communication securisé qui permet aux appareils de communiquer entre eux via une API REST. Toutes les données sont envoyées de façon sécurisée grâce à HTTPS et au certificat TLS/SSL qui est généré pour chaque appareil, garantissant un niveau de sécurité maximal. + +Pour plus d'informations sur le protocole LocalSend, vous pouvez lire la [documentation](https://github.com/localsend/protocol). + +## Configuration + +Pour compiler LocalSend depuis le code source, veuillez suivre les étapes suivantes : + +1. Installer Flutter [directement](https://flutter.dev) ou utiliser [fvm](https://fvm.app) (voir [la version requise](/.fvmrc)) +2. Cloner le repository `LocalSend` +3. Exécuter `cd app` pour entrer dans le dossier de l'application +4. Exécuter `flutter pub get` pour télécharger les dépendances +5. Exécuter `flutter run` pour lancer l'application + +> [!NOTE] +> LocalSend requiert pour le moment une version plus ancienne de Flutter (spécifiée dans [.fvmrc](/.fvmrc)) +> ce qui peut créer des erreurs lors de la compilation à cause d'une différence de version entre celle requise par LocalSend et celle installée. +> Dans le but de rendre le développement plus conforme, LocalSend utilise [fvm](https://fvm.app) pour gérer la version de Flutter. +> Après l'installation de `fvm`, exécutez `fvm flutter` au lieu de `flutter`. + +## Contributions + +Nous accueillons les contributions venant de quiconque étant intéressé pour aider à améliorer LocalSend. Si vous désirez contribuer au projet, il y a plusieurs façons pour y parvenir : + +### Traductions + +Vous pouvez aider à traduire cette application dans d'autres langues ! **Méthode recommandée** : Utilisez la plateforme [Weblate](https://hosted.weblate.org/projects/localsend/app) pour gérer les traductions. + +**Alternative** : Vous pouvez également contribuer en forking ce repository et en ajoutant les traductions manuellement. + +Les traductions sont situées dans le répertoire [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n). Modifiez le fichier `_missing_translations_.json` ou `strings_.i18n.json` pour ajouter ou mettre à jour les traductions. + + +État des traductions + + +**_Nota Bene:_ Les textes précédés par un `@` ne doivent pas être traduit; ce ne sont pas des textes utilisés dans l'application mais des notes informatives pouvant aider les traducteurs.** + +### Corrections de bugs et améliorations + +- **Corrections de bugs:** Si vous trouvez un bug, veuillez créer une pull request contenant une description détaillée du problème et comment le résoudre. +- **Améliorations:** Vous voulez proposer une idée pour LocalSend ? Veuillez d'abord créer une issue afin d'expliquer en quoi il s'agit d'une amélioration. + +Pour plus d'informations, veuillez vous référer au [guide du contributeur](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## Dépannage + +| Problème | Plateforme (Envoi) | Plateforme (Réception) | Solution | +|-------------------------------|--------------------|------------------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| Appareil non visible | Toutes | Toutes | Assurez-vous de désactiver l'isolation AP sur votre routeur. Si elle est activée, les connexions entre appareils sont interdites. | +| Appareil non visible | Toutes | Windows | Assurez-vous de configurer votre réseau en tant que réseau "privé". Windows peut être plus restrictif lorsque le réseau est configuré comme public. | +| Appareil non visible | macOS, iOS | Toutes | Vous pouvez essayer d'activer/désactiver l'autorisation "Réseau local" dans "Confidentialité" dans les paramètres de l'OS. | +| Vitesse trop lente | Toutes | Toutes | Utilisez la bande 5 GHz ; Désactivez le chiffrement sur les deux appareils | +| Vitesse trop lente | Toutes | Android | Problème connu. https://github.com/flutter-cavalry/saf_stream/issues/4 | + + +## Contributeurs + + + Localsend Contributors + diff --git a/readme_i18n/README_ID.md b/readme_i18n/README_ID.md new file mode 100644 index 0000000..687f411 --- /dev/null +++ b/readme_i18n/README_ID.md @@ -0,0 +1,164 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml + +[Homepage][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend adalah aplikasi gratis dan sumber terbuka yang memungkinkan Anda berbagi file dan pesan dengan aman ke perangkat terdekat melalui jaringan lokal tanpa memerlukan koneksi internet. + +- [Tentang](#tentang) +- [Screenshots](#screenshots) +- [Unduh](#unduh) +- [Cara Kerja](#cara-kerja) +- [Memulai](#memulai) +- [Berkontribusi](#berkontribusi) + - [Terjemahan](#terjemahan) + - [Perbaikan Bug dan Peningkatan](#perbaikan-bug-dan-peningkatan) +- [Membangun](#membangun) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## Tentang + +LocalSend adalah aplikasi lintas platform yang memungkinkan komunikasi aman antar perangkat menggunakan REST API dan enkripsi HTTPS. Berbeda dengan aplikasi pesan lainnya yang mengandalkan server eksternal, LocalSend tidak memerlukan koneksi internet atau server pihak ketiga, menjadikannya solusi yang cepat dan andal untuk komunikasi lokal. + +## Screenshots + +iPhone screenshot PC screenshot + +## Unduh + +Disarankan untuk mengunduh aplikasi ini melalui toko aplikasi atau manajer paket, karena aplikasi ini tidak memiliki fitur pembaruan otomatis. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +Read more about [distribution channels][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Kompatibilitas** + +| Platform | Versi Minimum | Catatan | +|----------|---------------|-----------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Gunakan OpenCore Legacy Patcher 2.0.2 (Lihat [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | Versi terakhir yang mendukung Windows 7 adalah v1.15.4. Mungkin ada backport versi lebih baru untuk Windows 7 di masa depan. | +| Linux | N.A. | Dependensi: Gnome: `xdg-desktop-portal` dan `xdg-desktop-portal-gtk`, KDE: `xdg-desktop-portal` dan `xdg-desktop-portal-kde` | + +## Setup + +Dalam kebanyakan kasus, LocalSend seharusnya berfungsi langsung tanpa konfigurasi. Namun, jika Anda mengalami masalah dalam mengirim atau menerima file, Anda mungkin perlu mengonfigurasi firewall Anda untuk mengizinkan LocalSend berkomunikasi melalui jaringan lokal Anda. + +| Traffic Type | Protocol | Port | Action | +|--------------|----------|-------|--------| +| Incoming | TCP, UDP | 53317 | Allow | +| Outgoing | TCP, UDP | Any | Allow | + +Pastikan juga untuk menonaktifkan AP isolation di router Anda. Fitur ini biasanya dinonaktifkan secara default, tetapi beberapa router mungkin mengaktifkannya (terutama pada jaringan tamu). + +**Mode Portable** + +(Diperkenalkan pada v1.13.0) + +Buat file bernama `settings.json` yang terletak di direktori yang sama dengan file eksekusi aplikasi. File ini bisa dibiarkan kosong. Aplikasi akan menggunakan file ini untuk menyimpan pengaturan daripada lokasi default. + +**Mulai tersembunyi** + +(Diperbarui pada v1.15.0) + +Untuk memulai aplikasi dalam mode tersembunyi (hanya muncul di tray), gunakan flag --hidden (contoh: localsend_app.exe --hidden). + +Pada versi v1.14.0 dan sebelumnya, aplikasi dimulai dalam mode tersembunyi jika flag `autostart` diaktifkan dan pengaturan tersembunyi diaktifkan. + +## Cara Kerja + +LocalSend menggunakan protokol komunikasi yang aman, memungkinkan perangkat untuk berkomunikasi satu sama lain menggunakan REST API. Semua data dikirim dengan aman melalui HTTPS, dan sertifikat TLS/SSL dihasilkan secara langsung di setiap perangkat, memastikan keamanan maksimum. + +Untuk informasi lebih lanjut tentang Protokol LocalSend, lihat [dokumentasi](https://github.com/localsend/protocol). + +## Memulai + +Untuk mengompilasi LocalSend dari kode sumber, ikuti langkah-langkah berikut: + +1. Instal Flutter [langsung](https://flutter.dev) atau menggunakan [fvm](https://fvm.app) (lihat [versi yang diperlukan](.fvmrc)) +2. Clone repositori `LocalSend` +3. Jalankan `cd app` untuk masuk ke direktori aplikasi +4. Jalankan `flutter pub get` untuk mengunduh dependensi +5. Jalankan `flutter run` untuk memulai aplikasi + +> [!CATATAN] +> Saat ini LocalSend memerlukan versi Flutter yang lebih lama (disebutkan dalam [.fvmrc](.fvmrc)) dan masalah build dapat terjadi karena ketidakcocokan antara versi Flutter yang diperlukan dan yang terinstal di sistem. +> Untuk membuat pengembangan lebih konsisten, LocalSend menggunakan [fvm](https://fvm.app) untuk mengelola versi Flutter proyek. +> Setelah menginstal `fvm`, jalankan `fvm flutter` alih-alih `flutter`. + +## Berkontribusi + +Kami menerima kontribusi dari siapa pun yang tertarik untuk membantu meningkatkan LocalSend. Jika Anda ingin berkontribusi, ada beberapa cara untuk terlibat: + +### Terjemahan + +Anda dapat membantu menerjemahkan LocalSend ke bahasa lain! **Cara yang direkomendasikan**: Gunakan platform [Weblate](https://hosted.weblate.org/projects/localsend/app) untuk mengelola terjemahan. + +**Alternatif**: Anda juga dapat berkontribusi dengan mem-fork repository ini dan menambahkan terjemahan secara manual. + +Terjemahan terletak di direktori [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n). Edit file `_missing_translations_.json` atau `strings_.i18n.json` untuk menambah atau memperbarui terjemahan. + + +Status terjemahan + + +**_Catatan:_ Bidang yang dihiasi dengan `@` tidak dimaksudkan untuk diterjemahkan; mereka tidak digunakan dalam aplikasi dan hanya bersifat informatif untuk memberikan konteks kepada penerjemah.** + +### Perbaikan Bug dan Peningkatan + +- **Perbaikan Bug:** Jika Anda menemukan bug, silakan buat pull request dengan deskripsi jelas tentang masalah dan cara memperbaikinya. +- **Peningkatan:** Punya ide untuk meningkatkan LocalSend? Silakan buat isu terlebih dahulu untuk mendiskusikan mengapa peningkatan tersebut diperlukan. + +Untuk informasi lebih lanjut, lihat [panduan kontribusi](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## Pemecahan Masalah + +| Masalah | Platform (Pengirim) | Platform (Penerima) | Solusi | +|----------------------|---------------------|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| Perangkat tidak terlihat | Semua | Semua | Pastikan untuk menonaktifkan AP-Isolation pada router Anda. Jika diaktifkan, koneksi antar perangkat akan dilarang. | +| Perangkat tidak terlihat | Semua | Windows | Pastikan untuk mengonfigurasi jaringan Anda sebagai jaringan "pribadi". Windows mungkin lebih ketat saat jaringan dikonfigurasi sebagai publik. | +| Perangkat tidak terlihat | macOS, iOS | Semua | Anda dapat mencoba mengaktifkan/menonaktifkan izin "Local Network" di bawah "Privacy" di pengaturan OS. | +| Kecepatan terlalu lambat | Semua | Semua | Gunakan 5 GHz; Nonaktifkan enkripsi pada kedua perangkat | +| Kecepatan terlalu lambat | Semua | Android | Masalah yang diketahui. https://github.com/flutter-cavalry/saf_stream/issues/4 | + diff --git a/readme_i18n/README_IT.md b/readme_i18n/README_IT.md new file mode 100644 index 0000000..b0af348 --- /dev/null +++ b/readme_i18n/README_IT.md @@ -0,0 +1,183 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] +[![Translations][translate-badge]][translate-link] +[![Packaging status][packaging-badge]][packaging-link] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml +[translate-badge]: https://hosted.weblate.org/widget/localsend/app/svg-badge.svg +[translate-link]: https://hosted.weblate.org/engage/localsend/ +[packaging-badge]: https://repology.org/badge/tiny-repos/localsend.svg +[packaging-link]: https://repology.org/project/localsend/versions + +[Sito web][sito web] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Türkçe](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[sito web]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend è un'applicazione gratuita e open-source che consente di condividere file e messaggi, in modo sicuro, con i dispositivi vicini attraverso la rete locale, senza bisogno di una connessione a Internet. + +- [Panoramica](#panoramica) +- [Screenshot](#screenshot) +- [Download](#download) +- [Come funziona](#come-funziona) +- [Primi passi](#primi-passi) +- [Come contribuire](#come-contribuire) + - [Traduzione](#traduzione) + - [Correzione di bug e miglioramenti](#correzione-di-bug-e-miglioramenti) +- [Risoluzione dei problemi](#risoluzione-dei-problemi) +- [Compilazione](#compilazione) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## Panoramica + +LocalSend è un'applicazione multipiattaforma che permette di comunicare in modo sicuro tra dispositivi utilizzando un'API REST e la crittografia HTTPS. A differenza di altre app di messaggistica che si affidano a server esterni, LocalSend non richiede una connessione a Internet o a server di terze parti e rappresenta una soluzione veloce e affidabile per la comunicazione locale. + +## Screenshot + +Screenshot su iPhone Screenshot su PC + +## Download + +[![Packaging status](https://repology.org/badge/tiny-repos/localsend.svg)](https://repology.org/project/localsend/versions) + +È consigliabile il download tramite un app store o un gestore di pacchetti poiché l'applicazione è sprovvista di aggiornamento automatico. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [Installer EXE][latest] | | [AUR][] | | | | +| [ZIP Portatile][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +Leggi di più sui [canali di distribuzione][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[canali di distribuzione]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Compatibilità** + +| Piattaforma | Versione minima | Note | +|-------------|-----------------|------------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Usa OpenCore Legacy Patcher 2.0.2 (Vedi [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | L'ultima versione a supportare Windows 7 è la v1.15.4. Possibile un futuro sviluppo di backport più recenti per Windows 7. | +| Linux | N.A. | - | + +## Installazione + +Nella maggior parte dei casi, LocalSend dovrebbe funzionare immediatamente. Tuttavia, se si riscontrano problemi nell'invio o nella ricezione di file, potrebbe essere necessario configurare il firewall per consentire a LocalSend di comunicare su rete locale. + +| Tipo di traffico | Protocollo | Porta | Azione | +|------------------|------------|-------|----------| +| In entrata | TCP, UDP | 53317 | Consenti | +| In uscita | TCP, UDP | Any | Consenti | + +Assicuratevi di disabilitare l'isolamento AP sul vostro router. Dovrebbe essere disattivato per impostazione predefinita ma su alcuni router potrebbe essere attivo (in particolare su reti ospiti). +Per ulteriori informazioni, vedere [Risoluzione dei problemi](#risoluzione-dei-problemi). + +**Modalità portatile** + +(Introdotta nella versione v1.13.0) + +Crea un file con nome `settings.json` nella stessa cartella dell'eseguibile. +Questo file può essere vuoto. +L'app memorizzerà le impostazioni in questo file anziché nella posizione predefinita. + +**Avvio minimizzato** + +(Aggiornato in versione v1.15.0) + +Per avviare l'app in modalità minimizzata (solo nella barra delle applicazioni), usa il flag `--hidden` (esempio: `localsend_app.exe --hidden`). + +Nella versione v1.14.0 e precedenti, l'app parte minimizzata se è impostato il flag `autostart` e l'impostazione nascosta è abilitata. + +## Come funziona + +LocalSend utilizza un protocollo di comunicazione sicura che premette ai dispositivi di comunicare a vicenda tramite una API REST. Tutti i dati vengono inviati in modo sicuro tramite HTTPS e il certificato TLS/SSL è generato sul momento su ogni dispositivo, assicurando la massima sicurezza. + +Per maggiori informazioni sul Protocollo LocalSend, consulta la [documentazione](https://github.com/localsend/protocol). + +## Primi passi + +Segui questi passi per compilare LocalSend dal codice sorgente: + +1. Installa Flutter [direttamente](https://flutter.dev) o utilizza [fvm](https://fvm.app) (vedi [versione richiesta](.fvmrc)) +2. Installa [Rust](https://www.rust-lang.org/tools/install) +3. Clona la repository di `LocalSend` +4. Esegui `cd app` per entrare nella cartella dell'applicazione +5. Esegui `flutter pub get` per scaricare le dipendenze +6. Esegui `flutter run` per avviare l'app + +> [!NOTE] +> Attualmente LocalSend richiede una versione più datata di Flutter (specificata in [.fvmrc](.fvmrc)) +> quindi i problemi di compilazione potrebbero essere causati da una mancata corrispondenza tra la versione di Flutter richiesta e quella installata (a livello di sistema). +> Per rendere lo sviluppo più consistente, LocalSend utilizza [fvm](https://fvm.app) per gestire la versione di Flutter del progetto. +> Dopo aver installato `fvm`, esegui `fvm flutter` anziché `flutter`. + +## Come contribuire + +Accogliamo con piacere i contributi di chiunque sia interessato a migliorare LocalSend. Se si desidera contribuire ci sono diversi modi per partecipare: + +### Traduzione + +È possibile contribuire traducendo LocalSend in altre lingue. **Metodo consigliato**: Utilizza la piattaforma [Weblate](https://hosted.weblate.org/projects/localsend/app) per gestire le traduzioni. + +**In alternativa**: È anche possibile contribuire creando un fork di questa repository e aggiungendo manualmente le traduzioni. + +Le traduzioni si trovano nella cartella [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n). Modificare il file `_missing_translations_.json` o `strings_.i18n.json` per aggiungere o aggiornare le traduzioni. + + +Status traduzione + + +**_Nota bene:_ I campi decorati con `@` non vanno tradotti; non sono usati in alcuna maniera nell'app. Si tratta semplicemente di testo informativo riguardante il file o per dare un contesto al traduttore.** + +### Correzione di bug e miglioramenti + +- **Correzione di bug:** Se trovi un bug crea una pull request con una descrizione chiara del problema e su come risolverlo. +- **Miglioramenti:** Hai un'idea su come poter migliorare LocalSend? Prima di tutto crea una "issue" per discutere il motivi per cui il miglioramento è necessario. + +Per più informazioni, vedi la [guida ai contributi](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## Risoluzione dei problemi + +| Problema | Piattaforma (invio) | Piattaforma (ricezione) | Soluzione | +|--------------------------|---------------------|-------------------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| Dispositivo non visibile | Qualsiasi | Qualsiasi | Assicurarsi di disabilitare AP-Isolation sul router. Se è abilitata, le connessioni tra i dispositivi sono vietate. | +| Dispositivo non visibile | Qualsiasi | Windows | Assicurarsi di configurare la rete come rete "privata". Windows potrebbe essere più restrittivo se la rete è configurata come pubblica. | +| Dispositivo non visibile | macOS, iOS | Qualsiasi | Si può provare a disattivare l'autorizzazione "Rete locale" in "Privacy" nelle impostazioni del sistema operativo. | +| Velocità troppo lenta | Qualsiasi | Qualsiasi | Utilizzare 5 Ghz; disabilitare la crittografia su entrambi i dispositivi | +| Velocità troppo lenta | Qualsiasi | Android | Problema noto. https://github.com/flutter-cavalry/saf_stream/issues/4 | + +## Contributori + + + Contributori di Localsend + diff --git a/readme_i18n/README_JA.md b/readme_i18n/README_JA.md new file mode 100644 index 0000000..ccb8f4c --- /dev/null +++ b/readme_i18n/README_JA.md @@ -0,0 +1,145 @@ +# LocalSend + +[![CI ステータス][ci-badge]][ci-workflow] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml + +[ホームページ][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSendは、インターネット接続を必要とせずに、ローカルネットワーク上で近くのデバイスとファイルやメッセージを安全に共有できる、無料のオープンソースアプリです。 + +- [概要](#概要) +- [スクリーンショット](#スクリーンショット) +- [ダウンロード](#ダウンロード) +- [仕組み](#仕組み) +- [始め方](#始め方) +- [貢献](#貢献) + - [翻訳](#翻訳) + - [バグ修正と改善](#バグ修正と改善) +- [ビルド](#ビルド) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## 概要 + +LocalSendは、REST APIとHTTPS暗号化を使用してデバイス間の安全な通信を可能にするクロスプラットフォームアプリです。他のメッセージングアプリが外部サーバーに依存するのとは異なり、LocalSendはインターネット接続やサードパーティのサーバーを必要とせず、ローカル通信のための迅速で信頼性の高いソリューションとなります。 + +## スクリーンショット + +iPhoneのスクリーンショット PCのスクリーンショット + +## ダウンロード + +アプリには自動更新機能がないため、アプリストアまたはパッケージマネージャーからアプリをダウンロードすることをお勧めします。 + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +[distribution channels]について詳しく読む。 + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**互換性** + +| プラットフォーム | 最小バージョン | 備考 | +|----------|-----------------|-----------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | OpenCore Legacy Patcher 2.0.2を使用してください([#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)を参照) | +| Windows | 10 | Windows 7をサポートする最後のバージョンはv1.15.4です。将来、Windows 7用の新しいバージョンのバックポートがある可能性があります。 | +| Linux | N.A. | 依存関係: Gnome: `xdg-desktop-portal` および `xdg-desktop-portal-gtk`, KDE: `xdg-desktop-portal` および `xdg-desktop-portal-kde` | + +## 仕組み + +LocalSendは、デバイスがREST APIを使用して通信できる安全な通信プロトコルを使用しています。すべてのデータはHTTPSで安全に送信され、TLS/SSL証明書は各デバイスで動的に生成され、最大限のセキュリティを確保します。 + +LocalSendプロトコルの詳細については、[ドキュメント](https://github.com/localsend/protocol)を参照してください。 + +## 始め方 + +ソースコードからLocalSendをコンパイルするには、次の手順に従います: + +1. Flutterを[直接](https://flutter.dev)または[fvm](https://fvm.app)を使用してインストールします([必要なバージョン](.fvmrc)を参照)。 +2. `LocalSend`リポジトリをクローンします。 +3. `cd app`を実行してappディレクトリに入ります。 +4. `flutter pub get`を実行して依存関係をダウンロードします。 +5. `flutter run`を実行してアプリを起動します。 + +> [!NOTE] +> LocalSendは現在、古いFlutterバージョン([.fvmrc](.fvmrc)に指定)を必要とし、そのためビルドの問題は必要なバージョンと(システム全体の)インストールされたFlutterバージョンの不一致によって引き起こされる可能性があります。 +> 開発をより一貫性のあるものにするために、LocalSendは[fvm](https://fvm.app)を使用してプロジェクトのFlutterバージョンを管理します。 +> `fvm`をインストールした後、`flutter`の代わりに`fvm flutter`を実行します。 + +## 貢献 + +LocalSendの改善に興味のある方からの貢献を歓迎します。貢献したい場合は、いくつかの方法があります: + +### 翻訳 + +LocalSendを他の言語に翻訳するのをお手伝いください!**推奨される方法**: [Weblate](https://hosted.weblate.org/projects/localsend/app)プラットフォームを使用して翻訳を管理してください。 + +**別の方法**: このリポジトリをフォークして翻訳を手動で追加することもできます。 + +翻訳は[app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n)ディレクトリにあります。翻訳を追加または更新するには、`_missing_translations_.json`または`strings_.i18n.json`ファイルを編集してください。 + + +翻訳ステータス + + +**_注意:_ `@`で装飾されたフィールドは翻訳のためのものではありません;それらはアプリで使用されていない情報テキストであり、翻訳者に文脈を提供するためのものです。** + +### バグ修正と改善 + +- **バグ修正:** バグを見つけた場合は、問題の説明と修正方法を明確に記載したプルリクエストを作成してください。 +- **改善:** LocalSendを改善するアイデアがありますか?改善が必要な理由を議論するために、最初に問題を作成してください。 + +詳細については、[貢献ガイド](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md)を参照してください。 + +## トラブルシューティング + +| 問題 | プラットフォーム(送信) | プラットフォーム(受信) | 解決策 | +|--------------------|--------------------|----------------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| デバイスが表示されない | すべて | すべて | ルーターでAP-Isolationを無効にしてください。有効になっている場合、デバイス間の接続が禁止されます。 | +| デバイスが表示されない | すべて | Windows | ネットワークを「プライベート」ネットワークとして構成してください。ネットワークがパブリックとして構成されている場合、Windowsはより制限的になる可能性があります。 | +| デバイスが表示されない | macOS, iOS | すべて | OS設定の「プライバシー」の下にある「ローカルネットワーク」権限を切り替えてみてください。 | +| 速度が遅すぎる | すべて | すべて | 5 GHzを使用してください;両方のデバイスで暗号化を無効にしてください | +| 速度が遅すぎる | すべて | Android | 既知の問題。https://github.com/flutter-cavalry/saf_stream/issues/4 | + + +## 貢献者 + + + Localsendの貢献者 + diff --git a/readme_i18n/README_KM.md b/readme_i18n/README_KM.md new file mode 100644 index 0000000..532556d --- /dev/null +++ b/readme_i18n/README_KM.md @@ -0,0 +1,173 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml + +[ទំព័រដើម][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend គឺជាកម្មវិធីឥតគិតថ្លៃ, បើកបង្ហាញប្រភពកូដ ដែលអនុញ្ញាតឱ្យអ្នកចែករំលែកឯកសារ និងសារដោយសុវត្ថិភាពជាមួយឧបករណ៍ដែលនៅជិតៗដែលស្ថិតនៅលើបណ្តាញមូលដ្ឋានតែមួយរបស់អ្នកដោយមិនចាំបាច់ភ្ជាប់អ៊ីនធឺណិត។ + +- [អំពី](#about) +- [រូបតាំងបង្ហាញ](#screenshots) +- [ទាញយក](#download) +- [របៀបដែលកម្មវិធីដំណើរការ](#how-it-works) +- [ចាប់ផ្តើម](#getting-started) +- [ការចូលរួមចំណែក](#contributing) + - [បកប្រែ](#translation) + - [ជួសជុល អភិវឌ្ឍន៍ និងកែលម្អលើកម្មវិធី](#bug-fixes-and-improvements) +- [ការបង្កើត](#building) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## អំពី + +LocalSend គឺជាកម្មវិធីដែលដំណើរការគ្រប់ប្រព័ន្ធប្រតិបត្តិការទាំងអស់ និងអនុញ្ញាតឲ្យមានការទំនាក់ទំនងប្រកបដោយសុវត្ថិភាពរវាងឧបករណ៍និងឧបករណ៍ដោយប្រើ REST API និងការធ្វើកូដនីយកម្ម HTTPS ។ មិនដូចកម្មវិធីផ្ញើសារផ្សេងទៀតដែលពឹងផ្អែកលើម៉ាស៊ីនមេខាងក្រៅទេ LocalSend មិនតម្រូវឱ្យមានការតភ្ជាប់អ៊ីនធឺណិត ឬម៉ាស៊ីនមេភាគីទីបីឡើយ ដែលធ្វើឱ្យវាក្លាយជាដំណោះស្រាយដែលលឿន និងអាចទុកចិត្តបានសម្រាប់ការទំនាក់ទំនងក្នុងតំបន់ local។ + +## រូបតាំងបង្ហាញ + +iPhone screenshot PC screenshot + +## ទាញយក + +ការទាញយកកម្មវិធីពីក្នុងហាងកម្មវិធីផ្លូវការ ឬពីកម្មវិធីគ្រប់គ្រងកញ្ចប់ ត្រូវបានណែនាំ ពីព្រោះកម្មវិធីមិនមានការធ្វើបច្ចុប្បន្នភាពដោយស្វ័យប្រវត្តិទេ។ + +| Windows | macOS | Linux | Android | iOS | Fire OS | +| ----------------------- | ----------------------- | ------------------ | -------------- | ------------- | ---------- | +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +ស្វែងយល់ និងអានបន្ថែមអំពី [distribution channels][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**ភាពឆបគ្នា** + +| Platform | កំណែអប្បបរមា | ចំណាំ | +|----------|-----------------|-----------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | ប្រើ OpenCore Legacy Patcher 2.0.2 (សូមមើល [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | កំណែចុងក្រោយដែលគាំទ្រ Windows 7 គឺ v1.15.4។ ប្រហែលជាមានកំណែថ្មីជាងសម្រាប់ Windows 7 នៅពេលអនាគត។ | +| Linux | N.A. | ភាពអាស្រ័យ: Gnome: `xdg-desktop-portal` និង `xdg-desktop-portal-gtk`, KDE: `xdg-desktop-portal` និង `xdg-desktop-portal-kde` | + +## របៀបរៀបចំតម្លើង + +ក្នុងករណីភាគច្រើន LocalSend គួរតែដំណើរការដោយរលូន និងឥតមានបញ្ហា។ ទោះជាយ៉ាងណាក៏ដោយ ប្រសិនបើអ្នកមានបញ្ហាក្នុងការផ្ញើ ឬទទួលឯកសារ អ្នកប្រហែលជាត្រូវកំណត់រចនាសម្ព័ន្ធ Firewall របស់អ្នក ដើម្បីអនុញ្ញាតឱ្យ LocalSend អាចទំនាក់ទំនងនៅលើបណ្តាញមូលដ្ឋានរបស់អ្នក។ + +| ប្រភេទ Traffic | ប្រូតូកូល | ផត | Action | +| -------------- | --------- | ---------- | -------- | +| ចូល | TCP, UDP | 53317 | អនុញ្ញាត | +| ចេញ | TCP, UDP | មួយណាក៏បាន | អនុញ្ញាត | + +ម្យ៉ាងទៀត ត្រូវប្រាកដថាបានបិទការផ្តាច់ AP នៅលើ router របស់អ្នក។ ជាធម្មតា វាគួរតែត្រូវបានបិទតាមលំនាំដើមដោយស្វ័យប្រវត្តិ ប៉ុន្តែ router ខ្លះប្រហែលអាចនឹងបើក (ជាពិសេស guest networks)។ + +**Portable Mode** + +(ត្រូវបានបង្ហាញជាលើកដំបូងក្នុងជំនាន់ v1.13.0) + +បង្កើតឯកសារមួយមានឈ្មោះថា `settings.json` ស្ថិតនៅក្នុងទីតាំង directory ដូចគ្នាជាមួយនឹង executable ។ +ឯកសារនេះអាចនឹងទទេ។ +កម្មវិធីនេះនឹងប្រើប្រាស់ឯកសារនេះដើម្បីរក្សាទុកការកំណត់ជំនួសឲ្យទីតាំងគោលដើម។ + +**ការចាប់ផ្តើមកម្មវិធីត្រូវបានលាក់** + +(ត្រូវបានធ្វើបច្ចុប្បន្នភាពនៅក្នុងជំនាន់ v1.15.0) + +ដើម្បីចាប់ផ្តើមកម្មវិធីដែលលាក់ (តែក្នុង tray ប៉ុណ្ណោះ) សូមប្រើ `--hidden` (ឧទាហរណ៍៖ `localsend_app.exe --hidden`)។ + +នៅក្នុងជំនាន់ v1.14.0 និងពីមុនៗ កម្មវិធីនឹងចាប់ផ្តើមលាក់ប្រសិនបើ `autostart` ត្រូវបានកំណត់ ហើយការកំណត់លាក់កម្មវិធីនឹងត្រូវបានបើក។ + +## របៀបដែលកម្មវិធីដំណើរការ + +LocalSend ប្រើ Protocol ទំនាក់ទំនងសុវត្ថិភាពដែលអនុញ្ញាតឱ្យឧបករណ៍ទំនាក់ទំនងគ្នាទៅវិញទៅមកដោយប្រើ REST API ។ ទិន្នន័យទាំងអស់ត្រូវបានផ្ញើដោយសុវត្ថិភាពតាម HTTPS ហើយវិញ្ញាបនបត្រ TLS/SSL ត្រូវបានបង្កើតភ្លាមៗនៅលើឧបករណ៍នីមួយៗ ដោយធានាបាននូវសុវត្ថិភាពយ៉ាងអតិបរមា។ + +សម្រាប់ព័ត៌មានបន្ថែមអំពី LocalSend Protocol សូមមើល [documentation](https://github.com/localsend/protocol)។ + +## ចាប់ផ្តើម + +ដើម្បី compile កម្មវិធី LocalSend ចេញពីកូដប្រភព សូមអនុវត្តតាមជំហានទាំងនេះ៖ + +1. តម្លើង Flutter [ដោយផ្ទាល់](https://flutter.dev) ឬដោយប្រើ [fvm](https://fvm.app) (សូមមើល [ជំនាន់ដែលអ្នកត្រូវការ].fvmrc)) +2. Clone កូដពី 'LocalSend' repository +3. វាយពាក្យបញ្ជា `cd app` ដើម្បីបើកចូលបញ្ជីកម្មវិធី +4. វាយពាក្យបញ្ជា `flutter pub get` ដើម្បីទាញយក dependencies +5. វាយពាក្យបញ្ជា 'flutter run' ដើម្បីចាប់ផ្តើមដំណើរការកម្មវិធី + +> [!ចំណាំ] +> LocalSend បច្ចុប្បន្នទាមទារកំណែ Flutter ចាស់ (បានបញ្ជាក់ក្នុង [.fvmrc].fvmrc)) +> ហើយដូច្នេះបញ្ហាស្ថាបនាកម្មវិធីអាចបណ្តាលមកពីភាពមិនស៊ីសង្វាក់គ្នារវាងជំនាន់ Flutter ដែលទាមទារ និង ជំនាន់ដែលអ្នកបានតម្លើង (ប្រព័ន្ធទាំងមូល)។ +> ដើម្បីធ្វើឱ្យការអភិវឌ្ឍន៍កាន់តែស៊ីសង្វាក់គ្នា LocalSend ប្រើ [fvm](https://fvm.app) ដើម្បីគ្រប់គ្រងជំនាន់ និងកំណែ Flutter។ +> បន្ទាប់ពីតម្លើង `fvm` សូមវាយពាក្យបញ្ជា `fvm flutter` ជំនួសឱ្យ `flutter`។ + +## ការរួមចំណែក + +យើងស្វាគមន៍ការរួមចំណែកពីអ្នកដែលចាប់អារម្មណ៍ក្នុងការជួយកែលម្អ LocalSend ។ ប្រសិនបើអ្នកចង់រួមចំណែក មានវិធីមួយចំនួនដើម្បីចូលរួម៖ + +### ការបកប្រែ + +អ្នកអាចជួយបកប្រែ LocalSend ទៅជាភាសាផ្សេងទៀត! **វិធីដែលបានណែនាំ**: ប្រើប្ល័តហ្វោម [Weblate](https://hosted.weblate.org/projects/localsend/app) ដើម្បីគ្រប់គ្រងការបកប្រែ។ + +**ជម្រើសមួយទៀត**: អ្នកក៏អាចរួមចំណែកដោយ Fork មាន repository នេះ ហើយបន្ថែមការបកប្រែដោយដៃ។ + +ការបកប្រែស្ថិតនៅក្នុងថត [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n)។ កែសម្រួលឯកសារ `_missing_translations_.json` ឬ `strings_.i18n.json` ដើម្បីបន្ថែម ឬធ្វើបច្ចុប្បន្នភាពការបកប្រែ។ + + +ស្ថានភាពបកប្រែ + + +**_ចំណាំ:_ កន្លែងដែលដាក់ភ្ជាប់ដោយ `@` នៅពីមុខ មិនត្រូវបកប្រែទេ។ ពួកវាមិនត្រូវបានប្រើនៅក្នុងកម្មវិធីតាមធ្យោបាយណាមួយឡើយ ដោយគ្រាន់តែជាអត្ថបទផ្តល់ព័ត៌មានអំពីឯកសារ ឬផ្តល់បរិបទដល់អ្នកបកប្រែ។** + +### ជួសជុលបញ្ហា និងកែសម្រួល + +- **ជួសជុលបញ្ហា:** ប្រសិនបើអ្នករកឃើញកំហុស សូមបង្កើតសំណើ pull request ដោយមានការពិពណ៌នាច្បាស់លាស់អំពីបញ្ហា និងរបៀបជួសជុលវា។ +- **កែសម្រួល:** មានបំណងចង់កែលម្អ LocalSend ទេ? សូមបង្កើត issue លើ GitHub ជាមុនសិន ដើម្បីពិភាក្សាពីមូលហេតុដែលចាំបាច់ត្រូវកែលម្អ។ + +សម្រាប់ព័ត៌មានបន្ថែម, សូមមើល [ការណែនាំស្តីពីការរួមចំណែក](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## ការដោះស្រាយបញ្ហា + +| បញ្ហា | Platform (ផ្ញើ) | Platform (ទទួល) | ដំណោះស្រាយ | +|--------------------|--------------------|----------------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| មិនឃើញឧបករណ៍ | ណាមួយក៏បាន | ណាមួយក៏បាន | ត្រូវប្រាកដថាបានបិទ AP-Isolation នៅលើ router របស់អ្នក។ ប្រសិនបើវាបានបើក ការតភ្ជាប់រវាងឧបករណ៍ត្រូវបានហាមឃាត់។ | +| មិនឃើញឧបករណ៍ | ណាមួយក៏បាន | Windows | ត្រូវប្រាកដថាបានកំណត់បណ្តាញរបស់អ្នកជាបណ្តាញ "ឯកជន"។ Windows អាចនឹងមានការរឹតបន្តឹងជាងនេះនៅពេលបណ្តាញត្រូវបានកំណត់ជាសាធារណៈ។ | +| មិនឃើញឧបករណ៍ | macOS, iOS | ណាមួយក៏បាន | អ្នកអាចសាកល្បងប្តូរការអនុញ្ញាត "Local Network" នៅក្រោម "Privacy" នៅក្នុងការកំណត់ OS។ | +| ល្បឿនយឺតពេក | ណាមួយក៏បាន | ណាមួយក៏បាន | ប្រើ 5 Ghz; បិទការអ៊ិនគ្រីបនៅលើឧបករណ៍ទាំងពីរ | +| ល្បឿនយឺតពេក | ណាមួយក៏បាន | Android | បញ្ហាដែលត្រូវបានដឹង។ https://github.com/flutter-cavalry/saf_stream/issues/4 | + + +## អ្នកចូលរួមចំណែក + + + Localsend Contributors + diff --git a/readme_i18n/README_KO.md b/readme_i18n/README_KO.md new file mode 100644 index 0000000..f365a51 --- /dev/null +++ b/readme_i18n/README_KO.md @@ -0,0 +1,176 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] +[![Translations][translate-badge]][translate-link] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml +[translate-badge]: https://hosted.weblate.org/widget/localsend/app/svg-badge.svg +[translate-link]: https://hosted.weblate.org/engage/localsend/ + +[홈페이지][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend는 인터넷에 연결하지 않고도 로컬 네트워크를 통해 주변 기기들과 파일 및 메시지를 안전하게 공유할 수 있는 무료 오픈소스 앱입니다. + +- [정보](#정보) +- [스크린샷](#스크린샷) +- [다운로드](#다운로드) +- [작동 원리](#작동-원리) +- [시작하기](#시작하기) +- [기여하기](#기여하기) + - [번역](#번역) + - [버그 수정 및 개선](#버그-수정-및-개선) +- [빌드](#빌드) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## 정보 + +LocalSend는 REST API 및 HTTPS 암호화를 통해 기기 간의 파일을 안전하게 주고 받을 수 있는 크로스플랫폼 애플리케이션입니다. 외부 서버에 의존하는 다른 앱과 달리, LocalSend는 인터넷 연결 및 제삼자 서버를 필요로 하지 않는 만큼, 근거리 통신을 위한 빠르고 안정적인 대안이라고 할 수 있습니다. + +## 스크린샷 + +iPhone screenshot PC screenshot + +## 다운로드 + +애플리케이션에 자동 업데이트 기능이 존재하지 않는 만큼, 앱스토어 및 패키지 매니저를 통해 앱을 다운로드 받을 것을 권장합니다. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +[배포 채널][distribution channels]에서 더 자세한 내용을 찾아볼 수 있습니다. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**요구 사항** + +| 플랫폼 | 최소 버전 | 알림 | +|----------|-----------------|------------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | OpenCore Legacy Patcher 2.0.2 필요 ([#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384) 참고)| +| Windows | 10 | Windows 7을 지원하는 마지막 버전은 v1.15.4입니다. 추후 Windows 7을 지원하는 최신 버전이 공개될 수 있습니다. | +| Linux | N.A. | - | + +## 설정 + +대부분의 경우, LocalSend는 별 다른 설정을 하지 않더라도 곧바로 동작하도록 설계되어 있습니다. 하지만, 파일을 주고 받는데 어려움을 겪고 계신다면, LocalSend가 로컬 네트워크를 통해 데이터를 주고받을 수 있도록 방화벽 설정을 수정해야 할 수 있습니다. + +| 트래픽 타입 | 프로토콜 | 포트 | 작업 | +|--------------|----------|-------|--------| +| Incoming | TCP, UDP | 53317 | 허용 | +| Outgoing | TCP, UDP | Any | 허용 | + +또한, 라우터 설정에서 AP 격리 기능을 비활성화하는 것을 잊지 마세요. 대부분은 해당 기능이 기본적으로 비활성화되어 있으나, 일부 라우터 (특히 공공 네트워크에서는) AP 격리 기능이 활성화되어 있을 수 있습니다. + +**포터블 모드** + +(v1.13.0에서 도입됨) + +실행파일과 같은 경로 내에 `settings.json` 파일을 생성하세요. +파일 내용은 비어있어도 됩니다. +앱이 기본 경로 대신 해당 파일에 설정값을 저장하게 됩니다. + +**숨김 상태로 실행** + +(v1.15.0에서 업데이트됨) + +앱이 (작업표시줄에) 숨겨진 상태로 실행하게 하려면, `--hidden` 플래그를 사용하세요 (예시: `localsend_app.exe --hidden`). + +v1.14.0보다 낮은 버전에서는, `autostart` 플래그가 설정되어 있고, 숨김 설정이 활성화되어 있을 때 앱이 숨겨진 상태로 실행됩니다. + +## 작동 원리 + +LocalSend는 REST API 기술을 사용해 다른 기기와 안전하게 데이터를 주고받을 수 있는 통신 프로토콜을 이용합니다. 모든 데이터는 HTTPS를 통해 안전하게 전송되며, 각 기기마다 TLS/SSL 인증서가 생성되어 최대한의 안전성을 보장합니다. + +LocalSend 프로토콜에 대해 더욱 자세한 정보를 알고 싶으시다면, [문서](https://github.com/localsend/protocol)을 참고하시기 바랍니다. + +## 시작하기 + +소스코드로부터 LocalSend를 컴파일하려면, 아래 과정들을 따라하시기 바랍니다: + +1. Flutter를 [직접](https://flutter.dev) 설치하시거나, [fvm](https://fvm.app)을 사용하세요. ([요구 버전](.fvmrc) 참고) +2. [Rust](https://www.rust-lang.org/tools/install)를 설치하세요. +3. `LocalSend` repository를 Clone하세요. +4. `cd app` 명령어를 통해 앱이 위치한 경로로 이동하세요. +5. `flutter pub get` 명령어를 통해 필요한 패키지를 다운로드 받으세요. +6. `flutter run` 명령어를 통해 앱을 실행하세요. + +> [!중요] +> LocalSend는 현재 구 버전의 Flutter를 사용하고 있습니다. ([.fvmrc](.fvmrc) 참고) +> 따라서 시스템에 설치된 Flutter 버전과, LocalSend가 요구하는 버전이 맞지 않는데서 다양한 빌드 오류가 발생할 수 있습니다. +> 더욱 일관된 개발 환경을 확보하기 위해, LocalSend는 [fvm](https://fvm.app)을 사용하여 프로젝트 Flutter 버전을 관리하고 있습니다. +> `fvm`을 설치하신 뒤, `flutter` 명령어 대신 `fvm flutter` 명령어를 사용하시기 바랍니다. + +## 기여하기 + +저희는 LocalSend를 개선하는데 관심을 갖고 있는 모든 분들로부터의 기여를 환영합니다. 만약 기여를 하고자 하신다면, 아래 몇 가지 방법들이 존재합니다: + +### 번역 + +LocalSend를 다양한 언어로 번역하는데 도움을 주실 수 있습니다. 저희는 [Weblate](https://hosted.weblate.org/projects/localsend/app) 플랫폼을 통해 번역을 관리하고 있습니다. + +이 외에도, 해당 레포지토리를 포크하여 직접 번역문을 추가하는 방식으로도 기여하실 수 있습니다. + +번역 파일은 [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n) 경로에서 찾아보실 수 있습니다. `_missing_translations_.json` 또는 `strings_.i18n.json` 파일을 수정하여 번역문을 추가하거나 개선할 수 있습니다. + + +Translation status + + +**_중요:_ `@`로 장식된 항목들은 번역 대상이 아닙니다; 이는 앱에서 표시되는 문구가 아니고, 다만 번역가에게 도움이 되는 정보나 문맥을 제공하기 위해 작성된 항목입니다.** + +### 버그 수정 및 개선 + +- **버그 수정:** 버그를 발견하셨다면, 부디 pull request를 생성하여 어떤 문제가 발생하고 있는지, 이를 어떻게 고칠 수 있는지를 투명하게 알려주시기 바랍니다. +- **개선:** LocalSend를 개선하기 위한 아이디어가 있으신가요? Issue를 생성하여 어떤 부분을 개선하면 좋을지 알려주세요. + +더 많은 정보가 필요하시다면, [기여 가이드](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md)를 확인하시기 바랍니다. + +## 문제 해결 + +| 문제 | 플랫폼 (전송) | 플랫폼 (수신) | 해결 방법 | +|--------------------|--------------------|----------------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| 장치가 보이지 않음 | 모두 | 모두 | 라우터에서 AP-Isolation을 비활성화했는지 확인하세요. 활성화되어 있으면 장치 간 연결이 금지됩니다. | +| 장치가 보이지 않음 | 모두 | Windows | 네트워크를 "개인" 네트워크로 구성했는지 확인하세요. 네트워크가 공용으로 구성되어 있으면 Windows가 더 제한적일 수 있습니다. | +| 장치가 보이지 않음 | macOS, iOS | 모두 | OS 설정의 "개인 정보 보호"에서 "로컬 네트워크" 권한을 전환해 보세요. | +| 속도가 너무 느림 | 모두 | 모두 | 5 GHz 사용; 두 장치 모두에서 암호화 비활성화 | +| 속도가 너무 느림 | 모두 | Android | 알려진 문제. https://github.com/flutter-cavalry/saf_stream/issues/4 | + +## 기여자 + + + Localsend Contributors + diff --git a/readme_i18n/README_MS.md b/readme_i18n/README_MS.md new file mode 100644 index 0000000..abafc3c --- /dev/null +++ b/readme_i18n/README_MS.md @@ -0,0 +1,184 @@ +# LocalSend + +[![Status CI][ci-badge]][ci-workflow] +[![Penterjemahan][translate-badge]][translate-link] +[![Status pembungkusan][packaging-badge]][packaging-link] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml +[translate-badge]: https://hosted.weblate.org/widget/localsend/app/svg-badge.svg +[translate-link]: https://hosted.weblate.org/engage/localsend/ +[packaging-badge]: https://repology.org/badge/tiny-repos/localsend.svg +[packaging-link]: https://repology.org/project/localsend/versions + +[Laman Utama][laman utama] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[Bahasa Inggeris (Lalai)](/README.md) • [Bahasa Melayu](README_MS.md) • [Bahasa Sepanyol](README_ES.md) • [Bahasa Parsi](README_FA.md) • [Bahasa Filipino](README_PH.md) • [Bahasa Perancis](README_FR.md) • [Bahasa Indonesia](README_ID.md) • [Bahasa Itali](README_IT.md) • [Bahasa Jepun](README_JA.md) • [Bahasa Khmer](README_KM.md) • [Bahasa Korea](README_KO.md) • [Bahasa Poland](README_PL.md) • [Bahasa Portugis Brazil](README_PT_BR.md) • [Bahasa Rusia](README_RU.md) • [Bahasa Thai](README_TH.md) • [Bahasa Türkiye](README_TR.md) • [Bahasa Ukraine](README_UK.md) • [Bahasa Vietnam](README_VI.md) • [Bahasa Cina](README_ZH.md) + +[laman utama]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend adalah aplikasi sumber terbuka percuma yang membolehkan anda berkongsi fail dan mesej secara terjamin dengan peranti berdekatan melalui rangkaian tempatan anda tanpa memerlukan sambungan internet. + +- [Tentang](#tentang) +- [Syot-syot Layar](#syot-syot-layar) +- [Muat Turun](#muat-turun) +- [Bagaimana ia Berfungsi](#bagaimana-ia-berfungsi) +- [Cara Mula](#cara-mula) +- [Mengambil Bahagian](#mengambil-bahagian) + - [Penterjemahan](#penterjemahan) + - [Pembetulan Pepijat dan Penambahbaikan](#pembetulan-pepijat-dan-penambahbaikan) +- [Menyelesaikan Masalah](#menyelesaikan-masalah) +- [Membina](#membina) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## Tentang + +LocalSend adalah aplikasi merentas platform yang membolehkan komunikasi selamat antara peranti-peranti menggunakan REST API dan penyulitan HTTPS. Bukan seperti aplikasi pemesejan lain yang bergantung pada pelayan luaran, LocalSend tidak memerlukan sambungan internet atau pelayan pihak ketiga, menjadikannya penyelesaian yang pantas dan boleh dipercayai untuk komunikasi tempatan. + +## Syot-syot Layar + +iPhone screenshot PC screenshot + +## Muat Turun + +[![Status pembungkusan](https://repology.org/badge/tiny-repos/localsend.svg)](https://repology.org/project/localsend/versions) + +Adalah digalakkan untuk memuat turun aplikasi sama ada dari gedung aplikasi atau dari pengurus pakej kerana aplikasi ini tidak mempunyai pengemaskinian automatik. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|--------------------------|--------------------------|---------------------|-----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][terkini] | [Snap][] | [APK][terkini] | | | +| [EXE Installer][terkini] | | [AUR][] | | | | +| [Portable ZIP][terkini] | | [TAR][terkini] | | | | +| | | [DEB][terkini] | | | | +| | | [AppImage][terkini] | | | | + +Baca lebih lanjut tentang [saluran pengedaran][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[terkini]: https://github.com/localsend/localsend/releases/latest +[saluran pengedaran]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Keserasian** + +| Platform | Versi Minimum | Nota | +|----------|---------------|---------------------------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Gunakan OpenCore Legacy Patcher 2.0.2 (Lihat [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | Versi terakhir yang menyokong Windows 7 ialah v1.15.4. Mungkin terdapat sokongan versi yang lebih baharu untuk Windows 7 pada masa hadapan. | +| Linux | N.A. | - | + +## Penyediaan + +Dalam kebanyakan kes, LocalSend akan berfungsi terus. Walau bagaimanapun, jika anda menghadapi masalah menghantar atau menerima fail, anda mungkin perlu mengkonfigurasi tembok api (_firewall_) anda untuk membenarkan LocalSend berkomunikasi melalui rangkaian tempatan anda. + +| Jenis Trafik | Protokol | Port | Tindakan | +|--------------|----------|-------------|----------| +| Masuk | TCP, UDP | 53317 | Allow | +| Keluar | TCP, UDP | Mana-mana | Allow | + +Juga pastikan untuk melumpuhkan pengasingan AP pada penghala anda. Ia biasanya dilumpuhkan secara lalai tetapi sesetengah penghala mungkin mendayakannya (terutamanya rangkaian tetamu). +Lihat [penyelesaian masalah](#menyelesaikan-masalah) untuk mendapatkan maklumat lanjut. + +**Mod Mudah Alih** + +(Diperkenalkan dalam v1.13.0) + +Cipta fail bernama `settings.json` yang terletak dalam direktori yang sama dengan atur cara boleh laku. +Fail ini boleh kosong. +Apl akan menggunakan fail ini untuk menyimpan tetapan, bukannya lokasi lalai. + +**Memulakan secara tersembunyi** + +(Dikemas kini dalam v1.15.0) + +Untuk memulakan apl tersembunyi (hanya dalam dulang (_tray_)), gunakan bendera (_flag_) `--hidden` (contoh: `localsend_app.exe --hidden`). + +Pada v1.14.0 dan lebih awal, apl mula disembunyikan jika bendera `autostart` ditetapkan dan tetapan tersembunyi didayakan. + +## Bagaimana ia Berfungsi + +LocalSend menggunakan protokol komunikasi terjamin yang membolehkan peranti berkomunikasi antara satu sama lain menggunakan API REST. Semua data dihantar dengan selamat melalui HTTPS dan sijil TLS/SSL dijana dengan segera pada setiap peranti, memastikan keterjaminan maksimum. + +Untuk mendapatkan maklumat lanjut tentang Protokol LocalSend, lihat [dokumentasi](https://github.com/localsend/protocol). + +## Cara Mula + +Untuk kompil LocalSend daripada kod sumber, ikuti langkah berikut: + +1. Pasang Flutter [secara langsung](https://flutter.dev) atau gunakan [fvm](https://fvm.app) (lihat [versi diperlukan](.fvmrc)) +2. Pasang [Rust](https://www.rust-lang.org/tools/install) +3. Klon repositori `LocalSend` +4. Jalankan `cd app` untuk memasuki direktori apl +5. Jalankan `flutter pub get` untuk memuat turun kebergantungan +6. Jalankan `flutter run` untuk memulakan apl + +> [!NOTA] +> LocalSend pada masa ini memerlukan versi Flutter lama (dinyatakan dalam [.fvmrc](.fvmrc)) +> dan dengan itu, isu binaan (_build issue_) mungkin disebabkan oleh ketidakpadanan antara versi Flutter yang diperlukan dan (seluruh sistem) yang dipasang. +> Untuk menjadikan pembangunan lebih konsisten, LocalSend menggunakan [fvm](https://fvm.app) untuk mengurus versi projek Flutter. +> Selepas memasang `fvm`, jalankan `fvm flutter` dan bukannya `flutter`. + +## Mengambil Bahagian + +Kami mengalu-alukan sumbangan daripada sesiapa sahaja yang berminat untuk bantu memperbaiki LocalSend. Jika anda ingin menyumbang, terdapat beberapa cara untuk menglibatkan diri: + +### Penterjemahan + +Anda boleh membantu menterjemahkan LocalSend ke dalam bahasa-bahasa lain. Kami menggunakan platform [Weblate](https://hosted.weblate.org/projects/localsend/app) untuk mengurus penterjemahan. + +Secara alternatif, anda juga boleh menyumbang atau mengambil bahagian dengan forking repositori ini dan menambah penterjemahan secara manual. + +Terjemahan-terjemahan berada di dalam direktori [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n). Sunting fail `_missing_translations_.json` atau `strings_.i18n.json` untuk menambah atau mengemas kini terjemahan. + + +Translation status + + +**_Ambil perhatian:_ Medan yang dihiasi dengan `@` tidak dimaksudkan untuk diterjemahkan; ia tidak digunakan dalam apl dalam apa jua cara, hanya sebagai teks bermaklumat tentang fail atau untuk memberikan konteks kepada penterjemah.** + +### Pembetulan Pepijat dan Penambahbaikan + +- **Pembetulan Pepijat:** Jika anda menjumpai pepijat, sila buat permintaan tarik (_pull request_) dengan penerangan yang jelas tentang isu itu dan cara membetulkannya. +- **Penambahbaikan:** Mempunyai idea untuk menambah baik LocalSend? Sila buat isu dahulu untuk membincangkan mengapa penambahbaikan itu diperlukan. + +Untuk mengetahui dengan lebih lanjut, rujuk pada [panduan menyumbang](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## Menyelesaikan Masalah + +| Isu | Platform (Menghantar) | Platform (Menerima) | Penyelesaian | +|-------------------------|-----------------------|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------| +| Peranti tidak kelihatan | Mana-mana | Mana-mana | Pastikan untuk melumpuhkan AP-Isolation pada penghala anda. Jika ia didayakan, sambungan antara peranti adalah dilarang. | +| Peranti tidak kelihatan | Mana-mana | Windows | Pastikan untuk konfigurasi rangkaian anda sebagai rangkaian "peribadi". Windows mungkin lebih ketat apabila rangkaian dikonfigurasikan sebagai awam. | +| Peranti tidak kelihatan | macOS, iOS | Mana-mana | Anda boleh cuba menogol kebenaran "Rangkaian Tempatan" di bawah "Privasi" dalam tetapan OS. | +| Kelajuan terlalu lembab | Mana-mana | Mana-mana | Gunakan 5 Ghz; Lumpuhkan penyulitan pada kedua-dua peranti. | +| Kelajuan terlalu lembab | Mana-mana | Android | Isu yang diketahui. https://github.com/flutter-cavalry/saf_stream/issues/4 | + + +## Penyumbang yang Berbakti + + + Penyumbang Localsend + diff --git a/readme_i18n/README_PH.md b/readme_i18n/README_PH.md new file mode 100644 index 0000000..d60ddd8 --- /dev/null +++ b/readme_i18n/README_PH.md @@ -0,0 +1,173 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml + +[Tahanan][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +Ang LocalSend ay isang libreng, open-source na app na nagbibigay-daan sa iyo na ligtas na mag-share ng mga file at mensahe sa mga kalapit na device sa iyong lokal network nang hindi nangangailangan ng koneksyon sa internet. + +- [Tungkol](#Tungkol) +- [Mga Screenshots](#Mga-Screenshots) +- [I-download](#I-download) +- [Paano ito Gumagana](#Paano-ito-Gumagana) +- [Pagsisimula](#Pagsisimula) +- [Pag-aambag](#Pag-aambag) + - [Pagsasalin](#Pagsasalin) + - [Pag-aayos ng mga Bug at Improvements](#Pag-aayos-ng-mga-Bug-at-Improvements) +- [Pagbuo](#Pagbuo) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## Tungkol + +Ang LocalSend ay isang cross-platform na app na nagbibigay-daan para sa ligtas na komunikasyon sa pagitan ng mga device gamit ang REST API at HTTPS encryption. Hindi tulad ng ibang mga messaging apps na umaasa sa mga external servers, ang LocalSend ay hindi nangangailangan ng koneksyon sa internet o mga third-party servers, kaya't ito ay isang mabilis at maaasahang solusyon para sa lokal na komunikasyon. + +## Mga Screenshots + +iPhone screenshot PC screenshot + +## I-download + +Inirerekomenda na i-download ang app mula sa app store o mula sa package manager dahil ang app na ito ay walang auto-update. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +Magbasa nang higit pa tungkol sa [distribution channels][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Pagkakatugma** + +| Platform | Pinakamababang Bersyon | Paalala | +|----------|------------------------|-----------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Gumamit ng OpenCore Legacy Patcher 2.0.2 (Tingnan ang [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | Ang huling bersyon na sumusuporta sa Windows 7 ay v1.15.4. Maaaring magkaroon ng mga backport ng mas bagong bersyon para sa Windows 7 sa hinaharap. | +| Linux | N.A. | Dependencies: Gnome: `xdg-desktop-portal` at `xdg-desktop-portal-gtk`, KDE: `xdg-desktop-portal` at `xdg-desktop-portal-kde` | + +## Setup + +Sa karamihan, dapat gumana ang LocalSend out of the box. Gayunpaman, kung ikaw ay nahaharap sa mga problema sa pagpapadala o pagtanggap ng mga file, maaaring kailanganin mong i-configure ang iyong firewall upang pahintulutan ang LocalSend na makipag-ugnayan sa iyong lokal na network. + +| Traffic Type | Protocol | Port | Action | +|--------------|----------|-------|--------| +| Incoming | TCP, UDP | 53317 | Allow | +| Outgoing | TCP, UDP | Any | Allow | + +Siguraduhing i-disable ang AP isolation sa iyong router. Karaniwang naka-disable ito sa default ngunit ang ilang mga router ay maaaring naka-enable ito (lalo na sa mga guest network). + +**Portable Mode** + +(Ipinakilala sa v1.13.0) + +Lumikha ng file na may pangalang `settings.json` na matatagpuan sa parehong directory ng executable. +Maaaring walang laman ang file na ito. +Gagamitin ng app ang file na ito upang i-save ang mga setting sa halip na ang default na lokasyon. + +**Simulan ang nakatagong** + +(Na-update sa v1.15.0) + +Upang simulan ang app na nakatago (lamang sa tray), gamitin ang `--hidden` flag (halimbawa: `localsend_app.exe --hidden`). + +Sa v1.14.0 at mas maaga, ang app ay magsisimula nang nakatago kung ang `autostart` flag ay naka-set, at ang hidden setting ay naka-enable. + +## Paano Ito Gumagana + +Gumagamit ang LocalSend ng isang secure na protocol ng komunikasyon na nagpapahintulot sa mga device na makipag-usap sa isa't isa gamit ang REST API. Lahat ng data ay ipinapadala nang ligtas sa pamamagitan ng HTTPS, at ang TLS/SSL certificate ay nilikha sa bawat device, na tinitiyak ang maximum na seguridad. + +Para sa karagdagang impormasyon sa LocalSend Protocol, tingnan ang [documentation](https://github.com/localsend/protocol). + +## Pagsisimula + +Upang i-compile ang LocalSend mula sa source code, sundin ang mga hakbang na ito: + +1. I-install ang Flutter [directly](https://flutter.dev) o gamit ang [fvm](https://fvm.app) (tignan ang [version required](.fvmrc)) +2. I-clone ang `LocalSend` repository +3. I-run ang `cd app` upang pumasok sa app directory +4. I-run ang `flutter pub get` upang i-download ang mga dependencies +5. I-run ang `flutter run` upang simulan ang app + +> [!NOTE] +> Kasalukuyang nangangailangan ang LocalSend ng mas lumang bersyon ng Flutter (na tinukoy sa [.fvmrc](.fvmrc)) +> at ang mga isyu sa build ay maaaring sanhi ng mismatch sa pagitan ng required at ang (system-wide) na naka-install na Flutter version. +> Upang gawing mas consistent ang development, gumagamit ang LocalSend [fvm](https://fvm.app) upang i-manage ang proyekto Flutter version. +> Pagkatapos i-install ang `fvm`, i-run ang `fvm flutter` sa halip na `flutter`. + +## Pag-aambag + +Malugod naming tinatanggap ang mga kontribusyon mula sa sinumang interesado na makatulong na mapabuti ang LocalSend. Kung nais mong mag-ambag, may ilang mga paraan upang makilahok: + +### Pagsasalin + +Maaari kang makatulong na isalin ang LocalSend sa iba pang mga wika! **Inirerekomendang paraan**: Gamitin ang platform na [Weblate](https://hosted.weblate.org/projects/localsend/app) upang pamahalaan ang mga pagsasalin. + +**Kahaliling paraan**: Maaari din kang mag-ambag sa pamamagitan ng pag-fork sa repository na ito at pagdagdag ng mga pagsasalin nang manu-mano. + +Ang mga pagsasalin ay matatagpuan sa direktoryong [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n). I-edit ang file na `_missing_translations_.json` o `strings_.i18n.json` upang magdagdag o mag-update ng mga pagsasalin. + + +Kalagayan ng pagsasalin + + +**_Pakitandaan:_ Ang mga fields na may `@` ay hindi dapat isalin; hindi ito ginagamit sa app sa anumang paraan, nagbibigay lamang ng impormasyon tungkol sa file o upang bigyan ng konteksto ang tagasalin.** + +### Pag-aayos ng mga Bug at Improvements + +- **Pag-aayos ng Bug:** Kung nakahanap ka ng bug, mangyaring lumikha ng pull request na may malinaw na paglalarawan ng isyu at kung paano ito aayusin. +- **Improvements:** May ideya ka kung paano ma-improve ang LocalSend? Mangyaring lumikha ng issue upang talakayin kung bakit kinakailangan ng improvement. + +Para sa karagdagang impormasyon, tingnan ang [contributing guide](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## Pag-troubleshoot + +| Isyu | Platform (Nagpapadala) | Platform (Tumatanggap) | Solusyon | +|--------------------|------------------------|------------------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| Hindi nakikita ang device | Kahit ano | Kahit ano | Siguraduhing i-disable ang AP-Isolation sa iyong router. Kung ito ay naka-enable, ang mga koneksyon sa pagitan ng mga device ay ipinagbabawal. | +| Hindi nakikita ang device | Kahit ano | Windows | Siguraduhing i-configure ang iyong network bilang "private" na network. Ang Windows ay maaaring mas restrictive kapag ang network ay naka-configure bilang public. | +| Hindi nakikita ang device | macOS, iOS | Kahit ano | Maaari mong subukang i-toggle ang "Local Network" permission sa ilalim ng "Privacy" sa mga setting ng OS. | +| Napakabagal ng bilis | Kahit ano | Kahit ano | Gumamit ng 5 Ghz; I-disable ang encryption sa parehong mga device | +| Napakabagal ng bilis | Kahit ano | Android | Kilalang isyu. https://github.com/flutter-cavalry/saf_stream/issues/4 | + + +## Mga Kontribyutor + + + Localsend Contributors + diff --git a/readme_i18n/README_PL.md b/readme_i18n/README_PL.md new file mode 100644 index 0000000..ffe3289 --- /dev/null +++ b/readme_i18n/README_PL.md @@ -0,0 +1,167 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml + +[Strona główna][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend jest darmową, otwartoźródłową aplikacją, która umożliwia Ci bezpiecznie udostępnianie plików oraz wiadomości pobliskim urządzeniom w Twojej sieci lokalnej bez konieczności połączenia z internetem. + +- [O projekcie](#O-projekcie) +- [Zrzuty ekranu](#Zrzuty-ekranu) +- [Pobieranie](#Pobieranie) +- [Jak to działa?](#Jak-to-działa) +- [Pierwsze kroki](#Pierwsze-kroki) +- [Wnoszenie wkładu](#Wnoszenie-wkładu) + - [Tłumaczenie](#Tłumaczenie) + - [Poprawki błędów i ulepszenia](#Poprawki-błędów-i-ulepszenia) +- [Budowanie](#Budowanie) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## O projekcie + +LocalSend jest wieloplatformową aplikacją, która umożliwia bezpieczną komunikację między urządzeniami przy użyciu REST API oraz szyfrowania HTTPS. W przeciwieństwie do innych aplikacji, które bazują na zewnętrznych serwerach, LocalSend nie wymaga połączenia z internetem ani serwerów osób trzecich, co czyni go szybkim i niezawodnym rozwiązaniem dla lokalnej komunikacji. + +## Zrzuty ekranu + +iPhone screenshot PC screenshot + +## Pobieranie + +Zaleca się pobranie aplikacji ze sklepu z aplikacjami albo menedżera paczek, ponieważ aplikacja nie posiada automatycznych aktualizacji. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Sklep Play][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +Dowiedz się więcej o [kanałach dystrybucji][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[sklep play]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[kanałach dystrybucji]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Kompatybilność** + +| Platforma | Minimalna Wersja | Uwaga | +|-----------|------------------|-----------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Użyj OpenCore Legacy Patcher 2.0.2 (Zobacz [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | Ostatnia wersja wspierająca Windows 7 to v1.15.4. W przyszłości mogą pojawić się backporty nowszych wersji dla Windows 7. | +| Linux | N.A. | Zależności: Gnome: `xdg-desktop-portal` i `xdg-desktop-portal-gtk`, KDE: `xdg-desktop-portal` i `xdg-desktop-portal-kde` | + +## Instalacja + +W większości przypadków LocalSend powinien działać od razu po instalacji. Jednakże, jeśli masz problemy z wysyłaniem lub odbieraniem plików, może być konieczne skonfigurowanie Twojej zapory sieciowej, aby umożliwić LocalSend komunikację przez sieć lokalną. + +| Typ ruchu | Protokół | Port | Akcja | +|--------------|----------|---------|--------| +| Przychodzący | TCP, UDP | 53317 | Zezwól | +| Wychodzący | TCP, UDP | każdy | Zezwól | + +Również, upewnij się, że izolacja klientów na Twoim routerze jest wyłączona. Zwykle powinna być ona domyślnie wyłączona, ale niektóre routery mogą mieć ją włączoną (szczególnie sieci gościnne). + +**Tryb przenośny (portable)** + +(Wprowadzony w v1.13.0) + +Stwórz plik o nazwie `settings.json` znajdujący się w tym samym katalogu, co plik wykonywalny. +Plik może być pusty. +Aplikacja będzie używać tego pliku do przechowywania ustawień zamiast domyślnej lokalizacji. + +**Uruchom w zasobniku (w tle)** + +(Zaktualizowano w v1.15.0) + +Aby uruchomić aplikację do zasobnika, użyj flagi `--hidden` (przykład: `localsend_app.exe --hidden`). + +W wersji v1.14.0 i wcześniejszych aplikacja uruchamia się do zasobnika, jeśli ustawiona jest flaga `autostart`, a ustawienie uruchamiania do zasobnika jest włączone. + +## Jak to działa? + +LocalSend korzysta z bezpiecznego protokołu komunikacyjnego, który pozwala urządzeniom komunikować się ze sobą za pomocą interfejsu API REST. Wszystkie dane są bezpiecznie przesyłane przez HTTPS, a certyfikat TLS/SSL jest generowany automatycznie na każdym urządzeniu, gwarantując maksymalne bezpieczeństwo. + +Więcej informacji na temat protokołu LocalSend można znaleźć w [dokumentacji](https://github.com/localsend/protocol). + +## Pierwsze kroki + +Aby skompilować LocalSend z kodu źródłowego, wykonaj następujące czynności: + +1. Zainstaluj Flutter [bezpośrednio](https://flutter.dev) lub używając [fvm](https://fvm.app) (zobacz [wymaganą wersję](.fvmrc)) +2. Sklonuj repozytorium `LocalSend` +3. Wykonaj `cd app`, aby wejść do katalogu `app` +4. Wykonaj `flutter pub get`, aby pobrać zależności +5. Wykonaj `flutter run`, aby uruchomić aplikację + +> [!NOTE] +> LocalSend obecnie wymaga starszej wersji Fluttera (określonej w [.fvmrc](.fvmrc)) +> a tym samym problemy z kompilacją mogą być spowodowane niedopasowaniem wymaganej i zainstalowanej (w obrębie całego systemu) wersji Fluttera. +> Aby uczynić rozwój bardziej spójnym, LocalSend używa [fvm](https://fvm.app) do zarządzania wersją projektu Flutter. +> Po zainstalowaniu `fvm`, wykonaj `fvm flutter` zamiast `flutter`. + +## Wnoszenie wkładu + +Zapraszamy wszystkich tych, którzy chcą pomóc w ulepszaniu LocalSend. Jeśli chcesz wnieść swój wkład, możesz zaangażować się na kilka sposobów: + +### Tłumaczenie + +Możesz pomóc tłumaczyć LocalSend na inne języki! **Rekomendowana metoda**: Używaj platformy [Weblate](https://hosted.weblate.org/projects/localsend/app) do zarządzania tłumaczeniami. + +**Alternatywnie**: Możesz również wnieść wkład rozwidlając to repozytorium i dodając tłumaczenia ręcznie. + +Tłumaczenia znajdują się w katalogu [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n). Edytuj plik `_missing_translations_.json` lub `strings_.i18n.json`, aby dodać lub zaktualizować tłumaczenia. + + +Status tłumaczenia + + +**_Zwróć uwagę:_ Pola oznaczone `@` nie są przeznaczone do tłumaczenia; nie są one używane w aplikacji w żaden sposób, będąc jedynie tekstem informacyjnym o pliku lub w celu nadania kontekstu tłumaczowi.** + +### Poprawki błędów i ulepszenia + +- **Poprawki błędów:** Jeśli znajdziesz błąd, utwórz pull request z jasnym opisem błędu i sposobem jego naprawienia. +- **Ulepszenia:** Masz pomysł, jak ulepszyć LocalSend? Najpierw utwórz problem, aby przedyskutować, dlaczego ulepszenie jest potrzebne. + +Więcej informacji można znaleźć w [przewodniku dla współtwórców](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## Rozwiązywanie problemów + +| Problem | Platforma (Wysyłanie) | Platforma (Odbiór) | Rozwiązanie | +|----------------------|-----------------------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| Urządzenie niewidoczne | Dowolna | Dowolna | Upewnij się, że wyłączono izolację AP na routerze. Jeśli jest włączona, połączenia między urządzeniami są zabronione. | +| Urządzenie niewidoczne | Dowolna | Windows | Upewnij się, że skonfigurowałeś sieć jako sieć "prywatną". Windows może być bardziej restrykcyjny, gdy sieć jest skonfigurowana jako publiczna. | +| Urządzenie niewidoczne | macOS, iOS | Dowolna | Możesz spróbować przełączyć uprawnienie "Sieć lokalna" w "Prywatność" w ustawieniach systemu operacyjnego. | +| Za niska prędkość | Dowolna | Dowolna | Użyj 5 GHz; Wyłącz szyfrowanie na obu urządzeniach | +| Za niska prędkość | Dowolna | Android | Znany problem. https://github.com/flutter-cavalry/saf_stream/issues/4 | + diff --git a/readme_i18n/README_PT_BR.md b/readme_i18n/README_PT_BR.md new file mode 100644 index 0000000..9c20e61 --- /dev/null +++ b/readme_i18n/README_PT_BR.md @@ -0,0 +1,176 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml + +[Homepage][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +O LocalSend é um aplicativo gratuito e de código aberto que permite você compartilhar arquivos e mensagens de maneira segura com dispositivos próximos através da sua rede local sem a necessidade de uma conexão com a internet. + +- [Sobre](#sobre) +- [Capturas de tela](#capturas-de-tela) +- [Instalar](#instalar) +- [Como funciona](#como-funciona) +- [Primeiros passos](#primeiros-passos) +- [Contribuindo](#contribuindo) + - [Tradução](#tradução) + - [Correções de bugs e melhorias](#correções-de-bugs-e-melhorias) +- [Resolução de problemas](#resolução-de-problemas) +- [Compilando](#compilando) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## Sobre + +LocalSend é um aplicativo multiplataforma que permite comunicação segura entre dispositivos usando uma API REST e criptografia HTTPS. Ao contrário de outros aplicativos de mensagens que dependem de servidores externos, o LocalSend não requer uma conexão com a internet ou servidores de terceiros, tornando-o uma solução rápida e confiável para comunicação local. + +## Capturas de tela + +captura de tela do iPhone captura de tela do PC + +## Instalar + +É recomendado baixar o aplicativo de uma loja de aplicativos ou gerenciador de pacotes, pois o aplicativo não possui atualização automática. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +| ------------------------ | ------------------------ | ------------------ | -------------- | ------------- | ---------- | +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [Instalador DMG][latest] | [Snap][] | [APK][latest] | | | +| [Instalador EXE][latest] | | [AUR][] | | | | +| [Arquivo ZIP][latest] | | [Arquivo TAR][latest] | | | | +| | | [Pacote DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +Leia mais sobre [distribution channels][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Compatibilidade** + +| Platforma | Versão Mínima | Nota | +|----------|-----------------|-----------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Use o OpenCore Legacy Patcher 2.0.2 (See [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | A última versão a suportar o Windows 7 é a v1.15.4. Pode haver versões mais recentes adaptadas para o Windows 7 no futuro. | +| Linux | N.A. | - | + +## Configuração + +Na maioria dos casos, o LocalSend deve funcionar automaticamente. No entanto, se você estiver tendo problemas para enviar ou receber arquivos, pode ser necessário configurar seu firewall para permitir que o LocalSend se comunique pela sua rede local. + +| Tipo de tráfego | Protocolo | Porta | Ação | +| --------------- | --------- | -------- | -------- | +| Recebendo | TCP, UDP | 53317 | Permitir | +| Enviando | TCP, UDP | Qualquer | Permitir | + +Lembre-se também de desativar a isolação de AP no seu roteador. Geralmente, ela vem desativada por padrão, mas alguns roteadores podem estar com ela ativada (especialmente em redes públicas). +Veja em [resolução de problemas](#resolucao-de-problemas) para maiores informações. + +**Modo Portátil** + +(Introduzido na versão v1.13.0) + +Crie um arquivo chamado `settings.json` localizado no mesmo diretório que o executável. Este arquivo pode estar vazio. Dessa forma, o aplicativo usará este arquivo para armazenar configurações em vez do local padrão. + +**Modo Portátil** + +(Introduzido na v1.13.0) + +Crie um arquivo chamado `settings.json` localizado no mesmo diretório do executável. +Este arquivo pode estar vazio. +O aplicativo usará este arquivo para armazenar as configurações, em vez do local padrão. + +**Iniciar Minimizado** + +(Atualizado na versão v1.15.0) + +Para iniciar o aplicativo oculto (apenas na bandeja), use a flag `--hidden` (exemplo: `localsend_app.exe --hidden`). + +Na versão v1.14.0 e anteriores, o aplicativo inicia oculto se a flag `autostart` estiver definida e a configuração de ocultação estiver habilitada. + +## Como funciona + +LocalSend utiliza um protocolo de comunicação seguro que permite que dispositivos se comuniquem entre si usando uma API REST. Todos os dados são enviados de forma segura via HTTPS, e o certificado TLS/SSL é gerado dinamicamente em cada dispositivo, garantindo máxima segurança. + +Para mais informações sobre o Protocolo de Comunicação, veja a [documentação](https://github.com/localsend/protocol). + +## Primeiros passos + +Para compilar o LocalSend a partir do código-fonte, siga estes passos: + +1. Instale o Flutter [diretamente](https://flutter.dev) ou usando [fvm](https://fvm.app) (veja [versão necessária](.fvmrc)) +2. Clone o repositório `LocalSend` +3. Execute `cd app` para entrar no diretório do aplicativo +4. Execute `flutter pub get` para baixar as dependências +5. Execute `flutter run` para iniciar o aplicativo + +> [!NOTE] +> Atualmente, o LocalSend requer uma versão mais antiga do Flutter (especificada em [.fvmrc](.fvmrc)) +> e, portanto, problemas de compilação podem ser causados por uma incompatibilidade entre a versão necessária e a versão do Flutter instalada (em todo o sistema). +> Para tornar o desenvolvimento mais consistente, o LocalSend usa o [fvm](https://fvm.app) para gerenciar a versão do Flutter do projeto. +> Após instalar o `fvm`, execute `fvm flutter` em vez de `flutter`. + +## Contribuindo + +Agradecemos as contribuições de todos que estão interessados em ajudar a melhorar o LocalSend. Se você gostaria de contribuir, existem algumas maneiras de se envolver: + +### Tradução + +Você pode ajudar a traduzir o LocalSend para outros idiomas. **Forma recomendada**: Use a plataforma [Weblate](https://hosted.weblate.org/projects/localsend/app) para gerenciar as traduções. + +**Alternativamente**: Você também pode contribuir fazendo um fork deste repositório e adicionando as traduções manualmente. + +As traduções estão localizadas no diretório [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n). Edite o arquivo `_missing_translations_.json` ou `strings_.i18n.json` para adicionar ou atualizar traduções. + + +Status da tradução + + +**_Nota:_ Campos decorados com `@` não devem ser traduzidos; eles não são utilizados no aplicativo de nenhuma forma, sendo apenas texto informativo sobre o arquivo ou para dar contexto ao tradutor.** + +### Correções de bugs e melhorias + +- **Correções de Bugs:** Se você encontrar um bug, por favor, crie um pull request com uma descrição clara do problema e como corrigi-lo. +- **Melhorias:** Tem uma ideia de como melhorar o LocalSend? Por favor, crie uma issue primeiro para discutir por que a melhoria é necessária. + +Para mais informações, consulte o [guia de contribuição](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + + +## Resolução de problemas + +| Problema | Plataforma (Envio) | Plataforma (Recebimento) | Solução | +|--------------------|--------------------|--------------------------|---------------------------------------------------------------------------------------------------------------------------------------| +| Dispositivo não visível | Qualquer | Qualquer | Certifique-se de desativar a Isolação de AP no seu roteador. Se estiver ativada, conexões entre dispositivos são bloqueadas. | +| Dispositivo não visível | Qualquer | Windows | Certifique-se de configurar sua rede como uma rede "privada". O Windows pode ser mais restritivo quando a rede está configurada como pública. | +| Dispositivo não visível | macOS, iOS | Qualquer | Tente alternar a permissão "Rede Local" em "Privacidade" nas configurações do sistema operacional. | +| Velocidade muito lenta | Qualquer | Qualquer | Use 5 Ghz; desative a criptografia em ambos os dispositivos. | +| Velocidade muito lenta | Qualquer | Android | Problema conhecido. https://github.com/flutter-cavalry/saf_stream/issues/4 | + diff --git a/readme_i18n/README_RU.md b/readme_i18n/README_RU.md new file mode 100644 index 0000000..0acd605 --- /dev/null +++ b/readme_i18n/README_RU.md @@ -0,0 +1,173 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] +[![Translations][translate-badge]][translate-link] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml +[translate-badge]: https://hosted.weblate.org/widget/localsend/app/svg-badge.svg +[translate-link]: https://hosted.weblate.org/engage/localsend/ + +[Домашняя страница][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend — это бесплатное приложение с открытым исходным кодом, которое позволяет вам безопасно обмениваться файлами и сообщениями с находящимися поблизости устройствами через локальную сеть, без необходимости подключения к Интернету. + +- [О LocalSend](#о-localsend) +- [Скриншоты](#скриншоты) +- [Скачать](#скачать) +- [Как это работает](#как-это-работает) +- [Начало работы](#начало-работы) +- [Вклад в развитие проекта](#вклад-в-развитие-проекта) + - [Перевод](#перевод) + - [Исправления ошибок и улучшения работы](#исправления-ошибок-и-улучшения-работы) +- [Устранение неисправностей](#устранение-неисправностей) +- [Сборка (построение) приложения](#сборка-построение-приложения) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## О LocalSend + +LocalSend — это кроссплатформенное приложение, которое обеспечивает безопасную связь между устройствами с помощью REST API и HTTPS-шифрования. В отличие от других приложений для обмена сообщениями, которые полагаются на внешние серверы, LocalSend не требует подключения к Интернету или сторонним серверам, что делает его быстрым и надежным решением для локальной связи. + +## Скриншоты + +iPhone screenshot PC screenshot + +## Скачать + +Рекомендуется загружать приложение из магазина приложений или менеджера пакетов, поскольку приложение не имеет автоматического обновления. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +Подробнее о [каналах дистрибуции][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[каналах дистрибуции]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Совместимость** + +| Платформа | Минимальная версия | Примечание | +|-----------|--------------------|--------------------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Используйте OpenCore Legacy Patcher 2.0.2 (См. [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | Последняя версия, поддерживающая Windows 7 — v1.15.4. Возможно, в будущем могут появиться обратные порты новых версий для Windows 7. | +| Linux | Н/Д | - | + +## Настройки + +В большинстве случаев LocalSend должен работать прямо из коробки. Однако, если у вас возникли проблемы с отправкой или получением файлов, возможно, вам придется настроить брандмауэр, чтобы позволить LocalSend взаимодействовать с вашей локальной сетью. + +| Тип трафика | Протокол | Порт | Действие | +|-------------|----------|-------|-----------| +| Входящий | TCP, UDP | 53317 | Разрешить | +| Исходящий | TCP, UDP | Любой | Разрешить | + +Также убедитесь, что на вашем маршрутизаторе отключена изоляция точек доступа. Обычно она отключена по умолчанию, но на некоторых маршрутизаторах она может быть включена (особенно в гостевых сетях). +Для получения дополнительной информации смотрите раздел [устранения неисправностей](#troubleshooting). + +**Портативный режим** + +(Начиная с v1.13.0) + +Создайте файл с именем `settings.json` в той же директории, что и исполняемый файл. +Этот файл может быть пустым. +Приложение будет использовать этот файл для хранения настроек вместо расположения по умолчанию. + +**Запуск в скрытом (фоновом) режиме** + +(Обновлено с v1.15.0) + +Чтобы запустить приложение скрытно (только в трее), используйте флаг `--hidden` (например: `localsend_app.exe --hidden`). + +В версии 1.14.0 и более ранних выпусках программа запускается скрыто, если установлен флаг `--autostart` и включена настройка скрытого запуска. + +## Как это работает + +LocalSend использует безопасный протокол связи, который позволяет устройствам взаимодействовать между собой с помощью REST API. Все данные безопасно передаются через HTTPS протокол, а сертификат TLS/SSL генерируется на лету на каждом устройстве, обеспечивая максимальную безопасность. + +Для получения дополнительной информации о протоколе LocalSend смотрите [документацию](https://github.com/localsend/protocol). + +## Начало работы + +Чтобы скомпилировать LocalSend из исходного кода, выполните следующие действия: + +1. Установите Flutter [напрямую](https://flutter.dev) или с помощью [fvm](https://fvm.app) (см. [необходимую версию](.fvmrc)) +2. Установите [Rust](https://www.rust-lang.org/tools/install) +3. Клонируйте `LocalSend` репозиторий +4. Выполните команду `cd app`, чтобы войти в директорию приложения +5. Выполните команду `flutter pub get`, чтобы загрузить зависимости +6. Выполните команду `flutter run`, чтобы запустить приложения + +> [!NOTE] +> На данный момент LocalSend требует более старой версии Flutter (указанной в [.fvmrc](.fvmrc)), +> поэтому проблемы со сборкой могут возникать из-за несоответствия между необходимой версией и системной (установленной) версией Flutter. +> Чтобы сделать разработку более согласованной, LocalSend использует [fvm](https://fvm.app) для управления версией проекта Flutter. +> После установки `fvm`, запустите `fvm flutter` вместо `flutter`. + +## Вклад в развитие проекта + +Мы приветствуем вклады от всех, кто хочет помочь улучшить LocalSend. Если вы хотите внести вклад, есть несколько способов принять участие: + +### Перевод + +Вы можете помочь перевести LocalSend на другие языки. **Рекомендуемый способ**: Используйте платформу [Weblate](https://hosted.weblate.org/projects/localsend/app) для управления переводами. + +**Альтернативный способ**: Вы также можете внести свой вклад, создав ответвление этого репозитория и добавив переводы вручную. + +Переводы находятся в директории [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n). Отредактируйте файл `_missing_translations_.json` или файл `strings_.i18n.json`, чтобы добавить или обновить переводы. + + +Статус перевода + + +**_Обратите внимание:_ Поля, содержащие `@`, не предназначены для перевода; они никак не используются в приложении, поскольку являются лишь информативным текстом о файле или для предоставления контекста переводчику.** + +### Исправления ошибок и улучшения работы + +- **Исправление ошибок:** Если вы обнаружили ошибку, создайте запрос на вытягивание с четким описанием проблемы и способом ее решения. +- **Улучшение:** Есть идея, как улучшить LocalSend? Пожалуйста, сначала создайте соответствующую тему, чтобы обсудить, почему это улучшение необходимо. + +Для получения дополнительной информации смотрите руководство о [вкладе в развитие проекта](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## Устранение неисправностей + +| Проблема | Платформа (Отправка) | Платформа (Получение) | Решение | +|----------------------------|----------------------|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------| +| Устройство не отображается | Любая | Любая | Убедитесь, что на вашем маршрутизаторе отключена изоляция точек доступа. Если она включена, соединение между устройствами будет запрещено. | +| Устройство не отображается | Любая | Windows | Убедитесь, что ваша сеть настроена как "частная". Windows может накладывать дополнительные ограничения, если сеть настроена как общедоступная. | +| Устройство не отображается | macOS, iOS | Любая | Вы можете попробовать повторно предоставить разрешение для "Локальной сети" в разделе "Конфиденциальность" в настройках ОС. | +| Скорость слишком низкая | Любая | Любая | Используйте Wi-Fi 5 ГГц; Выключите шифрование на обоих устройствах. | +| Скорость слишком низкая | Любая | Android | Известная проблема. https://github.com/flutter-cavalry/saf_stream/issues/4 | + diff --git a/readme_i18n/README_TH.md b/readme_i18n/README_TH.md new file mode 100644 index 0000000..5c986fe --- /dev/null +++ b/readme_i18n/README_TH.md @@ -0,0 +1,152 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml + +[Homepage][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend เป็นแอปที่ช่วยให้การส่งไฟล์ระหว่างอุปกรณ์เป็นไปอย่างปลอดภัยโดยไม่จำเป็นต้องใช้อินเทอร์เน็ต + +- [เกี่ยวกับ](#เกี่ยวกับ) +- [ภาพหน้าจอ](#ภาพหน้าจอ) +- [ดาวน์โหลด](#ดาวน์โหลด) +- [หลักการทำงาน](#หลักการทำงาน) +- [การเริ่มต้น](#การเริ่มต้น) +- [การมีส่วนร่วมพัฒนา](#การมีส่วนร่วมพัฒนา) + - [การแปล](#การแปล) + - [การแก้บัคและพัฒนา](#การแก้บัคและพัฒนา) +- [การสร้างและคอมไพล์แอป](#การสร้างและคอมไพล์แอป) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## เกี่ยวกับ + +LocalSend เป็นแอปข้ามแพลตฟอร์มที่ช่วยให้การสื่อสารระหว่างอุปกรณ์เป็นไปอย่างปลอดภัยโดยใช้ REST API และการเข้ารหัส HTTPS ต่างจากแอปส่งข้อความอื่นๆ ที่ต้องพึ่งพาเซิร์ฟเวอร์ภายนอก LocalSend ไม่ต้องการการเชื่อมต่ออินเทอร์เน็ตหรือเซิร์ฟเวอร์บุคคลที่สาม ทำให้เป็นโซลูชั่นการสื่อสารภายในท้องถิ่นที่รวดเร็วและเชื่อถือได้ + +## ภาพหน้าจอ + +iPhone screenshot PC screenshot + +## ดาวน์โหลด + +ทางเราแนะนำให้ดาวน์โหลดแอปนี้จาก App Store หรือ Package Manager เพราะในตัวแอปไม่มีฟังชั่นอัปเดตอัตโนมัติ + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +อ่านเพิ่มเติมเกี่ยวกับ [distribution channels][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +## การตั่งค่า + +ในกรณีส่วนใหญ่ LocalSend ควรทำงานได้ทันที อย่างไรก็ตาม หากคุณประสบปัญหาในการส่งหรือรับไฟล์ คุณอาจต้องกำหนดค่าไฟร์วอลล์ของคุณเพื่อให้ LocalSend สามารถสื่อสารผ่านเครือข่ายแลนได้ + +| Traffic Type | Protocol | Port | Action | +|--------------|----------|-------|--------| +| Incoming | TCP, UDP | 53317 | Allow | +| Outgoing | TCP, UDP | Any | Allow | + +แนะนำให้ตรวจสอบให้แน่ใจว่าคุณได้ปิด AP isolation บนเราเตอร์ของคุณแล้ว โดยปกติการตั้งค่าดังกล่าวจะถูกปิดเป็นค่าเริ่มต้นอยู่แล้ว แต่บางเราเตอร์บางตัวอาจเปิดใช้งานไว้ + +**โหมดเคลื่อนที่** + +(เพิ่มเข้ามาในเวอร์ชัน v1.13.0) + +สร้างไฟล์ชื่อ `settings.json` ไว้ในโฟล์เดอร์เดียวกับตัวแอป (.exe) +ไฟล์นี้สามารถเป็นไฟล์ว่างเปล่าได้ +ตัวแอปจะทำการเก็บข้อมูลการตั้งค่าไว้ในนี้แทนที่จะไปเก็บยังที่เริ่มต้น + +**เริ่มแอปเป็นไอคอนถาดกราฟิก** + +(อัปเดตในเวอร์ชัน v1.15.0) + +เพื่อเริ่มแอปเป็นไอคอนถาดกราฟิก (เฉพาะไอคอนถาดกราฟิกอย่างเดียว) ใช้คำสั่ง --hidden (ตัวอย่าง: localsend_app.exe --hidden) + +ในเวอร์ชัน v1.14.0 หรือก่อนหน้า ตัวแอปจะเริ่มเป็นไอคอนถาดกราฟิกถ้าใส่ flag `autostart` และเปิดโหมดซ่อน + +## หลักการทำงาน + +LocalSend ใช้โปรโตคอลการสื่อสารที่ปลอดภัยที่ช่วยให้อุปกรณ์สามารถสื่อสารกันโดยใช้ REST API ข้อมูลทั้งหมดจะถูกส่งอย่างปลอดภัยผ่าน HTTPS และใบรับรอง TLS/SSL จะถูกสร้างขึ้นในทันทีบนแต่ละอุปกรณ์เพื่อให้แน่ใจว่ามีความปลอดภัยสูงสุด + +สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโปรโตคอล LocalSend ดูที่ [documentation](https://github.com/localsend/protocol). + +## การเริ่มต้น + +ในการคอมไพล์ LocalSend จากซอร์สโค้ด ให้ทำตามขั้นตอนเหล่านี้: + +1. ติดตั้ง Flutter [โดยตรง](https://flutter.dev) หรือใช้ [fvm](https://fvm.app) (ดู [เวอร์ชันที่ต้องการ](.fvmrc)) +2. โคลน repository ของ `LocalSend` +3. รัน `cd app` เพื่อเข้าไปยังโฟล์เดอร์ของแอป +4. รัน `flutter pub get` เพื่อดาวโหลด dependencies +5. รัน `flutter run` เพื่อเริ่มแอป + +> [!หมายเหตุ] +> LocalSend ยังคงต้องการ Flutter เวอร์ชันเก่าอยู่ (ดูที่ [.fvmrc](.fvmrc)) +> จึงอาจเกิดปัญหาการคอมไพล์ ที่เกิดจากความไม่ตรงกันระหว่างเวอร์ชันที่ต้องการและเวอร์ชัน Flutter ที่ติดตั้งในระบบ +> เพื่อทำให้การพัฒนาเป็นไปอย่างสม่ำเสมอ LocalSend ใช้ [fvm](https://fvm.app) ในการจัดการเวอร์ชัน Flutter ของโปรเจกต์ +> หลังจากติดตั้ง `fvm`, ให้ใช้คำสั่ง `fvm flutter` แทนการใช้ `flutter`. + +## การมีส่วนร่วมพัฒนา + +เรายินดีต้อนรับการมีส่วนร่วมจากทุกคนที่สนใจช่วยปรับปรุง LocalSend หากคุณต้องการมีส่วนร่วม มีหลายวิธีที่คุณสามารถทำได้: + +### การแปล + +คุณสามารถช่วยแปล LocalSend เป็นภาษาอื่นได้! **วิธีที่แนะนำ**: ใช้ platform [Weblate](https://hosted.weblate.org/projects/localsend/app) ในการจัดการการแปล + +**วิธีอื่น**: คุณสามารถช่วยเหลือด้วยการ Fork repository นี้และเพิ่มการแปลด้วยตนเอง + +การแปลอยู่ในไดเรกทอรี [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n) แก้ไขไฟล์ `_missing_translations_.json` หรือ `strings_.i18n.json` เพื่อเพิ่มหรืออัปเดตการแปล + + +สถานะการแปล + + +**_หมายเหตุ:_ ไม่ต้องแปลช่องหรือบรรทัดที่ขึ้นต้นด้วยตัวอักษร `@` เพราะจะไม่ถูกแสดงในแอป ข้อความเหล่านั้นมีไว้เพื่อให้นักพัฒนาเข้าใจโค้ดเท่านั้น.** + +### การแก้บัคและพัฒนา + +- **การแก้บัค:** หากคุณพบข้อบกพร่อง กรุณาสร้าง pull request พร้อมคำอธิบายชัดเจนเกี่ยวกับปัญหาและวิธีการแก้ไข +- **การพัฒนา:** มีไอเดียในการปรับปรุง LocalSend ไหม? กรุณาสร้าง "issue" ก่อนเพื่อพูดคุยว่าทำไมการปรับปรุงนั้นจึงจำเป็น + +สำหรับข้อมูลเพิ่มเติม ดูได้ที่ [contributing guide](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## รายชื่อผู้มีส่วนร่วมพัฒนา + + + Localsend Contributors + diff --git a/readme_i18n/README_TR.md b/readme_i18n/README_TR.md new file mode 100644 index 0000000..690a321 --- /dev/null +++ b/readme_i18n/README_TR.md @@ -0,0 +1,170 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml + +[Ana Sayfa][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend, internet bağlantısına ihtiyaç duymadan, yerel ağ üzerinden yakın cihazlarla güvenli bir şekilde dosya ve mesaj paylaşmanıza olanak tanıyan ücretsiz, açık kaynaklı bir uygulamadır. + +- [Hakkında](#hakkında) +- [Ekran Görüntüleri](#ekran-görüntüleri) +- [İndir](#i̇ndir) +- [Nasıl Çalışır](#nasıl-çalışır) +- [Başlarken](#başlarken) +- [Katkıda Bulunma](#katkıda-bulunma) + - [Çeviri](#çeviri) + - [Hata Düzeltmeleri ve İyileştirmeler](#hata-düzeltmeleri-ve-i̇yileştirmeler) +- [Sorun Giderme](#sorun-giderme) +- [Derleme](#derleme) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) +- [Katkıda Bulunanlar](#katkıda-bulunanlar) + +## Hakkında + +LocalSend, cihazlar arasında güvenli iletişim sağlamak için REST API ve HTTPS şifrelemesi kullanan, çoklu platform desteğine sahip bir uygulamadır. Diğer mesajlaşma uygulamalarının dış sunuculara bağımlı olmasının aksine, LocalSend internet bağlantısına veya üçüncü taraf sunuculara ihtiyaç duymaz; bu da yerel iletişim için hızlı ve güvenilir bir çözüm sunar. + +## Ekran Görüntüleri + +iPhone screenshot PC screenshot + +## İndir + +Uygulamayı, otomatik güncelleme özelliği olmadığı için bir uygulama mağazasından veya bir paket yöneticisinden indirmeniz önerilir. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +| ----------------------- | ----------------------- | ------------------ | -------------- | ------------- | ---------- | +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +Hakkında daha fazla bilgi edinin [distribution channels][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Uyumluluk** + +| Platform | Minimum Sürüm | Not | +| -------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | OpenCore Legacy Patcher 2.0.2 kullanın (Bkz. [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | Windows 7'yi destekleyen son sürüm v1.15.4’tür. Daha yeni sürümler için Windows 7'ye yönelik backport'lar olabilir. | +| Linux | N.A. | - | + +## Kurulum + +Çoğu durumda, LocalSend kutudan çıkar çıkmaz çalışmalıdır. Ancak, dosya gönderme veya alma konusunda sorun yaşıyorsanız, LocalSend'in yerel ağ üzerinden iletişim kurabilmesi için güvenlik duvarınızı yapılandırmanız gerekebilir. + +| Trafik Türü | Protokol | Port | Aksiyon | +| ----------- | -------- | -------- | -------- | +| Gelen | TCP, UDP | 53317 | İzin Ver | +| Giden | TCP, UDP | Herhangi | İzin Ver | + +Ayrıca, yönlendiricinizde AP izolasyonunu devre dışı bıraktığınızdan emin olun. Genellikle varsayılan olarak devre dışı olmalıdır, ancak bazı yönlendiriciler bunu etkinleştirmiş olabilir (özellikle misafir ağlarında). + +**Taşınabilir Mod** + +(v1.13.0 sürümünde tanıtıldı) + +Çalıştırılabilir dosyayla aynı dizinde `settings.json` adında bir dosya oluşturun. +Bu dosya boş olabilir. +Uygulama, ayarları varsayılan konum yerine bu dosyada saklamak için bu dosyayı kullanacaktır. + +**Gizli Başlat** + +(v1.15.0 sürümünde güncellendi) + +Uygulamayı gizli başlatmak için (yalnızca sistem tepsisinde), `--hidden` bayrağını kullanın (örnek: `localsend_app.exe --hidden`). + +v1.14.0 ve önceki sürümlerde, `autostart` bayrağı ayarlandığında ve gizli ayarı etkinleştirildiğinde uygulama gizli başlar. + +## Nasıl Çalışır + +LocalSend, cihazların birbirleriyle iletişim kurmasını sağlayan güvenli bir iletişim protokolü kullanır ve bu iletişim REST API aracılığıyla gerçekleştirilir. Tüm veriler HTTPS üzerinden güvenli bir şekilde iletilir ve her cihazda anlık olarak oluşturulan TLS/SSL sertifikası ile maksimum güvenlik sağlanır. + +LocalSend Protokolü hakkında daha fazla bilgi için [dökümantasyon](https://github.com/localsend/protocol). + +## Başlarken + +LocalSend'i kaynak kodundan derlemek için şu adımları izleyin: + +1. Flutter'ı [doğrudan](https://flutter.dev) veya [fvm](https://fvm.app) kullanarak kurun (gerekli [sürüm](.fvmrc) için bakın.) +2. [Rust'ı](https://www.rust-lang.org/tools/install) yükleyin +3. `LocalSend` reposunu klonlayın. +4. `cd app` komutunu çalıştırarak uygulama dizinine girin. +5. Bağımlılıkları indirmek için `flutter pub get` komutunu çalıştırın +6. Uygulamayı başlatmak için `flutter run` komutunu çalıştırın + +> [!NOT] +> LocalSend, şu anda daha eski bir Flutter sürümünü gerektiriyor(gerekli sürüm [.fvmrc](.fvmrc) dosyasında belirtilmiştir) +> bu nedenle gerekli sürüm ile (sistem genelinde) yüklü olan Flutter sürümü arasındaki uyumsuzluk derleme sorunlarına yol açabilir. +> Geliştirmeyi daha tutarlı hale getirmek için LocalSend, proje Flutter sürümünü yönetmek için [fvm](https://fvm.app) kullanır. +> `fvm`'yi kurduktan sonra, `flutter` yerine `fvm flutter` komutunu çalıştırın. + +## Katkıda Bulunma + +LocalSend'i geliştirmekle ilgilenen herkesten katkı bekliyoruz. Katkıda bulunmak isterseniz, dahil olmanın birkaç yolu vardır: + +### Çeviri + +LocalSend'i diğer dillere çevirmeye yardımcı olabilirsiniz! **Önerilen yöntem**: Çevirileri yönetmek için [Weblate](https://hosted.weblate.org/projects/localsend/app) platformunu kullanın. + +**Alternatif**: Bu depoyu fork'layarak ve çevirileri manuel olarak ekleyerek de katkıda bulunabilirsiniz. + +Çeviriler [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n) dizininde bulunmaktadır. Çeviri eklemek veya güncellemek için `_missing_translations_.json` veya `strings_.i18n.json` dosyasını düzenleyebilirsiniz. + + +Çeviri durumu + + +**_Take note:_ `@` ile süslenmiş alanlar çevrilmek için değildir; bu alanlar uygulamada herhangi bir şekilde kullanılmaz, yalnızca dosya hakkında bilgi veren veya çevirmen için bağlam sağlayan bilgilendirici metinlerdir.** + +### Hata Düzeltmeleri ve İyileştirmeler + +- **Hata Düzeltmeleri:** Bir hata bulursanız, lütfen sorunun ve nasıl düzeltileceğinin açık bir tanımıyla bir pull request oluşturun. +- **İyileştirmeler:** LocalSend'i geliştirmek için bir fikriniz var mı? Lütfen önce neden bu iyileştirmenin gerekli olduğunu tartışmak için bir issue oluşturun. + +Daha fazla bilgi için [katkı sağlama kılavuzuna](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md) bakın. + +## Sorun Giderme + +| Sorun | Platform (Gönderici) | Platform (Alıcı) | Çözüm | +| ---------------- | --------------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| Cihaz görünmüyor | Herhangi bir platform | Herhangi bir platform | Yönlendiricinizde AP-İzolasyonunu devre dışı bıraktığınızdan emin olun. Bu özellik etkinse cihazlar arası bağlantılar engellenir. | +| Cihaz görünmüyor | Herhangi bir platform | Windows | Ağınızı "özel" bir ağ olarak yapılandırdığınızdan emin olun. Windows, ağ "genel" olarak yapılandırıldığında daha kısıtlayıcı olabilir. | +| Cihaz görünmüyor | macOS, iOS | Herhangi bir platform | İşletim sistemi ayarlarında "Gizlilik" altında "Yerel Ağ" iznini açıp kapatmayı deneyebilirsiniz. | +| Hız çok yavaş | Herhangi bir platform | Herhangi bir platform | 5 Ghz kullanın; her iki cihazda da şifrelemeyi devre dışı bırakın. | +| Hız çok yavaş | Herhangi bir platform | Android | Bilinen bir sorun. https://github.com/flutter-cavalry/saf_stream/issues/4 | + diff --git a/readme_i18n/README_UK.md b/readme_i18n/README_UK.md new file mode 100644 index 0000000..75f68e9 --- /dev/null +++ b/readme_i18n/README_UK.md @@ -0,0 +1,178 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] +[![Translations][translate-badge]][translate-link] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml +[translate-badge]: https://hosted.weblate.org/widget/localsend/app/svg-badge.svg +[translate-link]: https://hosted.weblate.org/engage/localsend/ + +[Домашня сторінка][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend — це безплатна програма з відкритим вихідним кодом, яка дозволяє вам безпечно обмінюватися файлами та повідомленнями з пристроями поблизу через локальну мережу, без необхідності підключення до Інтернету. + +- [Про LocalSend](#про-localsend) +- [Скріншоти](#скріншоти) +- [Завантажити](#завантажити) +- [Як це працює](#як-це-працює) +- [Початок роботи](#початок-роботи) +- [Внесок у розвиток проекту](#внесок-у-розвиток-проекту) + - [Переклад](#переклад) + - [Виправлення помилок та покращення роботи](#виправлення-помилок-та-покращення-роботи) +- [Усунення несправностей](#усунення-несправностей) +- [Збірка (побудова) програми](#збірка-побудова-програми) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## Про LocalSend + +LocalSend — це кросплатформна програма, яка забезпечує безпечний зв'язок між пристроями за допомогою REST API та HTTPS-шифрування. На відміну від інших програм для обміну повідомленнями, які покладаються на зовнішні сервери, LocalSend не потребує підключення до Інтернету чи сторонніх серверів, що робить його швидким та надійним рішенням для локального зв'язку. + +## Скріншоти + +iPhone screenshot PC screenshot + +## Завантажити + +Рекомендується завантажувати програму з магазину програм або з менеджера пакетів, оскільки програма не має автоматичного оновлення. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|-------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +Детальніше про [канали дистрибуції][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[канали дистрибуції]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Сумісність** + +| Платформа | Мінімальна версія | Примітка | +|-----------|-------------------|------------------------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Використовуйте OpenCore Legacy Patcher 2.0.2 (Див. [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | Остання версія, що підтримує Windows 7 — v1.15.4. Можливо, в майбутньому можуть з'явитися зворотні порти новіших версій для Windows 7. | +| Linux | Н/Д | - | + +## Налаштування + +У більшості випадків LocalSend має працювати прямо з коробки. Проте, якщо у вас виникли проблеми з надсиланням або отриманням файлів, можливо, вам доведеться налаштувати брандмауер, щоб дозволити LocalSend взаємодіяти з вашою локальною мережею. + +| Тип трафіку | Протокол | Порт | Дія | +|-------------|----------|-----------|-----------| +| Вхідний | TCP, UDP | 53317 | Дозволити | +| Вихідний | TCP, UDP | Будь-який | Дозволити | + +Також переконайтеся, що на вашому маршрутизаторі вимкнено ізоляцію точок доступу. Зазвичай вона вимкнена за замовчуванням, але на деяких маршрутизаторах вона може бути увімкнена (особливо в гостьових мережах). +Для отримання додаткової інформації перегляньте розділ [усунення несправностей](#troubleshooting). + +**Портативний режим** + +(Починаючи з v1.13.0) + +Створіть файл з іменем `settings.json` у тій самій директорії, що й виконуваний файл. +Цей файл може бути порожнім. +Програма використовуватиме цей файл для зберігання налаштувань замість стандартного місця збереження. + +**Запуск у прихованому (фоновому) режимі** + +(Оновлено з v1.15.0) + +Щоб запустити програму приховано (лише в треї), використовуйте прапорець `--hidden` (наприклад: `localsend_app.exe --hidden`). + +У версії 1.14.0 та більш ранніх випусках програма запускається приховано, якщо встановлено прапорець `--autostart` та увімкнено налаштування прихованого запуску. + +## Як це працює + +LocalSend використовує безпечний протокол зв'язку, який дозволяє пристроям взаємодіяти між собою за допомогою REST API. Усі дані безпечно надсилаються через HTTPS протокол, а сертифікат TLS/SSL генерується на льоту на кожному пристрої, забезпечуючи максимальну безпеку. + +Для отримання додаткової інформації про протокол LocalSend перегляньте [документацію](https://github.com/localsend/protocol). + +## Початок роботи + +Щоб скомпілювати LocalSend з вихідного коду, виконайте наступні кроки: + +1. Встановіть Flutter [напряму](https://flutter.dev) або за допомогою [fvm](https://fvm.app) (див. [необхідну версію](.fvmrc)) +2. Встановіть [Rust](https://www.rust-lang.org/tools/install) +3. Клонуйте `LocalSend` репозиторій +4. Виконайте команду `cd app`, щоб увійти в директорію програми +5. Виконайте команду `flutter pub get`, щоб завантажити залежності +6. Виконайте команду `flutter run`, щоб запустити програму + +> [!NOTE] +> Наразі LocalSend потребує старішої версії Flutter (вказаної в [.fvmrc](.fvmrc)), +> тому проблеми зі збіркою можуть виникати через невідповідність між необхідною версією та системною (встановленою) версією Flutter. +> Щоб зробити розробку більш узгодженою, LocalSend використовує [fvm](https://fvm.app) для керування версією проекту Flutter. +> Після встановлення `fvm`, запустіть `fvm flutter` замість `flutter`. + +## Внесок у розвиток проекту + +Ми вітаємо внески від усіх, хто хоче допомогти покращити LocalSend. Якщо ви хочете зробити внесок, є кілька способів долучитися: + +### Переклад + +Ви можете допомогти перекласти LocalSend на інші мови. Ми використовуємо платформу [Weblate](https://hosted.weblate.org/projects/localsend/app) для керування перекладами. + +Крім того, ви також можете зробити свій внесок, розгалуживши цей репозиторій та додавши переклади вручну. + +Переклади знаходяться в директорії [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n). Відредагуйте файл `_missing_translations_.json` або файл `strings_.i18n.json`, щоб додати або оновити переклади. + + +Translation status + + +**_Зверніть увагу:_ Поля, які містять `@`, не призначені для перекладу; вони жодним чином не використовуються в програмі, оскільки є лише інформативним текстом про файл або для надання контексту перекладачу.** + +### Виправлення помилок та покращення роботи + +- **Виправлення помилок:** Якщо ви знайшли помилку, створіть запит на витягування з чітким описом проблеми та способом її вирішення. +- **Покращення:** Маєте ідею, як покращити LocalSend? Будь ласка, спочатку створіть відповідну тему, щоб обговорити, чому це покращення необхідне. + +Для отримання додаткової інформації перегляньте посібник про [внесок у розвиток проекту](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## Усунення несправностей + +| Проблема | Платформа (Надсилання) | Платформа (Отримання) | Рішення | +|----------------------------|------------------------|-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------| +| Пристрій не відображається | Будь-яка | Будь-яка | Переконайтеся, що на вашому маршрутизаторі вимкнено ізоляцію точок доступу. Якщо вона увімкнена, з'єднання між пристроями буде заборонено. | +| Пристрій не відображається | Будь-яка | Windows | Переконайтеся, що ваша мережа налаштована як "приватна". Windows може накладати додаткові обмеження, якщо мережа налаштована як загальнодоступна. | +| Пристрій не відображається | macOS, iOS | Будь-яка | Ви можете спробувати повторно надати дозвіл для "Локальної мережі" в розділі "Конфіденційність" у налаштуваннях ОС. | +| Швидкість занадто низька | Будь-яка | Будь-яка | Використовуйте Wi-Fi 5 ГГц; Вимкніть шифрування на обох пристроях. | +| Швидкість занадто низька | Будь-яка | Android | Відома проблема. https://github.com/flutter-cavalry/saf_stream/issues/4 | + +## Учасники + + + Localsend Contributors + diff --git a/readme_i18n/README_VI.md b/readme_i18n/README_VI.md new file mode 100644 index 0000000..688ef01 --- /dev/null +++ b/readme_i18n/README_VI.md @@ -0,0 +1,171 @@ +# LocalSend + +[![CI status][ci-badge]][ci-workflow] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml + +[Trang chủ][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend là một ứng dụng mã nguồn mở miễn phí cho phép bạn chia sẻ tệp và tin nhắn một cách an toàn với các thiết bị lân cận qua mạng cục bộ mà không cần kết nối Internet. + +- [Giới thiệu](#giới-thiệu) +- [Ảnh chụp màn hình](#ảnh-chụp-màn-hình) +- [Tải xuống](#tải-xuống) +- [Nó hoạt động như thế nào](#nó-hoạt-động-như-thế-nào) +- [Bắt đầu](#bắt-đầu) +- [Đóng góp](#đóng-góp) + - [Dịch thuật](#dịch-thuật) + - [Sửa lỗi và cải tiến](#sửa-lỗi-và-cải-tiến) +- [Xây dựng](#xây-dựng) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## Giới thiệu + +LocalSend là một ứng dụng đa nền tảng cho phép liên lạc an toàn giữa các thiết bị bằng cách sử dụng API REST và mã hóa HTTPS. Không giống như các ứng dụng nhắn tin khác dựa trên máy chủ bên ngoài, LocalSend không yêu cầu kết nối Internet hoặc máy chủ của bên thứ ba, khiến ứng dụng này trở thành giải pháp nhanh chóng và đáng tin cậy cho liên lạc nội bộ. + +## Ảnh chụp màn hình + +iPhone screenshot PC screenshot + +## Tải xuống + +Bạn nên tải xuống ứng dụng từ cửa hàng ứng dụng hoặc từ trình quản lý gói vì ứng dụng không có tính năng tự động cập nhật. + +| Windows | macOS | Linux | Android | iOS | Fire OS | +| ----------------------- | ----------------------- | ------------------ | -------------- | ------------- | ---------- | +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + +Đọc thêm về [distribution channels][]. + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[distribution channels]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**Khả năng tương thích** + +| Nền tảng | Phiên bản tối thiểu | Ghi chú | +|----------|---------------------|-----------------------------------------------------------------------------------------------------------------------------| +| Android | 5.0 | - | +| iOS | 12.0 | - | +| macOS | 11 Big Sur | Sử dụng OpenCore Legacy Patcher 2.0.2 (Xem [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +| Windows | 10 | Phiên bản cuối cùng hỗ trợ Windows 7 là v1.15.4. Có thể có các bản backport của các phiên bản mới hơn cho Windows 7 trong tương lai. | +| Linux | N.A. | Phụ thuộc: Gnome: `xdg-desktop-portal` và `xdg-desktop-portal-gtk`, KDE: `xdg-desktop-portal` và `xdg-desktop-portal-kde` | + +## Cài đặt + +Trong hầu hết các trường hợp, LocalSend sẽ hoạt động tốt. Tuy nhiên, nếu gặp sự cố khi gửi hoặc nhận tệp, bạn có thể cần định cấu hình tường lửa để cho phép LocalSend liên lạc qua mạng cục bộ của mình. + +| Traffic Type | Protocol | Port | Action | +| ------------ | -------- | ----- | ------ | +| Incoming | TCP, UDP | 53317 | Allow | +| Outgoing | TCP, UDP | Any | Allow | + +Đồng thời đảm bảo tắt tính năng cách ly AP trên bộ định tuyến của bạn. Nó thường bị tắt theo mặc định nhưng một số bộ định tuyến có thể đã bật nó (đặc biệt là các mạng khách). + +**Chế độ di động** + +(Được giới thiệu trong v1.13.0) + +Tạo một tập tin có tên `settings.json` nằm trong cùng thư mục với tệp thực thi. +Tập tin này có thể trống. +Ứng dụng sẽ sử dụng tệp này để lưu trữ cài đặt thay vì vị trí mặc định. + +**Bắt đầu ẩn** + +(Cập nhật trong v1.15.0) + +Để khởi động ứng dụng ẩn (chỉ trong khay), hãy sử dụng cờ `--hidden` (ví dụ: `localsend_app.exe --hidden`). + +Trên v1.14.0 trở về trước, ứng dụng sẽ bắt đầu ẩn nếu cờ `autostart` được đặt và cài đặt ẩn được bật. + +## Nó hoạt động như thế nào + +LocalSend sử dụng giao thức liên lạc an toàn cho phép các thiết bị liên lạc với nhau bằng API REST. Tất cả dữ liệu được gửi an toàn qua HTTPS và chứng chỉ TLS/SSL được tạo nhanh chóng trên mỗi thiết bị, đảm bảo tính bảo mật tối đa. + +Để biết thêm thông tin về Giao thức LocalSend, hãy xem phần [tài liệu](https://github.com/localsend/protocol). + +## Bắt đầu + +Để biên dịch LocalSend từ mã nguồn, hãy làm theo các bước sau: + +1. Cài đặt Flutter [trực tiếp](https://flutter.dev)hoặc sử dụng [fvm](https://fvm.app) (xem [phiên bản cần thiết](.fvmrc)) +2. Sao chép `LocalSend` kho lưu trữ +3. Chạy `cd app` để vào thư mục ứng dụng +4. Chạy `flutter pub get` để tải xuống các phần phụ thuộc +5. Chạy `flutter run` để khởi động ứng dụng + +> [!GHI CHÚ] LocalSend hiện yêu cầu phiên bản Flutter cũ hơn (được chỉ định trong [.fvmrc](.fvmrc)) +> và do đó, các sự cố xây dựng có thể xảy ra do sự không khớp giữa phiên bản Flutter được cài đặt và yêu cầu (toàn hệ thống). +> Để phát triển nhất quán hơn, LocalSend sử dụng [fvm](https://fvm.app)để quản lý phiên bản Flutter của dự án. +> Sau khi cài đặt `fvm`, chạy `fvm flutter` thay vì `flutter`. + +## Đóng góp + +Chúng tôi hoan nghênh sự đóng góp từ bất kỳ ai quan tâm đến việc giúp cải thiện LocalSend. Nếu bạn muốn đóng góp, có một số cách để tham gia: + +### Dịch thuật + +Bạn có thể giúp dịch LocalSend sang các ngôn ngữ khác! **Cách được khuyến nghị**: Sử dụng platform [Weblate](https://hosted.weblate.org/projects/localsend/app) để quản lý bản dịch. + +**Cách khác**: Bạn cũng có thể đóng góp bằng cách fork repository này và thêm bản dịch theo cách thủ công. + +Bản dịch nằm trong thư mục [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n). Chỉnh sửa tệp `_missing_translations_.json` hoặc `strings_.i18n.json` để thêm hoặc cập nhật bản dịch. + + +Trạng thái dịch + + +**_Hãy lưu ý:_ Phần bắt đầu bằng `@` không có nghĩa là cần được dịch; chúng không được sử dụng trong ứng dụng dưới bất kỳ hình thức nào mà chỉ đơn thuần là văn bản cung cấp thông tin về tệp hoặc cung cấp ngữ cảnh cho người dịch.** + +### Sửa lỗi và cải tiến + +- **Sửa lỗi:** Nếu bạn tìm thấy lỗi, vui lòng tạo yêu cầu kéo với mô tả rõ ràng về sự cố và cách khắc phục. +- **Cải tiến:** Bạn có ý tưởng về cách cải thiện LocalSend? Vui lòng tạo một vấn đề trước để thảo luận lý do tại sao cần cải thiện. + +Để biết thêm thông tin, xem [hướng dẫn đóng góp](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md). + +## Khắc phục sự cố + +| Vấn đề | Nền tảng (Gửi) | Nền tảng (Nhận) | Giải pháp | +|--------------------|----------------|-----------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| Thiết bị không hiển thị | Bất kỳ | Bất kỳ | Hãy chắc chắn tắt AP-Isolation trên bộ định tuyến của bạn. Nếu nó được bật, các kết nối giữa các thiết bị bị cấm. | +| Thiết bị không hiển thị | Bất kỳ | Windows | Hãy chắc chắn cấu hình mạng của bạn là mạng "riêng tư". Windows có thể hạn chế hơn khi mạng được cấu hình là công khai. | +| Thiết bị không hiển thị | macOS, iOS | Bất kỳ | Bạn có thể thử chuyển đổi quyền "Mạng cục bộ" trong "Quyền riêng tư" trong cài đặt hệ điều hành. | +| Tốc độ quá chậm | Bất kỳ | Bất kỳ | Sử dụng 5 GHz; Tắt mã hóa trên cả hai thiết bị | +| Tốc độ quá chậm | Bất kỳ | Android | Vấn đề đã biết. https://github.com/flutter-cavalry/saf_stream/issues/4 | + +## Contributors + + + Localsend Contributors + diff --git a/readme_i18n/README_ZH.md b/readme_i18n/README_ZH.md new file mode 100644 index 0000000..4f1b806 --- /dev/null +++ b/readme_i18n/README_ZH.md @@ -0,0 +1,183 @@ +# LocalSend + +[![CI 状态][ci-badge]][ci-workflow] +[![Translations][translate-badge]][translate-link] +[![Packaging status][packaging-badge]][packaging-link] + +[ci-badge]: https://github.com/localsend/localsend/actions/workflows/ci.yml/badge.svg +[ci-workflow]: https://github.com/localsend/localsend/actions/workflows/ci.yml +[translate-badge]: https://hosted.weblate.org/widget/localsend/app/svg-badge.svg +[translate-link]: https://hosted.weblate.org/engage/localsend/ +[packaging-badge]: https://repology.org/badge/tiny-repos/localsend.svg +[packaging-link]: https://repology.org/project/localsend/versions + +[主页][homepage] • [Discord][discord] • [GitHub][github] • [Codeberg][codeberg] + +[English (Default)](/README.md) • [Español](README_ES.md) • [فارسی](README_FA.md) • [Filipino](README_PH.md) • [Français](README_FR.md) • [Indonesia](README_ID.md) • [Italiano](README_IT.md) • [日本語](README_JA.md) • [ភាសាខ្មែរ](README_KM.md) • [한국어](README_KO.md) • [Polski](README_PL.md) • [Português Brasil](README_PT_BR.md) • [Русский](README_RU.md) • [ภาษาไทย](README_TH.md) • [Turkish](README_TR.md) • [Українська](README_UK.md) • [Tiếng Việt](README_VI.md) • [中文](README_ZH.md) + +> 注意:中文文档更新可能不够及时,请以英文文档为准。 + +[homepage]: https://localsend.org +[discord]: https://discord.gg/GSRWmQNP87 +[github]: https://github.com/localsend/localsend +[codeberg]: https://codeberg.org/localsend/localsend + +LocalSend 是一个自由、开源的应用程序,允许你在本地网络上安全地与附近设备分享文件和消息,无需互联网连接。 + +- [关于](#关于) +- [截图](#截图) +- [下载](#下载) +- [工作原理](#工作原理) +- [开始使用](#开始使用) +- [贡献](#贡献) + - [翻译](#翻译) + - [Bug修复和改进](#bug修复和改进) +- [故障排查](#故障排查) +- [构建](#构建) + - [Android](#android) + - [iOS](#ios) + - [macOS](#macos) + - [Windows](#windows) + - [Linux](#linux) + +## 关于 + +LocalSend 是一个跨平台应用程序,使用 REST API 和 HTTPS 加密实现设备之间的安全通信。与依赖外部服务器的其他消息应用程序不同,LocalSend 不需要互联网连接或第三方服务器,因此成为本地通信的快速可靠解决方案。 + +## 截图 + +iPhone截图 PC截图 + +## 下载 + +建议从应用商店或软件包管理器下载该应用,因为该应用没有自动更新功能。 + +| Windows | macOS | Linux | Android | iOS | Fire OS | +|--------------------------|-------------------------|--------------------|----------------|---------------|------------| +| [Winget][] | [App Store][] | [Flathub][] | [Play Store][] | [App Store][] | [Amazon][] | +| [Scoop][] | [Homebrew][] | [Nixpkgs][] | [F-Droid][] | | | +| [Chocolatey][] | [DMG Installer][latest] | [Snap][] | [APK][latest] | | | +| [EXE Installer][latest] | | [AUR][] | | | | +| [Portable ZIP][latest] | | [TAR][latest] | | | | +| | | [DEB][latest] | | | | +| | | [AppImage][latest] | | | | + + +了解更多关于[发行渠道][]的信息。 + +[windows store]: https://www.microsoft.com/store/apps/9NCB4Z0TZ6RR +[app store]: https://apps.apple.com/us/app/localsend/id1661733229 +[play store]: https://play.google.com/store/apps/details?id=org.localsend.localsend_app +[f-droid]: https://f-droid.org/packages/org.localsend.localsend_app +[amazon]: https://www.amazon.com/dp/B0BW6MP732 +[winget]: https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LocalSend/LocalSend +[scoop]: https://scoop.sh/#/apps?s=0&d=1&o=true&q=localsend&id=fb88113be361ca32c0dcac423cb4afdeda0b0c66 +[chocolatey]: https://community.chocolatey.org/packages/localsend +[homebrew]: https://formulae.brew.sh/cask/localsend +[flathub]: https://flathub.org/apps/details/org.localsend.localsend_app +[nixpkgs]: https://search.nixos.org/packages?show=localsend +[snap]: https://snapcraft.io/localsend +[aur]: https://aur.archlinux.org/packages/localsend-bin +[latest]: https://github.com/localsend/localsend/releases/latest +[发行渠道]: https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md#distribution + +**兼容性** +| 平台 | 最低版本 | 备注 | +|---------|------------|--------------------------------------------------------------------------------------------------------------------------------| +|Android | 5.0 | - | +|iOS | 12.0 | - | +|macOS | 11 Big Sur | 请使用 OpenCore Legacy Patcher 2.0.2 (见 [#1005](https://github.com/localsend/localsend/issues/1005#issuecomment-2449899384)) | +|Windows | 10 | 最后一个支持 Windows 7 的版本是 v1.15.4 。未来也许会将更新的版本向后移植至兼容 Windows 7 。 | +|Linux | 不适用 | - | + +## 设置 + +在大多数情况下,LocalSend 应该可以直接使用。但是,如果你在发送或接收文件时遇到问题,可能需要配置防火墙以允许 LocalSend 在你的本地网络上通信。 + +| 流量类型 | 协议 | 端口 | 操作 | +|----------|----------|-------|------| +| 传入 | TCP, UDP | 53317 | 允许 | +| 传出 | TCP, UDP | 任意 | 允许 | + +另外,请确保禁用路由器上的 AP 隔离。通常默认情况下应禁用它,但某些路由器可能会启用它(比如访客网络)。 +更多信息见 [故障排查](#故障排查)。 + +**便携模式** + +(在 v1.13.0 中引入) + +创建一个名为 `settings.json` 的文件,放置在与可执行文件相同的目录中。 +此文件可以为空。 +应用程序将使用此文件来存储设置,而不是默认位置。 + +**隐藏式启动** + +(更新于 v1.15.0) + +使用 `--hidden` 命令行参数隐藏式启动(只在系统托盘里显示)此应用(例如: `localsend_app.exe --hidden`)。 + +在 v1.14.0 或更早的版本中,如果设置了 `autostart` 标志,并且启用了隐藏设置,则应用程序将会隐藏式启动。 + +## 工作原理 + +LocalSend 使用安全通信协议,允许设备通过 REST API 进行通信。所有数据都通过 HTTPS 安全地发送,并且 TLS/SSL 证书会在每台设备上动态生成,确保最大的安全性。 + +欲了解更多关于 LocalSend 协议的信息,请参阅[文档](https://github.com/localsend/protocol)。 + +## 开始使用 + +要从源代码编译 LocalSend,请按照以下步骤进行操作: + +1. 安装 [Flutter](https://flutter.dev)。 +2. 安装 [Rust](https://www.rust-lang.org/tools/install)。 +3. 克隆 `LocalSend` 代码库。 +4. 执行 `cd app` 进入 app 目录。 +5. 运行 `flutter pub get` 下载依赖项。 +6. 运行 `flutter run` 启动应用程序。 + +> [!NOTE] +> LocalSend 目前需要老版本的 Flutter (具体见 [.fvmrc](/.fvmrc)) +> 因而一些构建问题也许是系统安装的 Flutter 版本和 LocalSend 所需的 Flutter 版本不一致导致的。 +> 为了在开发过程中保持一致性,LocalSend 使用 [fvm](https://fvm.app) 来管理此项目的 Flutter 版本。 +> 安装 `fvm` 后,请运行 `fvm flutter` 而非 `flutter` 。 + +## 贡献 + +我们欢迎任何有兴趣帮助改进 LocalSend 的人士贡献。如果你想贡献,有几种方式可以参与: + +### 翻译 + +你可以帮助将此应用程序翻译成其他语言。我们使用 [Weblate](https://hosted.weblate.org/projects/localsend/app) 平台来管理翻译。 + +另外,你也可以 fork 这个仓库并手动添加翻译。 + +翻译在 [app/assets/i18n](https://github.com/localsend/localsend/tree/main/app/assets/i18n) 目录。编辑 `_missing_translations_.json` 或 `strings_.i18n.json` 文件来添加或更新翻译。 + + +Translation status + + +**_注意:_ 用 `@` 装饰的字段不是用于翻译的;它们在应用程序中没有任何用处,仅仅是关于文件的信息性文本或为翻译者提供上下文。** + +### Bug 修复和改进 + +- **Bug 修复:** 如果发现 bug,请创建一个带有清晰描述问题及解决方法的拉取请求。 +- **改进:** 有改进 LocalSend 的想法吗?请先创建一个问题来讨论为什么需要这个改进。 + +欲了解更多信息,请参阅[贡献指南](https://github.com/localsend/localsend/blob/main/CONTRIBUTING.md)。 + +## 故障排查 + +| 问题 | 平台(发送端) | 平台(接收端) | 解决办法 +|------------|---------------|-----------------|----------------------------------------------------------------------------| +| 设备不可见 | 任何 | 任何 | 确保关闭路由器的AP隔离。如果AP隔离是开着的,设备间的连接会被禁止。 | +| 设备不可见 | 任何 | Windows | 确保将你的网络配置为“私有”网络。当你的网络为公共网络时 Windows 会更具限制性。 | +| 设备不可见 | macOS, iOS | 任何 | 尝试在系统设置中的“隐私”下切换“本地网络”权限。 | +| 速度太慢 | 任何 | 任何 | 使用 5 Ghz 频段;关闭发送和接收端设备的数据加密。 | +| 速度太慢 | 任何 | 安卓 | 已知的问题。见 https://github.com/flutter-cavalry/saf_stream/issues/4 | + +## 贡献者 + + + Localsend 贡献者 + diff --git a/scripts/Languages/ChineseSimplified.isl b/scripts/Languages/ChineseSimplified.isl new file mode 100644 index 0000000..66e8481 --- /dev/null +++ b/scripts/Languages/ChineseSimplified.isl @@ -0,0 +1,403 @@ +; *** Inno Setup version 6.4.0+ Chinese Simplified messages *** +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). +; +; Maintained by Zhenghan Yang +; Email: 847320916@QQ.com +; Translation based on network resource +; The latest Translation is on https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation +; + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=简体中文 +; If Language Name display incorrect, uncomment next line +; LanguageName=<7B80><4F53><4E2D><6587> +; About LanguageID, to reference link: +; https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c +LanguageID=$0804 +; About CodePage, to reference link: +; https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers +LanguageCodePage=936 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** 应用程序标题 +SetupAppTitle=安装 +SetupWindowTitle=安装 - %1 +UninstallAppTitle=卸载 +UninstallAppFullTitle=%1 卸载 + +; *** Misc. common +InformationTitle=信息 +ConfirmTitle=确认 +ErrorTitle=错误 + +; *** SetupLdr messages +SetupLdrStartupMessage=现在将安装 %1。您想要继续吗? +LdrCannotCreateTemp=无法创建临时文件。安装程序已中止 +LdrCannotExecTemp=无法执行临时目录中的文件。安装程序已中止 +HelpTextNote= + +; *** 启动错误消息 +LastErrorMessage=%1。%n%n错误 %2: %3 +SetupFileMissing=安装目录中缺少文件 %1。请修正这个问题或者获取程序的新副本。 +SetupFileCorrupt=安装文件已损坏。请获取程序的新副本。 +SetupFileCorruptOrWrongVer=安装文件已损坏,或是与这个安装程序的版本不兼容。请修正这个问题或获取新的程序副本。 +InvalidParameter=无效的命令行参数:%n%n%1 +SetupAlreadyRunning=安装程序正在运行。 +WindowsVersionNotSupported=此程序不支持当前计算机运行的 Windows 版本。 +WindowsServicePackRequired=此程序需要 %1 服务包 %2 或更高版本。 +NotOnThisPlatform=此程序不能在 %1 上运行。 +OnlyOnThisPlatform=此程序只能在 %1 上运行。 +OnlyOnTheseArchitectures=此程序只能安装到为下列处理器架构设计的 Windows 版本中:%n%n%1 +WinVersionTooLowError=此程序需要 %1 版本 %2 或更高。 +WinVersionTooHighError=此程序不能安装于 %1 版本 %2 或更高。 +AdminPrivilegesRequired=在安装此程序时您必须以管理员身份登录。 +PowerUserPrivilegesRequired=在安装此程序时您必须以管理员身份或有权限的用户组身份登录。 +SetupAppRunningError=安装程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序,然后点击“确定”继续,或点击“取消”退出。 +UninstallAppRunningError=卸载程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序,然后点击“确定”继续,或点击“取消”退出。 + +; *** 启动问题 +PrivilegesRequiredOverrideTitle=选择安装程序模式 +PrivilegesRequiredOverrideInstruction=选择安装模式 +PrivilegesRequiredOverrideText1=%1 可以为所有用户安装(需要管理员权限),或仅为您安装。 +PrivilegesRequiredOverrideText2=%1 只能为您安装,或为所有用户安装(需要管理员权限)。 +PrivilegesRequiredOverrideAllUsers=为所有用户安装(&A) +PrivilegesRequiredOverrideAllUsersRecommended=为所有用户安装(&A) (建议选项) +PrivilegesRequiredOverrideCurrentUser=只为我安装(&M) +PrivilegesRequiredOverrideCurrentUserRecommended=只为我安装(&M) (建议选项) + +; *** 其他错误 +ErrorCreatingDir=安装程序无法创建目录“%1” +ErrorTooManyFilesInDir=无法在目录“%1”中创建文件,因为里面包含太多文件 + +; *** 安装程序公共消息 +ExitSetupTitle=退出安装程序 +ExitSetupMessage=安装程序尚未完成。如果现在退出,将不会安装该程序。%n%n您之后可以再次运行安装程序完成安装。%n%n现在退出安装程序吗? +AboutSetupMenuItem=关于安装程序(&A)... +AboutSetupTitle=关于安装程序 +AboutSetupMessage=%1 版本 %2%n%3%n%n%1 主页:%n%4 +AboutSetupNote= +TranslatorNote=简体中文翻译由Kira(847320916@qq.com)维护。项目地址:https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation + +; *** 按钮 +ButtonBack=< 上一步(&B) +ButtonNext=下一步(&N) > +ButtonInstall=安装(&I) +ButtonOK=确定 +ButtonCancel=取消 +ButtonYes=是(&Y) +ButtonYesToAll=全是(&A) +ButtonNo=否(&N) +ButtonNoToAll=全否(&O) +ButtonFinish=完成(&F) +ButtonBrowse=浏览(&B)... +ButtonWizardBrowse=浏览(&R)... +ButtonNewFolder=新建文件夹(&M) + +; *** “选择语言”对话框消息 +SelectLanguageTitle=选择安装语言 +SelectLanguageLabel=选择安装时使用的语言。 + +; *** 公共向导文字 +ClickNext=点击“下一步”继续,或点击“取消”退出安装程序。 +BeveledLabel= +BrowseDialogTitle=浏览文件夹 +BrowseDialogLabel=在下面的列表中选择一个文件夹,然后点击“确定”。 +NewFolderName=新建文件夹 + +; *** “欢迎”向导页 +WelcomeLabel1=欢迎使用 [name] 安装向导 +WelcomeLabel2=现在将安装 [name/ver] 到您的电脑中。%n%n建议您在继续安装前关闭所有其他应用程序。 + +; *** “密码”向导页 +WizardPassword=密码 +PasswordLabel1=这个安装程序有密码保护。 +PasswordLabel3=请输入密码,然后点击“下一步”继续。密码区分大小写。 +PasswordEditLabel=密码(&P): +IncorrectPassword=您输入的密码不正确,请重新输入。 + +; *** “许可协议”向导页 +WizardLicense=许可协议 +LicenseLabel=请在继续安装前阅读以下重要信息。 +LicenseLabel3=请仔细阅读下列许可协议。在继续安装前您必须同意这些协议条款。 +LicenseAccepted=我同意此协议(&A) +LicenseNotAccepted=我不同意此协议(&D) + +; *** “信息”向导页 +WizardInfoBefore=信息 +InfoBeforeLabel=请在继续安装前阅读以下重要信息。 +InfoBeforeClickLabel=准备好继续安装后,点击“下一步”。 +WizardInfoAfter=信息 +InfoAfterLabel=请在继续安装前阅读以下重要信息。 +InfoAfterClickLabel=准备好继续安装后,点击“下一步”。 + +; *** “用户信息”向导页 +WizardUserInfo=用户信息 +UserInfoDesc=请输入您的信息。 +UserInfoName=用户名(&U): +UserInfoOrg=组织(&O): +UserInfoSerial=序列号(&S): +UserInfoNameRequired=您必须输入用户名。 + +; *** “选择目标目录”向导页 +WizardSelectDir=选择目标位置 +SelectDirDesc=您想将 [name] 安装在哪里? +SelectDirLabel3=安装程序将安装 [name] 到下面的文件夹中。 +SelectDirBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。 +DiskSpaceGBLabel=至少需要有 [gb] GB 的可用磁盘空间。 +DiskSpaceMBLabel=至少需要有 [mb] MB 的可用磁盘空间。 +CannotInstallToNetworkDrive=安装程序无法安装到一个网络驱动器。 +CannotInstallToUNCPath=安装程序无法安装到一个 UNC 路径。 +InvalidPath=您必须输入一个带驱动器卷标的完整路径,例如:%n%nC:\APP%n%n或UNC路径:%n%n\\server\share +InvalidDrive=您选定的驱动器或 UNC 共享不存在或不能访问。请选择其他位置。 +DiskSpaceWarningTitle=磁盘空间不足 +DiskSpaceWarning=安装程序至少需要 %1 KB 的可用空间才能安装,但选定驱动器只有 %2 KB 的可用空间。%n%n您一定要继续吗? +DirNameTooLong=文件夹名称或路径太长。 +InvalidDirName=文件夹名称无效。 +BadDirName32=文件夹名称不能包含下列任何字符:%n%n%1 +DirExistsTitle=文件夹已存在 +DirExists=文件夹:%n%n%1%n%n已经存在。您一定要安装到这个文件夹中吗? +DirDoesntExistTitle=文件夹不存在 +DirDoesntExist=文件夹:%n%n%1%n%n不存在。您想要创建此文件夹吗? + +; *** “选择组件”向导页 +WizardSelectComponents=选择组件 +SelectComponentsDesc=您想安装哪些程序组件? +SelectComponentsLabel2=选中您想安装的组件;取消您不想安装的组件。然后点击“下一步”继续。 +FullInstallation=完全安装 +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=简洁安装 +CustomInstallation=自定义安装 +NoUninstallWarningTitle=组件已存在 +NoUninstallWarning=安装程序检测到下列组件已安装在您的电脑中:%n%n%1%n%n取消选中这些组件不会卸载它们。%n%n确定要继续吗? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=当前选择的组件需要至少 [gb] GB 的磁盘空间。 +ComponentsDiskSpaceMBLabel=当前选择的组件需要至少 [mb] MB 的磁盘空间。 + +; *** “选择附加任务”向导页 +WizardSelectTasks=选择附加任务 +SelectTasksDesc=您想要安装程序执行哪些附加任务? +SelectTasksLabel2=选择您想要安装程序在安装 [name] 时执行的附加任务,然后点击“下一步”。 + +; *** “选择开始菜单文件夹”向导页 +WizardSelectProgramGroup=选择开始菜单文件夹 +SelectStartMenuFolderDesc=安装程序应该在哪里放置程序的快捷方式? +SelectStartMenuFolderLabel3=安装程序将在下列“开始”菜单文件夹中创建程序的快捷方式。 +SelectStartMenuFolderBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。 +MustEnterGroupName=您必须输入一个文件夹名。 +GroupNameTooLong=文件夹名或路径太长。 +InvalidGroupName=无效的文件夹名字。 +BadGroupName=文件夹名不能包含下列任何字符:%n%n%1 +NoProgramGroupCheck2=不创建开始菜单文件夹(&D) + +; *** “准备安装”向导页 +WizardReady=准备安装 +ReadyLabel1=安装程序准备就绪,现在可以开始安装 [name] 到您的电脑。 +ReadyLabel2a=点击“安装”继续此安装程序。如果您想重新考虑或修改任何设置,点击“上一步”。 +ReadyLabel2b=点击“安装”继续此安装程序。 +ReadyMemoUserInfo=用户信息: +ReadyMemoDir=目标位置: +ReadyMemoType=安装类型: +ReadyMemoComponents=已选择组件: +ReadyMemoGroup=开始菜单文件夹: +ReadyMemoTasks=附加任务: + +; *** TExtractionWizardPage wizard page and Extract7ZipArchive +ExtractionLabel=正在提取附加文件... +ButtonStopExtraction=停止提取(&S) +StopExtraction=您确定要停止提取吗? +ErrorExtractionAborted=提取已中止 +ErrorExtractionFailed=提取失败:%1 + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=正在下载附加文件... +ButtonStopDownload=停止下载(&S) +StopDownload=您确定要停止下载吗? +ErrorDownloadAborted=下载已中止 +ErrorDownloadFailed=下载失败:%1 %2 +ErrorDownloadSizeFailed=获取下载大小失败:%1 %2 +ErrorFileHash1=校验文件哈希失败:%1 +ErrorFileHash2=无效的文件哈希:预期 %1,实际 %2 +ErrorProgress=无效的进度:%1 / %2 +ErrorFileSize=文件大小错误:预期 %1,实际 %2 + +; *** “正在准备安装”向导页 +WizardPreparing=正在准备安装 +PreparingDesc=安装程序正在准备安装 [name] 到您的电脑。 +PreviousInstallNotCompleted=先前的程序安装或卸载未完成,您需要重启您的电脑以完成。%n%n在重启电脑后,再次运行安装程序以完成 [name] 的安装。 +CannotContinue=安装程序不能继续。请点击“取消”退出。 +ApplicationsFound=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。 +ApplicationsFound2=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。安装完成后,安装程序将尝试重新启动这些应用程序。 +CloseApplications=自动关闭应用程序(&A) +DontCloseApplications=不要关闭应用程序(&D) +ErrorCloseApplications=安装程序无法自动关闭所有应用程序。建议您在继续之前,关闭所有在使用需要由安装程序更新的文件的应用程序。 +PrepareToInstallNeedsRestart=安装程序必须重启您的计算机。计算机重启后,请再次运行安装程序以完成 [name] 的安装。%n%n是否立即重新启动? + +; *** “正在安装”向导页 +WizardInstalling=正在安装 +InstallingLabel=安装程序正在安装 [name] 到您的电脑,请稍候。 + +; *** “安装完成”向导页 +FinishedHeadingLabel=[name] 安装完成 +FinishedLabelNoIcons=安装程序已在您的电脑中安装了 [name]。 +FinishedLabel=安装程序已在您的电脑中安装了 [name]。您可以通过已安装的快捷方式运行此应用程序。 +ClickFinish=点击“完成”退出安装程序。 +FinishedRestartLabel=为完成 [name] 的安装,安装程序必须重新启动您的电脑。要立即重启吗? +FinishedRestartMessage=为完成 [name] 的安装,安装程序必须重新启动您的电脑。%n%n要立即重启吗? +ShowReadmeCheck=是,我想查阅自述文件 +YesRadio=是,立即重启电脑(&Y) +NoRadio=否,稍后重启电脑(&N) +; used for example as 'Run MyProg.exe' +RunEntryExec=运行 %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=查阅 %1 + +; *** “安装程序需要下一张磁盘”提示 +ChangeDiskTitle=安装程序需要下一张磁盘 +SelectDiskLabel2=请插入磁盘 %1 并点击“确定”。%n%n如果这个磁盘中的文件可以在下列文件夹之外的文件夹中找到,请输入正确的路径或点击“浏览”。 +PathLabel=路径(&P): +FileNotInDir2=“%2”中找不到文件“%1”。请插入正确的磁盘或选择其他文件夹。 +SelectDirectoryLabel=请指定下一张磁盘的位置。 + +; *** 安装状态消息 +SetupAborted=安装程序未完成安装。%n%n请修正这个问题并重新运行安装程序。 +AbortRetryIgnoreSelectAction=选择操作 +AbortRetryIgnoreRetry=重试(&T) +AbortRetryIgnoreIgnore=忽略错误并继续(&I) +AbortRetryIgnoreCancel=关闭安装程序 + +; *** 安装状态消息 +StatusClosingApplications=正在关闭应用程序... +StatusCreateDirs=正在创建目录... +StatusExtractFiles=正在解压缩文件... +StatusCreateIcons=正在创建快捷方式... +StatusCreateIniEntries=正在创建 INI 条目... +StatusCreateRegistryEntries=正在创建注册表条目... +StatusRegisterFiles=正在注册文件... +StatusSavingUninstall=正在保存卸载信息... +StatusRunProgram=正在完成安装... +StatusRestartingApplications=正在重启应用程序... +StatusRollback=正在撤销更改... + +; *** 其他错误 +ErrorInternal2=内部错误:%1 +ErrorFunctionFailedNoCode=%1 失败 +ErrorFunctionFailed=%1 失败;错误代码 %2 +ErrorFunctionFailedWithMessage=%1 失败;错误代码 %2.%n%3 +ErrorExecutingProgram=无法执行文件:%n%1 + +; *** 注册表错误 +ErrorRegOpenKey=打开注册表项时出错:%n%1\%2 +ErrorRegCreateKey=创建注册表项时出错:%n%1\%2 +ErrorRegWriteKey=写入注册表项时出错:%n%1\%2 + +; *** INI 错误 +ErrorIniEntry=在文件“%1”中创建 INI 条目时出错。 + +; *** 文件复制错误 +FileAbortRetryIgnoreSkipNotRecommended=跳过此文件(&S) (不推荐) +FileAbortRetryIgnoreIgnoreNotRecommended=忽略错误并继续(&I) (不推荐) +SourceIsCorrupted=源文件已损坏 +SourceDoesntExist=源文件“%1”不存在 +ExistingFileReadOnly2=无法替换现有文件,它是只读的。 +ExistingFileReadOnlyRetry=移除只读属性并重试(&R) +ExistingFileReadOnlyKeepExisting=保留现有文件(&K) +ErrorReadingExistingDest=尝试读取现有文件时出错: +FileExistsSelectAction=选择操作 +FileExists2=文件已经存在。 +FileExistsOverwriteExisting=覆盖已存在的文件(&O) +FileExistsKeepExisting=保留现有的文件(&K) +FileExistsOverwriteOrKeepAll=为所有冲突文件执行此操作(&D) +ExistingFileNewerSelectAction=选择操作 +ExistingFileNewer2=现有的文件比安装程序将要安装的文件还要新。 +ExistingFileNewerOverwriteExisting=覆盖已存在的文件(&O) +ExistingFileNewerKeepExisting=保留现有的文件(&K) (推荐) +ExistingFileNewerOverwriteOrKeepAll=为所有冲突文件执行此操作(&D) +ErrorChangingAttr=尝试更改下列现有文件的属性时出错: +ErrorCreatingTemp=尝试在目标目录创建文件时出错: +ErrorReadingSource=尝试读取下列源文件时出错: +ErrorCopying=尝试复制下列文件时出错: +ErrorReplacingExistingFile=尝试替换现有文件时出错: +ErrorRestartReplace=重启并替换失败: +ErrorRenamingTemp=尝试重命名下列目标目录中的一个文件时出错: +ErrorRegisterServer=无法注册 DLL/OCX:%1 +ErrorRegSvr32Failed=RegSvr32 失败;退出代码 %1 +ErrorRegisterTypeLib=无法注册类库:%1 + +; *** 卸载显示名字标记 +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32 位 +UninstallDisplayNameMark64Bit=64 位 +UninstallDisplayNameMarkAllUsers=所有用户 +UninstallDisplayNameMarkCurrentUser=当前用户 + +; *** 安装后错误 +ErrorOpeningReadme=尝试打开自述文件时出错。 +ErrorRestartingComputer=安装程序无法重启电脑,请手动重启。 + +; *** 卸载消息 +UninstallNotFound=文件“%1”不存在。无法卸载。 +UninstallOpenError=文件“%1”不能被打开。无法卸载。 +UninstallUnsupportedVer=此版本的卸载程序无法识别卸载日志文件“%1”的格式。无法卸载 +UninstallUnknownEntry=卸载日志中遇到一个未知条目 (%1) +ConfirmUninstall=您确认要完全移除 %1 及其所有组件吗? +UninstallOnlyOnWin64=仅允许在 64 位 Windows 中卸载此程序。 +OnlyAdminCanUninstall=仅使用管理员权限的用户能完成此卸载。 +UninstallStatusLabel=正在从您的电脑中移除 %1,请稍候。 +UninstalledAll=已顺利从您的电脑中移除 %1。 +UninstalledMost=%1 卸载完成。%n%n有部分内容未能被删除,但您可以手动删除它们。 +UninstalledAndNeedsRestart=为完成 %1 的卸载,需要重启您的电脑。%n%n立即重启电脑吗? +UninstallDataCorrupted=文件“%1”已损坏。无法卸载 + +; *** 卸载状态消息 +ConfirmDeleteSharedFileTitle=删除共享的文件吗? +ConfirmDeleteSharedFile2=系统表示下列共享的文件已不有其他程序使用。您希望卸载程序删除这些共享的文件吗?%n%n如果删除这些文件,但仍有程序在使用这些文件,则这些程序可能出现异常。如果您不能确定,请选择“否”,在系统中保留这些文件以免引发问题。 +SharedFileNameLabel=文件名: +SharedFileLocationLabel=位置: +WizardUninstalling=卸载状态 +StatusUninstalling=正在卸载 %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=正在安装 %1。 +ShutdownBlockReasonUninstallingApp=正在卸载 %1。 + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 版本 %2 +AdditionalIcons=附加快捷方式: +CreateDesktopIcon=创建桌面快捷方式(&D) +CreateQuickLaunchIcon=创建快速启动栏快捷方式(&Q) +ProgramOnTheWeb=%1 网站 +UninstallProgram=卸载 %1 +LaunchProgram=运行 %1 +AssocFileExtension=将 %2 文件扩展名与 %1 建立关联(&A) +AssocingFileExtension=正在将 %2 文件扩展名与 %1 建立关联... +AutoStartProgramGroupDescription=启动: +AutoStartProgram=自动启动 %1 +AddonHostProgramNotFound=您选择的文件夹中无法找到 %1。%n%n您要继续吗? diff --git a/scripts/appimage/AppImageBuilder_arm_64.yml b/scripts/appimage/AppImageBuilder_arm_64.yml new file mode 100644 index 0000000..11c9cbe --- /dev/null +++ b/scripts/appimage/AppImageBuilder_arm_64.yml @@ -0,0 +1,68 @@ +# appimage-builder recipe see https://appimage-builder.readthedocs.io for details +version: 1 +script: + # Workaround for error in Github Actions (https://github.com/AppImageCrafters/appimage-builder/issues/271) + - which mksquashfs || apt install squashfs-tools + +AppDir: + path: AppDir + app_info: + id: org.localsend.localsend_app + name: LocalSend + icon: localsend + version: latest + exec: localsend_app + exec_args: $@ + apt: + arch: + - arm64 + allow_unauthenticated: true + sources: + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy main restricted + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy universe + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates universe + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy multiverse + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates multiverse + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse + - sourceline: deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted + - sourceline: deb http://security.ubuntu.com/ubuntu/ jammy-security universe + - sourceline: deb http://security.ubuntu.com/ubuntu/ jammy-security multiverse + include: + - libayatana-appindicator3-1:arm64 + - librsvg2-common:arm64 + exclude: + - adwaita-icon-theme:* + runtime: + env: + XDG_DATA_DIRS: '/usr/local/share/:/usr/share/:${XDG_DATA_DIRS}' + files: + include: [] + exclude: + - usr/share/man + - usr/share/doc/*/README.* + - usr/share/doc/*/changelog.* + - usr/share/doc/*/NEWS.* + - usr/share/doc/*/TODO.* + +# Test cases do not work in Github Actions +# +# test: +# fedora-30: +# image: appimagecrafters/tests-env:fedora-30 +# command: ./AppRun +# debian-stable: +# image: appimagecrafters/tests-env:debian-stable +# command: ./AppRun +# archlinux-latest: +# image: appimagecrafters/tests-env:archlinux-latest +# command: ./AppRun +# centos-7: +# image: appimagecrafters/tests-env:centos-7 +# command: ./AppRun +# ubuntu-xenial: +# image: appimagecrafters/tests-env:ubuntu-xenial +# command: ./AppRun +AppImage: + arch: arm_64 + update-information: guess diff --git a/scripts/appimage/AppImageBuilder_x86_64.yml b/scripts/appimage/AppImageBuilder_x86_64.yml new file mode 100644 index 0000000..05f345e --- /dev/null +++ b/scripts/appimage/AppImageBuilder_x86_64.yml @@ -0,0 +1,68 @@ +# appimage-builder recipe see https://appimage-builder.readthedocs.io for details +version: 1 +script: + # Workaround for error in Github Actions (https://github.com/AppImageCrafters/appimage-builder/issues/271) + - which mksquashfs || apt install squashfs-tools + +AppDir: + path: AppDir + app_info: + id: org.localsend.localsend_app + name: LocalSend + icon: localsend + version: latest + exec: localsend_app + exec_args: $@ + apt: + arch: + - amd64 + allow_unauthenticated: true + sources: + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy main restricted + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy universe + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates universe + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy multiverse + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates multiverse + - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse + - sourceline: deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted + - sourceline: deb http://security.ubuntu.com/ubuntu/ jammy-security universe + - sourceline: deb http://security.ubuntu.com/ubuntu/ jammy-security multiverse + include: + - libayatana-appindicator3-1:amd64 + - librsvg2-common:amd64 + exclude: + - adwaita-icon-theme:* + runtime: + env: + XDG_DATA_DIRS: '/usr/local/share/:/usr/share/:${XDG_DATA_DIRS}' + files: + include: [] + exclude: + - usr/share/man + - usr/share/doc/*/README.* + - usr/share/doc/*/changelog.* + - usr/share/doc/*/NEWS.* + - usr/share/doc/*/TODO.* + +# Test cases do not work in Github Actions +# +# test: +# fedora-30: +# image: appimagecrafters/tests-env:fedora-30 +# command: ./AppRun +# debian-stable: +# image: appimagecrafters/tests-env:debian-stable +# command: ./AppRun +# archlinux-latest: +# image: appimagecrafters/tests-env:archlinux-latest +# command: ./AppRun +# centos-7: +# image: appimagecrafters/tests-env:centos-7 +# command: ./AppRun +# ubuntu-xenial: +# image: appimagecrafters/tests-env:ubuntu-xenial +# command: ./AppRun +AppImage: + arch: x86_64 + update-information: guess diff --git a/scripts/compile_android_apk.sh b/scripts/compile_android_apk.sh new file mode 100644 index 0000000..2f3cce0 --- /dev/null +++ b/scripts/compile_android_apk.sh @@ -0,0 +1,31 @@ +# This apk script is written in a way to conform with "Reproducible Builds" by F-Droid +# The Android SDK should be installed with sdkmanager (apt install sdkmanager) +# By default, it will install everything to "/opt/android-sdk". This path is important! +# Furthermore, the Flutter version from the submodule is used. + +# Check Build ID via "readelf --wide --notes libapp.so" + +# REQUIREMENTS +# (1) sudo apt install openjdk-11-jdk sdkmanager +# (2) sudo chown -R /opt/android-sdk +# (3) sdkmanager "platform-tools" "platforms;android-33" +# (4) sdkmanager --licenses + +# UNCOMMENT THESE LINES TO BUILD FROM LATEST COMMIT +# git reset --hard origin/main +# git pull + +cd .. +rm -rf /tmp/build +cp localsend /tmp/build -r +pushd /tmp/build + +git submodule update --init +alias flutter='submodules/flutter/bin/flutter' +flutter config --no-analytics +flutter pub get +dart run build_runner build -d +flutter build apk + +popd +cd localsend diff --git a/scripts/compile_android_appbundle.ps1 b/scripts/compile_android_appbundle.ps1 new file mode 100644 index 0000000..510f08e --- /dev/null +++ b/scripts/compile_android_appbundle.ps1 @@ -0,0 +1,11 @@ +# UNCOMMENT THESE LINES TO BUILD FROM LATEST COMMIT +# git reset --hard origin/main +# git pull + +cd app +fvm flutter clean +fvm flutter pub get +fvm flutter build appbundle +cd .. + +Write-Output 'Generated Android Appbundle!' \ No newline at end of file diff --git a/scripts/compile_ios.sh b/scripts/compile_ios.sh new file mode 100644 index 0000000..0a723dc --- /dev/null +++ b/scripts/compile_ios.sh @@ -0,0 +1,14 @@ +# UNCOMMENT THESE LINES TO BUILD FROM LATEST COMMIT +# git reset --hard origin/main +# git pull + +cd app +fvm flutter clean +fvm flutter pub get +fvm flutter precache --ios +( + cd ios + pod update +) +fvm flutter build ipa +cd .. \ No newline at end of file diff --git a/scripts/compile_linux_appimage.sh b/scripts/compile_linux_appimage.sh new file mode 100644 index 0000000..73f98db --- /dev/null +++ b/scripts/compile_linux_appimage.sh @@ -0,0 +1,39 @@ +# REQUIREMENTS +# (1) For Flutter: sudo apt install curl clang cmake libgtk-3-dev ninja-build +# Project specific: sudo apt install libayatana-appindicator3-dev +# (2) For AppImage: +# sudo apt install libfuse2 +# Download from https://github.com/AppImageCrafters/appimage-builder/releases +# then sudo chmod +x appimage-builder-1.1.0-x86_64.AppImage && sudo mv appimage-builder-1.1.0-x86_64.AppImage /usr/local/bin/appimage-builder + +# UNCOMMENT THESE LINES TO BUILD FROM LATEST COMMIT +# git reset --hard origin/main +# git pull + +cd .. +rm -rf /tmp/build +cp localsend /tmp/build -r +pushd /tmp/build + +git submodule update --init +alias flutter='submodules/flutter/bin/flutter' + +flutter clean +flutter pub get +flutter pub run build_runner build -d +flutter build linux + +rm -rf AppDir +rm -rf appimage-build + +mkdir AppDir +cp -r build/linux/x64/release/bundle/* AppDir +appimage-builder +sudo chmod +x LocalSend-latest-x86_64.AppImage + +rm -rf AppDir +rm -rf appimage-build + +popd +cd localsend +cp /tmp/build/LocalSend-latest-x86_64.AppImage . diff --git a/scripts/compile_mac_appstore.sh b/scripts/compile_mac_appstore.sh new file mode 100644 index 0000000..4c4ba0e --- /dev/null +++ b/scripts/compile_mac_appstore.sh @@ -0,0 +1,9 @@ +# UNCOMMENT THESE LINES TO BUILD FROM LATEST COMMIT +# git reset --hard origin/main +# git pull + +cd app +fvm flutter clean +fvm flutter pub get +fvm flutter build macos +cd .. \ No newline at end of file diff --git a/scripts/compile_mac_dmg.sh b/scripts/compile_mac_dmg.sh new file mode 100644 index 0000000..113dc1c --- /dev/null +++ b/scripts/compile_mac_dmg.sh @@ -0,0 +1,53 @@ +# UNCOMMENT THESE LINES TO BUILD FROM LATEST COMMIT +# git reset --hard origin/main +# git pull + +cd app +fvm flutter clean +fvm flutter pub get +fvm flutter build macos + +# sign the app +echo +echo "Signing the app..." +echo +SIGN_ID="Developer ID Application: Tien Do Nam (3W7H4PYMCV)" +codesign --deep --force --verbose --options runtime --entitlements macos/Runner/Release.entitlements --sign "$SIGN_ID" build/macos/Build/Products/Release/LocalSend.app + +# create dmg +# brew install create-dmg +echo +echo "Creating dmg..." +echo +rm -f LocalSend.dmg +create-dmg \ + --volname "LocalSend" \ + --window-size 500 300 \ + --background "../scripts/dmg/background.png" \ + --icon LocalSend.app 130 110 \ + --app-drop-link 360 110 \ + LocalSend.dmg \ + build/macos/Build/Products/Release/LocalSend.app + +# sign the dmg +echo +echo "Signing the dmg..." +echo +codesign --force --verbose --sign "$SIGN_ID" LocalSend.dmg + +# send to apple for notarization +DEV_EMAIL=example@example.com +APP_PASSWORD=abcd-efgh-ijkl-mnop +TEAM_ID=3W7H4PYMCV + +echo +echo "Sending to apple for notarization..." +echo +xcrun notarytool submit LocalSend.dmg --wait --apple-id $DEV_EMAIL --password "$APP_PASSWORD" --team-id "$TEAM_ID" + +# download notarization result and apply to the dmg +echo +echo "Run stapler..." +echo +xcrun stapler staple LocalSend.dmg +cd .. diff --git a/scripts/compile_windows_exe-inno.iss b/scripts/compile_windows_exe-inno.iss new file mode 100644 index 0000000..4004a49 --- /dev/null +++ b/scripts/compile_windows_exe-inno.iss @@ -0,0 +1,89 @@ +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! +; Copy the contents of the zip to D:\inno, then run this Inno script +; Copy app/assets/packaging/logo-256.ico to D:\inno\logo-256.ico + +#define MyAppName "LocalSend" +#define MyAppVersion "1.17.0" +#define MyAppPublisher "Tien Do Nam" +#define MyAppURL "https://localsend.org" +#define MyAppExeName "localsend_app.exe" +#define MyAppMsixHelper "localsend_msix_helper.msix" + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. +; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) +AppId={{00809252-FEC6-448E-83B4-E7F55AE7E47D} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +;AppVerName={#MyAppName} {#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DefaultDirName={autopf}\{#MyAppName} +DisableProgramGroupPage=yes +; Uncomment the following line to run in non administrative install mode (install for current user only.) +;PrivilegesRequired=lowest +PrivilegesRequiredOverridesAllowed=dialog +OutputDir=D:\inno-result +OutputBaseFilename=localsend +SetupIconFile=D:\inno\logo.ico +UninstallDisplayIcon={app}\{#MyAppExeName} +Compression=lzma +SolidCompression=yes +WizardStyle=modern +SignTool=MySignTool +ArchitecturesInstallIn64BitMode=x64compatible +ArchitecturesAllowed=x64compatible + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" +Name: "armenian"; MessagesFile: "compiler:Languages\Armenian.isl" +Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" +Name: "bulgarian"; MessagesFile: "compiler:Languages\Bulgarian.isl" +Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl" +Name: "corsican"; MessagesFile: "compiler:Languages\Corsican.isl" +Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" +Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl" +Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" +Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl" +Name: "french"; MessagesFile: "compiler:Languages\French.isl" +Name: "german"; MessagesFile: "compiler:Languages\German.isl" +Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl" +Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl" +Name: "icelandic"; MessagesFile: "compiler:Languages\Icelandic.isl" +Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl" +Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl" +Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl" +Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" +Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl" +Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" +Name: "slovak"; MessagesFile: "compiler:Languages\Slovak.isl" +Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl" +Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" +Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl" +Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl" +Name: "chinesesimplified"; MessagesFile: ".\Languages\ChineseSimplified.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +Source: "D:\inno\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\inno\{#MyAppExeName}.manifest"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\inno\*.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\inno\data\*"; DestDir: "{app}\data"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "D:\inno\{#MyAppMsixHelper}"; DestDir: "{app}"; Flags: ignoreversion +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Icons] +Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[Run] +Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent +Filename: "powershell.exe"; Parameters: "-ExecutionPolicy Bypass -Command Add-AppxPackage .\localsend_msix_helper.msix -ExternalLocation $(Get-Location)"; WorkingDir: {app}; Flags: nowait postinstall + +[UninstallRun] +Filename: "powershell.exe"; Parameters: "-ExecutionPolicy Bypass -Command Remove-AppxPackage $(Get-AppxPackage com.flutter.localsendapp)"; WorkingDir: {app}; Flags: nowait diff --git a/scripts/compile_windows_exe.ps1 b/scripts/compile_windows_exe.ps1 new file mode 100644 index 0000000..c9be839 --- /dev/null +++ b/scripts/compile_windows_exe.ps1 @@ -0,0 +1,21 @@ +& 'C:\Program Files (x86)\Windows Kits\10\App Certification Kit\makeappx.exe' pack /o /d msix /nv /p app\windows\localsend_msix_helper.msix + +cd app + +fvm flutter clean +fvm flutter pub get +fvm flutter build windows + +Remove-Item "D:\inno" -Force -Recurse -ErrorAction SilentlyContinue +New-Item -ItemType Directory -Force -Path "D:\inno" +Copy-Item -Path "build\windows\x64\runner\Release\*" -Destination "D:\inno" -Recurse +Copy-Item -Path "assets\packaging\logo.ico" -Destination "D:\inno" + +cd .. + +Copy-Item -Path "scripts\windows\x64\*" -Destination "D:\inno" -Recurse +Remove-Item "D:\inno-result" -Force -Recurse -ErrorAction SilentlyContinue +New-Item -ItemType Directory -Force -Path "D:\inno-result" +iscc .\scripts\compile_windows_exe-inno.iss + +Write-Output 'Generated Windows exe installer!' diff --git a/scripts/compile_windows_msix_helper.ps1 b/scripts/compile_windows_msix_helper.ps1 new file mode 100644 index 0000000..4db4990 --- /dev/null +++ b/scripts/compile_windows_msix_helper.ps1 @@ -0,0 +1,4 @@ +# Using Visual Studio 2022 Developer PowerShell +# or using e.g. "C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\makeappx.exe" + +MakeAppx.exe pack /o /d .\msix /nv /p .\app\windows\localsend_msix_helper.msix diff --git a/scripts/compile_windows_msix_signed.ps1 b/scripts/compile_windows_msix_signed.ps1 new file mode 100644 index 0000000..8f5b12b --- /dev/null +++ b/scripts/compile_windows_msix_signed.ps1 @@ -0,0 +1,19 @@ +# UNCOMMENT THESE LINES TO BUILD FROM LATEST COMMIT +# git reset --hard origin/main +# git pull + +param( + [Parameter(Mandatory=$true)] + [string]$CERTIFICATE_PASSWORD +) + +cd app +fvm flutter clean +fvm flutter pub get +fvm dart run msix:create --certificate-path ../secrets/windows-tienisto.pfx --certificate-password $CERTIFICATE_PASSWORD + +Move-Item -Path build/windows/x64/runner/Release/localsend_app.msix -Destination LocalSend-XXX-windows-x86-64.msix + +cd .. + +Write-Output 'Generated Signed Windows msix!' diff --git a/scripts/compile_windows_msix_store.ps1 b/scripts/compile_windows_msix_store.ps1 new file mode 100644 index 0000000..262ed5e --- /dev/null +++ b/scripts/compile_windows_msix_store.ps1 @@ -0,0 +1,12 @@ +# UNCOMMENT THESE LINES TO BUILD FROM LATEST COMMIT +# git reset --hard origin/main +# git pull + +fvm flutter clean +fvm flutter pub get +fvm dart run build_runner build -d +fvm flutter pub run msix:create --store + +Move-Item -Path build/windows/x64/runner/Release/localsend_app.msix -Destination LocalSend-XXX-windows-x86-64-store.msix + +Write-Output 'Generated Windows msix!' diff --git a/scripts/compile_windows_zip.ps1 b/scripts/compile_windows_zip.ps1 new file mode 100644 index 0000000..e38ef31 --- /dev/null +++ b/scripts/compile_windows_zip.ps1 @@ -0,0 +1,15 @@ +# UNCOMMENT THESE LINES TO BUILD FROM LATEST COMMIT +# git reset --hard origin/main +# git pull + +cd app + +fvm flutter clean +fvm flutter pub get +fvm flutter build windows + +Compress-Archive -Path build/windows/x64/runner/Release/* -DestinationPath LocalSend-XXX-windows-x86-64.zip + +cd .. + +Write-Output 'Generated Windows zip!' \ No newline at end of file diff --git a/scripts/contributions_digester.dart b/scripts/contributions_digester.dart new file mode 100644 index 0000000..ba51d23 --- /dev/null +++ b/scripts/contributions_digester.dart @@ -0,0 +1,32 @@ +import 'dart:io'; + +/// Used to make the changes in the Github Releases shorter. +/// Aggregates documentation and i18n PRs to "i18n: @user1, @user2". +/// Keeps other contributions (PRs) as is. +void main() { + final contributions = File('contributions.txt').readAsLinesSync(); + final newContributions = []; + final documentations = {}; // list of "@user" + final translators = {}; // list of "@user" + for (String pr in contributions) { + final originalPr = pr; + pr = pr.toLowerCase(); + if (pr.contains('@dependabot')) { + continue; + } + + if (pr.contains('i18n') || pr.contains('translation') || pr.contains('translator') || pr.contains('translate') || pr.contains('language')) { + translators.add('@' + originalPr.split(' @').last); + } else if (pr.contains('readme') || pr.contains('contributing')) { + documentations.add('@' + originalPr.split(' @').last); + } else { + newContributions.add(originalPr); + } + } + + final content = newContributions.join('\n') + '\n' + '* docs: ${documentations.join(', ')}' + '\n' + '* i18n: ${translators.join(', ')}'; + print('Content: $content'); + + File('contributions_digested.txt').writeAsStringSync(content); + print('Finish!'); +} diff --git a/scripts/dmg/background.png b/scripts/dmg/background.png new file mode 100644 index 0000000000000000000000000000000000000000..54adfc67a3de6e95a6fde160235a47a05b883fd5 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0y~yVEh8aI*iOf5&qK4-9U;tz$e6Y!jg3hbBZ*8Tuo0G u$B>F!Zx0$W0(plNelOp4R4)O@L<0g=-awP;7@swRBs^XHT-G@yGywpFO&K8o literal 0 HcmV?d00001 diff --git a/scripts/download_windows_msix.ps1 b/scripts/download_windows_msix.ps1 new file mode 100644 index 0000000..3f94afa --- /dev/null +++ b/scripts/download_windows_msix.ps1 @@ -0,0 +1,4 @@ +# Downloads the MSIX signed by Microsoft +# This is useful to publish the MSIX outside of the store +# Original script can be found in https://github.com/MattiasC85/Scripts/blob/master/OSD/Download-AppxFromStore.ps1 +.\scripts\msix\msix_downloader.ps1 -StoreURL https://www.microsoft.com/store/productId/9NCB4Z0TZ6RR diff --git a/scripts/msix/msix_downloader.ps1 b/scripts/msix/msix_downloader.ps1 new file mode 100644 index 0000000..006910b --- /dev/null +++ b/scripts/msix/msix_downloader.ps1 @@ -0,0 +1,123 @@ +<# + +Update 2020-02-18 +Thanks @BruceDawson0xB for pointing out the flaw in the regex pattern. if %tmp% began with a lowercase char the script would fail. + +Update 2020-02-14 +Thanks @jarwidmark for letting me know that this had Office as a dependency and for testing the workaround. + -The script now works even if you don't have Office installed. + +Downloads any free app and its dependencies from the Microsoft store. + +Drivers are starting to implement store apps to be fully functional. +The analogue 3.5mm headphone connector not working on some models without the app. +The driver package from the manufacturer only contains a batch file which opens the store in your web browser. +And I can't find the app in the business store... + +Also heard of a similar case with the thunderbolt app. + +If the manufacturers would include these in their driver packages I wouldn't have to do this. +But I can see why they don't.. + +There's this "small" issue with deploying .Appx and AppxBundles during an OSD. +But that script will be done and uploaded in a couple of days or so. :) + + +The real heroes here are the ppl behind this site: +https://store.rg-adguard.net + +I'm just poking their API. + +-StoreURL Examples: + +-StoreURL https://www.microsoft.com/store/apps/9n6f0jv38ph1 +-StoreURL https://www.microsoft.com/en-us/p/thunderbolt-control-center/9n6f0jv38ph1 +#> + +Param ( + [Parameter(Mandatory = $True)] + [string] $StoreURL, + [Parameter(Mandatory = $False)] + $SavePathRoot = "%tmp%" +) + +# + +if ($StoreURL.EndsWith("/")) { + #write-host "Ends with '/'" + $StoreURL = $StoreURL.Remove($StoreUrl.Length - 1, 1) +} + +$wchttp = [System.Net.WebClient]::new() +$URI = "https://store.rg-adguard.net/api/GetFiles" +$myParameters = "type=url&url=$($StoreURL)" +#&ring=Retail&lang=sv-SE" + +$wchttp.Headers[[System.Net.HttpRequestHeader]::ContentType] = "application/x-www-form-urlencoded" +$HtmlResult = $wchttp.UploadString($URI, $myParameters) + +$Start = $HtmlResult.IndexOf("

    The links were successfully received from the Microsoft Store server.

    ") +#write-host $start + +if ($Start -eq -1) { + write-host "Could not get the links, please check the StoreURL." + exit +} + +$TableEnd = ($HtmlResult.LastIndexOf("") + 8) + + +$SemiCleaned = $HtmlResult.Substring($start, $TableEnd - $start) + +#https://stackoverflow.com/questions/46307976/unable-to-use-ihtmldocument2 +$newHtml = New-Object -ComObject "HTMLFile" +try { + # This works in PowerShell with Office installed + $newHtml.IHTMLDocument2_write($SemiCleaned) +} +catch { + # This works when Office is not installed + $src = [System.Text.Encoding]::Unicode.GetBytes($SemiCleaned) + $newHtml.write($src) +} + +$ToDownload = $newHtml.getElementsByTagName("a") | Select-Object textContent, href + +$SavePathRoot = $([System.Environment]::ExpandEnvironmentVariables("$SavePathRoot")) + +$LastFrontSlash = $StoreURL.LastIndexOf("/") +$ProductID = $StoreURL.Substring($LastFrontSlash + 1, $StoreURL.Length - $LastFrontSlash - 1) + +# OldRegEx Failed when the %tmp% started with a lowercase char +#if ([regex]::IsMatch("$SavePathRoot\$ProductID","([,!@?#$%^&*()\[\]]+|\\\.\.|\\\\\.|\.\.\\\|\.\\\|\.\.\/|\.\/|\/\.\.|\/\.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�_Txkcvh)!pQ^GsX{j3|kNj0emNg*8dGwy&3Q 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 z%0A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 z zZ)uWl{;h(GJP+@uNkiW<=if8< zBohBT9K4SFyBvY)#J_V8z=VI*lmF}d>szDo?=swje|dB<^6yeC6xZ|5`vP<2#J?2& z6`;|k@^6o%sXp@CLY&9xVvMt9pFYlf>0%M*D{`FqQcH?c{>SIZ704Pt_pB=Wp{;h$ z-XuqhRk*an8NR8G&h|4(n_!f<;M&#pgH=MYUqzC%#ZS`g1wxc5;i8O_MIkNDXQMvP z**jOw-dr?S6;b%AoNtGdKw;s%_PmP0`Q`R}>5p{?iN2BXbkdC*!@jpv4#qL42(ijE zM1?)Sd{n;H1i^3Z2PCjm+7Vp)f`02iKuM(-e$yB^pReNNll7$CNo=g(5 z@gAE?@VRorUxu^OAo+klw7|rqkk8#*fACRC(E5E9>b5xg#CI?lEO(^a=v+TEL}8Fj zn>V?HsDGm-RSostKWMah|nTV=}e3)2m*!mCqY8&yM5H<+o|wyv(zp?JY44{;jrKr z+c*#v)yX0QAK9N1r}P%5IlXzXWX=>i_e@>(oLf;d0*)M9H~JpLu9?`bX-W!v*SI=e z;`Z%Bh=q}fIbyj=%-??3i1|7YqXQ@JdjU5Q7}{EC)L^$*eWUs4N1$JD3xdyTNsZ@b z{^A6ZD{!rSz{e#=P;G;2omeit2vO6{t6_&lxVai1!}UpNFu#v`aHyItdaIEky}R4Up&ZXX={i7jwD5#z-3|4A&wFpuq)cUEvS2nV@iW@ zO3w-&K%Xsx6l-(f2Zyr5Wb2dZs6n)fosw|ix)4_--oy=#FeL3Qbc@rmMx=$aa1@RU zcb}=ih{16>5a<>pw7@6!-yNr0d;Z5>4Yas@NXwsm8eR0DWlAS@=|Qte!=7Z&Ry-g; zvq_!iD-~a7KMeNj80-}&j^+H>>q-)fydhRAs=XTd?C~Hq SFj!4cIHeCkapWk}^Sd>|T#cAWmm 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 B*A)N& literal 0 HcmV?d00001 diff --git a/scripts/windows/x64/vcruntime140.dll b/scripts/windows/x64/vcruntime140.dll new file mode 100644 index 0000000000000000000000000000000000000000..edba5485f14d5d05f97fcfbf62391e48f054894b GIT binary patch literal 109440 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 i7QRya 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 JuPB+({|AKED*ONd literal 0 HcmV?d00001 diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..2f7896d --- /dev/null +++ b/server/.gitignore @@ -0,0 +1 @@ +target/ diff --git a/server/Cargo.lock b/server/Cargo.lock new file mode 100644 index 0000000..52be58f --- /dev/null +++ b/server/Cargo.lock @@ -0,0 +1,1364 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "axum" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8" +dependencies = [ + "axum-core", + "base64", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1362f362fd16024ae199c1970ce98f9661bf5ef94b9808fee734bc3698b733" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "cc" +version = "1.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +dependencies = [ + "libc", +] + +[[package]] +name = "croner" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38fd53511eaf0b00a185613875fee58b208dfce016577d0ad4bb548e1c4fb3ee" +dependencies = [ + "chrono", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-macro", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "http" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.175" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" + +[[package]] +name = "localsend" +version = "0.1.0" +dependencies = [ + "anyhow", + "base64", + "bytes", + "futures-util", + "lru", + "rand 0.9.2", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-stream", + "tracing", + "tracing-subscriber", + "tungstenite 0.28.0", + "uuid", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "lru" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.143" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "server" +version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "base64", + "futures-util", + "localsend", + "serde", + "serde_json", + "tokio", + "tokio-cron-scheduler", + "tracing", + "tracing-subscriber", + "uuid", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "syn" +version = "2.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tokio" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-cron-scheduler" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a5597b569b4712cf78aa0c9ae29742461b7bda1e49c2a5fdad1d79bf022f8f0" +dependencies = [ + "chrono", + "croner", + "num-derive", + "num-traits", + "tokio", + "tracing", + "uuid", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4bf6fecd69fcdede0ec680aaf474cdab988f9de6bc73d3758f0160e3b7025a" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite 0.26.1", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tungstenite" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413083a99c579593656008130e29255e54dcaae495be556cc26888f211648c24" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "sha1", + "thiserror", + "utf-8", +] + +[[package]] +name = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.2", + "sha1", + "thiserror", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" +dependencies = [ + "getrandom 0.3.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/server/Cargo.toml b/server/Cargo.toml new file mode 100644 index 0000000..93ef9a3 --- /dev/null +++ b/server/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "server" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.95" +axum = { version = "0.8.1", features = ["ws"] } +base64 = "0.22.1" +futures-util = "0.3.31" +localsend = { path = "../core" } +serde = { version = "1.0.217", features = ["derive"] } +serde_json = "1.0.135" +tokio = { version = "1.43.0", features = ["full"] } +tokio-cron-scheduler = "0.13.0" +tracing = "0.1.41" +tracing-subscriber = { version = "0.3.19" } +uuid = {version = "1.11.0", features = ["serde", "v4"]} diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000..5c7bb42 --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,24 @@ +FROM rust:1.83 AS builder + +WORKDIR /app + +# Compile Dependencies +COPY Cargo.* ./ +RUN mkdir src && echo 'fn main() { panic!("Dummy Image Called!") }' > ./src/main.rs +RUN cargo build --release + +# Add Source +COPY src ./src + +# Break cargo cache +RUN touch ./src/main.rs + +# Compile +RUN cargo build --release + +FROM debian:bookworm AS runtime + +COPY --from=builder /app/target/release/server /server + +EXPOSE 3000 +ENTRYPOINT ["/server"] diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000..07b8b65 --- /dev/null +++ b/server/README.md @@ -0,0 +1,3 @@ +# LocalSend Signaling Server + +A signaling server for LocalSend. Using Rust and WebSockets. diff --git a/server/src/config/error.rs b/server/src/config/error.rs new file mode 100644 index 0000000..32b5cb0 --- /dev/null +++ b/server/src/config/error.rs @@ -0,0 +1,59 @@ +use axum::http::StatusCode; +use axum::response::{IntoResponse, Response}; + +// https://github.com/tokio-rs/axum/blob/main/examples/oauth/src/main.rs + +#[derive(Debug)] +pub struct AppError { + status: StatusCode, + message: Option, + error: Option, +} + +impl AppError { + pub fn status(status: StatusCode, message: Option) -> Self { + Self { + status, + message, + error: None, + } + } +} + +impl IntoResponse for AppError { + fn into_response(self) -> Response { + if self.status >= StatusCode::INTERNAL_SERVER_ERROR { + tracing::error!( + "{:?}; {:?}", + match &self.message { + Some(message) => message, + None => "(no message)", + }, + match &self.error { + Some(error) => error.to_string(), + None => "(no error)".to_string(), + } + ); + } + + // return status code with message + if let Some(message) = self.message { + (self.status, message).into_response() + } else { + self.status.into_response() + } + } +} + +impl From for AppError +where + E: Into, +{ + fn from(err: E) -> Self { + Self { + status: StatusCode::INTERNAL_SERVER_ERROR, + message: None, + error: Some(err.into()), + } + } +} diff --git a/server/src/config/init.rs b/server/src/config/init.rs new file mode 100644 index 0000000..9d51d6e --- /dev/null +++ b/server/src/config/init.rs @@ -0,0 +1,20 @@ +use crate::config::scheduler; +use crate::config::state::AppState; +use tracing::Level; + +pub async fn init() -> AppState { + // Set up tracing / logging + tracing_subscriber::fmt().with_max_level(Level::INFO).init(); + + tracing::info!("Starting LocalSend WebRTC signaling server..."); + + // Initialize the AppState + let app_state = AppState::new(); + + // Setup scheduler + scheduler::configure_scheduling(app_state.request_count_map.clone()) + .await + .expect("Error configuring scheduler"); + + app_state +} diff --git a/server/src/config/mod.rs b/server/src/config/mod.rs new file mode 100644 index 0000000..a0c4d8d --- /dev/null +++ b/server/src/config/mod.rs @@ -0,0 +1,4 @@ +pub(crate) mod error; +pub(crate) mod init; +mod scheduler; +pub(crate) mod state; diff --git a/server/src/config/scheduler.rs b/server/src/config/scheduler.rs new file mode 100644 index 0000000..a446711 --- /dev/null +++ b/server/src/config/scheduler.rs @@ -0,0 +1,24 @@ +use tokio_cron_scheduler::{Job, JobScheduler}; + +use crate::config::state::IpRequestCountMap; + +pub async fn configure_scheduling( + ip_request_count_map: IpRequestCountMap, +) -> Result<(), Box> { + let scheduler = JobScheduler::new().await?; + + scheduler + .add(Job::new_async("0 0 * * * *", move |_uuid, _l| { + Box::pin({ + let value = ip_request_count_map.clone(); + async move { + value.lock().await.clear(); + } + }) + })?) + .await?; + + scheduler.start().await?; + + Ok(()) +} diff --git a/server/src/config/state.rs b/server/src/config/state.rs new file mode 100644 index 0000000..4de801b --- /dev/null +++ b/server/src/config/state.rs @@ -0,0 +1,33 @@ +use localsend::webrtc::signaling::{ClientInfoWithoutId, WsServerMessage}; +use std::collections::HashMap; +use std::sync::Arc; +use tokio::sync::{mpsc, Mutex}; +use uuid::Uuid; + +/// IP -> Peer ID -> PeerInfo + WebSocket message sender. +pub type TxMap = Arc>>>; + +pub struct ClientState { + pub client: ClientInfoWithoutId, + pub tx: mpsc::Sender, +} + +pub type IpRequestCountMap = Arc>>; + +#[derive(Clone)] +pub struct AppState { + /// Map of peer IDs to WebSocket message senders. + pub tx_map: TxMap, + + /// Map of IP addresses to the number of requests. + pub request_count_map: IpRequestCountMap, +} + +impl AppState { + pub fn new() -> Self { + Self { + tx_map: Arc::new(Mutex::new(HashMap::new())), + request_count_map: Arc::new(Mutex::new(HashMap::new())), + } + } +} diff --git a/server/src/controller/mod.rs b/server/src/controller/mod.rs new file mode 100644 index 0000000..60da579 --- /dev/null +++ b/server/src/controller/mod.rs @@ -0,0 +1 @@ +pub(crate) mod ws_controller; diff --git a/server/src/controller/ws_controller.rs b/server/src/controller/ws_controller.rs new file mode 100644 index 0000000..2a817f8 --- /dev/null +++ b/server/src/controller/ws_controller.rs @@ -0,0 +1,369 @@ +use crate::config::error::AppError; +use crate::config::state::{AppState, ClientState, IpRequestCountMap, TxMap}; +use crate::util; +use crate::util::ip::get_ip_group; +use axum::body::Body; +use axum::extract::ws::{Message, WebSocket}; +use axum::extract::{ConnectInfo, Query, State, WebSocketUpgrade}; +use axum::http::{HeaderMap, StatusCode}; +use axum::response::Response; +use futures_util::stream::StreamExt; +use futures_util::SinkExt; +use localsend::webrtc::signaling::{ + ClientInfo, ClientInfoWithoutId, WsClientMessage, WsClientSdpMessage, WsServerMessage, + WsServerSdpMessage, +}; +use serde::Deserialize; +use std::collections::HashMap; +use std::net::{IpAddr, SocketAddr}; +use std::str::FromStr; +use std::sync::LazyLock; +use tokio::sync::mpsc; +use uuid::Uuid; + +static MAX_CONNECTIONS: LazyLock = LazyLock::new(|| { + std::env::var("MAX_CONNECTIONS_PER_IP") + .unwrap_or_else(|_| "10".to_string()) + .parse::() + .unwrap() +}); + +static MAX_REQUESTS: LazyLock = LazyLock::new(|| { + std::env::var("MAX_REQUESTS_PER_IP_PER_HOUR") + .unwrap_or_else(|_| "1000".to_string()) + .parse::() + .unwrap() +}); + +#[derive(Deserialize)] +pub struct WsQuery { + /// `PeerRegisterDto` encoded as base64. + pub d: String, +} + +pub async fn ws_handler( + State(state): State, + ws: WebSocketUpgrade, + Query(payload): Query, + ConnectInfo(addr): ConnectInfo, + headers: HeaderMap, +) -> Result, AppError> { + let peer_info = { + let base64_decoded: Vec = util::base64::decode(&payload.d) + .map_err(|_| AppError::status(StatusCode::BAD_REQUEST, None))?; + + let base64_decoded: String = String::from_utf8(base64_decoded) + .map_err(|_| AppError::status(StatusCode::BAD_REQUEST, None))?; + + let register_dto = serde_json::from_str::(&base64_decoded) + .map_err(|_| AppError::status(StatusCode::BAD_REQUEST, None))?; + + ClientInfo::from(register_dto.clone(), Uuid::new_v4()) + }; + + let ip = { + // Prefer the forwarded IP if available. + let raw_forwarded = headers + .get("x-forwarded-for") + .and_then(|v| v.to_str().ok()) + .and_then(|v| v.split(',').last()) // Get the last component + .map(|v| v.trim().to_string()) + .and_then(|v| IpAddr::from_str(&v).ok()); + + raw_forwarded.unwrap_or(addr.ip()) + }; + + Ok(ws.on_upgrade(move |socket| { + handle_socket( + state.tx_map, + state.request_count_map, + socket, + get_ip_group(ip), + peer_info, + ) + })) +} + +/// The websocket context (one per connected device) is handled here. +async fn handle_socket( + tx_map: TxMap, + request_count_map: IpRequestCountMap, + socket: WebSocket, + ip_group: String, + peer: ClientInfo, +) { + let peer_id = peer.id; + let (tx, mut rx) = mpsc::channel(4); + { + // Tx of other peers in the IP group. + let mut peers_tx: Vec> = Vec::new(); + + // Peers in the IP group including the current user. + let mut peers: Vec = Vec::new(); + + // If the limit of connections is reached. + // Used to break out of the lock as early as possible. + let mut limit_reached = false; + + 'lock: { + let mut tx_map = tx_map.lock().await; + + let tx_local_map = tx_map.entry(ip_group.clone()).or_insert_with(HashMap::new); + if tx_local_map.len() >= *MAX_CONNECTIONS { + limit_reached = true; + break 'lock; + } + + if protect_ddos_request_count(&request_count_map, &ip_group) + .await + .is_err() + { + limit_reached = true; + break 'lock; + } + + peers_tx = tx_local_map.values().map(|p| p.tx.clone()).collect(); + + peers = tx_local_map + .iter() + .map(|(k, v)| ClientInfo::from(v.client.clone(), *k)) + .collect(); + + tx_local_map.insert( + peer_id, + ClientState { + client: ClientInfoWithoutId::from(peer.clone()), + tx: tx.clone(), + }, + ); + + let debug_active_connections = tx_map.len(); + let debug_total_active_connections: usize = tx_map.values().map(|m| m.len()).sum(); + tracing::info!("Connect: {ip_group} / {peer_id} (active: {debug_active_connections}, total active: {debug_total_active_connections})"); + } + + if limit_reached { + let (mut sender, _) = socket.split(); + let _ = sender.send(Message::Text("Limit reached".into())).await; + let _ = sender.close().await; + return; + } + + for peer_tx in peers_tx { + let _ = peer_tx + .send(WsServerMessage::Join { peer: peer.clone() }) + .await; + } + + let _ = tx + .send(WsServerMessage::Hello { + client: peer.clone(), + peers, + }) + .await; + } + + let (mut sender, mut receiver) = socket.split(); + + let mut send_task = tokio::spawn(async move { + while let Some(msg) = rx.recv().await { + let serialized = serde_json::to_string(&msg).unwrap(); + drop(msg); + + if sender.send(Message::Text(serialized.into())).await.is_err() { + break; + } + } + }); + + let tx_map_clone = tx_map.clone(); + let ip_group_clone = ip_group.clone(); + let mut recv_task = tokio::spawn(async move { + while let Some(Ok(msg)) = receiver.next().await { + if let Message::Text(text) = msg { + if let Ok(msg) = serde_json::from_str::(&text) { + if protect_ddos_request_count(&request_count_map, &ip_group_clone) + .await + .is_err() + { + let _ = tx + .send(WsServerMessage::Error { + code: StatusCode::TOO_MANY_REQUESTS.as_u16(), + }) + .await; + return; + } + + match msg { + WsClientMessage::Update { info } => { + send_update_to_other_peers_with_lock( + &tx_map_clone, + &ip_group_clone, + peer_id, + info, + ) + .await + } + WsClientMessage::Offer(sdp) => { + send_to_peer_with_lock( + &tx_map_clone, + &ip_group_clone, + peer.clone(), + WsClientSdpMessageWrapper::Offer(sdp), + ) + .await + } + WsClientMessage::Answer(sdp) => { + send_to_peer_with_lock( + &tx_map_clone, + &ip_group_clone, + peer.clone(), + WsClientSdpMessageWrapper::Answer(sdp), + ) + .await + } + } + } + } + } + }); + + // If any one of the tasks exit, abort the other. + tokio::select! { + rv_a = &mut send_task => { + match rv_a { + Ok(_) => (), + Err(e) => tracing::warn!("Error sending messages {e:?}") + } + recv_task.abort(); + }, + rv_b = &mut recv_task => { + match rv_b { + Ok(_) => (), + Err(e) => tracing::warn!("Error receiving messages {e:?}") + } + send_task.abort(); + } + } + + let mut remaining_tx: Vec> = Vec::new(); + + { + let mut tx_map = tx_map.lock().await; + let final_active_connections = match tx_map.get_mut(&ip_group) { + Some(tx_local_map) => { + tx_local_map.remove(&peer_id); + if tx_local_map.is_empty() { + tx_map.remove(&ip_group); + 0 + } else { + remaining_tx = tx_local_map.values().map(|p| p.tx.clone()).collect(); + tx_local_map.len() + } + } + None => 0, + }; + + tracing::info!("Disconnect: {peer_id} (active: {final_active_connections})"); + } + + for tx in remaining_tx { + let _ = tx.send(WsServerMessage::Left { peer_id }).await; + } +} + +async fn send_update_to_other_peers_with_lock( + tx_map: &TxMap, + ip_group: &str, + peer_id: Uuid, + info: ClientInfoWithoutId, +) { + // Tx of other peers in the IP group. + let mut peers_tx: Vec> = Vec::new(); + let response_info = ClientInfo::from(info.clone(), peer_id); + { + let mut tx_map = tx_map.lock().await; + if let Some(tx_local_map) = tx_map.get_mut(ip_group) { + if let Some(peer_state) = tx_local_map.get_mut(&peer_id) { + peer_state.client = info; + + peers_tx = tx_local_map + .iter() + .filter(|(k, _)| *k != &peer_id) + .map(|(_, v)| v.tx.clone()) + .collect(); + } + } + } + + for peer_tx in peers_tx { + let _ = peer_tx + .send(WsServerMessage::Update { + peer: response_info.clone(), + }) + .await; + } +} + +enum WsClientSdpMessageWrapper { + Offer(WsClientSdpMessage), + Answer(WsClientSdpMessage), +} + +async fn send_to_peer_with_lock( + tx_map: &TxMap, + ip_group: &str, + origin_peer: ClientInfo, + message: WsClientSdpMessageWrapper, +) { + let target = match &message { + WsClientSdpMessageWrapper::Offer(inner) => inner.target, + WsClientSdpMessageWrapper::Answer(inner) => inner.target, + }; + + let mut target_peer_tx: Option> = None; + { + let tx_map = tx_map.lock().await; + if let Some(tx_local_map) = tx_map.get(ip_group) { + if let Some(peer_state) = tx_local_map.get(&target) { + target_peer_tx = Some(peer_state.tx.clone()); + } + } + } + + if let Some(tx) = target_peer_tx { + let server_message = match message { + WsClientSdpMessageWrapper::Offer(inner) => { + let sdp_message = WsServerSdpMessage { + peer: origin_peer, + session_id: inner.session_id, + sdp: inner.sdp, + }; + WsServerMessage::Offer(sdp_message) + } + WsClientSdpMessageWrapper::Answer(inner) => { + let sdp_message = WsServerSdpMessage { + peer: origin_peer, + session_id: inner.session_id, + sdp: inner.sdp, + }; + WsServerMessage::Answer(sdp_message) + } + }; + + let _ = tx.send(server_message).await; + } +} + +async fn protect_ddos_request_count( + request_count_map: &IpRequestCountMap, + ip_group: &str, +) -> Result<(), AppError> { + let mut request_count_map = request_count_map.lock().await; + let count = request_count_map.entry(ip_group.to_string()).or_insert(0); + if *count >= *MAX_REQUESTS { + return Err(AppError::status(StatusCode::TOO_MANY_REQUESTS, None)); + } + *count += 1; + Ok(()) +} diff --git a/server/src/main.rs b/server/src/main.rs new file mode 100644 index 0000000..3efb369 --- /dev/null +++ b/server/src/main.rs @@ -0,0 +1,33 @@ +use crate::controller::ws_controller; +use axum::routing::get; +use axum::Router; +use std::net::SocketAddr; + +mod config; +mod controller; +mod util; + +#[tokio::main] +async fn main() { + let app_state = config::init::init().await; + + let app = configure_routes() + .with_state(app_state) + .into_make_service_with_connect_info::(); + + let server_ip = std::env::var("SERVER_IP").unwrap_or_else(|_| "0.0.0.0".to_string()); + let server_port = std::env::var("SERVER_PORT").unwrap_or_else(|_| "3000".to_string()); + let bind_address = format!("{server_ip}:{server_port}"); + + let listener = tokio::net::TcpListener::bind(bind_address.clone()) + .await + .unwrap(); + tracing::info!("Listening on http://{bind_address}"); + axum::serve(listener, app).await.unwrap(); +} + +#[rustfmt::skip] +fn configure_routes() -> Router { + Router::new() + .route("/v1/ws", get(ws_controller::ws_handler)) +} diff --git a/server/src/util/base64.rs b/server/src/util/base64.rs new file mode 100644 index 0000000..87eff34 --- /dev/null +++ b/server/src/util/base64.rs @@ -0,0 +1,9 @@ +use base64::engine::general_purpose::URL_SAFE_NO_PAD; +use base64::engine::GeneralPurpose; +use base64::{DecodeError, Engine}; + +const BASE_64_ENGINE: GeneralPurpose = URL_SAFE_NO_PAD; + +pub(crate) fn decode(data: &str) -> Result, DecodeError> { + BASE_64_ENGINE.decode(data) +} diff --git a/server/src/util/ip.rs b/server/src/util/ip.rs new file mode 100644 index 0000000..72e2320 --- /dev/null +++ b/server/src/util/ip.rs @@ -0,0 +1,40 @@ +use std::net::IpAddr; + +pub(crate) fn get_ip_group(ip: IpAddr) -> String { + match ip { + IpAddr::V4(ip) => { + // IPv4: Each IP address is already a group. + ip.to_string() + } + IpAddr::V6(ip) => { + // IPv6: We treat /64 as a group. + let segments = ip.segments(); + format!( + "{:x}:{:x}:{:x}:{:x}", + segments[0], segments[1], segments[2], segments[3] + ) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::str::FromStr; + + #[test] + fn test_get_ip_group() { + assert_eq!( + get_ip_group(IpAddr::from_str("1.2.3.4").unwrap()), + "1.2.3.4" + ); + assert_eq!( + get_ip_group(IpAddr::from_str("1:2:3:4:5:6:7:8").unwrap()), + "1:2:3:4" + ); + assert_eq!( + get_ip_group(IpAddr::from_str("a:b:c:d:e:f:0:1").unwrap()), + "a:b:c:d" + ); + } +} diff --git a/server/src/util/mod.rs b/server/src/util/mod.rs new file mode 100644 index 0000000..979cac3 --- /dev/null +++ b/server/src/util/mod.rs @@ -0,0 +1,2 @@ +pub(crate) mod base64; +pub(crate) mod ip;

    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

    ap|8Rcka~0`T!9yY=0Dlo^W$a|7(0|3hY?wDWN6 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�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%0A40WVp;ZIg)5y+`h=nyoJu%T>Qpr{uIi3fB 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