Compare commits

..

1 Commits

Author SHA1 Message Date
Neeraj Gupta
31057cbe9e [server] Handle mobile flag 2025-08-20 14:51:30 +05:30
465 changed files with 72706 additions and 10133 deletions

View File

@@ -8,7 +8,7 @@ on:
env:
FLUTTER_VERSION: "3.32.8"
RUST_VERSION: "1.86.0"
RUST_VERSION: "1.85.1"
permissions:
contents: read
@@ -39,12 +39,14 @@ jobs:
flutter-version: ${{ env.FLUTTER_VERSION }}
cache: true
- name: Install Rust ${{ env.RUST_VERSION }}
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_VERSION }}
- name: Install Flutter Rust Bridge
run: cargo install flutter_rust_bridge_codegen
- name: Generate Rust bindings
run: flutter_rust_bridge_codegen generate
- name: Increment version code for build
run: |
CURRENT_VERSION=$(grep '^version:' pubspec.yaml | sed 's/version: //')

View File

@@ -0,0 +1,77 @@
name: "Old Internal release (photos)"
on:
workflow_dispatch: # Allow manually running the action
env:
FLUTTER_VERSION: "3.32.8"
RUST_VERSION: "1.85.1"
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
defaults:
run:
working-directory: mobile/apps/photos
steps:
- name: Checkout code and submodules
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup JDK 17
uses: actions/setup-java@v1
with:
java-version: 17
- name: Install Flutter ${{ env.FLUTTER_VERSION }}
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
cache: true
- name: Install Rust ${{ env.RUST_VERSION }}
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_VERSION }}
- name: Install Flutter Rust Bridge
run: cargo install flutter_rust_bridge_codegen
- name: Setup keys
uses: timheuer/base64-to-file@v1
with:
fileName: "keystore/ente_photos_key.jks"
encodedString: ${{ secrets.SIGNING_KEY_PHOTOS }}
- name: Build PlayStore AAB
run: |
flutter build appbundle --dart-define=cronetHttpNoPlay=true --release --flavor playstore
env:
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_photos_key.jks"
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS_PHOTOS }}
SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD_PHOTOS }}
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD_PHOTOS }}
- name: Upload AAB to PlayStore
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
packageName: io.ente.photos
releaseFiles: mobile/apps/photos/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
track: internal
- name: Notify Discord
uses: sarisia/actions-status-discord@v1
with:
webhook: ${{ secrets.DISCORD_INTERNAL_RELEASE_WEBHOOK }}
nodetail: true
title: "🏆 Internal release Photos (Branch: ${{ github.ref_name }})"
description: "[Download](https://play.google.com/store/apps/details?id=io.ente.photos)"
color: 0x00ff00

View File

@@ -9,7 +9,6 @@ on:
env:
FLUTTER_VERSION: "3.32.8"
RUST_VERSION: "1.86.0"
permissions:
contents: read
@@ -32,18 +31,7 @@ jobs:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
cache: true
- run: flutter pub get
- name: Install Rust ${{ env.RUST_VERSION }}
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_VERSION }}
- name: Install Flutter Rust Bridge
run: cargo install flutter_rust_bridge_codegen
- name: Generate Rust bindings
run: flutter_rust_bridge_codegen generate
- run: flutter analyze --no-fatal-infos

View File

@@ -2,8 +2,6 @@
## v1.7.15 (Unreleased)
- Custom domains.
- Support Czech translations.
- .
## v1.7.14

View File

