1
0
mirror of https://github.com/bitwarden/mobile synced 2025-12-11 13:53:29 +00:00

Compare commits

..

62 Commits

Author SHA1 Message Date
Federico Maccaroni
ca95ada8e8 MAUI Sample iOS Extension Tap gesture workaround 2023-12-26 18:47:59 -03:00
mpbw2
fa022a1a4f Revert "initial commit of android credential provider service (wip)"
This reverts commit 6011b63958.
2023-12-20 18:23:08 -05:00
mpbw2
6011b63958 initial commit of android credential provider service (wip) 2023-12-20 18:04:21 -05:00
Dinis Vieira
7d79b98bf2 PM-3349 Minor ui fix (space between buttons in delete account page) 2023-12-20 19:04:26 +00:00
Dinis Vieira
bf35d1f2dc PM-3349 minor fix to add space in HomePage between the region picker labels. 2023-12-17 22:26:15 +00:00
Dinis Vieira
c01a8f8d93 PM-3349 Ensure "_isResumed=true" is set on App.xaml.cs:Bootstrap 2023-12-15 23:48:11 +00:00
Federico Maccaroni
8484b4af30 PM-3349 Uncommented the Deploy step for Android job 2023-12-15 16:38:40 -03:00
Federico Maccaroni
6b9faed45f PM-3349 Commented the Deploy step for Android job given that we're using the hotfix-rc branch for testing iOS on TestFlight 2023-12-15 12:08:01 -03:00
Federico Maccaroni
770a1c5dfe Merge branch 'main' into feature/maui-migration 2023-12-15 11:53:57 -03:00
github-actions[bot]
e6635564aa Autosync the updated translations (#2906)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-12-15 15:20:45 +01:00
Vince Grassia
6c078fe343 Update version bump workflow (#2905) 2023-12-15 13:30:15 +01:00
Federico Maccaroni
3a40a4cda8 PM-3349 Upgraded Android targetSdkVersion to 34 2023-12-14 17:52:11 -03:00
Federico Maccaroni
9bcd2e51f7 Merge branch 'feature/maui-migration' of https://github.com/bitwarden/mobile into feature/maui-migration 2023-12-14 17:32:48 -03:00
Federico Maccaroni
741214a1cc PM-3349 PM-3350 Enabled argon2id and fixed one issue with the Uris when getting the icon image 2023-12-14 17:32:43 -03:00
Federico Maccaroni
aad87dfdce Update .github/workflows/build.yml setup-xcode commit hash
Co-authored-by: Vince Grassia <593223+vgrassia@users.noreply.github.com>
2023-12-14 17:28:10 -03:00
Federico Maccaroni
8fc1e9a3b9 PM-3350 Updated Plugin.Fingerprint so biometrics work 2023-12-14 16:32:04 -03:00
Federico Maccaroni
2a8e15146e PM-3350 Apply Cryptography TrimmerRootAssembly only to iOS 2023-12-14 14:28:20 -03:00
Federico Maccaroni
8559d5908e Merge branch 'feature/maui-migration' of https://github.com/bitwarden/mobile into feature/maui-migration 2023-12-14 13:16:41 -03:00
Federico Maccaroni
f60c4d94fe PM-3350 Fix crash on Release by adding Interpreter on iOS and also adding System.Security.Cryptography to be ignored by the linker 2023-12-14 13:16:32 -03:00
Dinis Vieira
4bf695d18c PM-3349 Fix for app crashing on Android when Dark mode is enabled
Removed unused button style for android
2023-12-13 19:20:43 +00:00
Federico Maccaroni
9ccd0834ff Merge branch 'main' into feature/maui-migration 2023-12-13 10:24:29 -03:00
Joseph Flinn
743e71ff92 Fix branch (#2903) 2023-12-13 05:56:34 -05:00
Federico Maccaroni
a806f17d3b PM-3350 Changed linker to use default mode given that "Full" is presenting some problems as the linker is stripping things it shouldn't and we're trying to solve it. So for now we will use the mode "Link SDK assemblies only" so QA can test. 2023-12-12 21:10:51 -03:00
Federico Maccaroni
436a162df2 Merge branch 'main' into feature/maui-migration 2023-12-12 20:19:42 -03:00
github-actions[bot]
7b579b7aa5 Autosync the updated translations (#2902)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-12-12 20:09:30 +00:00
Joseph Flinn
fe10fd7766 Point workflows to main (#2896) 2023-12-12 11:12:27 -08:00
Vince Grassia
3c0de8aacc Add token to checkout step (#2901) 2023-12-12 09:38:12 -08:00
Vince Grassia
18d9a77f25 Fix version bump workflow on call (#2900) 2023-12-12 08:55:24 -08:00
Vince Grassia
9eca82a62b Update version bump workflow (#2898) 2023-12-12 10:22:22 -05:00
mpbw2
b90e030b8f [PM-4837] Hide TOTP seed copy button when Can view, except password permission set (#2869)
* Hide TOTP seed copy button when Can view, except password permission set

* additional check

* removal of null check
2023-12-11 16:40:09 -05:00
Federico Maccaroni
b5dbb9ae5e PM-3350 Bumped iOS version 2023-12-11 13:21:31 -03:00
Federico Maccaroni
7a5f7c0274 Merge branch 'master' into feature/maui-migration 2023-12-11 11:42:46 -03:00
github-actions[bot]
9a28419a4e Autosync the updated translations (#2894)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-12-08 10:56:26 +00:00
Federico Maccaroni
5803635f44 PM-3349 PM-3350 Refactored cipher bindings to have a simpler approach reusing a new CipherItemViewModel to avoid unwanted issues in the app 2023-12-07 23:59:06 -03:00
Federico Maccaroni
19c393842f PM-3350 Cleared left ClipLogger from the iOS extensions debug logging. 2023-12-07 18:14:02 -03:00
Federico Maccaroni
15a306490d Merge branch 'feature/maui-migration' into feature/maui-migration-ios-ext-tap-workaround 2023-12-07 17:41:53 -03:00
Federico Maccaroni
a4a3d31c19 PM-3350 Fix iOS extensions navigation and Window/RootViewController handling for TapGestureRecognizer to work 2023-12-07 17:40:20 -03:00
github-actions[bot]
f4c468e6a1 Bumped version to 2023.12.1 (#2892)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-12-06 13:35:08 -05:00
Dinis Vieira
922dc683af PM-3349 Replaced CrossCurrentActivity plugin with MAUI internal CurrentActivity 2023-12-06 17:27:17 +00:00
github-actions[bot]
2c346eb710 Bumped version to 2023.12.0 (#2891)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-12-06 10:47:08 -05:00
Daniel James Smith
9c0908f7b7 Remove tools ownership for store/google/Publisher (#2890) 2023-12-06 08:15:24 -05:00
Bahasnyldz
827fbbc9ce Add Cromite browser (#2640) 2023-12-04 18:37:34 -03:00
Dinis Vieira
bae1b3e891 PM-3349 PM-3350 Minor change: removed unneeded HorizontalTextAlignment from Label. 2023-12-04 16:54:55 +00:00
Federico Maccaroni
a5888827c9 Merge branch 'feature/maui-migration' into feature/maui-migration-ios-ext-tap-workaround 2023-12-04 12:18:01 -03:00
Federico Maccaroni
0348940a12 Merge branch 'master' into feature/maui-migration 2023-12-04 12:17:48 -03:00
Federico Maccaroni
5b249bed67 PM-5064 Fix lock interaction between biometrics and vault timeout never (#2885) 2023-12-04 12:13:13 -03:00
Federico Maccaroni
4c2998337d Merge branch 'feature/maui-migration' into feature/maui-migration-ios-ext-tap-workaround 2023-12-04 11:44:03 -03:00
Federico Maccaroni
7ea86380f4 PM-3349 PM-3350 build.yml uncommented jobs so we have a more complete workflow 2023-12-04 11:41:55 -03:00
Federico Maccaroni
406f4425c8 PM-3349 PM-3350 Added MAUI label on self-host settings and on about settings to differentiate from XF app 2023-12-04 11:35:35 -03:00
Federico Maccaroni
95ca911444 PM-3350 Improved MTouch linking and extra args on iOS related csprojs 2023-12-04 11:30:54 -03:00
Federico Maccaroni
fa62510e09 PM-3350 build.yml Added several fixes like not using MtouchUseLLVM on the iOS builds to fix they taking forever to build and some changes on the automation CI to do a debug build for the moment 2023-12-04 10:41:41 -03:00
Federico Maccaroni
65dc73495d PM-3350 build.yml added step to validate app for submitting into App Store and have better logs of it 2023-12-04 10:11:29 -03:00
Federico Maccaroni
02a2e41118 PM-3350 fix build.yml Bitwarden.ipa AppStore exported file 2023-12-04 10:10:18 -03:00
Federico Maccaroni
bd6f8295e7 PM-3350 iOS updated CFBundlerShortVersionString to latest one 2023.10.1 2023-12-04 10:01:56 -03:00
Federico Maccaroni
0a0cb7093b Merge branch 'master' into feature/maui-migration
# Conflicts:
#	.github/workflows/build.yml
2023-12-04 09:59:52 -03:00
Dinis Vieira
465e5eff76 PM-3349 PM-3350 Fix for text getting cut/truncated in both account switcher and ciphers/search lists
Issue is due to MAUI but can be avoided by using slightly different layout
2023-12-03 22:17:16 +00:00
Dinis Vieira
5b756aaf7a PM-3349 PM-3350 Added the ability for users to press "Continue" button as a fallback when using the Yubikey if the "SubmitCommand" doesn't trigger automatically. 2023-12-01 16:49:14 +00:00
Federico Maccaroni
afbcb212f6 [PM-4896] Fix null reference exception on the region when setting env urls (#2876)
* PM-4896 Fix null reference exception on the region

* PM-4896 Updated dotnet version to set up in build workflow

* PM-4896 Add NET 3.1.x and NET 7.0.x to Android build

* PM-4896 Reversed to NET 3.1.x  Android build

* PM-4896 Removed changes on build.yml for net version name
2023-12-01 12:30:27 -03:00
Dinis Vieira
d168a7b750 PM-3349 PM-3350 Added workaround for More Options to work on Search and Groupings Page
Updated some code to MAUI Style also
2023-12-01 15:02:12 +00:00
github-actions[bot]
a71c28536d Autosync the updated translations (#2884)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-12-01 12:06:17 +01:00
Vince Grassia
ba5fa8a518 Fix Build workflow - Install OpenJDK 11 (#2883) 2023-11-27 17:18:28 -05:00
github-actions[bot]
65ea5574de Autosync the updated translations (#2880)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-11-27 11:36:59 +00:00
142 changed files with 4180 additions and 1269 deletions

3
.github/CODEOWNERS vendored
View File

@@ -32,3 +32,6 @@ src/App/Resources/AppResources.resx
src/watchOS/bitwarden/bitwarden\ WatchKit\ Extension/Localization/en.lproj src/watchOS/bitwarden/bitwarden\ WatchKit\ Extension/Localization/en.lproj
store/apple/en store/apple/en
store/google/en store/google/en
## Utils ##
store/google/Publisher

29
.github/workflows/_cut_rc.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
---
name: Cut RC Branch
on:
workflow_call:
jobs:
cut-rc:
name: Cut RC branch
runs-on: ubuntu-22.04
steps:
- name: Checkout Branch
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
ref: main
- name: Check if RC branch exists
run: |
remote_rc_branch_check=$(git ls-remote --heads origin rc | wc -l)
if [[ "${remote_rc_branch_check}" -gt 0 ]]; then
echo "Remote RC branch exists."
echo "Please delete current RC branch before running again."
exit 1
fi
- name: Cut RC branch
run: |
git switch --quiet --create rc
git push --quiet --set-upstream origin rc

View File

@@ -9,7 +9,6 @@ on:
paths-ignore: paths-ignore:
- ".github/workflows/**" - ".github/workflows/**"
workflow_dispatch: workflow_dispatch:
inputs: {}
env: env:
main_app_folder_path: src/App main_app_folder_path: src/App
@@ -17,31 +16,30 @@ env:
target-net-version: net8.0 target-net-version: net8.0
jobs: jobs:
# cloc: cloc:
# name: CLOC name: CLOC
# runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
# steps: steps:
# - name: Checkout repo - name: Checkout repo
# uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
# - name: Set up CLOC - name: Set up CLOC
# run: | run: |
# sudo apt-get update sudo apt-get update
# sudo apt-get -y install cloc sudo apt-get -y install cloc
# - name: Print lines of code
# run: cloc --vcs git --exclude-dir Resources,store,test,Properties --include-lang C#,XAML
- name: Print lines of code
run: cloc --vcs git --exclude-dir Resources,store,test,Properties --include-lang C#,XAML
setup: setup:
name: Setup name: Setup
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
outputs: outputs:
rc_branch_exists: ${{ steps.branch-check.outputs.rc_branch_exists }} rc_branch_exists: ${{ steps.branch-check.outputs.rc_branch_exists }}
hotfix_branch_exists: ${{ steps.branch-check.outputs.hotfix_branch_exists }} hotfix_branch_exists: ${{ steps.branch-check.outputs.hotfix_branch_exists }}
steps: steps:
- name: Checkout repo - name: Checkout repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with: with:
submodules: 'true' submodules: 'true'
@@ -59,7 +57,6 @@ jobs:
else else
echo "hotfix_branch_exists=0" >> $GITHUB_OUTPUT echo "hotfix_branch_exists=0" >> $GITHUB_OUTPUT
fi fi
shell: bash
android: android:
name: Android name: Android
@@ -93,6 +90,12 @@ jobs:
- name: Setup Windows builder - name: Setup Windows builder
run: choco install checksum --no-progress run: choco install checksum --no-progress
- name: Install Microsoft OpenJDK 11
run: |
choco install microsoft-openjdk11 --no-progress
Write-Output "JAVA_HOME=$(Get-ChildItem -Path 'C:\Program Files\Microsoft\jdk*' | Select -First 1 -ExpandProperty FullName)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
Write-Output "Java Home: $env:JAVA_HOME"
- name: Print environment - name: Print environment
run: | run: |
nuget help | grep Version nuget help | grep Version
@@ -102,9 +105,10 @@ jobs:
echo "GitHub event: $GITHUB_EVENT" echo "GitHub event: $GITHUB_EVENT"
- name: Checkout repo - name: Checkout repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Decrypt secrets - name: Decrypt secrets
env: env:
DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }} DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
@@ -118,6 +122,7 @@ jobs:
gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
--output $HOME/secrets/play_creds.json ./.github/secrets/play_creds.json.gpg --output $HOME/secrets/play_creds.json ./.github/secrets/play_creds.json.gpg
shell: bash shell: bash
- name: Decrypt secrets - Google Services - name: Decrypt secrets - Google Services
if: ${{ matrix.variant == 'prod' }} if: ${{ matrix.variant == 'prod' }}
env: env:
@@ -126,6 +131,7 @@ jobs:
gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
--output ./${{ env.android_folder_path }}/google-services.json ./.github/secrets/google-services.json.gpg --output ./${{ env.android_folder_path }}/google-services.json ./.github/secrets/google-services.json.gpg
shell: bash shell: bash
- name: Increment version - name: Increment version
run: | run: |
BUILD_NUMBER=$((3000 + $GITHUB_RUN_NUMBER)) BUILD_NUMBER=$((3000 + $GITHUB_RUN_NUMBER))
@@ -143,15 +149,12 @@ jobs:
- name: Restore tools - name: Restore tools
run: dotnet tool restore run: dotnet tool restore
shell: pwsh
# - name: Verify Format # - name: Verify Format
# run: dotnet tool run dotnet-format --check # run: dotnet tool run dotnet-format --check
# shell: pwsh
#- name: Run Core tests # - name: Run Core tests
# run: dotnet test test/Core.Test/Core.Test.csproj --logger "trx;LogFileName=test-results.trx" # run: dotnet test test/Core.Test/Core.Test.csproj --logger "trx;LogFileName=test-results.trx"
# shell: pwsh
#- name: Report test results #- name: Report test results
# uses: dorny/test-reporter@c9b3d0e2bd2a4e96aaf424dbaa31c46b42318226 # v1.6.0 # uses: dorny/test-reporter@c9b3d0e2bd2a4e96aaf424dbaa31c46b42318226 # v1.6.0
@@ -179,7 +182,6 @@ jobs:
Write-Output "########################################" Write-Output "########################################"
dotnet build $projToBuild -c $configuration -f ${{ env.target-net-version }}-android dotnet build $projToBuild -c $configuration -f ${{ env.target-net-version }}-android
shell: pwsh
- name: Sign Android Build - name: Sign Android Build
env: env:
@@ -221,10 +223,10 @@ jobs:
$signedApkDestPath = $($env:GITHUB_WORKSPACE + "/$($packageName).apk"); $signedApkDestPath = $($env:GITHUB_WORKSPACE + "/$($packageName).apk");
Copy-Item $signedApkPath $signedApkDestPath Copy-Item $signedApkPath $signedApkDestPath
shell: pwsh
- name: Upload Prod .aab artifact - name: Upload Prod .aab artifact
if: ${{ matrix.variant == 'prod' }} if: ${{ matrix.variant == 'prod' }}
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with: with:
name: com.x8bit.bitwarden.aab name: com.x8bit.bitwarden.aab
path: ./com.x8bit.bitwarden.aab path: ./com.x8bit.bitwarden.aab
@@ -232,7 +234,7 @@ jobs:
- name: Upload Prod .apk artifact - name: Upload Prod .apk artifact
if: ${{ matrix.variant == 'prod' }} if: ${{ matrix.variant == 'prod' }}
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with: with:
name: com.x8bit.bitwarden.apk name: com.x8bit.bitwarden.apk
path: ./com.x8bit.bitwarden.apk path: ./com.x8bit.bitwarden.apk
@@ -240,7 +242,7 @@ jobs:
- name: Upload Other .apk artifact - name: Upload Other .apk artifact
if: ${{ matrix.variant != 'prod' }} if: ${{ matrix.variant != 'prod' }}
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with: with:
name: com.x8bit.bitwarden.${{ matrix.variant }}.apk name: com.x8bit.bitwarden.${{ matrix.variant }}.apk
path: ./com.x8bit.bitwarden.${{ matrix.variant }}.apk path: ./com.x8bit.bitwarden.${{ matrix.variant }}.apk
@@ -260,7 +262,7 @@ jobs:
- name: Upload .apk sha file for prod - name: Upload .apk sha file for prod
if: ${{ matrix.variant == 'prod' }} if: ${{ matrix.variant == 'prod' }}
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with: with:
name: bw-android-apk-sha256.txt name: bw-android-apk-sha256.txt
path: ./bw-android-apk-sha256.txt path: ./bw-android-apk-sha256.txt
@@ -268,20 +270,20 @@ jobs:
- name: Upload .apk sha file for other - name: Upload .apk sha file for other
if: ${{ matrix.variant != 'prod' }} if: ${{ matrix.variant != 'prod' }}
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with: with:
name: bw-android-${{ matrix.variant }}-apk-sha256.txt name: bw-android-${{ matrix.variant }}-apk-sha256.txt
path: ./bw-android-${{ matrix.variant }}-apk-sha256.txt path: ./bw-android-${{ matrix.variant }}-apk-sha256.txt
if-no-files-found: error if-no-files-found: error
- name: Deploy to Play Store - name: Deploy to Play Store
if: ${{ matrix.variant == 'prod' && (( github.ref == 'refs/heads/master' if: ${{ matrix.variant == 'prod' && (( github.ref == 'refs/heads/main'
&& needs.setup.outputs.rc_branch_exists == 0 && needs.setup.outputs.rc_branch_exists == 0
&& needs.setup.outputs.hotfix_branch_exists == 0) && needs.setup.outputs.hotfix_branch_exists == 0)
|| (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0) || (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0)
|| github.ref == 'refs/heads/hotfix-rc' ) }} || github.ref == 'refs/heads/hotfix-rc' ) }}
run: | run: |
PUBLISHER_PATH="$GITHUB_WORKSPACE/store/google/Publisher/bin/Release/netcoreapp3.1/Publisher.dll" PUBLISHER_PATH="$GITHUB_WORKSPACE/store/google/Publisher/bin/Release/net7.0/Publisher.dll"
CREDS_PATH="$HOME/secrets/play_creds.json" CREDS_PATH="$HOME/secrets/play_creds.json"
AAB_PATH="$GITHUB_WORKSPACE/com.x8bit.bitwarden.aab" AAB_PATH="$GITHUB_WORKSPACE/com.x8bit.bitwarden.aab"
TRACK="internal" TRACK="internal"
@@ -318,6 +320,12 @@ jobs:
- name: Setup Windows builder - name: Setup Windows builder
run: choco install checksum --no-progress run: choco install checksum --no-progress
- name: Install Microsoft OpenJDK 11
run: |
choco install microsoft-openjdk11 --no-progress
Write-Output "JAVA_HOME=$(Get-ChildItem -Path 'C:\Program Files\Microsoft\jdk*' | Select -First 1 -ExpandProperty FullName)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
Write-Output "Java Home: $env:JAVA_HOME"
- name: Print environment - name: Print environment
run: | run: |
nuget help | grep Version nuget help | grep Version
@@ -327,7 +335,7 @@ jobs:
echo "GitHub event: $GITHUB_EVENT" echo "GitHub event: $GITHUB_EVENT"
- name: Checkout repo - name: Checkout repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Decrypt secrets - name: Decrypt secrets
env: env:
@@ -419,7 +427,6 @@ jobs:
# $appCenterNode.ParentNode.RemoveChild($appCenterNode); # $appCenterNode.ParentNode.RemoveChild($appCenterNode);
# $xml.Save($corePath); # $xml.Save($corePath);
shell: pwsh
- name: Restore packages - name: Restore packages
run: dotnet restore run: dotnet restore
@@ -435,8 +442,6 @@ jobs:
dotnet build $projToBuild -c $configuration -f ${{ env.target-net-version }}-android /p:CustomConstants="FDROID" dotnet build $projToBuild -c $configuration -f ${{ env.target-net-version }}-android /p:CustomConstants="FDROID"
shell: pwsh
- name: Sign for F-Droid - name: Sign for F-Droid
env: env:
FDROID_KEYSTORE_PASSWORD: ${{ secrets.FDROID_KEYSTORE_PASSWORD }} FDROID_KEYSTORE_PASSWORD: ${{ secrets.FDROID_KEYSTORE_PASSWORD }}
@@ -458,10 +463,9 @@ jobs:
$signedApkDestPath = $($env:GITHUB_WORKSPACE + "/com.x8bit.bitwarden-fdroid.apk"); $signedApkDestPath = $($env:GITHUB_WORKSPACE + "/com.x8bit.bitwarden-fdroid.apk");
Copy-Item $signedApkPath $signedApkDestPath Copy-Item $signedApkPath $signedApkDestPath
shell: pwsh
- name: Upload F-Droid .apk artifact - name: Upload F-Droid .apk artifact
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with: with:
name: com.x8bit.bitwarden-fdroid.apk name: com.x8bit.bitwarden-fdroid.apk
path: ./com.x8bit.bitwarden-fdroid.apk path: ./com.x8bit.bitwarden-fdroid.apk
@@ -473,25 +477,23 @@ jobs:
-t sha256 | Out-File -Encoding ASCII ./bw-fdroid-apk-sha256.txt -t sha256 | Out-File -Encoding ASCII ./bw-fdroid-apk-sha256.txt
- name: Upload F-Droid sha file - name: Upload F-Droid sha file
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with: with:
name: bw-fdroid-apk-sha256.txt name: bw-fdroid-apk-sha256.txt
path: ./bw-fdroid-apk-sha256.txt path: ./bw-fdroid-apk-sha256.txt
if-no-files-found: error if-no-files-found: error
# Disabling iOS build from this branch until fixing publish/build
# really long time
ios: ios:
name: Apple iOS name: Apple iOS
if: github.ref == 'refs/heads/master'
runs-on: macos-13 runs-on: macos-13
needs: setup needs: setup
env: env:
ios_folder_path: src/App/Platforms/iOS ios_folder_path: src/App/Platforms/iOS
app_output_name: App app_output_name: App
app_ci_output_filename: App_x64_Debug
steps: steps:
- name: Set XCode version - name: Set XCode version
uses: maxim-lobanov/setup-xcode@v1 uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0
with: with:
xcode-version: 15.0.1 xcode-version: 15.0.1
@@ -518,7 +520,7 @@ jobs:
echo "GitHub event: $GITHUB_EVENT" echo "GitHub event: $GITHUB_EVENT"
- name: Checkout repo - name: Checkout repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with: with:
submodules: 'true' submodules: 'true'
@@ -529,17 +531,10 @@ jobs:
- name: Retrieve secrets - name: Retrieve secrets
id: retrieve-secrets id: retrieve-secrets
env: uses: bitwarden/gh-actions/get-keyvault-secrets@main
KEYVAULT: bitwarden-ci with:
SECRETS: | keyvault: "bitwarden-ci"
appcenter-ios-token secrets: "appcenter-ios-token"
run: |
for i in ${SECRETS//,/ }
do
VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv)
echo "::add-mask::$VALUE"
echo "$i=$VALUE" >> $GITHUB_OUTPUT
done
- name: Decrypt secrets - name: Decrypt secrets
env: env:
@@ -568,7 +563,6 @@ jobs:
./.github/secrets/dist_watch_app_extension.mobileprovision.gpg ./.github/secrets/dist_watch_app_extension.mobileprovision.gpg
gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
--output ./src/watchOS/bitwarden/GoogleService-Info.plist ./.github/secrets/GoogleService-Info.plist.gpg --output ./src/watchOS/bitwarden/GoogleService-Info.plist ./.github/secrets/GoogleService-Info.plist.gpg
shell: bash
- name: Increment version - name: Increment version
run: | run: |
@@ -584,8 +578,6 @@ jobs:
perl -0777 -pi.bak -e 's/<key>CFBundleVersion<\/key>\s*<string>1<\/string>/<key>CFBundleVersion<\/key>\n\t<string>'"$BUILD_NUMBER"'<\/string>/' ./src/iOS.ShareExtension/Info.plist perl -0777 -pi.bak -e 's/<key>CFBundleVersion<\/key>\s*<string>1<\/string>/<key>CFBundleVersion<\/key>\n\t<string>'"$BUILD_NUMBER"'<\/string>/' ./src/iOS.ShareExtension/Info.plist
cd src/watchOS/bitwarden cd src/watchOS/bitwarden
agvtool new-version -all $BUILD_NUMBER agvtool new-version -all $BUILD_NUMBER
cd ../../..
shell: bash
- name: Update Entitlements - name: Update Entitlements
run: | run: |
@@ -594,8 +586,7 @@ jobs:
echo "########################################" echo "########################################"
perl -0777 -pi.bak -e 's/<key>aps-environment<\/key>\s*<string>development<\/string>/<key>aps-environment<\/key>\n\t<string>production<\/string>/' ./${{ env.ios_folder_path }}/Entitlements.plist perl -0777 -pi.bak -e 's/<key>aps-environment<\/key>\s*<string>development<\/string>/<key>aps-environment<\/key>\n\t<string>production<\/string>/' ./${{ env.ios_folder_path }}/Entitlements.plist
shell: bash
- name: Set up Keychain - name: Set up Keychain
env: env:
KEYCHAIN_PASSWORD: ${{ secrets.IOS_KEYCHAIN_PASSWORD }} KEYCHAIN_PASSWORD: ${{ secrets.IOS_KEYCHAIN_PASSWORD }}
@@ -611,7 +602,6 @@ jobs:
security import ~/secrets/iphone-distribution-cert.p12 -k build.keychain -P $DIST_CERT_PASSWORD \ security import ~/secrets/iphone-distribution-cert.p12 -k build.keychain -P $DIST_CERT_PASSWORD \
-T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/codesign -T /usr/bin/security
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain
shell: bash
- name: Set up provisioning profiles - name: Set up provisioning profiles
run: | run: |
@@ -642,7 +632,6 @@ jobs:
WATCH_APP_EXTENSION_UUID=$(grep UUID -A1 -a $WATCH_APP_EXTENSION_PROFILE_PATH | grep -io "[-A-F0-9]\{36\}") WATCH_APP_EXTENSION_UUID=$(grep UUID -A1 -a $WATCH_APP_EXTENSION_PROFILE_PATH | grep -io "[-A-F0-9]\{36\}")
cp $WATCH_APP_EXTENSION_PROFILE_PATH "$PROFILES_DIR_PATH/$WATCH_APP_EXTENSION_UUID.mobileprovision" cp $WATCH_APP_EXTENSION_PROFILE_PATH "$PROFILES_DIR_PATH/$WATCH_APP_EXTENSION_UUID.mobileprovision"
shell: bash
- name: Restore packages - name: Restore packages
run: dotnet restore run: dotnet restore
@@ -658,7 +647,6 @@ jobs:
echo "########################################" echo "########################################"
echo "##### Done" echo "##### Done"
echo "########################################" echo "########################################"
shell: bash
- name: Archive Build for App Store - name: Archive Build for App Store
run: | run: |
@@ -666,7 +654,7 @@ jobs:
Write-Output "##### Archive for Release ios-arm64 Write-Output "##### Archive for Release ios-arm64
Write-Output "########################################" Write-Output "########################################"
dotnet publish ${{ env.main_app_project_path }} -c Release -f ${{ env.target-net-version }}-ios /p:RuntimeIdentifier=ios-arm64 /p:ArchiveOnBuild=true dotnet publish ${{ env.main_app_project_path }} -c Release -f ${{ env.target-net-version }}-ios /p:RuntimeIdentifier=ios-arm64 /p:ArchiveOnBuild=true /p:MtouchUseLlvm=false
Write-Output "########################################" Write-Output "########################################"
Write-Output "##### Done" Write-Output "##### Done"
@@ -676,10 +664,10 @@ jobs:
- name: Archive Build for Mobile Automation - name: Archive Build for Mobile Automation
run: | run: |
Write-Output "########################################" Write-Output "########################################"
Write-Output "##### Archive Releae for iossimulator-arm64 Write-Output "##### Archive Debug for iossimulator-x64
Write-Output "########################################" Write-Output "########################################"
dotnet publish ${{ env.main_app_project_path }} -c Release -f ${{ env.target-net-version }}-ios /p:RuntimeIdentifier=iossimulator-arm64 /p:ArchiveOnBuild=true dotnet build ${{ env.main_app_project_path }} -c Debug -f ${{ env.target-net-version }}-ios /p:RuntimeIdentifier=iossimulator-x64 /p:ArchiveOnBuild=true /p:MtouchUseLlvm=false
Write-Output "########################################" Write-Output "########################################"
Write-Output "##### Done" Write-Output "##### Done"
@@ -695,16 +683,14 @@ jobs:
xcodebuild -exportArchive -archivePath $ARCHIVE_PATH -exportPath $EXPORT_PATH \ xcodebuild -exportArchive -archivePath $ARCHIVE_PATH -exportPath $EXPORT_PATH \
-exportOptionsPlist $EXPORT_OPTIONS_PATH -exportOptionsPlist $EXPORT_OPTIONS_PATH
shell: bash
- name: Export .app for Automation CI - name: Export .app for Automation CI
run: | run: |
ARCHIVE_PATH="./${{ env.main_app_folder_path }}/bin/Release/iossimulator-arm64/publish/${{ env.app_output_name }}.app" ARCHIVE_PATH="./${{ env.main_app_folder_path }}/bin/Debug/${{ env.target-net-version }}-ios/iossimulator-x64"
EXPORT_PATH="./bitwarden-export" EXPORT_PATH="./bitwarden-export"
zip -r -q ${{ env.app_output_name }}.app.zip $ARCHIVE_PATH zip -r -q ${{ env.app_ci_output_filename }}.app.zip $ARCHIVE_PATH
mv ${{ env.app_output_name }}.app.zip $EXPORT_PATH mv ${{ env.app_ci_output_filename }}.app.zip $EXPORT_PATH
shell: bash
- name: Copy all dSYMs files to upload - name: Copy all dSYMs files to upload
run: | run: |
@@ -717,27 +703,26 @@ jobs:
cp -r -v $ARCHIVE_DSYMS_PATH $EXPORT_PATH cp -r -v $ARCHIVE_DSYMS_PATH $EXPORT_PATH
mkdir $WATCH_DSYMS_EXPORT_PATH mkdir $WATCH_DSYMS_EXPORT_PATH
cp -r -v $WATCH_ARCHIVE_DSYMS_PATH $WATCH_DSYMS_EXPORT_PATH cp -r -v $WATCH_ARCHIVE_DSYMS_PATH $WATCH_DSYMS_EXPORT_PATH
shell: bash
- name: Upload App Store .ipa & dSYMs artifacts - name: Upload App Store .ipa & dSYMs artifacts
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with: with:
name: Bitwarden iOS name: Bitwarden iOS
path: | path: |
./bitwarden-export/${{ env.app_output_name }}.ipa ./bitwarden-export/Bitwarden.ipa
./bitwarden-export/dSYMs/*.* ./bitwarden-export/dSYMs/*.*
if-no-files-found: error if-no-files-found: error
- name: Upload .app file for Automation CI - name: Upload .app file for Automation CI
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with: with:
name: ${{ env.app_output_name }}.app.zip name: ${{ env.app_ci_output_filename }}.app.zip
path: ./bitwarden-export/${{ env.app_output_name }}.app.zip path: ./bitwarden-export/${{ env.app_ci_output_filename }}.app.zip
if-no-files-found: error if-no-files-found: error
- name: Install AppCenter CLI - name: Install AppCenter CLI
if: | if: |
(github.ref == 'refs/heads/master' (github.ref == 'refs/heads/main'
&& needs.setup.outputs.rc_branch_exists == 0 && needs.setup.outputs.rc_branch_exists == 0
&& needs.setup.outputs.hotfix_branch_exists == 0) && needs.setup.outputs.hotfix_branch_exists == 0)
|| (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0) || (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0)
@@ -746,7 +731,7 @@ jobs:
- name: Upload dSYMs to App Center - name: Upload dSYMs to App Center
if: | if: |
(github.ref == 'refs/heads/master' (github.ref == 'refs/heads/main'
&& needs.setup.outputs.rc_branch_exists == 0 && needs.setup.outputs.rc_branch_exists == 0
&& needs.setup.outputs.hotfix_branch_exists == 0) && needs.setup.outputs.hotfix_branch_exists == 0)
|| (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0) || (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0)
@@ -754,25 +739,22 @@ jobs:
env: env:
APPCENTER_IOS_TOKEN: ${{ steps.retrieve-secrets.outputs.appcenter-ios-token }} APPCENTER_IOS_TOKEN: ${{ steps.retrieve-secrets.outputs.appcenter-ios-token }}
run: appcenter crashes upload-symbols -a bitwarden/bitwarden -s "./bitwarden-export/dSYMs" --token $APPCENTER_IOS_TOKEN run: appcenter crashes upload-symbols -a bitwarden/bitwarden -s "./bitwarden-export/dSYMs" --token $APPCENTER_IOS_TOKEN
shell: bash
- name: Upload Watch dSYMs to Firebase Crashlytics - name: Upload Watch dSYMs to Firebase Crashlytics
if: | if: |
(github.ref == 'refs/heads/master' (github.ref == 'refs/heads/main'
&& needs.setup.outputs.rc_branch_exists == 0 && needs.setup.outputs.rc_branch_exists == 0
&& needs.setup.outputs.hotfix_branch_exists == 0) && needs.setup.outputs.hotfix_branch_exists == 0)
|| (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0) || (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0)
|| github.ref == 'refs/heads/hotfix-rc' || github.ref == 'refs/heads/hotfix-rc'
run: | run: |
echo "########################################" echo "########################################"
echo "##### Uploading Watch dSYMs to Firebase" echo "##### Uploading Watch dSYMs to Firebase"
echo "########################################" echo "########################################"
find "$HOME/Library/Developer/XCode/DerivedData" -name "upload-symbols" -exec chmod +x {} \; -exec {} -gsp "./src/watchOS/bitwarden/GoogleService-Info.plist" -p ios "./bitwarden-export/Watch_dSYMs" \; find "$HOME/Library/Developer/XCode/DerivedData" -name "upload-symbols" -exec chmod +x {} \; -exec {} -gsp "./src/watchOS/bitwarden/GoogleService-Info.plist" -p ios "./bitwarden-export/Watch_dSYMs" \;
shell: bash
- name: Deploy to App Store - name: Validate app in App Store
if: | if: |
(github.ref == 'refs/heads/master' (github.ref == 'refs/heads/master'
&& needs.setup.outputs.rc_branch_exists == 0 && needs.setup.outputs.rc_branch_exists == 0
@@ -783,116 +765,116 @@ jobs:
APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }} APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
run: | run: |
xcrun altool --upload-app --type ios --file "./bitwarden-export/${{ env.app_output_name }}.ipa" \ xcrun altool --validate-app --type ios --file "./bitwarden-export/Bitwarden.ipa" \
--username "$APPLE_ID_USERNAME" --password "$APPLE_ID_PASSWORD" --username "$APPLE_ID_USERNAME" --password "$APPLE_ID_PASSWORD"
shell: bash shell: bash
- name: Deploy to App Store
# crowdin-push: if: |
# name: Crowdin Push (github.ref == 'refs/heads/main'
# if: github.ref == 'refs/heads/master' && needs.setup.outputs.rc_branch_exists == 0
# needs: && needs.setup.outputs.hotfix_branch_exists == 0)
# - android || (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0)
# - f-droid || github.ref == 'refs/heads/hotfix-rc'
# - ios env:
# runs-on: ubuntu-20.04 APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }}
# env: APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
# _CROWDIN_PROJECT_ID: "269690" run: |
# steps: xcrun altool --upload-app --type ios --file "./bitwarden-export/Bitwarden.ipa" \
# - name: Checkout repo --username "$APPLE_ID_USERNAME" --password "$APPLE_ID_PASSWORD"
# uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
# - name: Login to Azure - CI Subscription
# uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.6
# with:
# creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
# - name: Retrieve secrets
# id: retrieve-secrets
# env:
# KEYVAULT: bitwarden-ci
# SECRETS: |
# crowdin-api-token
# run: |
# for i in ${SECRETS//,/ }
# do
# VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv)
# echo "::add-mask::$VALUE"
# echo "$i=$VALUE" >> $GITHUB_OUTPUT
# done
# - name: Upload Sources
# uses: crowdin/github-action@965d501f160af7b1f88aed4c29154b0caf1e94b9 # v1.9.0
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}
# with:
# config: crowdin.yml
# crowdin_branch_name: master
# upload_sources: true
# upload_translations: false
# check-failures: crowdin-push:
# name: Check for failures name: Crowdin Push
# if: always() if: github.ref == 'refs/heads/main'
# runs-on: ubuntu-20.04 needs:
# needs: - android
# - cloc - f-droid
# - android - ios
# - f-droid runs-on: ubuntu-22.04
# - ios env:
# - crowdin-push _CROWDIN_PROJECT_ID: "269690"
# steps: steps:
# - name: Check if any job failed - name: Checkout repo
# if: | uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
# (github.ref == 'refs/heads/master')
# || (github.ref == 'refs/heads/rc')
# || (github.ref == 'refs/heads/hotfix-rc')
# env:
# CLOC_STATUS: ${{ needs.cloc.result }}
# ANDROID_STATUS: ${{ needs.android.result }}
# F_DROID_STATUS: ${{ needs.f-droid.result }}
# IOS_STATUS: ${{ needs.ios.result }}
# CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }}
# run: |
# if [ "$CLOC_STATUS" = "failure" ]; then
# exit 1
# elif [ "$ANDROID_STATUS" = "failure" ]; then
# exit 1
# elif [ "$F_DROID_STATUS" = "failure" ]; then
# exit 1
# elif [ "$IOS_STATUS" = "failure" ]; then
# exit 1
# elif [ "$CROWDIN_PUSH_STATUS" = "failure" ]; then
# exit 1
# fi
# - name: Login to Azure - CI Subscription - name: Login to Azure - CI Subscription
# uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.6 uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.6
# if: failure() with:
# with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
# creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
# - name: Retrieve secrets - name: Retrieve secrets
# id: retrieve-secrets id: retrieve-secrets
# if: failure() uses: bitwarden/gh-actions/get-keyvault-secrets@main
# env: with:
# KEYVAULT: bitwarden-ci keyvault: "bitwarden-ci"
# SECRETS: | secrets: "crowdin-api-token"
# devops-alerts-slack-webhook-url
# run: |
# for i in ${SECRETS//,/ }
# do
# VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv)
# echo "::add-mask::$VALUE"
# echo "$i=$VALUE" >> $GITHUB_OUTPUT
# done
# - name: Notify Slack on failure - name: Upload Sources
# uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.0 uses: crowdin/github-action@965d501f160af7b1f88aed4c29154b0caf1e94b9 # v1.9.0
# if: failure() env:
# env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}
# with: with:
# status: ${{ job.status }} config: crowdin.yml
crowdin_branch_name: main
upload_sources: true
upload_translations: false
check-failures:
name: Check for failures
if: always()
runs-on: ubuntu-22.04
needs:
- cloc
- android
- f-droid
- ios
- crowdin-push
steps:
- name: Check if any job failed
if: |
(github.ref == 'refs/heads/main')
|| (github.ref == 'refs/heads/rc')
|| (github.ref == 'refs/heads/hotfix-rc')
env:
CLOC_STATUS: ${{ needs.cloc.result }}
ANDROID_STATUS: ${{ needs.android.result }}
F_DROID_STATUS: ${{ needs.f-droid.result }}
IOS_STATUS: ${{ needs.ios.result }}
CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }}
run: |
if [ "$CLOC_STATUS" = "failure" ]; then
exit 1
elif [ "$ANDROID_STATUS" = "failure" ]; then
exit 1
elif [ "$F_DROID_STATUS" = "failure" ]; then
exit 1
elif [ "$IOS_STATUS" = "failure" ]; then
exit 1
elif [ "$CROWDIN_PUSH_STATUS" = "failure" ]; then
exit 1
fi
- name: Login to Azure - CI Subscription
uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.6
if: failure()
with:
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
- name: Retrieve secrets
id: retrieve-secrets
uses: bitwarden/gh-actions/get-keyvault-secrets@main
if: failure()
with:
keyvault: "bitwarden-ci"
secrets: "devops-alerts-slack-webhook-url"
- name: Notify Slack on failure
uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.0
if: failure()
env:
SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }}
with:
status: ${{ job.status }}

View File

@@ -36,7 +36,7 @@ jobs:
CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}
with: with:
config: crowdin.yml config: crowdin.yml
crowdin_branch_name: master crowdin_branch_name: main
upload_sources: false upload_sources: false
upload_translations: false upload_translations: false
download_translations: true download_translations: true

View File

@@ -80,7 +80,7 @@ jobs:
with: with:
workflow: build.yml workflow: build.yml
workflow_conclusion: success workflow_conclusion: success
branch: master branch: main
- name: Prep Bitwarden iOS release asset - name: Prep Bitwarden iOS release asset
run: zip -r Bitwarden\ iOS.zip Bitwarden\ iOS run: zip -r Bitwarden\ iOS.zip Bitwarden\ iOS
@@ -143,7 +143,7 @@ jobs:
with: with:
workflow: build.yml workflow: build.yml
workflow_conclusion: success workflow_conclusion: success
branch: master branch: main
name: com.x8bit.bitwarden-fdroid.apk name: com.x8bit.bitwarden-fdroid.apk
- name: Set up Node - name: Set up Node

View File

@@ -27,4 +27,4 @@ jobs:
If youre still working on this, please respond here after youve made the changes weve requested and our team will re-open it for further review. If youre still working on this, please respond here after youve made the changes weve requested and our team will re-open it for further review.
Please make sure to resolve any conflicts with the master branch before requesting another review. Please make sure to resolve any conflicts with the main branch before requesting another review.

View File

@@ -37,3 +37,4 @@ jobs:
uses: ./.github/workflows/version-bump.yml uses: ./.github/workflows/version-bump.yml
with: with:
version_number: ${{ needs.setup.outputs.version_number }} version_number: ${{ needs.setup.outputs.version_number }}
secrets: inherit

View File

@@ -1,26 +1,23 @@
--- ---
name: Version Bump name: Version Bump
run-name: Version Bump - v${{ inputs.version_number }}
on: on:
workflow_dispatch: workflow_dispatch:
inputs: inputs:
version_number: version_number:
description: "New Version" description: "New version (example: '2024.1.0')"
required: true required: true
workflow_call: cut_rc_branch:
inputs: description: "Cut RC branch?"
version_number: default: true
required: true type: boolean
type: string
jobs: jobs:
bump_version: bump_version:
name: "Create version_bump_${{ github.event.inputs.version_number }} branch" name: "Bump Version to v${{ inputs.version_number }}"
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
steps: steps:
- name: Checkout Branch
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
- name: Login to Azure - CI Subscription - name: Login to Azure - CI Subscription
uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7
with: with:
@@ -31,7 +28,15 @@ jobs:
uses: bitwarden/gh-actions/get-keyvault-secrets@main uses: bitwarden/gh-actions/get-keyvault-secrets@main
with: with:
keyvault: "bitwarden-ci" keyvault: "bitwarden-ci"
secrets: "github-gpg-private-key, github-gpg-private-key-passphrase" secrets: "github-gpg-private-key,
github-gpg-private-key-passphrase,
github-pat-bitwarden-devops-bot-repo-scope"
- name: Checkout Branch
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
with:
ref: main
repository: bitwarden/mobile
- name: Import GPG key - name: Import GPG key
uses: crazy-max/ghaction-import-gpg@d6f3f49f3345e29369fe57596a3ca8f94c4d2ca7 # v5.4.0 uses: crazy-max/ghaction-import-gpg@d6f3f49f3345e29369fe57596a3ca8f94c4d2ca7 # v5.4.0
@@ -42,37 +47,68 @@ jobs:
git_commit_gpgsign: true git_commit_gpgsign: true
- name: Create Version Branch - name: Create Version Branch
run: git switch -c version_bump_${{ github.event.inputs.version_number }} id: create-branch
run: |
NAME=version_bump_${{ github.ref_name }}_${{ inputs.version_number }}
git switch -c $NAME
echo "name=$NAME" >> $GITHUB_OUTPUT
- name: Install xmllint
run: sudo apt install -y libxml2-utils
- name: Verify input version
env:
NEW_VERSION: ${{ inputs.version_number }}
run: |
CURRENT_VERSION=$(xmllint --xpath '
string(/manifest/@*[local-name()="versionName"
and namespace-uri()="http://schemas.android.com/apk/res/android"])
' src/Android/Properties/AndroidManifest.xml)
# Error if version has not changed.
if [[ "$NEW_VERSION" == "$CURRENT_VERSION" ]]; then
echo "Version has not changed."
exit 1
fi
# Check if version is newer.
printf '%s\n' "${CURRENT_VERSION}" "${NEW_VERSION}" | sort -C -V
if [ $? -eq 0 ]; then
echo "Version check successful."
else
echo "Version check failed."
exit 1
fi
- name: Bump Version - Android XML - name: Bump Version - Android XML
uses: bitwarden/gh-actions/version-bump@main uses: bitwarden/gh-actions/version-bump@main
with: with:
version: ${{ github.event.inputs.version_number }} version: ${{ inputs.version_number }}
file_path: "./src/Android/Properties/AndroidManifest.xml" file_path: "src/Android/Properties/AndroidManifest.xml"
- name: Bump Version - iOS.Autofill - name: Bump Version - iOS.Autofill
uses: bitwarden/gh-actions/version-bump@main uses: bitwarden/gh-actions/version-bump@main
with: with:
version: ${{ github.event.inputs.version_number }} version: ${{ inputs.version_number }}
file_path: "./src/iOS.Autofill/Info.plist" file_path: "src/iOS.Autofill/Info.plist"
- name: Bump Version - iOS.Extension - name: Bump Version - iOS.Extension
uses: bitwarden/gh-actions/version-bump@main uses: bitwarden/gh-actions/version-bump@main
with: with:
version: ${{ github.event.inputs.version_number }} version: ${{ inputs.version_number }}
file_path: "./src/iOS.Extension/Info.plist" file_path: "src/iOS.Extension/Info.plist"
- name: Bump Version - iOS.ShareExtension - name: Bump Version - iOS.ShareExtension
uses: bitwarden/gh-actions/version-bump@main uses: bitwarden/gh-actions/version-bump@main
with: with:
version: ${{ github.event.inputs.version_number }} version: ${{ inputs.version_number }}
file_path: "./src/iOS.ShareExtension/Info.plist" file_path: "src/iOS.ShareExtension/Info.plist"
- name: Bump Version - iOS - name: Bump Version - iOS
uses: bitwarden/gh-actions/version-bump@main uses: bitwarden/gh-actions/version-bump@main
with: with:
version: ${{ github.event.inputs.version_number }} version: ${{ inputs.version_number }}
file_path: "./src/iOS/Info.plist" file_path: "src/iOS/Info.plist"
- name: Setup git - name: Setup git
run: | run: |
@@ -91,22 +127,24 @@ jobs:
- name: Commit files - name: Commit files
if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
run: git commit -m "Bumped version to ${{ github.event.inputs.version_number }}" -a run: git commit -m "Bumped version to ${{ inputs.version_number }}" -a
- name: Push changes - name: Push changes
if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
run: git push -u origin version_bump_${{ github.event.inputs.version_number }} env:
PR_BRANCH: ${{ steps.create-branch.outputs.name }}
run: git push -u origin $PR_BRANCH
- name: Create Version PR - name: Create Version PR
if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
id: create-pr
env: env:
PR_BRANCH: "version_bump_${{ github.event.inputs.version_number }}" GH_TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" PR_BRANCH: ${{ steps.create-branch.outputs.name }}
BASE_BRANCH: master TITLE: "Bump version to ${{ inputs.version_number }}"
TITLE: "Bump version to ${{ github.event.inputs.version_number }}"
run: | run: |
gh pr create --title "$TITLE" \ PR_URL=$(gh pr create --title "$TITLE" \
--base "$BASE" \ --base "main" \
--head "$PR_BRANCH" \ --head "$PR_BRANCH" \
--label "version update" \ --label "version update" \
--label "automated pr" \ --label "automated pr" \
@@ -119,4 +157,24 @@ jobs:
- [X] Other - [X] Other
## Objective ## Objective
Automated version bump to ${{ github.event.inputs.version_number }}" Automated version bump to ${{ inputs.version_number }}")
echo "pr_number=${PR_URL##*/}" >> $GITHUB_OUTPUT
- name: Approve PR
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ steps.create-pr.outputs.pr_number }}
run: gh pr review $PR_NUMBER --approve
- name: Merge PR
env:
GH_TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}
PR_NUMBER: ${{ steps.create-pr.outputs.pr_number }}
run: gh pr merge $PR_NUMBER --squash --auto --delete-branch
cut_rc:
name: Cut RC Branch
if: ${{ inputs.cut_rc_branch == true }}
needs: bump_version
uses: ./.github/workflows/_cut_rc.yml
secrets: inherit

View File

@@ -53,24 +53,26 @@
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net8.0-ios|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net8.0-ios|AnyCPU'">
<CreatePackage>false</CreatePackage> <CreatePackage>false</CreatePackage>
<CodesignProvision>Automatic</CodesignProvision> <CodesignProvision>Automatic</CodesignProvision>
<CodesignKey>iPhone Developer</CodesignKey> <CodesignKey>iPhone Developer</CodesignKey>
<CodesignEntitlements>Platforms\iOS\Entitlements.plist</CodesignEntitlements> <CodesignEntitlements>Platforms\iOS\Entitlements.plist</CodesignEntitlements>
<MtouchInterpreter>all</MtouchInterpreter> <UseInterpreter>true</UseInterpreter>
<MtouchLink>None</MtouchLink> <!--TODO: add argon2id load when library is built with the corresponding architecture for iOS Simulator-->
<!--TODO: add argon2id load when library is built with the corresponding architecture for iOS Simulator-->
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(RuntimeIdentifier)'=='Debug|net8.0-ios|ios-arm64'"> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(RuntimeIdentifier)'=='Debug|net8.0-ios|ios-arm64'">
<MtouchExtraArgs>-gcc_flags "-L$(ProjectDir)../../lib/ios -largon2 -force_load $(ProjectDir)../../lib/ios/libargon2.a"</MtouchExtraArgs> <MtouchExtraArgs>-gcc_flags "-L$(ProjectDir)../../lib/ios -largon2 -force_load $(ProjectDir)../../lib/ios/libargon2.a"</MtouchExtraArgs>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-ios|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-ios|AnyCPU'">
<CreatePackage>false</CreatePackage> <CreatePackage>false</CreatePackage>
<CodesignProvision>Automatic:AppStore</CodesignProvision> <CodesignProvision>Automatic:AppStore</CodesignProvision>
<CodesignKey>iPhone Distribution</CodesignKey> <CodesignKey>iPhone Distribution</CodesignKey>
<CodesignEntitlements>Platforms\iOS\Entitlements.plist</CodesignEntitlements> <CodesignEntitlements>Platforms\iOS\Entitlements.plist</CodesignEntitlements>
<MtouchInterpreter>all</MtouchInterpreter> <UseInterpreter>true</UseInterpreter>
<MtouchLink>None</MtouchLink> <MtouchExtraArgs>-gcc_flags "-L$(ProjectDir)../../lib/ios -largon2 -force_load $(ProjectDir)../../lib/ios/libargon2.a"</MtouchExtraArgs>
<MtouchExtraArgs>--weak-framework=NewsstandKit.framework/NewsstandKit --linkskip=LiteDB --linkskip=CsvHelper --linkskip=Core --linkskip=iOS.Core --linkskip=iOS.Autofill --linkskip=iOS.Extension --linkskip=iOS.ShareExtension --linkskip=App -gcc_flags "-L$(ProjectDir)../../lib/ios -largon2 -force_load $(ProjectDir)../../lib/ios/libargon2.a"</MtouchExtraArgs>
</PropertyGroup> </PropertyGroup>
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">
<!--This is needed for PCLCrypto to work correctly-->
<TrimmerRootAssembly Include="System.Security.Cryptography" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<AndroidNativeLibrary Include="Platforms\Android\lib\arm64-v8a\libargon2.so" /> <AndroidNativeLibrary Include="Platforms\Android\lib\arm64-v8a\libargon2.so" />
<AndroidNativeLibrary Include="Platforms\Android\lib\armeabi-v7a\libargon2.so" /> <AndroidNativeLibrary Include="Platforms\Android\lib\armeabi-v7a\libargon2.so" />
@@ -92,7 +94,7 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="zxcvbn-core" Version="7.0.92" /> <PackageReference Include="zxcvbn-core" Version="7.0.92" />
<PackageReference Include="CommunityToolkit.Maui" Version="5.2.0" /> <PackageReference Include="CommunityToolkit.Maui" Version="5.2.0" />
<PackageReference Include="Plugin.Fingerprint" Version="2.1.5" /> <PackageReference Include="Plugin.Fingerprint" Version="3.0.0-beta.1" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="2.88.4-preview.84" /> <PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="2.88.4-preview.84" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls.Compatibility" Version="2.88.4-preview.84" /> <PackageReference Include="SkiaSharp.Views.Maui.Controls.Compatibility" Version="2.88.4-preview.84" />
<PackageReference Include="FFImageLoadingCompat.Maui" Version="0.1.1" /> <PackageReference Include="FFImageLoadingCompat.Maui" Version="0.1.1" />
@@ -115,7 +117,6 @@
<Folder Include="Platforms\Android\Utilities\" /> <Folder Include="Platforms\Android\Utilities\" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'"> <ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">
<PackageReference Include="Plugin.CurrentActivity" Version="2.1.0.4" />
<PackageReference Include="Xamarin.AndroidX.AutoFill" Version="1.1.0.18" /> <PackageReference Include="Xamarin.AndroidX.AutoFill" Version="1.1.0.18" />
<PackageReference Include="Xamarin.AndroidX.Activity.Ktx" Version="1.7.2.1" /> <PackageReference Include="Xamarin.AndroidX.Activity.Ktx" Version="1.7.2.1" />
</ItemGroup> </ItemGroup>
@@ -219,8 +220,8 @@
<WatchAppBuildPath Condition=" '$(Configuration)' == 'Debug' ">$(Home)/Library/Developer/Xcode/DerivedData/bitwarden-acgkbpwvmebfiofokotvoerzkqcl/Build/Products</WatchAppBuildPath> <WatchAppBuildPath Condition=" '$(Configuration)' == 'Debug' ">$(Home)/Library/Developer/Xcode/DerivedData/bitwarden-acgkbpwvmebfiofokotvoerzkqcl/Build/Products</WatchAppBuildPath>
<WatchAppBuildPath Condition=" '$(Configuration)' != 'Debug' ">$([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)\..'))/watchOS/bitwarden.xcarchive/Products/Applications/bitwarden.app/Watch</WatchAppBuildPath> <WatchAppBuildPath Condition=" '$(Configuration)' != 'Debug' ">$([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)\..'))/watchOS/bitwarden.xcarchive/Products/Applications/bitwarden.app/Watch</WatchAppBuildPath>
<WatchAppBundle>Bitwarden.app</WatchAppBundle> <WatchAppBundle>Bitwarden.app</WatchAppBundle>
<WatchAppConfiguration Condition="'$(RuntimeIdentifier)'!='ios-arm64'"> >watchsimulator</WatchAppConfiguration> <WatchAppConfiguration Condition="'$(RuntimeIdentifier)'!='ios-arm64'">watchsimulator</WatchAppConfiguration>
<WatchAppConfiguration Condition="'$(RuntimeIdentifier)'=='ios-arm64'"> >watchos</WatchAppConfiguration> <WatchAppConfiguration Condition="'$(RuntimeIdentifier)'=='ios-arm64'">watchos</WatchAppConfiguration>
<WatchAppBundleFullPath Condition=" '$(Configuration)' == 'Debug' ">$(WatchAppBuildPath)/$(Configuration)-$(WatchAppConfiguration)/$(WatchAppBundle)</WatchAppBundleFullPath> <WatchAppBundleFullPath Condition=" '$(Configuration)' == 'Debug' ">$(WatchAppBuildPath)/$(Configuration)-$(WatchAppConfiguration)/$(WatchAppBundle)</WatchAppBundleFullPath>
<WatchAppBundleFullPath Condition=" '$(Configuration)' != 'Debug' ">$(WatchAppBuildPath)/$(WatchAppBundle)</WatchAppBundleFullPath> <WatchAppBundleFullPath Condition=" '$(Configuration)' != 'Debug' ">$(WatchAppBuildPath)/$(WatchAppBundle)</WatchAppBundleFullPath>
</PropertyGroup> </PropertyGroup>

View File

@@ -112,6 +112,7 @@ namespace Bit.Droid.Accessibility
new Browser("org.bromite.chromium", "url_bar"), new Browser("org.bromite.chromium", "url_bar"),
new Browser("org.chromium.chrome", "url_bar"), new Browser("org.chromium.chrome", "url_bar"),
new Browser("org.codeaurora.swe.browser", "url_bar"), new Browser("org.codeaurora.swe.browser", "url_bar"),
new Browser("org.cromite.cromite", "url_bar"),
new Browser("org.gnu.icecat", "url_bar_title,mozac_browser_toolbar_url_view"), // 2nd = Anticipation new Browser("org.gnu.icecat", "url_bar_title,mozac_browser_toolbar_url_view"), // 2nd = Anticipation
new Browser("org.mozilla.fenix", "mozac_browser_toolbar_url_view"), new Browser("org.mozilla.fenix", "mozac_browser_toolbar_url_view"),
new Browser("org.mozilla.fenix.nightly", "mozac_browser_toolbar_url_view"), // [DEPRECATED ENTRY] new Browser("org.mozilla.fenix.nightly", "mozac_browser_toolbar_url_view"), // [DEPRECATED ENTRY]

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2023.10.1" android:installLocation="internalOnly" package="com.x8bit.bitwarden"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2023.12.1" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" /> <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="34" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

View File

@@ -130,6 +130,7 @@ namespace Bit.Droid.Autofill
"org.bromite.chromium", "org.bromite.chromium",
"org.chromium.chrome", "org.chromium.chrome",
"org.codeaurora.swe.browser", "org.codeaurora.swe.browser",
"org.cromite.cromite",
"org.gnu.icecat", "org.gnu.icecat",
"org.mozilla.fenix", "org.mozilla.fenix",
"org.mozilla.fenix.nightly", "org.mozilla.fenix.nightly",

View File

@@ -12,7 +12,6 @@ using Bit.Core.Abstractions;
using Bit.Core.Services; using Bit.Core.Services;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Bit.Droid.Services; using Bit.Droid.Services;
using Plugin.CurrentActivity;
using Plugin.Fingerprint; using Plugin.Fingerprint;
using Xamarin.Android.Net; using Xamarin.Android.Net;
using System.Net.Http; using System.Net.Http;
@@ -101,7 +100,6 @@ namespace Bit.Droid
{ {
base.OnCreate(); base.OnCreate();
Bootstrap(); Bootstrap();
CrossCurrentActivity.Current.Init(this);
} }
public void OnProviderInstallFailed(int errorCode, Intent recoveryIntent) public void OnProviderInstallFailed(int errorCode, Intent recoveryIntent)
@@ -136,7 +134,7 @@ namespace Bit.Droid
// }); // });
// ZXing.Net.Mobile.Forms.Android.Platform.Init(); // ZXing.Net.Mobile.Forms.Android.Platform.Init();
//}); //});
CrossFingerprint.SetCurrentActivityResolver(() => CrossCurrentActivity.Current.Activity); CrossFingerprint.SetCurrentActivityResolver(() => Microsoft.Maui.ApplicationModel.Platform.CurrentActivity);
var preferencesStorage = new PreferencesStorageService(null); var preferencesStorage = new PreferencesStorageService(null);
var localAppDataFolderPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData); var localAppDataFolderPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);

View File

@@ -7,7 +7,7 @@
<item name="android:windowSplashScreenAnimatedIcon">@drawable/splash_screen_round</item> <item name="android:windowSplashScreenAnimatedIcon">@drawable/splash_screen_round</item>
</style> </style>
<style name="BaseTheme" parent="Theme.AppCompat"> <style name="BaseTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="colorPrimaryDark">@color/dark_notificationBar</item> <item name="colorPrimaryDark">@color/dark_notificationBar</item>
@@ -18,10 +18,6 @@
<item name="android:colorActivatedHighlight">@android:color/transparent</item> <item name="android:colorActivatedHighlight">@android:color/transparent</item>
<item name="android:textCursorDrawable">@null</item> <item name="android:textCursorDrawable">@null</item>
<item name="popupTheme">@style/ThemeOverlay.AppCompat</item> <item name="popupTheme">@style/ThemeOverlay.AppCompat</item>
<item name="buttonStyle">@style/ButtonStyle</item>
</style>
<style name="ButtonStyle" parent="Widget.AppCompat.Button">
<item name="android:textAllCaps">false</item> <item name="android:textAllCaps">false</item>
</style> </style>
</resources> </resources>

View File

@@ -20,11 +20,6 @@
<item name="android:colorActivatedHighlight">@android:color/transparent</item> <item name="android:colorActivatedHighlight">@android:color/transparent</item>
<item name="android:textCursorDrawable">@null</item> <item name="android:textCursorDrawable">@null</item>
<item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item> <item name="popupTheme">@style/ThemeOverlay.AppCompat.Light</item>
<item name="buttonStyle">@style/ButtonStyle</item>
<item name="android:textAllCaps">false</item> <item name="android:textAllCaps">false</item>
</style> </style>
<style name="ButtonStyle" parent="Widget.AppCompat.Button">
<item name="android:textAllCaps">false</item>
</style>
</resources> </resources>

View File

@@ -236,6 +236,9 @@
<compatibility-package <compatibility-package
android:name="org.codeaurora.swe.browser" android:name="org.codeaurora.swe.browser"
android:maxLongVersionCode="10000000000"/> android:maxLongVersionCode="10000000000"/>
<compatibility-package
android:name="org.cromite.cromite"
android:maxLongVersionCode="10000000000"/>
<compatibility-package <compatibility-package
android:name="org.gnu.icecat" android:name="org.gnu.icecat"
android:maxLongVersionCode="10000000000"/> android:maxLongVersionCode="10000000000"/>

View File

@@ -12,7 +12,6 @@ using Bit.Core.Enums;
using Bit.Core.Models.View; using Bit.Core.Models.View;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Bit.Droid.Autofill; using Bit.Droid.Autofill;
using Plugin.CurrentActivity;
using Application = Android.App.Application; using Application = Android.App.Application;
namespace Bit.Droid.Services namespace Bit.Droid.Services
@@ -46,7 +45,7 @@ namespace Bit.Droid.Services
} }
try try
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var afm = (AutofillManager)activity.GetSystemService( var afm = (AutofillManager)activity.GetSystemService(
Java.Lang.Class.FromType(typeof(AutofillManager))); Java.Lang.Class.FromType(typeof(AutofillManager)));
return afm.IsEnabled && afm.HasEnabledAutofillServices; return afm.IsEnabled && afm.HasEnabledAutofillServices;
@@ -65,7 +64,7 @@ namespace Bit.Droid.Services
} }
try try
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var type = Java.Lang.Class.FromType(typeof(AutofillManager)); var type = Java.Lang.Class.FromType(typeof(AutofillManager));
var manager = activity.GetSystemService(type) as AutofillManager; var manager = activity.GetSystemService(type) as AutofillManager;
return manager.IsAutofillSupported; return manager.IsAutofillSupported;
@@ -78,7 +77,7 @@ namespace Bit.Droid.Services
public void Autofill(CipherView cipher) public void Autofill(CipherView cipher)
{ {
var activity = CrossCurrentActivity.Current.Activity as MauiAppCompatActivity; var activity = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity as MauiAppCompatActivity;
if (activity == null) if (activity == null)
{ {
return; return;
@@ -170,7 +169,7 @@ namespace Bit.Droid.Services
{ {
try try
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var type = Java.Lang.Class.FromType(typeof(AutofillManager)); var type = Java.Lang.Class.FromType(typeof(AutofillManager));
var manager = activity.GetSystemService(type) as AutofillManager; var manager = activity.GetSystemService(type) as AutofillManager;
manager.DisableAutofillServices(); manager.DisableAutofillServices();

View File

@@ -41,13 +41,13 @@ namespace Bit.Droid.Services
JavaSystem.LoadLibrary("argon2"); JavaSystem.LoadLibrary("argon2");
int keySize = 32; int keySize = 32;
var key = new byte[keySize]; var key = new byte[keySize];
//argon2id_hash_raw(iterations, memory, parallelism, argon2id_hash_raw(iterations, memory, parallelism,
// password, password.Length, salt, salt.Length, key, key.Length); password, password.Length, salt, salt.Length, key, key.Length);
return key; return key;
} }
//[DllImport("argon2", EntryPoint = "argon2id_hash_raw")] [DllImport("argon2", EntryPoint = "argon2id_hash_raw")]
//private static extern int argon2id_hash_raw(int timeCost, int memoryCost, int parallelism, private static extern int argon2id_hash_raw(int timeCost, int memoryCost, int parallelism,
// byte[] pwd, int pwdlen, byte[] salt, int saltlen, byte[] hash, int hashlen); byte[] pwd, int pwdlen, byte[] salt, int saltlen, byte[] hash, int hashlen);
} }
} }

View File

@@ -18,7 +18,6 @@ using Bit.App.Utilities.Prompts;
using Bit.Core.Abstractions; using Bit.Core.Abstractions;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.App.Droid.Utilities; using Bit.App.Droid.Utilities;
using Plugin.CurrentActivity;
using Microsoft.Maui.Controls.Compatibility.Platform.Android; using Microsoft.Maui.Controls.Compatibility.Platform.Android;
using Resource = Bit.Core.Resource; using Resource = Bit.Core.Resource;
using Application = Android.App.Application; using Application = Android.App.Application;
@@ -66,7 +65,7 @@ namespace Bit.Droid.Services
_toast.Dispose(); _toast.Dispose();
_toast = null; _toast = null;
} }
_toast = Android.Widget.Toast.MakeText(CrossCurrentActivity.Current.Activity, text, _toast = Android.Widget.Toast.MakeText(Microsoft.Maui.ApplicationModel.Platform.CurrentActivity, text,
longDuration ? ToastLength.Long : ToastLength.Short); longDuration ? ToastLength.Long : ToastLength.Short);
_toast.Show(); _toast.Show();
} }
@@ -79,7 +78,7 @@ namespace Bit.Droid.Services
// https://developer.android.com/reference/android/content/pm/PackageManager#getLaunchIntentSenderForPackage(java.lang.String) // https://developer.android.com/reference/android/content/pm/PackageManager#getLaunchIntentSenderForPackage(java.lang.String)
return false; return false;
} }
var activity = CrossCurrentActivity.Current.Activity; var activity = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
appName = appName.Replace("androidapp://", string.Empty); appName = appName.Replace("androidapp://", string.Empty);
var launchIntentSender = activity?.PackageManager?.GetLaunchIntentSenderForPackage(appName); var launchIntentSender = activity?.PackageManager?.GetLaunchIntentSenderForPackage(appName);
launchIntentSender?.SendIntent(activity, Result.Ok, null, null, null); launchIntentSender?.SendIntent(activity, Result.Ok, null, null, null);
@@ -93,7 +92,7 @@ namespace Bit.Droid.Services
await HideLoadingAsync(); await HideLoadingAsync();
} }
var activity = CrossCurrentActivity.Current.Activity; var activity = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var inflater = (LayoutInflater)activity.GetSystemService(Context.LayoutInflaterService); var inflater = (LayoutInflater)activity.GetSystemService(Context.LayoutInflaterService);
var dialogView = inflater.Inflate(Resource.Layout.progress_dialog_layout, null); var dialogView = inflater.Inflate(Resource.Layout.progress_dialog_layout, null);
@@ -159,7 +158,7 @@ namespace Bit.Droid.Services
} }
// Finally if all else fails, let's see if current activity is MainActivity // Finally if all else fails, let's see if current activity is MainActivity
if (CrossCurrentActivity.Current.Activity is MainActivity activity && IsAlive(activity)) if (Microsoft.Maui.ApplicationModel.Platform.CurrentActivity is MainActivity activity && IsAlive(activity))
{ {
activity.RunOnUiThread(actionDismiss); activity.RunOnUiThread(actionDismiss);
return Task.CompletedTask; return Task.CompletedTask;
@@ -193,7 +192,7 @@ namespace Bit.Droid.Services
string text = null, string okButtonText = null, string cancelButtonText = null, string text = null, string okButtonText = null, string cancelButtonText = null,
bool numericKeyboard = false, bool autofocus = true, bool password = false) bool numericKeyboard = false, bool autofocus = true, bool password = false)
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (activity == null) if (activity == null)
{ {
return Task.FromResult<string>(null); return Task.FromResult<string>(null);
@@ -250,7 +249,7 @@ namespace Bit.Droid.Services
public Task<ValidatablePromptResponse?> DisplayValidatablePromptAsync(ValidatablePromptConfig config) public Task<ValidatablePromptResponse?> DisplayValidatablePromptAsync(ValidatablePromptConfig config)
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (activity == null) if (activity == null)
{ {
return Task.FromResult<ValidatablePromptResponse?>(null); return Task.FromResult<ValidatablePromptResponse?>(null);
@@ -327,7 +326,7 @@ namespace Bit.Droid.Services
public void RateApp() public void RateApp()
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
try try
{ {
var rateIntent = RateIntentForUrl("market://details", activity); var rateIntent = RateIntentForUrl("market://details", activity);
@@ -360,14 +359,14 @@ namespace Bit.Droid.Services
public bool SupportsNfc() public bool SupportsNfc()
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var manager = activity.GetSystemService(Context.NfcService) as NfcManager; var manager = activity.GetSystemService(Context.NfcService) as NfcManager;
return manager.DefaultAdapter?.IsEnabled ?? false; return manager.DefaultAdapter?.IsEnabled ?? false;
} }
public bool SupportsCamera() public bool SupportsCamera()
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
return activity.PackageManager.HasSystemFeature(PackageManager.FeatureCamera); return activity.PackageManager.HasSystemFeature(PackageManager.FeatureCamera);
} }
@@ -383,7 +382,7 @@ namespace Bit.Droid.Services
public Task<string> DisplayAlertAsync(string title, string message, string cancel, params string[] buttons) public Task<string> DisplayAlertAsync(string title, string message, string cancel, params string[] buttons)
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (activity == null) if (activity == null)
{ {
return Task.FromResult<string>(null); return Task.FromResult<string>(null);
@@ -464,7 +463,7 @@ namespace Bit.Droid.Services
public void OpenAccessibilityOverlayPermissionSettings() public void OpenAccessibilityOverlayPermissionSettings()
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
try try
{ {
var intent = new Intent(Settings.ActionManageOverlayPermission); var intent = new Intent(Settings.ActionManageOverlayPermission);
@@ -495,7 +494,7 @@ namespace Bit.Droid.Services
{ {
try try
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var intent = new Intent(Settings.ActionAccessibilitySettings); var intent = new Intent(Settings.ActionAccessibilitySettings);
activity.StartActivity(intent); activity.StartActivity(intent);
} }
@@ -504,7 +503,7 @@ namespace Bit.Droid.Services
public void OpenAutofillSettings() public void OpenAutofillSettings()
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
try try
{ {
var intent = new Intent(Settings.ActionRequestSetAutofillService); var intent = new Intent(Settings.ActionRequestSetAutofillService);
@@ -535,7 +534,7 @@ namespace Bit.Droid.Services
public void CloseMainApp() public void CloseMainApp()
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (activity == null) if (activity == null)
{ {
return; return;
@@ -574,7 +573,7 @@ namespace Bit.Droid.Services
public float GetSystemFontSizeScale() public float GetSystemFontSizeScale()
{ {
var activity = CrossCurrentActivity.Current?.Activity as MainActivity; var activity = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity as MainActivity;
return activity?.Resources?.Configuration?.FontScale ?? 1; return activity?.Resources?.Configuration?.FontScale ?? 1;
} }
@@ -585,7 +584,7 @@ namespace Bit.Droid.Services
public async Task SetScreenCaptureAllowedAsync() public async Task SetScreenCaptureAllowedAsync()
{ {
var activity = CrossCurrentActivity.Current?.Activity; var activity = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (await _stateService.GetScreenCaptureAllowedAsync()) if (await _stateService.GetScreenCaptureAllowedAsync())
{ {
activity.RunOnUiThread(() => activity.Window.ClearFlags(WindowManagerFlags.Secure)); activity.RunOnUiThread(() => activity.Window.ClearFlags(WindowManagerFlags.Secure));

View File

@@ -13,7 +13,6 @@ using AndroidX.Core.Content;
using Bit.Core.Resources.Localization; using Bit.Core.Resources.Localization;
using Bit.Core; using Bit.Core;
using Bit.Core.Abstractions; using Bit.Core.Abstractions;
using Plugin.CurrentActivity;
using FileProvider = AndroidX.Core.Content.FileProvider; using FileProvider = AndroidX.Core.Content.FileProvider;
namespace Bit.Droid.Services namespace Bit.Droid.Services
@@ -43,7 +42,7 @@ namespace Bit.Droid.Services
{ {
try try
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var intent = BuildOpenFileIntent(fileData, fileName); var intent = BuildOpenFileIntent(fileData, fileName);
if (intent == null) if (intent == null)
{ {
@@ -60,7 +59,7 @@ namespace Bit.Droid.Services
{ {
try try
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var intent = BuildOpenFileIntent(new byte[0], string.Concat("opentest_", fileName)); var intent = BuildOpenFileIntent(new byte[0], string.Concat("opentest_", fileName));
if (intent == null) if (intent == null)
{ {
@@ -87,7 +86,7 @@ namespace Bit.Droid.Services
return null; return null;
} }
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var cachePath = activity.CacheDir; var cachePath = activity.CacheDir;
var filePath = Path.Combine(cachePath.Path, fileName); var filePath = Path.Combine(cachePath.Path, fileName);
File.WriteAllBytes(filePath, fileData); File.WriteAllBytes(filePath, fileData);
@@ -114,7 +113,7 @@ namespace Bit.Droid.Services
{ {
try try
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (contentUri != null) if (contentUri != null)
{ {
@@ -162,7 +161,7 @@ namespace Bit.Droid.Services
{ {
try try
{ {
DeleteDir(CrossCurrentActivity.Current.Activity.CacheDir); DeleteDir(Microsoft.Maui.ApplicationModel.Platform.CurrentActivity?.CacheDir);
await _stateService.SetLastFileCacheClearAsync(DateTime.UtcNow); await _stateService.SetLastFileCacheClearAsync(DateTime.UtcNow);
} }
catch (Exception) { } catch (Exception) { }
@@ -170,7 +169,7 @@ namespace Bit.Droid.Services
public Task SelectFileAsync() public Task SelectFileAsync()
{ {
var activity = (MainActivity)CrossCurrentActivity.Current.Activity; var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var hasStorageWritePermission = !_cameraPermissionsDenied && var hasStorageWritePermission = !_cameraPermissionsDenied &&
HasPermission(Manifest.Permission.WriteExternalStorage); HasPermission(Manifest.Permission.WriteExternalStorage);
var additionalIntents = new List<IParcelable>(); var additionalIntents = new List<IParcelable>();
@@ -249,20 +248,30 @@ namespace Bit.Droid.Services
private bool HasPermission(string permission) private bool HasPermission(string permission)
{ {
return ContextCompat.CheckSelfPermission( var activity = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
CrossCurrentActivity.Current.Activity, permission) == Permission.Granted; if (activity != null)
{
return ContextCompat.CheckSelfPermission(activity, permission) == Permission.Granted;
}
else
{
return false;
}
} }
private void AskPermission(string permission) private void AskPermission(string permission)
{ {
ActivityCompat.RequestPermissions(CrossCurrentActivity.Current.Activity, new string[] { permission }, var activity = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
Core.Constants.SelectFilePermissionRequestCode); if (activity != null)
{
ActivityCompat.RequestPermissions(activity, new string[] { permission }, Core.Constants.SelectFilePermissionRequestCode);
}
} }
private List<IParcelable> GetCameraIntents(Android.Net.Uri outputUri) private List<IParcelable> GetCameraIntents(Android.Net.Uri outputUri)
{ {
var intents = new List<IParcelable>(); var intents = new List<IParcelable>();
var pm = CrossCurrentActivity.Current.Activity.PackageManager; var pm = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity?.PackageManager;
var captureIntent = new Intent(MediaStore.ActionImageCapture); var captureIntent = new Intent(MediaStore.ActionImageCapture);
var listCam = pm.QueryIntentActivities(captureIntent, 0); var listCam = pm.QueryIntentActivities(captureIntent, 0);
foreach (var res in listCam) foreach (var res in listCam)

View File

@@ -11,7 +11,7 @@
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>com.8bit.bitwarden</string> <string>com.8bit.bitwarden</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>2023.9.2</string> <string>2023.12.1</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1</string> <string>1</string>
<key>CFBundleIconName</key> <key>CFBundleIconName</key>

View File

@@ -463,6 +463,7 @@ namespace Bit.App
{ {
UpdateThemeAsync(); UpdateThemeAsync();
}; };
_isResumed = true;
MainPage = new NavigationPage(new HomePage(Options)); MainPage = new NavigationPage(new HomePage(Options));
_accountsManager.NavigateOnAccountChangeAsync().FireAndForget(); _accountsManager.NavigateOnAccountChangeAsync().FireAndForget();
ServiceContainer.Resolve<MobilePlatformUtilsService>("platformUtilsService").Init(); ServiceContainer.Resolve<MobilePlatformUtilsService>("platformUtilsService").Init();

View File

@@ -58,10 +58,6 @@
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Label <Label
Grid.Row="0" Grid.Row="0"
Text="{Binding AccountView.Email}" Text="{Binding AccountView.Email}"

View File

@@ -1,68 +1,10 @@
using System; namespace Bit.App.Controls
using Bit.App.Pages;
using Bit.App.Utilities;
using Bit.Core.Models.View;
using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Controls
{ {
public partial class AuthenticatorViewCell : ExtendedGrid public partial class AuthenticatorViewCell : ExtendedGrid
{ {
public static readonly BindableProperty CipherProperty = BindableProperty.Create(
nameof(Cipher), typeof(CipherView), typeof(AuthenticatorViewCell), default(CipherView), BindingMode.TwoWay);
public static readonly BindableProperty WebsiteIconsEnabledProperty = BindableProperty.Create(
nameof(WebsiteIconsEnabled), typeof(bool?), typeof(AuthenticatorViewCell));
public static readonly BindableProperty TotpSecProperty = BindableProperty.Create(
nameof(TotpSec), typeof(long), typeof(AuthenticatorViewCell));
public AuthenticatorViewCell() public AuthenticatorViewCell()
{ {
InitializeComponent(); InitializeComponent();
} }
public Command CopyCommand { get; set; }
public CipherView Cipher
{
get => GetValue(CipherProperty) as CipherView;
set => SetValue(CipherProperty, value);
}
public bool? WebsiteIconsEnabled
{
get => (bool)GetValue(WebsiteIconsEnabledProperty);
set => SetValue(WebsiteIconsEnabledProperty, value);
}
public long TotpSec
{
get => (long)GetValue(TotpSecProperty);
set => SetValue(TotpSecProperty, value);
}
public bool ShowIconImage
{
get => WebsiteIconsEnabled ?? false
&& !string.IsNullOrWhiteSpace(Cipher.Login?.Uri)
&& IconImageSource != null;
}
private string _iconImageSource = string.Empty;
public string IconImageSource
{
get
{
if (_iconImageSource == string.Empty) // default value since icon source can return null
{
_iconImageSource = IconImageHelper.GetLoginIconImage(Cipher);
}
return _iconImageSource;
}
}
} }
} }

View File

@@ -3,13 +3,14 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Bit.App.Controls.CipherViewCell" x:Class="Bit.App.Controls.CipherViewCell"
xmlns:controls="clr-namespace:Bit.App.Controls" xmlns:controls="clr-namespace:Bit.App.Controls"
xmlns:pages="clr-namespace:Bit.App.Pages"
xmlns:u="clr-namespace:Bit.App.Utilities" xmlns:u="clr-namespace:Bit.App.Utilities"
xmlns:ff="clr-namespace:FFImageLoading.Maui;assembly=FFImageLoading.Compat.Maui" xmlns:ff="clr-namespace:FFImageLoading.Maui;assembly=FFImageLoading.Compat.Maui"
xmlns:core="clr-namespace:Bit.Core" xmlns:core="clr-namespace:Bit.Core"
StyleClass="list-row, list-row-platform" StyleClass="list-row, list-row-platform"
RowSpacing="0" RowSpacing="0"
ColumnSpacing="0" ColumnSpacing="0"
x:DataType="controls:CipherViewCellViewModel" x:DataType="pages:CipherItemViewModel"
AutomationId="CipherCell"> AutomationId="CipherCell">
<Grid.Resources> <Grid.Resources>
@@ -64,23 +65,23 @@
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Label <Label
LineBreakMode="TailTruncation"
Grid.Column="0" Grid.Column="0"
Grid.Row="0" Grid.Row="0"
LineBreakMode="TailTruncation"
StyleClass="list-title, list-title-platform" StyleClass="list-title, list-title-platform"
Text="{Binding Cipher.Name}" Text="{Binding Cipher.Name}"
AutomationId="CipherNameLabel" /> AutomationId="CipherNameLabel" />
<Label <Label
LineBreakMode="TailTruncation"
Grid.Column="0" Grid.Column="0"
Grid.Row="1" Grid.Row="1"
Grid.ColumnSpan="3" Grid.ColumnSpan="3"
LineBreakMode="TailTruncation"
StyleClass="list-subtitle, list-subtitle-platform" StyleClass="list-subtitle, list-subtitle-platform"
Text="{Binding Cipher.SubTitle}" Text="{Binding Cipher.SubTitle}"
IsVisible="{Binding Source={RelativeSource Self}, Path=Text, IsVisible="{Binding Source={RelativeSource Self}, Path=Text,

View File

@@ -1,6 +1,6 @@
using System.Windows.Input; using System.Windows.Input;
using Bit.App.Abstractions; using Bit.App.Abstractions;
using Bit.Core.Models.View; using Bit.App.Pages;
using Bit.Core.Utilities; using Bit.Core.Utilities;
namespace Bit.App.Controls namespace Bit.App.Controls
@@ -10,12 +10,6 @@ namespace Bit.App.Controls
private const int ICON_COLUMN_DEFAULT_WIDTH = 40; private const int ICON_COLUMN_DEFAULT_WIDTH = 40;
private const int ICON_IMAGE_DEFAULT_WIDTH = 22; private const int ICON_IMAGE_DEFAULT_WIDTH = 22;
public static readonly BindableProperty CipherProperty = BindableProperty.Create(
nameof(Cipher), typeof(CipherView), typeof(CipherViewCell), default(CipherView), BindingMode.OneWay);
public static readonly BindableProperty WebsiteIconsEnabledProperty = BindableProperty.Create(
nameof(WebsiteIconsEnabled), typeof(bool?), typeof(CipherViewCell));
public static readonly BindableProperty ButtonCommandProperty = BindableProperty.Create( public static readonly BindableProperty ButtonCommandProperty = BindableProperty.Create(
nameof(ButtonCommand), typeof(ICommand), typeof(CipherViewCell)); nameof(ButtonCommand), typeof(ICommand), typeof(CipherViewCell));
@@ -29,40 +23,17 @@ namespace Bit.App.Controls
_iconImage.HeightRequest = ICON_IMAGE_DEFAULT_WIDTH * fontScale; _iconImage.HeightRequest = ICON_IMAGE_DEFAULT_WIDTH * fontScale;
} }
public bool? WebsiteIconsEnabled
{
get => (bool)GetValue(WebsiteIconsEnabledProperty);
set => SetValue(WebsiteIconsEnabledProperty, value);
}
public CipherView Cipher
{
get => GetValue(CipherProperty) as CipherView;
set => SetValue(CipherProperty, value);
}
public ICommand ButtonCommand public ICommand ButtonCommand
{ {
get => GetValue(ButtonCommandProperty) as ICommand; get => GetValue(ButtonCommandProperty) as ICommand;
set => SetValue(ButtonCommandProperty, value); set => SetValue(ButtonCommandProperty, value);
} }
protected override void OnPropertyChanged(string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if (BindingContext is CipherViewCellViewModel cipherViewCellViewModel && propertyName == WebsiteIconsEnabledProperty.PropertyName)
{
cipherViewCellViewModel.WebsiteIconsEnabled = WebsiteIconsEnabled ?? false;
}
}
private void MoreButton_Clicked(object sender, EventArgs e) private void MoreButton_Clicked(object sender, EventArgs e)
{ {
var cipher = ((sender as MiButton)?.BindingContext as CipherViewCellViewModel)?.Cipher; if (BindingContext is CipherItemViewModel cipherItem)
if (cipher != null)
{ {
ButtonCommand?.Execute(cipher); ButtonCommand?.Execute(cipherItem.Cipher);
} }
} }
} }

View File

@@ -1,66 +0,0 @@
using System.Globalization;
using Bit.App.Utilities;
using Bit.Core.Models.View;
using Bit.Core.Utilities;
namespace Bit.App.Controls
{
public class CipherViewToCipherViewCellViewModelConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is CipherView cipher)
{
return new CipherViewCellViewModel(cipher, false);
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new NotImplementedException();
}
public class CipherViewCellViewModel : ExtendedViewModel
{
private CipherView _cipher;
private bool _websiteIconsEnabled;
private string _iconImageSource = string.Empty;
public CipherViewCellViewModel(CipherView cipherView, bool websiteIconsEnabled)
{
Cipher = cipherView;
WebsiteIconsEnabled = websiteIconsEnabled;
}
public CipherView Cipher
{
get => _cipher;
set => SetProperty(ref _cipher, value);
}
public bool WebsiteIconsEnabled
{
get => _websiteIconsEnabled;
set => SetProperty(ref _websiteIconsEnabled, value);
}
public bool ShowIconImage
{
get => WebsiteIconsEnabled
&& !string.IsNullOrWhiteSpace(Cipher.LaunchUri)
&& IconImageSource != null;
}
public string IconImageSource
{
get
{
if (_iconImageSource == string.Empty) // default value since icon source can return null
{
_iconImageSource = IconImageHelper.GetIconImage(Cipher);
}
return _iconImageSource;
}
}
}
}

View File

@@ -11,7 +11,8 @@ namespace Bit.App.Controls
// TODO: [TouchEffect] When this TouchBehavior is replaced we can delete the existing TouchBehavior support files (which is all the files and folders inside "Core.Behaviors.PlatformBehaviors.MCTTouch.*") // TODO: [TouchEffect] When this TouchBehavior is replaced we can delete the existing TouchBehavior support files (which is all the files and folders inside "Core.Behaviors.PlatformBehaviors.MCTTouch.*")
var touchBehavior = new TouchBehavior() var touchBehavior = new TouchBehavior()
{ {
NativeAnimation = true NativeAnimation = true,
ShouldMakeChildrenInputTransparent = false
}; };
Behaviors.Add(touchBehavior); Behaviors.Add(touchBehavior);
#endif #endif

View File

@@ -11,7 +11,8 @@ namespace Bit.App.Controls
// TODO: [TouchEffect] When this TouchBehavior is replaced we can delete the existing TouchBehavior support files (which is all the files and folders inside "Core.Behaviors.PlatformBehaviors.MCTTouch.*") // TODO: [TouchEffect] When this TouchBehavior is replaced we can delete the existing TouchBehavior support files (which is all the files and folders inside "Core.Behaviors.PlatformBehaviors.MCTTouch.*")
var touchBehavior = new TouchBehavior() var touchBehavior = new TouchBehavior()
{ {
NativeAnimation = true NativeAnimation = true,
ShouldMakeChildrenInputTransparent = false
}; };
Behaviors.Add(touchBehavior); Behaviors.Add(touchBehavior);
#endif #endif

View File

@@ -38,7 +38,7 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
<PackageReference Include="CommunityToolkit.Maui" Version="5.2.0" /> <PackageReference Include="CommunityToolkit.Maui" Version="5.2.0" />
<PackageReference Include="Plugin.Fingerprint" Version="2.1.5" /> <PackageReference Include="Plugin.Fingerprint" Version="3.0.0-beta.1" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="2.88.4-preview.84" /> <PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="2.88.4-preview.84" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls.Compatibility" Version="2.88.4-preview.84" /> <PackageReference Include="SkiaSharp.Views.Maui.Controls.Compatibility" Version="2.88.4-preview.84" />
<PackageReference Include="FFImageLoadingCompat.Maui" Version="0.1.1" /> <PackageReference Include="FFImageLoadingCompat.Maui" Version="0.1.1" />
@@ -47,7 +47,6 @@
<PackageReference Include="Portable.BouncyCastle" Version="1.9.0" /> <PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'"> <ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">
<PackageReference Include="Plugin.CurrentActivity" Version="2.1.0.4" />
<PackageReference Include="Xamarin.AndroidX.AutoFill" Version="1.1.0.18" /> <PackageReference Include="Xamarin.AndroidX.AutoFill" Version="1.1.0.18" />
<PackageReference Include="Xamarin.AndroidX.Activity.Ktx" Version="1.7.2.1" /> <PackageReference Include="Xamarin.AndroidX.Activity.Ktx" Version="1.7.2.1" />
</ItemGroup> </ItemGroup>

View File

@@ -59,7 +59,7 @@
StyleClass="btn-danger" StyleClass="btn-danger"
HorizontalOptions="Start" HorizontalOptions="Start"
VerticalOptions="Start" VerticalOptions="Start"
Margin="0,20,0,0" Margin="0,20,6,0"
Padding="16,0" Padding="16,0"
CornerRadius="2" CornerRadius="2"
TextTransform="Uppercase" TextTransform="Uppercase"

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<pages:BaseContentPage <pages:BaseContentPage
xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
@@ -21,6 +21,10 @@
<ScrollView> <ScrollView>
<StackLayout Spacing="20"> <StackLayout Spacing="20">
<StackLayout StyleClass="box"> <StackLayout StyleClass="box">
<StackLayout StyleClass="box-row-header">
<Label Text="MAUI APP"
StyleClass="box-header, box-header-platform" />
</StackLayout>
<StackLayout StyleClass="box-row-header"> <StackLayout StyleClass="box-row-header">
<Label Text="{u:I18n SelfHostedEnvironment, Header=True}" <Label Text="{u:I18n SelfHostedEnvironment, Header=True}"
StyleClass="box-header, box-header-platform" /> StyleClass="box-header, box-header-platform" />

View File

@@ -72,6 +72,7 @@
Command="{Binding ShowEnvironmentPickerCommand}" /> Command="{Binding ShowEnvironmentPickerCommand}" />
</StackLayout.GestureRecognizers> </StackLayout.GestureRecognizers>
<Label <Label
Margin="0,0,6,0"
Text="{Binding RegionText}" Text="{Binding RegionText}"
FontSize="13" FontSize="13"
TextColor="{DynamicResource MutedColor}" TextColor="{DynamicResource MutedColor}"

View File

@@ -93,7 +93,8 @@
IsSpellCheckEnabled="False" IsSpellCheckEnabled="False"
IsTextPredictionEnabled="False" IsTextPredictionEnabled="False"
ReturnType="Go" ReturnType="Go"
ReturnCommand="{Binding SubmitCommand}" /> ReturnCommand="{Binding SubmitCommand}"
TextChanged="Token_TextChanged" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-switch"> <StackLayout StyleClass="box-row, box-row-switch">
<Label <Label

View File

@@ -68,7 +68,8 @@ namespace Bit.App.Pages
{ {
get get
{ {
var appInfo = string.Format("{0}: {1} ({2})", // TODO: REMOVE WHEN MERGED INTO MAIN BRANCH
var appInfo = string.Format("MAUI {0}: {1} ({2})",
AppResources.Version, AppResources.Version,
_platformUtilsService.GetApplicationVersion(), _platformUtilsService.GetApplicationVersion(),
_deviceActionService.GetBuildNumber()); _deviceActionService.GetBuildNumber());

View File

@@ -1,16 +1,11 @@
using System.Collections.Generic; using Bit.App.Models;
using System.Linq;
using System.Threading.Tasks;
using Bit.App.Models;
using Bit.Core.Resources.Localization;
using Bit.App.Utilities; using Bit.App.Utilities;
using Bit.Core; using Bit.Core;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.View; using Bit.Core.Models.View;
using Bit.Core.Resources.Localization;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Pages namespace Bit.App.Pages
{ {
@@ -48,7 +43,7 @@ namespace Bit.App.Pages
var groupedItems = new List<GroupingsPageListGroup>(); var groupedItems = new List<GroupingsPageListGroup>();
var ciphers = await _cipherService.GetAllDecryptedByUrlAsync(Uri, null); var ciphers = await _cipherService.GetAllDecryptedByUrlAsync(Uri, null);
var matching = ciphers.Item1?.Select(c => new GroupingsPageListItem { Cipher = c }).ToList(); var matching = ciphers.Item1?.Select(c => new CipherItemViewModel(c, WebsiteIconsEnabled)).ToList();
var hasMatching = matching?.Any() ?? false; var hasMatching = matching?.Any() ?? false;
if (matching?.Any() ?? false) if (matching?.Any() ?? false)
{ {
@@ -57,7 +52,7 @@ namespace Bit.App.Pages
} }
var fuzzy = ciphers.Item2?.Select(c => var fuzzy = ciphers.Item2?.Select(c =>
new GroupingsPageListItem { Cipher = c, FuzzyAutofill = true }).ToList(); new CipherItemViewModel(c, WebsiteIconsEnabled, true)).ToList();
if (fuzzy?.Any() ?? false) if (fuzzy?.Any() ?? false)
{ {
groupedItems.Add( groupedItems.Add(
@@ -70,7 +65,7 @@ namespace Bit.App.Pages
protected override async Task SelectCipherAsync(IGroupingsPageListItem item) protected override async Task SelectCipherAsync(IGroupingsPageListItem item)
{ {
if (!(item is GroupingsPageListItem listItem) || listItem.Cipher is null) if (!(item is CipherItemViewModel listItem) || listItem.Cipher is null)
{ {
return; return;
} }

View File

@@ -282,7 +282,7 @@
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}" Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
Command="{Binding CopyCommand}" Command="{Binding CopyCommand}"
IsVisible="{Binding HasTotpValue}" IsVisible="{Binding AllowTotpCopy}"
Grid.Row="0" Grid.Row="0"
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"

View File

@@ -312,6 +312,7 @@ namespace Bit.App.Pages
public bool PasswordPrompt => Cipher != null && Cipher.Reprompt != CipherRepromptType.None; public bool PasswordPrompt => Cipher != null && Cipher.Reprompt != CipherRepromptType.None;
public string PasswordVisibilityAccessibilityText => ShowPassword ? AppResources.PasswordIsVisibleTapToHide : AppResources.PasswordIsNotVisibleTapToShow; public string PasswordVisibilityAccessibilityText => ShowPassword ? AppResources.PasswordIsVisibleTapToHide : AppResources.PasswordIsNotVisibleTapToShow;
public bool HasTotpValue => IsLogin && !string.IsNullOrEmpty(Cipher?.Login?.Totp); public bool HasTotpValue => IsLogin && !string.IsNullOrEmpty(Cipher?.Login?.Totp);
public bool AllowTotpCopy => HasTotpValue && Cipher.ViewPassword;
public string SetupTotpText => $"{BitwardenIcons.Camera} {AppResources.SetupTotp}"; public string SetupTotpText => $"{BitwardenIcons.Camera} {AppResources.SetupTotp}";
public bool ShowPasskeyInfo => Cipher?.HasFido2Credential == true && !CloneMode; public bool ShowPasskeyInfo => Cipher?.HasFido2Credential == true && !CloneMode;

View File

@@ -0,0 +1,42 @@
using Bit.App.Utilities;
using Bit.Core.Models.View;
using Bit.Core.Utilities;
namespace Bit.App.Pages
{
public class CipherItemViewModel : ExtendedViewModel, IGroupingsPageListItem
{
private readonly bool _websiteIconsEnabled;
private string _iconImageSource = string.Empty;
public CipherItemViewModel(CipherView cipherView, bool websiteIconsEnabled, bool fuzzyAutofill = false)
{
Cipher = cipherView;
_websiteIconsEnabled = websiteIconsEnabled;
FuzzyAutofill = fuzzyAutofill;
}
public CipherView Cipher { get; }
public bool FuzzyAutofill { get; }
public bool ShowIconImage
{
get => _websiteIconsEnabled
&& !string.IsNullOrWhiteSpace(Cipher.LaunchUri)
&& IconImageSource != null;
}
public string IconImageSource
{
get
{
if (_iconImageSource == string.Empty) // default value since icon source can return null
{
_iconImageSource = IconImageHelper.GetIconImage(Cipher);
}
return _iconImageSource;
}
}
}
}

View File

@@ -28,7 +28,6 @@
<ResourceDictionary> <ResourceDictionary>
<u:InverseBoolConverter x:Key="inverseBool" /> <u:InverseBoolConverter x:Key="inverseBool" />
<controls:SelectionChangedEventArgsConverter x:Key="SelectionChangedEventArgsConverter" /> <controls:SelectionChangedEventArgsConverter x:Key="SelectionChangedEventArgsConverter" />
<controls:CipherViewToCipherViewCellViewModelConverter x:Key="cipherViewToCipherViewCellViewModel" />
<ToolbarItem <ToolbarItem
x:Name="_closeItem" x:Name="_closeItem"
@@ -46,9 +45,7 @@
<DataTemplate x:Key="cipherTemplate" <DataTemplate x:Key="cipherTemplate"
x:DataType="pages:GroupingsPageListItem"> x:DataType="pages:GroupingsPageListItem">
<controls:CipherViewCell <controls:CipherViewCell
BindingContext="{Binding Cipher, Converter={StaticResource cipherViewToCipherViewCellViewModel}}" ButtonCommand="{Binding BindingContext.CipherOptionsCommand, Source={x:Reference _page}}" />
ButtonCommand="{Binding BindingContext.CipherOptionsCommand, Source={x:Reference _page}}"
WebsiteIconsEnabled="{Binding BindingContext.WebsiteIconsEnabled, Source={x:Reference _page}}" />
</DataTemplate> </DataTemplate>
<DataTemplate <DataTemplate

View File

@@ -1,14 +1,10 @@
using System; using Bit.App.Abstractions;
using System.Threading.Tasks;
using Bit.App.Abstractions;
using Bit.App.Models; using Bit.App.Models;
using Bit.App.Utilities; using Bit.App.Utilities;
using Bit.Core.Abstractions; using Bit.Core.Abstractions;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Services; using Bit.Core.Services;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Pages namespace Bit.App.Pages
{ {
@@ -37,12 +33,10 @@ namespace Bit.App.Pages
InitializeComponent(); InitializeComponent();
// TODO Xamarin.Forms.Device.RuntimePlatform is no longer supported. Use Microsoft.Maui.Devices.DeviceInfo.Platform instead. For more details see https://learn.microsoft.com/en-us/dotnet/maui/migration/forms-projects#device-changes #if IOS
if (Device.RuntimePlatform == Device.iOS) ToolbarItems.Add(_closeItem);
{ ToolbarItems.Add(_addItem);
ToolbarItems.Add(_closeItem); #endif
ToolbarItems.Add(_addItem);
}
SetActivityIndicator(_mainContent); SetActivityIndicator(_mainContent);
_vm = BindingContext as CipherSelectionPageViewModel; _vm = BindingContext as CipherSelectionPageViewModel;
@@ -88,12 +82,12 @@ namespace Bit.App.Pages
{ {
if (message.Command == "syncStarted") if (message.Command == "syncStarted")
{ {
Device.BeginInvokeOnMainThread(() => IsBusy = true); MainThread.BeginInvokeOnMainThread(() => IsBusy = true);
} }
else if (message.Command == "syncCompleted") else if (message.Command == "syncCompleted")
{ {
await Task.Delay(500); await Task.Delay(500);
Device.BeginInvokeOnMainThread(() => MainThread.BeginInvokeOnMainThread(() =>
{ {
IsBusy = false; IsBusy = false;
if (_vm.LoadedOnce) if (_vm.LoadedOnce)
@@ -130,11 +124,10 @@ namespace Bit.App.Pages
_accountListOverlay.HideAsync().FireAndForget(); _accountListOverlay.HideAsync().FireAndForget();
return true; return true;
} }
// TODO Xamarin.Forms.Device.RuntimePlatform is no longer supported. Use Microsoft.Maui.Devices.DeviceInfo.Platform instead. For more details see https://learn.microsoft.com/en-us/dotnet/maui/migration/forms-projects#device-changes
if (Device.RuntimePlatform == Device.Android) #if ANDROID
{ _appOptions.Uri = null;
_appOptions.Uri = null; #endif
}
return base.OnBackButtonPressed(); return base.OnBackButtonPressed();
} }

View File

@@ -1,20 +1,11 @@
using System.Collections.Generic; using System.Windows.Input;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Input;
using Bit.App.Abstractions; using Bit.App.Abstractions;
using Bit.App.Controls; using Bit.App.Controls;
using Bit.App.Models;
using Bit.Core.Resources.Localization;
using Bit.App.Utilities; using Bit.App.Utilities;
using Bit.Core;
using Bit.Core.Abstractions; using Bit.Core.Abstractions;
using Bit.Core.Models.View; using Bit.Core.Models.View;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Pages namespace Bit.App.Pages
{ {
public abstract class CipherSelectionPageViewModel : BaseViewModel public abstract class CipherSelectionPageViewModel : BaseViewModel
@@ -108,10 +99,7 @@ namespace Bit.App.Pages
var groupedItems = await LoadGroupedItemsAsync(); var groupedItems = await LoadGroupedItemsAsync();
// TODO: refactor this // TODO: refactor this
// TODO Xamarin.Forms.Device.RuntimePlatform is no longer supported. Use Microsoft.Maui.Devices.DeviceInfo.Platform instead. For more details see https://learn.microsoft.com/en-us/dotnet/maui/migration/forms-projects#device-changes if (DeviceInfo.Platform == DevicePlatform.Android || GroupedItems.Any())
if (Device.RuntimePlatform == Device.Android
||
GroupedItems.Any())
{ {
var items = new List<IGroupingsPageListItem>(); var items = new List<IGroupingsPageListItem>();
foreach (var itemGroup in groupedItems) foreach (var itemGroup in groupedItems)
@@ -140,7 +128,7 @@ namespace Bit.App.Pages
items.AddRange(itemGroup); items.AddRange(itemGroup);
} }
await Device.InvokeOnMainThreadAsync(() => await MainThread.InvokeOnMainThreadAsync(() =>
{ {
if (groupedItems.Any()) if (groupedItems.Any())
{ {
@@ -153,7 +141,7 @@ namespace Bit.App.Pages
} }
}); });
} }
await Device.InvokeOnMainThreadAsync(() => await MainThread.InvokeOnMainThreadAsync(() =>
{ {
ShowList = groupedItems.Any(); ShowList = groupedItems.Any();
ShowNoData = !ShowList; ShowNoData = !ShowList;

View File

@@ -18,8 +18,6 @@
<ContentPage.Resources> <ContentPage.Resources>
<ResourceDictionary> <ResourceDictionary>
<controls:CipherViewToCipherViewCellViewModelConverter x:Key="cipherViewToCipherViewCellViewModel" />
<ToolbarItem Text="{u:I18n Close}" Clicked="Close_Clicked" Order="Primary" Priority="-1" <ToolbarItem Text="{u:I18n Close}" Clicked="Close_Clicked" Order="Primary" Priority="-1"
x:Name="_closeItem" x:Key="closeItem" /> x:Name="_closeItem" x:Key="closeItem" />
<StackLayout <StackLayout
@@ -55,7 +53,7 @@
IsVisible="{Binding ShowVaultFilter}" IsVisible="{Binding ShowVaultFilter}"
Orientation="Horizontal" Orientation="Horizontal"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
Margin="0,5,0,0"> Margin="{OnPlatform Android='0,5,0,0', iOS='0,15'}">
<Label <Label
Text="{Binding VaultFilterDescription}" Text="{Binding VaultFilterDescription}"
LineBreakMode="TailTruncation" LineBreakMode="TailTruncation"
@@ -112,10 +110,7 @@
<!--Binding context is not applied if the cell is the direct child, check for context https://github.com/dotnet/maui/issues/9131--> <!--Binding context is not applied if the cell is the direct child, check for context https://github.com/dotnet/maui/issues/9131-->
<Grid> <Grid>
<controls:CipherViewCell <controls:CipherViewCell
BindingContext="{Binding ., Converter={StaticResource cipherViewToCipherViewCellViewModel}}" ButtonCommand="{Binding BindingContext.CipherOptionsCommand, Source={x:Reference _page}}" />
ButtonCommand="{Binding BindingContext.CipherOptionsCommand, Source={x:Reference _page}}"
WebsiteIconsEnabled="{Binding BindingContext.WebsiteIconsEnabled, Source={x:Reference _page}}"
/>
</Grid> </Grid>
</DataTemplate> </DataTemplate>
</CollectionView.ItemTemplate> </CollectionView.ItemTemplate>

View File

@@ -1,13 +1,9 @@
using System; using Bit.App.Controls;
using System.Linq;
using Bit.App.Controls;
using Bit.App.Models; using Bit.App.Models;
using Bit.Core.Resources.Localization;
using Bit.Core.Abstractions; using Bit.Core.Abstractions;
using Bit.Core.Models.View; using Bit.Core.Models.View;
using Bit.Core.Resources.Localization;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Pages namespace Bit.App.Pages
{ {
@@ -41,8 +37,7 @@ namespace Bit.App.Pages
} }
_vm.VaultFilterDescription = vaultFilterSelection; _vm.VaultFilterDescription = vaultFilterSelection;
// TODO Xamarin.Forms.Device.RuntimePlatform is no longer supported. Use Microsoft.Maui.Devices.DeviceInfo.Platform instead. For more details see https://learn.microsoft.com/en-us/dotnet/maui/migration/forms-projects#device-changes if (DeviceInfo.Platform == DevicePlatform.iOS)
if (Device.RuntimePlatform == Device.iOS)
{ {
ToolbarItems.Add(_closeItem); ToolbarItems.Add(_closeItem);
_searchBar.Placeholder = AppResources.Search; _searchBar.Placeholder = AppResources.Search;
@@ -59,7 +54,7 @@ namespace Bit.App.Pages
public SearchBar SearchBar => _searchBar; public SearchBar SearchBar => _searchBar;
protected async override void OnAppearing() protected override async void OnAppearing()
{ {
base.OnAppearing(); base.OnAppearing();
await _vm.InitAsync(); await _vm.InitAsync();
@@ -125,9 +120,9 @@ namespace Bit.App.Pages
return; return;
} }
if (e.CurrentSelection?.FirstOrDefault() is CipherView cipher) if (e.CurrentSelection?.FirstOrDefault() is CipherItemViewModel cipherIteemVM)
{ {
await _vm.SelectCipherAsync(cipher); await _vm.SelectCipherAsync(cipherIteemVM.Cipher);
} }
} }

View File

@@ -1,9 +1,4 @@
using System; using System.Windows.Input;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Input;
using Bit.App.Abstractions; using Bit.App.Abstractions;
using Bit.App.Models; using Bit.App.Models;
using Bit.Core.Resources.Localization; using Bit.Core.Resources.Localization;
@@ -13,10 +8,6 @@ using Bit.Core.Exceptions;
using Bit.Core.Models.View; using Bit.Core.Models.View;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
using Bit.App.Utilities;
namespace Bit.App.Pages namespace Bit.App.Pages
{ {
public class CiphersPageViewModel : VaultFilterViewModel public class CiphersPageViewModel : VaultFilterViewModel
@@ -51,7 +42,7 @@ namespace Bit.App.Pages
_policyService = ServiceContainer.Resolve<IPolicyService>("policyService"); _policyService = ServiceContainer.Resolve<IPolicyService>("policyService");
_logger = ServiceContainer.Resolve<ILogger>("logger"); _logger = ServiceContainer.Resolve<ILogger>("logger");
Ciphers = new ExtendedObservableCollection<CipherView>(); Ciphers = new ExtendedObservableCollection<CipherItemViewModel>();
CipherOptionsCommand = CreateDefaultAsyncRelayCommand<CipherView>(cipher => Utilities.AppHelpers.CipherListOptions(Page, cipher, _passwordRepromptService), CipherOptionsCommand = CreateDefaultAsyncRelayCommand<CipherView>(cipher => Utilities.AppHelpers.CipherListOptions(Page, cipher, _passwordRepromptService),
onException: ex => HandleException(ex), onException: ex => HandleException(ex),
allowsMultipleExecutions: false); allowsMultipleExecutions: false);
@@ -62,7 +53,7 @@ namespace Bit.App.Pages
public ICommand CipherOptionsCommand { get; } public ICommand CipherOptionsCommand { get; }
public ICommand AddCipherCommand { get; } public ICommand AddCipherCommand { get; }
public ExtendedObservableCollection<CipherView> Ciphers { get; set; } public ExtendedObservableCollection<CipherItemViewModel> Ciphers { get; set; }
public Func<CipherView, bool> Filter { get; set; } public Func<CipherView, bool> Filter { get; set; }
public string AutofillUrl { get; set; } public string AutofillUrl { get; set; }
public bool Deleted { get; set; } public bool Deleted { get; set; }
@@ -96,12 +87,6 @@ namespace Bit.App.Pages
public bool ShowAddCipher => ShowNoData && _appOptions?.OtpData != null; public bool ShowAddCipher => ShowNoData && _appOptions?.OtpData != null;
public bool WebsiteIconsEnabled
{
get => _websiteIconsEnabled;
set => SetProperty(ref _websiteIconsEnabled, value);
}
internal void Prepare(Func<CipherView, bool> filter, bool deleted, AppOptions appOptions) internal void Prepare(Func<CipherView, bool> filter, bool deleted, AppOptions appOptions)
{ {
Filter = filter; Filter = filter;
@@ -114,7 +99,7 @@ namespace Bit.App.Pages
public async Task InitAsync() public async Task InitAsync()
{ {
await InitVaultFilterAsync(true); await InitVaultFilterAsync(true);
WebsiteIconsEnabled = !(await _stateService.GetDisableFaviconAsync()).GetValueOrDefault(); _websiteIconsEnabled = await _stateService.GetDisableFaviconAsync() != true;
PerformSearchIfPopulated(); PerformSearchIfPopulated();
} }
@@ -164,9 +149,9 @@ namespace Bit.App.Pages
{ {
ciphers = new List<CipherView>(); ciphers = new List<CipherView>();
} }
Device.BeginInvokeOnMainThread(() => MainThread.BeginInvokeOnMainThread(() =>
{ {
Ciphers.ResetWithRange(ciphers); Ciphers.ResetWithRange(ciphers.Select(c => new CipherItemViewModel(c, _websiteIconsEnabled)).ToList());
ShowNoData = !shouldShowAllWhenEmpty && searchable && Ciphers.Count == 0; ShowNoData = !shouldShowAllWhenEmpty && searchable && Ciphers.Count == 0;
ShowList = (searchable || shouldShowAllWhenEmpty) && !ShowNoData; ShowList = (searchable || shouldShowAllWhenEmpty) && !ShowNoData;
}); });

View File

@@ -32,8 +32,6 @@
<ContentPage.Resources> <ContentPage.Resources>
<ResourceDictionary> <ResourceDictionary>
<controls:CipherViewToCipherViewCellViewModelConverter x:Key="cipherViewToCipherViewCellViewModel" />
<ToolbarItem x:Name="_syncItem" x:Key="syncItem" Text="{u:I18n Sync}" <ToolbarItem x:Name="_syncItem" x:Key="syncItem" Text="{u:I18n Sync}"
Clicked="Sync_Clicked" Order="Secondary" /> Clicked="Sync_Clicked" Order="Secondary" />
<ToolbarItem x:Name="_lockItem" x:Key="lockItem" Text="{u:I18n Lock}" <ToolbarItem x:Name="_lockItem" x:Key="lockItem" Text="{u:I18n Lock}"
@@ -45,19 +43,14 @@
SemanticProperties.Description="{u:I18n AddItem}" /> SemanticProperties.Description="{u:I18n AddItem}" />
<DataTemplate x:Key="cipherTemplate" <DataTemplate x:Key="cipherTemplate"
x:DataType="pages:GroupingsPageListItem"> x:DataType="pages:CipherItemViewModel">
<controls:CipherViewCell <controls:CipherViewCell
BindingContext="{Binding Cipher, Converter={StaticResource cipherViewToCipherViewCellViewModel}}" ButtonCommand="{Binding BindingContext.CipherOptionsCommand, Source={x:Reference _page}}" />
ButtonCommand="{Binding BindingContext.CipherOptionsCommand, Source={x:Reference _page}}"
WebsiteIconsEnabled="{Binding BindingContext.WebsiteIconsEnabled, Source={x:Reference _page}}" />
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="authenticatorTemplate" <DataTemplate x:Key="authenticatorTemplate"
x:DataType="pages:GroupingsPageTOTPListItem"> x:DataType="pages:GroupingsPageTOTPListItem">
<controls:AuthenticatorViewCell <controls:AuthenticatorViewCell />
Cipher="{Binding Cipher}"
WebsiteIconsEnabled="{Binding BindingContext.WebsiteIconsEnabled, Source={x:Reference _page}}"
TotpSec="{Binding TotpSec}" />
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="groupTemplate" <DataTemplate x:Key="groupTemplate"
@@ -124,7 +117,7 @@
IsVisible="{Binding ShowVaultFilter}" IsVisible="{Binding ShowVaultFilter}"
Orientation="Horizontal" Orientation="Horizontal"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
Margin="0,5,0,0"> Margin="{OnPlatform Android='0,5,0,0', iOS='0,15'}">
<Label <Label
Text="{Binding VaultFilterDescription}" Text="{Binding VaultFilterDescription}"
LineBreakMode="TailTruncation" LineBreakMode="TailTruncation"

View File

@@ -215,13 +215,21 @@ namespace Bit.App.Pages
return; return;
} }
if (e.CurrentSelection?.FirstOrDefault() is GroupingsPageTOTPListItem totpItem) var selection = e.CurrentSelection?.FirstOrDefault();
if (selection is GroupingsPageTOTPListItem totpItem)
{ {
await _vm.SelectCipherAsync(totpItem.Cipher); await _vm.SelectCipherAsync(totpItem.Cipher);
return; return;
} }
if (!(e.CurrentSelection?.FirstOrDefault() is GroupingsPageListItem item)) if (selection is CipherItemViewModel cipherItemVM)
{
await _vm.SelectCipherAsync(cipherItemVM.Cipher);
return;
}
if (!(selection is GroupingsPageListItem item))
{ {
return; return;
} }
@@ -234,10 +242,6 @@ namespace Bit.App.Pages
{ {
await _vm.SelectTotpCodesAsync(); await _vm.SelectTotpCodesAsync();
} }
else if (item.Cipher != null)
{
await _vm.SelectCipherAsync(item.Cipher);
}
else if (item.Folder != null) else if (item.Folder != null)
{ {
await _vm.SelectFolderAsync(item.Folder); await _vm.SelectFolderAsync(item.Folder);

View File

@@ -1,8 +1,8 @@
using Bit.Core.Resources.Localization; using Bit.App.Utilities.Automation;
using Bit.App.Utilities.Automation;
using Bit.Core; using Bit.Core;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Models.View; using Bit.Core.Models.View;
using Bit.Core.Resources.Localization;
using CollectionView = Bit.Core.Models.View.CollectionView; using CollectionView = Bit.Core.Models.View.CollectionView;
namespace Bit.App.Pages namespace Bit.App.Pages
@@ -14,10 +14,8 @@ namespace Bit.App.Pages
public FolderView Folder { get; set; } public FolderView Folder { get; set; }
public CollectionView Collection { get; set; } public CollectionView Collection { get; set; }
public CipherView Cipher { get; set; }
public CipherType? Type { get; set; } public CipherType? Type { get; set; }
public string ItemCount { get; set; } public string ItemCount { get; set; }
public bool FuzzyAutofill { get; set; }
public bool IsTrash { get; set; } public bool IsTrash { get; set; }
public bool IsTotpCode { get; set; } public bool IsTotpCode { get; set; }

View File

@@ -1,7 +1,4 @@
using Microsoft.Maui.Controls; namespace Bit.App.Pages
using Microsoft.Maui;
namespace Bit.App.Pages
{ {
public class GroupingsPageListItemSelector : DataTemplateSelector public class GroupingsPageListItemSelector : DataTemplateSelector
{ {
@@ -12,19 +9,24 @@ namespace Bit.App.Pages
protected override DataTemplate OnSelectTemplate(object item, BindableObject container) protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{ {
if (item is GroupingsPageHeaderListItem)
{
return HeaderTemplate;
}
if (item is GroupingsPageTOTPListItem) if (item is GroupingsPageTOTPListItem)
{ {
return AuthenticatorTemplate; return AuthenticatorTemplate;
} }
if (item is GroupingsPageListItem listItem) if (item is CipherItemViewModel)
{ {
return listItem.Cipher != null ? CipherTemplate : GroupTemplate; return CipherTemplate;
}
if (item is GroupingsPageHeaderListItem)
{
return HeaderTemplate;
}
if (item is GroupingsPageListItem)
{
return GroupTemplate;
} }
return null; return null;

View File

@@ -1,56 +1,34 @@
using System; using Bit.App.Utilities;
using System.Threading.Tasks;
using Bit.Core.Resources.Localization;
using Bit.App.Utilities;
using Bit.Core.Abstractions; using Bit.Core.Abstractions;
using Bit.Core.Models.View; using Bit.Core.Models.View;
using Bit.Core.Resources.Localization;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using Microsoft.Maui.ApplicationModel;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Pages namespace Bit.App.Pages
{ {
public class GroupingsPageTOTPListItem : ExtendedViewModel, IGroupingsPageListItem public class GroupingsPageTOTPListItem : CipherItemViewModel, IGroupingsPageListItem
{ {
private readonly LazyResolve<ILogger> _logger = new LazyResolve<ILogger>("logger");
private readonly ITotpService _totpService;
private readonly IPlatformUtilsService _platformUtilsService;
private readonly IClipboardService _clipboardService; private readonly IClipboardService _clipboardService;
private CipherView _cipher;
private bool _websiteIconsEnabled;
private string _iconImageSource = string.Empty;
private double _progress; private double _progress;
private string _totpSec; private string _totpSec;
private string _totpCodeFormatted; private string _totpCodeFormatted;
private TotpHelper _totpTickHelper; private readonly TotpHelper _totpTickHelper;
public GroupingsPageTOTPListItem(CipherView cipherView, bool websiteIconsEnabled) public GroupingsPageTOTPListItem(CipherView cipherView, bool websiteIconsEnabled)
:base(cipherView, websiteIconsEnabled)
{ {
_totpService = ServiceContainer.Resolve<ITotpService>("totpService"); _clipboardService = ServiceContainer.Resolve<IClipboardService>();
_platformUtilsService = ServiceContainer.Resolve<IPlatformUtilsService>("platformUtilsService");
_clipboardService = ServiceContainer.Resolve<IClipboardService>("clipboardService");
Cipher = cipherView;
WebsiteIconsEnabled = websiteIconsEnabled;
CopyCommand = CreateDefaultAsyncRelayCommand(CopyToClipboardAsync, CopyCommand = CreateDefaultAsyncRelayCommand(CopyToClipboardAsync,
onException: ex => _logger.Value.Exception(ex), onException: _logger.Value.Exception,
allowsMultipleExecutions: false); allowsMultipleExecutions: false);
_totpTickHelper = new TotpHelper(cipherView); _totpTickHelper = new TotpHelper(cipherView);
} }
public AsyncRelayCommand CopyCommand { get; set; } public AsyncRelayCommand CopyCommand { get; set; }
public CipherView Cipher
{
get => _cipher;
set => SetProperty(ref _cipher, value);
}
public string TotpCodeFormatted public string TotpCodeFormatted
{ {
get => _totpCodeFormatted; get => _totpCodeFormatted;
@@ -72,31 +50,6 @@ namespace Bit.App.Pages
get => _progress; get => _progress;
set => SetProperty(ref _progress, value); set => SetProperty(ref _progress, value);
} }
public bool WebsiteIconsEnabled
{
get => _websiteIconsEnabled;
set => SetProperty(ref _websiteIconsEnabled, value);
}
public bool ShowIconImage
{
get => WebsiteIconsEnabled
&& !string.IsNullOrWhiteSpace(Cipher.Login?.Uri)
&& IconImageSource != null;
}
public string IconImageSource
{
get
{
if (_iconImageSource == string.Empty) // default value since icon source can return null
{
_iconImageSource = IconImageHelper.GetLoginIconImage(Cipher);
}
return _iconImageSource;
}
}
public string TotpCodeFormattedStart => TotpCodeFormatted?.Split(' ')[0]; public string TotpCodeFormattedStart => TotpCodeFormatted?.Split(' ')[0];
@@ -105,7 +58,7 @@ namespace Bit.App.Pages
public async Task CopyToClipboardAsync() public async Task CopyToClipboardAsync()
{ {
await _clipboardService.CopyTextAsync(TotpCodeFormatted?.Replace(" ", string.Empty)); await _clipboardService.CopyTextAsync(TotpCodeFormatted?.Replace(" ", string.Empty));
_platformUtilsService.ShowToast("info", null, string.Format(AppResources.ValueHasBeenCopied, AppResources.VerificationCodeTotp)); _platformUtilsService.Value.ShowToast("info", null, string.Format(AppResources.ValueHasBeenCopied, AppResources.VerificationCodeTotp));
} }
public async Task TotpTickAsync() public async Task TotpTickAsync()

View File

@@ -25,7 +25,6 @@ namespace Bit.App.Pages
private bool _websiteIconsEnabled; private bool _websiteIconsEnabled;
private bool _syncRefreshing; private bool _syncRefreshing;
private bool _showTotpFilter; private bool _showTotpFilter;
private bool _totpFilterEnable;
private string _noDataText; private string _noDataText;
private List<CipherView> _allCiphers; private List<CipherView> _allCiphers;
private Dictionary<string, int> _folderCounts = new Dictionary<string, int>(); private Dictionary<string, int> _folderCounts = new Dictionary<string, int>();
@@ -150,11 +149,6 @@ namespace Bit.App.Pages
get => _showList; get => _showList;
set => SetProperty(ref _showList, value); set => SetProperty(ref _showList, value);
} }
public bool WebsiteIconsEnabled
{
get => _websiteIconsEnabled;
set => SetProperty(ref _websiteIconsEnabled, value);
}
public bool ShowTotp public bool ShowTotp
{ {
get => _showTotpFilter; get => _showTotpFilter;
@@ -206,7 +200,7 @@ namespace Bit.App.Pages
var groupedItems = new List<GroupingsPageListGroup>(); var groupedItems = new List<GroupingsPageListGroup>();
var page = Page as GroupingsPage; var page = Page as GroupingsPage;
WebsiteIconsEnabled = !(await _stateService.GetDisableFaviconAsync()).GetValueOrDefault(); _websiteIconsEnabled = await _stateService.GetDisableFaviconAsync() != true;
try try
{ {
await LoadDataAsync(); await LoadDataAsync();
@@ -225,7 +219,7 @@ namespace Bit.App.Pages
var hasFavorites = FavoriteCiphers?.Any() ?? false; var hasFavorites = FavoriteCiphers?.Any() ?? false;
if (hasFavorites) if (hasFavorites)
{ {
var favListItems = FavoriteCiphers.Select(c => new GroupingsPageListItem { Cipher = c }).ToList(); var favListItems = FavoriteCiphers.Select(c => new CipherItemViewModel(c, _websiteIconsEnabled)).ToList();
groupedItems.Add(new GroupingsPageListGroup(favListItems, AppResources.Favorites, groupedItems.Add(new GroupingsPageListGroup(favListItems, AppResources.Favorites,
favListItems.Count, uppercaseGroupNames, true)); favListItems.Count, uppercaseGroupNames, true));
} }
@@ -282,7 +276,7 @@ namespace Bit.App.Pages
if (ShowNoFolderCipherGroup) if (ShowNoFolderCipherGroup)
{ {
var noFolderCiphersListItems = NoFolderCiphers.Select( var noFolderCiphersListItems = NoFolderCiphers.Select(
c => new GroupingsPageListItem { Cipher = c }).ToList(); c => new CipherItemViewModel(c, _websiteIconsEnabled)).ToList();
groupedItems.Add(new GroupingsPageListGroup(noFolderCiphersListItems, AppResources.FolderNone, groupedItems.Add(new GroupingsPageListGroup(noFolderCiphersListItems, AppResources.FolderNone,
noFolderCiphersListItems.Count, uppercaseGroupNames, false)); noFolderCiphersListItems.Count, uppercaseGroupNames, false));
} }
@@ -399,7 +393,7 @@ namespace Bit.App.Pages
_totpTickCts?.Cancel(); _totpTickCts?.Cancel();
if (ShowTotp) if (ShowTotp)
{ {
var ciphersListItems = TOTPCiphers.Select(c => new GroupingsPageTOTPListItem(c, true)).ToList(); var ciphersListItems = TOTPCiphers.Select(c => new GroupingsPageTOTPListItem(c, _websiteIconsEnabled)).ToList();
groupedItems.Add(new GroupingsPageListGroup(ciphersListItems, AppResources.Items, groupedItems.Add(new GroupingsPageListGroup(ciphersListItems, AppResources.Items,
ciphersListItems.Count, uppercaseGroupNames, !MainPage && !groupedItems.Any())); ciphersListItems.Count, uppercaseGroupNames, !MainPage && !groupedItems.Any()));
@@ -408,7 +402,7 @@ namespace Bit.App.Pages
else else
{ {
var ciphersListItems = Ciphers.Where(c => c.IsDeleted == Deleted) var ciphersListItems = Ciphers.Where(c => c.IsDeleted == Deleted)
.Select(c => new GroupingsPageListItem { Cipher = c }).ToList(); .Select(c => new CipherItemViewModel(c, _websiteIconsEnabled)).ToList();
groupedItems.Add(new GroupingsPageListGroup(ciphersListItems, AppResources.Items, groupedItems.Add(new GroupingsPageListGroup(ciphersListItems, AppResources.Items,
ciphersListItems.Count, uppercaseGroupNames, !MainPage && !groupedItems.Any())); ciphersListItems.Count, uppercaseGroupNames, !MainPage && !groupedItems.Any()));
} }

View File

@@ -1,13 +1,7 @@
using System; using Bit.Core.Abstractions;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Bit.Core.Resources.Localization;
using Bit.Core.Abstractions;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Resources.Localization;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Pages namespace Bit.App.Pages
{ {
@@ -42,7 +36,7 @@ namespace Bit.App.Pages
if (ciphers?.Any() ?? false) if (ciphers?.Any() ?? false)
{ {
groupedItems.Add( groupedItems.Add(
new GroupingsPageListGroup(ciphers.Select(c => new GroupingsPageListItem { Cipher = c }).ToList(), new GroupingsPageListGroup(ciphers.Select(c => new CipherItemViewModel(c, WebsiteIconsEnabled)).ToList(),
AppResources.MatchingItems, AppResources.MatchingItems,
ciphers.Count, ciphers.Count,
false, false,
@@ -54,7 +48,7 @@ namespace Bit.App.Pages
protected override async Task SelectCipherAsync(IGroupingsPageListItem item) protected override async Task SelectCipherAsync(IGroupingsPageListItem item)
{ {
if (!(item is GroupingsPageListItem listItem) || listItem.Cipher is null) if (!(item is CipherItemViewModel listItem) || listItem.Cipher is null)
{ {
return; return;
} }

View File

@@ -2863,12 +2863,12 @@
<value>تم تسجيل الخروج من الحساب.</value> <value>تم تسجيل الخروج من الحساب.</value>
</data> </data>
<data name="YourOrganizationPermissionsWereUpdatedRequeringYouToSetAMasterPassword" xml:space="preserve"> <data name="YourOrganizationPermissionsWereUpdatedRequeringYouToSetAMasterPassword" xml:space="preserve">
<value>Your organization permissions were updated, requiring you to set a master password.</value> <value>تم تحديث أذونات مؤسستك ، مما يتطلب عليك تعيين كلمة مرور رئيسية.</value>
</data> </data>
<data name="YourOrganizationRequiresYouToSetAMasterPassword" xml:space="preserve"> <data name="YourOrganizationRequiresYouToSetAMasterPassword" xml:space="preserve">
<value>Your organization requires you to set a master password.</value> <value>تتطلب مؤسستك تعيين كلمة مرور رئيسية.</value>
</data> </data>
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve"> <data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
<value>Set up an unlock option to change your vault timeout action.</value> <value>أعدنّ ميزة إلغاء القُفْل لتغيير إجراء مهلة المخزن الخاص بك.</value>
</data> </data>
</root> </root>

View File

@@ -209,7 +209,7 @@
<value>GitHub repository-də problemi bildirin.</value> <value>GitHub repository-də problemi bildirin.</value>
</data> </data>
<data name="FingerprintDirection" xml:space="preserve"> <data name="FingerprintDirection" xml:space="preserve">
<value>Təsdiqləmək üçün barmaq izinizi istifadə edin.</value> <value>Doğrulamaq üçün barmaq izinizi istifadə edin.</value>
</data> </data>
<data name="Folder" xml:space="preserve"> <data name="Folder" xml:space="preserve">
<value>Qovluq</value> <value>Qovluq</value>
@@ -236,14 +236,14 @@
<comment>The button text that allows user to launch the website to their web browser.</comment> <comment>The button text that allows user to launch the website to their web browser.</comment>
</data> </data>
<data name="HelpAndFeedback" xml:space="preserve"> <data name="HelpAndFeedback" xml:space="preserve">
<value>Kömək və əks əlaqə</value> <value>Kömək və əks-əlaqə</value>
</data> </data>
<data name="Hide" xml:space="preserve"> <data name="Hide" xml:space="preserve">
<value>Gizlət</value> <value>Gizlət</value>
<comment>Hide a secret value that is currently shown (password).</comment> <comment>Hide a secret value that is currently shown (password).</comment>
</data> </data>
<data name="InternetConnectionRequiredMessage" xml:space="preserve"> <data name="InternetConnectionRequiredMessage" xml:space="preserve">
<value>Davam etməzdən əvvəl zəhmət olmasa internetə bağlanın.</value> <value>Davam etməzdən əvvəl lütfən internetə bağlanın.</value>
<comment>Description message for the alert when internet connection is required to continue.</comment> <comment>Description message for the alert when internet connection is required to continue.</comment>
</data> </data>
<data name="InternetConnectionRequiredTitle" xml:space="preserve"> <data name="InternetConnectionRequiredTitle" xml:space="preserve">
@@ -300,7 +300,7 @@
<comment>The title for the vault page.</comment> <comment>The title for the vault page.</comment>
</data> </data>
<data name="Authenticator" xml:space="preserve"> <data name="Authenticator" xml:space="preserve">
<value>Kimlik təsdiqləyici</value> <value>Kimlik doğrulayıcı</value>
<comment>Authenticator TOTP feature</comment> <comment>Authenticator TOTP feature</comment>
</data> </data>
<data name="Name" xml:space="preserve"> <data name="Name" xml:space="preserve">
@@ -334,7 +334,7 @@
<comment>Message shown when interacting with the server</comment> <comment>Message shown when interacting with the server</comment>
</data> </data>
<data name="Settings" xml:space="preserve"> <data name="Settings" xml:space="preserve">
<value>Tənzimləmələr</value> <value>Ayarlar</value>
<comment>The title for the settings page.</comment> <comment>The title for the settings page.</comment>
</data> </data>
<data name="Show" xml:space="preserve"> <data name="Show" xml:space="preserve">
@@ -379,13 +379,13 @@
<comment>Confirmation message after successfully copying a value to the clipboard.</comment> <comment>Confirmation message after successfully copying a value to the clipboard.</comment>
</data> </data>
<data name="VerifyFingerprint" xml:space="preserve"> <data name="VerifyFingerprint" xml:space="preserve">
<value>Barmaq izini təsdiqlə</value> <value>Barmaq izini doğrula</value>
</data> </data>
<data name="VerifyMasterPassword" xml:space="preserve"> <data name="VerifyMasterPassword" xml:space="preserve">
<value>Ana parolu təsdiqlə</value> <value>Ana parolu doğrula</value>
</data> </data>
<data name="VerifyPIN" xml:space="preserve"> <data name="VerifyPIN" xml:space="preserve">
<value>PIN-i təsdiqlə</value> <value>PIN-i doğrula</value>
</data> </data>
<data name="Version" xml:space="preserve"> <data name="Version" xml:space="preserve">
<value>Versiya</value> <value>Versiya</value>
@@ -413,7 +413,7 @@
<value>Element əlavə et</value> <value>Element əlavə et</value>
</data> </data>
<data name="AppExtension" xml:space="preserve"> <data name="AppExtension" xml:space="preserve">
<value>Tətbiq genişləndirməsi</value> <value>Tətbiq uzantısı</value>
</data> </data>
<data name="AutofillAccessibilityDescription" xml:space="preserve"> <data name="AutofillAccessibilityDescription" xml:space="preserve">
<value>Tətbiq və veb saytda giriş məlumatlarının avto-doldurulması üçün Bitwarden əlçatımlılıq xidmətini istifadə edin.</value> <value>Tətbiq və veb saytda giriş məlumatlarının avto-doldurulması üçün Bitwarden əlçatımlılıq xidmətini istifadə edin.</value>
@@ -425,10 +425,10 @@
<value>Anlaşılmaz simvollardan çəkinin</value> <value>Anlaşılmaz simvollardan çəkinin</value>
</data> </data>
<data name="BitwardenAppExtension" xml:space="preserve"> <data name="BitwardenAppExtension" xml:space="preserve">
<value>Bitwarden tətbiq genişləndirməsi</value> <value>Bitwarden tətbiq uzantısı</value>
</data> </data>
<data name="BitwardenAppExtensionAlert2" xml:space="preserve"> <data name="BitwardenAppExtensionAlert2" xml:space="preserve">
<value>Anbarınıza yeni hesab əlavə etməyin ən asan yolu, Bitwarden tətbiq genişləndirməsidir. Bu genişləndirmə haqqında daha ətraflı məlumat üçün "Tənzimləmələr" ekranına gedin.</value> <value>Anbarınıza yeni hesab əlavə etməyin ən asan yolu, Bitwarden tətbiq uzantısıdır. Bu uzantı haqqında daha ətraflı məlumat üçün "Ayarlar" ekranına gedin.</value>
</data> </data>
<data name="BitwardenAppExtensionDescription" xml:space="preserve"> <data name="BitwardenAppExtensionDescription" xml:space="preserve">
<value>Giriş məlumatlarının avto-doldurulması üçün Safari-də və digər tətbiqlərdə Bitwarden-i istifadə edin.</value> <value>Giriş məlumatlarının avto-doldurulması üçün Safari-də və digər tətbiqlərdə Bitwarden-i istifadə edin.</value>
@@ -471,13 +471,13 @@
<value>Ana parol məsləhətini alacağınız hesabınızın e-poçt ünvanını daxil edin.</value> <value>Ana parol məsləhətini alacağınız hesabınızın e-poçt ünvanını daxil edin.</value>
</data> </data>
<data name="ExntesionReenable" xml:space="preserve"> <data name="ExntesionReenable" xml:space="preserve">
<value>Tətbiq genişləndirməsini təkrar fəallaşdır</value> <value>Tətbiq uzantısını təkrar aktivləşdir</value>
</data> </data>
<data name="ExtensionAlmostDone" xml:space="preserve"> <data name="ExtensionAlmostDone" xml:space="preserve">
<value>Demək olar ki, hazırdır!</value> <value>Demək olar ki, hazırdır!</value>
</data> </data>
<data name="ExtensionEnable" xml:space="preserve"> <data name="ExtensionEnable" xml:space="preserve">
<value>Tətbiq genişləndirməsini fəallaşdır</value> <value>Tətbiq uzantısını aktivləşdir</value>
</data> </data>
<data name="ExtensionInSafari" xml:space="preserve"> <data name="ExtensionInSafari" xml:space="preserve">
<value>Safari-də paylaş nişanını istifadə edərək Bitwarden-i tapın (məsləhət: Menyunun ən alt sətrinin sağ hissəsinə baxın).</value> <value>Safari-də paylaş nişanını istifadə edərək Bitwarden-i tapın (məsləhət: Menyunun ən alt sətrinin sağ hissəsinə baxın).</value>
@@ -496,7 +496,7 @@
<value>Safari və Chrome-da paylaş nişanını istifadə edərək Bitwarden-i tapın (məsləhət: Paylaş menyusunun ən alt sətrinin sağ hissəsinə baxın).</value> <value>Safari və Chrome-da paylaş nişanını istifadə edərək Bitwarden-i tapın (məsləhət: Paylaş menyusunun ən alt sətrinin sağ hissəsinə baxın).</value>
</data> </data>
<data name="ExtensionTapIcon" xml:space="preserve"> <data name="ExtensionTapIcon" xml:space="preserve">
<value>Genişləndirməni başlatmaq üçün menyudakı Bitwarden nişanına toxunun.</value> <value>Uzantını başlatmaq üçün menyudakı Bitwarden nişanına toxunun.</value>
</data> </data>
<data name="ExtensionTurnOn" xml:space="preserve"> <data name="ExtensionTurnOn" xml:space="preserve">
<value>Safari və digər tətbiqlərdə Bitwarden-i işə salmaq üçün menyunun ən alt sətrindəki "daha çox" nişanına toxunun.</value> <value>Safari və digər tətbiqlərdə Bitwarden-i işə salmaq üçün menyunun ən alt sətrindəki "daha çox" nişanına toxunun.</value>
@@ -514,13 +514,13 @@
<value>Ana parolunuz üçün məsləhət alın</value> <value>Ana parolunuz üçün məsləhət alın</value>
</data> </data>
<data name="ImportItems" xml:space="preserve"> <data name="ImportItems" xml:space="preserve">
<value>Elementləri idxal et</value> <value>Elementləri daxilə köçür</value>
</data> </data>
<data name="ImportItemsConfirmation" xml:space="preserve"> <data name="ImportItemsConfirmation" xml:space="preserve">
<value>bitwarden.com veb anbarından elementləri toplu formada idxal edə bilərsiniz. Veb saytı indi ziyarət etmək istəyirsiniz?</value> <value>bitwarden.com veb anbarından elementləri toplu formada daxilə köçürə bilərsiniz. Veb saytı indi ziyarət etmək istəyirsiniz?</value>
</data> </data>
<data name="ImportItemsDescription" xml:space="preserve"> <data name="ImportItemsDescription" xml:space="preserve">
<value>Digər parol idarəetmə tətbiqlərindəki elementləri cəld və toplu formada idxal edin.</value> <value>Digər parol idarəetmə tətbiqlərindəki elementləri cəld və toplu formada daxilə köçürün.</value>
</data> </data>
<data name="LastSync" xml:space="preserve"> <data name="LastSync" xml:space="preserve">
<value>Son eyniləşdirmə:</value> <value>Son eyniləşdirmə:</value>
@@ -553,7 +553,7 @@
<value>Anbara müraciət vaxtının bitmə əməliyyatı</value> <value>Anbara müraciət vaxtının bitmə əməliyyatı</value>
</data> </data>
<data name="VaultTimeoutLogOutConfirmation" xml:space="preserve"> <data name="VaultTimeoutLogOutConfirmation" xml:space="preserve">
<value>Çıxış edəndə, anbarınıza bütün müraciətiniz dayanacaq və vaxt bitməsindən sonra onlayn kimlik təsdiqləməsi tələb olunacaq. Bu tənzimləməni istifadə etmək istədiyinizə əminsiniz?</value> <value>Çıxış edəndə, anbarınıza bütün müraciətiniz dayanacaq və vaxt bitməsindən sonra onlayn kimlik doğrulaması tələb olunacaq. Bu ayarı istifadə etmək istədiyinizə əminsiniz?</value>
</data> </data>
<data name="LoggingIn" xml:space="preserve"> <data name="LoggingIn" xml:space="preserve">
<value>Giriş edilir...</value> <value>Giriş edilir...</value>
@@ -589,10 +589,10 @@
<comment>Minimum special characters for password generator settings</comment> <comment>Minimum special characters for password generator settings</comment>
</data> </data>
<data name="MoreSettings" xml:space="preserve"> <data name="MoreSettings" xml:space="preserve">
<value>Daha çox tənzimləmə</value> <value>Daha çox ayar</value>
</data> </data>
<data name="MustLogInMainApp" xml:space="preserve"> <data name="MustLogInMainApp" xml:space="preserve">
<value>Genişləndirməni istifadə edə bilmək üçün Bitwarden tətbiqində giriş etməlisiniz.</value> <value>Uzantını istifadə edə bilmək üçün Bitwarden tətbiqində giriş etməlisiniz.</value>
</data> </data>
<data name="Never" xml:space="preserve"> <data name="Never" xml:space="preserve">
<value>Heç vaxt</value> <value>Heç vaxt</value>
@@ -617,7 +617,7 @@
<comment>Confirmation, like "Ok, I understand it"</comment> <comment>Confirmation, like "Ok, I understand it"</comment>
</data> </data>
<data name="OptionDefaults" xml:space="preserve"> <data name="OptionDefaults" xml:space="preserve">
<value>İlkin tənzimləmələr, əsas Bitwarden tətbiqinin parol yaratma alətindən tənzimlənir.</value> <value>İlkin seçim dəyərləri, əsas Bitwarden tətbiqinin parol yaratma alətindən ayarlanır.</value>
</data> </data>
<data name="Options" xml:space="preserve"> <data name="Options" xml:space="preserve">
<value>Seçimlər</value> <value>Seçimlər</value>
@@ -708,11 +708,11 @@
<value>PIN kod ilə kilidi açın</value> <value>PIN kod ilə kilidi açın</value>
</data> </data>
<data name="Validating" xml:space="preserve"> <data name="Validating" xml:space="preserve">
<value>Təsdiqlənir</value> <value>Doğrulanır</value>
<comment>Message shown when interacting with the server</comment> <comment>Message shown when interacting with the server</comment>
</data> </data>
<data name="VerificationCode" xml:space="preserve"> <data name="VerificationCode" xml:space="preserve">
<value>Təsdiqləmə kodu</value> <value>Doğrulama kodu</value>
</data> </data>
<data name="ViewItem" xml:space="preserve"> <data name="ViewItem" xml:space="preserve">
<value>Elementə bax</value> <value>Elementə bax</value>
@@ -721,14 +721,14 @@
<value>Bitwarden veb anbarı</value> <value>Bitwarden veb anbarı</value>
</data> </data>
<data name="Lost2FAApp" xml:space="preserve"> <data name="Lost2FAApp" xml:space="preserve">
<value>Kimlik təsdiqləyici tətbiqini itirmisiniz?</value> <value>Kimlik doğrulayıcı tətbiqini itirmisiniz?</value>
</data> </data>
<data name="Items" xml:space="preserve"> <data name="Items" xml:space="preserve">
<value>Elementlər</value> <value>Elementlər</value>
<comment>Screen title</comment> <comment>Screen title</comment>
</data> </data>
<data name="ExtensionActivated" xml:space="preserve"> <data name="ExtensionActivated" xml:space="preserve">
<value>Genişləndirmə aktivləşdirildi!</value> <value>Uzantı aktivləşdirildi!</value>
</data> </data>
<data name="Icons" xml:space="preserve"> <data name="Icons" xml:space="preserve">
<value>Nişanlar</value> <value>Nişanlar</value>
@@ -751,13 +751,13 @@
<value>Anbarınızdakı bir elementi avto-doldurmaq üçün bu bildirişə toxunun.</value> <value>Anbarınızdakı bir elementi avto-doldurmaq üçün bu bildirişə toxunun.</value>
</data> </data>
<data name="BitwardenAutofillServiceOpenAccessibilitySettings" xml:space="preserve"> <data name="BitwardenAutofillServiceOpenAccessibilitySettings" xml:space="preserve">
<value>Əlçatımlılıq tənzimləmələriniın</value> <value>Əlçatımlılıq Ayarlarını aç</value>
</data> </data>
<data name="BitwardenAutofillServiceStep1" xml:space="preserve"> <data name="BitwardenAutofillServiceStep1" xml:space="preserve">
<value>1. Android əlçatımlılıq xidmətləri ekranında Xidmətlər başlığı altındakı "Bitwarden"ə toxunun.</value> <value>1. Android əlçatımlılıq xidmətləri ekranında Xidmətlər başlığı altındakı "Bitwarden"ə toxunun.</value>
</data> </data>
<data name="BitwardenAutofillServiceStep2" xml:space="preserve"> <data name="BitwardenAutofillServiceStep2" xml:space="preserve">
<value>2. Tənzimləməniın və Olduya basaraq qəbul edin.</value> <value>2. Ayarıın və Olduya basaraq qəbul edin.</value>
</data> </data>
<data name="Disabled" xml:space="preserve"> <data name="Disabled" xml:space="preserve">
<value>Sıradan çıxarıldı</value> <value>Sıradan çıxarıldı</value>
@@ -775,7 +775,7 @@
<value>Vəziyyət</value> <value>Vəziyyət</value>
</data> </data>
<data name="BitwardenAutofillServiceAlert2" xml:space="preserve"> <data name="BitwardenAutofillServiceAlert2" xml:space="preserve">
<value>Anbarınıza yeni hesab əlavə etməyin ən asan yolu, Bitwarden avto-doldurma xidmətidir. Bu xidmət haqqında daha ətraflı məlumat üçün "Tənzimləmələr" ekranına gedin.</value> <value>Anbarınıza yeni hesab əlavə etməyin ən asan yolu, Bitwarden avto-doldurma xidmətidir. Bu xidmət haqqında daha ətraflı məlumat üçün "Ayarlar" ekranına gedin.</value>
</data> </data>
<data name="Autofill" xml:space="preserve"> <data name="Autofill" xml:space="preserve">
<value>Avto-doldurma</value> <value>Avto-doldurma</value>
@@ -806,15 +806,15 @@
<comment>Message shown when trying to launch an app that does not exist on the user's device.</comment> <comment>Message shown when trying to launch an app that does not exist on the user's device.</comment>
</data> </data>
<data name="AuthenticatorAppTitle" xml:space="preserve"> <data name="AuthenticatorAppTitle" xml:space="preserve">
<value>Kimlik təsdiqləyici tətbiqi</value> <value>Kimlik doğrulayıcı tətbiqi</value>
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="EnterVerificationCodeApp" xml:space="preserve"> <data name="EnterVerificationCodeApp" xml:space="preserve">
<value>Kimlik təsdiqləyici tətbiqindən 6 rəqəmli təsdiqləmə kodunu daxil edin.</value> <value>Kimlik doğrulayıcı tətbiqindən 6 rəqəmli doğrulama kodunu daxil edin.</value>
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="EnterVerificationCodeEmail" xml:space="preserve"> <data name="EnterVerificationCodeEmail" xml:space="preserve">
<value>{0} ünvanına göndərilən e-poçtdakı 6 rəqəmli təsdiqləmə kodunu daxil edin.</value> <value>{0} ünvanına göndərilən e-poçtdakı 6 rəqəmli doğrulama kodunu daxil edin.</value>
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="LoginUnavailable" xml:space="preserve"> <data name="LoginUnavailable" xml:space="preserve">
@@ -822,7 +822,7 @@
<comment>For 2FA whenever there are no available providers on this device.</comment> <comment>For 2FA whenever there are no available providers on this device.</comment>
</data> </data>
<data name="NoTwoStepAvailable" xml:space="preserve"> <data name="NoTwoStepAvailable" xml:space="preserve">
<value>Bu hesabda ikir mərhələli giriş fəaldır, ancaq konfiqurasiya edilmiş iki mərhələli təchizatçıların heç biri bu cihazda dəstəklənmir. Zəhmət olmasa dəstəklənən cihaz istifadə edin və/və ya fərqli cihazda dəstəklənən yeni provayderlər əlavə edin (məs. kimlik təsdiqləyici tətbiqi).</value> <value>Bu hesabda iki addımlı giriş qurulub, ancaq konfiqurasiya edilmiş iki addımlı provayderlərin heç biri bu cihazda dəstəklənmir. Lütfən dəstəklənən cihaz istifadə edin və/və ya fərqli cihazda dəstəklənən yeni provayderlər əlavə edin (məs. kimlik doğrulayıcı tətbiq).</value>
</data> </data>
<data name="RecoveryCodeTitle" xml:space="preserve"> <data name="RecoveryCodeTitle" xml:space="preserve">
<value>Bərpa kodu</value> <value>Bərpa kodu</value>
@@ -833,7 +833,7 @@
<comment>Remember my two-step login</comment> <comment>Remember my two-step login</comment>
</data> </data>
<data name="SendVerificationCodeAgain" xml:space="preserve"> <data name="SendVerificationCodeAgain" xml:space="preserve">
<value>Təsdiqləmə kodu olan e-poçtu yenidən göndər</value> <value>Doğrulama kodu olan e-poçtu yenidən göndər</value>
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="TwoStepLoginOptions" xml:space="preserve"> <data name="TwoStepLoginOptions" xml:space="preserve">
@@ -843,11 +843,11 @@
<value>Başqa bir iki mərhələli giriş metodu istifadə edin</value> <value>Başqa bir iki mərhələli giriş metodu istifadə edin</value>
</data> </data>
<data name="VerificationEmailNotSent" xml:space="preserve"> <data name="VerificationEmailNotSent" xml:space="preserve">
<value>Təsdiqləmə e-poçtu göndərilə bilmədi. Yenidən sınayın.</value> <value>Doğrulama e-poçtu göndərilə bilmədi. Yenidən sınayın.</value>
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="VerificationEmailSent" xml:space="preserve"> <data name="VerificationEmailSent" xml:space="preserve">
<value>Təsdiqləmə e-poçtu göndərildi.</value> <value>Doğrulama e-poçtu göndərildi</value>
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="YubiKeyInstruction" xml:space="preserve"> <data name="YubiKeyInstruction" xml:space="preserve">
@@ -878,17 +878,17 @@
<comment>The placeholder will show the file size of the attachment. Ex "25 MB"</comment> <comment>The placeholder will show the file size of the attachment. Ex "25 MB"</comment>
</data> </data>
<data name="AuthenticatorKey" xml:space="preserve"> <data name="AuthenticatorKey" xml:space="preserve">
<value>Kimlik təsdiqləyici açarı (TOTP)</value> <value>Kimlik doğrulayıcı açarı (TOTP)</value>
</data> </data>
<data name="VerificationCodeTotp" xml:space="preserve"> <data name="VerificationCodeTotp" xml:space="preserve">
<value>Təsdiqləmə kodu (TOTP)</value> <value>Doğrulama kodu (TOTP)</value>
<comment>Totp code label</comment> <comment>Totp code label</comment>
</data> </data>
<data name="AuthenticatorKeyAdded" xml:space="preserve"> <data name="AuthenticatorKeyAdded" xml:space="preserve">
<value>Kimlik təsdiqləyici açarı əlavə edildi.</value> <value>Kimlik doğrulayıcı açarı əlavə edildi.</value>
</data> </data>
<data name="AuthenticatorKeyReadError" xml:space="preserve"> <data name="AuthenticatorKeyReadError" xml:space="preserve">
<value>Kimlik təsdiqləyici açarı oxuna bilmir.</value> <value>Kimlik doğrulayıcı açarı oxuna bilmir.</value>
</data> </data>
<data name="PointYourCameraAtTheQRCode" xml:space="preserve"> <data name="PointYourCameraAtTheQRCode" xml:space="preserve">
<value>Kameranızı QR koduna yönəldin. <value>Kameranızı QR koduna yönəldin.
@@ -907,7 +907,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>TOTP-ni kopyala</value> <value>TOTP-ni kopyala</value>
</data> </data>
<data name="CopyTotpAutomaticallyDescription" xml:space="preserve"> <data name="CopyTotpAutomaticallyDescription" xml:space="preserve">
<value>Bir girişin, kimlik təsdiqləyici açarı varsa, giriş məlumatları avto-doldurulanda TOTP təsdiqləmə kodunu kopyalayın.</value> <value>Bir giriş prosesinin kimlik doğrulayıcı açarı varsa, giriş məlumatları avto-doldurulanda TOTP doğrulama kodunu kopyalayın.</value>
</data> </data>
<data name="CopyTotpAutomatically" xml:space="preserve"> <data name="CopyTotpAutomatically" xml:space="preserve">
<value>TOTP-ni avtomatik kopyala</value> <value>TOTP-ni avtomatik kopyala</value>
@@ -946,7 +946,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Şifrələmə açarınızı güncəlləyənə qədər bu özəlliyi istifadə edə bilməzsiniz.</value> <value>Şifrələmə açarınızı güncəlləyənə qədər bu özəlliyi istifadə edə bilməzsiniz.</value>
</data> </data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve"> <data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Şifrələmə açarının daşınması tələb olunur. Şifrələmə açarınızı güncəlləmək üçün zəhmət olmasa veb anbar üzərindən giriş edin.</value> <value>Şifrələmə açarının daşınması tələb olunur. Şifrələmə açarınızı güncəlləmək üçün lütfən veb anbar üzərindən giriş edin.</value>
</data> </data>
<data name="LearnMore" xml:space="preserve"> <data name="LearnMore" xml:space="preserve">
<value>Daha ətraflı</value> <value>Daha ətraflı</value>
@@ -1173,26 +1173,26 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Digər tətbiqlərdəki giriş məlumatlarının, kredit kartlarının və kimlik məlumatlarının doldurulması üçün Bitwarden avto-doldurma xidmətini istifadə edin.</value> <value>Digər tətbiqlərdəki giriş məlumatlarının, kredit kartlarının və kimlik məlumatlarının doldurulması üçün Bitwarden avto-doldurma xidmətini istifadə edin.</value>
</data> </data>
<data name="BitwardenAutofillServiceOpenAutofillSettings" xml:space="preserve"> <data name="BitwardenAutofillServiceOpenAutofillSettings" xml:space="preserve">
<value>Avto-doldurma tənzimləmələriniın</value> <value>Avto-doldurma ayarlarını aç</value>
</data> </data>
<data name="FaceID" xml:space="preserve"> <data name="FaceID" xml:space="preserve">
<value>Face ID</value> <value>Face ID</value>
<comment>What Apple calls their facial recognition reader.</comment> <comment>What Apple calls their facial recognition reader.</comment>
</data> </data>
<data name="FaceIDDirection" xml:space="preserve"> <data name="FaceIDDirection" xml:space="preserve">
<value>Təsdiqləmə üçün Face ID istifadə edin.</value> <value>Doğrulamaq üçün Face ID istifadə edin.</value>
</data> </data>
<data name="UseFaceIDToUnlock" xml:space="preserve"> <data name="UseFaceIDToUnlock" xml:space="preserve">
<value>Kilidi açmaq üçün Face ID istifadə edin</value> <value>Kilidi açmaq üçün Face ID istifadə edin</value>
</data> </data>
<data name="VerifyFaceID" xml:space="preserve"> <data name="VerifyFaceID" xml:space="preserve">
<value>Face ID-ni təsdiqlə</value> <value>Face ID-ni doğrula</value>
</data> </data>
<data name="WindowsHello" xml:space="preserve"> <data name="WindowsHello" xml:space="preserve">
<value>Windows Hello</value> <value>Windows Hello</value>
</data> </data>
<data name="BitwardenAutofillGoToSettings" xml:space="preserve"> <data name="BitwardenAutofillGoToSettings" xml:space="preserve">
<value>Android avto-doldurma tənzimləmələri menyusunu avtomatik aça bilmədik. Bu menyunu tapmaq üçün Android Tənzimləmələri &gt; Sistem &gt; Dillər və daxiletmə &gt; Qabaqcıl &gt; "Avto-doldurma xidməti"nə gedin.</value> <value>Android avto-doldurma ayarları menyusunu avtomatik aça bilmədik. Bu menyunu tapmaq üçün Android Ayarları &gt; Sistem &gt; Dillər və giriş &gt; Qabaqcıl &gt; "Avto-doldurma xidməti"nə gedin.</value>
</data> </data>
<data name="CustomFieldName" xml:space="preserve"> <data name="CustomFieldName" xml:space="preserve">
<value>Özəl sahə adı</value> <value>Özəl sahə adı</value>
@@ -1292,7 +1292,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Tətbiqlərdə və veb saytlarda giriş edərkən giriş etmə məlumatlarınıza klaviaturadan asanlıqla müraciət edə bilərsiniz.</value> <value>Tətbiqlərdə və veb saytlarda giriş edərkən giriş etmə məlumatlarınıza klaviaturadan asanlıqla müraciət edə bilərsiniz.</value>
</data> </data>
<data name="AutofillSetup2" xml:space="preserve"> <data name="AutofillSetup2" xml:space="preserve">
<value>Digər Avto-doldurma tətbiqləriniz varssa və onları istifadə etməyi düşünmürsünüzsə, Tənzimləmələrdə sıradan çıxara bilərsiniz.</value> <value>İstifadə etməyi düşünmürsünüzsə, digər Avto-doldurma tətbiqlərini Ayarlarda sıradan çıxartmağı tövsiyə edirik.</value>
</data> </data>
<data name="BitwardenAutofillDescription" xml:space="preserve"> <data name="BitwardenAutofillDescription" xml:space="preserve">
<value>Parollarınızın cəld avto-doldurulması üçün anbarınıza birbaşa klaviaturanızdan müraciət edin.</value> <value>Parollarınızın cəld avto-doldurulması üçün anbarınıza birbaşa klaviaturanızdan müraciət edin.</value>
@@ -1301,7 +1301,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Cihazınızda parolun avto-doldurulması üçün aşağıdakı təlimatları izləyin:</value> <value>Cihazınızda parolun avto-doldurulması üçün aşağıdakı təlimatları izləyin:</value>
</data> </data>
<data name="AutofillTurnOn1" xml:space="preserve"> <data name="AutofillTurnOn1" xml:space="preserve">
<value>1. iOS "Tənzimləmələri"nə gedin</value> <value>1. iOS "Ayarları"na gedin</value>
</data> </data>
<data name="AutofillTurnOn2" xml:space="preserve"> <data name="AutofillTurnOn2" xml:space="preserve">
<value>2. "Parollar və Hesablar"a toxunun.</value> <value>2. "Parollar və Hesablar"a toxunun.</value>
@@ -1319,7 +1319,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Parolun avto-doldurulması</value> <value>Parolun avto-doldurulması</value>
</data> </data>
<data name="BitwardenAutofillAlert2" xml:space="preserve"> <data name="BitwardenAutofillAlert2" xml:space="preserve">
<value>Anbarınıza yeni giriş məlumatlarını əlavə etməyin ən asan yolu, Bitwarden parol avto-doldurma genişləndirməsidir. Bu genişləndirmə haqqında daha ətraflı məlumat almaq üçün "Tənzimləmələr" ekranına gedin.</value> <value>Anbarınıza yeni giriş məlumatlarını əlavə etməyin ən asan yolu, Bitwarden parol avto-doldurma uzantısıdır. Bu uzantı haqqında daha ətraflı məlumat almaq üçün "Ayarlar" ekranına gedin.</value>
</data> </data>
<data name="InvalidEmail" xml:space="preserve"> <data name="InvalidEmail" xml:space="preserve">
<value>Yararsız e-poçt ünvanı.</value> <value>Yararsız e-poçt ünvanı.</value>
@@ -1465,7 +1465,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Bitwarden, bir təşkilat hesabı istifadə edərək anbar elementlərinizi başqaları ilə paylaşmağınıza icazə verər. Daha ətraflı məlumat üçün bitwarden.com saytını ziyarət etmək istəyirsiniz?</value> <value>Bitwarden, bir təşkilat hesabı istifadə edərək anbar elementlərinizi başqaları ilə paylaşmağınıza icazə verər. Daha ətraflı məlumat üçün bitwarden.com saytını ziyarət etmək istəyirsiniz?</value>
</data> </data>
<data name="ExportVault" xml:space="preserve"> <data name="ExportVault" xml:space="preserve">
<value>Anbarı ixrac et</value> <value>Anbarı xaricə köçür</value>
</data> </data>
<data name="LockNow" xml:space="preserve"> <data name="LockNow" xml:space="preserve">
<value>İndi kilidlə</value> <value>İndi kilidlə</value>
@@ -1483,20 +1483,20 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>30 dəqiqə</value> <value>30 dəqiqə</value>
</data> </data>
<data name="SetPINDescription" xml:space="preserve"> <data name="SetPINDescription" xml:space="preserve">
<value>Bitwarden-in kilidini açmaq üçün PIN kod tənzimləyin. Hər tətbiqdən tam çıxış edəndə PIN tənzimləmələriniz sıfırlanacaq.</value> <value>Bitwarden-in kilidini açmaq üçün PIN kodunuzu ayarlayın. Tətbiqdən tam çıxış etdikdə PIN ayarlarınız sıfırlanacaq.</value>
</data> </data>
<data name="LoggedInAsOn" xml:space="preserve"> <data name="LoggedInAsOn" xml:space="preserve">
<value>{1} saytında {0} kimi giriş edildi.</value> <value>{1} saytında {0} kimi giriş edildi.</value>
<comment>ex: Logged in as user@example.com on bitwarden.com.</comment> <comment>ex: Logged in as user@example.com on bitwarden.com.</comment>
</data> </data>
<data name="VaultLockedMasterPassword" xml:space="preserve"> <data name="VaultLockedMasterPassword" xml:space="preserve">
<value>Anbarınız kilidlənib. Davam etmək üçün ana parolunuzu təsdiqləyin.</value> <value>Anbarınız kilidlənib. Davam etmək üçün ana parolunuzu doğrulayın.</value>
</data> </data>
<data name="VaultLockedPIN" xml:space="preserve"> <data name="VaultLockedPIN" xml:space="preserve">
<value>Anbarınız kilidlənib. Davam etmək üçün PIN kodunuzu təsdiqləyin.</value> <value>Anbarınız kilidlənib. Davam etmək üçün PIN kodunuzu doğrulayın.</value>
</data> </data>
<data name="VaultLockedIdentity" xml:space="preserve"> <data name="VaultLockedIdentity" xml:space="preserve">
<value>Anbarınız kilidlənib. Davam etmək üçün kimliyinizi təsdiqləyin.</value> <value>Anbarınız kilidlənib. Davam etmək üçün kimliyinizi doğrulayın.</value>
</data> </data>
<data name="Dark" xml:space="preserve"> <data name="Dark" xml:space="preserve">
<value>Tünd</value> <value>Tünd</value>
@@ -1586,7 +1586,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Tətbiq yenidən başladılanda</value> <value>Tətbiq yenidən başladılanda</value>
</data> </data>
<data name="AutofillServiceNotEnabled" xml:space="preserve"> <data name="AutofillServiceNotEnabled" xml:space="preserve">
<value>Avto-doldurma, veb sayt və tətbiqlərdən Bitwarden anbarınıza güvənli şəkildə müraciət etməyinizi asanlaşdırır. Deyəsən, Bitwarden üçün avto-doldurma xidmətini fəallaşdırmamısınız. "Tənzimləmələr" ekranında Bitwarden üçün avto-doldurma xidmətini fəallaşdırın.</value> <value>Avto-doldurma, veb sayt və tətbiqlərdən Bitwarden anbarınıza güvənli şəkildə müraciət etməyinizi asanlaşdırır. Deyəsən, Bitwarden üçün avto-doldurma xidmətini qurmamısınız. "Ayarlar" ekranında Bitwarden üçün avto-doldurma xidmətini qurun.</value>
</data> </data>
<data name="ThemeAppliedOnRestart" xml:space="preserve"> <data name="ThemeAppliedOnRestart" xml:space="preserve">
<value>Tema dəyişiklikləriniz tətbiq yenidən başladılanda tətbiq ediləcək.</value> <value>Tema dəyişiklikləriniz tətbiq yenidən başladılanda tətbiq ediləcək.</value>
@@ -1611,7 +1611,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Seansın müddəti bitdi.</value> <value>Seansın müddəti bitdi.</value>
</data> </data>
<data name="BiometricsDirection" xml:space="preserve"> <data name="BiometricsDirection" xml:space="preserve">
<value>Biometrik təsdiqləmə</value> <value>Biometrik doğrulama</value>
</data> </data>
<data name="Biometrics" xml:space="preserve"> <data name="Biometrics" xml:space="preserve">
<value>Biometrik</value> <value>Biometrik</value>
@@ -1620,19 +1620,19 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Kilidi biometriklə aç</value> <value>Kilidi biometriklə aç</value>
</data> </data>
<data name="AccessibilityOverlayPermissionAlert" xml:space="preserve"> <data name="AccessibilityOverlayPermissionAlert" xml:space="preserve">
<value>Bitwarden diqqətinizi tələb edir - Bitwarden Tənzimləmələrində "Avto-doldurma əlçatımlılıq xidməti"nə baxın</value> <value>Bitwarden diqqətinizi tələb edir - Bitwarden ayarlarında "Avto-doldurma əlçatımlılıq xidməti"nə baxın</value>
</data> </data>
<data name="BitwardenAutofillServiceOverlayPermission" xml:space="preserve"> <data name="BitwardenAutofillServiceOverlayPermission" xml:space="preserve">
<value>3. Android tətbiq tənzimləmələrində Bitwarden-i tapın və "Digər tətbiqlərin üzərində göstər" seçini açın ("Qabaqcıl" seçimin altında ola bilər).</value> <value>3. Android tətbiq ayarlarında Bitwarden-i tapın və "Digər tətbiqlərin üzərində göstər" seçiminə ("Qabaqcıl" seçimin altında ola bilər) gedin və örtük dəstəyinə icazə vermək üçün açara toxunun.</value>
</data> </data>
<data name="OverlayPermission" xml:space="preserve"> <data name="OverlayPermission" xml:space="preserve">
<value>İcazə</value> <value>İcazə</value>
</data> </data>
<data name="BitwardenAutofillServiceOpenOverlayPermissionSettings" xml:space="preserve"> <data name="BitwardenAutofillServiceOpenOverlayPermissionSettings" xml:space="preserve">
<value>Üzərində göstərmə icazə tənzimləmələriniın</value> <value>Üzərində göstərmə icazə ayarlarınıın</value>
</data> </data>
<data name="BitwardenAutofillServiceStep3" xml:space="preserve"> <data name="BitwardenAutofillServiceStep3" xml:space="preserve">
<value>3. Android tətbiq tənzimləmələrində Bitwarden-i tapın və "Digər tətbiqlərin üzərində göstər" seçini açın ("Qabaqcıl" seçimin altında ola bilər).</value> <value>3. Android tətbiq ayarlarında Bitwarden-i tapın və "Digər tətbiqlərin üzərində göstər" seçin ("Qabaqcıl" seçimin altında ola bilər) və örtüyə icazə vermək üçün açarıın.</value>
</data> </data>
<data name="Denied" xml:space="preserve"> <data name="Denied" xml:space="preserve">
<value>Rədd edildi</value> <value>Rədd edildi</value>
@@ -1644,38 +1644,38 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Fayl formatı</value> <value>Fayl formatı</value>
</data> </data>
<data name="ExportVaultMasterPasswordDescription" xml:space="preserve"> <data name="ExportVaultMasterPasswordDescription" xml:space="preserve">
<value>Anbar verilənlərinizi ixrac etmək üçün ana parolunuzu daxil edin.</value> <value>Anbar datanızı xaricə köçürmək üçün ana parolunuzu daxil edin.</value>
</data> </data>
<data name="SendVerificationCodeToEmail" xml:space="preserve"> <data name="SendVerificationCodeToEmail" xml:space="preserve">
<value>E-poçtunuza bir təsdiqləmə kodu göndərin</value> <value>Doğrulama kodunu e-poçtunuza göndərin</value>
</data> </data>
<data name="CodeSent" xml:space="preserve"> <data name="CodeSent" xml:space="preserve">
<value>Kod göndərildi!</value> <value>Kod göndərildi!</value>
</data> </data>
<data name="ConfirmYourIdentity" xml:space="preserve"> <data name="ConfirmYourIdentity" xml:space="preserve">
<value>Davam etmək üçün kimliyinizi təsdiqləyin.</value> <value>Davam etmək üçün kimliyinizi doğrulayın.</value>
</data> </data>
<data name="ExportVaultWarning" xml:space="preserve"> <data name="ExportVaultWarning" xml:space="preserve">
<value>Bu ixrac faylındakı anbar verilənləriniz şifrələnməmiş formatdadır. İxrac edilən faylı, güvənli olmayan kanallar üzərində saxlamamalı və ya göndərməməlisiniz (e-poçt kimi). Bu faylı işiniz bitdikdən sonra dərhal silin.</value> <value>Xaricə köçürdüyünüz bu fayldakı datanız şifrələnməmiş formatdadır. Bu faylı güvənli olmayan kanallar (e-poçt kimi) üzərində saxlamamalı və ya göndərməməlisiniz. İşiniz bitdikdən sonra faylı dərhal silin.</value>
</data> </data>
<data name="EncExportKeyWarning" xml:space="preserve"> <data name="EncExportKeyWarning" xml:space="preserve">
<value>Bu ixrac faylı, hesabınızın şifrələmə açarını istifadə edərək verilənlərinizi şifrələyir. Hesabınızın şifrələmə açarını döndərsəniz, bu ixrac faylının şifrəsini aça bilməyəcəyiniz üçün yenidən ixrac etməli olacaqsınız.</value> <value>Xaricə köçürdüyünüz bu fayldakı data, hesabınızın şifrələmə açarı istifadə edilərək şifrələnir. Hesabınızın şifrələmə açarınıyişdirsəniz, bu faylın şifrəsini aça bilməyəcəksiniz və onu yenidən xaricə köçürməli olacaqsınız.</value>
</data> </data>
<data name="EncExportAccountWarning" xml:space="preserve"> <data name="EncExportAccountWarning" xml:space="preserve">
<value>Hesab şifrələmə açarları, hər Bitwarden istifadəçi hesabı üçün unikaldır, buna görə də şifrələnmiş bir ixracı, fərqli bir hesaba idxal edə bilməzsiniz.</value> <value>Hesab şifrələmə açarları, hər Bitwarden istifadəçi hesabı üçün unikaldır, buna görə də şifrələnmiş bir xaricə köçürməni, fərqli bir hesaba köçürə bilməzsiniz.</value>
</data> </data>
<data name="ExportVaultConfirmationTitle" xml:space="preserve"> <data name="ExportVaultConfirmationTitle" xml:space="preserve">
<value>Anbarın ixracını təsdiqləyin</value> <value>Anbarın xaricə köçürülməsini təsdiqlə</value>
<comment>Title for the alert to confirm vault exports.</comment> <comment>Title for the alert to confirm vault exports.</comment>
</data> </data>
<data name="Warning" xml:space="preserve"> <data name="Warning" xml:space="preserve">
<value>Xəbərdarlıq</value> <value>Xəbərdarlıq</value>
</data> </data>
<data name="ExportVaultFailure" xml:space="preserve"> <data name="ExportVaultFailure" xml:space="preserve">
<value>Anbarınızın ixracında problem yarandı. Əgər problem davam edərsə, veb anbarından ixrac etməli olacaqsınız.</value> <value>Anbarınızın xaricə köçürülməsi zamanı problem yarandı. Əgər problem davam edərsə, veb anbarından xaricə köçürməli olacaqsınız.</value>
</data> </data>
<data name="ExportVaultSuccess" xml:space="preserve"> <data name="ExportVaultSuccess" xml:space="preserve">
<value>Anbar uğurla ixrac edildi</value> <value>Anbar uğurla xaricə köçürüldü</value>
</data> </data>
<data name="Clone" xml:space="preserve"> <data name="Clone" xml:space="preserve">
<value>Klonla</value> <value>Klonla</value>
@@ -1695,7 +1695,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Qoşma uğurla saxlanıldı</value> <value>Qoşma uğurla saxlanıldı</value>
</data> </data>
<data name="AutofillTileAccessibilityRequired" xml:space="preserve"> <data name="AutofillTileAccessibilityRequired" xml:space="preserve">
<value>Avto-doldurma qutusunu istifadə etmək üçün zəhmət olmasa "Bitwarden" tənzimləmələrində "Avto-doldurma əlçatımlılıq xidməti"ni fəallaşdırın.</value> <value>Avto-doldurma qutusunu istifadə etmək üçün lütfən "Bitwarden" ayarlarında "Avto-doldurma əlçatımlılıq xidməti"ni fəallaşdırın.</value>
</data> </data>
<data name="AutofillTileUriNotFound" xml:space="preserve"> <data name="AutofillTileUriNotFound" xml:space="preserve">
<value>Heç bir parol sahəsi aşkarlanmadı</value> <value>Heç bir parol sahəsi aşkarlanmadı</value>
@@ -1741,10 +1741,10 @@ Skan prosesi avtomatik baş tutacaq.</value>
<comment>Confirmation alert message when soft-deleting a cipher.</comment> <comment>Confirmation alert message when soft-deleting a cipher.</comment>
</data> </data>
<data name="AccountBiometricInvalidated" xml:space="preserve"> <data name="AccountBiometricInvalidated" xml:space="preserve">
<value>Ana parolun təsdiqlənməsi gözlənildiyi üçün bu hesab üzrə biometrik kilid açma sıradan çıxarıldı.</value> <value>Ana parolun doğrulanması gözlənildiyi üçün bu hesab üzrə biometrik kilid açma sıradan çıxarıldı.</value>
</data> </data>
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve"> <data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
<value>Ana parolun təsdiqlənməsi gözlənildiyi üçün bu hesab üzrə avto-doldurma biometrik kilid açma sıradan çıxarıldı.</value> <value>Ana parolun doğrulanması gözlənildiyi üçün bu hesab üzrə avto-doldurma biometrik kilid açma sıradan çıxarıldı.</value>
</data> </data>
<data name="EnableSyncOnRefresh" xml:space="preserve"> <data name="EnableSyncOnRefresh" xml:space="preserve">
<value>Təzələmə əsnasında eyniləşdirməni fəallaşdır</value> <value>Təzələmə əsnasında eyniləşdirməni fəallaşdır</value>
@@ -1756,7 +1756,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Müəssisə üçün tək daxil olma</value> <value>Müəssisə üçün tək daxil olma</value>
</data> </data>
<data name="LogInSsoSummary" xml:space="preserve"> <data name="LogInSsoSummary" xml:space="preserve">
<value>Təşkilatınızın tək daxil olma portalını istifadə edərək daha tez giriş edə bilərsiniz. Başlatmaq üçün zəhmət olmasa təşkilatınızın identifikatorunu daxil edin.</value> <value>Təşkilatınızın tək daxil olma portalını istifadə edərək daha tez giriş edə bilərsiniz. Başlatmaq üçün lütfən təşkilatınızın identifikatorunu daxil edin.</value>
</data> </data>
<data name="OrgIdentifier" xml:space="preserve"> <data name="OrgIdentifier" xml:space="preserve">
<value>Təşkilat identifikatoru</value> <value>Təşkilat identifikatoru</value>
@@ -1765,10 +1765,10 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Hazırda SSO ilə giriş edilə bilmir</value> <value>Hazırda SSO ilə giriş edilə bilmir</value>
</data> </data>
<data name="SetMasterPassword" xml:space="preserve"> <data name="SetMasterPassword" xml:space="preserve">
<value>Ana parolu tənzimlə</value> <value>Ana parolu ayarla</value>
</data> </data>
<data name="SetMasterPasswordSummary" xml:space="preserve"> <data name="SetMasterPasswordSummary" xml:space="preserve">
<value>SSO ilə giriş prosesini tamamlamaq üçün zəhmət olmasa anbarınıza müraciət etmək və onu qorumaq üçün bir ana şifrə tənzimləyin.</value> <value>SSO ilə giriş prosesini tamamlamaq üçün lütfən anbarınıza müraciət etmək və onu qorumaq üçün bir ana parol ayarlayın.</value>
</data> </data>
<data name="MasterPasswordPolicyInEffect" xml:space="preserve"> <data name="MasterPasswordPolicyInEffect" xml:space="preserve">
<value>Bir və ya daha çox təşkilat siyasəti, aşağıdakı tələbləri qarşılamaq üçün ana parolunuzu tələb edir:</value> <value>Bir və ya daha çox təşkilat siyasəti, aşağıdakı tələbləri qarşılamaq üçün ana parolunuzu tələb edir:</value>
@@ -1795,7 +1795,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Yararsız parol</value> <value>Yararsız parol</value>
</data> </data>
<data name="MasterPasswordPolicyValidationMessage" xml:space="preserve"> <data name="MasterPasswordPolicyValidationMessage" xml:space="preserve">
<value>Parol, şirkət tələblərini qarşılamır. Zəhmət olmasa siyasət məlumatlarını yoxlayıb yenidən sınayın.</value> <value>Parol, şirkət tələblərini qarşılamır. Lütfən siyasət məlumatlarını yoxlayıb yenidən sınayın.</value>
</data> </data>
<data name="Loading" xml:space="preserve"> <data name="Loading" xml:space="preserve">
<value>Yüklənir</value> <value>Yüklənir</value>
@@ -1813,7 +1813,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Gizlilik Siyasəti</value> <value>Gizlilik Siyasəti</value>
</data> </data>
<data name="AccessibilityDrawOverPermissionAlert" xml:space="preserve"> <data name="AccessibilityDrawOverPermissionAlert" xml:space="preserve">
<value>Bitwarden diqqətinizi tələb edir - Bitwarden Tənzimləmələrində "Avto-doldurma xidməti"ndə "Üzərindən göstər"i fəallaşdırın</value> <value>Bitwarden diqqətinizi tələb edir - Bitwarden Ayarlarında "Avto-doldurma xidməti"ndə "Üzərindən göstər"i işə salın</value>
</data> </data>
<data name="AutofillServices" xml:space="preserve"> <data name="AutofillServices" xml:space="preserve">
<value>Avto-doldurma xidmətləri</value> <value>Avto-doldurma xidmətləri</value>
@@ -1924,7 +1924,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Bitmə vaxtı</value> <value>Bitmə vaxtı</value>
</data> </data>
<data name="ExpirationDateInfo" xml:space="preserve"> <data name="ExpirationDateInfo" xml:space="preserve">
<value>Əgər tənzimlənsə, göstərilən tarix və vaxtda "Send"ə müraciət başa çatacaq.</value> <value>Əgər ayarlanıbsa, göstərilən tarix və vaxtda "Send"ə müraciət başa çatacaq.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment> <comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data> </data>
<data name="Expired" xml:space="preserve"> <data name="Expired" xml:space="preserve">
@@ -1934,7 +1934,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Maksimal müraciət sayı</value> <value>Maksimal müraciət sayı</value>
</data> </data>
<data name="MaximumAccessCountInfo" xml:space="preserve"> <data name="MaximumAccessCountInfo" xml:space="preserve">
<value>Əgər tənzimlənsə, istifadəçilər maksimal müraciət sayına çatdıqdan sonra bu "Send"ə müraciət edə bilməyəcək.</value> <value>Əgər ayarlanıbsa, istifadəçilər maksimal müraciət sayına çatdıqdan sonra bu "Send"ə müraciət edə bilməyəcək.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment> <comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data> </data>
<data name="MaximumAccessCountReached" xml:space="preserve"> <data name="MaximumAccessCountReached" xml:space="preserve">
@@ -2058,7 +2058,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment> <comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data> </data>
<data name="SendFileEmailVerificationRequired" xml:space="preserve"> <data name="SendFileEmailVerificationRequired" xml:space="preserve">
<value>"Send" ilə faylları istifadə etmək üçün e-poçtunuzu təsdiqləməlisiniz. E-poçtunuzu veb anbarında təsdiqləyə bilərsiniz.</value> <value>Faylları "Send" ilə istifadə etmək üçün e-poçtunuzu doğrulamalısınız. E-poçtunuzu veb anbarında doğrulaya bilərsiniz.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment> <comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data> </data>
<data name="PasswordPrompt" xml:space="preserve"> <data name="PasswordPrompt" xml:space="preserve">
@@ -2068,13 +2068,13 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Ana parol təsdiqi</value> <value>Ana parol təsdiqi</value>
</data> </data>
<data name="PasswordConfirmationDesc" xml:space="preserve"> <data name="PasswordConfirmationDesc" xml:space="preserve">
<value>Bu əməliyyat qorumalıdır, davam etmək üçün zəhmət olmasa kimliyinizi təsdiqləmək üçün ana parolunuzu təkrar daxil edin.</value> <value>Bu əməliyyat qorumalıdır, davam etmək üçün lütfən kimliyinizi doğrulamaq üçün ana parolunuzu təkrar daxil edin.</value>
</data> </data>
<data name="CaptchaRequired" xml:space="preserve"> <data name="CaptchaRequired" xml:space="preserve">
<value>Captcha tələb olunur</value> <value>Captcha tələb olunur</value>
</data> </data>
<data name="CaptchaFailed" xml:space="preserve"> <data name="CaptchaFailed" xml:space="preserve">
<value>Captcha uğursuz oldu. Zəhmət olmasa yenidən sınayın.</value> <value>Captcha uğursuz oldu. Lütfən yenidən sınayın.</value>
</data> </data>
<data name="UpdatedMasterPassword" xml:space="preserve"> <data name="UpdatedMasterPassword" xml:space="preserve">
<value>Güncəllənmiş ana parol</value> <value>Güncəllənmiş ana parol</value>
@@ -2110,19 +2110,19 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>FIDO2 WebAuthn</value> <value>FIDO2 WebAuthn</value>
</data> </data>
<data name="Fido2Instruction" xml:space="preserve"> <data name="Fido2Instruction" xml:space="preserve">
<value>Davam etmək üçün FIDO2 WebAuthn fəal güvənlik açarınızı hazır saxlayın, daha sonra növbəti ekranda "WebAuthn-u təsdiqlə"yə kliklədikdən sonra təlimatları izləyin.</value> <value>Davam etmək üçün FIDO2 WebAuthn üçün fəal olan güvənlik açarınızı hazır saxlayın, daha sonra növbəti ekranda "WebAuthn-u doğrula"ya kliklədikdən sonra təlimatları izləyin.</value>
</data> </data>
<data name="Fido2Desc" xml:space="preserve"> <data name="Fido2Desc" xml:space="preserve">
<value>Kimlik təsdiqləmə, FIDO2 WebAuthn istifadə edir, xarici güvənlik açarı istifadə edərək kimliyi təsdiqləyə bilərsiniz.</value> <value>Kimlik doğrulama, FIDO2 WebAuthn istifadə edir, xarici güvənlik açarı istifadə edərək kimliyi doğrulaya bilərsiniz.</value>
</data> </data>
<data name="Fido2AuthenticateWebAuthn" xml:space="preserve"> <data name="Fido2AuthenticateWebAuthn" xml:space="preserve">
<value>WebAuthn-u təsdiqlə</value> <value>WebAuthn kimlik doğrulama</value>
</data> </data>
<data name="Fido2ReturnToApp" xml:space="preserve"> <data name="Fido2ReturnToApp" xml:space="preserve">
<value>Tətbiqə qayıt</value> <value>Tətbiqə qayıt</value>
</data> </data>
<data name="Fido2CheckBrowser" xml:space="preserve"> <data name="Fido2CheckBrowser" xml:space="preserve">
<value>Zəhmət olmasa ilkin brauzerinizin WebAuthn-u təsdiqlədiyinə əmin olub yenidən sınayın.</value> <value>Lütfən ilkin brauzerinizin WebAuthn-u dəstəklədiyinə əmin olub yenidən sınayın.</value>
</data> </data>
<data name="ResetPasswordAutoEnrollInviteWarning" xml:space="preserve"> <data name="ResetPasswordAutoEnrollInviteWarning" xml:space="preserve">
<value>Bu təşkilat, sizi "parol sıfırlama"da avtomatik olaraq qeydiyyata alan müəssisə siyasətinə sahibdir. Qeydiyyat, təşkilat administratorlarına ana parolunuzu dəyişdirmə icazəsi verəcək.</value> <value>Bu təşkilat, sizi "parol sıfırlama"da avtomatik olaraq qeydiyyata alan müəssisə siyasətinə sahibdir. Qeydiyyat, təşkilat administratorlarına ana parolunuzu dəyişdirmə icazəsi verəcək.</value>
@@ -2131,16 +2131,16 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt {0} saat {1} dəqiqədir</value> <value>Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt {0} saat {1} dəqiqədir</value>
</data> </data>
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve"> <data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
<value>Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt {0} saat {1} dəqiqədir. Anbar vaxt bitişi əməliyyatı {2} olaraq tənzimləndi.</value> <value>Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt {0} saat {1} dəqiqədir. Anbar vaxt bitişi əməliyyatı {2} olaraq ayarlandı.</value>
</data> </data>
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve"> <data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
<value>Təşkilatınızın siyasətləri, anbar vaxt bitişi əməliyyatınızı {0} olaraq tənzimlədi.</value> <value>Təşkilatınızın siyasətləri, anbar vaxt bitişi əməliyyatınızı {0} olaraq ayarladı.</value>
</data> </data>
<data name="VaultTimeoutToLarge" xml:space="preserve"> <data name="VaultTimeoutToLarge" xml:space="preserve">
<value>Anbar vaxt bitişi, təşkilatınız tərəfindən tənzimlənən məhdudiyyətləri aşır.</value> <value>Anbar vaxt bitişi, təşkilatınız tərəfindən ayarlanan məhdudiyyətləri aşır.</value>
</data> </data>
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve"> <data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
<value>Bir və ya daha çox təşkilat siyasəti, fərdi anbarınızı ixrac etməyinizin qarşısını alır.</value> <value>Bir və ya daha çox təşkilat siyasəti, fərdi anbarınızı xaricə köçürməyinizi əngəlləyir.</value>
</data> </data>
<data name="AddAccount" xml:space="preserve"> <data name="AddAccount" xml:space="preserve">
<value>Hesab əlavə et</value> <value>Hesab əlavə et</value>
@@ -2173,7 +2173,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Hesabınız birdəfəlik silinəcək</value> <value>Hesabınız birdəfəlik silinəcək</value>
</data> </data>
<data name="DeleteAccountExplanation" xml:space="preserve"> <data name="DeleteAccountExplanation" xml:space="preserve">
<value>Hesabınız və əlaqəli bütün verilənlər silinəcək və bərpa oluna bilməyəcək. Davam etmək istədiyinizə əminsiniz?</value> <value>Hesabınız və əlaqəli bütün datalar silinəcək və bərpa oluna bilməyəcək. Davam etmək istədiyinizə əminsiniz?</value>
</data> </data>
<data name="DeletingYourAccount" xml:space="preserve"> <data name="DeletingYourAccount" xml:space="preserve">
<value>Hesabınız silinir</value> <value>Hesabınız silinir</value>
@@ -2182,7 +2182,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Hesabınız birdəfəlik silindi</value> <value>Hesabınız birdəfəlik silindi</value>
</data> </data>
<data name="InvalidVerificationCode" xml:space="preserve"> <data name="InvalidVerificationCode" xml:space="preserve">
<value>Yararsız təsdiqləmə kodu.</value> <value>Yararsız doğrulama kodu</value>
</data> </data>
<data name="RequestOTP" xml:space="preserve"> <data name="RequestOTP" xml:space="preserve">
<value>Tək istifadəlik parol tələb et</value> <value>Tək istifadəlik parol tələb et</value>
@@ -2200,19 +2200,19 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Kod göndərilir</value> <value>Kod göndərilir</value>
</data> </data>
<data name="Verifying" xml:space="preserve"> <data name="Verifying" xml:space="preserve">
<value>Təsdiqlənir</value> <value>Doğrulanır</value>
</data> </data>
<data name="ResendCode" xml:space="preserve"> <data name="ResendCode" xml:space="preserve">
<value>Kodu təkrar göndər</value> <value>Kodu təkrar göndər</value>
</data> </data>
<data name="AVerificationCodeWasSentToYourEmail" xml:space="preserve"> <data name="AVerificationCodeWasSentToYourEmail" xml:space="preserve">
<value>Təsdiqləmə kodu e-poçtunuza göndərildi</value> <value>Doğrulama kodu e-poçtunuza göndərildi</value>
</data> </data>
<data name="AnErrorOccurredWhileSendingAVerificationCodeToYourEmailPleaseTryAgain" xml:space="preserve"> <data name="AnErrorOccurredWhileSendingAVerificationCodeToYourEmailPleaseTryAgain" xml:space="preserve">
<value>E-poçtunuza təsdiqləmə kodu göndərilərkən bir xəta baş verdi. Zəhmət olmasa yenidən sınayın</value> <value>E-poçtunuza doğrulama kodu göndərilərkən bir xəta baş verdi. Lütfən yenidən sınayın</value>
</data> </data>
<data name="EnterTheVerificationCodeThatWasSentToYourEmail" xml:space="preserve"> <data name="EnterTheVerificationCodeThatWasSentToYourEmail" xml:space="preserve">
<value>E-poçtunuza göndərilmiş təsdiqləmə kodunu daxil edin</value> <value>E-poçtunuza göndərilmiş doğrulama kodunu daxil edin</value>
</data> </data>
<data name="SubmitCrashLogs" xml:space="preserve"> <data name="SubmitCrashLogs" xml:space="preserve">
<value>Çökmə jurnallarını göndər</value> <value>Çökmə jurnallarını göndər</value>
@@ -2266,13 +2266,13 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>TOTP</value> <value>TOTP</value>
</data> </data>
<data name="VerificationCodes" xml:space="preserve"> <data name="VerificationCodes" xml:space="preserve">
<value>Təsdiqləmə kodları</value> <value>Doğrulama kodları</value>
</data> </data>
<data name="PremiumSubscriptionRequired" xml:space="preserve"> <data name="PremiumSubscriptionRequired" xml:space="preserve">
<value>Premium abunəlik tələb olunur</value> <value>Premium abunəlik tələb olunur</value>
</data> </data>
<data name="CannotAddAuthenticatorKey" xml:space="preserve"> <data name="CannotAddAuthenticatorKey" xml:space="preserve">
<value>Kimlik təsdiqləyici açarı oxuna bilmir? </value> <value>Kimlik doğrulayıcı açarı oxuna bilmir? </value>
</data> </data>
<data name="ScanQRCode" xml:space="preserve"> <data name="ScanQRCode" xml:space="preserve">
<value>QR kodu skan edin</value> <value>QR kodu skan edin</value>
@@ -2281,7 +2281,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>QR kodunu skan edə bilmədiniz? </value> <value>QR kodunu skan edə bilmədiniz? </value>
</data> </data>
<data name="AuthenticatorKeyScanner" xml:space="preserve"> <data name="AuthenticatorKeyScanner" xml:space="preserve">
<value>Kimlik təsdiqləyici açarı</value> <value>Kimlik doğrulayıcı açarı</value>
</data> </data>
<data name="EnterKeyManually" xml:space="preserve"> <data name="EnterKeyManually" xml:space="preserve">
<value>Kodu əllə daxil et</value> <value>Kodu əllə daxil et</value>
@@ -2296,13 +2296,13 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Açar uğurla daxil edildikdən sonra, açarı güvənli şəkildə saxlamaq üçün "TOTP əlavə et"i seçin</value> <value>Açar uğurla daxil edildikdən sonra, açarı güvənli şəkildə saxlamaq üçün "TOTP əlavə et"i seçin</value>
</data> </data>
<data name="NeverLockWarning" xml:space="preserve"> <data name="NeverLockWarning" xml:space="preserve">
<value>Kilid seçimlərini "Heç vaxt" olaraq tənzimləmək, anbarınızı cihazınıza müraciəti olan hər kəsə əlçatan edir. Bu seçimi istifadə etsəniz, cihazınızı düzgün qoruduğunuza əmin olmalısınız.</value> <value>Kilid seçimlərini "Heç vaxt" olaraq ayarlamaq, anbarınızı cihazınıza müraciəti olan hər kəsə əlçatan edir. Bu seçimi istifadə etsəniz, cihazınızı düzgün qoruduğunuza əmin olmalısınız.</value>
</data> </data>
<data name="EnvironmentPageUrlsError" xml:space="preserve"> <data name="EnvironmentPageUrlsError" xml:space="preserve">
<value>Daxil edilən bir və ya daha çox URL yararsızdır. Zəhmət olmasa nəzər salın və yenidən saxlamağa çalışın.</value> <value>Daxil edilən bir və ya daha çox URL yararsızdır. Lütfən nəzər salın və yenidən saxlamağa çalışın.</value>
</data> </data>
<data name="GenericErrorMessage" xml:space="preserve"> <data name="GenericErrorMessage" xml:space="preserve">
<value>Tələbinizi emal edə bilmədik. Zəhmət olmasa yenidən sınayın və ya bizimlə əlaqə saxlayın.</value> <value>Tələbinizi emal edə bilmədik. Lütfən yenidən sınayın və ya bizimlə əlaqə saxlayın.</value>
</data> </data>
<data name="AllowScreenCapture" xml:space="preserve"> <data name="AllowScreenCapture" xml:space="preserve">
<value>Ekranı çəkməyə icazə ver</value> <value>Ekranı çəkməyə icazə ver</value>
@@ -2353,7 +2353,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Giriş tələblərini təsdiqlə</value> <value>Giriş tələblərini təsdiqlə</value>
</data> </data>
<data name="UseThisDeviceToApproveLoginRequestsMadeFromOtherDevices" xml:space="preserve"> <data name="UseThisDeviceToApproveLoginRequestsMadeFromOtherDevices" xml:space="preserve">
<value>Digər cihazlardan edilən giriş tələblərini təsdiqləmək üçün bu cihazı istifadə edin.</value> <value>Digər cihazlardan edilən giriş tələblərini təsdiqləmək üçün bu cihazı istifadə edin</value>
</data> </data>
<data name="AllowNotifications" xml:space="preserve"> <data name="AllowNotifications" xml:space="preserve">
<value>Bildirişlərə icazə ver</value> <value>Bildirişlərə icazə ver</value>
@@ -2505,7 +2505,7 @@ Bu hesaba keçmək istəyirsiniz?</value>
<value>Cihazınıza bir bildiriş göndərildi.</value> <value>Cihazınıza bir bildiriş göndərildi.</value>
</data> </data>
<data name="PleaseMakeSureYourVaultIsUnlockedAndTheFingerprintPhraseMatchesOnTheOtherDevice" xml:space="preserve"> <data name="PleaseMakeSureYourVaultIsUnlockedAndTheFingerprintPhraseMatchesOnTheOtherDevice" xml:space="preserve">
<value>Zəhmət olmasa anbarınızın kilidinin açıq olduğuna və Barmaq izi ifadəsinin digər cihazda uyğun gəldiyinə əmin olun.</value> <value>Lütfən anbarınızın kilidinin açıq olduğuna və Barmaq izi ifadəsinin digər cihazda uyğun gəldiyinə əmin olun.</value>
</data> </data>
<data name="ResendNotification" xml:space="preserve"> <data name="ResendNotification" xml:space="preserve">
<value>Bildirişi təkrar göndər</value> <value>Bildirişi təkrar göndər</value>
@@ -2541,7 +2541,7 @@ Bu hesaba keçmək istəyirsiniz?</value>
<value>Dil</value> <value>Dil</value>
</data> </data>
<data name="LanguageChangeXDescription" xml:space="preserve"> <data name="LanguageChangeXDescription" xml:space="preserve">
<value>Dil, {0} olaraq dəyişdirildi. Dəyişiklikləri görmək üçün zəhmət olmasa tətbiqi yenidən başladın</value> <value>Dil, {0} olaraq dəyişdirildi. Dəyişiklikləri görmək üçün lütfən tətbiqi yenidən başladın</value>
</data> </data>
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve"> <data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
<value>Dil dəyişikliyi, tətbiqin yenidən başladılmasını tələb edir</value> <value>Dil dəyişikliyi, tətbiqin yenidən başladılmasını tələb edir</value>
@@ -2667,7 +2667,7 @@ Bu hesaba keçmək istəyirsiniz?</value>
<value>Ana parolu təkrar soruş köməyi</value> <value>Ana parolu təkrar soruş köməyi</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Yetərsiz yaddaşa görə kilid açma uğursuz ola bilər. Həll etmək üçün KDF yaddaş tənzimləmələrinizi azaldın və ya biometrik kilid açmanı quraşdırın.</value> <value>Yetərsiz yaddaşa görə kilid açma uğursuz ola bilər. Həll etmək üçün KDF yaddaş ayarlarınızı azaldın və ya biometrik kilid açmanı quraşdırın.</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve"> <data name="InvalidAPIKey" xml:space="preserve">
<value>Yararsız API açarı</value> <value>Yararsız API açarı</value>
@@ -2740,7 +2740,7 @@ Bu hesaba keçmək istəyirsiniz?</value>
<value>Giriş təsdiqləndi</value> <value>Giriş təsdiqləndi</value>
</data> </data>
<data name="LogInWithDeviceMustBeSetUpInTheSettingsOfTheBitwardenAppNeedAnotherOption" xml:space="preserve"> <data name="LogInWithDeviceMustBeSetUpInTheSettingsOfTheBitwardenAppNeedAnotherOption" xml:space="preserve">
<value>Cihazla giriş etmə, Bitwarden tətbiqinin tənzimləmələrində quraşdırılmalıdır. Başqa bir seçimə ehtiyacınız var?</value> <value>Cihazla giriş etmə, Bitwarden tətbiqinin ayarlarında qurulmalıdır. Başqa bir seçimə ehtiyacınız var?</value>
</data> </data>
<data name="LogInWithDevice" xml:space="preserve"> <data name="LogInWithDevice" xml:space="preserve">
<value>Cihazla giriş et</value> <value>Cihazla giriş et</value>

View File

@@ -2110,7 +2110,7 @@
<value>FIDO2 WebAuthn</value> <value>FIDO2 WebAuthn</value>
</data> </data>
<data name="Fido2Instruction" xml:space="preserve"> <data name="Fido2Instruction" xml:space="preserve">
<value>To continue, have your FIDO2 WebAuthn compatible security key ready, then follow the instructions after clicking 'Authenticate WebAuthn' on the next screen.</value> <value>За да продължите, пригответе своето устройство за удостоверяване съвместимо с FIDO2 WebAuthn, натиснете „Идентификация WebAuthn“ на следващия екран и следвайте инструкциите.</value>
</data> </data>
<data name="Fido2Desc" xml:space="preserve"> <data name="Fido2Desc" xml:space="preserve">
<value>Идентификация чрез FIDO2 WebAuthn можете да се идентифицирате чрез външен ключ за сигурност.</value> <value>Идентификация чрез FIDO2 WebAuthn можете да се идентифицирате чрез външен ключ за сигурност.</value>
@@ -2293,8 +2293,8 @@
<value>Настройка на TOTP</value> <value>Настройка на TOTP</value>
</data> </data>
<data name="OnceTheKeyIsSuccessfullyEntered" xml:space="preserve"> <data name="OnceTheKeyIsSuccessfullyEntered" xml:space="preserve">
<value>Once the key is successfully entered, <value>След като ключът бъде въведен успешно,
select Add TOTP to store the key safely</value> изберете „Добавяне на код за потвърждаване“, за да запазите ключа</value>
</data> </data>
<data name="NeverLockWarning" xml:space="preserve"> <data name="NeverLockWarning" xml:space="preserve">
<value>Ако изберете „Никога“ като настройка за заключването, трезорът Ви ще бъде достъпен за всеки, който има досег с устройството. Ако използвате тази настройка, трябва да се уверите, че устройството Ви е удачно защитено.</value> <value>Ако изберете „Никога“ като настройка за заключването, трезорът Ви ще бъде достъпен за всеки, който има досег с устройството. Ако използвате тази настройка, трябва да се уверите, че устройството Ви е удачно защитено.</value>

View File

@@ -156,7 +156,7 @@
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment> <comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
</data> </data>
<data name="CopyUsername" xml:space="preserve"> <data name="CopyUsername" xml:space="preserve">
<value>Copiar usuario</value> <value>Copiar nombre de usuario</value>
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment> <comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
</data> </data>
<data name="Credits" xml:space="preserve"> <data name="Credits" xml:space="preserve">
@@ -186,11 +186,11 @@
<comment>Short label for an email address.</comment> <comment>Short label for an email address.</comment>
</data> </data>
<data name="EmailAddress" xml:space="preserve"> <data name="EmailAddress" xml:space="preserve">
<value>Correo electrónico</value> <value>Dirección de correo electrónico</value>
<comment>Full label for a email address.</comment> <comment>Full label for a email address.</comment>
</data> </data>
<data name="EmailUs" xml:space="preserve"> <data name="EmailUs" xml:space="preserve">
<value>Envíanos un correo</value> <value>Envíanos correo electrónico</value>
</data> </data>
<data name="EmailUsDescription" xml:space="preserve"> <data name="EmailUsDescription" xml:space="preserve">
<value>Envíanos un correo directamente para obtener ayuda o dejar tus comentarios.</value> <value>Envíanos un correo directamente para obtener ayuda o dejar tus comentarios.</value>
@@ -203,7 +203,7 @@
<comment>Title for your favorite items in the vault.</comment> <comment>Title for your favorite items in the vault.</comment>
</data> </data>
<data name="FileBugReport" xml:space="preserve"> <data name="FileBugReport" xml:space="preserve">
<value>Reportar un fallo</value> <value>Enviar un informe de error</value>
</data> </data>
<data name="FileBugReportDescription" xml:space="preserve"> <data name="FileBugReportDescription" xml:space="preserve">
<value>Abrir una incidencia en el repositorio de GitHub.</value> <value>Abrir una incidencia en el repositorio de GitHub.</value>
@@ -229,10 +229,10 @@
<value>Carpetas</value> <value>Carpetas</value>
</data> </data>
<data name="FolderUpdated" xml:space="preserve"> <data name="FolderUpdated" xml:space="preserve">
<value>Carpeta actualizada.</value> <value>Carpeta guardada</value>
</data> </data>
<data name="GoToWebsite" xml:space="preserve"> <data name="GoToWebsite" xml:space="preserve">
<value>Ir a la web</value> <value>Ir al sitio web</value>
<comment>The button text that allows user to launch the website to their web browser.</comment> <comment>The button text that allows user to launch the website to their web browser.</comment>
</data> </data>
<data name="HelpAndFeedback" xml:space="preserve"> <data name="HelpAndFeedback" xml:space="preserve">
@@ -285,7 +285,7 @@
<value>Cuenta ya añadida</value> <value>Cuenta ya añadida</value>
</data> </data>
<data name="SwitchToAlreadyAddedAccountConfirmation" xml:space="preserve"> <data name="SwitchToAlreadyAddedAccountConfirmation" xml:space="preserve">
<value>¿Quieres cambiarlo ahora?</value> <value>¿Te gustaría cambiar a esa cuenta ahora?</value>
</data> </data>
<data name="MasterPassword" xml:space="preserve"> <data name="MasterPassword" xml:space="preserve">
<value>Contraseña maestra</value> <value>Contraseña maestra</value>
@@ -342,7 +342,7 @@
<comment>Reveal a hidden value (password).</comment> <comment>Reveal a hidden value (password).</comment>
</data> </data>
<data name="ItemDeleted" xml:space="preserve"> <data name="ItemDeleted" xml:space="preserve">
<value>El elemento ha sido eliminado.</value> <value>Elemento eliminado</value>
<comment>Confirmation message after successfully deleting a login.</comment> <comment>Confirmation message after successfully deleting a login.</comment>
</data> </data>
<data name="Submit" xml:space="preserve"> <data name="Submit" xml:space="preserve">
@@ -375,7 +375,7 @@
<comment>Validation message for when a form field is left blank and is required to be entered.</comment> <comment>Validation message for when a form field is left blank and is required to be entered.</comment>
</data> </data>
<data name="ValueHasBeenCopied" xml:space="preserve"> <data name="ValueHasBeenCopied" xml:space="preserve">
<value>{0} ha sido copiado.</value> <value>{0} copiado</value>
<comment>Confirmation message after successfully copying a value to the clipboard.</comment> <comment>Confirmation message after successfully copying a value to the clipboard.</comment>
</data> </data>
<data name="VerifyFingerprint" xml:space="preserve"> <data name="VerifyFingerprint" xml:space="preserve">
@@ -419,16 +419,16 @@
<value>Utiliza el servicio de accesibilidad de Bitwarden para autorellenar entradas entre aplicaciones y sitios web.</value> <value>Utiliza el servicio de accesibilidad de Bitwarden para autorellenar entradas entre aplicaciones y sitios web.</value>
</data> </data>
<data name="AutofillService" xml:space="preserve"> <data name="AutofillService" xml:space="preserve">
<value>Servicio de autorrellenado</value> <value>Servicio de autocompletado</value>
</data> </data>
<data name="AvoidAmbiguousCharacters" xml:space="preserve"> <data name="AvoidAmbiguousCharacters" xml:space="preserve">
<value>Evitar caracteres ambiguos</value> <value>Evitar caracteres ambiguos</value>
</data> </data>
<data name="BitwardenAppExtension" xml:space="preserve"> <data name="BitwardenAppExtension" xml:space="preserve">
<value>Extensión de Aplicación de Bitwarden</value> <value>Extensión de Aplicación Bitwarden</value>
</data> </data>
<data name="BitwardenAppExtensionAlert2" xml:space="preserve"> <data name="BitwardenAppExtensionAlert2" xml:space="preserve">
<value>La forma más fácil de añadir nuevas entradas a su caja fuerte es utilizando la extensión de navegador de Bitwarden. Aprenda más sobre cómo utilizar este servicio en la sección de "Ajustes".</value> <value>La manera más fácil de añadir nuevos inicios de sesión a tu caja fuerte es utilizando la extensión de la aplicación de Bitwarden. Aprenda más sobre cómo utilizar la extensión de la aplicación de Bitwarden accediendo al menú de "Ajustes".</value>
</data> </data>
<data name="BitwardenAppExtensionDescription" xml:space="preserve"> <data name="BitwardenAppExtensionDescription" xml:space="preserve">
<value>Utiliza Bitwarden en Safari y otras aplicaciones para autorellenar tus entradas.</value> <value>Utiliza Bitwarden en Safari y otras aplicaciones para autorellenar tus entradas.</value>
@@ -471,13 +471,13 @@
<value>Introduce el correo electrónico de tu cuenta para recibir la pista de tu contraseña maestra.</value> <value>Introduce el correo electrónico de tu cuenta para recibir la pista de tu contraseña maestra.</value>
</data> </data>
<data name="ExntesionReenable" xml:space="preserve"> <data name="ExntesionReenable" xml:space="preserve">
<value>Re-activar Extension de Aplicación</value> <value>Reactivar extensión de la aplicación</value>
</data> </data>
<data name="ExtensionAlmostDone" xml:space="preserve"> <data name="ExtensionAlmostDone" xml:space="preserve">
<value>¡Casi estamos!</value> <value>¡Casi estamos!</value>
</data> </data>
<data name="ExtensionEnable" xml:space="preserve"> <data name="ExtensionEnable" xml:space="preserve">
<value>Activar Extensión de Aplicación</value> <value>Activar extensión de la aplicación</value>
</data> </data>
<data name="ExtensionInSafari" xml:space="preserve"> <data name="ExtensionInSafari" xml:space="preserve">
<value>En Safari, busca Bitwarden en el icono compartir (pista: desplazate a la derecha en la última fila del menú).</value> <value>En Safari, busca Bitwarden en el icono compartir (pista: desplazate a la derecha en la última fila del menú).</value>
@@ -490,7 +490,7 @@
<value>¡Ya estás identificado!</value> <value>¡Ya estás identificado!</value>
</data> </data>
<data name="ExtensionSetup" xml:space="preserve"> <data name="ExtensionSetup" xml:space="preserve">
<value>Sus entradas son ahora fácilmente accesibles desde Safari, Chrome y otras aplicaciones soportadas.</value> <value>Sus inicios de sesión son ahora fácilmente accesibles desde Safari, Chrome y otras aplicaciones soportadas.</value>
</data> </data>
<data name="ExtensionSetup2" xml:space="preserve"> <data name="ExtensionSetup2" xml:space="preserve">
<value>En Safari y Chrome, busca Bitwarden en el icono compartir (pista: desplazate a la derecha en la última fila del menú).</value> <value>En Safari y Chrome, busca Bitwarden en el icono compartir (pista: desplazate a la derecha en la última fila del menú).</value>
@@ -553,7 +553,7 @@
<value>Acción de tiempo de espera de la caja fuerte</value> <value>Acción de tiempo de espera de la caja fuerte</value>
</data> </data>
<data name="VaultTimeoutLogOutConfirmation" xml:space="preserve"> <data name="VaultTimeoutLogOutConfirmation" xml:space="preserve">
<value>Cerrar sesión eliminará todo el acceso a su caja fuerte y requiere autenticación en línea después del período de espera. ¿Está seguro de que quiere usar esta configuración?</value> <value>Cerrar sesión quitará todo el acceso a su caja fuerte y requiere autenticación en línea después del tiempo de espera. ¿Está seguro de que quiere usar este ajuste?</value>
</data> </data>
<data name="LoggingIn" xml:space="preserve"> <data name="LoggingIn" xml:space="preserve">
<value>Iniciando sesión...</value> <value>Iniciando sesión...</value>
@@ -598,7 +598,7 @@
<value>Nunca</value> <value>Nunca</value>
</data> </data>
<data name="NewItemCreated" xml:space="preserve"> <data name="NewItemCreated" xml:space="preserve">
<value>Nuevo elemento creado.</value> <value>Elemento agregado</value>
</data> </data>
<data name="NoFavorites" xml:space="preserve"> <data name="NoFavorites" xml:space="preserve">
<value>No hay favoritos en tu caja fuerte.</value> <value>No hay favoritos en tu caja fuerte.</value>
@@ -626,7 +626,7 @@
<value>Otro</value> <value>Otro</value>
</data> </data>
<data name="PasswordGenerated" xml:space="preserve"> <data name="PasswordGenerated" xml:space="preserve">
<value>Contraseña generada.</value> <value>Contraseña generada</value>
</data> </data>
<data name="PasswordGenerator" xml:space="preserve"> <data name="PasswordGenerator" xml:space="preserve">
<value>Generador de contraseñas</value> <value>Generador de contraseñas</value>
@@ -641,7 +641,7 @@
<value>¿Estás seguro de que quieres sobreescribir la contraseña actual?</value> <value>¿Estás seguro de que quieres sobreescribir la contraseña actual?</value>
</data> </data>
<data name="PushNotificationAlert" xml:space="preserve"> <data name="PushNotificationAlert" xml:space="preserve">
<value>Bitwarden mantiene tu caja fuerte automáticamente sincronizada utilizando notificaciones push. Para tener la mejor experiencia posible, por favor, pulsa "Permitir" en la próxima notificación donde se te pregunta si quieres habilitar las notificaciones push.</value> <value>Bitwarden mantiene tu caja fuerte automáticamente sincronizada utilizando notificaciones automáticas. Para tener la mejor experiencia posible, por favor, selecciona "Permitir" en la próxima notificación donde se te pregunta si quieres permitir las notificaciones automáticas.</value>
<comment>Push notifications for apple products</comment> <comment>Push notifications for apple products</comment>
</data> </data>
<data name="RateTheApp" xml:space="preserve"> <data name="RateTheApp" xml:space="preserve">
@@ -654,7 +654,7 @@
<value>Regenerar contraseña</value> <value>Regenerar contraseña</value>
</data> </data>
<data name="RetypeMasterPassword" xml:space="preserve"> <data name="RetypeMasterPassword" xml:space="preserve">
<value>Vuelve a escribir tu contraseña maestra</value> <value>Reescribir contraseña maestra</value>
</data> </data>
<data name="SearchVault" xml:space="preserve"> <data name="SearchVault" xml:space="preserve">
<value>Buscar en caja fuerte</value> <value>Buscar en caja fuerte</value>
@@ -675,7 +675,7 @@
<value>Información del elemento</value> <value>Información del elemento</value>
</data> </data>
<data name="ItemUpdated" xml:space="preserve"> <data name="ItemUpdated" xml:space="preserve">
<value>Elemento actualizado.</value> <value>Elemento guardado</value>
</data> </data>
<data name="Submitting" xml:space="preserve"> <data name="Submitting" xml:space="preserve">
<value>Enviando...</value> <value>Enviando...</value>
@@ -686,10 +686,10 @@
<comment>Message shown when interacting with the server</comment> <comment>Message shown when interacting with the server</comment>
</data> </data>
<data name="SyncingComplete" xml:space="preserve"> <data name="SyncingComplete" xml:space="preserve">
<value>Sincronización completada.</value> <value>Sincronización completada</value>
</data> </data>
<data name="SyncingFailed" xml:space="preserve"> <data name="SyncingFailed" xml:space="preserve">
<value>Sincronizado fallida.</value> <value>Error en la Sincronización</value>
</data> </data>
<data name="SyncVaultNow" xml:space="preserve"> <data name="SyncVaultNow" xml:space="preserve">
<value>Sincronizar caja fuerte ahora</value> <value>Sincronizar caja fuerte ahora</value>
@@ -745,7 +745,7 @@
<comment>This is used for the autofill service. ex. "There are no items in your vault for twitter.com".</comment> <comment>This is used for the autofill service. ex. "There are no items in your vault for twitter.com".</comment>
</data> </data>
<data name="BitwardenAutofillServiceOverlay" xml:space="preserve"> <data name="BitwardenAutofillServiceOverlay" xml:space="preserve">
<value>Cuando seleccione un campo de entrada y vea un recuadro flotante de autorellenado de Bitwarden, puede pulsarlo para iniciar el servicio de autorellenado.</value> <value>Cuando seleccione un campo de entrada y vea una superposición de autocompletado de Bitwarden, puede pulsarla para iniciar el servicio de autocompletado.</value>
</data> </data>
<data name="BitwardenAutofillServiceNotificationContent" xml:space="preserve"> <data name="BitwardenAutofillServiceNotificationContent" xml:space="preserve">
<value>Pulsa en esta notificación para autorellenar una entrada desde tu caja fuerte.</value> <value>Pulsa en esta notificación para autorellenar una entrada desde tu caja fuerte.</value>
@@ -775,7 +775,7 @@
<value>Estado</value> <value>Estado</value>
</data> </data>
<data name="BitwardenAutofillServiceAlert2" xml:space="preserve"> <data name="BitwardenAutofillServiceAlert2" xml:space="preserve">
<value>La forma más fácil de añadir nuevas entradas a su caja fuerte es utilizando el Servicio de Autorellenado de Bitwarden. Aprenda más sobre cómo utilizar este servicio en la sección de "Ajustes".</value> <value>La forma más fácil de añadir nuevos inicios de sesión a tu caja fuerte es utilizando el Servicio de Autocompletar de Bitwarden. Aprenda más sobre cómo utilizar el Servicio de Autocompletar de Bitwarden en el menú "Ajustes".</value>
</data> </data>
<data name="Autofill" xml:space="preserve"> <data name="Autofill" xml:space="preserve">
<value>Autorellenar</value> <value>Autorellenar</value>
@@ -787,10 +787,10 @@
<value>¿Estás seguro de que quieres autorellenar esta entrada? No es una coincidencia completa para "{0}".</value> <value>¿Estás seguro de que quieres autorellenar esta entrada? No es una coincidencia completa para "{0}".</value>
</data> </data>
<data name="MatchingItems" xml:space="preserve"> <data name="MatchingItems" xml:space="preserve">
<value>Elementos coincidientes</value> <value>Elementos que coinciden</value>
</data> </data>
<data name="PossibleMatchingItems" xml:space="preserve"> <data name="PossibleMatchingItems" xml:space="preserve">
<value>Posibles elementos coincidientes</value> <value>Posibles elementos que coinciden</value>
</data> </data>
<data name="Search" xml:space="preserve"> <data name="Search" xml:space="preserve">
<value>Buscar</value> <value>Buscar</value>
@@ -799,7 +799,7 @@
<value>Estás buscando una entrada para autorellenar "{0}".</value> <value>Estás buscando una entrada para autorellenar "{0}".</value>
</data> </data>
<data name="LearnOrg" xml:space="preserve"> <data name="LearnOrg" xml:space="preserve">
<value>Aprenda sobre Organizaciones</value> <value>Aprende sobre organizaciones</value>
</data> </data>
<data name="CannotOpenApp" xml:space="preserve"> <data name="CannotOpenApp" xml:space="preserve">
<value>No se puede abrir la aplicación "{0}".</value> <value>No se puede abrir la aplicación "{0}".</value>
@@ -818,11 +818,11 @@
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="LoginUnavailable" xml:space="preserve"> <data name="LoginUnavailable" xml:space="preserve">
<value>Entrada no disponible</value> <value>Inicio de sesión no disponible</value>
<comment>For 2FA whenever there are no available providers on this device.</comment> <comment>For 2FA whenever there are no available providers on this device.</comment>
</data> </data>
<data name="NoTwoStepAvailable" xml:space="preserve"> <data name="NoTwoStepAvailable" xml:space="preserve">
<value>Esta cuenta tiene habilitada la autenticación en dos pasos, pero ninguna de los métodos configurados es soportado por este dispositivo. Por favor, utiliza un dispositivo soportado o/y añade proveedores adicionales que tengan un mejor soporte entre dispositivos (como una aplicación autenticadora).</value> <value>Esta cuenta tiene configuración de inicio de sesión en dos pasos, sin embargo, ninguno de los proveedores de dos pasos configurados son soportados en este dispositivo. Por favor, utilice un dispositivo soportado y/o añada proveedores adicionales que sean mejor soportados entre los dispositivos (como una aplicación de autenticación).</value>
</data> </data>
<data name="RecoveryCodeTitle" xml:space="preserve"> <data name="RecoveryCodeTitle" xml:space="preserve">
<value>Código de recuperación</value> <value>Código de recuperación</value>
@@ -837,7 +837,7 @@
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="TwoStepLoginOptions" xml:space="preserve"> <data name="TwoStepLoginOptions" xml:space="preserve">
<value>Opciones de la autenticación en dos pasos</value> <value>Opciones de inicio de sesión en dos pasos</value>
</data> </data>
<data name="UseAnotherTwoStepMethod" xml:space="preserve"> <data name="UseAnotherTwoStepMethod" xml:space="preserve">
<value>Utilizar otro método de autenticación en dos pasos</value> <value>Utilizar otro método de autenticación en dos pasos</value>
@@ -847,18 +847,18 @@
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="VerificationEmailSent" xml:space="preserve"> <data name="VerificationEmailSent" xml:space="preserve">
<value>Correo de verificación enviado.</value> <value>Correo de verificación enviado</value>
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="YubiKeyInstruction" xml:space="preserve"> <data name="YubiKeyInstruction" xml:space="preserve">
<value>Para continuar, mantén tu YubiKey NEO contra la parte trasera de tu dispositivo o inserta tu YubiKey en el puerto USB de tu dispositivo y luego pulsa su butón.</value> <value>Para continuar, mantén tu YubiKey NEO contra la parte trasera de tu dispositivo o inserta tu YubiKey en el puerto USB de tu dispositivo y luego pulsa su butón.</value>
</data> </data>
<data name="YubiKeyTitle" xml:space="preserve"> <data name="YubiKeyTitle" xml:space="preserve">
<value>Llave de Seguridad YubiKey</value> <value>Clave de seguridad YubiKey</value>
<comment>"YubiKey" is the product name and should not be translated.</comment> <comment>"YubiKey" is the product name and should not be translated.</comment>
</data> </data>
<data name="AddNewAttachment" xml:space="preserve"> <data name="AddNewAttachment" xml:space="preserve">
<value>Añadir nuevo adjunto</value> <value>Añadir nuevo archivo adjunto</value>
</data> </data>
<data name="Attachments" xml:space="preserve"> <data name="Attachments" xml:space="preserve">
<value>Adjuntos</value> <value>Adjuntos</value>
@@ -907,10 +907,10 @@ El escaneo se realizará automáticamente.</value>
<value>Copiar código TOTP</value> <value>Copiar código TOTP</value>
</data> </data>
<data name="CopyTotpAutomaticallyDescription" xml:space="preserve"> <data name="CopyTotpAutomaticallyDescription" xml:space="preserve">
<value>Si un inicio de sesión tiene una clave de autenticador, copie el código de verificación TOTP a su portapapeles cuando autorrellene el inicio de sesión.</value> <value>Si un inicio de sesión tiene una clave de autenticador, copie el código de verificación TOTP a su portapapeles cuando autocomplete el inicio de sesión.</value>
</data> </data>
<data name="CopyTotpAutomatically" xml:space="preserve"> <data name="CopyTotpAutomatically" xml:space="preserve">
<value>Copiar automáticamente TOTP</value> <value>Copiar TOTP automáticamente</value>
</data> </data>
<data name="PremiumRequired" xml:space="preserve"> <data name="PremiumRequired" xml:space="preserve">
<value>Se quiere membrasía Premium para poder utilizar esta característica.</value> <value>Se quiere membrasía Premium para poder utilizar esta característica.</value>
@@ -922,7 +922,7 @@ El escaneo se realizará automáticamente.</value>
<value>Adjunto eliminado</value> <value>Adjunto eliminado</value>
</data> </data>
<data name="ChooseFile" xml:space="preserve"> <data name="ChooseFile" xml:space="preserve">
<value>Seleccionar archivo</value> <value>Elegir archivo</value>
</data> </data>
<data name="File" xml:space="preserve"> <data name="File" xml:space="preserve">
<value>Archivo</value> <value>Archivo</value>
@@ -937,7 +937,7 @@ El escaneo se realizará automáticamente.</value>
<value>Fuente de archivo</value> <value>Fuente de archivo</value>
</data> </data>
<data name="FeatureUnavailable" xml:space="preserve"> <data name="FeatureUnavailable" xml:space="preserve">
<value>Característica no disponible</value> <value>Funcionalidad no disponible</value>
</data> </data>
<data name="MaxFileSize" xml:space="preserve"> <data name="MaxFileSize" xml:space="preserve">
<value>El tamaño máximo de archivo es de 100MB.</value> <value>El tamaño máximo de archivo es de 100MB.</value>
@@ -946,10 +946,10 @@ El escaneo se realizará automáticamente.</value>
<value>No puedes usar esta característica hasta que actualices tu clave de cifrado.</value> <value>No puedes usar esta característica hasta que actualices tu clave de cifrado.</value>
</data> </data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve"> <data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value> <value>Se requiere migración de la clave de cifrado. Por favor, inicie sesión a través de la caja fuerte web para actualizar su clave de cifrado.</value>
</data> </data>
<data name="LearnMore" xml:space="preserve"> <data name="LearnMore" xml:space="preserve">
<value>Aprender más</value> <value>Aprende más</value>
</data> </data>
<data name="ApiUrl" xml:space="preserve"> <data name="ApiUrl" xml:space="preserve">
<value>URL del servidor de la API</value> <value>URL del servidor de la API</value>
@@ -1032,7 +1032,7 @@ El escaneo se realizará automáticamente.</value>
<value>Marca</value> <value>Marca</value>
</data> </data>
<data name="CardholderName" xml:space="preserve"> <data name="CardholderName" xml:space="preserve">
<value>Nombre en la tarjeta</value> <value>Nombre del propietario de la tarjeta</value>
</data> </data>
<data name="CityTown" xml:space="preserve"> <data name="CityTown" xml:space="preserve">
<value>Ciudad / Pueblo</value> <value>Ciudad / Pueblo</value>
@@ -1077,7 +1077,7 @@ El escaneo se realizará automáticamente.</value>
<value>Nombre completo</value> <value>Nombre completo</value>
</data> </data>
<data name="LicenseNumber" xml:space="preserve"> <data name="LicenseNumber" xml:space="preserve">
<value>Nº de licencia</value> <value>Número de licencia</value>
</data> </data>
<data name="March" xml:space="preserve"> <data name="March" xml:space="preserve">
<value>Marzo</value> <value>Marzo</value>
@@ -1086,7 +1086,7 @@ El escaneo se realizará automáticamente.</value>
<value>Mayo</value> <value>Mayo</value>
</data> </data>
<data name="MiddleName" xml:space="preserve"> <data name="MiddleName" xml:space="preserve">
<value> nombre</value> <value>Segundo nombre</value>
</data> </data>
<data name="Mr" xml:space="preserve"> <data name="Mr" xml:space="preserve">
<value>Sr</value> <value>Sr</value>
@@ -1098,7 +1098,7 @@ El escaneo se realizará automáticamente.</value>
<value>Srta</value> <value>Srta</value>
</data> </data>
<data name="Mx" xml:space="preserve"> <data name="Mx" xml:space="preserve">
<value>"Mx" = "Sr./Sra</value> <value>Mx</value>
</data> </data>
<data name="November" xml:space="preserve"> <data name="November" xml:space="preserve">
<value>Noviembre</value> <value>Noviembre</value>
@@ -1107,7 +1107,7 @@ El escaneo se realizará automáticamente.</value>
<value>Octubre</value> <value>Octubre</value>
</data> </data>
<data name="PassportNumber" xml:space="preserve"> <data name="PassportNumber" xml:space="preserve">
<value>Nº de pasaporte</value> <value>Número de pasaporte</value>
</data> </data>
<data name="Phone" xml:space="preserve"> <data name="Phone" xml:space="preserve">
<value>Teléfono</value> <value>Teléfono</value>
@@ -1116,7 +1116,7 @@ El escaneo se realizará automáticamente.</value>
<value>Septiembre</value> <value>Septiembre</value>
</data> </data>
<data name="SSN" xml:space="preserve"> <data name="SSN" xml:space="preserve">
<value>Nº de la seguridad social</value> <value>Número de Seguro Social</value>
</data> </data>
<data name="StateProvince" xml:space="preserve"> <data name="StateProvince" xml:space="preserve">
<value>Estado / Provincia</value> <value>Estado / Provincia</value>
@@ -1167,7 +1167,7 @@ El escaneo se realizará automáticamente.</value>
<value>Servicio de accesibilidad de autorellenado</value> <value>Servicio de accesibilidad de autorellenado</value>
</data> </data>
<data name="AutofillServiceDescription" xml:space="preserve"> <data name="AutofillServiceDescription" xml:space="preserve">
<value>El servicio de autorellenado de Bitwarden utiliza el marco de autocompletado de Android para ayudarte a rellenar entradas, tarjetas de crédito e identidades en otras aplicaciones de tu dispositivo.</value> <value>El servicio de autocompletar de Bitwarden utiliza el Marco de Autocompletar de Android para ayudarte a completar información de inicios de sesión en otras aplicaciones en tu dispositivo.</value>
</data> </data>
<data name="BitwardenAutofillServiceDescription" xml:space="preserve"> <data name="BitwardenAutofillServiceDescription" xml:space="preserve">
<value>Utiliza el servicio de accesibilidad de Bitwarden para autorrellenar entradas.</value> <value>Utiliza el servicio de accesibilidad de Bitwarden para autorrellenar entradas.</value>
@@ -1246,14 +1246,14 @@ El escaneo se realizará automáticamente.</value>
<value>Empieza con</value> <value>Empieza con</value>
</data> </data>
<data name="URIMatchDetection" xml:space="preserve"> <data name="URIMatchDetection" xml:space="preserve">
<value>Tipo de detección de URI</value> <value>Detección de coincidencia URI</value>
</data> </data>
<data name="MatchDetection" xml:space="preserve"> <data name="MatchDetection" xml:space="preserve">
<value>Tipo de detección</value> <value>Detección de coincidencia</value>
<comment>URI match detection for auto-fill.</comment> <comment>URI match detection for auto-fill.</comment>
</data> </data>
<data name="YesAndSave" xml:space="preserve"> <data name="YesAndSave" xml:space="preserve">
<value>Sí y guardar</value> <value>Sí, y guardar</value>
</data> </data>
<data name="AutofillAndSave" xml:space="preserve"> <data name="AutofillAndSave" xml:space="preserve">
<value>Autorellenar y guardar</value> <value>Autorellenar y guardar</value>
@@ -1289,7 +1289,7 @@ El escaneo se realizará automáticamente.</value>
<value>Debes identificarte en la aplicación principal de Bitwarden antes de poder utilizar Autorellenado.</value> <value>Debes identificarte en la aplicación principal de Bitwarden antes de poder utilizar Autorellenado.</value>
</data> </data>
<data name="AutofillSetup" xml:space="preserve"> <data name="AutofillSetup" xml:space="preserve">
<value>Sus entradas son ahora fácilmente accesibles desde su teclado mientras se identifica en aplicaciones y sitios web.</value> <value>Sus inicios de sesión ahora son fácilmente accesibles directamente desde su teclado mientras inician sesión en aplicaciones y sitios web.</value>
</data> </data>
<data name="AutofillSetup2" xml:space="preserve"> <data name="AutofillSetup2" xml:space="preserve">
<value>Te recomendamos deshabilitar cualquier otra aplicación de Autorellenado desde Ajustes si no piensas utilizarlas.</value> <value>Te recomendamos deshabilitar cualquier otra aplicación de Autorellenado desde Ajustes si no piensas utilizarlas.</value>
@@ -2630,16 +2630,16 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
<value>Aprobar con mi otro dispositivo</value> <value>Aprobar con mi otro dispositivo</value>
</data> </data>
<data name="RequestAdminApproval" xml:space="preserve"> <data name="RequestAdminApproval" xml:space="preserve">
<value>Request admin approval</value> <value>Solicitar aprobación del administrador</value>
</data> </data>
<data name="ApproveWithMasterPassword" xml:space="preserve"> <data name="ApproveWithMasterPassword" xml:space="preserve">
<value>Approve with master password</value> <value>Aprobar con contraseña maestra</value>
</data> </data>
<data name="TurnOffUsingPublicDevice" xml:space="preserve"> <data name="TurnOffUsingPublicDevice" xml:space="preserve">
<value>Turn off using a public device</value> <value>Deshabilitar usando un dispositivo público</value>
</data> </data>
<data name="RememberThisDevice" xml:space="preserve"> <data name="RememberThisDevice" xml:space="preserve">
<value>Remember this device</value> <value>Recordar este dispositivo</value>
</data> </data>
<data name="Passkey" xml:space="preserve"> <data name="Passkey" xml:space="preserve">
<value>Passkey</value> <value>Passkey</value>
@@ -2648,28 +2648,29 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
<value>Passkeys</value> <value>Passkeys</value>
</data> </data>
<data name="Application" xml:space="preserve"> <data name="Application" xml:space="preserve">
<value>Application</value> <value>Aplicación</value>
</data> </data>
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve"> <data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
<value>You cannot edit passkey application because it would invalidate the passkey</value> <value>No puedes editar la aplicación de contraseñas maestras porque podría invalidar la contraseña maestra</value>
</data> </data>
<data name="PasskeyWillNotBeCopied" xml:space="preserve"> <data name="PasskeyWillNotBeCopied" xml:space="preserve">
<value>Passkey will not be copied</value> <value>La contraseña maestra no será copiada</value>
</data> </data>
<data name="ThePasskeyWillNotBeCopiedToTheClonedItemDoYouWantToContinueCloningThisItem" xml:space="preserve"> <data name="ThePasskeyWillNotBeCopiedToTheClonedItemDoYouWantToContinueCloningThisItem" xml:space="preserve">
<value>The passkey will not be copied to the cloned item. Do you want to continue cloning this item?</value> <value>La contraseña maestra no será copiada al elemento clonado.
¿Deseas continuar clonando este elemento?</value>
</data> </data>
<data name="CopyApplication" xml:space="preserve"> <data name="CopyApplication" xml:space="preserve">
<value>Copy application</value> <value>Copiar aplicación</value>
</data> </data>
<data name="AvailableForTwoStepLogin" xml:space="preserve"> <data name="AvailableForTwoStepLogin" xml:space="preserve">
<value>Available for two-step login</value> <value>Disponible para inicio de sesión en dos pasos</value>
</data> </data>
<data name="MasterPasswordRePromptHelp" xml:space="preserve"> <data name="MasterPasswordRePromptHelp" xml:space="preserve">
<value>Ayuda de volver a pedir contraseña maestra</value> <value>Ayuda de volver a pedir contraseña maestra</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings or set up biometric unlock to resolve.</value> <value>El desbloqueo puede fallar por falta de memoria. Disminuye los ajustes de memoria KDF o configura el desbloqueo biométrico para resolverlo.</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve"> <data name="InvalidAPIKey" xml:space="preserve">
<value>Clave API no válida</value> <value>Clave API no válida</value>
@@ -2678,197 +2679,197 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
<value>Token de API no válido</value> <value>Token de API no válido</value>
</data> </data>
<data name="AdminApprovalRequested" xml:space="preserve"> <data name="AdminApprovalRequested" xml:space="preserve">
<value>Admin approval requested</value> <value>Aprobación del administrador solicitada</value>
</data> </data>
<data name="YourRequestHasBeenSentToYourAdmin" xml:space="preserve"> <data name="YourRequestHasBeenSentToYourAdmin" xml:space="preserve">
<value>Your request has been sent to your admin.</value> <value>Tu solicitud ha sido enviada a tu administrador.</value>
</data> </data>
<data name="YouWillBeNotifiedOnceApproved" xml:space="preserve"> <data name="YouWillBeNotifiedOnceApproved" xml:space="preserve">
<value>You will be notified once approved. </value> <value>Se te notificará una vez aprobada. </value>
</data> </data>
<data name="TroubleLoggingIn" xml:space="preserve"> <data name="TroubleLoggingIn" xml:space="preserve">
<value>Trouble logging in?</value> <value>¿Problema para iniciar sesión?</value>
</data> </data>
<data name="LoggingInAsX" xml:space="preserve"> <data name="LoggingInAsX" xml:space="preserve">
<value>Logging in as {0}</value> <value>Iniciando sesión como {0}</value>
</data> </data>
<data name="VaultTimeoutActionChangedToLogOut" xml:space="preserve"> <data name="VaultTimeoutActionChangedToLogOut" xml:space="preserve">
<value>Vault timeout action changed to log out</value> <value>Acción después del tiempo de espera de la caja fuerte cambiado a cerrar sesión</value>
</data> </data>
<data name="BlockAutoFill" xml:space="preserve"> <data name="BlockAutoFill" xml:space="preserve">
<value>Block auto-fill</value> <value>Bloquear autocompletar</value>
</data> </data>
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve"> <data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
<value>Auto-fill will not be offered for these URIs.</value> <value>Autocompletar no se ofrecerá para estas URLs.</value>
</data> </data>
<data name="NewBlockedURI" xml:space="preserve"> <data name="NewBlockedURI" xml:space="preserve">
<value>New blocked URI</value> <value>Nueva URI bloqueada</value>
</data> </data>
<data name="URISaved" xml:space="preserve"> <data name="URISaved" xml:space="preserve">
<value>URI saved</value> <value>URI guardada</value>
</data> </data>
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve"> <data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
<value>Invalid format. Use https://, http://, or androidapp://</value> <value>Formato no válido. Use https://, http://, o androidapp://</value>
<comment>https://, http://, androidapp:// should not be translated</comment> <comment>https://, http://, androidapp:// should not be translated</comment>
</data> </data>
<data name="EditURI" xml:space="preserve"> <data name="EditURI" xml:space="preserve">
<value>Edit URI</value> <value>Editar URI</value>
</data> </data>
<data name="EnterURI" xml:space="preserve"> <data name="EnterURI" xml:space="preserve">
<value>Enter URI</value> <value>Escribir URI</value>
</data> </data>
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve"> <data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
<value>Format: {0}. Separate multiple URIs with a comma.</value> <value>Formato: {0}. Separar múltiples URIs con una coma.</value>
</data> </data>
<data name="FormatX" xml:space="preserve"> <data name="FormatX" xml:space="preserve">
<value>Format: {0}</value> <value>Formato: {0}</value>
</data> </data>
<data name="InvalidURI" xml:space="preserve"> <data name="InvalidURI" xml:space="preserve">
<value>Invalid URI</value> <value>URI no válida</value>
</data> </data>
<data name="URIRemoved" xml:space="preserve"> <data name="URIRemoved" xml:space="preserve">
<value>URI removed</value> <value>URI eliminada</value>
</data> </data>
<data name="ThereAreNoBlockedURIs" xml:space="preserve"> <data name="ThereAreNoBlockedURIs" xml:space="preserve">
<value>There are no blocked URIs</value> <value>No hay URIs bloqueadas</value>
</data> </data>
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve"> <data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
<value>The URI {0} is already blocked</value> <value>El URI {0} ya está bloqueada</value>
</data> </data>
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve"> <data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
<value>Cannot edit multiple URIs at once</value> <value>No se pueden editar múltiples URIs a la vez</value>
</data> </data>
<data name="LoginApproved" xml:space="preserve"> <data name="LoginApproved" xml:space="preserve">
<value>Login approved</value> <value>Inicio de sesión aprobado</value>
</data> </data>
<data name="LogInWithDeviceMustBeSetUpInTheSettingsOfTheBitwardenAppNeedAnotherOption" xml:space="preserve"> <data name="LogInWithDeviceMustBeSetUpInTheSettingsOfTheBitwardenAppNeedAnotherOption" xml:space="preserve">
<value>Log in with device must be set up in the settings of the Bitwarden app. Need another option?</value> <value>Iniciar sesión con el dispositivo debe configurarse en los ajustes de la aplicación Bitwarden. ¿Necesitas otra opción?</value>
</data> </data>
<data name="LogInWithDevice" xml:space="preserve"> <data name="LogInWithDevice" xml:space="preserve">
<value>Log in with device</value> <value>Iniciar sesión con el dispositivo</value>
</data> </data>
<data name="LoggingInOn" xml:space="preserve"> <data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value> <value>Iniciando sesión en</value>
</data> </data>
<data name="Vault" xml:space="preserve"> <data name="Vault" xml:space="preserve">
<value>Vault</value> <value>Caja fuerte</value>
</data> </data>
<data name="Appearance" xml:space="preserve"> <data name="Appearance" xml:space="preserve">
<value>Appearance</value> <value>Apariencia</value>
</data> </data>
<data name="AccountSecurity" xml:space="preserve"> <data name="AccountSecurity" xml:space="preserve">
<value>Account security</value> <value>Seguridad de la cuenta</value>
</data> </data>
<data name="BitwardenHelpCenter" xml:space="preserve"> <data name="BitwardenHelpCenter" xml:space="preserve">
<value>Bitwarden Help Center</value> <value>Centro de ayuda de Bitwarden</value>
</data> </data>
<data name="ContactBitwardenSupport" xml:space="preserve"> <data name="ContactBitwardenSupport" xml:space="preserve">
<value>Contact Bitwarden support</value> <value>Contactar al soporte de Bitwarden</value>
</data> </data>
<data name="CopyAppInformation" xml:space="preserve"> <data name="CopyAppInformation" xml:space="preserve">
<value>Copy app information</value> <value>Copiar información de la aplicación</value>
</data> </data>
<data name="SyncNow" xml:space="preserve"> <data name="SyncNow" xml:space="preserve">
<value>Sync now</value> <value>Sincronizar ahora</value>
</data> </data>
<data name="UnlockOptions" xml:space="preserve"> <data name="UnlockOptions" xml:space="preserve">
<value>Unlock options</value> <value>Opciónes de desbloqueo</value>
</data> </data>
<data name="SessionTimeout" xml:space="preserve"> <data name="SessionTimeout" xml:space="preserve">
<value>Session timeout</value> <value>Tiempo de espera de sesión</value>
</data> </data>
<data name="SessionTimeoutAction" xml:space="preserve"> <data name="SessionTimeoutAction" xml:space="preserve">
<value>Session timeout action</value> <value>Acción de tiempo de espera de sesión</value>
</data> </data>
<data name="AccountFingerprintPhrase" xml:space="preserve"> <data name="AccountFingerprintPhrase" xml:space="preserve">
<value>Account fingerprint phrase</value> <value>Frase de huella digital de su cuenta</value>
<comment>A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing.</comment> <comment>A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing.</comment>
</data> </data>
<data name="OneHourAndOneMinute" xml:space="preserve"> <data name="OneHourAndOneMinute" xml:space="preserve">
<value>One hour and one minute</value> <value>Una hora y un minuto</value>
</data> </data>
<data name="OneHourAndXMinute" xml:space="preserve"> <data name="OneHourAndXMinute" xml:space="preserve">
<value>One hour and {0} minutes</value> <value>Una hora y {0} minutos</value>
</data> </data>
<data name="XHoursAndOneMinute" xml:space="preserve"> <data name="XHoursAndOneMinute" xml:space="preserve">
<value>{0} hours and one minute</value> <value>{0} horas y un minuto</value>
</data> </data>
<data name="XHoursAndYMinutes" xml:space="preserve"> <data name="XHoursAndYMinutes" xml:space="preserve">
<value>{0} hours and {1} minutes</value> <value>{0} horas y {1} minutos</value>
</data> </data>
<data name="XHours" xml:space="preserve"> <data name="XHours" xml:space="preserve">
<value>{0} hours</value> <value>{0} horas</value>
</data> </data>
<data name="AutofillServicesExplanationLong" xml:space="preserve"> <data name="AutofillServicesExplanationLong" xml:space="preserve">
<value>The Android Autofill Framework is used to assist in filling login information into other apps on your device.</value> <value>El Framework de Autofill de Android se utiliza para ayudar a rellenar información de inicio de sesión en otras aplicaciones en tu dispositivo.</value>
</data> </data>
<data name="UseInlineAutofillExplanationLong" xml:space="preserve"> <data name="UseInlineAutofillExplanationLong" xml:space="preserve">
<value>Use inline autofill if your selected keyboard supports it. Otherwise, use the default overlay.</value> <value>Utilice el autocompletado en línea si tu teclado seleccionado lo soporta. De otra manera, utilice la superposición por defecto.</value>
</data> </data>
<data name="AdditionalOptions" xml:space="preserve"> <data name="AdditionalOptions" xml:space="preserve">
<value>Additional options</value> <value>Opciones adicionales</value>
</data> </data>
<data name="ContinueToWebApp" xml:space="preserve"> <data name="ContinueToWebApp" xml:space="preserve">
<value>Continue to web app?</value> <value>¿Continuar a la aplicación web?</value>
</data> </data>
<data name="ContinueToX" xml:space="preserve"> <data name="ContinueToX" xml:space="preserve">
<value>Continue to {0}?</value> <value>¿Continuar a {0}?</value>
<comment>The parameter is an URL, like bitwarden.com.</comment> <comment>The parameter is an URL, like bitwarden.com.</comment>
</data> </data>
<data name="ContinueToHelpCenter" xml:space="preserve"> <data name="ContinueToHelpCenter" xml:space="preserve">
<value>Continue to Help center?</value> <value>¿Continuar al centro de ayuda?</value>
</data> </data>
<data name="ContinueToContactSupport" xml:space="preserve"> <data name="ContinueToContactSupport" xml:space="preserve">
<value>Continue to contact support?</value> <value>¿Continuar con el servicio de asistencia?</value>
</data> </data>
<data name="ContinueToAppStore" xml:space="preserve"> <data name="ContinueToAppStore" xml:space="preserve">
<value>Continue to app store?</value> <value>¿Continuar a la App Store?</value>
</data> </data>
<data name="TwoStepLoginDescriptionLong" xml:space="preserve"> <data name="TwoStepLoginDescriptionLong" xml:space="preserve">
<value>Make your account more secure by setting up two-step login in the Bitwarden web app.</value> <value>Haz tu cuenta más segura al configurar el inicio de sesión en dos pasos en la aplicación web de Bitwarden.</value>
</data> </data>
<data name="ChangeMasterPasswordDescriptionLong" xml:space="preserve"> <data name="ChangeMasterPasswordDescriptionLong" xml:space="preserve">
<value>You can change your master password on the Bitwarden web app.</value> <value>Puedes cambiar tu contraseña maestra en la aplicación web de Bitwarden.</value>
</data> </data>
<data name="YouCanImportDataToYourVaultOnX" xml:space="preserve"> <data name="YouCanImportDataToYourVaultOnX" xml:space="preserve">
<value>You can import data to your vault on {0}.</value> <value>Puedes importar datos a tu caja fuerte en {0}.</value>
<comment>The parameter is an URL, like vault.bitwarden.com.</comment> <comment>The parameter is an URL, like vault.bitwarden.com.</comment>
</data> </data>
<data name="LearnMoreAboutHowToUseBitwardenOnTheHelpCenter" xml:space="preserve"> <data name="LearnMoreAboutHowToUseBitwardenOnTheHelpCenter" xml:space="preserve">
<value>Learn more about how to use Bitwarden on the Help center.</value> <value>Más información sobre cómo usar Bitwarden en el centro de Ayuda.</value>
</data> </data>
<data name="ContactSupportDescriptionLong" xml:space="preserve"> <data name="ContactSupportDescriptionLong" xml:space="preserve">
<value>Cant find what you are looking for? Reach out to Bitwarden support on bitwarden.com.</value> <value>¿No encuentras lo que estás buscando? Contacta con el soporte de Bitwarden en bitwarden.com.</value>
</data> </data>
<data name="ExploreMoreFeaturesOfYourBitwardenAccountOnTheWebApp" xml:space="preserve"> <data name="ExploreMoreFeaturesOfYourBitwardenAccountOnTheWebApp" xml:space="preserve">
<value>Explore more features of your Bitwarden account on the web app.</value> <value>Explora más características de tu cuenta de Bitwarden en la aplicación web.</value>
</data> </data>
<data name="LearnAboutOrganizationsDescriptionLong" xml:space="preserve"> <data name="LearnAboutOrganizationsDescriptionLong" xml:space="preserve">
<value>Bitwarden allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website.</value> <value>Bitwarden te permite compartir tus elementos de la caja fuerte con otros utilizando una organización. Más información en el sitio web de bitwarden.com.</value>
</data> </data>
<data name="RateAppDescriptionLong" xml:space="preserve"> <data name="RateAppDescriptionLong" xml:space="preserve">
<value>Help others find out if Bitwarden is right for them. Visit the app store and leave a rating now.</value> <value>Ayuda a otros a averiguar si Bitwarden es correcto para ellos. Visita la tienda de aplicaciones y deja una calificación ahora.</value>
</data> </data>
<data name="DefaultDarkThemeDescriptionLong" xml:space="preserve"> <data name="DefaultDarkThemeDescriptionLong" xml:space="preserve">
<value>Choose the dark theme to use when your devices dark mode is in use</value> <value>Elige el tema oscuro a usar cuando el modo oscuro de tu dispositivo esté en uso</value>
</data> </data>
<data name="CreatedXY" xml:space="preserve"> <data name="CreatedXY" xml:space="preserve">
<value>Creado {0}, {1}</value> <value>Creado {0}, {1}</value>
<comment>To state the date/time in which the cipher was created: Created 03/21/2023, 09:25 AM. First parameter is the date and the second parameter is the time.</comment> <comment>To state the date/time in which the cipher was created: Created 03/21/2023, 09:25 AM. First parameter is the date and the second parameter is the time.</comment>
</data> </data>
<data name="TooManyAttempts" xml:space="preserve"> <data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value> <value>Demasiados intentos</value>
</data> </data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve"> <data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value> <value>Sesión de la cuenta cerrada.</value>
</data> </data>
<data name="YourOrganizationPermissionsWereUpdatedRequeringYouToSetAMasterPassword" xml:space="preserve"> <data name="YourOrganizationPermissionsWereUpdatedRequeringYouToSetAMasterPassword" xml:space="preserve">
<value>Your organization permissions were updated, requiring you to set a master password.</value> <value>Los permisos de su organización han sido actualizados, requiriendo que establezca una contraseña maestra.</value>
</data> </data>
<data name="YourOrganizationRequiresYouToSetAMasterPassword" xml:space="preserve"> <data name="YourOrganizationRequiresYouToSetAMasterPassword" xml:space="preserve">
<value>Your organization requires you to set a master password.</value> <value>Tu organización requiere que establezcas una contraseña maestra.</value>
</data> </data>
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve"> <data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
<value>Set up an unlock option to change your vault timeout action.</value> <value>Configura una opción de desbloqueo para cambiar tu acción de tiempo de espera de tu caja fuerte.</value>
</data> </data>
</root> </root>

View File

@@ -416,10 +416,10 @@
<value>Sovelluslaajennus</value> <value>Sovelluslaajennus</value>
</data> </data>
<data name="AutofillAccessibilityDescription" xml:space="preserve"> <data name="AutofillAccessibilityDescription" xml:space="preserve">
<value>Käytä Bitwardenin esteettömyyspalvelua kirjautumistietojesi automaattiseen täyttöön sovelluksissa ja verkossa.</value> <value>Käytä Bitwardenin esteettömyyspalvelua kirjautumistietojesi automaattitäyttöön sovelluksissa ja verkossa.</value>
</data> </data>
<data name="AutofillService" xml:space="preserve"> <data name="AutofillService" xml:space="preserve">
<value>Automaattisen täytön palvelu</value> <value>Automaattitäytön palvelu</value>
</data> </data>
<data name="AvoidAmbiguousCharacters" xml:space="preserve"> <data name="AvoidAmbiguousCharacters" xml:space="preserve">
<value>Vältä epäselviä merkkejä</value> <value>Vältä epäselviä merkkejä</value>
@@ -431,13 +431,13 @@
<value>Helpoin tapa lisätä holviisi uusia kirjautumistietoja on käyttää Bitwardenin sovelluslaajennusta. "Asetukset" -osiosta löydät lisätietoja laajennuksen käytöstä.</value> <value>Helpoin tapa lisätä holviisi uusia kirjautumistietoja on käyttää Bitwardenin sovelluslaajennusta. "Asetukset" -osiosta löydät lisätietoja laajennuksen käytöstä.</value>
</data> </data>
<data name="BitwardenAppExtensionDescription" xml:space="preserve"> <data name="BitwardenAppExtensionDescription" xml:space="preserve">
<value>Käytä Bitwardenia kirjautumistietojesi automaattiseen täyttöön Safarissa ja muissa sovelluksissa.</value> <value>Käytä Bitwardenia kirjautumistietojesi automaattitäyttöön Safarissa ja muissa sovelluksissa.</value>
</data> </data>
<data name="BitwardenAutofillService" xml:space="preserve"> <data name="BitwardenAutofillService" xml:space="preserve">
<value>Bitwardenin automaattisen täytön palvelu</value> <value>Bitwardenin automaattitäytön palvelu</value>
</data> </data>
<data name="BitwardenAutofillAccessibilityServiceDescription" xml:space="preserve"> <data name="BitwardenAutofillAccessibilityServiceDescription" xml:space="preserve">
<value>Käytä Bitwardenin esteettömyyspalvelua kirjautumistietojen automaattiseen täyttöön.</value> <value>Käytä Bitwardenin esteettömyyspalvelua kirjautumistietojen automaattitäyttöön.</value>
</data> </data>
<data name="ChangeEmail" xml:space="preserve"> <data name="ChangeEmail" xml:space="preserve">
<value>Vaihda sähköpostiosoite</value> <value>Vaihda sähköpostiosoite</value>
@@ -745,10 +745,10 @@
<comment>This is used for the autofill service. ex. "There are no items in your vault for twitter.com".</comment> <comment>This is used for the autofill service. ex. "There are no items in your vault for twitter.com".</comment>
</data> </data>
<data name="BitwardenAutofillServiceOverlay" xml:space="preserve"> <data name="BitwardenAutofillServiceOverlay" xml:space="preserve">
<value>Kun valitset syöttökentän ja näet Bitwardenin ponnahdusvalinnan, voit napauttaa sitä avataksesi automaattisen täytön palvelun.</value> <value>Kun valitset syöttökentän ja näet Bitwardenin ponnahdusvalinnan, voit napauttaa sitä avataksesi automaattitäytön palvelun.</value>
</data> </data>
<data name="BitwardenAutofillServiceNotificationContent" xml:space="preserve"> <data name="BitwardenAutofillServiceNotificationContent" xml:space="preserve">
<value>Napauta tätä ilmoitusta täyttääksesi kohteen holvistasi automaattisesti.</value> <value>Automaattitäytä holvisi kohde automaattisesti napauttamalla tätä ilmoitusta.</value>
</data> </data>
<data name="BitwardenAutofillServiceOpenAccessibilitySettings" xml:space="preserve"> <data name="BitwardenAutofillServiceOpenAccessibilitySettings" xml:space="preserve">
<value>Avaa "Esteettömyys" -asetukset</value> <value>Avaa "Esteettömyys" -asetukset</value>
@@ -775,16 +775,16 @@
<value>Tila</value> <value>Tila</value>
</data> </data>
<data name="BitwardenAutofillServiceAlert2" xml:space="preserve"> <data name="BitwardenAutofillServiceAlert2" xml:space="preserve">
<value>Helpoin tapa lisätä holviisi uusia kirjautumistietoja on Bitwardenin automaattisen täytön palvelu. Asetuksista löydät lisätietoja palvelun käytöstä.</value> <value>Helpoin tapa lisätä holviisi uusia kirjautumistietoja on Bitwardenin automaattitäytön palvelu. Asetuksista löydät lisätietoja sen käytöstä.</value>
</data> </data>
<data name="Autofill" xml:space="preserve"> <data name="Autofill" xml:space="preserve">
<value>Automaattinen täyttö</value> <value>Automaattitäyttö</value>
</data> </data>
<data name="AutofillOrView" xml:space="preserve"> <data name="AutofillOrView" xml:space="preserve">
<value>Täytetäänkö automaatisesti vai näytetäänkö tiedot?</value> <value>Haluatko automaattitäyttää vai tarkastella kohdetta?</value>
</data> </data>
<data name="BitwardenAutofillServiceMatchConfirm" xml:space="preserve"> <data name="BitwardenAutofillServiceMatchConfirm" xml:space="preserve">
<value>Haluatko varmasti täyttää automaattisesti tällä kohteella? Se ei täsmää täysin osoitteen "{0}" kanssa.</value> <value>Haluatko varmasti automaattitäyttää tällä kohteella? Se ei ole täysin osoitetta "{0}" vastaava.</value>
</data> </data>
<data name="MatchingItems" xml:space="preserve"> <data name="MatchingItems" xml:space="preserve">
<value>Tunnistetut kohteet</value> <value>Tunnistetut kohteet</value>
@@ -796,7 +796,7 @@
<value>Etsi</value> <value>Etsi</value>
</data> </data>
<data name="BitwardenAutofillServiceSearch" xml:space="preserve"> <data name="BitwardenAutofillServiceSearch" xml:space="preserve">
<value>Etsit automaattisesti täytettävää kohdetta osoitteelle ”{0}”.</value> <value>Etsit automaattitäyttöön kohdetta osoitteelle ”{0}”.</value>
</data> </data>
<data name="LearnOrg" xml:space="preserve"> <data name="LearnOrg" xml:space="preserve">
<value>Lisätietoja organisaatioista</value> <value>Lisätietoja organisaatioista</value>
@@ -907,7 +907,7 @@ Koodi skannataan automaattisesti.</value>
<value>Kopioi TOTP-todennuskoodi</value> <value>Kopioi TOTP-todennuskoodi</value>
</data> </data>
<data name="CopyTotpAutomaticallyDescription" xml:space="preserve"> <data name="CopyTotpAutomaticallyDescription" xml:space="preserve">
<value>Jos kirjautumistieto sisältää kaksivaiheisen TOTP-todennusavaimen, kopioidaan todennuskoodi automaattisesti leikepöydälle automaattisen täytön yhteydessä.</value> <value>Jos kirjautumistieto sisältää kaksivaiheisen TOTP-todennusavaimen, kopioidaan todennuskoodi automaattitäytön yhteydessä automaattisesti leikepöydälle.</value>
</data> </data>
<data name="CopyTotpAutomatically" xml:space="preserve"> <data name="CopyTotpAutomatically" xml:space="preserve">
<value>TOTP-koodin kopiointi</value> <value>TOTP-koodin kopiointi</value>
@@ -1143,7 +1143,7 @@ Koodi skannataan automaattisesti.</value>
<value>Kuvakepalvelimen URL</value> <value>Kuvakepalvelimen URL</value>
</data> </data>
<data name="AutofillWithBitwarden" xml:space="preserve"> <data name="AutofillWithBitwarden" xml:space="preserve">
<value>Täytä automaattisesti Bitwardenilla</value> <value>Automaattitäytä Bitwardenilla</value>
</data> </data>
<data name="VaultIsLocked" xml:space="preserve"> <data name="VaultIsLocked" xml:space="preserve">
<value>Holvi on lukittu</value> <value>Holvi on lukittu</value>
@@ -1164,13 +1164,13 @@ Koodi skannataan automaattisesti.</value>
<value>Roskakorissa ei ole kohteita.</value> <value>Roskakorissa ei ole kohteita.</value>
</data> </data>
<data name="AutofillAccessibilityService" xml:space="preserve"> <data name="AutofillAccessibilityService" xml:space="preserve">
<value>Automaattisen täytön esteettömyyspalvelu</value> <value>Automaattitäytön esteettömyyspalvelu</value>
</data> </data>
<data name="AutofillServiceDescription" xml:space="preserve"> <data name="AutofillServiceDescription" xml:space="preserve">
<value>Bitwardenin automaattisen täytön palvelu käyttää Android Autofill Framework -rajapintaa kirjautumistietojen täyttöön laitteen sovelluksissa.</value> <value>Bitwardenin automaattitäytön palvelu käyttää Android Autofill Framework -rajapintaa kirjautumistietojen täyttöön laitteen sovelluksissa.</value>
</data> </data>
<data name="BitwardenAutofillServiceDescription" xml:space="preserve"> <data name="BitwardenAutofillServiceDescription" xml:space="preserve">
<value>Käytä Bitwardenin automaattisen täytön palvelua kirjautumistietojen täyttöön sovelluksissa.</value> <value>Käytä Bitwardenin automaattitäytön palvelua kirjautumistietojen täyttöön sovelluksissa.</value>
</data> </data>
<data name="BitwardenAutofillServiceOpenAutofillSettings" xml:space="preserve"> <data name="BitwardenAutofillServiceOpenAutofillSettings" xml:space="preserve">
<value>Avaa "Automaattinen täyttö -palvelu" -asetukset</value> <value>Avaa "Automaattinen täyttö -palvelu" -asetukset</value>
@@ -1256,7 +1256,7 @@ Koodi skannataan automaattisesti.</value>
<value>Kyllä, ja tallenna</value> <value>Kyllä, ja tallenna</value>
</data> </data>
<data name="AutofillAndSave" xml:space="preserve"> <data name="AutofillAndSave" xml:space="preserve">
<value>Täytä automaattisesti ja tallenna</value> <value>Automaattitäytä ja tallenna</value>
</data> </data>
<data name="Organization" xml:space="preserve"> <data name="Organization" xml:space="preserve">
<value>Organisaatio</value> <value>Organisaatio</value>
@@ -1272,7 +1272,7 @@ Koodi skannataan automaattisesti.</value>
<value>Jatka pitämällä YubiKey NEO -todennuslaitetta laitteen taustaa vasten.</value> <value>Jatka pitämällä YubiKey NEO -todennuslaitetta laitteen taustaa vasten.</value>
</data> </data>
<data name="BitwardenAutofillAccessibilityServiceDescription2" xml:space="preserve"> <data name="BitwardenAutofillAccessibilityServiceDescription2" xml:space="preserve">
<value>Esteettömyyspalvelu voi olla hyödyllinen sellaisten sovellusten kanssa, jotka eivät tue tavallista automaattisen täytön palvelua.</value> <value>Esteettömyyspalvelu voi olla hyödyllinen sellaisten sovellusten kanssa, jotka eivät tue tavallista automaattitäytön palvelua.</value>
</data> </data>
<data name="DatePasswordUpdated" xml:space="preserve"> <data name="DatePasswordUpdated" xml:space="preserve">
<value>Salasana vaihdettiin</value> <value>Salasana vaihdettiin</value>
@@ -1298,7 +1298,7 @@ Koodi skannataan automaattisesti.</value>
<value>Käytä holviasi suoraan näppäimistöltä nopeaa salasanojen automaattista täyttöä varten.</value> <value>Käytä holviasi suoraan näppäimistöltä nopeaa salasanojen automaattista täyttöä varten.</value>
</data> </data>
<data name="AutofillTurnOn" xml:space="preserve"> <data name="AutofillTurnOn" xml:space="preserve">
<value>Ota salasanojen automaattinen täyttö laitteellasi käyttöön seuraavilla ohjeilla:</value> <value>Ota salasanojen automaattitäyttö käyttöön laitteellasi seuraavilla ohjeilla:</value>
</data> </data>
<data name="AutofillTurnOn1" xml:space="preserve"> <data name="AutofillTurnOn1" xml:space="preserve">
<value>1. Siirry iOS:n "Asetukset" -sovellukseen</value> <value>1. Siirry iOS:n "Asetukset" -sovellukseen</value>
@@ -1316,7 +1316,7 @@ Koodi skannataan automaattisesti.</value>
<value>5. Valitse "Bitwarden"</value> <value>5. Valitse "Bitwarden"</value>
</data> </data>
<data name="PasswordAutofill" xml:space="preserve"> <data name="PasswordAutofill" xml:space="preserve">
<value>Salasanojen automaattinen täyttö</value> <value>Salasanojen automaattitäyttö</value>
</data> </data>
<data name="BitwardenAutofillAlert2" xml:space="preserve"> <data name="BitwardenAutofillAlert2" xml:space="preserve">
<value>Helpoin tapa lisätä uusia kirjautumistietoja holviisi on Bitwardenin automaattisen täytön laajennus. Asetuksista löydät lisätietoja laajennuksen käytöstä.</value> <value>Helpoin tapa lisätä uusia kirjautumistietoja holviisi on Bitwardenin automaattisen täytön laajennus. Asetuksista löydät lisätietoja laajennuksen käytöstä.</value>
@@ -1530,11 +1530,11 @@ Koodi skannataan automaattisesti.</value>
<comment>Clipboard is the operating system thing where you copy/paste data to on your device.</comment> <comment>Clipboard is the operating system thing where you copy/paste data to on your device.</comment>
</data> </data>
<data name="DefaultUriMatchDetection" xml:space="preserve"> <data name="DefaultUriMatchDetection" xml:space="preserve">
<value>URI:n tunnistuksen oletustapa</value> <value>URI:n oletuarvoinen tunnistustapa</value>
<comment>Default URI match detection for auto-fill.</comment> <comment>Default URI match detection for auto-fill.</comment>
</data> </data>
<data name="DefaultUriMatchDetectionDescription" xml:space="preserve"> <data name="DefaultUriMatchDetectionDescription" xml:space="preserve">
<value>Valitse oletustapa, jolla kirjautumistietojen URI tunnistetaan kun suoritetaan toimintoja kuten automaattinen täyttö.</value> <value>Valitse kirjautumistietojen URI:en oletusarvoinen tunnistustapa suoritettaessa automaattitäytön kaltaisia toimintoja.</value>
</data> </data>
<data name="Theme" xml:space="preserve"> <data name="Theme" xml:space="preserve">
<value>Teema</value> <value>Teema</value>
@@ -1586,7 +1586,7 @@ Koodi skannataan automaattisesti.</value>
<value>Kun sovellus käynnistetään uudelleen</value> <value>Kun sovellus käynnistetään uudelleen</value>
</data> </data>
<data name="AutofillServiceNotEnabled" xml:space="preserve"> <data name="AutofillServiceNotEnabled" xml:space="preserve">
<value>Automaattinen täyttö tekee Bitwarden-holvisi käytöstä sivustoilla ja muissa sovelluksissa helppoa. Näyttää siltä, ettei Bitwardenille ole määritetty automaattisen täytön palvelua. Määritys onnistuu "Asetukset" -ruudusta.</value> <value>Automaattitäytön avulla Bitwarden-holviasi on helppo käyttää sivustoilla ja muissa sovelluksissa. Näyttää siltä, ettei Bitwardenia ole määritetty automaattitäytön palveluksi. Määritys onnistuu "Asetukset"-ruudusta.</value>
</data> </data>
<data name="ThemeAppliedOnRestart" xml:space="preserve"> <data name="ThemeAppliedOnRestart" xml:space="preserve">
<value>Teema vaihtuu kun sovellus käynnistetään uudelleen.</value> <value>Teema vaihtuu kun sovellus käynnistetään uudelleen.</value>
@@ -1620,7 +1620,7 @@ Koodi skannataan automaattisesti.</value>
<value>Avaa biometrialla</value> <value>Avaa biometrialla</value>
</data> </data>
<data name="AccessibilityOverlayPermissionAlert" xml:space="preserve"> <data name="AccessibilityOverlayPermissionAlert" xml:space="preserve">
<value>Bitwarden vaatii huomiota - Katso Bitwardenin asetuksista "Automaattisen täytön esteettömyyspalvelu"</value> <value>Bitwarden vaatii huomiota - Katso Bitwardenin asetuksista "Automaattitäytön esteettömyyspalvelu"</value>
</data> </data>
<data name="BitwardenAutofillServiceOverlayPermission" xml:space="preserve"> <data name="BitwardenAutofillServiceOverlayPermission" xml:space="preserve">
<value>3. Siirry Android-sovellusasetuksien Bitwarden-ruudulta "Näkyminen muiden päällä" -asetukseen (lisäasetusten alla) ja ota ominaisuus kytkinvalinnasta käyttöön.</value> <value>3. Siirry Android-sovellusasetuksien Bitwarden-ruudulta "Näkyminen muiden päällä" -asetukseen (lisäasetusten alla) ja ota ominaisuus kytkinvalinnasta käyttöön.</value>
@@ -1695,7 +1695,7 @@ Koodi skannataan automaattisesti.</value>
<value>Tiedostoliite tallennettiin</value> <value>Tiedostoliite tallennettiin</value>
</data> </data>
<data name="AutofillTileAccessibilityRequired" xml:space="preserve"> <data name="AutofillTileAccessibilityRequired" xml:space="preserve">
<value>Ota "Automaattisen täytön esteettömyyspalvelu" käyttöön Bitwardenin asetuksista käyttääksesi automaattisen täytön pikavalintapalkkia.</value> <value>Ota "Automaattitäytön esteettömyyspalvelu" käyttöön Bitwardenin asetuksista käyttääksesi automaattitäytön pikavalintapalkkia.</value>
</data> </data>
<data name="AutofillTileUriNotFound" xml:space="preserve"> <data name="AutofillTileUriNotFound" xml:space="preserve">
<value>Salasanakenttiä ei havaittu</value> <value>Salasanakenttiä ei havaittu</value>
@@ -1814,10 +1814,10 @@ Koodi skannataan automaattisesti.</value>
<value>Tietosuojakäytäntö</value> <value>Tietosuojakäytäntö</value>
</data> </data>
<data name="AccessibilityDrawOverPermissionAlert" xml:space="preserve"> <data name="AccessibilityDrawOverPermissionAlert" xml:space="preserve">
<value>Bitwarden edellyttää toimenpiteitä - Kytke "Näkyminen muiden päällä" -asetus käyttöön Bitwardenin asetusten kohdasta "Automaattisen täytön palvelut"</value> <value>Bitwarden edellyttää toimenpiteitä - Kytke "Näkyminen muiden päällä" -asetus käyttöön Bitwardenin asetusten kohdasta "Automaattitäytön palvelut"</value>
</data> </data>
<data name="AutofillServices" xml:space="preserve"> <data name="AutofillServices" xml:space="preserve">
<value>Automaattisen täytön palvelut</value> <value>Automaattitäytön palvelut</value>
</data> </data>
<data name="InlineAutofill" xml:space="preserve"> <data name="InlineAutofill" xml:space="preserve">
<value>Tekstinsisäinen täyttö</value> <value>Tekstinsisäinen täyttö</value>
@@ -1829,10 +1829,10 @@ Koodi skannataan automaattisesti.</value>
<value>Esteettömyyspalvelu</value> <value>Esteettömyyspalvelu</value>
</data> </data>
<data name="AccessibilityDescription" xml:space="preserve"> <data name="AccessibilityDescription" xml:space="preserve">
<value>Käytä Bitwardenin esteettömyyspalvelua kirjautumistietojen automaattiseen täyttöön sovelluksissa ja verkkosivustoilla. Kun määritetty, näytetään aktiivisten kirjautumiskenttien ohessa pikavalintapalkki.</value> <value>Käytä Bitwardenin esteettömyyspalvelua kirjautumistietojen automaattitäyttöön sovelluksissa ja verkkosivustoilla. Kun määritetty, näytetään aktiivisten kirjautumiskenttien ohessa pikavalintapalkki.</value>
</data> </data>
<data name="AccessibilityDescription2" xml:space="preserve"> <data name="AccessibilityDescription2" xml:space="preserve">
<value>Käytä Bitwardenin esteettömyyspalvelua kirjautumistietojen automaattiseen täyttöön sovelluksissa ja verkkosivustoilla (myös "Näkyminen muiden päällä" -asetuksen on oltava käytössä).</value> <value>Käytä Bitwardenin esteettömyyspalvelua kirjautumistietojen automaattitäyttöön sovelluksissa ja verkkosivustoilla (myös "Näkyminen muiden päällä" -asetuksen on oltava käytössä).</value>
</data> </data>
<data name="AccessibilityDescription3" xml:space="preserve"> <data name="AccessibilityDescription3" xml:space="preserve">
<value>Käytä Bitwardenin esteettömyyspalvelua käyttääksesi Automaattisen täytön pikavalintapalkkia ja/tai näytä palkki käyttäen "Näkyminen muiden päällä" -asetusta.</value> <value>Käytä Bitwardenin esteettömyyspalvelua käyttääksesi Automaattisen täytön pikavalintapalkkia ja/tai näytä palkki käyttäen "Näkyminen muiden päällä" -asetusta.</value>
@@ -1847,7 +1847,7 @@ Koodi skannataan automaattisesti.</value>
<value>Sallii Bitwardenin esteettömyyspalvelun näyttää pikavalintapalkin aktiivisten kirjautumiskenttien ohessa.</value> <value>Sallii Bitwardenin esteettömyyspalvelun näyttää pikavalintapalkin aktiivisten kirjautumiskenttien ohessa.</value>
</data> </data>
<data name="DrawOverDescription2" xml:space="preserve"> <data name="DrawOverDescription2" xml:space="preserve">
<value>Kun käytössä, Bitwardenin esteettömyyspalvelu näyttää aktiivisten kirjautumiskenttien ohessa pikavalintapalkin helpottaakseen kirjautumistietojen automaattista täyttöä.</value> <value>Kun käytössä, Bitwardenin esteettömyyspalvelu näyttää aktiivisten kirjautumiskenttien ohessa pikavalintapalkin helpottaakseen kirjautumistietojen automaattitäyttöä.</value>
</data> </data>
<data name="DrawOverDescription3" xml:space="preserve"> <data name="DrawOverDescription3" xml:space="preserve">
<value>Jos käytössä, esteettömyyspalvelu näyttää pikavalintapalkin laajentaakseen automaattisen täytön palvelun toiminnan kattamaan myös vanhemmat sovellukset, jotka eivät tue Android Autofill Framework -rajapintaa.</value> <value>Jos käytössä, esteettömyyspalvelu näyttää pikavalintapalkin laajentaakseen automaattisen täytön palvelun toiminnan kattamaan myös vanhemmat sovellukset, jotka eivät tue Android Autofill Framework -rajapintaa.</value>
@@ -2426,7 +2426,7 @@ turvallisesti valitsemalla "Lisää TOTP"</value>
<comment>"Fastmail" is the product name and should not be translated.</comment> <comment>"Fastmail" is the product name and should not be translated.</comment>
</data> </data>
<data name="ForwardEmail" xml:space="preserve"> <data name="ForwardEmail" xml:space="preserve">
<value>ForwardEmail</value> <value>Forward Email</value>
<comment>"ForwardEmail" is the product name and should not be translated.</comment> <comment>"ForwardEmail" is the product name and should not be translated.</comment>
</data> </data>
<data name="APIAccessToken" xml:space="preserve"> <data name="APIAccessToken" xml:space="preserve">
@@ -2696,10 +2696,10 @@ Haluatko vaihtaa tähän tiliin?</value>
<value>Holvin aikakatkaisutoiminnoksi vaihdettiin uloskirjaus</value> <value>Holvin aikakatkaisutoiminnoksi vaihdettiin uloskirjaus</value>
</data> </data>
<data name="BlockAutoFill" xml:space="preserve"> <data name="BlockAutoFill" xml:space="preserve">
<value>Estä automaattinen täyttö</value> <value>Estä automaattitäyttö</value>
</data> </data>
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve"> <data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
<value>Automaattista täyttöä ei tarjota näille URI-osoitteille.</value> <value>Automaattitäyttöä ei tarjota näille URI-osoitteille.</value>
</data> </data>
<data name="NewBlockedURI" xml:space="preserve"> <data name="NewBlockedURI" xml:space="preserve">
<value>Uusi estetty URI</value> <value>Uusi estetty URI</value>

View File

@@ -121,14 +121,14 @@
<value>हमारे बारे में</value> <value>हमारे बारे में</value>
</data> </data>
<data name="Add" xml:space="preserve"> <data name="Add" xml:space="preserve">
<value>जोड़ें</value> <value>बनाएं</value>
<comment>Add/create a new entity (verb).</comment> <comment>Add/create a new entity (verb).</comment>
</data> </data>
<data name="AddFolder" xml:space="preserve"> <data name="AddFolder" xml:space="preserve">
<value>फोल्डर जोड़ें</value> <value>फोल्डर बनाएं</value>
</data> </data>
<data name="AddItem" xml:space="preserve"> <data name="AddItem" xml:space="preserve">
<value>चीज़ जोड़ें</value> <value>आइटम बनाएं</value>
<comment>The title for the add item page.</comment> <comment>The title for the add item page.</comment>
</data> </data>
<data name="AnErrorHasOccurred" xml:space="preserve"> <data name="AnErrorHasOccurred" xml:space="preserve">
@@ -144,7 +144,7 @@
<comment>App name. Shouldn't ever change.</comment> <comment>App name. Shouldn't ever change.</comment>
</data> </data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>रद्द करें</value> <value>कैंसिल करें</value>
<comment>Cancel an operation.</comment> <comment>Cancel an operation.</comment>
</data> </data>
<data name="Copy" xml:space="preserve"> <data name="Copy" xml:space="preserve">
@@ -156,7 +156,7 @@
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment> <comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
</data> </data>
<data name="CopyUsername" xml:space="preserve"> <data name="CopyUsername" xml:space="preserve">
<value>यूज़रनम कॉपी करें</value> <value>यूज़रनम कॉपी करें</value>
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment> <comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
</data> </data>
<data name="Credits" xml:space="preserve"> <data name="Credits" xml:space="preserve">
@@ -164,22 +164,22 @@
<comment>Title for page that we use to give credit to resources that we use.</comment> <comment>Title for page that we use to give credit to resources that we use.</comment>
</data> </data>
<data name="Delete" xml:space="preserve"> <data name="Delete" xml:space="preserve">
<value>मिटाएं</value> <value>टाएं</value>
<comment>Delete an entity (verb).</comment> <comment>Delete an entity (verb).</comment>
</data> </data>
<data name="Deleting" xml:space="preserve"> <data name="Deleting" xml:space="preserve">
<value>मिटा रहे है...</value> <value>टा रहे है...</value>
<comment>Message shown when interacting with the server</comment> <comment>Message shown when interacting with the server</comment>
</data> </data>
<data name="DoYouReallyWantToDelete" xml:space="preserve"> <data name="DoYouReallyWantToDelete" xml:space="preserve">
<value>पक्का मिटाएं? इसे अंडू नहीं किया जा सकता।</value> <value>पक्का टाएं? इसे अंडू नहीं किया जा सकता।</value>
<comment>Confirmation alert message when deleteing something.</comment> <comment>Confirmation alert message when deleteing something.</comment>
</data> </data>
<data name="Edit" xml:space="preserve"> <data name="Edit" xml:space="preserve">
<value>बदलाव करें</value> <value>बदलें</value>
</data> </data>
<data name="EditFolder" xml:space="preserve"> <data name="EditFolder" xml:space="preserve">
<value>फोल्डर बदलाव करें</value> <value>फोल्डर बदलें</value>
</data> </data>
<data name="Email" xml:space="preserve"> <data name="Email" xml:space="preserve">
<value>ईमेल</value> <value>ईमेल</value>
@@ -206,10 +206,10 @@
<value>बग रिपोर्ट भेजें</value> <value>बग रिपोर्ट भेजें</value>
</data> </data>
<data name="FileBugReportDescription" xml:space="preserve"> <data name="FileBugReportDescription" xml:space="preserve">
<value>हमारे गिटहब रिपॉज़िटरी में समस्या बताएं।</value> <value>हमारे गिटहब रिपॉज़िटरी में दिक्कत बताएं।</value>
</data> </data>
<data name="FingerprintDirection" xml:space="preserve"> <data name="FingerprintDirection" xml:space="preserve">
<value>फिंगरप्रिंट से सत्यापन करें।</value> <value>फिंगरप्रिंट से खोलें।</value>
</data> </data>
<data name="Folder" xml:space="preserve"> <data name="Folder" xml:space="preserve">
<value>फोल्डर</value> <value>फोल्डर</value>
@@ -219,7 +219,7 @@
<value>नया फोल्डर बनाया गया।</value> <value>नया फोल्डर बनाया गया।</value>
</data> </data>
<data name="FolderDeleted" xml:space="preserve"> <data name="FolderDeleted" xml:space="preserve">
<value>फोल्डर मिटाया गया।</value> <value>फोल्डर टाया गया।</value>
</data> </data>
<data name="FolderNone" xml:space="preserve"> <data name="FolderNone" xml:space="preserve">
<value>कोई फोल्डर नहीं है</value> <value>कोई फोल्डर नहीं है</value>
@@ -243,7 +243,7 @@
<comment>Hide a secret value that is currently shown (password).</comment> <comment>Hide a secret value that is currently shown (password).</comment>
</data> </data>
<data name="InternetConnectionRequiredMessage" xml:space="preserve"> <data name="InternetConnectionRequiredMessage" xml:space="preserve">
<value>जारी रखने से पहले इंटरनेट से जुड़ें।</value> <value>आगे बढ़ने से पहले इंटरनेट से कनेक्ट करें।</value>
<comment>Description message for the alert when internet connection is required to continue.</comment> <comment>Description message for the alert when internet connection is required to continue.</comment>
</data> </data>
<data name="InternetConnectionRequiredTitle" xml:space="preserve"> <data name="InternetConnectionRequiredTitle" xml:space="preserve">
@@ -251,7 +251,7 @@
<comment>Title for the alert when internet connection is required to continue.</comment> <comment>Title for the alert when internet connection is required to continue.</comment>
</data> </data>
<data name="InvalidMasterPassword" xml:space="preserve"> <data name="InvalidMasterPassword" xml:space="preserve">
<value>मुख्य पासवर्ड गलत है। वापस कोशिश करें।</value> <value>मास्टर पासवर्ड गलत है। वापस कोशिश करें।</value>
</data> </data>
<data name="InvalidPIN" xml:space="preserve"> <data name="InvalidPIN" xml:space="preserve">
<value>पिन गलत है। वापस कोशिश करें।</value> <value>पिन गलत है। वापस कोशिश करें।</value>
@@ -265,7 +265,7 @@
<comment>The login button text (verb).</comment> <comment>The login button text (verb).</comment>
</data> </data>
<data name="LogInNoun" xml:space="preserve"> <data name="LogInNoun" xml:space="preserve">
<value>लॉगइन करें</value> <value>लॉगइन</value>
<comment>Title for login page. (noun)</comment> <comment>Title for login page. (noun)</comment>
</data> </data>
<data name="LogOut" xml:space="preserve"> <data name="LogOut" xml:space="preserve">
@@ -276,19 +276,19 @@
<value>पक्का लॉगआउट करें?</value> <value>पक्का लॉगआउट करें?</value>
</data> </data>
<data name="RemoveAccount" xml:space="preserve"> <data name="RemoveAccount" xml:space="preserve">
<value>खाता हटाएं</value> <value>अकाउंट हटाएं</value>
</data> </data>
<data name="RemoveAccountConfirmation" xml:space="preserve"> <data name="RemoveAccountConfirmation" xml:space="preserve">
<value>पक्का खाता हटाएं?</value> <value>अकाउंट पक्का हटाएं?</value>
</data> </data>
<data name="AccountAlreadyAdded" xml:space="preserve"> <data name="AccountAlreadyAdded" xml:space="preserve">
<value>खाता पहले से जोड़ा गया</value> <value>अकाउंट पहले से है</value>
</data> </data>
<data name="SwitchToAlreadyAddedAccountConfirmation" xml:space="preserve"> <data name="SwitchToAlreadyAddedAccountConfirmation" xml:space="preserve">
<value>खाता अभी इस्तेमाल करें?</value> <value>अकाउंट अभी इस्तेमाल करें?</value>
</data> </data>
<data name="MasterPassword" xml:space="preserve"> <data name="MasterPassword" xml:space="preserve">
<value>मुख्य पासवर्ड</value> <value>मास्टर पासवर्ड</value>
<comment>Label for a master password.</comment> <comment>Label for a master password.</comment>
</data> </data>
<data name="More" xml:space="preserve"> <data name="More" xml:space="preserve">
@@ -296,11 +296,11 @@
<comment>Text to define that there are more options things to see.</comment> <comment>Text to define that there are more options things to see.</comment>
</data> </data>
<data name="MyVault" xml:space="preserve"> <data name="MyVault" xml:space="preserve">
<value>मेर तिजोरी</value> <value>मेर तिजोरी</value>
<comment>The title for the vault page.</comment> <comment>The title for the vault page.</comment>
</data> </data>
<data name="Authenticator" xml:space="preserve"> <data name="Authenticator" xml:space="preserve">
<value>सत्यापन करनेवाला</value> <value>ऑथेंटिकेटर</value>
<comment>Authenticator TOTP feature</comment> <comment>Authenticator TOTP feature</comment>
</data> </data>
<data name="Name" xml:space="preserve"> <data name="Name" xml:space="preserve">
@@ -327,7 +327,7 @@
<comment>Button text for a save operation (verb).</comment> <comment>Button text for a save operation (verb).</comment>
</data> </data>
<data name="Move" xml:space="preserve"> <data name="Move" xml:space="preserve">
<value>ले जाएं</value> <value>ट्रांस्फर करें</value>
</data> </data>
<data name="Saving" xml:space="preserve"> <data name="Saving" xml:space="preserve">
<value>सेव कर रहे है...</value> <value>सेव कर रहे है...</value>
@@ -342,21 +342,21 @@
<comment>Reveal a hidden value (password).</comment> <comment>Reveal a hidden value (password).</comment>
</data> </data>
<data name="ItemDeleted" xml:space="preserve"> <data name="ItemDeleted" xml:space="preserve">
<value>चीज़ मिटाया गया</value> <value>आइटम हटाया गया</value>
<comment>Confirmation message after successfully deleting a login.</comment> <comment>Confirmation message after successfully deleting a login.</comment>
</data> </data>
<data name="Submit" xml:space="preserve"> <data name="Submit" xml:space="preserve">
<value>जमा करें</value> <value>भेजें</value>
</data> </data>
<data name="Sync" xml:space="preserve"> <data name="Sync" xml:space="preserve">
<value>सिंक</value> <value>सिंक</value>
<comment>The title for the sync page.</comment> <comment>The title for the sync page.</comment>
</data> </data>
<data name="ThankYou" xml:space="preserve"> <data name="ThankYou" xml:space="preserve">
<value>शुक्रिया</value> <value>थैंक यू</value>
</data> </data>
<data name="Tools" xml:space="preserve"> <data name="Tools" xml:space="preserve">
<value>औज़ार</value> <value>टूल्स</value>
<comment>The title for the tools page.</comment> <comment>The title for the tools page.</comment>
</data> </data>
<data name="URI" xml:space="preserve"> <data name="URI" xml:space="preserve">
@@ -367,11 +367,11 @@
<value>फिंगरप्रिंट से खोलें</value> <value>फिंगरप्रिंट से खोलें</value>
</data> </data>
<data name="Username" xml:space="preserve"> <data name="Username" xml:space="preserve">
<value>यूज़रनम</value> <value>यूज़रनम</value>
<comment>Label for a username.</comment> <comment>Label for a username.</comment>
</data> </data>
<data name="ValidationFieldRequired" xml:space="preserve"> <data name="ValidationFieldRequired" xml:space="preserve">
<value>{0} फील्ड चाहिए।</value> <value>{0} चाहिए।</value>
<comment>Validation message for when a form field is left blank and is required to be entered.</comment> <comment>Validation message for when a form field is left blank and is required to be entered.</comment>
</data> </data>
<data name="ValueHasBeenCopied" xml:space="preserve"> <data name="ValueHasBeenCopied" xml:space="preserve">
@@ -379,13 +379,13 @@
<comment>Confirmation message after successfully copying a value to the clipboard.</comment> <comment>Confirmation message after successfully copying a value to the clipboard.</comment>
</data> </data>
<data name="VerifyFingerprint" xml:space="preserve"> <data name="VerifyFingerprint" xml:space="preserve">
<value>फिंगरप्रिंट सत्यापित करें</value> <value>फिंगरप्रिंट ें</value>
</data> </data>
<data name="VerifyMasterPassword" xml:space="preserve"> <data name="VerifyMasterPassword" xml:space="preserve">
<value>मुख्य पासवर्ड सत्यापित करें</value> <value>मास्टर पासवर्ड ें</value>
</data> </data>
<data name="VerifyPIN" xml:space="preserve"> <data name="VerifyPIN" xml:space="preserve">
<value>पिन सत्यापित करें</value> <value>पिन ें</value>
</data> </data>
<data name="Version" xml:space="preserve"> <data name="Version" xml:space="preserve">
<value>संस्करण</value> <value>संस्करण</value>
@@ -404,40 +404,40 @@
<value>हां</value> <value>हां</value>
</data> </data>
<data name="Account" xml:space="preserve"> <data name="Account" xml:space="preserve">
<value>खाता</value> <value>अकाउंट</value>
</data> </data>
<data name="AccountCreated" xml:space="preserve"> <data name="AccountCreated" xml:space="preserve">
<value>आपका नया खाता बनाया गया! अब लॉगइन कर सकते हैं।</value> <value>आपका नया अकाउंट बनाया गया! अब लॉगइन कर सकते हैं।</value>
</data> </data>
<data name="AddAnItem" xml:space="preserve"> <data name="AddAnItem" xml:space="preserve">
<value>चीज़ जोड़ें</value> <value>आइटम बनाएं</value>
</data> </data>
<data name="AppExtension" xml:space="preserve"> <data name="AppExtension" xml:space="preserve">
<value>ऐप एक्सटेंशन</value> <value>ऐप एक्सटेंशन</value>
</data> </data>
<data name="AutofillAccessibilityDescription" xml:space="preserve"> <data name="AutofillAccessibilityDescription" xml:space="preserve">
<value>दूसरे ऐप और वेबसाइट पर अपनेआप लॉगइन रने के लिए बिटवार्डन सुलभता सेवा इस्तेमाल करें।</value> <value>दूसरे ऐप और वेबसाइट पर अपनेआप लॉगइन रने के लिए बिटवार्डन एक्सेसिबिलिटी सर्विस इस्तेमाल करें।</value>
</data> </data>
<data name="AutofillService" xml:space="preserve"> <data name="AutofillService" xml:space="preserve">
<value>अपनेआप-भर सेवा</value> <value>ऑटो-फिल सर्विस</value>
</data> </data>
<data name="AvoidAmbiguousCharacters" xml:space="preserve"> <data name="AvoidAmbiguousCharacters" xml:space="preserve">
<value>अस्पष्ट अक्षर से बचें</value> <value>कई मतलबवाले अक्षर ना इस्तेमाल करें</value>
</data> </data>
<data name="BitwardenAppExtension" xml:space="preserve"> <data name="BitwardenAppExtension" xml:space="preserve">
<value>बिटवार्डन ऐप एक्सटेंशन</value> <value>बिटवार्डन ऐप एक्सटेंशन</value>
</data> </data>
<data name="BitwardenAppExtensionAlert2" xml:space="preserve"> <data name="BitwardenAppExtensionAlert2" xml:space="preserve">
<value>बिटवार्डन ऐप एक्सटेंशन तिजोरी में नए चीज़ डालने का सबसे आसात तरीका है। बिटवार्डन ऐप एक्सटेंशन के इस्तेमाल से जुड़ी जानकारी लेने के लिए "सेटिंग" में जाएं।</value> <value>बिटवार्डन ऐप एक्सटेंशन तिजोरी में नए आइटम डालने का सबसे आसात तरीका है। बिटवार्डन ऐप एक्सटेंशन के इस्तेमाल से जुड़ी जानकारी लेने के लिए "सेटिंग" में जाएं।</value>
</data> </data>
<data name="BitwardenAppExtensionDescription" xml:space="preserve"> <data name="BitwardenAppExtensionDescription" xml:space="preserve">
<value>सफारी और दूसरे ऐप में अपने लॉगइन अपनेआप भरने के लिए बिटवार्डन इस्तेमाल करें।</value> <value>सफारी और दूसरे ऐप में अपनेआप लॉगइन रने के लिए बिटवार्डन इस्तेमाल करें।</value>
</data> </data>
<data name="BitwardenAutofillService" xml:space="preserve"> <data name="BitwardenAutofillService" xml:space="preserve">
<value>बिटवार्डन अपनेआप-भर सेवा</value> <value>बिटवार्डन ऑटो-फिल सर्विस</value>
</data> </data>
<data name="BitwardenAutofillAccessibilityServiceDescription" xml:space="preserve"> <data name="BitwardenAutofillAccessibilityServiceDescription" xml:space="preserve">
<value>अपने लॉगइन अपनेआप भरने के लिए बिटवार्डन सुलभता सेवा इस्तेमाल करें।</value> <value>अपनेआप लॉगइन रने के लिए बिटवार्डन एक्सेसिबिलिटी सर्विस इस्तेमाल करें।</value>
</data> </data>
<data name="ChangeEmail" xml:space="preserve"> <data name="ChangeEmail" xml:space="preserve">
<value>ईमेल बदलें</value> <value>ईमेल बदलें</value>
@@ -446,41 +446,41 @@
<value>Bitwarden.com वेब तिजोरी पर ईमेल पता बदला जा सकता है। इस वेबसाइट पर अभी जाएं?</value> <value>Bitwarden.com वेब तिजोरी पर ईमेल पता बदला जा सकता है। इस वेबसाइट पर अभी जाएं?</value>
</data> </data>
<data name="ChangeMasterPassword" xml:space="preserve"> <data name="ChangeMasterPassword" xml:space="preserve">
<value>मुख्य पासवर्ड बदलें</value> <value>मास्टर पासवर्ड बदलें</value>
</data> </data>
<data name="Close" xml:space="preserve"> <data name="Close" xml:space="preserve">
<value>बंद करें</value> <value>बंद करें</value>
</data> </data>
<data name="Continue" xml:space="preserve"> <data name="Continue" xml:space="preserve">
<value>जारी रखें</value> <value>आगे बढ़ें</value>
</data> </data>
<data name="CreateAccount" xml:space="preserve"> <data name="CreateAccount" xml:space="preserve">
<value>खाता बनाएं</value> <value>अकाउंट बनाएं</value>
</data> </data>
<data name="CreatingAccount" xml:space="preserve"> <data name="CreatingAccount" xml:space="preserve">
<value>खाता बना रहे है...</value> <value>अकाउंट बना रहे है...</value>
<comment>Message shown when interacting with the server</comment> <comment>Message shown when interacting with the server</comment>
</data> </data>
<data name="EditItem" xml:space="preserve"> <data name="EditItem" xml:space="preserve">
<value>चीज़ बदलाव करें</value> <value>आइटम बदलें</value>
</data> </data>
<data name="EnableAutomaticSyncing" xml:space="preserve"> <data name="EnableAutomaticSyncing" xml:space="preserve">
<value>अपनेआप-सिंक की अनुमति दें</value> <value>ऑटो-सिंक चालू करें</value>
</data> </data>
<data name="EnterEmailForHint" xml:space="preserve"> <data name="EnterEmailForHint" xml:space="preserve">
<value>मुख्य पासवर्ड इशारा लेने के लिए अपने खाते का ईमेल पता डालें।</value> <value>मास्टर पासवर्ड हिंट लेने के लिए अपने अकाउंट का ईमेल पता डालें।</value>
</data> </data>
<data name="ExntesionReenable" xml:space="preserve"> <data name="ExntesionReenable" xml:space="preserve">
<value>ऐप एक्सटेंशन वापस चालू करें</value> <value>ऐप एक्सटेंशन वापस चालू करें</value>
</data> </data>
<data name="ExtensionAlmostDone" xml:space="preserve"> <data name="ExtensionAlmostDone" xml:space="preserve">
<value>करीब-करीब खत्म!</value> <value>खत्म होने ही वाला है!</value>
</data> </data>
<data name="ExtensionEnable" xml:space="preserve"> <data name="ExtensionEnable" xml:space="preserve">
<value>ऐप एक्सटेंशन चालू करें</value> <value>ऐप एक्सटेंशन चालू करें</value>
</data> </data>
<data name="ExtensionInSafari" xml:space="preserve"> <data name="ExtensionInSafari" xml:space="preserve">
<value>सफारी में, शेयर आइकन से बिटवार्डन का पता लगाएं (इशारा: मेन्यू के सबसे निचले पट्टी पर दाएं तरफ जाएं)।</value> <value>सफारी में, शेयर आइकन से बिटवार्डन को ढूंढें (हिंट: मेन्यू के सबसे निचले पट्टी पर राइट में जाएं)।</value>
<comment>Safari is the name of apple's web browser</comment> <comment>Safari is the name of apple's web browser</comment>
</data> </data>
<data name="ExtensionInstantAccess" xml:space="preserve"> <data name="ExtensionInstantAccess" xml:space="preserve">
@@ -490,10 +490,10 @@
<value>आप लॉगइन करने के लिए तैयार हैं!</value> <value>आप लॉगइन करने के लिए तैयार हैं!</value>
</data> </data>
<data name="ExtensionSetup" xml:space="preserve"> <data name="ExtensionSetup" xml:space="preserve">
<value>अब सफारी, क्रोम, और दूसरे सपोर्ट किए गए ऐप से लॉगइन आसानी से एक्सेस किए जा सकते है।</value> <value>अब सफारी, क्रोम, और दूसरे सपोर्ट किए गए ऐप से सारे लॉगइन आसानी से एक्सेस किए जा सकते है।</value>
</data> </data>
<data name="ExtensionSetup2" xml:space="preserve"> <data name="ExtensionSetup2" xml:space="preserve">
<value>सफारी और क्रोम में, शेयर आइकन से बिटवार्डन का पता लगाएं (इशारा: मेन्यू के सबसे निचले पट्टी पर दाएं तरफ जाएं)</value> <value>सफारी और क्रोम में, शेयर आइकन से बिटवार्डन को ढूंढें (हिंट: शेयर मेन्यू के सबसे निचले पट्टी पर राइट में जाएं)</value>
</data> </data>
<data name="ExtensionTapIcon" xml:space="preserve"> <data name="ExtensionTapIcon" xml:space="preserve">
<value>एक्सटेंशन खोलने के लिए मेन्यू में बिटवार्डन आइकन पर दबाएं।</value> <value>एक्सटेंशन खोलने के लिए मेन्यू में बिटवार्डन आइकन पर दबाएं।</value>
@@ -511,16 +511,16 @@
<value>पासवर्ड बनाएं</value> <value>पासवर्ड बनाएं</value>
</data> </data>
<data name="GetPasswordHint" xml:space="preserve"> <data name="GetPasswordHint" xml:space="preserve">
<value>मुख्य पासवर्ड इशारा लें</value> <value>अपना मास्टम पासवर्ड हिंट लें</value>
</data> </data>
<data name="ImportItems" xml:space="preserve"> <data name="ImportItems" xml:space="preserve">
<value>चीज़ आयात करें</value> <value>आइटम इंपोर्ट करें</value>
</data> </data>
<data name="ImportItemsConfirmation" xml:space="preserve"> <data name="ImportItemsConfirmation" xml:space="preserve">
<value>Bitwarden.com वेब तिजोरी से थोक में चीज़ आयात किए जा सकते हैं। वेबसाइट पर अभी जाएं?</value> <value>Bitwarden.com वेब तिजोरी से थोक में आइटम इंपोर्ट किए जा सकते हैं। वेबसाइट पर अभी जाएं?</value>
</data> </data>
<data name="ImportItemsDescription" xml:space="preserve"> <data name="ImportItemsDescription" xml:space="preserve">
<value>दूसरे पासवर्ड मैनेजमेंट ऐप से थोक में चीज़ जल्दी आयात करें।</value> <value>दूसरे पासवर्ड मैनेजमेंट ऐप से अपने आइटम जल्दी इंपोर्ट करें।</value>
</data> </data>
<data name="LastSync" xml:space="preserve"> <data name="LastSync" xml:space="preserve">
<value>आखिरी सिंक:</value> <value>आखिरी सिंक:</value>
@@ -547,20 +547,20 @@
<value>तुरंत</value> <value>तुरंत</value>
</data> </data>
<data name="VaultTimeout" xml:space="preserve"> <data name="VaultTimeout" xml:space="preserve">
<value>तिजोरी वक्त खत्म</value> <value>तिजोरी टाइमआउट</value>
</data> </data>
<data name="VaultTimeoutAction" xml:space="preserve"> <data name="VaultTimeoutAction" xml:space="preserve">
<value>तिजोरी वक्त खत्म</value> <value>तिजोरी टाइमआउट एक्शन</value>
</data> </data>
<data name="VaultTimeoutLogOutConfirmation" xml:space="preserve"> <data name="VaultTimeoutLogOutConfirmation" xml:space="preserve">
<value>लॉगआउट करने के बाद तिजोरी में जाना मुमकिन नहीं होगा और वक्त खत्म होने के बाद ऑनलाइन सत्यापन की ज़रूरत होगी। इस सेटिंग को पक्का इस्तेमाल करें?</value> <value>लॉगआउट करने के बाद तिजोरी में जाना मुमकिन नहीं होगा और टाइमआउट के बाद ऑनलाइन ऑथेंटिकेशन की ज़रूरत होगी। इस सेटिंग का इस्तेमाल करें?</value>
</data> </data>
<data name="LoggingIn" xml:space="preserve"> <data name="LoggingIn" xml:space="preserve">
<value>लॉगइन कर रहे है...</value> <value>लॉगइन कर रहे है...</value>
<comment>Message shown when interacting with the server</comment> <comment>Message shown when interacting with the server</comment>
</data> </data>
<data name="LoginOrCreateNewAccount" xml:space="preserve"> <data name="LoginOrCreateNewAccount" xml:space="preserve">
<value>अपनी महफूज़ तिजोरी एक्सेस करने के लिए नया खाता बनाएं या लॉगइन करें।</value> <value>अपनी महफूज़ तिजोरी एक्सेस करने के लिए नया अकाउंट बनाएं या लॉगइन करें।</value>
</data> </data>
<data name="Manage" xml:space="preserve"> <data name="Manage" xml:space="preserve">
<value>मैनेज करें</value> <value>मैनेज करें</value>
@@ -569,58 +569,58 @@
<value>पासवर्ड गलत है।</value> <value>पासवर्ड गलत है।</value>
</data> </data>
<data name="MasterPasswordDescription" xml:space="preserve"> <data name="MasterPasswordDescription" xml:space="preserve">
<value>मुख्य पासवर्ड वो पासवर्ड है जो तिजोरी एक्सेस करने के लिए इस्तेमाल होता है। मुख्य पासवर्ड ना भूलना बहुत ज़रूरी है। भूलने के बाद पासवर्ड वापस पाना मुमकिन नहीं होगा।</value> <value>मास्टर पासवर्ड वो पासवर्ड है जो तिजोरी एक्सेस करने के लिए इस्तेमाल होता है। मास्टर पासवर्ड ना भूलना बहुत ज़रूरी है। भूलने के बाद पासवर्ड वापस पाना मुमकिन नहीं ह।</value>
</data> </data>
<data name="MasterPasswordHint" xml:space="preserve"> <data name="MasterPasswordHint" xml:space="preserve">
<value>मुख्य पासवर्ड इशारा (ज़रूरी नहीं)</value> <value>मास्टर पासवर्ड हिंट (ज़रूरी नहीं)</value>
</data> </data>
<data name="MasterPasswordHintDescription" xml:space="preserve"> <data name="MasterPasswordHintDescription" xml:space="preserve">
<value>मुख्य पासवर्ड इशारा आपको पासवर्ड भूल जाने के स्थिति में उसको याद करने में मदद करता है।</value> <value>मास्टर पासवर्ड हिंट पासवर्ड भूल जाने के हालत में उसको याद करने में मदद करता है।</value>
</data> </data>
<data name="MasterPasswordLengthValMessageX" xml:space="preserve"> <data name="MasterPasswordLengthValMessageX" xml:space="preserve">
<value>मुख्य पासवर्ड कम-से-कम {0} अक्षर लंबा होना चाहिए।</value> <value>मास्टर पासवर्ड कम-से-कम {0} अक्षर लंबा होना चाहिए।</value>
</data> </data>
<data name="MinNumbers" xml:space="preserve"> <data name="MinNumbers" xml:space="preserve">
<value>कम-से-कम अंक</value> <value>कम-से-कम इतने नंबर</value>
<comment>Minimum numeric characters for password generator settings</comment> <comment>Minimum numeric characters for password generator settings</comment>
</data> </data>
<data name="MinSpecial" xml:space="preserve"> <data name="MinSpecial" xml:space="preserve">
<value>कम-से-कम खास अक्षर</value> <value>कम-से-कम इतने खास</value>
<comment>Minimum special characters for password generator settings</comment> <comment>Minimum special characters for password generator settings</comment>
</data> </data>
<data name="MoreSettings" xml:space="preserve"> <data name="MoreSettings" xml:space="preserve">
<value>ज़्यादा सेटिंग</value> <value>ज़्यादा सेटिंग</value>
</data> </data>
<data name="MustLogInMainApp" xml:space="preserve"> <data name="MustLogInMainApp" xml:space="preserve">
<value>एक्सटेशन इस्तेमाल करने से पहले मुख्य बिटवार्डन ऐप में लॉगइन करना पड़ेगा।</value> <value>एक्सटेशन इस्तेमाल करने से पहले मेन बिटवार्डन ऐप में लॉगइन करना पड़ेगा।</value>
</data> </data>
<data name="Never" xml:space="preserve"> <data name="Never" xml:space="preserve">
<value>कभी नहीं</value> <value>कभी नहीं</value>
</data> </data>
<data name="NewItemCreated" xml:space="preserve"> <data name="NewItemCreated" xml:space="preserve">
<value>नया चीज़ बनाया गया</value> <value>नया आइटम बनाया गया</value>
</data> </data>
<data name="NoFavorites" xml:space="preserve"> <data name="NoFavorites" xml:space="preserve">
<value>तिजोरी में कोई मनपसंद चीज़ नहीं है।</value> <value>तिजोरी में कोई मनपसंद चीज़ नहीं है।</value>
</data> </data>
<data name="NoItems" xml:space="preserve"> <data name="NoItems" xml:space="preserve">
<value>तिजोरी में कोई चीज़ नहीं है।</value> <value>तिजोरी में कोई आइटम नहीं है।</value>
</data> </data>
<data name="NoItemsTap" xml:space="preserve"> <data name="NoItemsTap" xml:space="preserve">
<value>इस वेबसाइट/ऐप के लिए तिजोरी में कोई चीज़ नहीं है। चीज़ जोड़ने के लिए दबाएं।</value> <value>इस वेबसाइट/ऐप के लिए तिजोरी में कोई आइटम नहीं है। आइटम बनाने के लिए दबाएं।</value>
</data> </data>
<data name="NoUsernamePasswordConfigured" xml:space="preserve"> <data name="NoUsernamePasswordConfigured" xml:space="preserve">
<value>इस लॉगइन में कोई यूजरनम या पासवर्ड नहीं है।</value> <value>इस लॉगइन में कोई यूजरनम या पासवर्ड नहीं है।</value>
</data> </data>
<data name="OkGotIt" xml:space="preserve"> <data name="OkGotIt" xml:space="preserve">
<value>ठीक है, समझ गए!</value> <value>ठीक है, समझ गए!</value>
<comment>Confirmation, like "Ok, I understand it"</comment> <comment>Confirmation, like "Ok, I understand it"</comment>
</data> </data>
<data name="OptionDefaults" xml:space="preserve"> <data name="OptionDefaults" xml:space="preserve">
<value>विकल्प डिफॉल्ट मुख्य बिटवार्डन ऐप के पासवर्ड जनरेटर औज़ार से सेट होता है।</value> <value>ऑप्शन के डिफॉल्ट मेन बिटवार्डन ऐप के पासवर्ड जनरेटर टूल से सेट होता है।</value>
</data> </data>
<data name="Options" xml:space="preserve"> <data name="Options" xml:space="preserve">
<value>विकल्प</value> <value>ऑप्शन</value>
</data> </data>
<data name="Other" xml:space="preserve"> <data name="Other" xml:space="preserve">
<value>दूसरे</value> <value>दूसरे</value>
@@ -629,13 +629,13 @@
<value>पासवर्ड बनाया गया</value> <value>पासवर्ड बनाया गया</value>
</data> </data>
<data name="PasswordGenerator" xml:space="preserve"> <data name="PasswordGenerator" xml:space="preserve">
<value>पासवर्ड जनरेटर</value> <value>पासवर्ड जनरेटर</value>
</data> </data>
<data name="PasswordHint" xml:space="preserve"> <data name="PasswordHint" xml:space="preserve">
<value>पासवर्ड इशारा</value> <value>पासवर्ड हिंट</value>
</data> </data>
<data name="PasswordHintAlert" xml:space="preserve"> <data name="PasswordHintAlert" xml:space="preserve">
<value>हमने आपको मुख्य पासवर्ड इशारा एक ईमेल के साथ भेजा है।</value> <value>हमने आपको मास्टर पासवर्ड हिंट एक ईमेल में भेजा है।</value>
</data> </data>
<data name="PasswordOverrideAlert" xml:space="preserve"> <data name="PasswordOverrideAlert" xml:space="preserve">
<value>चालू पासवर्ड पक्का ओवरराइट करें?</value> <value>चालू पासवर्ड पक्का ओवरराइट करें?</value>
@@ -843,11 +843,11 @@
<value>कोई दूसरा दो-कदम लॉगइन तरीका इस्तेमाल करें</value> <value>कोई दूसरा दो-कदम लॉगइन तरीका इस्तेमाल करें</value>
</data> </data>
<data name="VerificationEmailNotSent" xml:space="preserve"> <data name="VerificationEmailNotSent" xml:space="preserve">
<value>Could not send verification email. Try again.</value> <value>जांच के लिए मेईल भेजने में असमर्थ। फिर से प्रयास करें ।</value>
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="VerificationEmailSent" xml:space="preserve"> <data name="VerificationEmailSent" xml:space="preserve">
<value>Verification email sent</value> <value>जांच के लिए मेईल भेजा गया है</value>
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="YubiKeyInstruction" xml:space="preserve"> <data name="YubiKeyInstruction" xml:space="preserve">
@@ -858,23 +858,23 @@
<comment>"YubiKey" is the product name and should not be translated.</comment> <comment>"YubiKey" is the product name and should not be translated.</comment>
</data> </data>
<data name="AddNewAttachment" xml:space="preserve"> <data name="AddNewAttachment" xml:space="preserve">
<value>Add new attachment</value> <value>नई अटैचमेंट जोडे</value>
</data> </data>
<data name="Attachments" xml:space="preserve"> <data name="Attachments" xml:space="preserve">
<value>अटॅचमेंट्स</value> <value>अटॅचमेंट्स</value>
</data> </data>
<data name="UnableToDownloadFile" xml:space="preserve"> <data name="UnableToDownloadFile" xml:space="preserve">
<value>Unable to download file.</value> <value>फाइल डाउनलोड करने में असफल</value>
</data> </data>
<data name="UnableToOpenFile" xml:space="preserve"> <data name="UnableToOpenFile" xml:space="preserve">
<value>Your device cannot open this type of file.</value> <value>आपका उपकरण इस तरह की फाइल नहीं खोल सकता</value>
</data> </data>
<data name="Downloading" xml:space="preserve"> <data name="Downloading" xml:space="preserve">
<value>डाउनलोड कर रहा है...</value> <value>डाउनलोड कर रहा है...</value>
<comment>Message shown when downloading a file</comment> <comment>Message shown when downloading a file</comment>
</data> </data>
<data name="AttachmentLargeWarning" xml:space="preserve"> <data name="AttachmentLargeWarning" xml:space="preserve">
<value>This attachment is {0} in size. Are you sure you want to download it onto your device?</value> <value>इस अटैचमेंट की साईज {0} है. क्या आप निश्चित रूप से उसे अपने उपकरण में डाउनलोड करना चाहते हैं?</value>
<comment>The placeholder will show the file size of the attachment. Ex "25 MB"</comment> <comment>The placeholder will show the file size of the attachment. Ex "25 MB"</comment>
</data> </data>
<data name="AuthenticatorKey" xml:space="preserve"> <data name="AuthenticatorKey" xml:space="preserve">
@@ -891,8 +891,7 @@
<value>Cannot read authenticator key.</value> <value>Cannot read authenticator key.</value>
</data> </data>
<data name="PointYourCameraAtTheQRCode" xml:space="preserve"> <data name="PointYourCameraAtTheQRCode" xml:space="preserve">
<value>Point your camera at the QR Code. <value>अपने कैमरे को QR CODE कि और रखें। स्कैन अपने आप होगा।</value>
Scanning will happen automatically.</value>
</data> </data>
<data name="ScanQrTitle" xml:space="preserve"> <data name="ScanQrTitle" xml:space="preserve">
<value>QR कोड को स्कैन करें</value> <value>QR कोड को स्कैन करें</value>
@@ -913,10 +912,10 @@ Scanning will happen automatically.</value>
<value>Copy TOTP automatically</value> <value>Copy TOTP automatically</value>
</data> </data>
<data name="PremiumRequired" xml:space="preserve"> <data name="PremiumRequired" xml:space="preserve">
<value>A premium membership is required to use this feature.</value> <value>इस सुविधा का उपयोग करने के लिए प्रीमियम सदस्यता की आवश्यकता होती है।</value>
</data> </data>
<data name="AttachementAdded" xml:space="preserve"> <data name="AttachementAdded" xml:space="preserve">
<value>Attachment added</value> <value>अटैचमेंट डालि गई।</value>
</data> </data>
<data name="AttachmentDeleted" xml:space="preserve"> <data name="AttachmentDeleted" xml:space="preserve">
<value>संग्लित वस्तु डिलीट करी गई</value> <value>संग्लित वस्तु डिलीट करी गई</value>

View File

@@ -2423,7 +2423,7 @@
<comment>"Fastmail" is the product name and should not be translated.</comment> <comment>"Fastmail" is the product name and should not be translated.</comment>
</data> </data>
<data name="ForwardEmail" xml:space="preserve"> <data name="ForwardEmail" xml:space="preserve">
<value>FowardEmail</value> <value>ForwardEmail</value>
<comment>"ForwardEmail" is the product name and should not be translated.</comment> <comment>"ForwardEmail" is the product name and should not be translated.</comment>
</data> </data>
<data name="APIAccessToken" xml:space="preserve"> <data name="APIAccessToken" xml:space="preserve">

View File

@@ -425,7 +425,7 @@
<value>あいまいな文字を避ける</value> <value>あいまいな文字を避ける</value>
</data> </data>
<data name="BitwardenAppExtension" xml:space="preserve"> <data name="BitwardenAppExtension" xml:space="preserve">
<value>Bitwarden App Extension</value> <value>Bitwarden アプリ拡張機能</value>
</data> </data>
<data name="BitwardenAppExtensionAlert2" xml:space="preserve"> <data name="BitwardenAppExtensionAlert2" xml:space="preserve">
<value>ログイン情報を保管庫に追加する一番簡単な方法はApp Extensionを使うことです。詳しくは「設定」画面に進んでください。</value> <value>ログイン情報を保管庫に追加する一番簡単な方法はApp Extensionを使うことです。詳しくは「設定」画面に進んでください。</value>

View File

@@ -2670,7 +2670,7 @@
<value>Помоћ поновно тражење главне лозинке</value> <value>Помоћ поновно тражење главне лозинке</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings or set up biometric unlock to resolve.</value> <value>Откључавање можда неће успети због недовољне меморије. Умањите подешавање KDF меморије или подесите биометрију за решење.</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve"> <data name="InvalidAPIKey" xml:space="preserve">
<value>Неисправан API кључ</value> <value>Неисправан API кључ</value>
@@ -2749,7 +2749,7 @@
<value>Пријавите се са уређајем</value> <value>Пријавите се са уређајем</value>
</data> </data>
<data name="LoggingInOn" xml:space="preserve"> <data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value> <value>Пријављено на</value>
</data> </data>
<data name="Vault" xml:space="preserve"> <data name="Vault" xml:space="preserve">
<value>Сеф</value> <value>Сеф</value>

View File

@@ -1742,7 +1742,7 @@ Skanningen sker automatiskt.</value>
<comment>Confirmation alert message when soft-deleting a cipher.</comment> <comment>Confirmation alert message when soft-deleting a cipher.</comment>
</data> </data>
<data name="AccountBiometricInvalidated" xml:space="preserve"> <data name="AccountBiometricInvalidated" xml:space="preserve">
<value>Biometrisk upplåsning för automatisk ifyllnad är inaktiverad i väntan på bekräftelse av huvudlösenordet.</value> <value>Biometrisk upplåsning har inaktiverats för det här kontot tills huvudlösenordet har angetts.</value>
</data> </data>
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve"> <data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
<value>Den biometriska upplåsningen av automatisk ifyllning för detta konto är inaktiverat i väntan på verifiering av huvudlösenordet.</value> <value>Den biometriska upplåsningen av automatisk ifyllning för detta konto är inaktiverat i väntan på verifiering av huvudlösenordet.</value>
@@ -2613,10 +2613,10 @@ Vill du byta till detta konto?</value>
<value>Lokalt installerad</value> <value>Lokalt installerad</value>
</data> </data>
<data name="DataRegion" xml:space="preserve"> <data name="DataRegion" xml:space="preserve">
<value>Dataområde</value> <value>Dataregion</value>
</data> </data>
<data name="Region" xml:space="preserve"> <data name="Region" xml:space="preserve">
<value>Område</value> <value>Region</value>
</data> </data>
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve"> <data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
<value>Ditt huvudlösenord följer inte ett eller flera av din organisations regler. För att komma åt ditt valv så måste du ändra ditt huvudlösenord nu. Om du gör det kommer du att loggas du ut ur din nuvarande session så du måste logga in på nytt. Aktiva sessioner på andra enheter kommer fortsatt vara aktiva i upp till en timme.</value> <value>Ditt huvudlösenord följer inte ett eller flera av din organisations regler. För att komma åt ditt valv så måste du ändra ditt huvudlösenord nu. Om du gör det kommer du att loggas du ut ur din nuvarande session så du måste logga in på nytt. Aktiva sessioner på andra enheter kommer fortsatt vara aktiva i upp till en timme.</value>
@@ -2631,7 +2631,7 @@ Vill du byta till detta konto?</value>
<value>Godkänn med min andra enhet</value> <value>Godkänn med min andra enhet</value>
</data> </data>
<data name="RequestAdminApproval" xml:space="preserve"> <data name="RequestAdminApproval" xml:space="preserve">
<value>Request admin approval</value> <value>Be om godkännande från administratör</value>
</data> </data>
<data name="ApproveWithMasterPassword" xml:space="preserve"> <data name="ApproveWithMasterPassword" xml:space="preserve">
<value>Godkänn med huvudlösenord</value> <value>Godkänn med huvudlösenord</value>
@@ -2643,34 +2643,34 @@ Vill du byta till detta konto?</value>
<value>Kom ihåg denna enhet</value> <value>Kom ihåg denna enhet</value>
</data> </data>
<data name="Passkey" xml:space="preserve"> <data name="Passkey" xml:space="preserve">
<value>Passkey</value> <value>Nyckel</value>
</data> </data>
<data name="Passkeys" xml:space="preserve"> <data name="Passkeys" xml:space="preserve">
<value>Passkeys</value> <value>Nycklar</value>
</data> </data>
<data name="Application" xml:space="preserve"> <data name="Application" xml:space="preserve">
<value>Application</value> <value>Applikation</value>
</data> </data>
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve"> <data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
<value>You cannot edit passkey application because it would invalidate the passkey</value> <value>Du kan inte ändra nyckelns applikation eftersom det skulle göra nyckeln ogiltig</value>
</data> </data>
<data name="PasskeyWillNotBeCopied" xml:space="preserve"> <data name="PasskeyWillNotBeCopied" xml:space="preserve">
<value>Passkey will not be copied</value> <value>Nyckel kommer inte kopieras</value>
</data> </data>
<data name="ThePasskeyWillNotBeCopiedToTheClonedItemDoYouWantToContinueCloningThisItem" xml:space="preserve"> <data name="ThePasskeyWillNotBeCopiedToTheClonedItemDoYouWantToContinueCloningThisItem" xml:space="preserve">
<value>The passkey will not be copied to the cloned item. Do you want to continue cloning this item?</value> <value>Nyckeln kommer inte att kopieras till det klonade objektet. Vill du klona det här objektet?</value>
</data> </data>
<data name="CopyApplication" xml:space="preserve"> <data name="CopyApplication" xml:space="preserve">
<value>Copy application</value> <value>Kopiera applikation</value>
</data> </data>
<data name="AvailableForTwoStepLogin" xml:space="preserve"> <data name="AvailableForTwoStepLogin" xml:space="preserve">
<value>Available for two-step login</value> <value>Tillgänglig för tvåstegsverifiering</value>
</data> </data>
<data name="MasterPasswordRePromptHelp" xml:space="preserve"> <data name="MasterPasswordRePromptHelp" xml:space="preserve">
<value>Återupprepa huvudlösenord hjälp</value> <value>Återupprepa huvudlösenord hjälp</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings or set up biometric unlock to resolve.</value> <value>Upplåsning kan misslyckas på grund av otillräckligt minne. Minska dina KDF-minnesinställningar för att lösa detta.</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve"> <data name="InvalidAPIKey" xml:space="preserve">
<value>Ogiltig API-nyckel</value> <value>Ogiltig API-nyckel</value>
@@ -2679,10 +2679,10 @@ Vill du byta till detta konto?</value>
<value>Ogiltig API-token</value> <value>Ogiltig API-token</value>
</data> </data>
<data name="AdminApprovalRequested" xml:space="preserve"> <data name="AdminApprovalRequested" xml:space="preserve">
<value>Admin approval requested</value> <value>Godkännande från administratör har begärts</value>
</data> </data>
<data name="YourRequestHasBeenSentToYourAdmin" xml:space="preserve"> <data name="YourRequestHasBeenSentToYourAdmin" xml:space="preserve">
<value>Your request has been sent to your admin.</value> <value>Din begäran har skickats till din administratör.</value>
</data> </data>
<data name="YouWillBeNotifiedOnceApproved" xml:space="preserve"> <data name="YouWillBeNotifiedOnceApproved" xml:space="preserve">
<value>Du kommer att meddelas vid godkännande. </value> <value>Du kommer att meddelas vid godkännande. </value>
@@ -2694,10 +2694,10 @@ Vill du byta till detta konto?</value>
<value>Loggar in som {0}</value> <value>Loggar in som {0}</value>
</data> </data>
<data name="VaultTimeoutActionChangedToLogOut" xml:space="preserve"> <data name="VaultTimeoutActionChangedToLogOut" xml:space="preserve">
<value>Vault timeout action changed to log out</value> <value>Tidsgränsåtgärd har ändrats till utloggning</value>
</data> </data>
<data name="BlockAutoFill" xml:space="preserve"> <data name="BlockAutoFill" xml:space="preserve">
<value>Block auto-fill</value> <value>Blockera autofyll</value>
</data> </data>
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve"> <data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
<value>Autofyll kommer inte att erbjudas för dessa URI:er.</value> <value>Autofyll kommer inte att erbjudas för dessa URI:er.</value>
@@ -2740,10 +2740,10 @@ Vill du byta till detta konto?</value>
<value>Det går inte att redigera flera URI:er samtidigt</value> <value>Det går inte att redigera flera URI:er samtidigt</value>
</data> </data>
<data name="LoginApproved" xml:space="preserve"> <data name="LoginApproved" xml:space="preserve">
<value>Login approved</value> <value>Inloggning godkänd</value>
</data> </data>
<data name="LogInWithDeviceMustBeSetUpInTheSettingsOfTheBitwardenAppNeedAnotherOption" xml:space="preserve"> <data name="LogInWithDeviceMustBeSetUpInTheSettingsOfTheBitwardenAppNeedAnotherOption" xml:space="preserve">
<value>Log in with device must be set up in the settings of the Bitwarden app. Need another option?</value> <value>"Logga in med enhet" måste ställas in i inställningarna i Bitwardens app. Behöver du ett annat alternativ?</value>
</data> </data>
<data name="LogInWithDevice" xml:space="preserve"> <data name="LogInWithDevice" xml:space="preserve">
<value>Logga in med enhet</value> <value>Logga in med enhet</value>
@@ -2758,31 +2758,31 @@ Vill du byta till detta konto?</value>
<value>Utseende</value> <value>Utseende</value>
</data> </data>
<data name="AccountSecurity" xml:space="preserve"> <data name="AccountSecurity" xml:space="preserve">
<value>Account security</value> <value>Kontosäkerhet</value>
</data> </data>
<data name="BitwardenHelpCenter" xml:space="preserve"> <data name="BitwardenHelpCenter" xml:space="preserve">
<value>Bitwarden Hjälpcenter</value> <value>Bitwarden Hjälpcenter</value>
</data> </data>
<data name="ContactBitwardenSupport" xml:space="preserve"> <data name="ContactBitwardenSupport" xml:space="preserve">
<value>Contact Bitwarden support</value> <value>Kontakta Bitwarden support</value>
</data> </data>
<data name="CopyAppInformation" xml:space="preserve"> <data name="CopyAppInformation" xml:space="preserve">
<value>Copy app information</value> <value>Kopiera appinformation</value>
</data> </data>
<data name="SyncNow" xml:space="preserve"> <data name="SyncNow" xml:space="preserve">
<value>Synkronisera nu</value> <value>Synkronisera nu</value>
</data> </data>
<data name="UnlockOptions" xml:space="preserve"> <data name="UnlockOptions" xml:space="preserve">
<value>Unlock options</value> <value>Upplåsning</value>
</data> </data>
<data name="SessionTimeout" xml:space="preserve"> <data name="SessionTimeout" xml:space="preserve">
<value>Session timeout</value> <value>Tidsgräns för session</value>
</data> </data>
<data name="SessionTimeoutAction" xml:space="preserve"> <data name="SessionTimeoutAction" xml:space="preserve">
<value>Session timeout action</value> <value>Åtgärd när tidsgränsen uppnås</value>
</data> </data>
<data name="AccountFingerprintPhrase" xml:space="preserve"> <data name="AccountFingerprintPhrase" xml:space="preserve">
<value>Account fingerprint phrase</value> <value>Kontots fingeravtrycksfras</value>
<comment>A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing.</comment> <comment>A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing.</comment>
</data> </data>
<data name="OneHourAndOneMinute" xml:space="preserve"> <data name="OneHourAndOneMinute" xml:space="preserve">
@@ -2801,13 +2801,13 @@ Vill du byta till detta konto?</value>
<value>{0} timmar</value> <value>{0} timmar</value>
</data> </data>
<data name="AutofillServicesExplanationLong" xml:space="preserve"> <data name="AutofillServicesExplanationLong" xml:space="preserve">
<value>The Android Autofill Framework is used to assist in filling login information into other apps on your device.</value> <value>Androids autofyll-ramverk används för att fylla i inloggningsuppgifter i appar på din enhet.</value>
</data> </data>
<data name="UseInlineAutofillExplanationLong" xml:space="preserve"> <data name="UseInlineAutofillExplanationLong" xml:space="preserve">
<value>Use inline autofill if your selected keyboard supports it. Otherwise, use the default overlay.</value> <value>Använd autofyll inbyggt i tangentbordet om ditt tangentbord stöder det. Annars, använd popup-fönstret.</value>
</data> </data>
<data name="AdditionalOptions" xml:space="preserve"> <data name="AdditionalOptions" xml:space="preserve">
<value>Additional options</value> <value>Ytterligare alternativ</value>
</data> </data>
<data name="ContinueToWebApp" xml:space="preserve"> <data name="ContinueToWebApp" xml:space="preserve">
<value>Fortsätt till webbapp?</value> <value>Fortsätt till webbapp?</value>
@@ -2820,56 +2820,56 @@ Vill du byta till detta konto?</value>
<value>Fortsätt till Hjälpcenter?</value> <value>Fortsätt till Hjälpcenter?</value>
</data> </data>
<data name="ContinueToContactSupport" xml:space="preserve"> <data name="ContinueToContactSupport" xml:space="preserve">
<value>Continue to contact support?</value> <value>Fortsätt att kontakta supporten?</value>
</data> </data>
<data name="ContinueToAppStore" xml:space="preserve"> <data name="ContinueToAppStore" xml:space="preserve">
<value>Continue to app store?</value> <value>Fortsätt till appbutiken?</value>
</data> </data>
<data name="TwoStepLoginDescriptionLong" xml:space="preserve"> <data name="TwoStepLoginDescriptionLong" xml:space="preserve">
<value>Make your account more secure by setting up two-step login in the Bitwarden web app.</value> <value>Gör ditt konto säkrare genom att konfigurera tvåstegsverifiering i Bitwardens webbapp.</value>
</data> </data>
<data name="ChangeMasterPasswordDescriptionLong" xml:space="preserve"> <data name="ChangeMasterPasswordDescriptionLong" xml:space="preserve">
<value>You can change your master password on the Bitwarden web app.</value> <value>Du kan ändra ditt huvudlösenord i Bitwardens webbapp.</value>
</data> </data>
<data name="YouCanImportDataToYourVaultOnX" xml:space="preserve"> <data name="YouCanImportDataToYourVaultOnX" xml:space="preserve">
<value>You can import data to your vault on {0}.</value> <value>Du kan importera data till ditt valv på {0}.</value>
<comment>The parameter is an URL, like vault.bitwarden.com.</comment> <comment>The parameter is an URL, like vault.bitwarden.com.</comment>
</data> </data>
<data name="LearnMoreAboutHowToUseBitwardenOnTheHelpCenter" xml:space="preserve"> <data name="LearnMoreAboutHowToUseBitwardenOnTheHelpCenter" xml:space="preserve">
<value>Learn more about how to use Bitwarden on the Help center.</value> <value>Läs mer om hur du använder Bitwarden i hjälpcentret.</value>
</data> </data>
<data name="ContactSupportDescriptionLong" xml:space="preserve"> <data name="ContactSupportDescriptionLong" xml:space="preserve">
<value>Cant find what you are looking for? Reach out to Bitwarden support on bitwarden.com.</value> <value>Hittar du inte det du söker? Hör av dig till Bitwardens support bitwarden.com.</value>
</data> </data>
<data name="ExploreMoreFeaturesOfYourBitwardenAccountOnTheWebApp" xml:space="preserve"> <data name="ExploreMoreFeaturesOfYourBitwardenAccountOnTheWebApp" xml:space="preserve">
<value>Explore more features of your Bitwarden account on the web app.</value> <value>Utforska fler funktioner i ditt Bitwarden-konto i webbappen.</value>
</data> </data>
<data name="LearnAboutOrganizationsDescriptionLong" xml:space="preserve"> <data name="LearnAboutOrganizationsDescriptionLong" xml:space="preserve">
<value>Bitwarden allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website.</value> <value>Bitwarden låter dig dela objekt i ditt valv med andra med hjälp av en organisation. Läs mer på webbplatsen bitwarden.com.</value>
</data> </data>
<data name="RateAppDescriptionLong" xml:space="preserve"> <data name="RateAppDescriptionLong" xml:space="preserve">
<value>Help others find out if Bitwarden is right for them. Visit the app store and leave a rating now.</value> <value>Hlp andra att ta reda på om Bitwarden är rätt för dem. Besök appbutiken och lämna en recension nu.</value>
</data> </data>
<data name="DefaultDarkThemeDescriptionLong" xml:space="preserve"> <data name="DefaultDarkThemeDescriptionLong" xml:space="preserve">
<value>Choose the dark theme to use when your devices dark mode is in use</value> <value>Välj vilket tema som ska användas när enheten är i mörkt läge</value>
</data> </data>
<data name="CreatedXY" xml:space="preserve"> <data name="CreatedXY" xml:space="preserve">
<value>Created {0}, {1}</value> <value>Skapad {0}, {1}</value>
<comment>To state the date/time in which the cipher was created: Created 03/21/2023, 09:25 AM. First parameter is the date and the second parameter is the time.</comment> <comment>To state the date/time in which the cipher was created: Created 03/21/2023, 09:25 AM. First parameter is the date and the second parameter is the time.</comment>
</data> </data>
<data name="TooManyAttempts" xml:space="preserve"> <data name="TooManyAttempts" xml:space="preserve">
<value>För många försök</value> <value>För många försök</value>
</data> </data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve"> <data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value> <value>Kontot har loggats ut.</value>
</data> </data>
<data name="YourOrganizationPermissionsWereUpdatedRequeringYouToSetAMasterPassword" xml:space="preserve"> <data name="YourOrganizationPermissionsWereUpdatedRequeringYouToSetAMasterPassword" xml:space="preserve">
<value>Your organization permissions were updated, requiring you to set a master password.</value> <value>Din organisations behörigheter uppdaterades, vilket kräver att du anger ett huvudlösenord.</value>
</data> </data>
<data name="YourOrganizationRequiresYouToSetAMasterPassword" xml:space="preserve"> <data name="YourOrganizationRequiresYouToSetAMasterPassword" xml:space="preserve">
<value>Your organization requires you to set a master password.</value> <value>Din organisation kräver att du anger ett huvudlösenord.</value>
</data> </data>
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve"> <data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
<value>Set up an unlock option to change your vault timeout action.</value> <value>Ställ in ett upplåsningsalternativ för att ändra vad som händer när tidsgränsen uppnås.</value>
</data> </data>
</root> </root>

View File

@@ -1176,17 +1176,17 @@
<value>Відкрити налаштування автозаповнення</value> <value>Відкрити налаштування автозаповнення</value>
</data> </data>
<data name="FaceID" xml:space="preserve"> <data name="FaceID" xml:space="preserve">
<value>Розпізнавання обличчя</value> <value>Face ID</value>
<comment>What Apple calls their facial recognition reader.</comment> <comment>What Apple calls their facial recognition reader.</comment>
</data> </data>
<data name="FaceIDDirection" xml:space="preserve"> <data name="FaceIDDirection" xml:space="preserve">
<value>Використовувати розпізнавання обличчя для підтвердження.</value> <value>Використовувати Face ID для підтвердження.</value>
</data> </data>
<data name="UseFaceIDToUnlock" xml:space="preserve"> <data name="UseFaceIDToUnlock" xml:space="preserve">
<value>Розблокування з Face ID</value> <value>Розблокування з Face ID</value>
</data> </data>
<data name="VerifyFaceID" xml:space="preserve"> <data name="VerifyFaceID" xml:space="preserve">
<value>Підтвердження розпізнавання обличчя</value> <value>Підтвердження Face ID</value>
</data> </data>
<data name="WindowsHello" xml:space="preserve"> <data name="WindowsHello" xml:space="preserve">
<value>Windows Hello</value> <value>Windows Hello</value>
@@ -2354,7 +2354,7 @@
<value>Схвалювати запити на вхід</value> <value>Схвалювати запити на вхід</value>
</data> </data>
<data name="UseThisDeviceToApproveLoginRequestsMadeFromOtherDevices" xml:space="preserve"> <data name="UseThisDeviceToApproveLoginRequestsMadeFromOtherDevices" xml:space="preserve">
<value>Використовувати цей пристрій для схвалення запитів на вхід, виконаних з інших пристроїв</value> <value>Схвалювати запити на вхід, виконані з інших пристроїв</value>
</data> </data>
<data name="AllowNotifications" xml:space="preserve"> <data name="AllowNotifications" xml:space="preserve">
<value>Дозволити сповіщення</value> <value>Дозволити сповіщення</value>

View File

@@ -2185,7 +2185,7 @@
<value>无效的验证码</value> <value>无效的验证码</value>
</data> </data>
<data name="RequestOTP" xml:space="preserve"> <data name="RequestOTP" xml:space="preserve">
<value>求一次性密码</value> <value>求一次性密码</value>
</data> </data>
<data name="SendCode" xml:space="preserve"> <data name="SendCode" xml:space="preserve">
<value>发送验证码</value> <value>发送验证码</value>
@@ -2780,7 +2780,7 @@
<value>会话超时动作</value> <value>会话超时动作</value>
</data> </data>
<data name="AccountFingerprintPhrase" xml:space="preserve"> <data name="AccountFingerprintPhrase" xml:space="preserve">
<value>账户指纹短语</value> <value>账户指纹短语</value>
<comment>A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing.</comment> <comment>A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing.</comment>
</data> </data>
<data name="OneHourAndOneMinute" xml:space="preserve"> <data name="OneHourAndOneMinute" xml:space="preserve">

View File

@@ -63,12 +63,20 @@ namespace Bit.Core.Services
/// </param> /// </param>
public async Task<bool> IsLockedAsync(string userId = null) public async Task<bool> IsLockedAsync(string userId = null)
{ {
// If biometrics are used, we can use the flag to determine locked state taking into account the auto unlock key for vault timeout never.
var biometricSet = await IsBiometricLockSetAsync(userId);
var hasAutoUnlockKey = await _cryptoService.HasAutoUnlockKeyAsync(userId);
if (biometricSet && await _stateService.GetBiometricLockedAsync(userId) && !hasAutoUnlockKey)
{
return true;
}
if (!await _cryptoService.HasUserKeyAsync(userId)) if (!await _cryptoService.HasUserKeyAsync(userId))
{ {
try try
{ {
// Filter out accounts without auto key // Filter out accounts without auto key
if (!await _cryptoService.HasAutoUnlockKeyAsync(userId)) if (!hasAutoUnlockKey)
{ {
return true; return true;
} }
@@ -84,7 +92,6 @@ namespace Bit.Core.Services
// Legacy users must migrate on web vault before login // Legacy users must migrate on web vault before login
await LogOutAsync(false, userId); await LogOutAsync(false, userId);
} }
} }
// Check again to verify auto key was set // Check again to verify auto key was set

View File

@@ -40,7 +40,7 @@ namespace Bit.App.Utilities
string image = null; string image = null;
if (cipher.Login.HasUris) if (cipher.Login.HasUris)
{ {
foreach (var uri in cipher.Login.Uris) foreach (var uri in cipher.Login.Uris.Where(u => u.Uri != null))
{ {
var hostnameUri = uri.Uri; var hostnameUri = uri.Uri;
var isWebsite = false; var isWebsite = false;

View File

@@ -0,0 +1,15 @@
<?xml version = "1.0" encoding = "UTF-8" ?>
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Bit.Core"
x:Class="Bit.Core.App">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources/Styles/Colors.xaml" />
<ResourceDictionary Source="Resources/Styles/Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>

View File

@@ -0,0 +1,12 @@
namespace Bit.Core;
public partial class App : Application
{
public App(AppOptions appOptions = null)
{
InitializeComponent();
MainPage = new MainPage();
}
}

View File

@@ -0,0 +1,9 @@
using System;
namespace Bit.Core
{
public class AppOptions
{
public bool IosExtension { get; set; }
}
}

View File

@@ -0,0 +1,39 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0-android;net8.0-ios</TargetFrameworks>
<RootNamespace>Bit.Core</RootNamespace>
<UseMaui>true</UseMaui>
<ImplicitUsings>enable</ImplicitUsings>
<ForceSimulatorX64ArchitectureInIDE>true</ForceSimulatorX64ArchitectureInIDE>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">12.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net8.0-ios|AnyCPU'">
<CreatePackage>false</CreatePackage>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-ios|AnyCPU'">
<CreatePackage>false</CreatePackage>
</PropertyGroup>
<PropertyGroup>
<DefineConstants Condition=" '$(CustomConstants)' != '' ">$(DefineConstants);$(CustomConstants)</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
<PackageReference Include="CommunityToolkit.Maui" Version="5.2.0" />
<PackageReference Include="AsyncAwaitBestPractices.MVVM" Version="6.0.6" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.1" />
</ItemGroup>
<ItemGroup>
<None Remove="Resources\" />
<None Remove="Resources\Styles\" />
</ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
<Folder Include="Resources\" />
<Folder Include="Resources\Styles\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Bit.Core.HomePage"
Title="HomePage">
<VerticalStackLayout>
<Label
Text="This is the HOME"
VerticalOptions="Center"
HorizontalOptions="Center" />
<Label
Text="GO TO LOGIN"
FontSize="Large">
<Label.GestureRecognizers>
<TapGestureRecognizer Tapped="Login_Clicked" />
</Label.GestureRecognizers>
</Label>
<Label
Text="CANCEL"
FontSize="Large">
<Label.GestureRecognizers>
<TapGestureRecognizer Tapped="Cancel_Clicked" />
</Label.GestureRecognizers>
</Label>
</VerticalStackLayout>
</ContentPage>

View File

@@ -0,0 +1,28 @@
namespace Bit.Core;
public partial class HomePage : ContentPage
{
public HomePage(AppOptions appOptions = null)
{
InitializeComponent();
if (appOptions is null)
{
StartLoginAction = () => Navigation.PushModalAsync(new LoginPage());
CloseAction = () => Navigation.PopModalAsync();
}
}
public Action StartLoginAction { get; set; }
public Action CloseAction { get; set; }
void Login_Clicked(System.Object sender, System.EventArgs e)
{
StartLoginAction();
}
void Cancel_Clicked(System.Object sender, System.EventArgs e)
{
CloseAction();
}
}

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Bit.Core.LoginPage"
Title="LoginPage">
<VerticalStackLayout>
<Label
Text="This is the login!"
VerticalOptions="Center"
HorizontalOptions="Center" />
<Label
Text="Tap me to login successfully"
FontSize="Large">
<Label.GestureRecognizers>
<TapGestureRecognizer Tapped="LoginSuccess_Tapped" />
</Label.GestureRecognizers>
</Label>
<Label
Text="Tap me to close"
FontSize="Large">
<Label.GestureRecognizers>
<TapGestureRecognizer Tapped="Close_Tapped" />
</Label.GestureRecognizers>
</Label>
</VerticalStackLayout>
</ContentPage>

View File

@@ -0,0 +1,29 @@
namespace Bit.Core;
public partial class LoginPage : ContentPage
{
public LoginPage(AppOptions appOptions = null)
{
InitializeComponent();
if (appOptions is null)
{
LogInSuccessAction = () => DisplayAlert("Login", "Success", "Cancel");
CloseAction = () => Navigation.PopModalAsync();
}
}
public Action LogInSuccessAction { get; set; }
public Action CloseAction { get; set; }
void LoginSuccess_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
{
LogInSuccessAction();
}
void Close_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
{
CloseAction();
}
}

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Bit.Core.MainPage">
<ScrollView>
<VerticalStackLayout
Padding="30,0"
Spacing="25">
<Button
Text="Go to Home"
Clicked="Button_Clicked" />
</VerticalStackLayout>
</ScrollView>
</ContentPage>

View File

@@ -0,0 +1,16 @@
namespace Bit.Core;
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
void Button_Clicked(System.Object sender, System.EventArgs e)
{
Navigation.PushModalAsync(new HomePage());
}
}

View File

@@ -0,0 +1,33 @@
using CommunityToolkit.Maui;
using Microsoft.Extensions.Logging;
namespace Bit.Core;
public static class MauiProgram
{
public static MauiAppBuilder ConfigureMauiAppBuilder(bool useMauiApp, Action<IMauiHandlersCollection> customHandlers = null)
{
var builder = MauiApp.CreateBuilder();
if (useMauiApp)
{
builder.UseMauiApp<Bit.Core.App>();
}
builder.UseMauiCommunityToolkit()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
})
.ConfigureMauiHandlers(handlers =>
{
customHandlers?.Invoke(handlers);
});
#if DEBUG
builder.Logging.AddDebug();
#endif
return builder;
}
}

View File

@@ -0,0 +1,8 @@
{
"profiles": {
"Windows Machine": {
"commandName": "MsixPackage",
"nativeDebugging": false
}
}
}

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<!-- Note: For Android please see also Platforms\Android\Resources\values\colors.xml -->
<Color x:Key="Primary">#512BD4</Color>
<Color x:Key="PrimaryDark">#ac99ea</Color>
<Color x:Key="PrimaryDarkText">#242424</Color>
<Color x:Key="Secondary">#DFD8F7</Color>
<Color x:Key="SecondaryDarkText">#9880e5</Color>
<Color x:Key="Tertiary">#2B0B98</Color>
<Color x:Key="White">White</Color>
<Color x:Key="Black">Black</Color>
<Color x:Key="Magenta">#D600AA</Color>
<Color x:Key="MidnightBlue">#190649</Color>
<Color x:Key="OffBlack">#1f1f1f</Color>
<Color x:Key="Gray100">#E1E1E1</Color>
<Color x:Key="Gray200">#C8C8C8</Color>
<Color x:Key="Gray300">#ACACAC</Color>
<Color x:Key="Gray400">#919191</Color>
<Color x:Key="Gray500">#6E6E6E</Color>
<Color x:Key="Gray600">#404040</Color>
<Color x:Key="Gray900">#212121</Color>
<Color x:Key="Gray950">#141414</Color>
<SolidColorBrush x:Key="PrimaryBrush" Color="{StaticResource Primary}"/>
<SolidColorBrush x:Key="SecondaryBrush" Color="{StaticResource Secondary}"/>
<SolidColorBrush x:Key="TertiaryBrush" Color="{StaticResource Tertiary}"/>
<SolidColorBrush x:Key="WhiteBrush" Color="{StaticResource White}"/>
<SolidColorBrush x:Key="BlackBrush" Color="{StaticResource Black}"/>
<SolidColorBrush x:Key="Gray100Brush" Color="{StaticResource Gray100}"/>
<SolidColorBrush x:Key="Gray200Brush" Color="{StaticResource Gray200}"/>
<SolidColorBrush x:Key="Gray300Brush" Color="{StaticResource Gray300}"/>
<SolidColorBrush x:Key="Gray400Brush" Color="{StaticResource Gray400}"/>
<SolidColorBrush x:Key="Gray500Brush" Color="{StaticResource Gray500}"/>
<SolidColorBrush x:Key="Gray600Brush" Color="{StaticResource Gray600}"/>
<SolidColorBrush x:Key="Gray900Brush" Color="{StaticResource Gray900}"/>
<SolidColorBrush x:Key="Gray950Brush" Color="{StaticResource Gray950}"/>
</ResourceDictionary>

View File

@@ -0,0 +1,427 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Style TargetType="ActivityIndicator">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="IndicatorView">
<Setter Property="IndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}"/>
<Setter Property="SelectedIndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray100}}"/>
</Style>
<Style TargetType="Border">
<Setter Property="Stroke" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="StrokeShape" Value="Rectangle"/>
<Setter Property="StrokeThickness" Value="1"/>
</Style>
<Style TargetType="BoxView">
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="Button">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource PrimaryDarkText}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource PrimaryDark}}" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="BorderWidth" Value="0"/>
<Setter Property="CornerRadius" Value="8"/>
<Setter Property="Padding" Value="14,10"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="PointerOver" />
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="CheckBox">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="DatePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Editor">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Entry">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Frame">
<Setter Property="HasShadow" Value="False" />
<Setter Property="BorderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="CornerRadius" Value="8" />
</Style>
<Style TargetType="ImageButton">
<Setter Property="Opacity" Value="1" />
<Setter Property="BorderColor" Value="Transparent"/>
<Setter Property="BorderWidth" Value="0"/>
<Setter Property="CornerRadius" Value="0"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="Opacity" Value="0.5" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="PointerOver" />
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Label">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Span">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="Label" x:Key="Headline">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource MidnightBlue}, Dark={StaticResource White}}" />
<Setter Property="FontSize" Value="32" />
<Setter Property="HorizontalOptions" Value="Center" />
<Setter Property="HorizontalTextAlignment" Value="Center" />
</Style>
<Style TargetType="Label" x:Key="SubHeadline">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource MidnightBlue}, Dark={StaticResource White}}" />
<Setter Property="FontSize" Value="24" />
<Setter Property="HorizontalOptions" Value="Center" />
<Setter Property="HorizontalTextAlignment" Value="Center" />
</Style>
<Style TargetType="ListView">
<Setter Property="SeparatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="RefreshControlColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="Picker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="ProgressBar">
<Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="RadioButton">
<Setter Property="BackgroundColor" Value="Transparent"/>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="RefreshView">
<Setter Property="RefreshColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="SearchBar">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
<Setter Property="CancelButtonColor" Value="{StaticResource Gray500}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="SearchHandler">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Shadow">
<Setter Property="Radius" Value="15" />
<Setter Property="Opacity" Value="0.5" />
<Setter Property="Brush" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
<Setter Property="Offset" Value="10,10" />
</Style>
<Style TargetType="Slider">
<Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
<Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="SwipeItem">
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
</Style>
<Style TargetType="Switch">
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="ThumbColor" Value="{StaticResource White}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="On">
<VisualState.Setters>
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Gray200}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Off">
<VisualState.Setters>
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray400}, Dark={StaticResource Gray500}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="TimePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent"/>
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Page" ApplyToDerivedTypes="True">
<Setter Property="Padding" Value="0"/>
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource OffBlack}}" />
</Style>
<Style TargetType="Shell" ApplyToDerivedTypes="True">
<Setter Property="Shell.BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource OffBlack}}" />
<Setter Property="Shell.ForegroundColor" Value="{OnPlatform WinUI={StaticResource Primary}, Default={StaticResource White}}" />
<Setter Property="Shell.TitleColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource SecondaryDarkText}}" />
<Setter Property="Shell.DisabledColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="Shell.UnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray200}}" />
<Setter Property="Shell.NavBarHasShadow" Value="False" />
<Setter Property="Shell.TabBarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
<Setter Property="Shell.TabBarForegroundColor" Value="{AppThemeBinding Light={StaticResource Magenta}, Dark={StaticResource White}}" />
<Setter Property="Shell.TabBarTitleColor" Value="{AppThemeBinding Light={StaticResource Magenta}, Dark={StaticResource White}}" />
<Setter Property="Shell.TabBarUnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="NavigationPage">
<Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource OffBlack}}" />
<Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
<Setter Property="IconColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="TabbedPage">
<Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Gray950}}" />
<Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Magenta}, Dark={StaticResource White}}" />
<Setter Property="UnselectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="SelectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,16 @@
using System;
namespace Bit.Core
{
public class ServiceContainer
{
public ServiceContainer()
{
}
public static void Reset()
{
}
}
}

View File

@@ -0,0 +1,11 @@
using System;
namespace Bit.Core
{
public static class State
{
public static bool IsAuthed { get; set; } = false;
public static bool IsLocked { get; set; } = false;
}
}

View File

@@ -0,0 +1,24 @@
namespace Core
{
public static class TaskExtensions
{
/// <summary>
/// Fires a task and ignores any exception.
/// See http://stackoverflow.com/a/22864616/344182
/// </summary>
/// <param name="task">The task to be forgotten.</param>
/// <param name="onException">Action to be called on exception.</param>
public static async void FireAndForget(this Task task, Action<Exception> onException = null)
{
try
{
await task.ConfigureAwait(false);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
onException?.Invoke(ex);
}
}
}
}

View File

@@ -0,0 +1,37 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 25.0.1706.7
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EmbeddedIOSNavigationIssue", "EmbeddedIOSNavigationIssue\EmbeddedIOSNavigationIssue.csproj", "{E8CBD3FE-E964-45B2-A308-B0DAEB3266E6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOSExtensionSample", "IOSExtensionSample\IOSExtensionSample.csproj", "{66607AD1-2F9F-43C2-98E6-8ECFFE80A61E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core", "Core\Core.csproj", "{452ACDA9-B7B3-4BDE-AAF3-A1453CAE2B21}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E8CBD3FE-E964-45B2-A308-B0DAEB3266E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E8CBD3FE-E964-45B2-A308-B0DAEB3266E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E8CBD3FE-E964-45B2-A308-B0DAEB3266E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E8CBD3FE-E964-45B2-A308-B0DAEB3266E6}.Release|Any CPU.Build.0 = Release|Any CPU
{66607AD1-2F9F-43C2-98E6-8ECFFE80A61E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{66607AD1-2F9F-43C2-98E6-8ECFFE80A61E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{66607AD1-2F9F-43C2-98E6-8ECFFE80A61E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{66607AD1-2F9F-43C2-98E6-8ECFFE80A61E}.Release|Any CPU.Build.0 = Release|Any CPU
{452ACDA9-B7B3-4BDE-AAF3-A1453CAE2B21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{452ACDA9-B7B3-4BDE-AAF3-A1453CAE2B21}.Debug|Any CPU.Build.0 = Debug|Any CPU
{452ACDA9-B7B3-4BDE-AAF3-A1453CAE2B21}.Release|Any CPU.ActiveCfg = Release|Any CPU
{452ACDA9-B7B3-4BDE-AAF3-A1453CAE2B21}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {54599F8D-8A3F-4A2A-AD7D-D7396CE679D6}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,73 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0-android;net8.0-ios</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
<OutputType>Exe</OutputType>
<RootNamespace>EmbeddedIOSNavigationIssue</RootNamespace>
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<ForceSimulatorX64ArchitectureInIDE>true</ForceSimulatorX64ArchitectureInIDE>
<!-- Display name -->
<ApplicationTitle>EmbeddedIOSNavigationIssue</ApplicationTitle>
<!-- App Identifier -->
<ApplicationId>com.8bit.bitwarden</ApplicationId>
<!-- Versions -->
<ApplicationDisplayVersion>2023.12.1</ApplicationDisplayVersion>
<ApplicationVersion>1</ApplicationVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">12.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net8.0-ios|AnyCPU'">
<CreatePackage>false</CreatePackage>
<CodesignProvision>Automatic</CodesignProvision>
<CodesignKey>iPhone Developer</CodesignKey>
<CodesignEntitlements>Platforms\iOS\Entitlements.plist</CodesignEntitlements>
<UseInterpreter>true</UseInterpreter>
</PropertyGroup>
<ItemGroup>
<!-- App Icon -->
<MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" Color="#512BD4" />
<!-- Splash Screen -->
<MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="128,128" />
<!-- Images -->
<MauiFont Include="Resources\Fonts\*" />
<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="8.0.0" />
</ItemGroup>
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">
<ProjectReference Include="..\IOSExtensionSample\IOSExtensionSample.csproj">
<IsAppExtension>true</IsAppExtension>
<IsWatchApp>false</IsWatchApp>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Core\Core.csproj" />
</ItemGroup>
<ItemGroup>
<None Remove="Resources\Images\" />
</ItemGroup>
<ItemGroup>
<Folder Include="Resources\Images\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,12 @@
using Microsoft.Maui.Hosting;
namespace EmbeddedIOSNavigationIssue;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
return Bit.Core.MauiProgram.ConfigureMauiAppBuilder(true).Build();
}
}

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

View File

@@ -0,0 +1,11 @@
using Android.App;
using Android.Content.PM;
using Android.OS;
namespace EmbeddedIOSNavigationIssue;
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
}

View File

@@ -0,0 +1,16 @@
using Android.App;
using Android.Runtime;
namespace EmbeddedIOSNavigationIssue;
[Application]
public class MainApplication : MauiApplication
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership)
: base(handle, ownership)
{
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#512BD4</color>
<color name="colorPrimaryDark">#2B0B98</color>
<color name="colorAccent">#2B0B98</color>
</resources>

View File

@@ -0,0 +1,11 @@
using Foundation;
using Microsoft.Maui.Hosting;
namespace EmbeddedIOSNavigationIssue;
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.authentication-services.autofill-credential-provider</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.8bit.bitwarden</string>
</array>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)com.8bit.bitwarden</string>
</array>
<key>com.apple.developer.ubiquity-container-identifiers</key>
<array>
<string>iCloud.$(CFBundleIdentifier)</string>
</array>
<key>com.apple.developer.associated-domains</key>
<array>
<string>webcredentials:bitwarden.com</string>
</array>
<key>aps-environment</key>
<string>development</string>
</dict>
</plist>

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/appicon.appiconset</string>
</dict>
</plist>

View File

@@ -0,0 +1,16 @@
using ObjCRuntime;
using UIKit;
namespace EmbeddedIOSNavigationIssue;
public class Program
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, typeof(AppDelegate));
}
}

View File

@@ -0,0 +1,8 @@
{
"profiles": {
"Windows Machine": {
"commandName": "MsixPackage",
"nativeDebugging": false
}
}
}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg">
<rect x="0" y="0" width="456" height="456" fill="#512BD4" />
</svg>

View File

@@ -0,0 +1,8 @@
<?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">
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<path d="m 105.50037,281.60863 c -2.70293,0 -5.00091,-0.90042 -6.893127,-2.70209 -1.892214,-1.84778 -2.837901,-4.04181 -2.837901,-6.58209 0,-2.58722 0.945687,-4.80389 2.837901,-6.65167 1.892217,-1.84778 4.190197,-2.77167 6.893127,-2.77167 2.74819,0 5.06798,0.92389 6.96019,2.77167 1.93749,1.84778 2.90581,4.06445 2.90581,6.65167 0,2.54028 -0.96832,4.73431 -2.90581,6.58209 -1.89221,1.80167 -4.212,2.70209 -6.96019,2.70209 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 213.56111,280.08446 H 195.99044 L 149.69953,207.0544 c -1.17121,-1.84778 -2.14037,-3.76515 -2.90581,-5.75126 h -0.40578 c 0.36051,2.12528 0.54076,6.67515 0.54076,13.6496 v 65.13172 h -15.54349 v -99.36009 h 18.71925 l 44.7374,71.29798 c 1.89222,2.95695 3.1087,4.98917 3.64945,6.09751 h 0.26996 c -0.45021,-2.6325 -0.67573,-7.09015 -0.67573,-13.37293 v -64.02256 h 15.47557 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="m 289.25134,280.08446 h -54.40052 v -99.36009 h 52.23835 v 13.99669 h -36.15411 v 28.13085 h 33.31621 v 13.9271 h -33.31621 v 29.37835 h 38.31628 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 366.56466,194.72106 H 338.7222 v 85.3634 h -16.08423 v -85.3634 h -27.77455 v -13.99669 h 71.70124 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
</svg>

View File

@@ -0,0 +1,18 @@
Any raw assets you want to be deployed with your application can be placed in
this directory (and child directories). Deployment of the asset to your application
is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
These files will be deployed with you package and will be accessible using Essentials:
async Task LoadMauiAsset()
{
using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
using var reader = new StreamReader(stream);
var contents = reader.ReadToEnd();
}

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