@@ -8,12 +8,6 @@ description: Guide to configuring Ente CLI for Self Hosted Instance
If you are self-hosting, you can configure Ente CLI to export data & perform
basic administrative actions.
::: tip Installing Ente CLI
For instructions on installing the Ente CLI, see the [README available on Github](https://github.com/ente-io/ente/tree/main/cli/README.md).
:::
## Step 1: Configure endpoint
To do this, first configure the CLI to use your server's endpoint.

View File

@@ -22,7 +22,8 @@ can achieve this the following steps:
# Change the DB name and DB user name if you use different
# values.
# If using Docker
docker exec -it <postgres-ente-container-name> sh
docker exec -it <postgres-ente-container-name>
psql -U pguser -d ente_db
# Or when using psql directly

View File

@@ -46,7 +46,7 @@ If running Museum without Docker, the code should be visible in the terminal
# Change the DB name and DB user name if you use different
# values.
# If using Docker docker exec -it <postgres-ente-container-name> sh
# If using Docker docker exec -it <postgres-ente-container-name>
psql -U pguser -d ente_db
# Or when using psql directly

45
mobile/.gitignore vendored
View File

@@ -1,45 +0,0 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
melos_*.iml
# 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/
# 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

View File

@@ -1,72 +0,0 @@
# For more linters, we can check https://dart-lang.github.io/linter/lints/index.html
# or https://pub.dev/packages/lint (Effective dart)
# use "flutter analyze ." or "dart analyze ." for running lint checks
include: package:flutter_lints/flutter.yaml
linter:
rules:
# Ref https://github.com/flutter/packages/blob/master/packages/flutter_lints/lib/flutter.yaml
# Ref https://dart-lang.github.io/linter/lints/
- avoid_print
- avoid_unnecessary_containers
- avoid_web_libraries_in_flutter
- no_logic_in_create_state
- prefer_const_constructors
- prefer_const_constructors_in_immutables
- prefer_const_declarations
- prefer_const_literals_to_create_immutables
- prefer_final_locals
- require_trailing_commas
- sized_box_for_whitespace
- use_full_hex_values_for_flutter_colors
- use_key_in_widget_constructors
- cancel_subscriptions
- avoid_empty_else
- exhaustive_cases
# just style suggestions
- sort_pub_dependencies
- use_rethrow_when_possible
- prefer_double_quotes
- directives_ordering
- always_use_package_imports
- sort_child_properties_last
- unawaited_futures
analyzer:
errors:
avoid_empty_else: error
exhaustive_cases: error
curly_braces_in_flow_control_structures: error
directives_ordering: error
require_trailing_commas: error
always_use_package_imports: warning
prefer_final_fields: error
unused_import: error
camel_case_types: error
prefer_is_empty: warning
use_rethrow_when_possible: info
unused_field: warning
use_key_in_widget_constructors: warning
sort_child_properties_last: warning
sort_pub_dependencies: warning
library_private_types_in_public_api: warning
constant_identifier_names: ignore
prefer_const_constructors: warning
prefer_const_declarations: warning
prefer_const_constructors_in_immutables: warning
prefer_final_locals: warning
unnecessary_const: error
cancel_subscriptions: error
unrelated_type_equality_checks: error
unnecessary_cast: info
unawaited_futures: warning # convert to warning after fixing existing issues
invalid_dependency: info
use_build_context_synchronously: ignore # experimental lint, requires many changes
prefer_interpolation_to_compose_strings: ignore # later too many warnings
prefer_double_quotes: ignore # too many warnings
avoid_renaming_method_parameters: ignore # incorrect warnings for `equals` overrides

View File

@@ -382,11 +382,6 @@
{
"title": "CoinDCX"
},
{
"title": "CoinTracking",
"slug": "cointracking",
"altNames": ["cointracking.info", "Coin Tracking"]
},
{
"title": "colorado",
"altNames": [
@@ -740,11 +735,6 @@
{
"title": "Hivelocity"
},
{
"title": "HRDocumentBox",
"slug": "hrdocumentbox",
"altNames": ["HRDocumentBox", "HR Document Box"]
},
{
"title": "HSA Bank",
"slug": "hsa_bank",
@@ -1050,13 +1040,6 @@
"MistralAI"
]
},
{
"title": "Mobile01",
"slug": "mobile01",
"altNames": [
"M01"
]
},
{
"title": "Mozilla"
},
@@ -1790,11 +1773,6 @@
"uollet.com.br"
]
},
{
"title": "VHV",
"slug": "vhv",
"altNames": ["VHV", "VHV Versicherung"]
},
{
"title": "Vikunja"
},

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1220.8 227.9" style="enable-background:new 0 0 1220.8 227.9;" xml:space="preserve">
<style type="text/css">
.st0{fill:#0D253E;}
.st1{fill:#008AFB;}
</style>
<title>CoinTracking light</title>
<g id="Layer_2_1_">
<g id="Layer_1-2">
<path class="st0" d="M198.1,167c-30.2,0-54.7-24.5-54.7-54.7s24.5-54.7,54.7-54.7s54.7,24.5,54.7,54.7l0,0 C252.8,142.5,228.3,167,198.1,167z M198.1,81.6c-17,0-30.7,13.7-30.7,30.7s13.7,30.7,30.7,30.7s30.7-13.7,30.7-30.7l0,0 C228.8,95.4,215,81.6,198.1,81.6z"/>
<path class="st0" d="M292.2,59.5h-23.6v107.9h23.6V59.5z"/>
<path class="st0" d="M339.5,167.4h-23.8V59.5h23.8v16.2c6.2-12.5,21-18.5,33-18.5c26.1,0,41.1,16.9,41.1,47.3v62.8h-23.8v-60.1 c0-17.1-8.8-26.8-22.6-26.8c-14.1,0-27.7,7.6-27.7,28.9V167.4z"/>
<path class="st1" d="M390.6,8.2h151.7v22.9h-65.9v136.3h-25V31.1h-60.9V8.2H390.6z"/>
<path class="st1" d="M540.3,167.4h-23.8V59.5h23.8V79c7.4-13.5,15.4-19.5,29.6-21.8c7.5-1.2,15.7,1.8,19.2,4.2l-3.9,22 c-4.9-2.5-10.4-3.8-15.9-3.7c-20.3,0-28.9,20.3-28.9,49L540.3,167.4L540.3,167.4z"/>
<path class="st1" d="M680.7,151.9c-7.2,11.8-22.9,17.8-36.3,17.8c-29.1,0-54.8-21.9-54.8-56.4s25.6-56.1,54.8-56.1 c12.9,0,28.9,5.3,36.3,17.5V59.5h23.6v107.9h-23.6V151.9z M647.2,146.6c17.6,0,33.3-12.2,33.3-33.5s-17.1-32.8-33.3-32.8 c-18,0-33,12.9-33,32.8S629.2,146.6,647.2,146.6L647.2,146.6z"/>
<path class="st1" d="M778.4,57.2c17.1,0,32.6,6.7,42.7,18.7l-18.5,14.8c-5.8-6.7-14.8-10.4-24.3-10.4c-18,0-34,12.7-34,32.8 s15.9,33.7,34,33.7c9.5,0,18.5-3.9,24.3-10.6l18.7,14.6c-10.2,12-25.6,18.9-43,18.9c-31,0-57.5-22.4-57.5-56.6 S747.4,57.2,778.4,57.2z"/>
<path class="st1" d="M860.3,117.2v50.1h-23.6V0.8h23.6V95l34.2-35.6h31.9l-46,46.9l56.4,61h-30.5L860.3,117.2z"/>
<path class="st1" d="M967.4,59.5h-23.6v107.9h23.6V59.5z"/>
<path class="st1" d="M1014.7,167.4h-23.8V59.5h23.8v16.2c6.2-12.5,21-18.5,33-18.5c26.1,0,41.1,16.9,41.1,47.3v62.8H1065v-60.1 c0-17.1-8.8-26.8-22.6-26.8c-14.1,0-27.7,7.6-27.7,28.9V167.4z"/>
<path class="st1" d="M1220.2,111.5c0-12.3-4.5-24.2-12.5-33.6l13-17.1l-19.6-13l-11.9,15.7c-8.3-4.1-17.5-6.2-26.8-6.2 c-31.9,0-57.8,24.4-57.8,54.3s25.9,54.3,57.8,54.3c20.2,0,34.2,10.2,34.2,19.3s-14.1,19.3-34.2,19.3s-34.2-10.2-34.2-19.3h-23.6 c0,24,25.4,42.9,57.8,42.9s57.8-18.8,57.8-42.9c0-13.2-7.7-24.8-19.9-32.6C1212.5,142.5,1220.2,127.8,1220.2,111.5z M1128.2,111.5 c0-16.9,15.4-30.7,34.2-30.7s34.2,13.8,34.2,30.7s-15.4,30.7-34.2,30.7S1128.2,128.4,1128.2,111.5L1128.2,111.5z"/>
<path class="st0" d="M81.4,170.5C36.4,170.5,0,134,0,89c0-21.6,8.6-42.3,23.9-57.6c31.8-31.8,83.4-31.8,115.2,0l0,0l-17.7,17.7 C99.3,27,63.6,27,41.5,49.1s-22.1,57.8,0,79.9s57.8,22.1,79.9,0l17.7,17.7C123.8,162,103.1,170.6,81.4,170.5z"/>
<circle class="st0" cx="280.7" cy="15.5" r="15.5"/>
<circle class="st1" cx="954.7" cy="15.5" r="15.5"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -1,26 +0,0 @@
<?xml version="1.0"?>
<svg width="320" height="280" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1">
<g class="layer">
<title>Layer 1</title>
<g id="Layer1000">
<g id="Layer1002">
<g id="Layer1003">
<path d="m123.08,34.29c-66.43,0 -120.27,53.85 -120.27,120.27c0,66.43 53.85,120.27 120.27,120.27c66.47,0 120.32,-53.85 120.32,-120.27c0,-66.43 -53.85,-120.27 -120.32,-120.27zm0,215.67c-52.67,0 -95.36,-42.73 -95.36,-95.4c0,-52.67 42.68,-95.4 95.36,-95.4c52.72,0 95.4,42.73 95.4,95.4c0,52.67 -42.68,95.4 -95.4,95.4z" fill="#2a5e00" fill-rule="evenodd" id="path7"/>
<g id="Layer1004">
<g id="Layer1005">
<path d="m138.72,146.29l59.61,-41.47l7.78,33.7l-67.39,7.78z" fill="#2a5e00" fill-rule="evenodd" id="path8"/>
<path d="m110.88,146.29l-59.61,-41.47l-7.78,33.7l67.39,7.78z" fill="#2a5e00" fill-rule="evenodd" id="path9"/>
</g>
<path d="m43.95,192.02l74.62,49.75l87.12,-78.8l-161.75,29.05z" fill="#2a5e00" fill-rule="evenodd" id="path10"/>
</g>
<path d="m94.24,59.29l-30.48,-55.1l54.26,33.24l-23.79,21.86z" fill="#2a5e00" fill-rule="evenodd" id="path11"/>
<path d="m202.64,78.1l30.43,-55.1l-54.22,33.24l23.79,21.86z" fill="#2a5e00" fill-rule="evenodd" id="path12"/>
</g>
<path d="m275.63,274.67l29.35,0l0,-240.76l-29.35,0l0,240.76z" fill="#2a5e00" fill-rule="evenodd" id="path13"/>
<path d="m317.94,125.93c0,15.3 -12.33,27.63 -27.63,27.63c-15.26,0 -27.63,-12.33 -27.63,-27.63c0,-15.26 12.37,-27.63 27.63,-27.63c15.3,0 27.63,12.37 27.63,27.63z" fill="#2a5e00" fill-rule="evenodd" id="path14"/>
<path d="m288.84,33.91l-41.76,0l16.76,45.99l23.58,0l1.42,-45.99z" fill="#2a5e00" fill-rule="evenodd" id="path15"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Created with Inkscape (http://www.inkscape.org/) by Marsupilami -->
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="1024" height="357" viewBox="-1.98252 -1.98252 201.02104 70.04904" id="svg3349">
<defs id="defs3351"/>
<path d="m 0,0 11.76,0 4.455,31.962 0.12,0 L 20.789,0 32.55,0 23.402,42.417 9.147,42.417 0,0" id="path3131" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 34.039,0 11.05,0 0,15.567 6.771,0 0,-15.567 11.05,0 0,42.417 -11.05,0 0,-17.465 -6.771,0 0,17.465 -11.05,0 0,-42.417" id="path3133" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 64.395,0 11.757,0 4.457,31.962 0.121,0 L 85.185,0 96.944,0 87.797,42.417 73.54,42.417 64.395,0" id="path3135" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 97.576,42.414 8.907,0 9.222,-42.41 -8.912,0 -9.217,42.41" id="path3137" style="fill:#f0ab00;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 111.026,42.424 8.908,-0.01 9.218,-42.41 -8.913,0 -9.213,42.42" id="path3139" style="fill:#f0ab00;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 124.564,42.414 8.906,0 9.217,-42.41 -8.906,0 -9.217,42.41" id="path3141" style="fill:#f0ab00;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 4.169,46.784 5.251,0 1.985,14.261 0.05,0 1.99,-14.261 5.247,0 -4.082,18.928 -6.363,0 -4.082,-18.928" id="path3143" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 19.356,46.784 11.216,0 0,4.031 -6.282,0 0,3.234 5.882,0 0,3.87 -5.882,0 0,3.763 6.517,0 0,4.03 -11.451,0 0,-18.928" id="path3145" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 54.93,52.247 0,-0.45 c 0,-1.117 -0.449,-2.043 -1.405,-2.043 -1.06,0 -1.538,0.823 -1.538,1.67 0,3.739 8.059,1.91 8.059,8.828 0,4.027 -2.357,5.832 -6.705,5.832 -4.082,0 -6.362,-1.404 -6.362,-5.331 l 0,-0.663 4.772,0 0,0.453 c 0,1.615 0.663,2.202 1.614,2.202 1.007,0 1.594,-0.798 1.594,-1.831 0,-3.739 -7.743,-1.88 -7.743,-8.586 0,-3.819 2.043,-5.913 6.205,-5.913 4.294,0 6.12,1.775 6.12,5.832 l -4.611,0" id="path3147" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 61.476,65.712 4.932,0 0,-18.928 -4.932,0 0,18.928 z" id="path3149" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 32.477,46.784 7.714,0 c 3.766,0 5.195,2.124 5.195,5.039 0,2.516 -0.979,4.16 -3.232,4.506 2.385,0.265 3.103,1.776 3.103,4.294 l 0,1.616 c 0,0.981 0,2.251 0.237,2.626 0.132,0.209 0.237,0.422 0.558,0.582 l 0,0.265 -5.25,0 C 40.325,64.705 40.325,62.9 40.325,62.109 l 0,-1.275 c 0,-2.147 -0.423,-2.704 -1.619,-2.704 l -1.296,0 0,7.582 -4.933,0 0,-18.928 z m 4.933,8.008 0.98,0 c 1.405,0 2.066,-0.9 2.066,-2.252 0,-1.541 -0.609,-2.202 -2.094,-2.202 l -0.952,0 0,4.454" id="path3151" style="fill:#1e1e1e;fill-opacity:1;fill-rule:evenodd;stroke:none"/>
<path d="m 75.975,52.54 c 0,-2.147 -0.396,-2.786 -1.35,-2.786 -1.513,0 -1.67,1.381 -1.67,6.494 0,5.117 0.157,6.497 1.67,6.497 1.22,0 1.485,-1.063 1.485,-4.64 l 4.771,0 0,1.405 c 0,5.3 -3.101,6.574 -6.256,6.574 -5.54,0 -6.76,-2.784 -6.76,-9.836 0,-7.236 1.642,-9.833 6.76,-9.833 4.451,0 6.12,2.334 6.12,5.992 l 0,1.19 -4.77,0 0,-1.057" id="path3153" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 82.524,46.784 4.928,0 0,6.948 3.02,0 0,-6.948 4.932,0 0,18.928 -4.932,0 0,-7.793 -3.02,0 0,7.793 -4.928,0 0,-18.928" id="path3155" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 97.606,46.784 11.21,0 0,4.031 -6.282,0 0,3.234 5.886,0 0,3.87 -5.886,0 0,3.763 6.522,0 0,4.03 -11.45,0 0,-18.928" id="path3157" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 130.526,46.784 0,13.655 c 0,1.824 0.559,2.306 1.485,2.306 0.928,0 1.485,-0.482 1.485,-2.306 l 0,-13.655 4.929,0 0,12.408 c 0,5.298 -2.28,6.892 -6.414,6.892 -4.135,0 -6.412,-1.594 -6.412,-6.892 l 0,-12.408 4.927,0" id="path3159" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 140.415,46.784 5.51,0 3.185,11.665 0.05,0 0,-11.665 4.614,0 0,18.928 -5.407,0 -3.288,-11.689 -0.05,0 0,11.689 -4.613,0 0,-18.928" id="path3161" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 110.726,46.784 7.716,0 c 3.76,0 5.192,2.124 5.192,5.039 0,2.516 -0.979,4.16 -3.234,4.506 2.383,0.265 3.101,1.776 3.101,4.294 l 0,1.616 c 0,0.981 0,2.251 0.238,2.626 0.131,0.209 0.24,0.422 0.558,0.582 l 0,0.265 -5.251,0 c -0.477,-1.007 -0.477,-2.812 -0.477,-3.603 l 0,-1.275 c 0,-2.147 -0.422,-2.704 -1.612,-2.704 l -1.301,0 0,7.582 -4.93,0 0,-18.928 z m 4.93,8.008 0.979,0 c 1.404,0 2.07,-0.9 2.07,-2.252 0,-1.541 -0.61,-2.202 -2.095,-2.202 l -0.954,0 0,4.454" id="path3163" style="fill:#1e1e1e;fill-opacity:1;fill-rule:evenodd;stroke:none"/>
<path d="m 162.334,55.428 6.361,0 0,10.284 -3.34,0 -0.113,-1.669 -0.05,0 c -0.662,1.617 -2.412,2.041 -4.082,2.041 -5.01,0 -5.459,-3.58 -5.459,-9.836 0,-6.336 1.22,-9.833 7.047,-9.833 3.502,0 5.993,1.775 5.993,6.36 l -4.771,0 c 0,-0.952 -0.07,-1.695 -0.266,-2.198 -0.185,-0.53 -0.554,-0.823 -1.139,-0.823 -1.612,0 -1.774,1.381 -1.774,6.494 0,5.117 0.161,6.497 1.67,6.497 1.034,0 1.639,-0.666 1.669,-3.978 l -1.75,0 0,-3.339" id="path3165" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 170.577,46.784 11.213,0 0,4.031 -6.28,0 0,3.234 5.885,0 0,3.87 -5.885,0 0,3.763 6.519,0 0,4.03 -11.452,0 0,-18.928" id="path3167" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<path d="m 183.697,46.784 5.514,0 3.18,11.665 0.05,0 0,-11.665 4.615,0 0,18.928 -5.408,0 -3.284,-11.689 -0.05,0 0,11.689 -4.614,0 0,-18.928" id="path3169" style="fill:#1e1e1e;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
</svg>
<!-- version: 20110311, original size: 197.056 66.084, border: 3% -->

Before

Width:  |  Height:  |  Size: 5.9 KiB

View File

@@ -39,8 +39,6 @@ PODS:
- DKPhotoGallery/Resource (0.0.19):
- SDWebImage
- SwiftyGif
- ente_qr (0.0.1):
- Flutter
- file_picker (0.0.1):
- DKImagePickerController/PhotoGallery
- Flutter
@@ -128,8 +126,6 @@ PODS:
- sqlite3/perf-threadsafe
- sqlite3/rtree
- SwiftyGif (5.4.5)
- ua_client_hints (1.4.1):
- Flutter
- url_launcher_ios (0.0.1):
- Flutter
@@ -138,7 +134,6 @@ DEPENDENCIES:
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
- cupertino_http (from `.symlinks/plugins/cupertino_http/darwin`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- ente_qr (from `.symlinks/plugins/ente_qr/ios`)
- file_picker (from `.symlinks/plugins/file_picker/ios`)
- file_saver (from `.symlinks/plugins/file_saver/ios`)
- fk_user_agent (from `.symlinks/plugins/fk_user_agent/ios`)
@@ -163,7 +158,6 @@ DEPENDENCIES:
- sodium_libs (from `.symlinks/plugins/sodium_libs/ios`)
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
- sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/darwin`)
- ua_client_hints (from `.symlinks/plugins/ua_client_hints/ios`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
SPEC REPOS:
@@ -186,8 +180,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/cupertino_http/darwin"
device_info_plus:
:path: ".symlinks/plugins/device_info_plus/ios"
ente_qr:
:path: ".symlinks/plugins/ente_qr/ios"
file_picker:
:path: ".symlinks/plugins/file_picker/ios"
file_saver:
@@ -236,8 +228,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/sqflite_darwin/darwin"
sqlite3_flutter_libs:
:path: ".symlinks/plugins/sqlite3_flutter_libs/darwin"
ua_client_hints:
:path: ".symlinks/plugins/ua_client_hints/ios"
url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios"
@@ -248,7 +238,6 @@ SPEC CHECKSUMS:
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
ente_qr: f39434aa69ea0e71047b49316365b2737f8a20aa
file_picker: b159e0c068aef54932bb15dc9fd1571818edaf49
file_saver: 503e386464dbe118f630e17b4c2e1190fa0cf808
fk_user_agent: 1f47ec39291e8372b1d692b50084b0d54103c545
@@ -279,7 +268,6 @@ SPEC CHECKSUMS:
sqlite3: 3e82a2daae39ba3b41ae6ee84a130494585460fc
sqlite3_flutter_libs: 2c48c4ee7217fd653251975e43412250d5bcbbe2
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
ua_client_hints: aeabd123262c087f0ce151ef96fa3ab77bfc8b38
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
PODFILE CHECKSUM: 78f002751f1a8f65042b8da97902ba4124271c5a

View File

@@ -111,7 +111,6 @@
"importAegisGuide": "Použijte možnost \"Export the vault\" v nastavení aplikace Aegis.",
"import2FasGuide": "Použijte možnost \"Settings->Backup -Export\" v 2FA.\n\nPokud je Vaše záloha šifrovaná, budete muset zadat heslo pro její odemčení",
"importLastpassGuide": "V nastavení aplikace Lastpass Authenticator vyberte možnost \"Transfer accounts\" a poté \"Export accounts to file\". Vygenerovaný soubor JSON následně nahrajte sem.",
"importProtonAuthGuide": "K exportu kódů použijte možnost „Exportovat“ v nastavení aplikace Proton Authenticator.",
"exportCodes": "Exportovat kódy",
"importLabel": "Importovat",
"importInstruction": "Vyberte, prosím, soubor obsahující seznam Vašich kódů v následujícím formátu",
@@ -125,7 +124,6 @@
"authToChangeYourEmail": "Pro změnu svého e-mailu se, prosím, ověřte",
"authToChangeYourPassword": "Pro změnu svého hesla se, prosím, ověřte",
"authToViewSecrets": "Pro zobrazení svých tajných údajů se musíte ověřit",
"authToInitiateSignIn": "Proveďte ověření a přihlaste se k zálohování.",
"ok": "Ok",
"cancel": "Zrušit",
"yes": "Ano",
@@ -173,7 +171,6 @@
"invalidQRCode": "Neplatný QR kód",
"noRecoveryKeyTitle": "Nemáte obnovovací klíč?",
"enterEmailHint": "Zadejte svou e-mailovou adresu",
"enterNewEmailHint": "Zadejte svou novou e-mailovou adresu",
"invalidEmailTitle": "Neplatná e-mailová adresa",
"invalidEmailMessage": "Prosím, zadejte platnou e-mailovou adresu.",
"deleteAccount": "Odstranit účet",
@@ -512,19 +509,6 @@
"supportEnte": "Podpořte <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Dejte nám hvězdu na Githubu",
"free5GB": "5GB zdarma na <bold-green>ente</bold-green> Fotky",
"loginWithAuthAccount": "Přihlaste se pomocí svého účtu Auth",
"freeStorageOffer": "10% sleva na <bold-green>ente</bold-green> fotky",
"freeStorageOfferDescription": "Použijte kód \"AUTH\" pro získání 10% slevy na první rok",
"advanced": "Pokročilé",
"algorithm": "Algoritmus",
"type": "Typ",
"period": "Období",
"digits": "Digitální",
"importFromGallery": "Importovat z galerie",
"errorCouldNotReadImage": "Nelze přečíst vybraný obrazový soubor.",
"errorInvalidQRCode": "Neplatný QR kód",
"errorInvalidQRCodeBody": "Naskenovaný QR kód není platným účtem 2FA.",
"errorNoQRCode": "Nenalezen žádný QR kód",
"errorGenericTitle": "Došlo k chybě",
"errorGenericBody": "Při importu došlo k neočekávané chybě."
"freeStorageOfferDescription": "Použijte kód \"AUTH\" pro získání 10% slevy na první rok"
}

View File

@@ -111,7 +111,6 @@
"importAegisGuide": "Verwenden Sie die Option \"Tresor exportieren\" in den Einstellungen von Aegis.\n\nFalls Ihr Tresor verschlüsselt ist, müssen Sie das Passwort für den Tresor eingeben, um ihn zu entschlüsseln.",
"import2FasGuide": "Verwenden Sie unter \"Einstellungen → Backup\" die Option \"Exportieren\" in 2FAS.\n\nFalls Ihr Backup verschlüsselt ist, müssen Sie das Passwort eingeben, um das Backup zu entschlüsseln.",
"importLastpassGuide": "Verwenden Sie die Option \"Konten übertragen → Konten in Datei exportieren\" in den Lastpass Authenticator Einstellungen. \nImportieren Sie anschließend die heruntergeladene JSON-Datei.",
"importProtonAuthGuide": "Verwenden Sie die Option \"Exportieren\" in den Proton Authenticator Settings um Ihre Codes zu exportieren.",
"exportCodes": "Codes exportieren",
"importLabel": "Importieren",
"importInstruction": "Bitte wählen Sie eine Datei die Codes in folgendem Format beinhaltet",
@@ -520,12 +519,5 @@
"algorithm": "Algorithmus",
"type": "Typ",
"period": "Periode",
"digits": "Ziffern",
"importFromGallery": "Aus Galerie importieren",
"errorCouldNotReadImage": "Die ausgewählte Bild-Datei konnte nicht verarbeitet werden.",
"errorInvalidQRCode": "Ungültiger QR-Code",
"errorInvalidQRCodeBody": "Der gescannte QR-Code ist kein gültiges 2FA-Konto.",
"errorNoQRCode": "Kein QR-Code gefunden",
"errorGenericTitle": "Ein Fehler ist aufgetreten",
"errorGenericBody": "Beim Importieren ist ein unerwarteter Fehler aufgetreten."
"digits": "Ziffern"
}

View File

@@ -111,7 +111,6 @@
"importAegisGuide": "Use the \"Export the vault\" option in Aegis's Settings.\n\nIf your vault is encrypted, you will need to enter vault password to decrypt the vault.",
"import2FasGuide": "Use the \"Settings->Backup -Export\" option in 2FAS.\n\nIf your backup is encrypted, you will need to enter the password to decrypt the backup",
"importLastpassGuide": "Use the \"Transfer accounts\" option within Lastpass Authenticator Settings and press \"Export accounts to file\". Import the JSON downloaded.",
"importProtonAuthGuide": "Use the \"Export\" option in Proton Authenticator Settings to export your codes.",
"exportCodes": "Export codes",
"importLabel": "Import",
"importInstruction": "Please select a file that contains a list of your codes in the following format",
@@ -520,12 +519,5 @@
"algorithm": "Algorithm",
"type": "Type",
"period": "Period",
"digits": "Digits",
"importFromGallery": "Import from gallery",
"errorCouldNotReadImage": "Could not read the selected image file.",
"errorInvalidQRCode": "Invalid QR Code",
"errorInvalidQRCodeBody": "The scanned QR code is not a valid 2FA account.",
"errorNoQRCode": "No QR code found",
"errorGenericTitle": "An Error Occurred",
"errorGenericBody": "An unexpected error occurred while importing."
"digits": "Digits"
}

View File

@@ -111,7 +111,6 @@
"importAegisGuide": "Utilisez l'option \"Exporter le coffre-fort\" dans les paramètres d'Aegis.\n\nSi votre coffre-fort est crypté, vous devrez saisir le mot de passe du coffre-fort pour déchiffrer le coffre-fort.",
"import2FasGuide": "Utilisez l'option \"Paramètres->Sauvegarde -Export\" dans 2FAS.\n\nSi votre sauvegarde est chiffrée, vous devrez entrer le mot de passe pour déchiffrer la sauvegarde",
"importLastpassGuide": "Utilisez l'option \"Transférer des comptes\" dans les paramètres de l'authentificateur Lastpass et appuyez sur \"Exporter des comptes vers un fichier\". Importez le JSON téléchargé.",
"importProtonAuthGuide": "Utilisez l'option \"Export\" dans les paramètres de Proton Authenticator pour exporter vos codes.",
"exportCodes": "Exporter les codes",
"importLabel": "Importer",
"importInstruction": "Veuillez sélectionner un fichier qui contient une liste de vos codes dans le format suivant",
@@ -520,12 +519,5 @@
"algorithm": "Algorithme",
"type": "Type",
"period": "Période",
"digits": "Chiffres",
"importFromGallery": "Importer depuis la galerie",
"errorCouldNotReadImage": "Impossible de lire le fichier sélectionné.",
"errorInvalidQRCode": "QR Code invalide",
"errorInvalidQRCodeBody": "Le code QR scanné n'est pas un compte 2FA valide.",
"errorNoQRCode": "Aucun code QR trouvé",
"errorGenericTitle": "Une erreur s'est produite",
"errorGenericBody": "Une erreur inattendue est survenue lors de l'importation."
"digits": "Chiffres"
}

View File

@@ -111,7 +111,6 @@
"importAegisGuide": "Naudokite „Aegis“ nustatymuose esančią parinktį Eksportuoti slėptuvę.\n\nJei jūsų saugykla užšifruota, turėsite įvesti saugyklos slaptažodį, kad iššifruotumėte saugyklą.",
"import2FasGuide": "Naudokite programoje 2FAS esančią parinktį „Settings->2FAS Backup->Export to file“.\n\nJei atsarginė kopija užšifruota, turėsite įvesti slaptažodį, kad iššifruotumėte atsarginę kopiją.",
"importLastpassGuide": "Naudokite „Lastpass Authenticator“ nustatymuose esančią parinktį „Transfer accounts“ (perkelti paskyras) ir paspauskite „Export accounts to file“ (eksportuoti paskyras į failą). Importuokite atsisiųstą JSON failą.",
"importProtonAuthGuide": "Naudokite „Proton Authenticator“ nustatymuose esančią parinktį „Export“ (eksportuoti), kad eksportuotumėte savo kodus.",
"exportCodes": "Eksportuoti kodus",
"importLabel": "Importuoti",
"importInstruction": "Pasirinkite failą, kuriame yra tokio formato jūsų kodų sąrašas",
@@ -520,12 +519,5 @@
"algorithm": "Algoritmas",
"type": "Tipas",
"period": "Laikotarpis",
"digits": "Skaitmenys",
"importFromGallery": "Importuoti iš galerijos",
"errorCouldNotReadImage": "Nepavyko perskaityti pasirinkto vaizdo failo.",
"errorInvalidQRCode": "Netinkamas QR kodas",
"errorInvalidQRCodeBody": "Nuskenuotas QR kodas nėra tinkama 2FA paskyra.",
"errorNoQRCode": "QR kodas nerastas.",
"errorGenericTitle": "Įvyko klaida",
"errorGenericBody": "Importuojant įvyko netikėta klaida."
"digits": "Skaitmenys"
}

View File

@@ -111,7 +111,6 @@
"importAegisGuide": "Użyj opcji \"Eksportuj sejf\" w ustawieniach Aegis.\n\nJeśli twój sejf jest zaszyfrowany, musisz wprowadzić hasło sejfu, aby odszyfrować sejf.",
"import2FasGuide": "Użyj opcji \"Ustawienia->Kopia Zapasowa-Eksport\" w 2FAS.\n\nJeśli twoja kopia zapasowa jest zaszyfrowana, musisz wprowadzić hasło, aby odszyfrować kopię zapasową",
"importLastpassGuide": "Użyj opcji \"Przenieś konta\" w Ustawieniach Lastpass Authenticator i naciśnij \"Eksportuj konta do pliku\". Zaimportuj pobrany plik JSON.",
"importProtonAuthGuide": "Użyj opcji „Eksportuj” w ustawieniach Proton Authenticator, aby wyeksportować kody.",
"exportCodes": "Eksportuj kody",
"importLabel": "Importuj",
"importInstruction": "Wybierz plik, który zawiera listę twoich kodów w następującym formacie",
@@ -520,12 +519,5 @@
"algorithm": "Algorytm",
"type": "Rodzaj",
"period": "Okres",
"digits": "Cyfry",
"importFromGallery": "Importuj z galerii",
"errorCouldNotReadImage": "Nie można odczytać wybranego pliku obrazu.",
"errorInvalidQRCode": "Nieprawidłowy kod QR",
"errorInvalidQRCodeBody": "Zeskanowany kod QR nie wskazuje na prawidłowe konto 2FA.",
"errorNoQRCode": "Nie znaleziono kodu QR",
"errorGenericTitle": "Wystąpił błąd",
"errorGenericBody": "Podczas importowania wystąpił nieoczekiwany błąd."
"digits": "Cyfry"
}

View File

@@ -18,7 +18,7 @@
"incorrectDetails": "Felaktiga uppgifter",
"pleaseVerifyDetails": "Kontrollera dina detaljer och försök igen",
"codeIssuerHint": "Utfärdare",
"codeSecretKeyHint": "Hemlig nyckel",
"codeSecretKeyHint": "Secret Key",
"secret": "Säkerhetsnyckel",
"all": "Alla",
"notes": "Anteckningar",
@@ -33,7 +33,7 @@
}
}
},
"codeAccountHint": "Konto (du@domain.com)",
"codeAccountHint": "Konto (du@domän.com)",
"codeTagHint": "Tagg",
"accountKeyType": "Typ av nyckel",
"sessionExpired": "Sessionen har gått ut",
@@ -68,7 +68,7 @@
"reportABug": "Rapportera en bugg",
"crashAndErrorReporting": "Krasch och felrapportering",
"reportBug": "Rapportera bugg",
"emailUsMessage": "Skicka e-post till {email}",
"emailUsMessage": "Skicka e-mail till {email}",
"@emailUsMessage": {
"placeholders": {
"email": {
@@ -79,7 +79,7 @@
"contactSupport": "Kontakta support",
"rateUsOnStore": "Betygsätt på {storeName}",
"blog": "Blogg",
"merchandise": "Produkter",
"merchandise": "Merchandise",
"verifyPassword": "Bekräfta lösenord",
"pleaseWait": "Vänligen vänta...",
"generatingEncryptionKeysTitle": "Skapar krypteringsnycklar...",
@@ -104,14 +104,13 @@
"importFromApp": "Importera koder från {appName}",
"importGoogleAuthGuide": "Exportera dina konton från Google Authenticator till en QR-kod med alternativet \"Överföra konton\". Använd sedan en annan enhet och skanna QR-koden.\n\nTips: Du kan använda din bärbara dators webbkamera för att ta en bild av QR-koden.",
"importSelectJsonFile": "Välj JSON-fil",
"importSelectAppExport": "Välj {appName} exporteringsfil",
"importSelectAppExport": "Välj {appName} exportfil",
"importEnteEncGuide": "Välj den krypterade JSON-filen som exporteras från Ente",
"importRaivoGuide": "Använd alternativet \"Exportera OTPs till zip-arkiv\" i Raivos inställningar.\n\nExtrahera zip-filen och importera JSON-filen.",
"importBitwardenGuide": "Använd alternativet \"Exportera valv\" inom Bitwarden Tools och importera den okrypterade JSON-filen.",
"importAegisGuide": "Använd alternativet \"Exportera valvet\" i Aegis inställningar.\n\nOm ditt valv är krypterat måste du ange valvlösenordet för att dekryptera valvet.",
"import2FasGuide": "Använd alternativet \"Inställningar->Säkerhetskopiera -Exportera\" i 2FAS.\n\nOm din säkerhetskopia är krypterad måste du ange lösenordet för att dekryptera säkerhetskopian.",
"importLastpassGuide": "Använd alternativet \"Överför konton\" i LastPass Authenticators inställningar och tryck på \"Exportera konton till fil\". Importera JSON-filen som laddas ner.",
"importProtonAuthGuide": "Använd alternativet \"Exportera\" i Proton Authenticator-inställningarna för att exportera koder.",
"exportCodes": "Exportera koder",
"importLabel": "Importera",
"importInstruction": "Vänligen välj en fil som innehåller en lista över dina koder i följande format",
@@ -120,11 +119,11 @@
"emailVerificationToggle": "E-postverifiering",
"emailVerificationEnableWarning": "För att undvika att bli låst från ditt konto, se till att spara en kopia av din e-post 2FA utanför Ente Auth innan du aktiverar e-postverifiering.",
"authToChangeEmailVerificationSetting": "Autentisera för att ändra din e-postadress",
"authenticateGeneric": "Vänligen autentisera",
"authenticateGeneric": "Var god autentisera",
"authToViewYourRecoveryKey": "Autentisera för att visa din återställningsnyckel",
"authToChangeYourEmail": "Autentisera för att ändra din e-postadress",
"authToChangeYourPassword": "Autentisera för att ändra ditt lösenord",
"authToViewSecrets": "Vänligen autentisera för att visa din återställningsnyckel",
"authToViewSecrets": "Autentisera för att visa din återställningsnyckel",
"authToInitiateSignIn": "Vänligen autentisera för att initiera inloggning för säkerhetskopiering.",
"ok": "OK",
"cancel": "Avbryt",
@@ -148,7 +147,7 @@
"leaveFamily": "Lämna familjen",
"leaveFamilyMessage": "Är du säker på att du vill lämna familjeplanen?",
"inFamilyPlanMessage": "Du är på en familjeplan!",
"hintForMobile": "Tryck länge på en kod för att redigera eller ta bort.",
"hintForMobile": "Håll i på en kod för att redigera eller ta bort.",
"hintForDesktop": "Högerklicka på en kod för att redigera eller ta bort.",
"scan": "Skanna",
"scanACode": "Skanna kod",
@@ -192,7 +191,7 @@
"oopsSomethingWentWrong": "Hoppsan! Något gick fel.",
"selectLanguage": "Välj språk",
"language": "Språk",
"social": "Socialt",
"social": "Social",
"security": "Säkerhet",
"lockscreen": "Låsskärm",
"authToChangeLockscreenSetting": "Vänligen autentisera för att ändra låsskärms inställningar",
@@ -201,7 +200,7 @@
"authToViewYourActiveSessions": "Autentisera för att visa dina aktiva sessioner",
"searchHint": "Sök...",
"search": "Sök",
"sorryUnableToGenCode": "Tyvärr, kunde inte generera en kod för {issuerName}",
"sorryUnableToGenCode": "Tyvärr, det gick inte att generera en kod för {issuerName}",
"noResult": "Inga resultat",
"addCode": "Lägg till kod",
"scanAQrCode": "Skanna en QR-kod",
@@ -216,7 +215,7 @@
"error": "Fel",
"recoveryKeyCopiedToClipboard": "Återställningsnyckel kopierad till urklipp",
"recoveryKeyOnForgotPassword": "Om du glömmer ditt lösenord är det enda sättet du kan återställa dina data med denna nyckel.",
"recoveryKeySaveDescription": "Vi lagrar inte och har därför inte åtkomst till denna nyckel, vänligen spara denna 24 ordsnyckeln på en säker plats.",
"recoveryKeySaveDescription": "Vi lagrar inte och har därför inte åtkomst till denna nyckel, vänligen spara denna 24 ords nyckel på en säker plats.",
"doThisLater": "Gör detta senare",
"saveKey": "Spara nyckel",
"save": "Spara",
@@ -255,7 +254,7 @@
"insecureDevice": "Osäker enhet",
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Tyvärr, kunde vi inte generera säkra nycklar på den här enheten.\n\nvänligen registrera dig från en annan enhet.",
"howItWorks": "Så här fungerar det",
"ackPasswordLostWarning": "Jag förstår att om jag förlorar mitt lösenord kan jag förlora mina data eftersom min data är <underline>totalsträckskrypterad</underline>.",
"ackPasswordLostWarning": "Jag förstår att om jag förlorar mitt lösenord kan jag förlora mina data eftersom min data är <underline>end-to-end-krypterad</underline>.",
"loginTerms": "Jag samtycker till <u-terms>användarvillkoren</u-terms> och <u-policy>integritetspolicyn</u-policy>",
"logInLabel": "Logga in",
"logout": "Logga ut",
@@ -279,7 +278,7 @@
"recoveryKeyVerifyReason": "Din återställningsnyckel är det enda sättet att återställa dina foton om du glömmer ditt lösenord. Du hittar din återställningsnyckel i Inställningar > Säkerhet.\n\nAnge din återställningsnyckel här för att verifiera att du har sparat den ordentligt.",
"confirmYourRecoveryKey": "Bekräfta din återställningsnyckel",
"confirm": "Bekräfta",
"emailYourLogs": "E-posta dina loggar",
"emailYourLogs": "Maila dina loggar",
"pleaseSendTheLogsTo": "Vänligen skicka loggarna till \n{toEmail}",
"copyEmailAddress": "Kopiera e-postadress",
"exportLogs": "Exportera loggar",
@@ -298,7 +297,7 @@
"criticalUpdateAvailable": "Kritisk uppdatering tillgänglig",
"updateAvailable": "Uppdatering tillgänglig",
"update": "Uppdatera",
"checking": "Kontrollerar...",
"checking": "Kontrollerar ...",
"youAreOnTheLatestVersion": "Du är på den senaste versionen",
"warning": "Varning",
"exportWarningDesc": "Den exporterade filen innehåller känslig information. Förvara den på ett säkert sätt.",
@@ -307,7 +306,7 @@
"description": "Text for the button to confirm the user understands the warning"
},
"authToExportCodes": "Autentisera för att exportera dina koder",
"importSuccessTitle": "Hurra!",
"importSuccessTitle": "Jippi!",
"importSuccessDesc": "Du har importerat {count} koder!",
"@importSuccessDesc": {
"placeholders": {
@@ -325,7 +324,7 @@
"checkInboxAndSpamFolder": "Vänligen kontrollera din inkorg (och skräppost) för att slutföra verifieringen",
"tapToEnterCode": "Tryck för att ange kod",
"resendEmail": "Skicka e-post igen",
"weHaveSendEmailTo": "Vi har skickat ett e-postmeddelande till <green>{email}</green>",
"weHaveSendEmailTo": "Vi har skickat ett mail till <green>{email}</green>",
"@weHaveSendEmailTo": {
"description": "Text to indicate that we have sent a mail to the user",
"placeholders": {
@@ -363,7 +362,7 @@
"selectExportFormat": "Välj exportformat",
"exportDialogDesc": "Krypterad export skyddas av ett lösenord som du väljer.",
"encrypted": "Krypterad",
"plainText": "Oformaterad text",
"plainText": "Enkel text",
"passwordToEncryptExport": "Lösenord för att kryptera export",
"export": "Exportera",
"useOffline": "Använd utan säkerhetskopior",
@@ -375,14 +374,14 @@
"compactMode": "Kompakt läge",
"shouldHideCode": "Dölj koder",
"doubleTapToViewHiddenCode": "Du kan dubbeltrycka på en post för att visa koden",
"focusOnSearchBar": "Fokusera på sök vid uppstart av app",
"focusOnSearchBar": "Fokusera på sök vid appstart",
"confirmUpdatingkey": "Är du säker på att du vill uppdatera den hemliga nyckeln?",
"minimizeAppOnCopy": "Minimera appen vid kopiering",
"editCodeAuthMessage": "Autentisera för att redigera kod",
"deleteCodeAuthMessage": "Autentisera för att radera kod",
"showQRAuthMessage": "Autentisera för att visa QR-kod",
"confirmAccountDeleteTitle": "Bekräfta radering av kontot",
"confirmAccountDeleteMessage": "Detta konto är kopplat till andra Ente applikationer, om du använder någon.\n\nDina uppladdade data, över alla Ente applikationer, kommer att schemaläggas för radering och ditt konto kommer att raderas permanent.",
"confirmAccountDeleteMessage": "Detta konto är kopplat till andra Ente apps, om du använder någon.\n\nDina uppladdade data, över alla Ente appar, kommer att schemaläggas för radering och ditt konto kommer att raderas permanent.",
"androidBiometricHint": "Verifiera identitet",
"@androidBiometricHint": {
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
@@ -391,7 +390,7 @@
"@androidBiometricNotRecognized": {
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
},
"androidBiometricSuccess": "Lyckades",
"androidBiometricSuccess": "Slutförd",
"@androidBiometricSuccess": {
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
},
@@ -442,7 +441,7 @@
"signOutOtherDevices": "Logga ut andra enheter",
"doNotSignOut": "Logga inte ut",
"hearUsWhereTitle": "Hur hörde du talas om Ente? (valfritt)",
"hearUsExplanation": "Vi spårar inte installationer. Det skulle hjälpa oss om du berättade hur du hittade oss!",
"hearUsExplanation": "Vi spårar inte appinstallationer, Det skulle hjälpa oss om du berättade var du hittade oss!",
"recoveryKeySaved": "Återställningsnyckel sparad i nedladdningsmappen!",
"waitingForBrowserRequest": "Väntar på webbläsarbegäran...",
"waitingForVerification": "Väntar på verifiering...",
@@ -489,8 +488,6 @@
"hideContent": "Dölj innehåll",
"hideContentDescriptionAndroid": "Döljer appinnehåll i app-växlaren och inaktiverar skärmdumpar",
"hideContentDescriptioniOS": "Döljer appinnehåll i app-växlaren",
"autoLockFeatureDescription": "Tid efter vilken appen låses efter att ha satts i bakgrunden",
"appLockDescription": "Välj mellan enhetens förvalda låsskärm och en anpassad låsskärm med en PIN-kod eller lösenord.",
"pinLock": "Pinkodslås",
"enterPin": "Ange PIN-kod",
"setNewPin": "Ställ in ny PIN-kod",
@@ -501,31 +498,9 @@
"appLockOfflineModeWarning": "Du har valt att fortsätta utan säkerhetskopior. Om du glömmer ditt applås, kommer du att bli utelåst från att komma åt dina data.",
"duplicateCodes": "Dubblettkoder",
"noDuplicates": "✨ Inga dubbletter",
"youveNoDuplicateCodesThatCanBeCleared": "Du har inga dubbla koder som kan rensas",
"deduplicateCodes": "Deduplicera koder",
"deselectAll": "Avmarkera alla",
"selectAll": "Markera alla",
"deleteDuplicates": "Radera dubbletter",
"plainHTML": "Ren HTML",
"tellUsWhatYouThink": "Berätta vad du tycker",
"dropReviewiOS": "Skriv en recension på App Store",
"dropReviewAndroid": "Skriv en recension på Play Store",
"supportEnte": "Stöd <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Ge oss en stjärna på Github",
"free5GB": "5 GB gratis på <bold-green>ente</bold-green> Foton",
"loginWithAuthAccount": "Logga in med ditt Auth-konto",
"freeStorageOffer": "10% rabatt på <bold-green>ente</bold-green> foton",
"freeStorageOfferDescription": "Använd koden \"AUTH\" för att få 10% rabatt första året",
"advanced": "Avancerad",
"algorithm": "Algoritm",
"type": "Typ",
"period": "Tidsperiod",
"digits": "Siffror",
"importFromGallery": "Importera från galleri",
"errorCouldNotReadImage": "Kunde inte läsa den valda bildfilen.",
"errorInvalidQRCode": "Ogiltig QR-kod",
"errorInvalidQRCodeBody": "Den skannade QR-koden är inte ett giltigt 2FA konto.",
"errorNoQRCode": "Ingen QR-kod hittades",
"errorGenericTitle": "Ett fel inträffade",
"errorGenericBody": "Ett oväntat fel inträffade vid import."
"plainHTML": "Ren HTML"
}

View File

@@ -6,7 +6,7 @@
"@counterAppBarTitle": {
"description": "Text shown in the AppBar of the Counter Page"
},
"onBoardingBody": "妥善保管您的双重认证代码",
"onBoardingBody": "妥善保管您的两步验证码",
"onBoardingGetStarted": "开始",
"setupFirstAccount": "设置您的第一个账户",
"importScanQrCode": "扫描二维码",
@@ -111,14 +111,13 @@
"importAegisGuide": "使用 Aegis 设置中的“导出密码库”选项。\n\n如果您的密码库已加密则需要输入密码库密码才能解密密码库。",
"import2FasGuide": "使用 2FAS 中的“设置 -> 备份 -> 导出”选项。\n\n如果您的备份已加密则需要输入密码来解密备份",
"importLastpassGuide": "使用 Lastpass Authenticator 设置中的“转移账户”选项,然后按“将账户导出到文件”。导入下载的 JSON。",
"importProtonAuthGuide": "使用 Proton Authenticator 设置中的“导出”选项导出您的代码。",
"exportCodes": "导出代码",
"importLabel": "导入",
"importInstruction": "请选择一个包含以下格式的代码列表的文件",
"importCodeDelimiterInfo": "代码可以用逗号或换行符分隔",
"selectFile": "选择文件",
"emailVerificationToggle": "电子邮件验证",
"emailVerificationEnableWarning": "为避免被锁在您的账户之外,请在启用电子邮件验证之前确保在 Ente Auth 之外存储电子邮件双重认证的副本。",
"emailVerificationEnableWarning": "为避免被锁在您的账户之外,请在启用电子邮件验证之前确保在 Ente Auth 之外存储电子邮件两步验证的副本。",
"authToChangeEmailVerificationSetting": "请进行身份验证以更改电子邮件验证",
"authenticateGeneric": "请验证",
"authToViewYourRecoveryKey": "请验证以查看您的恢复密钥",
@@ -156,7 +155,7 @@
"verifyEmail": "验证电子邮件",
"enterCodeHint": "从你的身份验证器应用中\n输入6位数字代码",
"lostDeviceTitle": "丢失了设备吗?",
"twoFactorAuthTitle": "双重认证",
"twoFactorAuthTitle": "两步验证",
"passkeyAuthTitle": "通行密钥验证",
"verifyPasskey": "验证通行密钥",
"loginWithTOTP": "使用 TOTP 登录",
@@ -520,12 +519,5 @@
"algorithm": "算法",
"type": "类型",
"period": "周期",
"digits": "数字",
"importFromGallery": "从图库导入",
"errorCouldNotReadImage": "无法读取所选图片文件。",
"errorInvalidQRCode": "二维码无效",
"errorInvalidQRCodeBody": "扫描的二维码不是有效的双重认证账户。",
"errorNoQRCode": "未找到二维码",
"errorGenericTitle": "出错了",
"errorGenericBody": "导入时发生意外错误。"
"digits": "数字"
}

View File

@@ -39,9 +39,7 @@ import 'package:ente_auth/utils/totp_util.dart';
import 'package:ente_events/event_bus.dart';
import 'package:ente_lock_screen/lock_screen_settings.dart';
import 'package:ente_lock_screen/ui/app_lock.dart';
import 'package:ente_qr/ente_qr.dart';
import 'package:ente_ui/pages/base_home_page.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@@ -50,7 +48,7 @@ import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:logging/logging.dart';
import 'package:move_to_background/move_to_background.dart';
class HomePage extends BaseHomePage {
class HomePage extends BaseHomePage {
const HomePage({super.key});
@override
@@ -64,7 +62,6 @@ class _HomePageState extends State<HomePage> {
);
bool _hasLoaded = false;
bool _isSettingsOpen = false;
bool _isImportingFromGallery = false;
final Logger _logger = Logger("HomePage");
final scaffoldKey = GlobalKey<ScaffoldState>();
@@ -291,63 +288,6 @@ class _HomePageState extends State<HomePage> {
}
}
Future<void> _importFromGalleryNative() async {
final l10n = AppLocalizations.of(context);
if (_isImportingFromGallery) {
return;
}
_isImportingFromGallery = true;
try {
final FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.image,
);
if (result == null || result.files.single.path == null) {
return;
}
final String imagePath = result.files.single.path!;
final enteQr = EnteQr();
final QrScanResult qrResult = await enteQr.scanQrFromImage(imagePath);
if (qrResult.success && qrResult.content != null) {
try {
final newCode = Code.fromOTPAuthUrl(qrResult.content!);
await CodeStore.instance.addCode(newCode, shouldSync: false);
// Focus the new code by searching
if ((_allCodes?.where((e) => !e.hasError).length ?? 0) > 2) {
_focusNewCode(newCode);
}
} catch (e) {
_logger.severe('Error adding code from QR scan', e);
await showErrorDialog(
context,
l10n.errorInvalidQRCode,
l10n.errorInvalidQRCodeBody,
);
}
} else {
_logger.warning('QR scan failed: ${qrResult.error}');
await showErrorDialog(
context,
l10n.errorNoQRCode,
qrResult.error ?? l10n.errorNoQRCode,
);
}
} catch (e) {
await showErrorDialog(
context,
l10n.errorGenericTitle,
l10n.errorGenericBody,
);
} finally {
_isImportingFromGallery = false;
}
}
Future<void> _redirectToScannerPage() async {
final Code? code = await Navigator.of(context).push(
MaterialPageRoute(
@@ -805,14 +745,6 @@ class _HomePageState extends State<HomePage> {
labelWidget: SpeedDialLabelWidget(context.l10n.enterDetailsManually),
onTap: _redirectToManualEntryPage,
),
if (PlatformUtil.isMobile())
SpeedDialChild(
child: const Icon(Icons.image),
backgroundColor: Theme.of(context).colorScheme.fabBackgroundColor,
foregroundColor: Theme.of(context).colorScheme.fabForegroundColor,
labelWidget: SpeedDialLabelWidget(context.l10n.importFromGallery),
onTap: _importFromGalleryNative,
),
],
);
}

View File

@@ -4,7 +4,6 @@ import 'package:ente_auth/ui/settings/data/import/encrypted_ente_import.dart';
import 'package:ente_auth/ui/settings/data/import/google_auth_import.dart';
import 'package:ente_auth/ui/settings/data/import/lastpass_import.dart';
import 'package:ente_auth/ui/settings/data/import/plain_text_import.dart';
import 'package:ente_auth/ui/settings/data/import/proton_import.dart';
import 'package:ente_auth/ui/settings/data/import/raivo_plain_text_import.dart';
import 'package:ente_auth/ui/settings/data/import/two_fas_import.dart';
import 'package:ente_auth/ui/settings/data/import_page.dart';
@@ -44,9 +43,6 @@ class ImportService {
case ImportType.lastpass:
await showLastpassImportInstruction(context);
break;
case ImportType.proton:
await showProtonImportInstruction(context);
break;
}
}
}

View File

@@ -1,171 +0,0 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:ente_auth/l10n/l10n.dart';
import 'package:ente_auth/models/code.dart';
import 'package:ente_auth/services/authenticator_service.dart';
import 'package:ente_auth/store/code_store.dart';
import 'package:ente_auth/ui/common/progress_dialog.dart';
import 'package:ente_auth/ui/components/buttons/button_widget.dart';
import 'package:ente_auth/ui/components/dialog_widget.dart';
import 'package:ente_auth/ui/components/models/button_type.dart';
import 'package:ente_auth/ui/settings/data/import/import_success.dart';
import 'package:ente_auth/utils/dialog_util.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
Future<void> showProtonImportInstruction(BuildContext context) async {
final l10n = context.l10n;
final result = await showDialogWidget(
context: context,
title: l10n.importFromApp("Proton Authenticator"),
body: l10n.importProtonAuthGuide,
buttons: [
ButtonWidget(
buttonType: ButtonType.primary,
labelText: l10n.importSelectJsonFile,
isInAlert: true,
buttonSize: ButtonSize.large,
buttonAction: ButtonAction.first,
),
ButtonWidget(
buttonType: ButtonType.secondary,
labelText: context.l10n.cancel,
buttonSize: ButtonSize.large,
isInAlert: true,
buttonAction: ButtonAction.second,
),
],
);
if (result?.action != null && result!.action != ButtonAction.cancel) {
if (result.action == ButtonAction.first) {
await _pickProtonJsonFile(context);
}
}
}
Future<void> _pickProtonJsonFile(BuildContext context) async {
final l10n = context.l10n;
FilePickerResult? result = await FilePicker.platform
.pickFiles(dialogTitle: l10n.importSelectJsonFile);
if (result == null) {
return;
}
final ProgressDialog progressDialog =
createProgressDialog(context, l10n.pleaseWait);
await progressDialog.show();
try {
String path = result.files.single.path!;
int? count = await _processProtonExportFile(context, path, progressDialog);
await progressDialog.hide();
if (count != null) {
await importSuccessDialog(context, count);
}
} catch (e, s) {
Logger('ProtonImport')
.severe('exception while processing proton import', e, s);
await progressDialog.hide();
await showErrorDialog(
context,
context.l10n.sorry,
"${context.l10n.importFailureDescNew}\n Error: ${e.toString()}",
);
}
}
Future<int?> _processProtonExportFile(
BuildContext context,
String path,
final ProgressDialog dialog,
) async {
File file = File(path);
final jsonString = await file.readAsString();
final decodedJson = jsonDecode(jsonString);
// Validate that this is a Proton export
if (decodedJson['version'] == null || decodedJson['entries'] == null) {
await dialog.hide();
await showErrorDialog(
context,
'Invalid Proton export',
'The selected file is not a valid Proton Authenticator export.',
);
return null;
}
final parsedCodes = <Code>[];
final entries = decodedJson['entries'] as List;
for (var entry in entries) {
try {
final content = entry['content'];
if (content == null) {
continue; // Skip entries without content
}
final entryType = content['entry_type'] as String?;
if (entryType != 'Totp' && entryType != 'Steam') {
// log warning
Logger('ProtonImport').warning('Unsupported entry type: $entryType');
continue; // Skip non-TOTP and non-Steam entries
}
Code code;
if (entryType == 'Steam') {
// Handle Steam entries with steam:// format
final steamUri = content['uri'] as String?;
if (steamUri == null || !steamUri.startsWith('steam://')) {
continue; // Skip invalid Steam URIs
}
final secret = steamUri.split('steam://')[1];
final name = content['name'] as String? ?? '';
code = Code.fromAccountAndSecret(
Type.steam,
'', // Steam doesn't typically have separate account
name, // Use name as issuer
secret,
null,
Code.steamDigits,
);
} else {
// Handle TOTP entries with otpauth:// format
final otpUri = content['uri'] as String?;
if (otpUri == null || !otpUri.startsWith('otpauth://')) {
continue; // Skip invalid OTP URIs
}
// Create code from OTP auth URL
code = Code.fromOTPAuthUrl(otpUri);
}
// Add note if present
final note = entry['note'] as String?;
if (note != null && note.isNotEmpty) {
code = code.copyWith(
display: code.display.copyWith(note: note),
);
}
parsedCodes.add(code);
} catch (e, s) {
Logger('ProtonImport').warning('Failed to parse entry', e, s);
// Continue processing other entries
}
}
// Add all parsed codes to the store
for (final code in parsedCodes) {
await CodeStore.instance.addCode(code, shouldSync: false);
}
// Trigger sync
unawaited(AuthenticatorService.instance.onlineSync());
return parsedCodes.length;
}

View File

@@ -17,7 +17,6 @@ enum ImportType {
twoFas,
bitwarden,
lastpass,
proton,
}
class ImportCodePage extends StatelessWidget {
@@ -30,7 +29,6 @@ class ImportCodePage extends StatelessWidget {
ImportType.aegis,
ImportType.bitwarden,
ImportType.googleAuthenticator,
ImportType.proton,
ImportType.ravio,
ImportType.lastpass,
];
@@ -53,8 +51,6 @@ class ImportCodePage extends StatelessWidget {
return 'Bitwarden';
case ImportType.lastpass:
return 'LastPass Authenticator';
case ImportType.proton:
return 'Proton Authenticator';
}
}

View File

@@ -1,33 +0,0 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49"
channel: "stable"
project_type: plugin
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: android
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: ios
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'

View File

@@ -1,8 +0,0 @@
## 0.0.1
* Initial release of ente_qr plugin
* Support for scanning QR codes from image files
* Android implementation using ZXing library
* iOS implementation using Core Image framework
* Comprehensive error handling
* Example app demonstrating usage with file picker

View File

@@ -1,170 +0,0 @@
# ente_qr
A Flutter plugin for scanning QR codes from image files. This plugin provides a simple interface to scan QR codes from images on both Android and iOS platforms.
## Features
- Scan QR codes from image files
- Support for Android (using ZXing library)
- Support for iOS (using AVFoundation/Core Image)
- Returns structured results with error handling
- Works with images from file picker or camera
## Platform Support
| Platform | Support |
|----------|---------|
| Android | ✅ |
| iOS | ✅ |
| Web | ❌ |
| macOS | ❌ |
| Windows | ❌ |
| Linux | ❌ |
## Installation
Add this to your package's `pubspec.yaml` file:
```yaml
dependencies:
ente_qr:
path: path/to/ente_qr
```
## Usage
### Basic Usage
```dart
import 'package:ente_qr/ente_qr.dart';
final qr = EnteQr();
// Scan QR code from an image file
final result = await qr.scanQrFromImage('/path/to/image.jpg');
if (result.success) {
print('QR Code content: ${result.content}');
} else {
print('Error: ${result.error}');
}
```
### Complete Example with File Picker
```dart
import 'package:flutter/material.dart';
import 'package:ente_qr/ente_qr.dart';
import 'package:file_picker/file_picker.dart';
class QrScannerPage extends StatefulWidget {
@override
_QrScannerPageState createState() => _QrScannerPageState();
}
class _QrScannerPageState extends State<QrScannerPage> {
final _enteQr = EnteQr();
String _result = 'No QR code scanned';
Future<void> _scanQrFromImage() async {
// Pick an image file
FilePickerResult? fileResult = await FilePicker.platform.pickFiles(
type: FileType.image,
allowMultiple: false,
);
if (fileResult != null && fileResult.files.single.path != null) {
final imagePath = fileResult.files.single.path!;
// Scan QR code from the selected image
final qrResult = await _enteQr.scanQrFromImage(imagePath);
setState(() {
if (qrResult.success) {
_result = 'QR Code: ${qrResult.content}';
} else {
_result = 'Error: ${qrResult.error}';
}
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('QR Scanner')),
body: Column(
children: [
ElevatedButton(
onPressed: _scanQrFromImage,
child: Text('Pick Image and Scan QR'),
),
Text(_result),
],
),
);
}
}
```
## API Reference
### EnteQr
The main class for QR code scanning operations.
#### Methods
##### `scanQrFromImage(String imagePath)`
Scans a QR code from an image file.
**Parameters:**
- `imagePath` (String): The file path to the image containing the QR code
**Returns:**
- `Future<QrScanResult>`: A result object containing either the QR code content or an error
### QrScanResult
The result object returned by QR scanning operations.
**Properties:**
- `content` (String?): The QR code content if successful, null otherwise
- `error` (String?): Error message if scanning failed, null otherwise
- `success` (bool): Whether the scanning operation was successful
**Factory Constructors:**
- `QrScanResult.success(String content)`: Creates a successful result
- `QrScanResult.error(String error)`: Creates an error result
## Implementation Details
### Android
The Android implementation uses the ZXing library (com.google.zxing) for QR code detection:
- `com.journeyapps:zxing-android-embedded:4.3.0`
- `com.google.zxing:core:3.5.1`
### iOS
The iOS implementation uses Core Image framework's built-in QR code detection capabilities via `CIDetector`.
## Error Handling
The plugin provides comprehensive error handling for common scenarios:
- File not found
- Invalid image format
- No QR code found in image
- Platform-specific errors
- Unexpected errors
All errors are returned as part of the `QrScanResult` object with descriptive error messages.
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## License
This project is licensed under the same license as the Ente project.

View File

@@ -1 +0,0 @@
include: ../../analysis_options.yaml

View File

@@ -1,65 +0,0 @@
group 'io.ente.auth.ente_qr'
version '1.0-SNAPSHOT'
buildscript {
ext.kotlin_version = '1.7.10'
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
rootProject.allprojects {
repositories {
google()
mavenCentral()
}
}
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
android {
compileSdkVersion 33
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
test.java.srcDirs += 'src/test/kotlin'
}
defaultConfig {
minSdkVersion 16
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
implementation 'com.google.zxing:core:3.5.1'
}
testOptions {
unitTests.all {
useJUnitPlatform()
testLogging {
events "passed", "skipped", "failed", "standardOut", "standardError"
outputs.upToDateWhen {false}
showStandardStreams = true
}
}
}
}

View File

@@ -1 +0,0 @@
rootProject.name = 'ente_qr'

View File

@@ -1,3 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.ente.auth.ente_qr">
</manifest>

View File

@@ -1,138 +0,0 @@
package io.ente.auth.ente_qr
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import androidx.annotation.NonNull
import com.google.zxing.BarcodeFormat
import com.google.zxing.BinaryBitmap
import com.google.zxing.DecodeHintType
import com.google.zxing.MultiFormatReader
import com.google.zxing.NotFoundException
import com.google.zxing.RGBLuminanceSource
import com.google.zxing.Result as ZXingResult
import com.google.zxing.common.HybridBinarizer
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import java.io.File
import java.util.*
/** EnteQrPlugin */
class EnteQrPlugin: FlutterPlugin, MethodCallHandler {
/// The MethodChannel that will the communication between Flutter and native Android
///
/// This local reference serves to register the plugin with the Flutter Engine and unregister it
/// when the Flutter Engine is detached from the Activity
private lateinit var channel : MethodChannel
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "ente_qr")
channel.setMethodCallHandler(this)
}
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
when (call.method) {
"getPlatformVersion" -> {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
}
"scanQrFromImage" -> {
val imagePath = call.argument<String>("imagePath")
if (imagePath == null) {
result.success(mapOf(
"success" to false,
"error" to "Image path is required"
))
return
}
try {
val qrResult = scanQrCode(imagePath)
result.success(qrResult)
} catch (e: Exception) {
result.success(mapOf(
"success" to false,
"error" to "Error scanning QR code: ${e.message}"
))
}
}
else -> {
result.notImplemented()
}
}
}
private fun scanQrCode(imagePath: String): Map<String, Any> {
try {
val file = File(imagePath)
if (!file.exists()) {
return mapOf(
"success" to false,
"error" to "Image file not found: $imagePath"
)
}
var bitmap = BitmapFactory.decodeFile(imagePath)
if (bitmap == null) {
return mapOf(
"success" to false,
"error" to "Unable to decode image file"
)
}
// Try multiple times with different image sizes like Aegis does
for (i in 0..2) {
if (i != 0) {
// Resize bitmap for subsequent attempts
val newWidth = bitmap.width / (i * 2)
val newHeight = bitmap.height / (i * 2)
if (newWidth > 0 && newHeight > 0) {
bitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true)
}
}
try {
val width = bitmap.width
val height = bitmap.height
val pixels = IntArray(width * height)
bitmap.getPixels(pixels, 0, width, 0, 0, width, height)
val source = RGBLuminanceSource(width, height, pixels)
val binaryBitmap = BinaryBitmap(HybridBinarizer(source))
val reader = MultiFormatReader()
val hints = HashMap<DecodeHintType, Any>()
hints[DecodeHintType.POSSIBLE_FORMATS] = listOf(BarcodeFormat.QR_CODE)
hints[DecodeHintType.TRY_HARDER] = true
hints[DecodeHintType.ALSO_INVERTED] = true
reader.setHints(hints)
val qrResult: ZXingResult = reader.decode(binaryBitmap)
return mapOf(
"success" to true,
"content" to qrResult.text
)
} catch (e: NotFoundException) {
// Continue to next iteration
continue
}
}
return mapOf(
"success" to false,
"error" to "No QR code found in image"
)
} catch (e: Exception) {
return mapOf(
"success" to false,
"error" to "Error scanning QR code: ${e.message}"
)
}
}
override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
}
}

View File

@@ -1,77 +0,0 @@
import Flutter
import UIKit
import AVFoundation
public class EnteQrPlugin: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: "ente_qr", binaryMessenger: registrar.messenger())
let instance = EnteQrPlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "getPlatformVersion":
result("iOS " + UIDevice.current.systemVersion)
case "scanQrFromImage":
guard let args = call.arguments as? [String: Any],
let imagePath = args["imagePath"] as? String else {
result([
"success": false,
"error": "Image path is required"
])
return
}
scanQrCode(from: imagePath, result: result)
default:
result(FlutterMethodNotImplemented)
}
}
private func scanQrCode(from imagePath: String, result: @escaping FlutterResult) {
guard let image = UIImage(contentsOfFile: imagePath) else {
result([
"success": false,
"error": "Unable to load image from path: \(imagePath)"
])
return
}
guard let cgImage = image.cgImage else {
result([
"success": false,
"error": "Unable to get CGImage from UIImage"
])
return
}
let detector = CIDetector(ofType: CIDetectorTypeQRCode,
context: nil,
options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])
guard let qrDetector = detector else {
result([
"success": false,
"error": "Unable to create QR code detector"
])
return
}
let ciImage = CIImage(cgImage: cgImage)
let features = qrDetector.features(in: ciImage)
if let qrFeature = features.first as? CIQRCodeFeature,
let messageString = qrFeature.messageString {
result([
"success": true,
"content": messageString
])
} else {
result([
"success": false,
"error": "No QR code found in image"
])
}
}
}

View File

@@ -1,23 +0,0 @@
#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
# Run `pod lib lint ente_qr.podspec` to validate before publishing.
#
Pod::Spec.new do |s|
s.name = 'ente_qr'
s.version = '0.0.1'
s.summary = 'A QR code reader plugin for Ente.'
s.description = <<-DESC
A QR code reader plugin for Ente.
DESC
s.homepage = 'https://ente.io'
s.license = { :file => '../LICENSE' }
s.author = { 'Ente' => 'team@ente.io' }
s.source = { :path => '.' }
s.source_files = 'Classes/**/*'
s.dependency 'Flutter'
s.platform = :ios, '9.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'
end

View File

@@ -1,30 +0,0 @@
import 'package:ente_qr/ente_qr_platform_interface.dart';
export 'ente_qr_platform_interface.dart' show QrScanResult;
class EnteQr {
Future<String?> getPlatformVersion() {
return EnteQrPlatform.instance.getPlatformVersion();
}
/// Scans a QR code from an image file at the given path.
///
/// [imagePath] - The file path to the image containing the QR code
///
/// Returns a [QrScanResult] containing either the QR code content on success
/// or an error message on failure.
///
/// Example:
/// ```dart
/// final qr = EnteQr();
/// final result = await qr.scanQrFromImage('/path/to/image.jpg');
/// if (result.success) {
/// print('QR Code content: ${result.content}');
/// } else {
/// print('Error: ${result.error}');
/// }
/// ```
Future<QrScanResult> scanQrFromImage(String imagePath) {
return EnteQrPlatform.instance.scanQrFromImage(imagePath);
}
}

View File

@@ -1,52 +0,0 @@
import 'package:ente_qr/ente_qr_platform_interface.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
/// An implementation of [EnteQrPlatform] that uses method channels.
class MethodChannelEnteQr extends EnteQrPlatform {
/// The method channel used to interact with the native platform.
@visibleForTesting
final methodChannel = const MethodChannel('ente_qr');
@override
Future<String?> getPlatformVersion() async {
final version =
await methodChannel.invokeMethod<String>('getPlatformVersion');
return version;
}
@override
Future<QrScanResult> scanQrFromImage(String imagePath) async {
try {
final dynamic result = await methodChannel.invokeMethod(
'scanQrFromImage',
{'imagePath': imagePath},
);
if (result == null) {
return QrScanResult.error('Failed to scan QR code');
}
// Convert to Map<String, dynamic> safely
final Map<String, dynamic> resultMap =
Map<String, dynamic>.from(result as Map);
final bool success = resultMap['success'] as bool? ?? false;
if (success) {
final String? content = resultMap['content'] as String?;
if (content != null && content.isNotEmpty) {
return QrScanResult.success(content);
} else {
return QrScanResult.error('No QR code found in image');
}
} else {
final String? error = resultMap['error'] as String?;
return QrScanResult.error(error ?? 'Unknown error occurred');
}
} on PlatformException catch (e) {
return QrScanResult.error('Platform error: ${e.message}');
} catch (e) {
return QrScanResult.error('Unexpected error: $e');
}
}
}

View File

@@ -1,61 +0,0 @@
import 'package:ente_qr/ente_qr_method_channel.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
/// The result of QR code scanning
class QrScanResult {
final String? content;
final String? error;
final bool success;
const QrScanResult({
this.content,
this.error,
required this.success,
});
factory QrScanResult.success(String content) {
return QrScanResult(
content: content,
success: true,
);
}
factory QrScanResult.error(String error) {
return QrScanResult(
error: error,
success: false,
);
}
}
abstract class EnteQrPlatform extends PlatformInterface {
/// Constructs a EnteQrPlatform.
EnteQrPlatform() : super(token: _token);
static final Object _token = Object();
static EnteQrPlatform _instance = MethodChannelEnteQr();
/// The default instance of [EnteQrPlatform] to use.
///
/// Defaults to [MethodChannelEnteQr].
static EnteQrPlatform get instance => _instance;
/// Platform-specific implementations should set this with their own
/// platform-specific class that extends [EnteQrPlatform] when
/// they register themselves.
static set instance(EnteQrPlatform instance) {
PlatformInterface.verifyToken(instance, _token);
_instance = instance;
}
Future<String?> getPlatformVersion() {
throw UnimplementedError('platformVersion() has not been implemented.');
}
/// Scans a QR code from an image file at the given path.
/// Returns the QR code content as a string if successful, null otherwise.
Future<QrScanResult> scanQrFromImage(String imagePath) {
throw UnimplementedError('scanQrFromImage() has not been implemented.');
}
}

View File

@@ -1,213 +0,0 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
async:
dependency: transitive
description:
name: async
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
url: "https://pub.dev"
source: hosted
version: "2.13.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
characters:
dependency: transitive
description:
name: characters
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
url: "https://pub.dev"
source: hosted
version: "1.4.0"
clock:
dependency: transitive
description:
name: clock
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.2"
collection:
dependency: transitive
description:
name: collection
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
source: hosted
version: "1.19.1"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
url: "https://pub.dev"
source: hosted
version: "1.3.3"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
url: "https://pub.dev"
source: hosted
version: "3.0.2"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
leak_tracker:
dependency: transitive
description:
name: leak_tracker
sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0"
url: "https://pub.dev"
source: hosted
version: "10.0.9"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
url: "https://pub.dev"
source: hosted
version: "3.0.9"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
lints:
dependency: transitive
description:
name: lints
sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
url: "https://pub.dev"
source: hosted
version: "3.0.0"
matcher:
dependency: transitive
description:
name: matcher
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev"
source: hosted
version: "0.12.17"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
source: hosted
version: "0.11.1"
meta:
dependency: transitive
description:
name: meta
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
url: "https://pub.dev"
source: hosted
version: "1.16.0"
path:
dependency: transitive
description:
name: path
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev"
source: hosted
version: "1.9.1"
plugin_platform_interface:
dependency: "direct main"
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
source_span:
dependency: transitive
description:
name: source_span
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
url: "https://pub.dev"
source: hosted
version: "1.10.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
source: hosted
version: "1.12.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.dev"
source: hosted
version: "1.4.1"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.dev"
source: hosted
version: "1.2.2"
test_api:
dependency: transitive
description:
name: test_api
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
url: "https://pub.dev"
source: hosted
version: "0.7.4"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
vm_service:
dependency: transitive
description:
name: vm_service
sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02
url: "https://pub.dev"
source: hosted
version: "15.0.0"
sdks:
dart: ">=3.7.0-0 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54"

View File

@@ -1,29 +0,0 @@
name: ente_qr
description: "A QR code reader plugin for Ente."
version: 0.0.1
homepage: https://ente.io
environment:
sdk: '>=3.4.3 <4.0.0'
flutter: '>=3.3.0'
dependencies:
flutter:
sdk: flutter
plugin_platform_interface: ^2.0.2
dev_dependencies:
flutter_lints: ^3.0.0
flutter_test:
sdk: flutter
# The following section is specific to Flutter packages.
flutter:
# This section identifies this Flutter project as a plugin project.
plugin:
platforms:
android:
package: io.ente.auth.ente_qr
pluginClass: EnteQrPlugin
ios:
pluginClass: EnteQrPlugin

View File

@@ -1,32 +0,0 @@
import 'package:ente_qr/ente_qr.dart';
import 'package:ente_qr/ente_qr_method_channel.dart';
import 'package:ente_qr/ente_qr_platform_interface.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
class MockEnteQrPlatform
with MockPlatformInterfaceMixin
implements EnteQrPlatform {
@override
Future<String?> getPlatformVersion() => Future.value('42');
@override
Future<QrScanResult> scanQrFromImage(String imagePath) =>
Future.value(QrScanResult.error('Mock implementation'));
}
void main() {
final EnteQrPlatform initialPlatform = EnteQrPlatform.instance;
test('$MethodChannelEnteQr is the default instance', () {
expect(initialPlatform, isInstanceOf<MethodChannelEnteQr>());
});
test('getPlatformVersion', () async {
final EnteQr enteQrPlugin = EnteQr();
final MockEnteQrPlatform fakePlatform = MockEnteQrPlatform();
EnteQrPlatform.instance = fakePlatform;
expect(await enteQrPlugin.getPlatformVersion(), '42');
});
}

View File

@@ -451,13 +451,6 @@ packages:
relative: true
source: path
version: "1.0.0"
ente_qr:
dependency: "direct main"
description:
path: "plugins/qr"
relative: true
source: path
version: "0.0.1"
ente_strings:
dependency: "direct main"
description:
@@ -473,7 +466,7 @@ packages:
source: path
version: "1.0.0"
ente_utils:
dependency: "direct overridden"
dependency: transitive
description:
path: "../../packages/utils"
relative: true
@@ -539,10 +532,10 @@ packages:
dependency: "direct main"
description:
name: file_picker
sha256: e7e16c9d15c36330b94ca0e2ad8cb61f93cd5282d0158c09805aed13b5452f22
sha256: ef9908739bdd9c476353d6adff72e88fd00c625f5b959ae23f7567bd5137db0a
url: "https://pub.dev"
source: hosted
version: "10.3.2"
version: "10.2.0"
file_saver:
dependency: "direct main"
description:
@@ -958,7 +951,7 @@ packages:
source: hosted
version: "0.1.0"
image:
dependency: "direct main"
dependency: transitive
description:
name: image
sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928"

View File

@@ -1,6 +1,6 @@
name: ente_auth
description: ente two-factor authenticator
version: 4.4.7+447
version: 4.4.6+446
publish_to: none
environment:
@@ -41,8 +41,6 @@ dependencies:
path: ../../packages/logging
ente_network:
path: ../../packages/network
ente_qr:
path: plugins/qr
ente_strings:
path: ../../packages/strings
ente_ui:
@@ -52,7 +50,7 @@ dependencies:
expansion_tile_card: ^3.0.0
ffi: ^2.1.0
figma_squircle: ^0.6.3
file_picker: ^10.3.2
file_picker: ^10.2.0
file_saver: ^0.3.1
fixnum: ^1.1.0
fk_user_agent: # no package updates on pub.dev
@@ -86,7 +84,6 @@ dependencies:
google_nav_bar: ^5.0.5 #supported
gradient_borders: ^1.0.0
http: ^1.1.0
image: ^4.5.4
intl: ^0.20.2
io: ^1.0.4
json_annotation: ^4.5.0

View File

@@ -1,22 +0,0 @@
# melos_managed_dependency_overrides: ente_accounts,ente_base,ente_configuration,ente_events,ente_lock_screen,ente_logging,ente_network,ente_strings,ente_ui,ente_utils
dependency_overrides:
ente_accounts:
path: ../../packages/accounts
ente_base:
path: ../../packages/base
ente_configuration:
path: ../../packages/configuration
ente_events:
path: ../../packages/events
ente_lock_screen:
path: ../../packages/lock_screen
ente_logging:
path: ../../packages/logging
ente_network:
path: ../../packages/network
ente_strings:
path: ../../packages/strings
ente_ui:
path: ../../packages/ui
ente_utils:
path: ../../packages/utils

View File

@@ -1 +1,72 @@
include: ../../analysis_options.yaml
# For more linters, we can check https://dart-lang.github.io/linter/lints/index.html
# or https://pub.dev/packages/lint (Effective dart)
# use "flutter analyze ." or "dart analyze ." for running lint checks
include: package:flutter_lints/flutter.yaml
linter:
rules:
# Ref https://github.com/flutter/packages/blob/master/packages/flutter_lints/lib/flutter.yaml
# Ref https://dart-lang.github.io/linter/lints/
- avoid_print
- avoid_unnecessary_containers
- avoid_web_libraries_in_flutter
- no_logic_in_create_state
- prefer_const_constructors
- prefer_const_constructors_in_immutables
- prefer_const_declarations
- prefer_const_literals_to_create_immutables
- prefer_final_locals
- require_trailing_commas
- sized_box_for_whitespace
- use_full_hex_values_for_flutter_colors
- use_key_in_widget_constructors
- cancel_subscriptions
- avoid_empty_else
- exhaustive_cases
# just style suggestions
- sort_pub_dependencies
- use_rethrow_when_possible
- prefer_double_quotes
- directives_ordering
- always_use_package_imports
- sort_child_properties_last
- unawaited_futures
analyzer:
errors:
avoid_empty_else: error
exhaustive_cases: error
curly_braces_in_flow_control_structures: error
directives_ordering: error
require_trailing_commas: error
always_use_package_imports: warning
prefer_final_fields: error
unused_import: error
camel_case_types: error
prefer_is_empty: warning
use_rethrow_when_possible: info
unused_field: warning
use_key_in_widget_constructors: warning
sort_child_properties_last: warning
sort_pub_dependencies: warning
library_private_types_in_public_api: warning
constant_identifier_names: ignore
prefer_const_constructors: warning
prefer_const_declarations: warning
prefer_const_constructors_in_immutables: warning
prefer_final_locals: warning
unnecessary_const: error
cancel_subscriptions: error
unrelated_type_equality_checks: error
unnecessary_cast: info
unawaited_futures: warning # convert to warning after fixing existing issues
invalid_dependency: info
use_build_context_synchronously: ignore # experimental lint, requires many changes
prefer_interpolation_to_compose_strings: ignore # later too many warnings
prefer_double_quotes: ignore # too many warnings
avoid_renaming_method_parameters: ignore # incorrect warnings for `equals` overrides

View File

@@ -1,22 +0,0 @@
# melos_managed_dependency_overrides: ente_accounts,ente_base,ente_configuration,ente_events,ente_lock_screen,ente_logging,ente_network,ente_strings,ente_ui,ente_utils
dependency_overrides:
ente_accounts:
path: ../../packages/accounts
ente_base:
path: ../../packages/base
ente_configuration:
path: ../../packages/configuration
ente_events:
path: ../../packages/events
ente_lock_screen:
path: ../../packages/lock_screen
ente_logging:
path: ../../packages/logging
ente_network:
path: ../../packages/network
ente_strings:
path: ../../packages/strings
ente_ui:
path: ../../packages/ui
ente_utils:
path: ../../packages/utils

View File

@@ -45,11 +45,4 @@ fastlane/report.xml
android/app/build/
# FVM Version Cache
.fvm/
lib/generated/intl/app_localizations*.dart
# Generated rust bindings
lib/src/rust/*
rust/src/frb_generated*
test/**/*.mocks.dart
.fvm/

View File

@@ -48,7 +48,7 @@ You can alternatively install the build from PlayStore or F-Droid.
1. Install [Flutter v3.32.8](https://flutter.dev/docs/get-started/install) and [Rust](https://www.rust-lang.org/tools/install).
2. Install [Flutter Rust Bridge](https://cjycode.com/flutter_rust_bridge/) with `cargo install flutter_rust_bridge_codegen` and run `flutter_rust_bridge_codegen generate` to generate the Rust bindings.
2. Install [Flutter Rust Bridge](https://cjycode.com/flutter_rust_bridge/) with `cargo install flutter_rust_bridge_codegen`
3. Pull in all submodules with `git submodule update --init --recursive`

View File

@@ -73,6 +73,3 @@ analyzer:
- thirdparty/**
- lib/generated/**
- rust_builder/**
- lib/src/rust/**
- rust/src/**
- test/**

View File

@@ -135,17 +135,6 @@
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
<activity-alias
android:name="${applicationId}.IconDuckyHuggingE"
android:icon="@mipmap/icon_ducky_hugging_e"
android:enabled="false"
android:exported="true"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_ducky_hugging_e_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 396 KiB

View File

@@ -1,52 +0,0 @@
<svg width="198" height="150" viewBox="0 0 198 150" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.2" d="M103.208 1.51891C70.0589 1.51891 17.0832 -6.28475 9.02179 30.1961C0.957739 66.6797 0.325369 122.498 30.8944 124.356C61.4634 126.213 136.678 126.856 160.318 124.356C183.957 121.855 185.312 83.2462 185.312 57.3881C185.312 31.53 174.179 -0.973365 123.125 0.817466C107.034 1.38341 103.21 1.51891 103.21 1.51891H103.208Z" fill="white"/>
<path d="M141.928 142.014C168.856 142.014 190.684 139.1 190.684 135.504C190.684 131.909 168.856 128.995 141.928 128.995C115.001 128.995 93.1719 131.909 93.1719 135.504C93.1719 139.1 115.001 142.014 141.928 142.014Z" fill="#343434"/>
<path d="M67.2538 149.392C104.397 149.392 134.508 145.779 134.508 141.321C134.508 136.864 104.397 133.251 67.2538 133.251C30.1105 133.251 0 136.864 0 141.321C0 145.779 30.1105 149.392 67.2538 149.392Z" fill="#343434"/>
<path d="M111.039 120.086C101.394 128.801 101.925 135.497 113.988 136.559C126.051 137.622 134.713 135.151 131.923 127.605C129.159 120.086 111.039 120.086 111.039 120.086Z" fill="#FF814A"/>
<path d="M118.989 137.665C117.408 137.665 115.71 137.585 113.909 137.428C108.141 136.921 104.71 135.165 103.722 132.21C102.595 128.852 104.923 124.436 110.452 119.438C110.612 119.294 110.822 119.212 111.037 119.212C111.802 119.212 129.801 119.305 132.739 127.303C133.675 129.829 133.483 131.982 132.173 133.698C130.186 136.299 125.584 137.662 118.989 137.662V137.665ZM111.369 120.963C106.642 125.299 104.514 129.088 105.375 131.657C106.113 133.86 109.118 135.258 114.063 135.691C122.635 136.445 128.733 135.335 130.789 132.643C131.727 131.416 131.828 129.869 131.105 127.908C128.778 121.574 113.803 121.011 111.372 120.963H111.369Z" fill="#1C1C1C"/>
<path d="M157.878 120.086C167.523 128.801 166.992 135.497 154.929 136.559C142.866 137.622 134.204 135.151 136.994 127.605C139.757 120.086 157.878 120.086 157.878 120.086Z" fill="#FF814A"/>
<path d="M149.927 137.665C143.332 137.665 138.73 136.302 136.743 133.701C135.433 131.984 135.241 129.832 136.177 127.303C139.115 119.305 157.114 119.215 157.879 119.215C158.094 119.215 158.304 119.295 158.464 119.441C163.993 124.436 166.321 128.852 165.194 132.213C164.203 135.168 160.775 136.921 155.007 137.431C153.205 137.591 151.508 137.668 149.927 137.668V137.665ZM157.547 120.963C155.116 121.011 140.141 121.574 137.813 127.906C137.088 129.867 137.192 131.416 138.13 132.641C140.186 135.332 146.281 136.446 154.855 135.688C159.8 135.253 162.803 133.858 163.544 131.655C164.405 129.088 162.277 125.297 157.55 120.961L157.547 120.963Z" fill="#1C1C1C"/>
<path d="M100.616 46.8054C80.2899 35.6035 65.3176 38.7095 71.7396 52.8316L100.616 46.8054Z" fill="#F4D93B"/>
<path d="M71.743 53.7029C71.4108 53.7029 71.0946 53.5142 70.9485 53.1927C68.0231 46.7628 69.6599 43.3299 71.5463 41.5842C76.3981 37.0912 87.9747 38.8422 101.039 46.0427C101.462 46.2739 101.616 46.8053 101.382 47.2277C101.148 47.6502 100.619 47.8016 100.197 47.5705C86.1015 39.8014 76.2466 39.6101 72.7314 42.8649C70.077 45.3227 71.1611 49.4463 72.5374 52.4727C72.7367 52.9111 72.5427 53.4292 72.1043 53.6285C71.9874 53.6816 71.8652 53.7082 71.743 53.7082V53.7029Z" fill="#232323"/>
<path d="M174.283 115.362C168.265 123.375 156.484 129.659 133.976 129.659C131.848 129.659 129.815 129.604 127.876 129.495C123.46 129.247 119.517 128.729 116.001 127.985C101.956 125.015 94.7002 118.444 91.084 111.161C86.2907 101.506 87.8929 90.6011 88.5518 85.1861C89.6146 76.4552 90.7253 70.2882 91.7456 64.4747C92.0059 62.9814 92.261 61.5147 92.5081 60.0321C93.1299 56.3043 93.903 52.8635 94.8117 49.6883C101.154 27.4916 114.091 18.3488 127.926 16.3932C129.93 16.1089 131.952 15.9761 133.976 15.9761C138.254 15.9761 142.59 16.5022 146.775 17.7696C160.206 21.8375 172.086 33.5469 175.444 60.0321C176.372 67.3389 178.069 74.2153 179.403 85.1861C180.161 91.4062 182.161 104.867 174.283 115.362Z" fill="#F4D93B"/>
<path d="M129.171 17.7694C129.171 17.7694 107.25 19.5257 97.8895 49.7174L95.2936 51.1947L94.8047 49.6882C101.147 27.4914 114.084 18.3486 127.919 16.3931L129.171 17.7694Z" fill="white"/>
<path d="M174.284 115.362C175.424 110.515 177.432 104.298 176.872 97.9079C174.932 75.8546 175.277 30.1539 144.047 18.8191L146.776 17.7695C160.207 21.8374 172.086 33.5469 175.445 60.0321C176.372 67.3389 178.07 74.2152 179.404 85.1861C180.161 91.4062 182.162 104.867 174.284 115.362Z" fill="white"/>
<path d="M121.074 101.628C120.253 107.898 118.297 117.926 116.001 127.986C101.956 125.015 94.7002 118.444 91.084 111.161C86.2907 101.506 87.8929 90.6013 88.5518 85.1863C89.6146 76.4553 90.7253 70.2884 91.7456 64.4748L94.368 54.9733C137.813 54.333 124.794 73.1978 121.074 101.628Z" fill="#E2B639"/>
<path d="M133.974 130.53C115.279 130.53 101.954 126.178 94.3657 117.596C84.9758 106.973 86.7453 92.6493 87.5956 85.7676L87.6806 85.0795C88.685 76.8215 89.7132 70.9734 90.707 65.3166C91.0338 63.454 91.342 61.6951 91.6449 59.8883C94.2674 44.1561 99.7674 32.343 107.996 24.7784C114.979 18.3564 123.72 15.1016 133.974 15.1016C144.227 15.1016 153.445 18.205 160.382 24.3214C168.906 31.8381 174.265 43.816 176.306 59.9228C176.707 63.0953 177.267 66.2518 177.863 69.5944C178.636 73.9492 179.513 78.8833 180.264 85.0795L180.349 85.7676C181.2 92.652 182.972 106.973 173.579 117.596C165.994 126.178 152.666 130.53 133.971 130.53H133.974ZM133.974 16.8472C124.172 16.8472 115.829 19.948 109.176 26.0644C101.242 33.3606 95.9227 44.8363 93.364 60.1779C93.0611 61.9926 92.7529 63.7542 92.4234 65.6195C91.4323 71.2523 90.4094 77.0792 89.4103 85.292L89.3253 85.9855C88.5069 92.6148 86.8011 106.41 95.6703 116.446C102.911 124.637 115.797 128.79 133.971 128.79C152.145 128.79 165.032 124.637 172.272 116.446C181.141 106.41 179.438 92.6148 178.617 85.9855L178.532 85.2947C177.785 79.1437 176.914 74.2335 176.143 69.9026C175.546 66.5388 174.982 63.361 174.573 60.146C170.035 24.3613 149.988 16.8499 133.971 16.8499L133.974 16.8472Z" fill="#1C1C1C"/>
<path d="M135.676 20.3044L126.961 19.5631C127.338 17.4136 127.864 15.5564 128.483 13.994C131.411 6.59157 136.401 5.82901 137.307 12.1208C137.307 12.1208 140.036 6.16113 147.21 7.88022C149.187 8.35583 150.143 9.60198 150.228 11.1324C150.454 15.1312 144.726 21.0776 135.676 20.3044Z" fill="#F4D93B"/>
<path d="M150.229 11.1324C147.761 9.91816 140.659 9.25922 138.754 11.2706C136.508 13.6406 137.282 12.0863 136.928 11.244C136.575 10.3991 130.108 11.0235 127.969 18.3914L128.484 13.994C131.412 6.59157 136.402 5.82901 137.308 12.1208C137.308 12.1208 140.037 6.16113 147.211 7.88022C149.188 8.35583 150.144 9.60198 150.229 11.1324Z" fill="white"/>
<path d="M126.453 19.475C126.299 15.4656 128.345 9.79818 131.853 7.54768C133.524 6.48222 135.604 6.64961 136.824 8.29697C137.621 9.36243 137.95 10.768 138.043 12.0115L136.619 11.8069C136.725 11.581 136.816 11.4216 136.922 11.2409C138.968 7.76025 142.871 6.13681 146.796 6.95251C152.516 7.97281 151.823 13.4516 148.488 16.7782C146.277 19.0287 143.31 20.4236 140.225 20.8966C138.692 21.1251 137.129 21.1011 135.623 20.8514C135.32 20.8009 135.115 20.5166 135.166 20.2137C135.211 19.9427 135.445 19.7514 135.71 19.7487C137.156 19.7434 138.58 19.6371 139.967 19.3714C142.704 18.8586 145.371 17.6523 147.308 15.641C148.873 14.0547 150.592 10.8185 148.26 9.20301C147.771 8.86557 147.075 8.67958 146.487 8.56533C145.812 8.43779 145.13 8.37136 144.457 8.38996C141.747 8.40591 139.242 10.0665 137.982 12.4286C137.663 13.0769 136.678 12.9255 136.558 12.224C136.21 10.6936 135.341 8.16146 133.375 9.0861C129.985 11.0231 128.956 16.2149 127.45 19.6478C127.253 20.1606 126.461 20.025 126.451 19.4724L126.453 19.475Z" fill="#1C1C1C"/>
<path d="M121.04 44.7142C127.356 40.8907 130.499 40.6516 136.932 44.8629C138.415 45.8407 137.939 47.3233 136.634 47.8574C133.52 49.1036 124.715 49.1912 121.216 48.0062C119.614 47.4429 119.319 45.7823 121.038 44.7142H121.04Z" fill="#FF814A"/>
<path d="M120.694 44.1455C122.944 42.8516 125.41 41.5815 128.054 41.2759C130.761 40.9624 133.434 42.0545 135.708 43.3405C136.096 43.545 136.466 43.7762 136.838 43.9994C137.263 44.2545 137.698 44.4989 138.031 44.9054C139.064 46.048 138.522 47.7644 137.22 48.4313C136.078 48.984 134.784 49.2045 133.546 49.3905C129.626 49.8581 125.622 49.9166 121.764 48.976C121.345 48.8352 120.744 48.6917 120.367 48.4286C118.541 47.2941 118.956 45.11 120.694 44.1455ZM121.39 45.2827C120.51 45.8274 120.205 46.8052 121.334 47.233C123.162 47.7963 125.115 47.8574 127.068 47.9504C129.967 48.0035 132.908 47.9902 135.738 47.3286C135.868 47.2808 136.378 47.1453 136.495 47.0736C137.446 46.5714 137.202 45.7982 136.365 45.3173C135.929 45.033 135.491 44.7248 135.044 44.4644C132.937 43.1731 130.636 42.1288 128.16 42.3706C125.67 42.6576 123.502 43.9675 121.387 45.2827H121.39Z" fill="#232323"/>
<path d="M111.373 54.4653L109.935 65.7577L100.806 137.407C100.806 142.152 83.2321 146 61.5535 146C60.5518 146 59.5607 145.992 58.5776 145.976C44.0969 145.737 31.8108 143.781 25.9601 141.036C23.6112 139.934 22.3013 138.703 22.3013 137.407L11.7344 54.4653H111.373Z" fill="#9F9DA8"/>
<path d="M109.936 65.7583L100.806 137.408C100.806 142.153 83.2326 146 61.554 146C60.5523 146 59.5612 145.992 58.5781 145.976C58.703 88.4253 69.0175 62.1793 109.936 65.7583Z" fill="#8A8899"/>
<path d="M25.9601 141.036C23.6112 139.934 22.3013 138.703 22.3013 137.407L11.7344 54.4653H12.5766L15.5126 57.4545L25.9601 141.036Z" fill="white"/>
<path d="M61.5596 146.871C51.0139 146.871 41.0899 145.97 33.6183 144.334C25.5915 142.577 21.4944 140.266 21.4359 137.468L10.8743 54.5742C10.8424 54.3244 10.9194 54.0747 11.0842 53.8887C11.2489 53.7027 11.488 53.5938 11.7378 53.5938H111.376C111.626 53.5938 111.865 53.7027 112.03 53.8887C112.194 54.0747 112.271 54.3271 112.24 54.5742L101.678 137.468C101.619 140.268 97.5223 142.577 89.4955 144.334C82.0213 145.97 72.1 146.871 61.5542 146.871H61.5596ZM12.7315 55.3368L23.1736 137.298C23.1789 137.335 23.1816 137.372 23.1816 137.407C23.1816 137.885 23.7023 140.377 33.993 142.63C41.3476 144.241 51.1387 145.125 61.5622 145.125C71.9857 145.125 81.7768 144.238 89.1314 142.63C99.4221 140.377 99.9429 137.885 99.9429 137.407C99.9429 137.37 99.9429 137.332 99.9508 137.298L110.393 55.3368H12.7342H12.7315Z" fill="#1C1C1C"/>
<path d="M111.373 54.4654C111.373 57.6273 101.868 60.3986 87.6135 61.9396C80.0331 62.7606 71.1081 63.2336 61.5535 63.2336C47.0169 63.2336 33.9364 62.1389 24.8282 60.3906C16.6977 58.8283 11.7344 56.7505 11.7344 54.4654C11.7344 51.2451 21.5919 48.4313 36.2826 46.9062C43.6903 46.1383 52.3283 45.6973 61.5535 45.6973C69.3014 45.6973 76.6374 46.0081 83.1763 46.5634C99.8597 47.9796 111.373 50.9847 111.373 54.4654Z" fill="#232323"/>
<path d="M61.5578 64.1055C47.5792 64.1055 34.1321 63.064 24.6677 61.2466C15.509 59.4876 10.8672 57.2052 10.8672 54.4658C10.8672 52.4306 13.2824 50.7141 18.2511 49.2156C22.5979 47.9057 28.8021 46.8057 36.1966 46.0404C43.8567 45.246 52.6249 44.8262 61.5578 44.8262C69.1622 44.8262 76.461 45.1184 83.255 45.695C91.6273 46.4071 98.7215 47.5151 103.767 48.8994C109.475 50.467 112.251 52.2871 112.251 54.4658C112.251 56.4692 109.913 58.1618 105.101 59.6444C100.903 60.9383 94.8901 62.0304 87.7135 62.8062C79.8673 63.6565 70.8228 64.1055 61.5605 64.1055H61.5578ZM61.5578 46.5692C52.686 46.5692 43.979 46.9863 36.3772 47.7728C17.5788 49.7257 12.6102 53.0045 12.6102 54.4658C12.6102 55.7067 15.8544 57.7791 24.9972 59.5354C34.3579 61.3316 47.6829 62.3625 61.5578 62.3625C70.7591 62.3625 79.7371 61.9161 87.5249 61.0738C105.704 59.1077 110.505 55.8927 110.505 54.4658C110.505 52.574 103.209 49.1385 83.1062 47.4327C76.3627 46.8588 69.1117 46.5692 61.5578 46.5692Z" fill="#232323"/>
<path d="M65.278 73.9174C50.4545 73.9174 32.1025 71.7679 12.7567 64.3973C12.483 64.2937 12.3449 63.9855 12.4485 63.7118C12.5521 63.4381 12.8603 63.3 13.134 63.4036C39.8503 73.5826 64.6696 73.7288 80.7844 72.0575C98.257 70.2454 109.555 65.9676 109.666 65.9251C109.94 65.8188 110.248 65.957 110.352 66.2306C110.458 66.5043 110.32 66.8125 110.046 66.9162C109.932 66.9587 98.5333 71.279 80.9305 73.1097C76.3578 73.5853 71.0836 73.9147 65.2727 73.9147L65.278 73.9174Z" fill="#1C1C1C"/>
<path d="M59.9036 138.648C48.4173 138.648 34.9515 137.13 21.3981 132.231C21.1217 132.13 20.9782 131.827 21.0792 131.551C21.1802 131.274 21.4831 131.131 21.7594 131.232C42.2317 138.632 62.5234 138.241 75.9413 136.61C90.4965 134.84 100.33 131.269 100.428 131.232C100.705 131.131 101.01 131.272 101.111 131.548C101.212 131.824 101.071 132.13 100.795 132.231C100.697 132.268 90.7702 135.874 76.1008 137.662C71.4351 138.23 65.943 138.65 59.9036 138.65V138.648Z" fill="#1C1C1C"/>
<path d="M28.3625 125.363C27.1482 125.363 26.1093 124.443 25.9844 123.208L21.34 76.6222C21.2098 75.3069 22.1689 74.1352 23.4815 74.005C24.7941 73.8748 25.9658 74.834 26.0987 76.1466L30.7432 122.732C30.8733 124.047 29.9142 125.219 28.6016 125.349C28.5219 125.357 28.4422 125.363 28.3625 125.363Z" fill="#232323"/>
<path d="M43.4128 127.828C42.1215 127.828 41.056 126.797 41.0242 125.498L39.8524 80.3419C39.8179 79.0214 40.8594 77.924 42.1799 77.8895C43.4952 77.855 44.5978 78.8965 44.6324 80.2171L45.8041 125.373C45.8387 126.694 44.7971 127.791 43.4766 127.826C43.4553 127.826 43.4341 127.826 43.4128 127.826V127.828Z" fill="#232323"/>
<path d="M60.6807 128.995C60.6807 128.995 60.6568 128.995 60.6435 128.995C59.323 128.976 58.2681 127.89 58.2894 126.569L58.9643 81.4077C58.9829 80.0872 60.0749 79.0297 61.3901 79.0536C62.7107 79.0722 63.7655 80.1589 63.7442 81.4795L63.0694 126.641C63.0508 127.948 61.9826 128.998 60.678 128.998L60.6807 128.995Z" fill="#232323"/>
<path d="M93.2992 125.362C93.2195 125.362 93.1398 125.36 93.0601 125.349C91.7449 125.219 90.7857 124.047 90.9185 122.732L95.563 76.1465C95.6932 74.8313 96.8676 73.8721 98.1802 74.005C99.4954 74.1352 100.455 75.3069 100.322 76.6221L95.6773 123.208C95.5551 124.441 94.5135 125.362 93.2992 125.362Z" fill="#232323"/>
<path d="M78.2515 127.828C78.2303 127.828 78.209 127.828 78.1877 127.828C76.8672 127.794 75.8257 126.696 75.8602 125.376L77.0319 80.2199C77.0665 78.9206 78.1293 77.8896 79.4206 77.8896C79.4419 77.8896 79.4631 77.8896 79.4844 77.8896C80.8049 77.9242 81.8465 79.0215 81.8119 80.3421L80.6402 125.498C80.6056 126.797 79.5428 127.828 78.2515 127.828Z" fill="#232323"/>
<path d="M92.3543 60.3824L87.6115 61.9394C80.031 62.7605 71.1061 63.2334 61.5514 63.2334C49.0342 63.2334 37.5984 62.423 28.8462 61.0786C27.4353 60.8633 26.0908 60.6322 24.8261 60.3904L24.7969 60.3824C24.7969 60.3824 24.7995 60.3718 24.7995 60.3665C25.7587 55.1507 30.815 50.5116 36.2805 46.906C40.9622 43.8186 45.9414 41.4963 48.8987 40.2316C50.5381 39.5301 51.5584 39.1528 51.5584 39.1528L74.5708 41.313C78.0409 42.7265 80.8733 44.5731 83.1743 46.5633C90.3801 52.7833 92.3543 60.3824 92.3543 60.3824Z" fill="#20D34F"/>
<path d="M50.7588 41.2815C50.7588 41.2815 31.785 53.0202 28.8411 61.0789C28.6816 61.52 28.5674 61.9478 28.5089 62.3623L24.6562 61.2463L24.821 60.3907L24.7944 60.3668C25.7536 55.1511 30.8099 50.5119 36.2754 46.9064C40.9571 43.8189 45.9363 41.4967 48.8936 40.2319L50.7588 41.2815Z" fill="white"/>
<path d="M61.5571 64.1048C47.5785 64.1048 34.1313 63.0633 24.667 61.2459C24.6457 61.2406 24.6245 61.2379 24.6032 61.2326L24.574 61.2246C24.1356 61.1077 23.8619 60.672 23.9443 60.2256C24.7999 55.5306 28.7907 50.8038 35.8052 46.1779C43.0828 41.3794 51.1814 38.3636 51.2611 38.3344C51.3833 38.2892 51.5135 38.2733 51.6437 38.2839L74.6562 40.4441C74.7412 40.4521 74.8236 40.4733 74.9033 40.5052C78.1687 41.8364 81.1446 43.6511 83.7485 45.9043C91.0765 52.228 93.1198 59.843 93.2022 60.1645C93.3191 60.6109 93.0667 61.0679 92.6309 61.2113L87.8881 62.7684C87.8297 62.787 87.7712 62.8002 87.7101 62.8056C79.8639 63.6558 70.8194 64.1048 61.5571 64.1048ZM25.8547 59.6942C35.1622 61.392 48.1019 62.3618 61.5597 62.3618C70.7264 62.3618 79.67 61.9208 87.4338 61.0838L91.2705 59.8244C90.5584 57.7705 88.191 52.0393 82.6113 47.2248C80.1828 45.1231 77.4088 43.4253 74.3665 42.1711L51.6836 40.0429C50.456 40.5132 43.2715 43.3482 36.7671 47.6366C30.6054 51.7019 26.9388 55.7538 25.8547 59.6968V59.6942Z" fill="#232323"/>
<path d="M73.0661 37.8245L52.6549 36.9291C52.2006 36.201 51.8684 35.5527 51.6399 34.9762C49.8704 30.4938 54.2491 30.2865 54.2491 30.2865C55.676 24.7387 60.1185 25.8094 63.469 27.5764C65.7354 28.772 67.5023 30.2865 67.5023 30.2865C79.2251 24.4411 73.0661 37.8245 73.0661 37.8245Z" fill="#20D34F"/>
<path d="M65.7886 29.5904C65.5229 29.5319 56.7547 27.5631 55.5272 31.9764C55.5272 31.9764 53.0535 32.545 53.9834 36.6209L51.6399 34.9762C49.8704 30.4938 54.2491 30.2865 54.2491 30.2865C55.676 24.7387 60.1185 25.8094 63.469 27.5764L65.7886 29.5904Z" fill="white"/>
<path d="M73.0599 38.696C73.0599 38.696 73.0334 38.696 73.0227 38.696L52.6115 37.8006C52.3245 37.7873 52.0615 37.6358 51.91 37.3914C50.353 34.8991 49.9545 32.8877 50.725 31.4158C51.3972 30.1298 52.755 29.6701 53.5601 29.5054C54.227 27.3904 55.4093 26.0539 57.0833 25.5251C60.9253 24.3135 66.0746 28.0413 67.6183 29.2583C70.9768 27.672 73.2459 27.5152 74.5479 28.7747C75.6479 29.8428 75.8418 31.7957 75.1218 34.5829C74.6302 36.4907 73.8836 38.1194 73.8517 38.1885C73.7082 38.4994 73.4 38.696 73.0599 38.696ZM53.1535 36.0788L72.5019 36.9264C73.5249 34.4899 74.3751 31.0358 73.3336 30.0261C72.6082 29.322 70.6234 29.702 67.8867 31.065C67.5732 31.2218 67.1959 31.174 66.9302 30.9481C65.336 29.5851 60.5533 26.2558 57.604 27.1884C56.3845 27.5737 55.5608 28.6578 55.0852 30.5044C54.9895 30.8737 54.6654 31.1394 54.2828 31.158C54.2721 31.158 52.7683 31.2563 52.2634 32.2315C51.8489 33.0312 52.1651 34.389 53.1509 36.0788H53.1535Z" fill="#232323"/>
<path d="M74.6803 37.9618L51.0823 36.4317C49.9841 36.3605 49.036 37.1931 48.9648 38.2913C48.8936 39.3896 49.7262 40.3376 50.8244 40.4089L74.4224 41.939C75.5206 42.0102 76.4687 41.1776 76.5399 40.0794C76.6111 38.9811 75.7785 38.033 74.6803 37.9618Z" fill="#9F9DA8"/>
<path d="M74.5503 42.8173C74.4866 42.8173 74.4254 42.8173 74.3617 42.812L50.7647 41.2816C50.0021 41.2311 49.3033 40.8883 48.7985 40.3144C48.2937 39.7405 48.0439 39.0019 48.0917 38.2393C48.1422 37.4767 48.485 36.7779 49.0589 36.2731C49.6355 35.7683 50.3715 35.5185 51.134 35.5663L74.731 37.0968C75.4936 37.1473 76.1924 37.49 76.6972 38.0639C77.202 38.6378 77.4518 39.3765 77.404 40.1391C77.3535 40.9016 77.0107 41.6004 76.4368 42.1053C75.9107 42.5676 75.2465 42.8173 74.5503 42.8173ZM74.4733 41.0717C74.7735 41.0903 75.0605 40.992 75.2863 40.7953C75.5122 40.5987 75.645 40.3251 75.6663 40.0248C75.6849 39.7246 75.5866 39.4376 75.3899 39.2118C75.1933 38.9859 74.9197 38.8531 74.6194 38.8318L51.0224 37.3014C50.7222 37.2828 50.4352 37.3811 50.2094 37.5777C49.9835 37.7743 49.8507 38.048 49.8294 38.3482C49.8108 38.6485 49.9091 38.9354 50.1057 39.1613C50.3024 39.3871 50.576 39.52 50.8763 39.5412L74.4733 41.0717Z" fill="#232323"/>
<path d="M111.235 40.3833C111.062 40.3833 110.889 40.3541 110.719 40.2877C109.964 40.0034 109.582 39.1584 109.869 38.4038C111.349 34.4874 114.266 33.3449 116.506 33.5813C119.158 33.863 121.299 35.9673 121.714 38.7014C121.836 39.4985 121.286 40.2452 120.489 40.3647C119.692 40.4843 118.945 39.9369 118.826 39.1398C118.61 37.7183 117.532 36.6289 116.201 36.4881C114.705 36.3287 113.36 37.4314 112.606 39.4374C112.385 40.022 111.83 40.3833 111.237 40.3833H111.235Z" fill="#1C1C1C"/>
<path d="M147.634 40.3833C147.044 40.3833 146.489 40.022 146.266 39.4374C145.509 37.434 144.164 36.3314 142.671 36.4881C141.34 36.6289 140.261 37.7183 140.046 39.1398C139.924 39.9369 139.18 40.4869 138.383 40.3647C137.585 40.2425 137.035 39.4985 137.158 38.7014C137.572 35.9673 139.714 33.863 142.365 33.5813C144.603 33.3449 147.523 34.4874 149.003 38.4038C149.287 39.1584 148.907 40.0034 148.152 40.2877C147.982 40.3514 147.807 40.3833 147.637 40.3833H147.634Z" fill="#1C1C1C"/>
<path d="M193.199 114.384C187.58 108.953 173.386 102.09 156.054 96.898C138.723 91.7061 123.094 89.6337 115.415 91.0791L111.839 90.0083L110.51 93.9938C108.879 99.4381 126.625 109.561 150.148 116.61C173.67 123.657 194.06 124.959 195.692 119.515L197.02 115.529L193.197 114.384H193.199Z" fill="#B7B6BF"/>
<path d="M184.999 123.75C183.675 123.75 182.344 123.699 181.072 123.617C172.404 123.064 161.333 120.872 149.897 117.445C138.458 114.017 128.006 109.761 120.462 105.456C114.891 102.278 108.498 97.6658 109.672 93.7414C109.672 93.7334 109.677 93.7255 109.68 93.7148L111.009 89.7293C111.157 89.2829 111.633 89.0332 112.085 89.1687L115.459 90.181C123.571 88.7462 139.55 91.0419 156.3 96.061C173.047 101.077 187.658 107.948 193.645 113.605L197.266 114.689C197.492 114.756 197.681 114.913 197.79 115.122C197.898 115.332 197.917 115.577 197.843 115.8L196.517 119.775C195.563 122.908 190.326 123.744 184.993 123.744L184.999 123.75ZM111.341 94.2569C110.605 96.7784 116.014 100.913 121.328 103.944C128.76 108.185 139.083 112.386 150.399 115.776C161.715 119.166 172.646 121.332 181.186 121.877C187.3 122.267 194.102 121.786 194.859 119.265C194.859 119.257 194.864 119.249 194.867 119.238L195.911 116.106L192.951 115.218C192.818 115.178 192.696 115.106 192.595 115.011C186.893 109.503 172.455 102.722 155.806 97.7323C139.157 92.745 123.369 90.468 115.579 91.9346C115.443 91.9612 115.302 91.9532 115.167 91.9134L112.401 91.0844L111.343 94.2542L111.341 94.2569Z" fill="#232323"/>
<path d="M197.02 115.529C195.981 119.004 187.295 119.73 175.033 117.968C168.085 116.972 159.984 115.173 151.476 112.625C127.956 105.578 110.207 95.4524 111.838 90.0082C113.47 84.5639 133.86 85.8659 157.382 92.9123C164.179 94.9502 170.492 97.2432 175.997 99.6053C189.543 105.422 198.181 111.66 197.02 115.529Z" fill="#9F9DA8"/>
<path d="M197.017 115.529C195.979 119.004 187.293 119.73 175.031 117.968C175.326 117.979 175.636 117.995 175.961 118.011C200.565 119.249 197.589 109.599 173.492 99.4966L175.995 99.6055C189.541 105.422 198.179 111.66 197.017 115.529Z" fill="white"/>
<path d="M186.335 119.764C185.011 119.764 183.68 119.714 182.408 119.631C173.74 119.078 162.668 116.886 151.233 113.459C139.794 110.031 129.342 105.775 121.798 101.47C116.226 98.2926 109.834 93.68 111.008 89.7556C112.182 85.8338 120.063 85.4964 126.461 85.9029C135.128 86.4556 146.2 88.6476 157.636 92.0752C178.688 98.383 199.939 108.833 197.858 115.776C196.917 118.919 191.67 119.761 186.332 119.761L186.335 119.764ZM122.696 87.5264C117.783 87.5264 113.282 88.2358 112.677 90.2578C111.922 92.7793 117.34 96.9216 122.659 99.9559C130.091 104.197 140.413 108.397 151.73 111.788C163.043 115.178 173.977 117.343 182.516 117.888C188.63 118.279 195.432 117.798 196.189 115.276C196.944 112.755 191.526 108.612 186.207 105.578C178.775 101.338 168.453 97.1368 157.137 93.7465C145.82 90.3561 134.887 88.1906 126.35 87.6459C125.141 87.5689 123.905 87.5264 122.696 87.5264Z" fill="#232323"/>
<path d="M164.6 106.976C164.412 106.976 164.22 106.949 164.029 106.894C162.974 106.58 162.374 105.469 162.69 104.415C163.928 100.264 161.157 98.4788 154.99 95.6544C154.06 95.2293 153.098 94.7882 152.203 94.3339C149.086 92.7503 146.803 92.2773 145.228 92.8964C143.897 93.4172 142.791 94.8467 141.941 97.1423C141.558 98.1732 140.413 98.702 139.38 98.3194C138.349 97.9368 137.82 96.7916 138.203 95.758C139.465 92.3491 141.341 90.1358 143.777 89.1846C147.369 87.779 151.339 89.4237 154.009 90.7814C154.833 91.1986 155.715 91.6051 156.65 92.0329C161.808 94.395 168.87 97.6312 166.508 105.554C166.25 106.418 165.458 106.979 164.6 106.979V106.976Z" fill="#232323"/>
<path d="M153.389 70.5537C139.259 91.3847 144.509 114.857 171.688 90.1492L153.389 70.5537Z" fill="#F4D93B"/>
<path d="M152.855 101.628C150.517 101.628 148.944 100.804 147.929 99.922C145.285 97.629 144.331 93.2529 145.243 87.6014C146.144 82.0243 148.779 75.7962 152.667 70.0624C152.938 69.6638 153.48 69.5602 153.878 69.8312C154.277 70.1022 154.38 70.6443 154.109 71.0428C150.36 76.5694 147.823 82.5477 146.962 87.8804C146.162 92.841 146.93 96.7495 149.069 98.6067C150.918 100.212 156.766 102.534 171.098 89.5065C171.454 89.1823 172.007 89.2089 172.328 89.5649C172.653 89.921 172.626 90.4736 172.27 90.7978C162.957 99.263 156.811 101.63 152.852 101.63L152.855 101.628Z" fill="#232323"/>
</svg>

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -1,36 +1,36 @@
ente je jednoduchá aplikace pro automatické zálohování a organizaci vašich fotek a videí.
ente is a simple app to backup and share your photos and videos.
Pokud hledáte alternativu ke službě Google Photos, která respektuje vaše soukromí, jste na správném místě. S Ente jsou uloženy s koncovým "end-to-end" šifrováním (e2ee). To znamená, že je můžete vidět pouze vy.
If you've been looking for a privacy-friendly alternative to Google Photos, you've come to the right place. With ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
Máme aplikace napříč všemi platformami a vaše fotky se budou bezproblémově synchronizovat mezi všemi vašimi zařízeními tak, aby byly koncově šifrovány mezi jednotlivými zařízeními (e2ee).
We have open-source apps across Android, iOS, web and desktop, and your photos will seamlessly sync between all of them in an end-to-end encrypted (e2ee) manner.
ente také usnadňuje sdílení vašich alb s vašimi blízkými, i když nejsou na ente. Můžete sdílet veřejně přístupné odkazy, kde si mohou prohlížet vaše album a spolupracovat přidáváním fotografií, a to i bez účtu nebo aplikace.
ente also makes it simple to share your albums with your loved ones, even if they aren't on ente. You can share publicly viewable links, where they can view your album and collaborate by adding photos to it, even without an account or app.
Vaše šifrovaná data jsou uložena na 3 místech, včetně protiatomového krytu v Paříži. Bereme budoucnost vážně a usnadňujeme vám zajistit, aby vaše vzpomínky přežily vás samotné.
Your encrypted data is replicated to 3 different locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
Jsme tu, abychom vytvořili nejbezpečnější aplikaci pro fotografie, jaká kdy byla. Přidejte se k nám!
We are here to make the safest photos app ever, come join our journey!
VLASTNOSTI
- Zálohování v původní kvalitě, protože každý pixel je důležitý
- Rodinné plány, takže můžete sdílet úložiště s rodinou
- Společná alba, do kterých můžete po cestě shromažďovat fotografie
- Sdílené složky, aby i váš partner mohl obdivovat vaše fotografie
- Odkazy na alba, které lze chránit heslem a nastavit jejich platnost
- Možnost uvolnit místo odstraněním souborů, které byly bezpečně zálohovány
- Lidská podpora, protože si to zasloužíte
- Popisy, abyste mohli své vzpomínky opatřit popisky a snadno je najít
- Editor obrázků pro doladění detailů
- Označte si své oblíbené fotografie, skryjte je a nebo je prožijte znovu pomocí vzpomínek
- Import jedním kliknutím z Google, Apple, pevného disku a dalších zdrojů
- Tmavý motiv, protože vaše fotografie v něm vypadají dobře
- 2FA, 3FA, biometrické ověření
- a ještě MNOHEM víc!
FEATURES
- Original quality backups, because every pixel is important
- Family plans, so you can share storage with your family
- Collaborative albums, so you can pool together photos after a trip
- Shared folders, in case you want your partner to enjoy your "Camera" clicks
- Album links, that can be protected with a password
- Ability to free up space, by removing files that have been safely backed up
- Human support, because you're worth it
- Descriptions, so you can caption your memories and find them easily
- Image editor, to add finishing touches
- Favorite, hide and relive your memories, for they are precious
- One-click import from Google, Apple, your hard drive and more
- Dark theme, because your photos look good in it
- 2FA, 3FA, biometric auth
- and a LOT more!
OPRÁVNĚNÍ
ente žádá o určitá oprávnění, aby mohla plnit funkci poskytovatele úložiště fotografií. Tyto oprávnění si můžete prohlédnout zde: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
ente requests for certain permissions to serve the purpose of a photo storage provider, which can be reviewed here: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
CENY
Nenabízíme doživotní tarify, protože je pro nás důležité zůstat udržitelnými a obstát ve zkoušce času. Místo toho nabízíme cenově dostupné plány, které můžete svobodně sdílet se svou rodinou. Více informací najdete na ente.io.
PRICING
We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
PODPORA
Jsme hrdí na to, že poskytujeme lidskou podporu. Pokud máte placený tarif, můžete se obrátit na team@ente.io a do 24 hodin od našeho týmu očekávat odpověď.
We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.

View File

@@ -1 +1 @@
ente je aplikace pro ukládání fotografií a videí s koncovým šifrováním
ente is an end-to-end encrypted photo storage app

View File

@@ -1 +1 @@
ente šifrované úložiště fotografií
ente - encrypted photo storage

View File

@@ -1,33 +1,33 @@
Ente je jednoduchá aplikace pro automatické zálohování a organizaci vašich fotek a videí.
Ente is a simple app to automatically backup and organize your photos and videos.
Pokud hledáte alternativu, která respektuje vaše soukromí a umožní vám uchovat vaše vzpomínky, jste na správném místě. S Ente jsou uloženy s koncovým "end-to-end" šifrováním (e2ee). To znamená, že je můžete vidět pouze vy.
If you've been looking for a privacy-friendly alternative to preserve your memories, you've come to the right place. With Ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
Máme aplikace napříč všemi platformami a vaše fotky se budou bezproblémově synchronizovat mezi všemi vašimi zařízeními tak, aby byly koncově šifrovány mezi jednotlivými zařízeními (e2ee).
We have apps across all platforms, and your photos will seamlessly sync between all your devices in an end-to-end encrypted (e2ee) manner.
Ente také zjednodušuje sdílení alb s vašimi blízkými. Můžete je buď sdílet přímo s ostatními uživateli Ente, koncově šifrované; nebo s pomocí veřejně přístupných odkazů.
Ente also makes it simple to share your albums with your loved ones. You can either share them directly with other Ente users, end-to-end encrypted; or with publicly viewable links.
Vaše šifrovaná data jsou uložena na několika místech, včetně protiatomového krytu v Paříži. Bereme budoucnost vážně a usnadňujeme vám zajistit, aby vaše vzpomínky přežily vás samotné.
Your encrypted data is stored across multiple locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
Jsme tu, abychom vytvořili nejbezpečnější aplikaci pro fotografie, jaká kdy byla. Přidejte se k nám!
We are here to make the safest photos app ever, come join our journey!
VLASTNOSTI
- Zálohování v původní kvalitě, protože každý pixel je důležitý
- Rodinné plány, takže můžete sdílet úložiště s rodinou
- Sdílené složky, aby i váš partner mohl obdivovat vaše fotografie
- Odkazy na alba, které lze chránit heslem a nastavit jejich platnost
- Možnost uvolnit místo odstraněním souborů, které byly bezpečně zálohovány
- Editor obrázků, pro finální doladění detailů
- Označte si své oblíbené fotografie, skryjte je a nebo je prožijte znovu pomocí vzpomínek
- Import jedním kliknutím ze všech velkých poskytovatelů úložišť
- Tmavý motiv, protože vaše fotografie v něm vypadají dobře
- 2FA, 3FA, biometrické ověření
- a ještě MNOHEM víc!
FEATURES
- Original quality backups, because every pixel is important
- Family plans, so you can share storage with your family
- Shared folders, in case you want your partner to enjoy your "Camera" clicks
- Album links, that can be protected with a password and set to expire
- Ability to free up space, by removing files that have been safely backed up
- Image editor, to add finishing touches
- Favorite, hide and relive your memories, for they are precious
- One-click import from all major storage providers
- Dark theme, because your photos look good in it
- 2FA, 3FA, biometric auth
- and a LOT more!
CENY
Nenabízíme doživotní tarify, protože je pro nás důležité zůstat udržitelnými a obstát ve zkoušce času. Místo toho nabízíme cenově dostupné plány, které můžete svobodně sdílet se svou rodinou. Více informací najdete na ente.io.
PRICING
We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
PODPORA
Jsme hrdí na to, že poskytujeme lidskou podporu. Pokud máte placený tarif, můžete se obrátit na team@ente.io a do 24 hodin od našeho týmu očekávat odpověď.
SUPPORT
We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
PODMÍNKY
TERMS
https://ente.io/terms

View File

@@ -1 +1 @@
fotky,fotografie,rodina,soukromí,cloud,zálohování,videa,fotka,šifrování,úložiště,album,alternativa
photos,photography,family,privacy,cloud,backup,videos,photo,encryption,storage,album,alternative

View File

@@ -1 +1 @@
Ente Fotky
Ente Photos

View File

@@ -1 +1 @@
Šifrované úložiště fotografií
Encrypted photo storage

View File

@@ -1,30 +1,30 @@
Ente je jednoduchá aplikace pro automatické zálohování a organizaci vašich fotek a videí.
Ente is a simple app to automatically backup and organize your photos and videos.
Pokud hledáte alternativu, která respektuje vaše soukromí a umožní vám uchovat vaše vzpomínky, jste na správném místě. S Ente jsou uloženy s koncovým "end-to-end" šifrováním (e2ee). To znamená, že je můžete vidět pouze vy.
If you've been looking for a privacy-friendly alternative to preserve your memories, you've come to the right place. With Ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
Máme aplikace napříč všemi platformami a vaše fotky se budou bezproblémově synchronizovat mezi všemi vašimi zařízeními tak, aby byly koncově šifrovány mezi jednotlivými zařízeními (e2ee).
We have apps across Android, iOS, web and Desktop, and your photos will seamlessly sync between all your devices in an end-to-end encrypted (e2ee) manner.
Ente také zjednodušuje sdílení alb s vašimi blízkými. Můžete je buď sdílet přímo s ostatními uživateli Ente, koncově šifrované; nebo s pomocí veřejně přístupných odkazů.
Ente also makes it simple to share your albums with your loved ones. You can either share them directly with other Ente users, end-to-end encrypted; or with publicly viewable links.
Vaše šifrovaná data jsou uložena na několika místech, včetně protiatomového krytu v Paříži. Bereme budoucnost vážně a usnadňujeme vám zajistit, aby vaše vzpomínky přežily vás samotné.
Your encrypted data is stored across multiple locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
Jsme tu, abychom vytvořili nejbezpečnější aplikaci pro fotografie, jaká kdy byla. Přidejte se k nám!
We are here to make the safest photos app ever, come join our journey!
VLASTNOSTI
- Zálohování v původní kvalitě, protože každý pixel je důležitý
- Rodinné plány, takže můžete sdílet úložiště s rodinou
- Sdílené složky, aby i váš partner mohl obdivovat vaše fotografie
- Odkazy na alba, které lze chránit heslem a nastavit jejich platnost
- Možnost uvolnit místo odstraněním souborů, které byly bezpečně zálohovány
- Editor obrázků, pro finální doladění detailů
- Označte si své oblíbené fotografie, skryjte je a nebo je prožijte znovu pomocí vzpomínek
- Import jedním kliknutím ze všech velkých poskytovatelů úložišť
- Tmavý motiv, protože vaše fotografie v něm vypadají dobře
- 2FA, 3FA, biometrické ověření
- a ještě MNOHEM víc!
FEATURES
- Original quality backups, because every pixel is important
- Family plans, so you can share storage with your family
- Shared folders, in case you want your partner to enjoy your "Camera" clicks
- Album links, that can be protected with a password and set to expire
- Ability to free up space, by removing files that have been safely backed up
- Image editor, to add finishing touches
- Favorite, hide and relive your memories, for they are precious
- One-click import from Google, Apple, your hard drive and more
- Dark theme, because your photos look good in it
- 2FA, 3FA, biometric auth
- and a LOT more!
💲 CENY
Nenabízíme doživotní tarify, protože je pro nás důležité zůstat udržitelnými a obstát ve zkoušce času. Místo toho nabízíme cenově dostupné plány, které můžete svobodně sdílet se svou rodinou. Více informací najdete na ente.io.
💲 PRICING
We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
🙋 PODPORA
Jsme hrdí na to, že poskytujeme lidskou podporu. Pokud máte placený tarif, můžete se obrátit na team@ente.io a do 24 hodin od našeho týmu očekávat odpověď.
🙋 SUPPORT
We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.

View File

@@ -1 +1 @@
Šifrované úložiště fotografií zálohujte, organizujte a sdílejte své fotografie a videa
Encrypted photo storage - backup, organize and share your photos and videos

View File

@@ -1 +1 @@
Ente Fotky
Ente Photos

View File

@@ -1,38 +0,0 @@
{
"images" : [
{
"filename" : "IconDuckyHuggingEAny.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "IconDuckyHuggingEDark.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"filename" : "IconDuckyHuggingETinted.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -1,6 +0,0 @@
arb-dir: lib/l10n
output-dir: lib/generated/intl
template-arb-file: intl_en.arb
output-localization-file: app_localizations.dart
nullable-getter: false
use-named-parameters: true

View File

@@ -5,6 +5,7 @@ import 'package:adaptive_theme/adaptive_theme.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import "package:flutter_localizations/flutter_localizations.dart";
import 'package:home_widget/home_widget.dart' as hw;
import 'package:logging/logging.dart';
import 'package:media_extension/media_extension_action_types.dart';
@@ -142,10 +143,13 @@ class _EnteAppState extends State<EnteApp> with WidgetsBindingObserver {
debugShowCheckedModeBanner: false,
builder: EasyLoading.init(),
locale: locale,
supportedLocales: AppLocalizations.supportedLocales,
supportedLocales: appSupportedLocales,
localeListResolutionCallback: localResolutionCallBack,
localizationsDelegates: const [
...AppLocalizations.localizationsDelegates,
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
),
),
@@ -164,10 +168,13 @@ class _EnteAppState extends State<EnteApp> with WidgetsBindingObserver {
debugShowCheckedModeBanner: false,
builder: EasyLoading.init(),
locale: locale,
supportedLocales: AppLocalizations.supportedLocales,
supportedLocales: appSupportedLocales,
localeListResolutionCallback: localResolutionCallBack,
localizationsDelegates: const [
...AppLocalizations.localizationsDelegates,
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
),
);

View File

@@ -981,8 +981,7 @@ class FilesDB with SqlDbBase {
// remove references for local files which are either already uploaded
// or queued for upload but not yet uploaded
// Remove queued local files that have duplicate uploaded entries with same localID
Future<int> removeQueuedLocalFiles(Set<String> localIDs, int ownerID) async {
Future<int> removeQueuedLocalFiles(Set<String> localIDs) async {
if (localIDs.isEmpty) {
_logger.finest("No local IDs provided for removal");
return 0;
@@ -991,63 +990,54 @@ class FilesDB with SqlDbBase {
final db = await instance.sqliteAsyncDB;
const batchSize = 10000;
int totalRemoved = 0;
final localIDsList = localIDs.toList();
for (int i = 0; i < localIDsList.length; i += batchSize) {
final endIndex = (i + batchSize > localIDsList.length)
? localIDsList.length
: i + batchSize;
final batch = localIDsList.sublist(i, endIndex);
final placeholders = List.filled(batch.length, '?').join(',');
// Find localIDs that already have uploaded entries
final result = await db.execute(
'''
final List<String> alreadyUploaded = [];
// find localIDs that are already uploaded
final result = await db.execute('''
SELECT DISTINCT $columnLocalID
FROM $filesTable
WHERE
$columnOwnerID = $ownerID
AND $columnLocalID IN ($placeholders)
WHERE $columnLocalID IN ($placeholders)
AND ($columnUploadedFileID IS NOT NULL AND $columnUploadedFileID != -1)
''',
''');
for (final row in result) {
alreadyUploaded.add(row[columnLocalID] as String);
}
final uploadedPlaceholders =
alreadyUploaded.map((id) => "'$id'").join(',');
final r = await db.execute(
'''
DELETE FROM $filesTable
WHERE $columnLocalID IN ($uploadedPlaceholders)
AND ($columnUploadedFileID IS NULL OR $columnUploadedFileID = -1)
''',
batch,
);
if (result.isNotEmpty) {
final alreadyUploadedLocalIDs =
result.map((row) => row[columnLocalID] as String).toList();
final localIdPlaceholder =
List.filled(alreadyUploadedLocalIDs.length, '?').join(',');
// Delete queued entries for localIDs that already have uploaded versions
final deleteResult = await db.execute(
'''
DELETE FROM $filesTable
WHERE $columnLocalID IN ($localIdPlaceholder)
AND ($columnUploadedFileID IS NULL OR $columnUploadedFileID = -1)
''',
alreadyUploadedLocalIDs,
if (r.isNotEmpty) {
_logger.warning(
"Batch ${(i ~/ batchSize) + 1}: Removed duplicate ${r.length} files",
);
final removedCount =
deleteResult.length; // or however your DB returns affected rows
if (removedCount > 0) {
_logger.warning(
"Batch ${(i ~/ batchSize) + 1}: Removed $removedCount queued duplicates",
);
totalRemoved += removedCount;
}
totalRemoved += r.length;
}
}
if (totalRemoved > 0) {
_logger.warning(
"Removed $totalRemoved queued files that had uploaded duplicates",
"Removed $totalRemoved potential dups for already queued local files",
);
} else {
_logger.finest("No queued duplicates found for uploaded files");
_logger.finest("No duplicate id found for queued/uploaded files");
}
return totalRemoved;
}
@@ -1687,36 +1677,26 @@ class FilesDB with SqlDbBase {
);
}
Future<List<EnteFile>> getStreamingEligibleVideoFiles({
DateTime? beginDate,
Future<List<EnteFile>> getAllFilesAfterDate({
required FileType fileType,
required DateTime beginDate,
required int userID,
bool onlyFilesWithLocalId = false,
}) async {
final db = await instance.sqliteAsyncDB;
String query = '''
final results = await db.getAll(
'''
SELECT * FROM $filesTable
WHERE $columnFileType = ?
AND ($columnUploadedFileID IS NOT NULL AND $columnUploadedFileID != -1)
AND $columnOwnerID = ?
AND $columnCreationTime > ?
AND $columnUploadedFileID != -1
AND $columnOwnerID = $userID
AND $columnLocalID IS NOT NULL
AND ($columnFileSize IS NOT NULL AND $columnFileSize <= 524288000)
AND ($columnDuration IS NOT NULL AND ($columnDuration <= 60 AND $columnDuration > 0))
''';
final List<Object> queryArgs = [getInt(FileType.video), userID];
if (beginDate != null) {
query += ' AND $columnCreationTime > ?';
queryArgs.add(beginDate.microsecondsSinceEpoch);
}
if (onlyFilesWithLocalId) {
query += ' AND $columnLocalID IS NOT NULL';
}
query += ' ORDER BY $columnCreationTime DESC';
final results = await db.getAll(query, queryArgs);
ORDER BY $columnCreationTime DESC
''',
[getInt(fileType), beginDate.microsecondsSinceEpoch],
);
return convertToFiles(results);
}

View File

@@ -8,13 +8,11 @@ import "package:path_provider/path_provider.dart";
import "package:photos/models/ml/vector.dart";
import "package:photos/services/machine_learning/semantic_search/query_result.dart";
import "package:photos/src/rust/api/usearch_api.dart";
import "package:shared_preferences/shared_preferences.dart";
class ClipVectorDB {
static final Logger _logger = Logger("ClipVectorDB");
static const _databaseName = "ente.ml.vectordb.clip.usearch";
static const _kMigrationKey = "clip_vectordb_migration";
static const _databaseName = "ente.ml.vectordb.clip";
static final BigInt _embeddingDimension = BigInt.from(512);
@@ -37,10 +35,11 @@ class ClipVectorDB {
Future<VectorDb> _initVectorDB() async {
final documentsDirectory = await getApplicationDocumentsDirectory();
final String dbPath = join(documentsDirectory.path, _databaseName);
_logger.info("Opening vectorDB access: DB path " + dbPath);
final String databaseDirectory =
join(documentsDirectory.path, _databaseName);
_logger.info("Opening vectorDB access: DB path " + databaseDirectory);
final vectorDB = VectorDb(
filePath: dbPath,
filePath: databaseDirectory,
dimensions: _embeddingDimension,
);
final stats = await getIndexStats(vectorDB);
@@ -52,9 +51,10 @@ class ClipVectorDB {
Future<bool> checkIfMigrationDone() async {
if (_migrationDone != null) return _migrationDone!;
_logger.info("Checking if ClipVectorDB migration has run");
final prefs = await SharedPreferences.getInstance();
final migrationDone = prefs.getBool(_kMigrationKey) ?? false;
if (migrationDone) {
final documentsDirectory = await getApplicationDocumentsDirectory();
final migrationFlagFile =
File(join(documentsDirectory.path, 'clip_vector_migration_done'));
if (await migrationFlagFile.exists()) {
_logger.info("ClipVectorDB migration already done");
_migrationDone = true;
return _migrationDone!;
@@ -67,8 +67,10 @@ class ClipVectorDB {
Future<void> setMigrationDone() async {
_logger.info("Setting ClipVectorDB migration done");
final prefs = await SharedPreferences.getInstance();
await prefs.setBool(_kMigrationKey, true);
final documentsDirectory = await getApplicationDocumentsDirectory();
final migrationFlagFile =
File(join(documentsDirectory.path, 'clip_vector_migration_done'));
await migrationFlagFile.create(recursive: true);
_migrationDone = true;
}
@@ -141,6 +143,17 @@ class ClipVectorDB {
}
}
Future<void> deleteIndex() async {
final db = await _vectorDB;
try {
await db.deleteIndex();
_vectorDbFuture = null;
} catch (e, s) {
_logger.severe("Error deleting index", e, s);
rethrow;
}
}
Future<VectorDbStats> getIndexStats([VectorDb? db]) async {
db ??= await _vectorDB;
try {
@@ -267,34 +280,6 @@ class ClipVectorDB {
rethrow;
}
}
Future<void> deleteIndex() async {
final db = await _vectorDB;
try {
await db.deleteIndex();
_vectorDbFuture = null;
} catch (e, s) {
_logger.severe("Error deleting index", e, s);
rethrow;
}
}
Future<void> deleteIndexFile() async {
try {
final documentsDirectory = await getApplicationDocumentsDirectory();
final String dbPath =
join(documentsDirectory.path, _databaseName);
_logger.info("Delete index file: DB path " + dbPath);
final file = File(dbPath);
if (await file.exists()) {
await file.delete();
}
_logger.info("Deleted index file on disk");
} catch (e, s) {
_logger.severe("Error deleting index file on disk", e, s);
rethrow;
}
}
}
class VectorDbStats {

View File

@@ -260,9 +260,6 @@ class MLDataDB with SqlDbBase implements IMLDataDB<int> {
await db.execute(deleteNotPersonFeedbackTable);
await db.execute(deleteClipEmbeddingsTable);
await db.execute(deleteFileDataTable);
if (await ClipVectorDB.instance.checkIfMigrationDone()) {
await ClipVectorDB.instance.deleteIndexFile();
}
}
@override

View File

@@ -53,13 +53,6 @@ class UploadLocksDB {
columnCreatedAt: "created_at",
);
static const _streamQueueTable = (
table: "stream_queue",
columnUploadedFileID: "uploaded_file_id",
columnQueueType: "queue_type", // 'create' or 'recreate'
columnCreatedAt: "created_at",
);
static final initializationScript = [
..._createUploadLocksTable(),
];
@@ -141,26 +134,18 @@ class UploadLocksDB {
${_streamUploadErrorTable.columnCreatedAt} INTEGER DEFAULT CURRENT_TIMESTAMP NOT NULL
)
''',
'''
CREATE TABLE IF NOT EXISTS ${_streamQueueTable.table} (
${_streamQueueTable.columnUploadedFileID} INTEGER PRIMARY KEY,
${_streamQueueTable.columnQueueType} TEXT NOT NULL,
${_streamQueueTable.columnCreatedAt} INTEGER DEFAULT CURRENT_TIMESTAMP NOT NULL
)
''',
];
}
Future<void> clearTable() async {
final db = await database;
final db = await instance.database;
await db.delete(_uploadLocksTable.table);
await db.delete(_trackUploadTable.table);
await db.delete(_partsTable.table);
await db.delete(_streamQueueTable.table);
}
Future<void> acquireLock(String id, String owner, int time) async {
final db = await database;
final db = await instance.database;
final row = <String, dynamic>{};
row[_uploadLocksTable.columnID] = id;
row[_uploadLocksTable.columnOwner] = owner;
@@ -173,7 +158,7 @@ class UploadLocksDB {
}
Future<String> getLockData(String id) async {
final db = await database;
final db = await instance.database;
final rows = await db.query(
_uploadLocksTable.table,
where: '${_uploadLocksTable.columnID} = ?',
@@ -190,7 +175,7 @@ class UploadLocksDB {
}
Future<bool> isLocked(String id, String owner) async {
final db = await database;
final db = await instance.database;
final rows = await db.query(
_uploadLocksTable.table,
where:
@@ -201,7 +186,7 @@ class UploadLocksDB {
}
Future<int> releaseLock(String id, String owner) async {
final db = await database;
final db = await instance.database;
return db.delete(
_uploadLocksTable.table,
where:
@@ -211,7 +196,7 @@ class UploadLocksDB {
}
Future<int> releaseLocksAcquiredByOwnerBefore(String owner, int time) async {
final db = await database;
final db = await instance.database;
return db.delete(
_uploadLocksTable.table,
where:
@@ -221,7 +206,7 @@ class UploadLocksDB {
}
Future<int> releaseAllLocksAcquiredBefore(int time) async {
final db = await database;
final db = await instance.database;
return db.delete(
_uploadLocksTable.table,
where: '${_uploadLocksTable.columnTime} < ?',
@@ -235,7 +220,7 @@ class UploadLocksDB {
String fileHash,
int collectionID,
) async {
final db = await database;
final db = await instance.database;
final rows = await db.query(
_trackUploadTable.table,
@@ -262,7 +247,7 @@ class UploadLocksDB {
String fileHash,
int collectionID,
) async {
final db = await database;
final db = await instance.database;
await db.update(
_trackUploadTable.table,
{
@@ -285,7 +270,7 @@ class UploadLocksDB {
String fileHash,
int collectionID,
) async {
final db = await database;
final db = await instance.database;
final rows = await db.query(
_trackUploadTable.table,
where: '${_trackUploadTable.columnLocalID} = ?'
@@ -343,7 +328,7 @@ class UploadLocksDB {
int uploadedFileID,
String errorMessage,
) async {
final db = await database;
final db = await UploadLocksDB.instance.database;
await db.insert(
_streamUploadErrorTable.table,
@@ -361,7 +346,7 @@ class UploadLocksDB {
int uploadedFileID,
String errorMessage,
) async {
final db = await database;
final db = await instance.database;
await db.update(
_streamUploadErrorTable.table,
{
@@ -375,7 +360,7 @@ class UploadLocksDB {
}
Future<int> deleteStreamUploadErrorEntry(int uploadedFileID) async {
final db = await database;
final db = await instance.database;
return await db.delete(
_streamUploadErrorTable.table,
where: '${_streamUploadErrorTable.columnUploadedFileID} = ?',
@@ -384,7 +369,7 @@ class UploadLocksDB {
}
Future<Map<int, String>> getStreamUploadError() {
return database.then((db) async {
return instance.database.then((db) async {
final rows = await db.query(
_streamUploadErrorTable.table,
columns: [
@@ -413,7 +398,7 @@ class UploadLocksDB {
String keyNonce, {
required int partSize,
}) async {
final db = await database;
final db = await UploadLocksDB.instance.database;
final objectKey = urls.objectKey;
await db.insert(
@@ -456,7 +441,7 @@ class UploadLocksDB {
int partNumber,
String etag,
) async {
final db = await database;
final db = await instance.database;
await db.update(
_partsTable.table,
{
@@ -473,7 +458,7 @@ class UploadLocksDB {
String objectKey,
MultipartStatus status,
) async {
final db = await database;
final db = await instance.database;
await db.update(
_trackUploadTable.table,
{
@@ -487,7 +472,7 @@ class UploadLocksDB {
Future<int> deleteMultipartTrack(
String localId,
) async {
final db = await database;
final db = await instance.database;
return await db.delete(
_trackUploadTable.table,
where: '${_trackUploadTable.columnLocalID} = ?',
@@ -497,7 +482,7 @@ class UploadLocksDB {
// getFileNameToLastAttemptedAtMap returns a map of encrypted file name to last attempted at time
Future<Map<String, int>> getFileNameToLastAttemptedAtMap() {
return database.then((db) async {
return instance.database.then((db) async {
final rows = await db.query(
_trackUploadTable.table,
columns: [
@@ -519,7 +504,7 @@ class UploadLocksDB {
String fileHash,
int collectionID,
) {
return database.then((db) async {
return instance.database.then((db) async {
final rows = await db.query(
_trackUploadTable.table,
where: '${_trackUploadTable.columnLocalID} = ?'
@@ -534,56 +519,4 @@ class UploadLocksDB {
return row[_trackUploadTable.columnEncryptedFileName] as String;
});
}
// Stream Queue Management Methods
Future<void> addToStreamQueue(
int uploadedFileID,
String queueType, // 'create' or 'recreate'
) async {
final db = await database;
await db.insert(
_streamQueueTable.table,
{
_streamQueueTable.columnUploadedFileID: uploadedFileID,
_streamQueueTable.columnQueueType: queueType,
},
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
Future<void> removeFromStreamQueue(int uploadedFileID) async {
final db = await database;
await db.delete(
_streamQueueTable.table,
where: '${_streamQueueTable.columnUploadedFileID} = ?',
whereArgs: [uploadedFileID],
);
}
Future<Map<int, String>> getStreamQueue() async {
final db = await database;
final rows = await db.query(
_streamQueueTable.table,
columns: [
_streamQueueTable.columnUploadedFileID,
_streamQueueTable.columnQueueType,
],
);
final map = <int, String>{};
for (final row in rows) {
map[row[_streamQueueTable.columnUploadedFileID] as int] =
row[_streamQueueTable.columnQueueType] as String;
}
return map;
}
Future<bool> isInStreamQueue(int uploadedFileID) async {
final db = await database;
final rows = await db.query(
_streamQueueTable.table,
where: '${_streamQueueTable.columnUploadedFileID} = ?',
whereArgs: [uploadedFileID],
);
return rows.isNotEmpty;
}
}

View File

@@ -69,7 +69,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
} catch (e) {
showShortToast(
context,
AppLocalizations.of(context).somethingWentWrong,
S.of(context).somethingWentWrong,
);
}
}
@@ -88,7 +88,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
slivers: <Widget>[
TitleBarWidget(
flexibleSpaceTitle: TitleBarTitleWidget(
title: AppLocalizations.of(context).legacy,
title: S.of(context).legacy,
),
),
if (info == null)
@@ -158,7 +158,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
(context, index) {
if (index == 0 && trustedContacts.isNotEmpty) {
return MenuSectionTitle(
title: AppLocalizations.of(context).trustedContacts,
title: S.of(context).trustedContacts,
);
} else if (index > 0 && index <= trustedContacts.length) {
final listIndex = index - 1;
@@ -224,8 +224,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
const SizedBox(height: 16),
ButtonWidget(
buttonType: ButtonType.primary,
labelText: AppLocalizations.of(context)
.addTrustedContact,
labelText: S.of(context).addTrustedContact,
shouldSurfaceExecutionStates: false,
onTap: () async {
await routeToPage(
@@ -242,8 +241,8 @@ class _EmergencyPageState extends State<EmergencyPage> {
return MenuItemWidget(
captionedTextWidget: CaptionedTextWidget(
title: trustedContacts.isNotEmpty
? AppLocalizations.of(context).addMore
: AppLocalizations.of(context).addTrustedContact,
? S.of(context).addMore
: S.of(context).addTrustedContact,
makeTextBold: true,
),
leadingIcon: Icons.add_outlined,
@@ -379,7 +378,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
bodyHighlight: "They are yet to accept your invite",
buttons: [
ButtonWidget(
labelText: AppLocalizations.of(context).removeInvite,
labelText: S.of(context).removeInvite,
buttonType: ButtonType.critical,
buttonSize: ButtonSize.large,
buttonAction: ButtonAction.first,
@@ -398,7 +397,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
isInAlert: true,
),
ButtonWidget(
labelText: AppLocalizations.of(context).cancel,
labelText: S.of(context).cancel,
buttonType: ButtonType.tertiary,
buttonSize: ButtonSize.large,
buttonAction: ButtonAction.second,
@@ -415,7 +414,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
bodyHighlight: "They have accepted your invite",
buttons: [
ButtonWidget(
labelText: AppLocalizations.of(context).remove,
labelText: S.of(context).remove,
buttonType: ButtonType.critical,
buttonSize: ButtonSize.large,
buttonAction: ButtonAction.second,
@@ -434,7 +433,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
isInAlert: true,
),
ButtonWidget(
labelText: AppLocalizations.of(context).cancel,
labelText: S.of(context).cancel,
buttonType: ButtonType.tertiary,
buttonSize: ButtonSize.large,
buttonAction: ButtonAction.third,
@@ -454,7 +453,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
context: context,
buttons: [
ButtonWidget(
labelText: AppLocalizations.of(context).acceptTrustInvite,
labelText: S.of(context).acceptTrustInvite,
buttonType: ButtonType.primary,
buttonSize: ButtonSize.large,
shouldStickToDarkTheme: true,
@@ -473,7 +472,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
isInAlert: true,
),
ButtonWidget(
labelText: AppLocalizations.of(context).declineTrustInvite,
labelText: S.of(context).declineTrustInvite,
buttonType: ButtonType.critical,
buttonSize: ButtonSize.large,
buttonAction: ButtonAction.second,
@@ -489,7 +488,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
isInAlert: true,
),
ButtonWidget(
labelText: AppLocalizations.of(context).cancel,
labelText: S.of(context).cancel,
buttonType: ButtonType.tertiary,
buttonSize: ButtonSize.large,
buttonAction: ButtonAction.third,
@@ -497,8 +496,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
isInAlert: true,
),
],
body:
AppLocalizations.of(context).legacyInvite(email: contact.user.email),
body: S.of(context).legacyInvite(contact.user.email),
actionSheetType: ActionSheetType.defaultActionSheet,
);
return;
@@ -543,7 +541,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
isInAlert: true,
),
ButtonWidget(
labelText: AppLocalizations.of(context).cancel,
labelText: S.of(context).cancel,
buttonType: ButtonType.tertiary,
buttonSize: ButtonSize.large,
buttonAction: ButtonAction.third,
@@ -551,7 +549,7 @@ class _EmergencyPageState extends State<EmergencyPage> {
isInAlert: true,
),
],
body: context.l10n.recoveryWarningBody(email: emergencyContactEmail),
body: context.l10n.recoveryWarningBody(emergencyContactEmail),
actionSheetType: ActionSheetType.defaultActionSheet,
);
return;

View File

@@ -44,15 +44,15 @@ class EmergencyContactService {
if (!isValidEmail(email)) {
await showErrorDialog(
context,
AppLocalizations.of(context).invalidEmailAddress,
AppLocalizations.of(context).enterValidEmail,
S.of(context).invalidEmailAddress,
S.of(context).enterValidEmail,
);
return false;
} else if (email.trim() == Configuration.instance.getEmail()) {
await showErrorDialog(
context,
AppLocalizations.of(context).oops,
AppLocalizations.of(context).youCannotShareWithYourself,
S.of(context).oops,
S.of(context).youCannotShareWithYourself,
);
return false;
}

View File

@@ -117,7 +117,7 @@ class _OtherContactPageState extends State<OtherContactPage> {
)
: (recoverySession!.status == "READY"
? Text(
context.l10n.recoveryReady(email: accountEmail),
context.l10n.recoveryReady(accountEmail),
style: textTheme.body,
)
: Text(
@@ -131,16 +131,14 @@ class _OtherContactPageState extends State<OtherContactPage> {
// icon: Icons.start_outlined,
buttonType: ButtonType.trailingIconPrimary,
icon: Icons.start_outlined,
labelText:
AppLocalizations.of(context).startAccountRecoveryTitle,
labelText: S.of(context).startAccountRecoveryTitle,
onTap: widget.contact.isPendingInvite()
? null
: () async {
final actionResult = await showChoiceActionSheet(
context,
title: AppLocalizations.of(context)
.startAccountRecoveryTitle,
firstButtonLabel: AppLocalizations.of(context).yes,
title: S.of(context).startAccountRecoveryTitle,
firstButtonLabel: S.of(context).yes,
body: "Are you sure you want to initiate recovery?",
isCritical: true,
);
@@ -155,8 +153,8 @@ class _OtherContactPageState extends State<OtherContactPage> {
context,
context.l10n.recoveryInitiated,
context.l10n.recoveryInitiatedDesc(
days: widget.contact.recoveryNoticeInDays,
email: Configuration.instance.getEmail()!,
widget.contact.recoveryNoticeInDays,
Configuration.instance.getEmail()!,
),
);
}
@@ -196,15 +194,14 @@ class _OtherContactPageState extends State<OtherContactPage> {
recoverySession!.status == "READY"))
ButtonWidget(
buttonType: ButtonType.neutral,
labelText: AppLocalizations.of(context).cancelAccountRecovery,
labelText: S.of(context).cancelAccountRecovery,
shouldSurfaceExecutionStates: false,
onTap: () async {
final actionResult = await showChoiceActionSheet(
context,
title: AppLocalizations.of(context).cancelAccountRecovery,
firstButtonLabel: AppLocalizations.of(context).yes,
body:
AppLocalizations.of(context).cancelAccountRecoveryBody,
title: S.of(context).cancelAccountRecovery,
firstButtonLabel: S.of(context).yes,
body: S.of(context).cancelAccountRecoveryBody,
isCritical: true,
firstButtonOnTap: () async {
await EmergencyContactService.instance
@@ -218,12 +215,11 @@ class _OtherContactPageState extends State<OtherContactPage> {
),
SizedBox(height: recoverySession == null ? 48 : 24),
MenuSectionTitle(
title:
AppLocalizations.of(context).removeYourselfAsTrustedContact,
title: S.of(context).removeYourselfAsTrustedContact,
),
MenuItemWidget(
captionedTextWidget: CaptionedTextWidget(
title: AppLocalizations.of(context).remove,
title: S.of(context).remove,
textColor: warning500,
makeTextBold: true,
),
@@ -265,7 +261,7 @@ class _OtherContactPageState extends State<OtherContactPage> {
isInAlert: true,
),
ButtonWidget(
labelText: AppLocalizations.of(context).cancel,
labelText: S.of(context).cancel,
buttonType: ButtonType.tertiary,
buttonSize: ButtonSize.large,
buttonAction: ButtonAction.third,

View File

@@ -78,8 +78,8 @@ class _RecoverOthersAccountState extends State<RecoverOthersAccount> {
}
}
String title = AppLocalizations.of(context).setPasswordTitle;
title = AppLocalizations.of(context).resetPasswordTitle;
String title = S.of(context).setPasswordTitle;
title = S.of(context).resetPasswordTitle;
return Scaffold(
resizeToAvoidBottomInset: isKeypadOpen,
appBar: AppBar(
@@ -109,13 +109,13 @@ class _RecoverOthersAccountState extends State<RecoverOthersAccount> {
Widget _getBody(String buttonTextAndHeading) {
final email = widget.sessions.user.email;
var passwordStrengthText = AppLocalizations.of(context).weakStrength;
var passwordStrengthText = S.of(context).weakStrength;
var passwordStrengthColor = Colors.redAccent;
if (_passwordStrength > kStrongPasswordStrengthThreshold) {
passwordStrengthText = AppLocalizations.of(context).strongStrength;
passwordStrengthText = S.of(context).strongStrength;
passwordStrengthColor = Colors.greenAccent;
} else if (_passwordStrength > kMildPasswordStrengthThreshold) {
passwordStrengthText = AppLocalizations.of(context).moderateStrength;
passwordStrengthText = S.of(context).moderateStrength;
passwordStrengthColor = Colors.orangeAccent;
}
return Column(
@@ -167,7 +167,7 @@ class _RecoverOthersAccountState extends State<RecoverOthersAccount> {
fillColor:
_isPasswordValid ? _validFieldValueColor : null,
filled: true,
hintText: AppLocalizations.of(context).password,
hintText: S.of(context).password,
contentPadding: const EdgeInsets.all(20),
border: UnderlineInputBorder(
borderSide: BorderSide.none,
@@ -230,7 +230,7 @@ class _RecoverOthersAccountState extends State<RecoverOthersAccount> {
decoration: InputDecoration(
fillColor: _passwordsMatch ? _validFieldValueColor : null,
filled: true,
hintText: AppLocalizations.of(context).confirmPassword,
hintText: S.of(context).confirmPassword,
contentPadding: const EdgeInsets.symmetric(
horizontal: 20,
vertical: 20,
@@ -284,9 +284,7 @@ class _RecoverOthersAccountState extends State<RecoverOthersAccount> {
padding:
const EdgeInsets.symmetric(horizontal: 20, vertical: 8),
child: Text(
AppLocalizations.of(context).passwordStrength(
passwordStrengthValue: passwordStrengthText,
),
S.of(context).passwordStrength(passwordStrengthText),
style: TextStyle(
color: passwordStrengthColor,
),
@@ -304,10 +302,8 @@ class _RecoverOthersAccountState extends State<RecoverOthersAccount> {
}
void _updatePassword() async {
final dialog = createProgressDialog(
context,
AppLocalizations.of(context).generatingEncryptionKeys,
);
final dialog =
createProgressDialog(context, S.of(context).generatingEncryptionKeys);
await dialog.show();
try {
final String password = _passwordController1.text;
@@ -357,10 +353,7 @@ class _RecoverOthersAccountState extends State<RecoverOthersAccount> {
widget.sessions,
);
await dialog.hide();
showShortToast(
context,
AppLocalizations.of(context).passwordChangedSuccessfully,
);
showShortToast(context, S.of(context).passwordChangedSuccessfully);
Navigator.of(context).pop();
} catch (e, s) {
_logger.severe(e, s);

View File

@@ -66,7 +66,7 @@ class _AddContactPage extends State<AddContactPage> {
resizeToAvoidBottomInset: isKeypadOpen,
appBar: AppBar(
title: Text(
AppLocalizations.of(context).addTrustedContact,
S.of(context).addTrustedContact,
),
),
body: Column(
@@ -77,7 +77,7 @@ class _AddContactPage extends State<AddContactPage> {
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
AppLocalizations.of(context).addANewEmail,
S.of(context).addANewEmail,
style: enteTextTheme.small
.copyWith(color: enteColorScheme.textMuted),
),
@@ -97,8 +97,7 @@ class _AddContactPage extends State<AddContactPage> {
children: [
!isEmailListEmpty
? MenuSectionTitle(
title: AppLocalizations.of(context)
.orPickAnExistingOne,
title: S.of(context).orPickAnExistingOne,
)
: const SizedBox.shrink(),
Expanded(
@@ -110,8 +109,7 @@ class _AddContactPage extends State<AddContactPage> {
vertical: 8.0,
),
child: MenuSectionDescriptionWidget(
content: AppLocalizations.of(context)
.whyAddTrustContact,
content: S.of(context).whyAddTrustContact,
),
);
}
@@ -190,14 +188,12 @@ class _AddContactPage extends State<AddContactPage> {
selectedEmail == '' ? _email : selectedEmail;
final choiceResult = await showChoiceActionSheet(
context,
title: AppLocalizations.of(context).warning,
body: AppLocalizations.of(context)
.confirmAddingTrustedContact(
email: emailToAdd,
numOfDays: 30,
),
firstButtonLabel:
AppLocalizations.of(context).proceed,
title: S.of(context).warning,
body: S.of(context).confirmAddingTrustedContact(
emailToAdd,
30,
),
firstButtonLabel: S.of(context).proceed,
isCritical: true,
);
if (choiceResult != null &&
@@ -212,9 +208,8 @@ class _AddContactPage extends State<AddContactPage> {
_logger.severe('Failed to add contact', e);
await showErrorDialog(
context,
AppLocalizations.of(context).error,
AppLocalizations.of(context)
.somethingWentWrong,
S.of(context).error,
S.of(context).somethingWentWrong,
);
}
}
@@ -226,8 +221,8 @@ class _AddContactPage extends State<AddContactPage> {
if ((selectedEmail == '' && !_emailIsValid)) {
await showErrorDialog(
context,
AppLocalizations.of(context).invalidEmailAddress,
AppLocalizations.of(context).enterValidEmail,
S.of(context).invalidEmailAddress,
S.of(context).enterValidEmail,
);
return;
}
@@ -244,7 +239,7 @@ class _AddContactPage extends State<AddContactPage> {
);
},
child: Text(
AppLocalizations.of(context).verifyIDLabel,
S.of(context).verifyIDLabel,
textAlign: TextAlign.center,
style: enteTextTheme.smallMuted.copyWith(
decoration: TextDecoration.underline,
@@ -283,7 +278,7 @@ class _AddContactPage extends State<AddContactPage> {
),
fillColor: getEnteColorScheme(context).fillFaint,
filled: true,
hintText: AppLocalizations.of(context).enterEmail,
hintText: S.of(context).enterEmail,
contentPadding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 14,

View File

@@ -1,12 +0,0 @@
import "package:photos/events/event.dart";
import "package:photos/models/preview/preview_item_status.dart";
class VideoPreviewStateChangedEvent extends Event {
final int fileId;
final PreviewItemStatus status;
VideoPreviewStateChangedEvent(this.fileId, this.status);
@override
String get reason => '$runtimeType: fileId=$fileId, status=$status';
}

View File

@@ -0,0 +1,251 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that looks up messages for specific locales by
// delegating to the appropriate library.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:implementation_imports, file_names, unnecessary_new
// ignore_for_file:unnecessary_brace_in_string_interps, directives_ordering
// ignore_for_file:argument_type_not_assignable, invalid_assignment
// ignore_for_file:prefer_single_quotes, prefer_generic_function_type_aliases
// ignore_for_file:comment_references
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
import 'package:intl/src/intl_helpers.dart';
import 'messages_ar.dart' as messages_ar;
import 'messages_be.dart' as messages_be;
import 'messages_bg.dart' as messages_bg;
import 'messages_ca.dart' as messages_ca;
import 'messages_cs.dart' as messages_cs;
import 'messages_da.dart' as messages_da;
import 'messages_de.dart' as messages_de;
import 'messages_el.dart' as messages_el;
import 'messages_en.dart' as messages_en;
import 'messages_es.dart' as messages_es;
import 'messages_et.dart' as messages_et;
import 'messages_eu.dart' as messages_eu;
import 'messages_fa.dart' as messages_fa;
import 'messages_fr.dart' as messages_fr;
import 'messages_gu.dart' as messages_gu;
import 'messages_he.dart' as messages_he;
import 'messages_hi.dart' as messages_hi;
import 'messages_hu.dart' as messages_hu;
import 'messages_id.dart' as messages_id;
import 'messages_it.dart' as messages_it;
import 'messages_ja.dart' as messages_ja;
import 'messages_km.dart' as messages_km;
import 'messages_ko.dart' as messages_ko;
import 'messages_ku.dart' as messages_ku;
import 'messages_lt.dart' as messages_lt;
import 'messages_lv.dart' as messages_lv;
import 'messages_ml.dart' as messages_ml;
import 'messages_ms.dart' as messages_ms;
import 'messages_nl.dart' as messages_nl;
import 'messages_no.dart' as messages_no;
import 'messages_or.dart' as messages_or;
import 'messages_pl.dart' as messages_pl;
import 'messages_pt.dart' as messages_pt;
import 'messages_pt_BR.dart' as messages_pt_br;
import 'messages_pt_PT.dart' as messages_pt_pt;
import 'messages_ro.dart' as messages_ro;
import 'messages_ru.dart' as messages_ru;
import 'messages_sl.dart' as messages_sl;
import 'messages_sr.dart' as messages_sr;
import 'messages_sv.dart' as messages_sv;
import 'messages_ta.dart' as messages_ta;
import 'messages_te.dart' as messages_te;
import 'messages_th.dart' as messages_th;
import 'messages_ti.dart' as messages_ti;
import 'messages_tr.dart' as messages_tr;
import 'messages_uk.dart' as messages_uk;
import 'messages_vi.dart' as messages_vi;
import 'messages_zh.dart' as messages_zh;
typedef Future<dynamic> LibraryLoader();
Map<String, LibraryLoader> _deferredLibraries = {
'ar': () => new SynchronousFuture(null),
'be': () => new SynchronousFuture(null),
'bg': () => new SynchronousFuture(null),
'ca': () => new SynchronousFuture(null),
'cs': () => new SynchronousFuture(null),
'da': () => new SynchronousFuture(null),
'de': () => new SynchronousFuture(null),
'el': () => new SynchronousFuture(null),
'en': () => new SynchronousFuture(null),
'es': () => new SynchronousFuture(null),
'et': () => new SynchronousFuture(null),
'eu': () => new SynchronousFuture(null),
'fa': () => new SynchronousFuture(null),
'fr': () => new SynchronousFuture(null),
'gu': () => new SynchronousFuture(null),
'he': () => new SynchronousFuture(null),
'hi': () => new SynchronousFuture(null),
'hu': () => new SynchronousFuture(null),
'id': () => new SynchronousFuture(null),
'it': () => new SynchronousFuture(null),
'ja': () => new SynchronousFuture(null),
'km': () => new SynchronousFuture(null),
'ko': () => new SynchronousFuture(null),
'ku': () => new SynchronousFuture(null),
'lt': () => new SynchronousFuture(null),
'lv': () => new SynchronousFuture(null),
'ml': () => new SynchronousFuture(null),
'ms': () => new SynchronousFuture(null),
'nl': () => new SynchronousFuture(null),
'no': () => new SynchronousFuture(null),
'or': () => new SynchronousFuture(null),
'pl': () => new SynchronousFuture(null),
'pt': () => new SynchronousFuture(null),
'pt_BR': () => new SynchronousFuture(null),
'pt_PT': () => new SynchronousFuture(null),
'ro': () => new SynchronousFuture(null),
'ru': () => new SynchronousFuture(null),
'sl': () => new SynchronousFuture(null),
'sr': () => new SynchronousFuture(null),
'sv': () => new SynchronousFuture(null),
'ta': () => new SynchronousFuture(null),
'te': () => new SynchronousFuture(null),
'th': () => new SynchronousFuture(null),
'ti': () => new SynchronousFuture(null),
'tr': () => new SynchronousFuture(null),
'uk': () => new SynchronousFuture(null),
'vi': () => new SynchronousFuture(null),
'zh': () => new SynchronousFuture(null),
};
MessageLookupByLibrary? _findExact(String localeName) {
switch (localeName) {
case 'ar':
return messages_ar.messages;
case 'be':
return messages_be.messages;
case 'bg':
return messages_bg.messages;
case 'ca':
return messages_ca.messages;
case 'cs':
return messages_cs.messages;
case 'da':
return messages_da.messages;
case 'de':
return messages_de.messages;
case 'el':
return messages_el.messages;
case 'en':
return messages_en.messages;
case 'es':
return messages_es.messages;
case 'et':
return messages_et.messages;
case 'eu':
return messages_eu.messages;
case 'fa':
return messages_fa.messages;
case 'fr':
return messages_fr.messages;
case 'gu':
return messages_gu.messages;
case 'he':
return messages_he.messages;
case 'hi':
return messages_hi.messages;
case 'hu':
return messages_hu.messages;
case 'id':
return messages_id.messages;
case 'it':
return messages_it.messages;
case 'ja':
return messages_ja.messages;
case 'km':
return messages_km.messages;
case 'ko':
return messages_ko.messages;
case 'ku':
return messages_ku.messages;
case 'lt':
return messages_lt.messages;
case 'lv':
return messages_lv.messages;
case 'ml':
return messages_ml.messages;
case 'ms':
return messages_ms.messages;
case 'nl':
return messages_nl.messages;
case 'no':
return messages_no.messages;
case 'or':
return messages_or.messages;
case 'pl':
return messages_pl.messages;
case 'pt':
return messages_pt.messages;
case 'pt_BR':
return messages_pt_br.messages;
case 'pt_PT':
return messages_pt_pt.messages;
case 'ro':
return messages_ro.messages;
case 'ru':
return messages_ru.messages;
case 'sl':
return messages_sl.messages;
case 'sr':
return messages_sr.messages;
case 'sv':
return messages_sv.messages;
case 'ta':
return messages_ta.messages;
case 'te':
return messages_te.messages;
case 'th':
return messages_th.messages;
case 'ti':
return messages_ti.messages;
case 'tr':
return messages_tr.messages;
case 'uk':
return messages_uk.messages;
case 'vi':
return messages_vi.messages;
case 'zh':
return messages_zh.messages;
default:
return null;
}
}
/// User programs should call this before using [localeName] for messages.
Future<bool> initializeMessages(String localeName) {
var availableLocale = Intl.verifiedLocale(
localeName, (locale) => _deferredLibraries[locale] != null,
onFailure: (_) => null);
if (availableLocale == null) {
return new SynchronousFuture(false);
}
var lib = _deferredLibraries[availableLocale];
lib == null ? new SynchronousFuture(false) : lib();
initializeInternalMessageLookup(() => new CompositeMessageLookup());
messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor);
return new SynchronousFuture(true);
}
bool _messagesExistFor(String locale) {
try {
return _findExact(locale) != null;
} catch (e) {
return false;
}
}
MessageLookupByLibrary? _findGeneratedMessagesFor(String locale) {
var actualLocale =
Intl.verifiedLocale(locale, _messagesExistFor, onFailure: (_) => null);
if (actualLocale == null) return null;
return _findExact(actualLocale);
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,305 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a be locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'be';
static String m57(passwordStrengthValue) =>
"Надзейнасць пароля: ${passwordStrengthValue}";
static String m93(storageAmountInGB) => "${storageAmountInGB} Гб";
static String m114(email) =>
"Ліст адпраўлены на электронную пошту <green>${email}</green>";
final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"about": MessageLookupByLibrary.simpleMessage("Пра праграму"),
"accountWelcomeBack":
MessageLookupByLibrary.simpleMessage("З вяртаннем!"),
"ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage(
"Я ўсведамляю, што калі я страчу свой пароль, то я магу згубіць свае даныя, бо мае даныя абаронены <underline>скразным шыфраваннем</underline>."),
"activeSessions":
MessageLookupByLibrary.simpleMessage("Актыўныя сеансы"),
"addMore": MessageLookupByLibrary.simpleMessage("Дадаць яшчэ"),
"addViewer": MessageLookupByLibrary.simpleMessage("Дадаць гледача"),
"after1Day": MessageLookupByLibrary.simpleMessage("Праз 1 дзень"),
"after1Hour": MessageLookupByLibrary.simpleMessage("Праз 1 гадзіну"),
"after1Month": MessageLookupByLibrary.simpleMessage("Праз 1 месяц"),
"after1Week": MessageLookupByLibrary.simpleMessage("Праз 1 тыдзень"),
"after1Year": MessageLookupByLibrary.simpleMessage("Праз 1 год"),
"albumOwner": MessageLookupByLibrary.simpleMessage("Уладальнік"),
"apply": MessageLookupByLibrary.simpleMessage("Ужыць"),
"askDeleteReason": MessageLookupByLibrary.simpleMessage(
"Якая асноўная прычына выдалення вашага ўліковага запісу?"),
"backup": MessageLookupByLibrary.simpleMessage("Рэзервовая копія"),
"cancel": MessageLookupByLibrary.simpleMessage("Скасаваць"),
"change": MessageLookupByLibrary.simpleMessage("Змяніць"),
"changeEmail": MessageLookupByLibrary.simpleMessage(
"Змяніць адрас электроннай пошты"),
"changePasswordTitle":
MessageLookupByLibrary.simpleMessage("Змяніць пароль"),
"checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage(
"Праверце свае ўваходныя лісты (і спам) для завяршэння праверкі"),
"codeAppliedPageTitle":
MessageLookupByLibrary.simpleMessage("Код ужыты"),
"confirm": MessageLookupByLibrary.simpleMessage("Пацвердзіць"),
"confirmAccountDeletion": MessageLookupByLibrary.simpleMessage(
"Пацвердзіць выдаленне ўліковага запісу"),
"confirmDeletePrompt": MessageLookupByLibrary.simpleMessage(
"Так. Я хачу незваротна выдаліць гэты ўліковы запіс і яго даныя ва ўсіх праграмах."),
"confirmPassword":
MessageLookupByLibrary.simpleMessage("Пацвердзіць пароль"),
"contactSupport": MessageLookupByLibrary.simpleMessage(
"Звярніцеся ў службу падтрымкі"),
"continueLabel": MessageLookupByLibrary.simpleMessage("Працягнуць"),
"copyLink": MessageLookupByLibrary.simpleMessage("Скапіяваць спасылку"),
"createAccount":
MessageLookupByLibrary.simpleMessage("Стварыць уліковы запіс"),
"createNewAccount":
MessageLookupByLibrary.simpleMessage("Стварыць новы ўліковы запіс"),
"darkTheme": MessageLookupByLibrary.simpleMessage("Цёмная"),
"decrypting": MessageLookupByLibrary.simpleMessage("Расшыфроўка..."),
"deleteAccount":
MessageLookupByLibrary.simpleMessage("Выдаліць уліковы запіс"),
"deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage(
"Нам шкада, што вы выдаляеце свой уліковы запіс. Абагуліце з намі водгук, каб дапамагчы нам палепшыць сэрвіс."),
"deleteAccountPermanentlyButton": MessageLookupByLibrary.simpleMessage(
"Незваротна выдаліць уліковы запіс"),
"deleteAlbum": MessageLookupByLibrary.simpleMessage("Выдаліць альбом"),
"deleteEmailRequest": MessageLookupByLibrary.simpleMessage(
"Адпраўце ліст на <warning>account-deletion@ente.io</warning> з вашага зарэгістраванага адраса электроннай пошты."),
"deleteFromEnte":
MessageLookupByLibrary.simpleMessage("Выдаліць з Ente"),
"deletePhotos": MessageLookupByLibrary.simpleMessage("Выдаліць фота"),
"deleteReason1": MessageLookupByLibrary.simpleMessage(
"У вас адсутнічае важная функцыя, якая мне неабходна"),
"deleteReason2": MessageLookupByLibrary.simpleMessage(
"Праграма або пэўная функцыя не паводзіць сябе так, як павінна"),
"deleteReason3": MessageLookupByLibrary.simpleMessage(
"Я знайшоў больш прывабны сэрвіс"),
"deleteReason4":
MessageLookupByLibrary.simpleMessage("Прычына адсутнічае ў спісе"),
"deleteRequestSLAText": MessageLookupByLibrary.simpleMessage(
"Ваш запыт будзе апрацаваны цягам 72 гадзін."),
"details": MessageLookupByLibrary.simpleMessage("Падрабязнасці"),
"discover_food": MessageLookupByLibrary.simpleMessage("Ежа"),
"discover_notes": MessageLookupByLibrary.simpleMessage("Нататкі"),
"discover_pets": MessageLookupByLibrary.simpleMessage("Хатнія жывёлы"),
"discover_receipts": MessageLookupByLibrary.simpleMessage("Чэкі"),
"discover_screenshots":
MessageLookupByLibrary.simpleMessage("Скрыншоты"),
"discover_selfies": MessageLookupByLibrary.simpleMessage("Сэлфi"),
"discover_wallpapers": MessageLookupByLibrary.simpleMessage("Шпалеры"),
"doThisLater":
MessageLookupByLibrary.simpleMessage("Зрабіць гэта пазней"),
"done": MessageLookupByLibrary.simpleMessage("Гатова"),
"email": MessageLookupByLibrary.simpleMessage("Электронная пошта"),
"emailAlreadyRegistered": MessageLookupByLibrary.simpleMessage(
"Электронная пошта ўжо зарэгістравана."),
"encryption": MessageLookupByLibrary.simpleMessage("Шыфраванне"),
"encryptionKeys":
MessageLookupByLibrary.simpleMessage("Ключы шыфравання"),
"entePhotosPerm": MessageLookupByLibrary.simpleMessage(
"Праграме <i>неабходны доступ</i> для захавання вашых фатаграфій"),
"enterCode": MessageLookupByLibrary.simpleMessage("Увядзіце код"),
"enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage(
"Увядзіце новы пароль, каб мы маглі выкарыстаць яго для расшыфроўкі вашых даных"),
"enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage(
"Увядзіце пароль, каб мы маглі выкарыстаць яго для расшыфроўкі вашых даных"),
"enterValidEmail": MessageLookupByLibrary.simpleMessage(
"Увядзіце сапраўдны адрас электронная пошты."),
"enterYourEmailAddress": MessageLookupByLibrary.simpleMessage(
"Увядзіце свой адрас электроннай пошты"),
"enterYourNewEmailAddress": MessageLookupByLibrary.simpleMessage(
"Увядзіце ваш новы адрас электроннай пошты"),
"enterYourPassword":
MessageLookupByLibrary.simpleMessage("Увядзіце свой пароль"),
"enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage(
"Увядзіце свой ключ аднаўлення"),
"familyPlans":
MessageLookupByLibrary.simpleMessage("Сямейныя тарыфныя планы"),
"faq": MessageLookupByLibrary.simpleMessage("Частыя пытанні"),
"faqs": MessageLookupByLibrary.simpleMessage("Частыя пытанні"),
"feedback": MessageLookupByLibrary.simpleMessage("Водгук"),
"forgotPassword":
MessageLookupByLibrary.simpleMessage("Забыліся пароль"),
"freeTrial":
MessageLookupByLibrary.simpleMessage("Бясплатная пробная версія"),
"general": MessageLookupByLibrary.simpleMessage("Асноўныя"),
"generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage(
"Генерацыя ключоў шыфравання..."),
"howItWorks": MessageLookupByLibrary.simpleMessage("Як гэта працуе"),
"ignoreUpdate": MessageLookupByLibrary.simpleMessage("Iгнараваць"),
"incorrectPasswordTitle":
MessageLookupByLibrary.simpleMessage("Няправільны пароль"),
"incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage(
"Вы ўвялі памылковы ключ аднаўлення"),
"incorrectRecoveryKeyTitle":
MessageLookupByLibrary.simpleMessage("Няправільны ключ аднаўлення"),
"insecureDevice":
MessageLookupByLibrary.simpleMessage("Небяспечная прылада"),
"installManually":
MessageLookupByLibrary.simpleMessage("Усталяваць уручную"),
"invalidEmailAddress": MessageLookupByLibrary.simpleMessage(
"Памылковы адрас электроннай пошты"),
"invalidKey": MessageLookupByLibrary.simpleMessage("Няправільны ключ"),
"kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage(
"Калі ласка, дапамажыце нам з гэтай інфармацыяй"),
"lightTheme": MessageLookupByLibrary.simpleMessage("Светлая"),
"linkExpired": MessageLookupByLibrary.simpleMessage("Пратэрмінавана"),
"linkNeverExpires": MessageLookupByLibrary.simpleMessage("Ніколі"),
"lockButtonLabel": MessageLookupByLibrary.simpleMessage("Замкнуць"),
"lockscreen": MessageLookupByLibrary.simpleMessage("Экран блакіроўкі"),
"logInLabel": MessageLookupByLibrary.simpleMessage("Увайсці"),
"loginTerms": MessageLookupByLibrary.simpleMessage(
"Націскаючы ўвайсці, я пагаджаюся з <u-terms>умовамі абслугоўвання</u-terms> і <u-policy>палітыкай прыватнасці</u-policy>"),
"logout": MessageLookupByLibrary.simpleMessage("Выйсці"),
"lostDevice": MessageLookupByLibrary.simpleMessage("Згубілі прыладу?"),
"magicSearch": MessageLookupByLibrary.simpleMessage("Магічны пошук"),
"manage": MessageLookupByLibrary.simpleMessage("Кіраванне"),
"manageParticipants": MessageLookupByLibrary.simpleMessage("Кіраванне"),
"moderateStrength": MessageLookupByLibrary.simpleMessage("Умераны"),
"never": MessageLookupByLibrary.simpleMessage("Ніколі"),
"noDuplicates":
MessageLookupByLibrary.simpleMessage("✨ Няма дублікатаў"),
"noRecoveryKey":
MessageLookupByLibrary.simpleMessage("Няма ключа аднаўлення?"),
"noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage(
"Вашы даныя не могуць быць расшыфраваны без пароля або ключа аднаўлення па прычыне архітэктуры наша пратакола скразнога шыфравання"),
"notifications": MessageLookupByLibrary.simpleMessage("Апавяшчэнні"),
"ok": MessageLookupByLibrary.simpleMessage("Добра"),
"oops": MessageLookupByLibrary.simpleMessage("Вой"),
"oopsSomethingWentWrong":
MessageLookupByLibrary.simpleMessage("Штосьці пайшло не так"),
"password": MessageLookupByLibrary.simpleMessage("Пароль"),
"passwordChangedSuccessfully":
MessageLookupByLibrary.simpleMessage("Пароль паспяхова зменены"),
"passwordStrength": m57,
"passwordWarning": MessageLookupByLibrary.simpleMessage(
"Мы не захоўваем гэты пароль і <underline>мы не зможам расшыфраваць вашы даныя</underline>, калі вы забудзеце яго"),
"photoSmallCase": MessageLookupByLibrary.simpleMessage("фота"),
"pleaseTryAgain":
MessageLookupByLibrary.simpleMessage("Паспрабуйце яшчэ раз"),
"pleaseWait": MessageLookupByLibrary.simpleMessage("Пачакайце..."),
"privacyPolicyTitle":
MessageLookupByLibrary.simpleMessage("Палітыка прыватнасці"),
"rateUs": MessageLookupByLibrary.simpleMessage("Ацаніце нас"),
"recover": MessageLookupByLibrary.simpleMessage("Аднавіць"),
"recoverAccount":
MessageLookupByLibrary.simpleMessage("Аднавіць уліковы запіс"),
"recoverButton": MessageLookupByLibrary.simpleMessage("Аднавіць"),
"recoveryKey": MessageLookupByLibrary.simpleMessage("Ключ аднаўлення"),
"recoveryKeyCopiedToClipboard": MessageLookupByLibrary.simpleMessage(
"Ключ аднаўлення скапіяваны ў буфер абмену"),
"recoveryKeyOnForgotPassword": MessageLookupByLibrary.simpleMessage(
"Адзіным спосабам аднавіць вашы даныя з\'яўляецца гэты ключ, калі вы забылі свой пароль."),
"recoveryKeySaveDescription": MessageLookupByLibrary.simpleMessage(
"Захавайце гэты ключ, які складаецца з 24 слоў, у наедзеным месцы. Ён не захоўваецца на нашым серверы."),
"recoverySuccessful":
MessageLookupByLibrary.simpleMessage("Паспяховае аднаўленне!"),
"recreatePasswordBody": MessageLookupByLibrary.simpleMessage(
"У бягучай прылады недастаткова вылічальнай здольнасці для праверкі вашага паролю, але мы можам регенерыраваць яго, бо гэта працуе з усімі прыладамі.\n\nУвайдзіце, выкарыстоўваючы свой ключа аднаўлення і регенерыруйце свой пароль (калі хочаце, то можаце выбраць папярэдні пароль)."),
"recreatePasswordTitle":
MessageLookupByLibrary.simpleMessage("Стварыць пароль паўторна"),
"remove": MessageLookupByLibrary.simpleMessage("Выдаліць"),
"removeDuplicates":
MessageLookupByLibrary.simpleMessage("Выдаліць дублікаты"),
"removeParticipant":
MessageLookupByLibrary.simpleMessage("Выдаліць удзельніка"),
"removeWithQuestionMark":
MessageLookupByLibrary.simpleMessage("Выдаліць?"),
"resendEmail":
MessageLookupByLibrary.simpleMessage("Адправіць ліст яшчэ раз"),
"resetPasswordTitle":
MessageLookupByLibrary.simpleMessage("Скінуць пароль"),
"retry": MessageLookupByLibrary.simpleMessage("Паўтарыць"),
"saveKey": MessageLookupByLibrary.simpleMessage("Захаваць ключ"),
"scanCode": MessageLookupByLibrary.simpleMessage("Сканіраваць код"),
"security": MessageLookupByLibrary.simpleMessage("Бяспека"),
"selectAll": MessageLookupByLibrary.simpleMessage("Абраць усё"),
"selectReason":
MessageLookupByLibrary.simpleMessage("Выберыце прычыну"),
"sendEmail": MessageLookupByLibrary.simpleMessage("Адправіць ліст"),
"sendLink": MessageLookupByLibrary.simpleMessage("Адправіць спасылку"),
"setPasswordTitle":
MessageLookupByLibrary.simpleMessage("Задаць пароль"),
"setupComplete":
MessageLookupByLibrary.simpleMessage("Наладжванне завершана"),
"signUpTerms": MessageLookupByLibrary.simpleMessage(
"Я пагаджаюся з <u-terms>умовамі абслугоўвання</u-terms> і <u-policy>палітыкай прыватнасці</u-policy>"),
"skip": MessageLookupByLibrary.simpleMessage("Прапусціць"),
"somethingWentWrongPleaseTryAgain":
MessageLookupByLibrary.simpleMessage(
"Нешта пайшло не так. Паспрабуйце яшчэ раз"),
"sorry": MessageLookupByLibrary.simpleMessage("Прабачце"),
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease":
MessageLookupByLibrary.simpleMessage(
"Немагчыма згенерыраваць ключы бяспекі на гэтай прыладзе.\n\nЗарэгіструйцеся з іншай прылады."),
"status": MessageLookupByLibrary.simpleMessage("Стан"),
"storageInGB": m93,
"strongStrength": MessageLookupByLibrary.simpleMessage("Надзейны"),
"support": MessageLookupByLibrary.simpleMessage("Падтрымка"),
"systemTheme": MessageLookupByLibrary.simpleMessage("Сістэма"),
"tapToCopy":
MessageLookupByLibrary.simpleMessage("націсніце, каб скапіяваць"),
"tapToEnterCode":
MessageLookupByLibrary.simpleMessage("Націсніце, каб увесці код"),
"terminate": MessageLookupByLibrary.simpleMessage("Перарваць"),
"terminateSession":
MessageLookupByLibrary.simpleMessage("Перарваць сеанс?"),
"termsOfServicesTitle": MessageLookupByLibrary.simpleMessage("Умовы"),
"theme": MessageLookupByLibrary.simpleMessage("Тема"),
"thisDevice": MessageLookupByLibrary.simpleMessage("Гэта прылада"),
"thisWillLogYouOutOfTheFollowingDevice":
MessageLookupByLibrary.simpleMessage(
"Гэта дзеянне завяршыць сеанс на наступнай прыладзе:"),
"thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage(
"Гэта дзеянне завяршыць сеанс на вашай прыладзе!"),
"toResetVerifyEmail": MessageLookupByLibrary.simpleMessage(
"Праверце электронную пошту, каб скінуць свой пароль."),
"trash": MessageLookupByLibrary.simpleMessage("Сметніца"),
"twofactorAuthenticationPageTitle":
MessageLookupByLibrary.simpleMessage(
"Двухфактарная аўтэнтыфікацыя"),
"uncategorized": MessageLookupByLibrary.simpleMessage("Без катэгорыі"),
"update": MessageLookupByLibrary.simpleMessage("Абнавіць"),
"updateAvailable":
MessageLookupByLibrary.simpleMessage("Даступна абнаўленне"),
"useRecoveryKey": MessageLookupByLibrary.simpleMessage(
"Выкарыстоўваць ключ аднаўлення"),
"verify": MessageLookupByLibrary.simpleMessage("Праверыць"),
"verifyEmail":
MessageLookupByLibrary.simpleMessage("Праверыць электронную пошту"),
"verifyPassword":
MessageLookupByLibrary.simpleMessage("Праверыць пароль"),
"videoSmallCase": MessageLookupByLibrary.simpleMessage("відэа"),
"viewLargeFiles": MessageLookupByLibrary.simpleMessage("Вялікія файлы"),
"viewer": MessageLookupByLibrary.simpleMessage("Праглядальнік"),
"weHaveSendEmailTo": m114,
"weakStrength": MessageLookupByLibrary.simpleMessage("Ненадзейны"),
"welcomeBack": MessageLookupByLibrary.simpleMessage("З вяртаннем!"),
"yesDelete": MessageLookupByLibrary.simpleMessage("Так, выдаліць"),
"yesLogout": MessageLookupByLibrary.simpleMessage("Так, выйсці"),
"yesRemove": MessageLookupByLibrary.simpleMessage("Так, выдаліць"),
"you": MessageLookupByLibrary.simpleMessage("Вы"),
"yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage(
"Ваш уліковы запіс быў выдалены")
};
}

View File

@@ -0,0 +1,25 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a bg locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'bg';
final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{};
}

View File

@@ -0,0 +1,25 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a ca locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'ca';
final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{};
}

View File

@@ -0,0 +1,645 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a cs locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'cs';
static String m6(albumName) => "Úspěšně přidáno do ${albumName}";
static String m25(supportEmail) =>
"Prosíme, napiště e-mail na ${supportEmail} ze schránky, kterou jste použili k registraci";
static String m47(expiryTime) => "Platnost odkazu vyprší ${expiryTime}";
static String m57(passwordStrengthValue) =>
"Síla hesla: ${passwordStrengthValue}";
static String m68(storeName) => "Ohodnoťte nás na ${storeName}";
static String m75(endDate) => "Předplatné se obnoví ${endDate}";
static String m82(name) => "Selfie s ${name}";
static String m111(email) => "Ověřit ${email}";
static String m114(email) =>
"Poslali jsme vám zprávu na <green>${email}</green>";
static String m117(name) => "Vy a ${name}";
final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage(
"Je dostupná nová verze Ente."),
"acceptTrustInvite":
MessageLookupByLibrary.simpleMessage("Přijmout pozvání"),
"account": MessageLookupByLibrary.simpleMessage("Účet"),
"accountWelcomeBack":
MessageLookupByLibrary.simpleMessage("Vítejte zpět!"),
"ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage(
"Rozumím, že pokud zapomenu své heslo, mohu přijít o data, jelikož má data jsou <underline>koncově šifrována</underline>."),
"activeSessions":
MessageLookupByLibrary.simpleMessage("Aktivní relace"),
"add": MessageLookupByLibrary.simpleMessage("Přidat"),
"addFiles": MessageLookupByLibrary.simpleMessage("Přidat soubory"),
"addLocation": MessageLookupByLibrary.simpleMessage("Přidat polohu"),
"addLocationButton": MessageLookupByLibrary.simpleMessage("Přidat"),
"addMore": MessageLookupByLibrary.simpleMessage("Přidat další"),
"addName": MessageLookupByLibrary.simpleMessage("Přidat název"),
"addNew": MessageLookupByLibrary.simpleMessage("Přidat nový"),
"addNewPerson":
MessageLookupByLibrary.simpleMessage("Přidat novou osobu"),
"addPhotos": MessageLookupByLibrary.simpleMessage("Přidat fotky"),
"addToAlbum": MessageLookupByLibrary.simpleMessage("Přidat do alba"),
"addedSuccessfullyTo": m6,
"advancedSettings": MessageLookupByLibrary.simpleMessage("Pokročilé"),
"after1Day": MessageLookupByLibrary.simpleMessage("Po 1 dni"),
"after1Hour": MessageLookupByLibrary.simpleMessage("Po 1 hodině"),
"after1Month": MessageLookupByLibrary.simpleMessage("Po 1 měsíci"),
"after1Week": MessageLookupByLibrary.simpleMessage("Po 1 týdnu"),
"after1Year": MessageLookupByLibrary.simpleMessage("Po 1 roce"),
"albumOwner": MessageLookupByLibrary.simpleMessage("Vlastník"),
"albumUpdated":
MessageLookupByLibrary.simpleMessage("Album bylo aktualizováno"),
"albums": MessageLookupByLibrary.simpleMessage("Alba"),
"allow": MessageLookupByLibrary.simpleMessage("Povolit"),
"androidBiometricRequiredTitle": MessageLookupByLibrary.simpleMessage(
"Je požadováno biometrické ověření"),
"androidBiometricSuccess":
MessageLookupByLibrary.simpleMessage("Úspěšně dokončeno"),
"androidCancelButton": MessageLookupByLibrary.simpleMessage("Zrušit"),
"appleId": MessageLookupByLibrary.simpleMessage("Apple ID"),
"apply": MessageLookupByLibrary.simpleMessage("Použít"),
"archiveAlbum":
MessageLookupByLibrary.simpleMessage("Archivovat album"),
"archiving": MessageLookupByLibrary.simpleMessage("Archivování..."),
"areYouSureYouWantToLogout":
MessageLookupByLibrary.simpleMessage("Opravdu se chcete odhlásit?"),
"askDeleteReason": MessageLookupByLibrary.simpleMessage(
"Jaký je váš hlavní důvod, proč mažete svůj účet?"),
"autoLock":
MessageLookupByLibrary.simpleMessage("Automatické zamykání"),
"backedUpFolders":
MessageLookupByLibrary.simpleMessage("Zálohované složky"),
"backup": MessageLookupByLibrary.simpleMessage("Zálohovat"),
"backupFile": MessageLookupByLibrary.simpleMessage("Zálohovat soubor"),
"backupStatus": MessageLookupByLibrary.simpleMessage("Stav zálohování"),
"birthday": MessageLookupByLibrary.simpleMessage("Narozeniny"),
"blog": MessageLookupByLibrary.simpleMessage("Blog"),
"cachedData":
MessageLookupByLibrary.simpleMessage("Data uložená v mezipaměti"),
"calculating":
MessageLookupByLibrary.simpleMessage("Probíhá výpočet..."),
"cancel": MessageLookupByLibrary.simpleMessage("Zrušit"),
"cancelAccountRecovery":
MessageLookupByLibrary.simpleMessage("Zrušit obnovení"),
"cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage(
"Sdílené soubory nelze odstranit"),
"changeEmail": MessageLookupByLibrary.simpleMessage("Změnit e-mail"),
"changePassword": MessageLookupByLibrary.simpleMessage("Změnit heslo"),
"changePasswordTitle":
MessageLookupByLibrary.simpleMessage("Změnit heslo"),
"checkForUpdates":
MessageLookupByLibrary.simpleMessage("Zkontrolovat aktualizace"),
"checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage(
"Zkontrolujte prosím svou doručenou poštu (a spam) pro dokončení ověření"),
"checkStatus":
MessageLookupByLibrary.simpleMessage("Zkontrolovat stav"),
"checking": MessageLookupByLibrary.simpleMessage("Probíhá kontrola..."),
"clearCaches":
MessageLookupByLibrary.simpleMessage("Vymazat mezipaměť"),
"clearIndexes": MessageLookupByLibrary.simpleMessage("Smazat indexy"),
"close": MessageLookupByLibrary.simpleMessage("Zavřít"),
"codeAppliedPageTitle":
MessageLookupByLibrary.simpleMessage("Kód byl použit"),
"codeCopiedToClipboard":
MessageLookupByLibrary.simpleMessage("Kód zkopírován do schránky"),
"collaborator": MessageLookupByLibrary.simpleMessage("Spolupracovník"),
"collageLayout": MessageLookupByLibrary.simpleMessage("Rozvržení"),
"color": MessageLookupByLibrary.simpleMessage("Barva"),
"configuration": MessageLookupByLibrary.simpleMessage("Nastavení"),
"confirm": MessageLookupByLibrary.simpleMessage("Potvrdit"),
"confirmAccountDeletion":
MessageLookupByLibrary.simpleMessage("Potvrdit odstranění účtu"),
"confirmDeletePrompt": MessageLookupByLibrary.simpleMessage(
"Ano, chci trvale smazat tento účet a jeho data napříč všemi aplikacemi."),
"confirmPassword":
MessageLookupByLibrary.simpleMessage("Potvrdte heslo"),
"contactSupport":
MessageLookupByLibrary.simpleMessage("Kontaktovat podporu"),
"contacts": MessageLookupByLibrary.simpleMessage("Kontakty"),
"continueLabel": MessageLookupByLibrary.simpleMessage("Pokračovat"),
"count": MessageLookupByLibrary.simpleMessage("Počet"),
"crashReporting":
MessageLookupByLibrary.simpleMessage("Hlášení o pádu"),
"create": MessageLookupByLibrary.simpleMessage("Vytvořit"),
"createAccount": MessageLookupByLibrary.simpleMessage("Vytvořit účet"),
"createNewAccount":
MessageLookupByLibrary.simpleMessage("Vytvořit nový účet"),
"crop": MessageLookupByLibrary.simpleMessage("Oříznout"),
"darkTheme": MessageLookupByLibrary.simpleMessage("Tmavý"),
"dayToday": MessageLookupByLibrary.simpleMessage("Dnes"),
"dayYesterday": MessageLookupByLibrary.simpleMessage("Včera"),
"declineTrustInvite":
MessageLookupByLibrary.simpleMessage("Odmítnout pozvání"),
"decrypting": MessageLookupByLibrary.simpleMessage("Dešifrování..."),
"decryptingVideo":
MessageLookupByLibrary.simpleMessage("Dešifrování videa..."),
"delete": MessageLookupByLibrary.simpleMessage("Smazat"),
"deleteAccount": MessageLookupByLibrary.simpleMessage("Smazat účet"),
"deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage(
"Je nám líto, že nás opouštíte. Prosím, dejte nám zpětnou vazbu, ať se můžeme zlepšit."),
"deleteAccountPermanentlyButton":
MessageLookupByLibrary.simpleMessage("Trvale smazat účet"),
"deleteAlbum": MessageLookupByLibrary.simpleMessage("Odstranit album"),
"deleteAll": MessageLookupByLibrary.simpleMessage("Smazat vše"),
"deleteEmailRequest": MessageLookupByLibrary.simpleMessage(
"Prosím, zašlete e-mail na <warning>account-deletion@ente.io</warning> ze schránky, se kterou jste se registrovali."),
"deleteEmptyAlbums":
MessageLookupByLibrary.simpleMessage("Smazat prázdná alba"),
"deleteEmptyAlbumsWithQuestionMark":
MessageLookupByLibrary.simpleMessage("Smazat prázdná alba?"),
"deleteFromBoth":
MessageLookupByLibrary.simpleMessage("Odstranit z obou"),
"deleteFromDevice":
MessageLookupByLibrary.simpleMessage("Odstranit ze zařízení"),
"deleteFromEnte":
MessageLookupByLibrary.simpleMessage("Odstranit z Ente"),
"deleteLocation":
MessageLookupByLibrary.simpleMessage("Odstranit polohu"),
"deleteReason1": MessageLookupByLibrary.simpleMessage(
"Chybí klíčová funkce, kterou potřebuji"),
"deleteReason2": MessageLookupByLibrary.simpleMessage(
"Aplikace nebo určitá funkce se nechová tak, jak si myslím, že by měla"),
"deleteReason3": MessageLookupByLibrary.simpleMessage(
"Našel jsem jinou službu, která se mi líbí více"),
"deleteReason4":
MessageLookupByLibrary.simpleMessage("Můj důvod není uveden"),
"deleteRequestSLAText": MessageLookupByLibrary.simpleMessage(
"Váš požadavek bude zpracován do 72 hodin."),
"deleteSharedAlbum":
MessageLookupByLibrary.simpleMessage("Opustit sdílené album?"),
"deselectAll":
MessageLookupByLibrary.simpleMessage("Zrušte výběr všech"),
"deviceCodeHint": MessageLookupByLibrary.simpleMessage("Zadejte kód"),
"deviceLock": MessageLookupByLibrary.simpleMessage("Zámek zařízení"),
"deviceNotFound":
MessageLookupByLibrary.simpleMessage("Zařízení nebylo nalezeno"),
"didYouKnow": MessageLookupByLibrary.simpleMessage("Věděli jste?"),
"discord": MessageLookupByLibrary.simpleMessage("Discord"),
"discover_food": MessageLookupByLibrary.simpleMessage("Jídlo"),
"discover_pets":
MessageLookupByLibrary.simpleMessage("Domácí mazlíčci"),
"discover_screenshots":
MessageLookupByLibrary.simpleMessage("Snímky obrazovky"),
"discover_selfies": MessageLookupByLibrary.simpleMessage("Selfie"),
"discover_wallpapers": MessageLookupByLibrary.simpleMessage("Pozadí"),
"dismiss": MessageLookupByLibrary.simpleMessage("Zrušit"),
"doThisLater": MessageLookupByLibrary.simpleMessage("Udělat později"),
"done": MessageLookupByLibrary.simpleMessage("Hotovo"),
"doubleYourStorage":
MessageLookupByLibrary.simpleMessage("Zdvojnásobte své úložiště"),
"download": MessageLookupByLibrary.simpleMessage("Stáhnout"),
"downloadFailed":
MessageLookupByLibrary.simpleMessage("Stahování selhalo"),
"downloading": MessageLookupByLibrary.simpleMessage("Stahuji..."),
"dropSupportEmail": m25,
"edit": MessageLookupByLibrary.simpleMessage("Upravit"),
"editLocation": MessageLookupByLibrary.simpleMessage("Upravit polohu"),
"editLocationTagTitle":
MessageLookupByLibrary.simpleMessage("Upravit lokalitu"),
"editPerson": MessageLookupByLibrary.simpleMessage("Upravit osobu"),
"editTime": MessageLookupByLibrary.simpleMessage("Upravit čas"),
"email": MessageLookupByLibrary.simpleMessage("E-mail"),
"emailAlreadyRegistered": MessageLookupByLibrary.simpleMessage(
"E-mail je již zaregistrován."),
"emailNotRegistered":
MessageLookupByLibrary.simpleMessage("E-mail není registrován."),
"empty": MessageLookupByLibrary.simpleMessage("Vyprázdnit"),
"emptyTrash": MessageLookupByLibrary.simpleMessage("Vyprázdnit koš?"),
"enable": MessageLookupByLibrary.simpleMessage("Povolit"),
"enabled": MessageLookupByLibrary.simpleMessage("Zapnuto"),
"encryption": MessageLookupByLibrary.simpleMessage("Šifrování"),
"encryptionKeys":
MessageLookupByLibrary.simpleMessage("Šifrovací klíče"),
"entePhotosPerm": MessageLookupByLibrary.simpleMessage(
"Ente <i>potřebuje oprávnění</i> k uchovávání vašich fotek"),
"enterAlbumName":
MessageLookupByLibrary.simpleMessage("Zadejte název alba"),
"enterCode": MessageLookupByLibrary.simpleMessage("Zadat kód"),
"enterDateOfBirth":
MessageLookupByLibrary.simpleMessage("Narozeniny (volitelné)"),
"enterFileName":
MessageLookupByLibrary.simpleMessage("Zadejte název souboru"),
"enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage(
"Zadejte nové heslo, které můžeme použít k šifrování vašich dat"),
"enterPassword": MessageLookupByLibrary.simpleMessage("Zadejte heslo"),
"enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage(
"Zadejte heslo, které můžeme použít k šifrování vašich dat"),
"enterPin": MessageLookupByLibrary.simpleMessage("Zadejte PIN"),
"enterValidEmail": MessageLookupByLibrary.simpleMessage(
"Prosím, zadejte platnou e-mailovou adresu."),
"enterYourEmailAddress": MessageLookupByLibrary.simpleMessage(
"Zadejte svou e-mailovou adresu"),
"enterYourNewEmailAddress": MessageLookupByLibrary.simpleMessage(
"Zadejte novou e-mailovou adresu"),
"enterYourPassword":
MessageLookupByLibrary.simpleMessage("Zadejte své heslo"),
"enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage(
"Zadejte svůj obnovovací klíč"),
"everywhere": MessageLookupByLibrary.simpleMessage("všude"),
"exif": MessageLookupByLibrary.simpleMessage("EXIF"),
"exportLogs": MessageLookupByLibrary.simpleMessage("Exportovat logy"),
"exportYourData":
MessageLookupByLibrary.simpleMessage("Exportujte svá data"),
"faces": MessageLookupByLibrary.simpleMessage("Obličeje"),
"failedToDownloadVideo": MessageLookupByLibrary.simpleMessage(
"Stahování videa se nezdařilo"),
"failedToLoadAlbums":
MessageLookupByLibrary.simpleMessage("Nepodařilo se načíst alba"),
"failedToPlayVideo": MessageLookupByLibrary.simpleMessage(
"Přehrávání videa se nezdařilo"),
"familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("Rodina"),
"faq": MessageLookupByLibrary.simpleMessage("Často kladené dotazy"),
"faqs": MessageLookupByLibrary.simpleMessage("Často kladené dotazy"),
"favorite": MessageLookupByLibrary.simpleMessage("Oblíbené"),
"feedback": MessageLookupByLibrary.simpleMessage("Zpětná vazba"),
"fileInfoAddDescHint":
MessageLookupByLibrary.simpleMessage("Přidat popis..."),
"fileTypes": MessageLookupByLibrary.simpleMessage("Typy souboru"),
"filesDeleted":
MessageLookupByLibrary.simpleMessage("Soubory odstraněny"),
"flip": MessageLookupByLibrary.simpleMessage("Překlopit"),
"forgotPassword":
MessageLookupByLibrary.simpleMessage("Zapomenuté heslo"),
"freeUpSpace": MessageLookupByLibrary.simpleMessage("Uvolnit místo"),
"gallery": MessageLookupByLibrary.simpleMessage("Galerie"),
"general": MessageLookupByLibrary.simpleMessage("Obecné"),
"generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage(
"Generování šifrovacích klíčů..."),
"goToSettings":
MessageLookupByLibrary.simpleMessage("Jít do nastavení"),
"hidden": MessageLookupByLibrary.simpleMessage("Skryté"),
"hide": MessageLookupByLibrary.simpleMessage("Skrýt"),
"howItWorks": MessageLookupByLibrary.simpleMessage("Jak to funguje"),
"iOSOkButton": MessageLookupByLibrary.simpleMessage("OK"),
"ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignorovat"),
"immediately": MessageLookupByLibrary.simpleMessage("Ihned"),
"importing": MessageLookupByLibrary.simpleMessage("Importování…"),
"incorrectPasswordTitle":
MessageLookupByLibrary.simpleMessage("Nesprávné heslo"),
"incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage(""),
"incorrectRecoveryKeyTitle":
MessageLookupByLibrary.simpleMessage("Nesprávný obnovovací klíč"),
"info": MessageLookupByLibrary.simpleMessage("Informace"),
"insecureDevice":
MessageLookupByLibrary.simpleMessage("Nezabezpečené zařízení"),
"installManually":
MessageLookupByLibrary.simpleMessage("Instalovat manuálně"),
"invalidEmailAddress":
MessageLookupByLibrary.simpleMessage("Neplatná e-mailová adresa"),
"invalidKey": MessageLookupByLibrary.simpleMessage("Neplatný klíč"),
"invite": MessageLookupByLibrary.simpleMessage("Pozvat"),
"inviteToEnte": MessageLookupByLibrary.simpleMessage("Pozvat do Ente"),
"inviteYourFriendsToEnte":
MessageLookupByLibrary.simpleMessage("Pozvěte své přátelé do Ente"),
"join": MessageLookupByLibrary.simpleMessage("Připojit se"),
"kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage(
"Pomozte nám s těmito informacemi"),
"language": MessageLookupByLibrary.simpleMessage("Jazyk"),
"leave": MessageLookupByLibrary.simpleMessage("Odejít"),
"leaveAlbum": MessageLookupByLibrary.simpleMessage("Opustit album"),
"left": MessageLookupByLibrary.simpleMessage("Doleva"),
"lightTheme": MessageLookupByLibrary.simpleMessage("Světlý"),
"linkExpiresOn": m47,
"linkHasExpired":
MessageLookupByLibrary.simpleMessage("Platnost odkazu vypršela"),
"linkNeverExpires": MessageLookupByLibrary.simpleMessage("Nikdy"),
"loadingGallery":
MessageLookupByLibrary.simpleMessage("Načítání galerie..."),
"location": MessageLookupByLibrary.simpleMessage("Poloha"),
"locations": MessageLookupByLibrary.simpleMessage("Lokality"),
"lockButtonLabel": MessageLookupByLibrary.simpleMessage("Uzamknout"),
"logInLabel": MessageLookupByLibrary.simpleMessage("Přihlásit se"),
"loggingOut": MessageLookupByLibrary.simpleMessage("Odhlašování..."),
"loginSessionExpired":
MessageLookupByLibrary.simpleMessage("Relace vypršela"),
"loginTerms": MessageLookupByLibrary.simpleMessage(
"Kliknutím na přihlášení souhlasím s <u-terms>podmínkami služby</u-terms> a <u-policy>zásadami ochrany osobních údajů</u-policy>"),
"loginWithTOTP":
MessageLookupByLibrary.simpleMessage("Přihlášení pomocí TOTP"),
"logout": MessageLookupByLibrary.simpleMessage("Odhlásit se"),
"lostDevice":
MessageLookupByLibrary.simpleMessage("Ztratili jste zařízení?"),
"manage": MessageLookupByLibrary.simpleMessage("Spravovat"),
"manageParticipants": MessageLookupByLibrary.simpleMessage("Spravovat"),
"manageSubscription":
MessageLookupByLibrary.simpleMessage("Spravovat předplatné"),
"map": MessageLookupByLibrary.simpleMessage("Mapa"),
"maps": MessageLookupByLibrary.simpleMessage("Mapy"),
"mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"),
"matrix": MessageLookupByLibrary.simpleMessage("Matrix"),
"me": MessageLookupByLibrary.simpleMessage(""),
"merchandise": MessageLookupByLibrary.simpleMessage("E-shop"),
"mergedPhotos":
MessageLookupByLibrary.simpleMessage("Sloučené fotografie"),
"moderateStrength": MessageLookupByLibrary.simpleMessage("Střední"),
"moments": MessageLookupByLibrary.simpleMessage("Momenty"),
"monthly": MessageLookupByLibrary.simpleMessage("Měsíčně"),
"moreDetails":
MessageLookupByLibrary.simpleMessage("Další podrobnosti"),
"moveToAlbum":
MessageLookupByLibrary.simpleMessage("Přesunout do alba"),
"movedToTrash":
MessageLookupByLibrary.simpleMessage("Přesunuto do koše"),
"never": MessageLookupByLibrary.simpleMessage("Nikdy"),
"newAlbum": MessageLookupByLibrary.simpleMessage("Nové album"),
"newPerson": MessageLookupByLibrary.simpleMessage("Nová osoba"),
"newRange": MessageLookupByLibrary.simpleMessage("Nový rozsah"),
"newest": MessageLookupByLibrary.simpleMessage("Nejnovější"),
"next": MessageLookupByLibrary.simpleMessage("Další"),
"no": MessageLookupByLibrary.simpleMessage("Ne"),
"noAlbumsSharedByYouYet": MessageLookupByLibrary.simpleMessage(
"Zatím nemáte žádná sdílená alba"),
"noDuplicates":
MessageLookupByLibrary.simpleMessage("✨ Žádné duplicity"),
"noInternetConnection":
MessageLookupByLibrary.simpleMessage("Žádné připojení k internetu"),
"noPhotosFoundHere": MessageLookupByLibrary.simpleMessage(
"Zde nebyly nalezeny žádné fotky"),
"noRecoveryKey":
MessageLookupByLibrary.simpleMessage("Nemáte obnovovací klíč?"),
"noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage(
"Vzhledem k povaze našeho protokolu koncového šifrování nemohou být vaše data dešifrována bez vašeho hesla nebo obnovovacího klíče"),
"noResultsFound": MessageLookupByLibrary.simpleMessage(
"Nebyly nalezeny žádné výsledky"),
"notifications": MessageLookupByLibrary.simpleMessage("Notifikace"),
"ok": MessageLookupByLibrary.simpleMessage("Ok"),
"onDevice": MessageLookupByLibrary.simpleMessage("V zařízení"),
"onEnte": MessageLookupByLibrary.simpleMessage(
"Na <branding>ente</branding>"),
"oops": MessageLookupByLibrary.simpleMessage("Jejda"),
"oopsSomethingWentWrong":
MessageLookupByLibrary.simpleMessage("Jejda, něco se pokazilo"),
"openAlbumInBrowser":
MessageLookupByLibrary.simpleMessage("Otevřít album v prohlížeči"),
"openFile": MessageLookupByLibrary.simpleMessage("Otevřít soubor"),
"openSettings":
MessageLookupByLibrary.simpleMessage("Otevřít Nastavení"),
"pair": MessageLookupByLibrary.simpleMessage("Spárovat"),
"panorama": MessageLookupByLibrary.simpleMessage("Panorama"),
"password": MessageLookupByLibrary.simpleMessage("Heslo"),
"passwordChangedSuccessfully":
MessageLookupByLibrary.simpleMessage("Heslo úspěšně změněno"),
"passwordStrength": m57,
"passwordWarning": MessageLookupByLibrary.simpleMessage(
"Toto heslo neukládáme, takže pokud jej zapomenete, <underline>nemůžeme dešifrovat vaše data</underline>"),
"paymentDetails":
MessageLookupByLibrary.simpleMessage("Platební údaje"),
"people": MessageLookupByLibrary.simpleMessage("Lidé"),
"permanentlyDelete":
MessageLookupByLibrary.simpleMessage("Trvale odstranit"),
"personName": MessageLookupByLibrary.simpleMessage("Jméno osoby"),
"photos": MessageLookupByLibrary.simpleMessage("Fotky"),
"pinAlbum": MessageLookupByLibrary.simpleMessage("Připnout album"),
"pleaseLoginAgain":
MessageLookupByLibrary.simpleMessage("Přihlaste se, prosím, znovu"),
"pleaseTryAgain":
MessageLookupByLibrary.simpleMessage("Zkuste to prosím znovu"),
"pleaseWait": MessageLookupByLibrary.simpleMessage("Čekejte prosím..."),
"previous": MessageLookupByLibrary.simpleMessage("Předchozí"),
"privacy": MessageLookupByLibrary.simpleMessage("Soukromí"),
"privacyPolicyTitle": MessageLookupByLibrary.simpleMessage(
"Zásady ochrany osobních údajů"),
"processing": MessageLookupByLibrary.simpleMessage("Zpracovává se"),
"publicLinkCreated":
MessageLookupByLibrary.simpleMessage("Veřejný odkaz vytvořen"),
"queued": MessageLookupByLibrary.simpleMessage("Ve frontě"),
"radius": MessageLookupByLibrary.simpleMessage("Rádius"),
"rateUs": MessageLookupByLibrary.simpleMessage("Ohodnoť nás"),
"rateUsOnStore": m68,
"recover": MessageLookupByLibrary.simpleMessage("Obnovit"),
"recoverAccount": MessageLookupByLibrary.simpleMessage("Obnovit účet"),
"recoverButton": MessageLookupByLibrary.simpleMessage("Obnovit"),
"recoveryKey": MessageLookupByLibrary.simpleMessage("Obnovovací klíč"),
"recoveryKeyCopiedToClipboard": MessageLookupByLibrary.simpleMessage(
"Obnovovací klíč zkopírován do schránky"),
"recoveryKeyOnForgotPassword": MessageLookupByLibrary.simpleMessage(
"Tento klíč je jedinou cestou pro obnovení Vašich dat, pokud zapomenete heslo."),
"recoveryKeySaveDescription": MessageLookupByLibrary.simpleMessage(
"Tento 24-slovný klíč neuchováváme, uschovejte ho, prosím, na bezpečném místě."),
"recoveryKeyVerified":
MessageLookupByLibrary.simpleMessage("Obnovovací klíč byl ověřen"),
"recoverySuccessful":
MessageLookupByLibrary.simpleMessage("Úspěšně obnoveno!"),
"recreatePasswordBody": MessageLookupByLibrary.simpleMessage(
"Aktuální zařízení není dostatečně silné k ověření vašeho hesla, ale můžeme ho regenerovat způsobem, které funguje na všech zařízeních.\n\nProsím, přihlašte se pomocí vašeho obnovovacího klíče a regenerujte své heslo (můžete klidně znovu použít své aktuální heslo)."),
"recreatePasswordTitle":
MessageLookupByLibrary.simpleMessage("Znovu vytvořit heslo"),
"reddit": MessageLookupByLibrary.simpleMessage("Reddit"),
"reenterPin": MessageLookupByLibrary.simpleMessage("Zadejte PIN znovu"),
"remove": MessageLookupByLibrary.simpleMessage("Odstranit"),
"removeDuplicates":
MessageLookupByLibrary.simpleMessage("Odstranit duplicity"),
"removeFromAlbum":
MessageLookupByLibrary.simpleMessage("Odstranit z alba"),
"removeFromAlbumTitle":
MessageLookupByLibrary.simpleMessage("Odstranit z alba?"),
"removeInvite":
MessageLookupByLibrary.simpleMessage("Odstranit pozvání"),
"removeLink": MessageLookupByLibrary.simpleMessage("Odstranit odkaz"),
"removeParticipant":
MessageLookupByLibrary.simpleMessage("Odebrat účastníka"),
"removePublicLink":
MessageLookupByLibrary.simpleMessage("Odstranit veřejný odkaz"),
"removeWithQuestionMark":
MessageLookupByLibrary.simpleMessage("Odstranit?"),
"rename": MessageLookupByLibrary.simpleMessage("Přejmenovat"),
"renameAlbum":
MessageLookupByLibrary.simpleMessage("Přejmenovat album"),
"renameFile":
MessageLookupByLibrary.simpleMessage("Přejmenovat soubor"),
"renewsOn": m75,
"reportABug": MessageLookupByLibrary.simpleMessage("Nahlásit chybu"),
"reportBug": MessageLookupByLibrary.simpleMessage("Nahlásit chybu"),
"resendEmail":
MessageLookupByLibrary.simpleMessage("Znovu odeslat e-mail"),
"resetPasswordTitle":
MessageLookupByLibrary.simpleMessage("Obnovit heslo"),
"resetPerson": MessageLookupByLibrary.simpleMessage("Odstranit"),
"restore": MessageLookupByLibrary.simpleMessage("Obnovit"),
"restoringFiles":
MessageLookupByLibrary.simpleMessage("Obnovuji soubory..."),
"retry": MessageLookupByLibrary.simpleMessage("Opakovat"),
"right": MessageLookupByLibrary.simpleMessage("Doprava"),
"rotate": MessageLookupByLibrary.simpleMessage("Otočit"),
"rotateLeft": MessageLookupByLibrary.simpleMessage("Otočit doleva"),
"rotateRight": MessageLookupByLibrary.simpleMessage("Otočit doprava"),
"safelyStored":
MessageLookupByLibrary.simpleMessage("Bezpečně uloženo"),
"save": MessageLookupByLibrary.simpleMessage("Uložit"),
"saveCopy": MessageLookupByLibrary.simpleMessage("Uložit kopii"),
"saveKey": MessageLookupByLibrary.simpleMessage("Uložit klíč"),
"savePerson": MessageLookupByLibrary.simpleMessage("Uložit osobu"),
"scanCode": MessageLookupByLibrary.simpleMessage("Skenovat kód"),
"search": MessageLookupByLibrary.simpleMessage("Hledat"),
"searchAlbumsEmptySection":
MessageLookupByLibrary.simpleMessage("Alba"),
"searchByAlbumNameHint":
MessageLookupByLibrary.simpleMessage("Název alba"),
"security": MessageLookupByLibrary.simpleMessage("Zabezpečení"),
"selectALocation":
MessageLookupByLibrary.simpleMessage("Vybrat polohu"),
"selectALocationFirst":
MessageLookupByLibrary.simpleMessage("Nejprve vyberte polohu"),
"selectAlbum": MessageLookupByLibrary.simpleMessage("Vybrat album"),
"selectAll": MessageLookupByLibrary.simpleMessage("Vybrat vše"),
"selectDate": MessageLookupByLibrary.simpleMessage("Vybrat datum"),
"selectFoldersForBackup": MessageLookupByLibrary.simpleMessage(
"Vyberte složky pro zálohování"),
"selectLanguage": MessageLookupByLibrary.simpleMessage("Vybrat jazyk"),
"selectReason": MessageLookupByLibrary.simpleMessage("Vyberte důvod"),
"selectTime": MessageLookupByLibrary.simpleMessage("Vybrat čas"),
"selectYourPlan":
MessageLookupByLibrary.simpleMessage("Vyberte svůj plán"),
"selfiesWithThem": m82,
"send": MessageLookupByLibrary.simpleMessage("Odeslat"),
"sendEmail": MessageLookupByLibrary.simpleMessage("Odeslat e-mail"),
"sendInvite": MessageLookupByLibrary.simpleMessage("Odeslat pozvánku"),
"sendLink": MessageLookupByLibrary.simpleMessage("Odeslat odkaz"),
"sessionExpired":
MessageLookupByLibrary.simpleMessage("Relace vypršela"),
"setAPassword": MessageLookupByLibrary.simpleMessage("Nastavit heslo"),
"setLabel": MessageLookupByLibrary.simpleMessage("Nastavit"),
"setNewPassword":
MessageLookupByLibrary.simpleMessage("Nastavit nové heslo"),
"setNewPin": MessageLookupByLibrary.simpleMessage("Nastavit nový PIN"),
"setPasswordTitle":
MessageLookupByLibrary.simpleMessage("Nastavit heslo"),
"share": MessageLookupByLibrary.simpleMessage("Sdílet"),
"shareLink": MessageLookupByLibrary.simpleMessage("Sdílet odkaz"),
"sharedByMe": MessageLookupByLibrary.simpleMessage("Sdíleno mnou"),
"sharedByYou": MessageLookupByLibrary.simpleMessage("Sdíleno vámi"),
"sharedWithMe": MessageLookupByLibrary.simpleMessage("Sdíleno se mnou"),
"sharedWithYou": MessageLookupByLibrary.simpleMessage("Sdíleno s vámi"),
"sharing": MessageLookupByLibrary.simpleMessage("Sdílení..."),
"signUpTerms": MessageLookupByLibrary.simpleMessage(
"Souhlasím s <u-terms>podmínkami služby</u-terms> a <u-terms>zásadami ochrany osobních údajů</u-terms>"),
"skip": MessageLookupByLibrary.simpleMessage("Přeskočit"),
"somethingWentWrongPleaseTryAgain":
MessageLookupByLibrary.simpleMessage(
"Něco se pokazilo. Zkuste to, prosím, znovu"),
"sorry": MessageLookupByLibrary.simpleMessage("Omlouváme se"),
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease":
MessageLookupByLibrary.simpleMessage(
"Omlouváme se, nemohli jsme vygenerovat bezpečné klíče na tomto zařízení.\n\nProsíme, zaregistrujte se z jiného zařízení."),
"sort": MessageLookupByLibrary.simpleMessage("Seřadit"),
"sortAlbumsBy": MessageLookupByLibrary.simpleMessage("Seřadit podle"),
"sortNewestFirst":
MessageLookupByLibrary.simpleMessage("Od nejnovějších"),
"sortOldestFirst":
MessageLookupByLibrary.simpleMessage("Od nejstarších"),
"stopCastingTitle":
MessageLookupByLibrary.simpleMessage("Zastavit přenos"),
"storage": MessageLookupByLibrary.simpleMessage("Úložiště"),
"storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Rodina"),
"strongStrength": MessageLookupByLibrary.simpleMessage("Silné"),
"subscribe": MessageLookupByLibrary.simpleMessage("Odebírat"),
"subscription": MessageLookupByLibrary.simpleMessage("Předplatné"),
"suggestFeatures":
MessageLookupByLibrary.simpleMessage("Navrhnout funkce"),
"support": MessageLookupByLibrary.simpleMessage("Podpora"),
"syncStopped":
MessageLookupByLibrary.simpleMessage("Synchronizace zastavena"),
"syncing": MessageLookupByLibrary.simpleMessage("Synchronizace..."),
"systemTheme": MessageLookupByLibrary.simpleMessage("Systém"),
"tapToEnterCode":
MessageLookupByLibrary.simpleMessage("Klepněte pro zadání kódu"),
"terminate": MessageLookupByLibrary.simpleMessage("Ukončit"),
"terminateSession":
MessageLookupByLibrary.simpleMessage("Ukončit relaci?"),
"terms": MessageLookupByLibrary.simpleMessage("Podmínky"),
"termsOfServicesTitle":
MessageLookupByLibrary.simpleMessage("Podmínky služby"),
"thankYou": MessageLookupByLibrary.simpleMessage("Děkujeme"),
"theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage(
"Stahování nebylo možné dokončit"),
"theme": MessageLookupByLibrary.simpleMessage("Motiv"),
"thisDevice": MessageLookupByLibrary.simpleMessage("Toto zařízení"),
"thisIsMeExclamation":
MessageLookupByLibrary.simpleMessage("To jsem já!"),
"thisWillLogYouOutOfTheFollowingDevice":
MessageLookupByLibrary.simpleMessage(
"Toto vás odhlásí z následujícího zařízení:"),
"thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage(
"Toto vás odhlásí z tohoto zařízení!"),
"toResetVerifyEmail": MessageLookupByLibrary.simpleMessage(
"Pro reset vašeho hesla nejprve vyplňte vaší e-mailovou adresu prosím."),
"totalSize": MessageLookupByLibrary.simpleMessage("Celková velikost"),
"trash": MessageLookupByLibrary.simpleMessage("Koš"),
"tryAgain": MessageLookupByLibrary.simpleMessage("Zkusit znovu"),
"twitter": MessageLookupByLibrary.simpleMessage("Twitter"),
"twofactorSetup": MessageLookupByLibrary.simpleMessage(
"Nastavení dvoufaktorového ověřování"),
"unlock": MessageLookupByLibrary.simpleMessage("Odemknout"),
"unpinAlbum": MessageLookupByLibrary.simpleMessage("Odepnout album"),
"unselectAll": MessageLookupByLibrary.simpleMessage("Zrušit výběr"),
"update": MessageLookupByLibrary.simpleMessage("Aktualizovat"),
"updateAvailable":
MessageLookupByLibrary.simpleMessage("Je k dispozici aktualizace"),
"upgrade": MessageLookupByLibrary.simpleMessage("Upgradovat"),
"uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage(
"Nahrávání souborů do alba..."),
"useRecoveryKey":
MessageLookupByLibrary.simpleMessage("Použít obnovovací klíč"),
"usedSpace": MessageLookupByLibrary.simpleMessage("Využité místo"),
"verify": MessageLookupByLibrary.simpleMessage("Ověřit"),
"verifyEmail": MessageLookupByLibrary.simpleMessage("Ověřit e-mail"),
"verifyEmailID": m111,
"verifyIDLabel": MessageLookupByLibrary.simpleMessage("Ověřit"),
"verifyPassword": MessageLookupByLibrary.simpleMessage("Ověřit heslo"),
"verifying": MessageLookupByLibrary.simpleMessage("Ověřování..."),
"verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage(
"Ověřování obnovovacího klíče..."),
"videos": MessageLookupByLibrary.simpleMessage("Videa"),
"viewAll": MessageLookupByLibrary.simpleMessage("Zobrazit vše"),
"viewer": MessageLookupByLibrary.simpleMessage("Prohlížející"),
"warning": MessageLookupByLibrary.simpleMessage("Varování"),
"weAreOpenSource":
MessageLookupByLibrary.simpleMessage("Jsme open source!"),
"weHaveSendEmailTo": m114,
"weakStrength": MessageLookupByLibrary.simpleMessage("Slabé"),
"welcomeBack": MessageLookupByLibrary.simpleMessage("Vítejte zpět!"),
"whatsNew": MessageLookupByLibrary.simpleMessage("Co je nového"),
"yearly": MessageLookupByLibrary.simpleMessage("Ročně"),
"yes": MessageLookupByLibrary.simpleMessage("Ano"),
"yesCancel": MessageLookupByLibrary.simpleMessage("Ano, zrušit"),
"yesDelete": MessageLookupByLibrary.simpleMessage("Ano, smazat"),
"yesDiscardChanges":
MessageLookupByLibrary.simpleMessage("Ano, zahodit změny"),
"yesLogout": MessageLookupByLibrary.simpleMessage("Ano, odhlásit se"),
"yesRemove": MessageLookupByLibrary.simpleMessage("Ano, odstranit"),
"yesRenew": MessageLookupByLibrary.simpleMessage("Ano, obnovit"),
"you": MessageLookupByLibrary.simpleMessage("Vy"),
"youAndThem": m117,
"yourAccountHasBeenDeleted":
MessageLookupByLibrary.simpleMessage("Váš účet byl smazán"),
"yourMap": MessageLookupByLibrary.simpleMessage("Vaše mapa")
};
}

View File

@@ -0,0 +1,470 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a da locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'da';
static String m8(count) =>
"${Intl.plural(count, zero: 'Ingen Deltagere', one: '1 Deltager', other: '${count} Deltagere')}";
static String m13(user) =>
"${user} vil ikke kunne tilføje flere billeder til dette album\n\nDe vil stadig kunne fjerne eksisterende billeder tilføjet af dem";
static String m25(supportEmail) =>
"Send venligst en email til ${supportEmail} fra din registrerede email adresse";
static String m37(storageAmountInGB) =>
"${storageAmountInGB} GB hver gang nogen tilmelder sig et betalt abonnement og anvender din kode";
static String m47(expiryTime) => "Link udløber den ${expiryTime}";
static String m57(passwordStrengthValue) =>
"Kodeordets styrke: ${passwordStrengthValue}";
static String m80(count) => "${count} valgt";
static String m84(verificationID) =>
"Hey, kan du bekræfte, at dette er dit ente.io verifikation ID: ${verificationID}";
static String m93(storageAmountInGB) => "${storageAmountInGB} GB";
static String m99(storageAmountInGB) => "De får også ${storageAmountInGB} GB";
static String m114(email) =>
"Vi har sendt en email til <green>${email}</green>";
final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"accountWelcomeBack":
MessageLookupByLibrary.simpleMessage("Velkommen tilbage!"),
"ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage(
"Jeg forstår at hvis jeg mister min adgangskode kan jeg miste mine data, da mine data er <underline>end-to-end krypteret</underline>."),
"activeSessions":
MessageLookupByLibrary.simpleMessage("Aktive sessioner"),
"addANewEmail":
MessageLookupByLibrary.simpleMessage("Tilføj en ny e-mail"),
"addCollaborator":
MessageLookupByLibrary.simpleMessage("Tilføj samarbejdspartner"),
"addMore": MessageLookupByLibrary.simpleMessage("Tilføj flere"),
"addOnPageSubtitle":
MessageLookupByLibrary.simpleMessage("Oplysninger om tilføjelser"),
"addViewer": MessageLookupByLibrary.simpleMessage("Tilføj seer"),
"addedAs": MessageLookupByLibrary.simpleMessage("Tilføjet som"),
"addingToFavorites":
MessageLookupByLibrary.simpleMessage("Tilføjer til favoritter..."),
"advancedSettings": MessageLookupByLibrary.simpleMessage("Avanceret"),
"after1Day": MessageLookupByLibrary.simpleMessage("Efter 1 dag"),
"after1Hour": MessageLookupByLibrary.simpleMessage("Efter 1 time"),
"after1Month": MessageLookupByLibrary.simpleMessage("Efter 1 måned"),
"after1Week": MessageLookupByLibrary.simpleMessage("Efter 1 uge"),
"after1Year": MessageLookupByLibrary.simpleMessage("Efter 1 år"),
"albumOwner": MessageLookupByLibrary.simpleMessage("Ejer"),
"albumParticipantsCount": m8,
"albumUpdated":
MessageLookupByLibrary.simpleMessage("Album er opdateret"),
"allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage(
"Tillad personer med linket også at tilføje billeder til det delte album."),
"allowAddingPhotos":
MessageLookupByLibrary.simpleMessage("Tillad tilføjelse af fotos"),
"allowDownloads":
MessageLookupByLibrary.simpleMessage("Tillad downloads"),
"askDeleteReason": MessageLookupByLibrary.simpleMessage(
"Hvad er hovedårsagen til, at du sletter din konto?"),
"backedUpFolders":
MessageLookupByLibrary.simpleMessage("Sikkerhedskopierede mapper"),
"backupStatusDescription": MessageLookupByLibrary.simpleMessage(
"Elementer, der er blevet sikkerhedskopieret, vil blive vist her"),
"canNotOpenBody": MessageLookupByLibrary.simpleMessage(
"Beklager, dette album kan ikke åbnes i appen."),
"canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage(
"Kan kun fjerne filer ejet af dig"),
"cancel": MessageLookupByLibrary.simpleMessage("Annuller"),
"cannotAddMorePhotosAfterBecomingViewer": m13,
"cannotDeleteSharedFiles":
MessageLookupByLibrary.simpleMessage("Kan ikke slette delte filer"),
"changeEmail":
MessageLookupByLibrary.simpleMessage("Skift email adresse"),
"changePasswordTitle":
MessageLookupByLibrary.simpleMessage("Skift adgangskode"),
"changePermissions":
MessageLookupByLibrary.simpleMessage("Rediger rettigheder?"),
"checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage(
"Tjek venligst din indbakke (og spam) for at færdiggøre verificeringen"),
"clearIndexes": MessageLookupByLibrary.simpleMessage("Ryd indekser"),
"codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage(
"Kode kopieret til udklipsholder"),
"collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage(
"Opret et link, så folk kan tilføje og se fotos i dit delte album uden at behøve en Ente-app eller konto. Fantastisk til at indsamle event fotos."),
"collaborativeLink":
MessageLookupByLibrary.simpleMessage("Kollaborativt link"),
"collectPhotos":
MessageLookupByLibrary.simpleMessage("Indsaml billeder"),
"confirm": MessageLookupByLibrary.simpleMessage("Bekræft"),
"confirmAccountDeletion":
MessageLookupByLibrary.simpleMessage("Bekræft Sletning Af Konto"),
"confirmPassword":
MessageLookupByLibrary.simpleMessage("Bekræft adgangskode"),
"confirmRecoveryKey":
MessageLookupByLibrary.simpleMessage("Bekræft gendannelsesnøgle"),
"confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage(
"Bekræft din gendannelsesnøgle"),
"contactSupport":
MessageLookupByLibrary.simpleMessage("Kontakt support"),
"continueLabel": MessageLookupByLibrary.simpleMessage("Fortsæt"),
"copyLink": MessageLookupByLibrary.simpleMessage("Kopiér link"),
"copypasteThisCodentoYourAuthenticatorApp":
MessageLookupByLibrary.simpleMessage(
"Kopiér denne kode\ntil din autentificeringsapp"),
"couldNotUpdateSubscription": MessageLookupByLibrary.simpleMessage(
"Abonnementet kunne ikke opdateres."),
"createAccount": MessageLookupByLibrary.simpleMessage("Opret konto"),
"createNewAccount":
MessageLookupByLibrary.simpleMessage("Opret en ny konto"),
"createPublicLink":
MessageLookupByLibrary.simpleMessage("Opret et offentligt link"),
"creatingLink":
MessageLookupByLibrary.simpleMessage("Opretter link..."),
"custom": MessageLookupByLibrary.simpleMessage("Tilpasset"),
"decrypting": MessageLookupByLibrary.simpleMessage("Dekrypterer..."),
"deleteAccount": MessageLookupByLibrary.simpleMessage("Slet konto"),
"deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage(
"Vi er kede af at du forlader os. Forklar venligst hvorfor, så vi kan forbedre os."),
"deleteAccountPermanentlyButton":
MessageLookupByLibrary.simpleMessage("Slet konto permanent"),
"deleteAlbum": MessageLookupByLibrary.simpleMessage("Slet album"),
"deleteEmailRequest": MessageLookupByLibrary.simpleMessage(
"Send venligst en email til <warning>account-deletion@ente.io</warning> fra din registrerede email adresse."),
"deleteReason1": MessageLookupByLibrary.simpleMessage(
"Der mangler en vigtig funktion, som jeg har brug for"),
"deleteReason2": MessageLookupByLibrary.simpleMessage(
"App\'en eller en bestemt funktion virker ikke som den skal"),
"deleteReason3": MessageLookupByLibrary.simpleMessage(
"Jeg fandt en anden tjeneste, som jeg syntes bedre om"),
"deleteReason4":
MessageLookupByLibrary.simpleMessage("Min grund er ikke angivet"),
"deleteRequestSLAText": MessageLookupByLibrary.simpleMessage(
"Din anmodning vil blive behandlet inden for 72 timer."),
"deleteSharedAlbum":
MessageLookupByLibrary.simpleMessage("Slet delt album?"),
"details": MessageLookupByLibrary.simpleMessage("Detaljer"),
"developerSettingsWarning": MessageLookupByLibrary.simpleMessage(
"Er du sikker på, at du vil ændre udviklerindstillingerne?"),
"disableDownloadWarningTitle":
MessageLookupByLibrary.simpleMessage("Bemærk venligst"),
"discover_food": MessageLookupByLibrary.simpleMessage("Mad"),
"discover_identity": MessageLookupByLibrary.simpleMessage("Identitet"),
"discover_memes": MessageLookupByLibrary.simpleMessage("Memes"),
"discover_notes": MessageLookupByLibrary.simpleMessage("Noter"),
"discover_pets": MessageLookupByLibrary.simpleMessage("Kæledyr"),
"discover_screenshots":
MessageLookupByLibrary.simpleMessage("Skærmbilleder"),
"discover_selfies": MessageLookupByLibrary.simpleMessage("Selfier"),
"discover_sunset": MessageLookupByLibrary.simpleMessage("Solnedgang"),
"discover_wallpapers":
MessageLookupByLibrary.simpleMessage("Baggrundsbilleder"),
"doThisLater": MessageLookupByLibrary.simpleMessage("Gør det senere"),
"dropSupportEmail": m25,
"eligible": MessageLookupByLibrary.simpleMessage("kvalificeret"),
"email": MessageLookupByLibrary.simpleMessage("Email"),
"emailAlreadyRegistered": MessageLookupByLibrary.simpleMessage(
"E-mail er allerede registreret."),
"emailNotRegistered":
MessageLookupByLibrary.simpleMessage("E-mail er ikke registreret."),
"encryption": MessageLookupByLibrary.simpleMessage("Kryptering"),
"encryptionKeys":
MessageLookupByLibrary.simpleMessage("Krypteringsnøgler"),
"enterCode": MessageLookupByLibrary.simpleMessage("Indtast kode"),
"enterEmail":
MessageLookupByLibrary.simpleMessage("Indtast email adresse"),
"enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage(
"Indtast en ny adgangskode vi kan bruge til at kryptere dine data"),
"enterPassword":
MessageLookupByLibrary.simpleMessage("Indtast adgangskode"),
"enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage(
"Indtast en adgangskode vi kan bruge til at kryptere dine data"),
"enterPin": MessageLookupByLibrary.simpleMessage("Indtast PIN"),
"enterThe6digitCodeFromnyourAuthenticatorApp":
MessageLookupByLibrary.simpleMessage(
"Indtast den 6-cifrede kode fra din autentificeringsapp"),
"enterValidEmail": MessageLookupByLibrary.simpleMessage(
"Indtast venligst en gyldig email adresse."),
"enterYourEmailAddress":
MessageLookupByLibrary.simpleMessage("Indtast din email adresse"),
"enterYourPassword":
MessageLookupByLibrary.simpleMessage("Indtast adgangskode"),
"enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage(
"Indtast din gendannelsesnøgle"),
"familyPlanPortalTitle":
MessageLookupByLibrary.simpleMessage("Familie"),
"feedback": MessageLookupByLibrary.simpleMessage("Feedback"),
"fileSavedToGallery":
MessageLookupByLibrary.simpleMessage("Fil gemt i galleri"),
"findPeopleByName":
MessageLookupByLibrary.simpleMessage("Find folk hurtigt ved navn"),
"forgotPassword":
MessageLookupByLibrary.simpleMessage("Glemt adgangskode"),
"freeStorageOnReferralSuccess": m37,
"freeUpDeviceSpace":
MessageLookupByLibrary.simpleMessage("Frigør enhedsplads"),
"freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage(
"Spar plads på din enhed ved at rydde filer, der allerede er sikkerhedskopieret."),
"generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage(
"Genererer krypteringsnøgler..."),
"help": MessageLookupByLibrary.simpleMessage("Hjælp"),
"howItWorks":
MessageLookupByLibrary.simpleMessage("Sådan fungerer det"),
"incorrectPasswordTitle":
MessageLookupByLibrary.simpleMessage("Forkert adgangskode"),
"incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage(
"Den gendannelsesnøgle du indtastede er forkert"),
"incorrectRecoveryKeyTitle":
MessageLookupByLibrary.simpleMessage("Forkert gendannelsesnøgle"),
"indexedItems":
MessageLookupByLibrary.simpleMessage("Indekserede elementer"),
"insecureDevice": MessageLookupByLibrary.simpleMessage("Usikker enhed"),
"invalidEmailAddress":
MessageLookupByLibrary.simpleMessage("Ugyldig email adresse"),
"invalidKey": MessageLookupByLibrary.simpleMessage("Ugyldig nøgle"),
"invite": MessageLookupByLibrary.simpleMessage("Inviter"),
"inviteYourFriends":
MessageLookupByLibrary.simpleMessage("Inviter dine venner"),
"itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage(
"Valgte elementer vil blive fjernet fra dette album"),
"keepPhotos": MessageLookupByLibrary.simpleMessage("Behold billeder"),
"kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage(
"Hjælp os venligst med disse oplysninger"),
"linkDeviceLimit":
MessageLookupByLibrary.simpleMessage("Enheds grænse"),
"linkEnabled": MessageLookupByLibrary.simpleMessage("Aktiveret"),
"linkExpired": MessageLookupByLibrary.simpleMessage("Udløbet"),
"linkExpiresOn": m47,
"linkExpiry": MessageLookupByLibrary.simpleMessage("Udløb af link"),
"linkHasExpired":
MessageLookupByLibrary.simpleMessage("Linket er udløbet"),
"linkNeverExpires": MessageLookupByLibrary.simpleMessage("Aldrig"),
"loadingModel":
MessageLookupByLibrary.simpleMessage("Downloader modeller..."),
"lockButtonLabel": MessageLookupByLibrary.simpleMessage("Lås"),
"logInLabel": MessageLookupByLibrary.simpleMessage("Log ind"),
"loggingOut": MessageLookupByLibrary.simpleMessage("Logger ud..."),
"loginTerms": MessageLookupByLibrary.simpleMessage(
"Ved at klikke på log ind accepterer jeg <u-terms>vilkårene for service</u-terms> og <u-policy>privatlivspolitik</u-policy>"),
"longPressAnEmailToVerifyEndToEndEncryption":
MessageLookupByLibrary.simpleMessage(
"Langt tryk på en e-mail for at bekræfte slutningen af krypteringen."),
"lostDevice":
MessageLookupByLibrary.simpleMessage("Har du mistet enhed?"),
"machineLearning": MessageLookupByLibrary.simpleMessage("Maskinlæring"),
"magicSearch": MessageLookupByLibrary.simpleMessage("Magisk søgning"),
"manage": MessageLookupByLibrary.simpleMessage("Administrér"),
"manageDeviceStorageDesc": MessageLookupByLibrary.simpleMessage(
"Gennemgå og ryd lokal cache-lagring."),
"manageParticipants":
MessageLookupByLibrary.simpleMessage("Administrer"),
"mlConsent":
MessageLookupByLibrary.simpleMessage("Aktiver maskinlæring"),
"mlConsentPrivacy": MessageLookupByLibrary.simpleMessage(
"Klik her for flere detaljer om denne funktion i vores privatlivspolitik"),
"mlConsentTitle":
MessageLookupByLibrary.simpleMessage("Aktiver maskinlæring?"),
"mlIndexingDescription": MessageLookupByLibrary.simpleMessage(
"Bemærk venligst, at maskinindlæring vil resultere i en højere båndbredde og batteriforbrug, indtil alle elementer er indekseret. Overvej at bruge desktop app til hurtigere indeksering, vil alle resultater blive synkroniseret automatisk."),
"moderateStrength": MessageLookupByLibrary.simpleMessage("Moderat"),
"moments": MessageLookupByLibrary.simpleMessage("Øjeblikke"),
"never": MessageLookupByLibrary.simpleMessage("Aldrig"),
"newAlbum": MessageLookupByLibrary.simpleMessage("Nyt album"),
"next": MessageLookupByLibrary.simpleMessage("Næste"),
"noDeviceLimit": MessageLookupByLibrary.simpleMessage("Ingen"),
"noRecoveryKey":
MessageLookupByLibrary.simpleMessage("Ingen gendannelsesnøgle?"),
"ok": MessageLookupByLibrary.simpleMessage("Ok"),
"oops": MessageLookupByLibrary.simpleMessage("Ups"),
"oopsSomethingWentWrong":
MessageLookupByLibrary.simpleMessage("Ups, noget gik galt"),
"orPickAnExistingOne":
MessageLookupByLibrary.simpleMessage("Eller vælg en eksisterende"),
"password": MessageLookupByLibrary.simpleMessage("Adgangskode"),
"passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage(
"Adgangskoden er blevet ændret"),
"passwordLock": MessageLookupByLibrary.simpleMessage("Adgangskodelås"),
"passwordStrength": m57,
"passwordWarning": MessageLookupByLibrary.simpleMessage(
"Vi gemmer ikke denne adgangskode, så hvis du glemmer den <underline>kan vi ikke dekryptere dine data</underline>"),
"pendingItems":
MessageLookupByLibrary.simpleMessage("Afventende elementer"),
"peopleUsingYourCode": MessageLookupByLibrary.simpleMessage(
"Personer, der bruger din kode"),
"pleaseContactSupportAndWeWillBeHappyToHelp":
MessageLookupByLibrary.simpleMessage(
"Kontakt support@ente.io og vi vil være glade for at hjælpe!"),
"pleaseTryAgain":
MessageLookupByLibrary.simpleMessage("Prøv venligst igen"),
"pleaseWait": MessageLookupByLibrary.simpleMessage("Vent venligst..."),
"privacyPolicyTitle":
MessageLookupByLibrary.simpleMessage("Privatlivspolitik"),
"publicLinkEnabled":
MessageLookupByLibrary.simpleMessage("Offentligt link aktiveret"),
"recover": MessageLookupByLibrary.simpleMessage("Gendan"),
"recoverAccount": MessageLookupByLibrary.simpleMessage("Gendan konto"),
"recoverButton": MessageLookupByLibrary.simpleMessage("Gendan"),
"recoveryKey":
MessageLookupByLibrary.simpleMessage("Gendannelse nøgle"),
"recoveryKeyCopiedToClipboard": MessageLookupByLibrary.simpleMessage(
"Gendannelsesnøgle kopieret til udklipsholder"),
"recoveryKeyOnForgotPassword": MessageLookupByLibrary.simpleMessage(
"Hvis du glemmer din adgangskode, den eneste måde, du kan gendanne dine data er med denne nøgle."),
"recoveryKeySaveDescription": MessageLookupByLibrary.simpleMessage(
"Vi gemmer ikke denne nøgle, gem venligst denne 24 ord nøgle på et sikkert sted."),
"recoveryKeySuccessBody": MessageLookupByLibrary.simpleMessage(
"Super! Din gendannelsesnøgle er gyldig. Tak fordi du verificerer.\n\nHusk at holde din gendannelsesnøgle sikker sikkerhedskopieret."),
"recoveryKeyVerified":
MessageLookupByLibrary.simpleMessage("Gendannelsesnøgle bekræftet"),
"recoverySuccessful":
MessageLookupByLibrary.simpleMessage("Gendannelse lykkedes!"),
"recreatePasswordTitle":
MessageLookupByLibrary.simpleMessage("Genskab adgangskode"),
"referralStep2": MessageLookupByLibrary.simpleMessage(
"2. De tilmelder sig en betalt plan"),
"remove": MessageLookupByLibrary.simpleMessage("Fjern"),
"removeFromAlbum":
MessageLookupByLibrary.simpleMessage("Fjern fra album"),
"removeFromAlbumTitle":
MessageLookupByLibrary.simpleMessage("Fjern fra album?"),
"removeLink": MessageLookupByLibrary.simpleMessage("Fjern link"),
"removeParticipant":
MessageLookupByLibrary.simpleMessage("Fjern deltager"),
"removeWithQuestionMark":
MessageLookupByLibrary.simpleMessage("Fjern?"),
"removingFromFavorites":
MessageLookupByLibrary.simpleMessage("Fjerner fra favoritter..."),
"renameFile": MessageLookupByLibrary.simpleMessage("Omdøb fil"),
"resendEmail": MessageLookupByLibrary.simpleMessage("Send email igen"),
"resetPasswordTitle":
MessageLookupByLibrary.simpleMessage("Nulstil adgangskode"),
"retry": MessageLookupByLibrary.simpleMessage("Prøv igen"),
"saveKey": MessageLookupByLibrary.simpleMessage("Gem nøgle"),
"saveYourRecoveryKeyIfYouHaventAlready":
MessageLookupByLibrary.simpleMessage(
"Gem din gendannelsesnøgle, hvis du ikke allerede har"),
"scanCode": MessageLookupByLibrary.simpleMessage("Skan kode"),
"scanThisBarcodeWithnyourAuthenticatorApp":
MessageLookupByLibrary.simpleMessage(
"Skan denne QR-kode med godkendelses-appen"),
"searchHint1":
MessageLookupByLibrary.simpleMessage("Hurtig, søgning på enheden"),
"selectAll": MessageLookupByLibrary.simpleMessage("Vælg alle"),
"selectFoldersForBackup": MessageLookupByLibrary.simpleMessage(
"Vælg mapper til sikkerhedskopiering"),
"selectReason": MessageLookupByLibrary.simpleMessage("Vælg årsag"),
"selectedFoldersWillBeEncryptedAndBackedUp":
MessageLookupByLibrary.simpleMessage(
"Valgte mapper vil blive krypteret og sikkerhedskopieret"),
"selectedPhotos": m80,
"sendEmail": MessageLookupByLibrary.simpleMessage("Send email"),
"sendLink": MessageLookupByLibrary.simpleMessage("Send link"),
"setPasswordTitle":
MessageLookupByLibrary.simpleMessage("Angiv adgangskode"),
"setupComplete":
MessageLookupByLibrary.simpleMessage("Opsætning fuldført"),
"shareALink": MessageLookupByLibrary.simpleMessage("Del et link"),
"shareTextConfirmOthersVerificationID": m84,
"shareWithNonenteUsers":
MessageLookupByLibrary.simpleMessage("Del med ikke Ente brugere"),
"showMemories": MessageLookupByLibrary.simpleMessage("Vis minder"),
"signUpTerms": MessageLookupByLibrary.simpleMessage(
"Jeg er enig i <u-terms>betingelser for brug</u-terms> og <u-policy>privatlivspolitik</u-policy>"),
"skip": MessageLookupByLibrary.simpleMessage("Spring over"),
"somethingWentWrongPleaseTryAgain":
MessageLookupByLibrary.simpleMessage(
"Noget gik galt, prøv venligst igen"),
"sorry": MessageLookupByLibrary.simpleMessage("Beklager"),
"sorryCouldNotAddToFavorites": MessageLookupByLibrary.simpleMessage(
"Beklager, kunne ikke føje til favoritter!"),
"sorryCouldNotRemoveFromFavorites":
MessageLookupByLibrary.simpleMessage(
"Beklager, kunne ikke fjernes fra favoritter!"),
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease":
MessageLookupByLibrary.simpleMessage(
"Beklager, vi kunne ikke generere sikre krypteringsnøgler på denne enhed.\n\nForsøg venligst at oprette en konto fra en anden enhed."),
"status": MessageLookupByLibrary.simpleMessage("Status"),
"storageInGB": m93,
"strongStrength": MessageLookupByLibrary.simpleMessage("Stærkt"),
"subscribe": MessageLookupByLibrary.simpleMessage("Abonner"),
"subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage(
"Du skal have et aktivt betalt abonnement for at aktivere deling."),
"tapToCopy":
MessageLookupByLibrary.simpleMessage("tryk for at kopiere"),
"tapToEnterCode":
MessageLookupByLibrary.simpleMessage("Tryk for at indtaste kode"),
"terminate": MessageLookupByLibrary.simpleMessage("Afbryd"),
"terminateSession":
MessageLookupByLibrary.simpleMessage("Afslut session?"),
"termsOfServicesTitle":
MessageLookupByLibrary.simpleMessage("Betingelser"),
"theyAlsoGetXGb": m99,
"thisCanBeUsedToRecoverYourAccountIfYou":
MessageLookupByLibrary.simpleMessage(
"Dette kan bruges til at gendanne din konto, hvis du mister din anden faktor"),
"thisDevice": MessageLookupByLibrary.simpleMessage("Denne enhed"),
"thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage(
"Dette er dit bekræftelses-ID"),
"thisWillLogYouOutOfTheFollowingDevice":
MessageLookupByLibrary.simpleMessage(
"Dette vil logge dig ud af følgende enhed:"),
"thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage(
"Dette vil logge dig ud af denne enhed!"),
"toResetVerifyEmail": MessageLookupByLibrary.simpleMessage(
"For at nulstille din adgangskode, bekræft venligst din email adresse."),
"tryAgain": MessageLookupByLibrary.simpleMessage("Prøv igen"),
"twofactorAuthenticationPageTitle":
MessageLookupByLibrary.simpleMessage("To-faktor-godkendelse"),
"twofactorSetup":
MessageLookupByLibrary.simpleMessage("To-faktor opsætning"),
"unavailableReferralCode": MessageLookupByLibrary.simpleMessage(
"Beklager, denne kode er ikke tilgængelig."),
"unselectAll": MessageLookupByLibrary.simpleMessage("Fravælg alle"),
"updatingFolderSelection":
MessageLookupByLibrary.simpleMessage("Opdaterer mappevalg..."),
"useRecoveryKey":
MessageLookupByLibrary.simpleMessage("Brug gendannelsesnøgle"),
"verify": MessageLookupByLibrary.simpleMessage("Bekræft"),
"verifyEmail": MessageLookupByLibrary.simpleMessage("Bekræft e-mail"),
"verifyPassword":
MessageLookupByLibrary.simpleMessage("Bekræft adgangskode"),
"verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage(
"Verificerer gendannelsesnøgle..."),
"viewAddOnButton":
MessageLookupByLibrary.simpleMessage("Vis tilføjelser"),
"viewRecoveryKey":
MessageLookupByLibrary.simpleMessage("Vis gendannelsesnøgle"),
"viewer": MessageLookupByLibrary.simpleMessage("Seer"),
"waitingForWifi":
MessageLookupByLibrary.simpleMessage("Venter på Wi-fi..."),
"weHaveSendEmailTo": m114,
"weakStrength": MessageLookupByLibrary.simpleMessage("Svagt"),
"welcomeBack":
MessageLookupByLibrary.simpleMessage("Velkommen tilbage!"),
"yesConvertToViewer": MessageLookupByLibrary.simpleMessage(
"Ja, konverter til præsentation"),
"yesRemove": MessageLookupByLibrary.simpleMessage("Ja, fjern"),
"you": MessageLookupByLibrary.simpleMessage("Dig"),
"yourAccountHasBeenDeleted":
MessageLookupByLibrary.simpleMessage("Din konto er blevet slettet")
};
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,28 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a el locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'el';
final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"enterYourEmailAddress": MessageLookupByLibrary.simpleMessage(
"Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας")
};
}

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