1
0
mirror of https://github.com/bitwarden/mobile synced 2025-12-05 23:53:33 +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
store/apple/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:
- ".github/workflows/**"
workflow_dispatch:
inputs: {}
env:
main_app_folder_path: src/App
@@ -17,31 +16,30 @@ env:
target-net-version: net8.0
jobs:
# cloc:
# name: CLOC
# runs-on: ubuntu-20.04
# steps:
# - name: Checkout repo
# uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
cloc:
name: CLOC
runs-on: ubuntu-22.04
steps:
- name: Checkout repo
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
# - name: Set up CLOC
# run: |
# sudo apt-get update
# 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: Set up CLOC
run: |
sudo apt-get update
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
setup:
name: Setup
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
outputs:
rc_branch_exists: ${{ steps.branch-check.outputs.rc_branch_exists }}
hotfix_branch_exists: ${{ steps.branch-check.outputs.hotfix_branch_exists }}
steps:
- name: Checkout repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
submodules: 'true'
@@ -59,7 +57,6 @@ jobs:
else
echo "hotfix_branch_exists=0" >> $GITHUB_OUTPUT
fi
shell: bash
android:
name: Android
@@ -93,6 +90,12 @@ jobs:
- name: Setup Windows builder
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
run: |
nuget help | grep Version
@@ -102,9 +105,10 @@ jobs:
echo "GitHub event: $GITHUB_EVENT"
- name: Checkout repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
fetch-depth: 0
- name: Decrypt secrets
env:
DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
@@ -118,6 +122,7 @@ jobs:
gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
--output $HOME/secrets/play_creds.json ./.github/secrets/play_creds.json.gpg
shell: bash
- name: Decrypt secrets - Google Services
if: ${{ matrix.variant == 'prod' }}
env:
@@ -126,6 +131,7 @@ jobs:
gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
--output ./${{ env.android_folder_path }}/google-services.json ./.github/secrets/google-services.json.gpg
shell: bash
- name: Increment version
run: |
BUILD_NUMBER=$((3000 + $GITHUB_RUN_NUMBER))
@@ -143,15 +149,12 @@ jobs:
- name: Restore tools
run: dotnet tool restore
shell: pwsh
# - name: Verify Format
# run: dotnet tool run dotnet-format --check
# shell: pwsh
#- name: Run Core tests
# run: dotnet test test/Core.Test/Core.Test.csproj --logger "trx;LogFileName=test-results.trx"
# shell: pwsh
# - name: Run Core tests
# run: dotnet test test/Core.Test/Core.Test.csproj --logger "trx;LogFileName=test-results.trx"
#- name: Report test results
# uses: dorny/test-reporter@c9b3d0e2bd2a4e96aaf424dbaa31c46b42318226 # v1.6.0
@@ -179,7 +182,6 @@ jobs:
Write-Output "########################################"
dotnet build $projToBuild -c $configuration -f ${{ env.target-net-version }}-android
shell: pwsh
- name: Sign Android Build
env:
@@ -221,10 +223,10 @@ jobs:
$signedApkDestPath = $($env:GITHUB_WORKSPACE + "/$($packageName).apk");
Copy-Item $signedApkPath $signedApkDestPath
shell: pwsh
- name: Upload Prod .aab artifact
if: ${{ matrix.variant == 'prod' }}
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with:
name: com.x8bit.bitwarden.aab
path: ./com.x8bit.bitwarden.aab
@@ -232,7 +234,7 @@ jobs:
- name: Upload Prod .apk artifact
if: ${{ matrix.variant == 'prod' }}
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with:
name: com.x8bit.bitwarden.apk
path: ./com.x8bit.bitwarden.apk
@@ -240,7 +242,7 @@ jobs:
- name: Upload Other .apk artifact
if: ${{ matrix.variant != 'prod' }}
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with:
name: 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
if: ${{ matrix.variant == 'prod' }}
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with:
name: bw-android-apk-sha256.txt
path: ./bw-android-apk-sha256.txt
@@ -268,20 +270,20 @@ jobs:
- name: Upload .apk sha file for other
if: ${{ matrix.variant != 'prod' }}
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with:
name: bw-android-${{ matrix.variant }}-apk-sha256.txt
path: ./bw-android-${{ matrix.variant }}-apk-sha256.txt
if-no-files-found: error
- 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.hotfix_branch_exists == 0)
|| (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0)
|| github.ref == 'refs/heads/hotfix-rc' ) }}
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"
AAB_PATH="$GITHUB_WORKSPACE/com.x8bit.bitwarden.aab"
TRACK="internal"
@@ -318,6 +320,12 @@ jobs:
- name: Setup Windows builder
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
run: |
nuget help | grep Version
@@ -327,7 +335,7 @@ jobs:
echo "GitHub event: $GITHUB_EVENT"
- name: Checkout repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Decrypt secrets
env:
@@ -419,7 +427,6 @@ jobs:
# $appCenterNode.ParentNode.RemoveChild($appCenterNode);
# $xml.Save($corePath);
shell: pwsh
- name: Restore packages
run: dotnet restore
@@ -435,8 +442,6 @@ jobs:
dotnet build $projToBuild -c $configuration -f ${{ env.target-net-version }}-android /p:CustomConstants="FDROID"
shell: pwsh
- name: Sign for F-Droid
env:
FDROID_KEYSTORE_PASSWORD: ${{ secrets.FDROID_KEYSTORE_PASSWORD }}
@@ -458,10 +463,9 @@ jobs:
$signedApkDestPath = $($env:GITHUB_WORKSPACE + "/com.x8bit.bitwarden-fdroid.apk");
Copy-Item $signedApkPath $signedApkDestPath
shell: pwsh
- name: Upload F-Droid .apk artifact
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with:
name: 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
- name: Upload F-Droid sha file
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with:
name: bw-fdroid-apk-sha256.txt
path: ./bw-fdroid-apk-sha256.txt
if-no-files-found: error
# Disabling iOS build from this branch until fixing publish/build
# really long time
ios:
name: Apple iOS
if: github.ref == 'refs/heads/master'
runs-on: macos-13
needs: setup
env:
ios_folder_path: src/App/Platforms/iOS
app_output_name: App
app_ci_output_filename: App_x64_Debug
steps:
- name: Set XCode version
uses: maxim-lobanov/setup-xcode@v1
uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0
with:
xcode-version: 15.0.1
@@ -518,7 +520,7 @@ jobs:
echo "GitHub event: $GITHUB_EVENT"
- name: Checkout repo
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
submodules: 'true'
@@ -529,17 +531,10 @@ jobs:
- name: Retrieve secrets
id: retrieve-secrets
env:
KEYVAULT: bitwarden-ci
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
uses: bitwarden/gh-actions/get-keyvault-secrets@main
with:
keyvault: "bitwarden-ci"
secrets: "appcenter-ios-token"
- name: Decrypt secrets
env:
@@ -568,7 +563,6 @@ jobs:
./.github/secrets/dist_watch_app_extension.mobileprovision.gpg
gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
--output ./src/watchOS/bitwarden/GoogleService-Info.plist ./.github/secrets/GoogleService-Info.plist.gpg
shell: bash
- name: Increment version
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
cd src/watchOS/bitwarden
agvtool new-version -all $BUILD_NUMBER
cd ../../..
shell: bash
- name: Update Entitlements
run: |
@@ -594,8 +586,7 @@ jobs:
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
shell: bash
- name: Set up Keychain
env:
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 \
-T /usr/bin/codesign -T /usr/bin/security
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain
shell: bash
- name: Set up provisioning profiles
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\}")
cp $WATCH_APP_EXTENSION_PROFILE_PATH "$PROFILES_DIR_PATH/$WATCH_APP_EXTENSION_UUID.mobileprovision"
shell: bash
- name: Restore packages
run: dotnet restore
@@ -658,7 +647,6 @@ jobs:
echo "########################################"
echo "##### Done"
echo "########################################"
shell: bash
- name: Archive Build for App Store
run: |
@@ -666,7 +654,7 @@ jobs:
Write-Output "##### Archive for Release ios-arm64
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 "##### Done"
@@ -676,10 +664,10 @@ jobs:
- name: Archive Build for Mobile Automation
run: |
Write-Output "########################################"
Write-Output "##### Archive Releae for iossimulator-arm64
Write-Output "##### Archive Debug for iossimulator-x64
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 "##### Done"
@@ -695,16 +683,14 @@ jobs:
xcodebuild -exportArchive -archivePath $ARCHIVE_PATH -exportPath $EXPORT_PATH \
-exportOptionsPlist $EXPORT_OPTIONS_PATH
shell: bash
- name: Export .app for Automation CI
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"
zip -r -q ${{ env.app_output_name }}.app.zip $ARCHIVE_PATH
mv ${{ env.app_output_name }}.app.zip $EXPORT_PATH
shell: bash
zip -r -q ${{ env.app_ci_output_filename }}.app.zip $ARCHIVE_PATH
mv ${{ env.app_ci_output_filename }}.app.zip $EXPORT_PATH
- name: Copy all dSYMs files to upload
run: |
@@ -717,27 +703,26 @@ jobs:
cp -r -v $ARCHIVE_DSYMS_PATH $EXPORT_PATH
mkdir $WATCH_DSYMS_EXPORT_PATH
cp -r -v $WATCH_ARCHIVE_DSYMS_PATH $WATCH_DSYMS_EXPORT_PATH
shell: bash
- name: Upload App Store .ipa & dSYMs artifacts
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with:
name: Bitwarden iOS
path: |
./bitwarden-export/${{ env.app_output_name }}.ipa
./bitwarden-export/Bitwarden.ipa
./bitwarden-export/dSYMs/*.*
if-no-files-found: error
- name: Upload .app file for Automation CI
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
with:
name: ${{ env.app_output_name }}.app.zip
path: ./bitwarden-export/${{ env.app_output_name }}.app.zip
name: ${{ env.app_ci_output_filename }}.app.zip
path: ./bitwarden-export/${{ env.app_ci_output_filename }}.app.zip
if-no-files-found: error
- name: Install AppCenter CLI
if: |
(github.ref == 'refs/heads/master'
(github.ref == 'refs/heads/main'
&& needs.setup.outputs.rc_branch_exists == 0
&& 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
if: |
(github.ref == 'refs/heads/master'
(github.ref == 'refs/heads/main'
&& needs.setup.outputs.rc_branch_exists == 0
&& 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:
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
shell: bash
- name: Upload Watch dSYMs to Firebase Crashlytics
if: |
(github.ref == 'refs/heads/master'
(github.ref == 'refs/heads/main'
&& needs.setup.outputs.rc_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/hotfix-rc'
run: |
echo "########################################"
echo "##### Uploading Watch dSYMs to Firebase"
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" \;
shell: bash
- name: Deploy to App Store
- name: Validate app in App Store
if: |
(github.ref == 'refs/heads/master'
&& needs.setup.outputs.rc_branch_exists == 0
@@ -783,116 +765,116 @@ jobs:
APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
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"
shell: bash
# crowdin-push:
# name: Crowdin Push
# if: github.ref == 'refs/heads/master'
# needs:
# - android
# - f-droid
# - ios
# runs-on: ubuntu-20.04
# env:
# _CROWDIN_PROJECT_ID: "269690"
# steps:
# - name: Checkout repo
# 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
- name: Deploy to App Store
if: |
(github.ref == 'refs/heads/main'
&& needs.setup.outputs.rc_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/hotfix-rc'
env:
APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
run: |
xcrun altool --upload-app --type ios --file "./bitwarden-export/Bitwarden.ipa" \
--username "$APPLE_ID_USERNAME" --password "$APPLE_ID_PASSWORD"
# check-failures:
# name: Check for failures
# if: always()
# runs-on: ubuntu-20.04
# needs:
# - cloc
# - android
# - f-droid
# - ios
# - crowdin-push
# steps:
# - name: Check if any job failed
# if: |
# (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
crowdin-push:
name: Crowdin Push
if: github.ref == 'refs/heads/main'
needs:
- android
- f-droid
- ios
runs-on: ubuntu-22.04
env:
_CROWDIN_PROJECT_ID: "269690"
steps:
- name: Checkout repo
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
# - name: Login to Azure - CI Subscription
# uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.6
# if: failure()
# with:
# creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
- 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
# if: failure()
# env:
# KEYVAULT: bitwarden-ci
# SECRETS: |
# 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: Retrieve secrets
id: retrieve-secrets
uses: bitwarden/gh-actions/get-keyvault-secrets@main
with:
keyvault: "bitwarden-ci"
secrets: "crowdin-api-token"
# - 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 }}
- 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: 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 }}
with:
config: crowdin.yml
crowdin_branch_name: master
crowdin_branch_name: main
upload_sources: false
upload_translations: false
download_translations: true

View File

@@ -80,7 +80,7 @@ jobs:
with:
workflow: build.yml
workflow_conclusion: success
branch: master
branch: main
- name: Prep Bitwarden iOS release asset
run: zip -r Bitwarden\ iOS.zip Bitwarden\ iOS
@@ -143,7 +143,7 @@ jobs:
with:
workflow: build.yml
workflow_conclusion: success
branch: master
branch: main
name: com.x8bit.bitwarden-fdroid.apk
- 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.
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
with:
version_number: ${{ needs.setup.outputs.version_number }}
secrets: inherit

View File

@@ -1,26 +1,23 @@
---
name: Version Bump
run-name: Version Bump - v${{ inputs.version_number }}
on:
workflow_dispatch:
inputs:
version_number:
description: "New Version"
description: "New version (example: '2024.1.0')"
required: true
workflow_call:
inputs:
version_number:
required: true
type: string
cut_rc_branch:
description: "Cut RC branch?"
default: true
type: boolean
jobs:
bump_version:
name: "Create version_bump_${{ github.event.inputs.version_number }} branch"
runs-on: ubuntu-20.04
name: "Bump Version to v${{ inputs.version_number }}"
runs-on: ubuntu-22.04
steps:
- name: Checkout Branch
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
- name: Login to Azure - CI Subscription
uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7
with:
@@ -31,7 +28,15 @@ jobs:
uses: bitwarden/gh-actions/get-keyvault-secrets@main
with:
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
uses: crazy-max/ghaction-import-gpg@d6f3f49f3345e29369fe57596a3ca8f94c4d2ca7 # v5.4.0
@@ -42,37 +47,68 @@ jobs:
git_commit_gpgsign: true
- 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
uses: bitwarden/gh-actions/version-bump@main
with:
version: ${{ github.event.inputs.version_number }}
file_path: "./src/Android/Properties/AndroidManifest.xml"
version: ${{ inputs.version_number }}
file_path: "src/Android/Properties/AndroidManifest.xml"
- name: Bump Version - iOS.Autofill
uses: bitwarden/gh-actions/version-bump@main
with:
version: ${{ github.event.inputs.version_number }}
file_path: "./src/iOS.Autofill/Info.plist"
version: ${{ inputs.version_number }}
file_path: "src/iOS.Autofill/Info.plist"
- name: Bump Version - iOS.Extension
uses: bitwarden/gh-actions/version-bump@main
with:
version: ${{ github.event.inputs.version_number }}
file_path: "./src/iOS.Extension/Info.plist"
version: ${{ inputs.version_number }}
file_path: "src/iOS.Extension/Info.plist"
- name: Bump Version - iOS.ShareExtension
uses: bitwarden/gh-actions/version-bump@main
with:
version: ${{ github.event.inputs.version_number }}
file_path: "./src/iOS.ShareExtension/Info.plist"
version: ${{ inputs.version_number }}
file_path: "src/iOS.ShareExtension/Info.plist"
- name: Bump Version - iOS
uses: bitwarden/gh-actions/version-bump@main
with:
version: ${{ github.event.inputs.version_number }}
file_path: "./src/iOS/Info.plist"
version: ${{ inputs.version_number }}
file_path: "src/iOS/Info.plist"
- name: Setup git
run: |
@@ -91,22 +127,24 @@ jobs:
- name: Commit files
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
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
if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
id: create-pr
env:
PR_BRANCH: "version_bump_${{ github.event.inputs.version_number }}"
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
BASE_BRANCH: master
TITLE: "Bump version to ${{ github.event.inputs.version_number }}"
GH_TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}
PR_BRANCH: ${{ steps.create-branch.outputs.name }}
TITLE: "Bump version to ${{ inputs.version_number }}"
run: |
gh pr create --title "$TITLE" \
--base "$BASE" \
PR_URL=$(gh pr create --title "$TITLE" \
--base "main" \
--head "$PR_BRANCH" \
--label "version update" \
--label "automated pr" \
@@ -119,4 +157,24 @@ jobs:
- [X] Other
## 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'">
<CreatePackage>false</CreatePackage>
<CodesignProvision>Automatic</CodesignProvision>
<CodesignKey>iPhone Developer</CodesignKey>
<CodesignKey>iPhone Developer</CodesignKey>
<CodesignEntitlements>Platforms\iOS\Entitlements.plist</CodesignEntitlements>
<MtouchInterpreter>all</MtouchInterpreter>
<MtouchLink>None</MtouchLink>
<!--TODO: add argon2id load when library is built with the corresponding architecture for iOS Simulator-->
<UseInterpreter>true</UseInterpreter>
<!--TODO: add argon2id load when library is built with the corresponding architecture for iOS Simulator-->
</PropertyGroup>
<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>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-ios|AnyCPU'">
<CreatePackage>false</CreatePackage>
<CodesignProvision>Automatic:AppStore</CodesignProvision>
<CodesignKey>iPhone Distribution</CodesignKey>
<CodesignProvision>Automatic:AppStore</CodesignProvision>
<CodesignKey>iPhone Distribution</CodesignKey>
<CodesignEntitlements>Platforms\iOS\Entitlements.plist</CodesignEntitlements>
<MtouchInterpreter>all</MtouchInterpreter>
<MtouchLink>None</MtouchLink>
<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>
<UseInterpreter>true</UseInterpreter>
<MtouchExtraArgs>-gcc_flags "-L$(ProjectDir)../../lib/ios -largon2 -force_load $(ProjectDir)../../lib/ios/libargon2.a"</MtouchExtraArgs>
</PropertyGroup>
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">
<!--This is needed for PCLCrypto to work correctly-->
<TrimmerRootAssembly Include="System.Security.Cryptography" />
</ItemGroup>
<ItemGroup>
<AndroidNativeLibrary Include="Platforms\Android\lib\arm64-v8a\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="zxcvbn-core" Version="7.0.92" />
<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.Compatibility" Version="2.88.4-preview.84" />
<PackageReference Include="FFImageLoadingCompat.Maui" Version="0.1.1" />
@@ -115,7 +117,6 @@
<Folder Include="Platforms\Android\Utilities\" />
</ItemGroup>
<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.Activity.Ktx" Version="1.7.2.1" />
</ItemGroup>
@@ -219,8 +220,8 @@
<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>
<WatchAppBundle>Bitwarden.app</WatchAppBundle>
<WatchAppConfiguration Condition="'$(RuntimeIdentifier)'!='ios-arm64'"> >watchsimulator</WatchAppConfiguration>
<WatchAppConfiguration Condition="'$(RuntimeIdentifier)'=='ios-arm64'"> >watchos</WatchAppConfiguration>
<WatchAppConfiguration Condition="'$(RuntimeIdentifier)'!='ios-arm64'">watchsimulator</WatchAppConfiguration>
<WatchAppConfiguration Condition="'$(RuntimeIdentifier)'=='ios-arm64'">watchos</WatchAppConfiguration>
<WatchAppBundleFullPath Condition=" '$(Configuration)' == 'Debug' ">$(WatchAppBuildPath)/$(Configuration)-$(WatchAppConfiguration)/$(WatchAppBundle)</WatchAppBundleFullPath>
<WatchAppBundleFullPath Condition=" '$(Configuration)' != 'Debug' ">$(WatchAppBuildPath)/$(WatchAppBundle)</WatchAppBundleFullPath>
</PropertyGroup>

View File

@@ -112,6 +112,7 @@ namespace Bit.Droid.Accessibility
new Browser("org.bromite.chromium", "url_bar"),
new Browser("org.chromium.chrome", "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.mozilla.fenix", "mozac_browser_toolbar_url_view"),
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"?>
<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">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
<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="34" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

View File

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

View File

@@ -12,7 +12,6 @@ using Bit.Core.Abstractions;
using Bit.Core.Services;
using Bit.Core.Utilities;
using Bit.Droid.Services;
using Plugin.CurrentActivity;
using Plugin.Fingerprint;
using Xamarin.Android.Net;
using System.Net.Http;
@@ -101,7 +100,6 @@ namespace Bit.Droid
{
base.OnCreate();
Bootstrap();
CrossCurrentActivity.Current.Init(this);
}
public void OnProviderInstallFailed(int errorCode, Intent recoveryIntent)
@@ -136,7 +134,7 @@ namespace Bit.Droid
// });
// 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 localAppDataFolderPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);

View File

@@ -7,7 +7,7 @@
<item name="android:windowSplashScreenAnimatedIcon">@drawable/splash_screen_round</item>
</style>
<style name="BaseTheme" parent="Theme.AppCompat">
<style name="BaseTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="colorPrimaryDark">@color/dark_notificationBar</item>
@@ -18,10 +18,6 @@
<item name="android:colorActivatedHighlight">@android:color/transparent</item>
<item name="android:textCursorDrawable">@null</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>
</style>
</resources>

View File

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

View File

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

View File

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

View File

@@ -41,13 +41,13 @@ namespace Bit.Droid.Services
JavaSystem.LoadLibrary("argon2");
int keySize = 32;
var key = new byte[keySize];
//argon2id_hash_raw(iterations, memory, parallelism,
// password, password.Length, salt, salt.Length, key, key.Length);
argon2id_hash_raw(iterations, memory, parallelism,
password, password.Length, salt, salt.Length, key, key.Length);
return key;
}
//[DllImport("argon2", EntryPoint = "argon2id_hash_raw")]
//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);
[DllImport("argon2", EntryPoint = "argon2id_hash_raw")]
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);
}
}

View File

@@ -18,7 +18,6 @@ using Bit.App.Utilities.Prompts;
using Bit.Core.Abstractions;
using Bit.Core.Enums;
using Bit.App.Droid.Utilities;
using Plugin.CurrentActivity;
using Microsoft.Maui.Controls.Compatibility.Platform.Android;
using Resource = Bit.Core.Resource;
using Application = Android.App.Application;
@@ -66,7 +65,7 @@ namespace Bit.Droid.Services
_toast.Dispose();
_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);
_toast.Show();
}
@@ -79,7 +78,7 @@ namespace Bit.Droid.Services
// https://developer.android.com/reference/android/content/pm/PackageManager#getLaunchIntentSenderForPackage(java.lang.String)
return false;
}
var activity = CrossCurrentActivity.Current.Activity;
var activity = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
appName = appName.Replace("androidapp://", string.Empty);
var launchIntentSender = activity?.PackageManager?.GetLaunchIntentSenderForPackage(appName);
launchIntentSender?.SendIntent(activity, Result.Ok, null, null, null);
@@ -93,7 +92,7 @@ namespace Bit.Droid.Services
await HideLoadingAsync();
}
var activity = CrossCurrentActivity.Current.Activity;
var activity = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var inflater = (LayoutInflater)activity.GetSystemService(Context.LayoutInflaterService);
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
if (CrossCurrentActivity.Current.Activity is MainActivity activity && IsAlive(activity))
if (Microsoft.Maui.ApplicationModel.Platform.CurrentActivity is MainActivity activity && IsAlive(activity))
{
activity.RunOnUiThread(actionDismiss);
return Task.CompletedTask;
@@ -193,7 +192,7 @@ namespace Bit.Droid.Services
string text = null, string okButtonText = null, string cancelButtonText = null,
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)
{
return Task.FromResult<string>(null);
@@ -250,7 +249,7 @@ namespace Bit.Droid.Services
public Task<ValidatablePromptResponse?> DisplayValidatablePromptAsync(ValidatablePromptConfig config)
{
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (activity == null)
{
return Task.FromResult<ValidatablePromptResponse?>(null);
@@ -327,7 +326,7 @@ namespace Bit.Droid.Services
public void RateApp()
{
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
try
{
var rateIntent = RateIntentForUrl("market://details", activity);
@@ -360,14 +359,14 @@ namespace Bit.Droid.Services
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;
return manager.DefaultAdapter?.IsEnabled ?? false;
}
public bool SupportsCamera()
{
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
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)
{
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (activity == null)
{
return Task.FromResult<string>(null);
@@ -464,7 +463,7 @@ namespace Bit.Droid.Services
public void OpenAccessibilityOverlayPermissionSettings()
{
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
try
{
var intent = new Intent(Settings.ActionManageOverlayPermission);
@@ -495,7 +494,7 @@ namespace Bit.Droid.Services
{
try
{
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var intent = new Intent(Settings.ActionAccessibilitySettings);
activity.StartActivity(intent);
}
@@ -504,7 +503,7 @@ namespace Bit.Droid.Services
public void OpenAutofillSettings()
{
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
try
{
var intent = new Intent(Settings.ActionRequestSetAutofillService);
@@ -535,7 +534,7 @@ namespace Bit.Droid.Services
public void CloseMainApp()
{
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (activity == null)
{
return;
@@ -574,7 +573,7 @@ namespace Bit.Droid.Services
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;
}
@@ -585,7 +584,7 @@ namespace Bit.Droid.Services
public async Task SetScreenCaptureAllowedAsync()
{
var activity = CrossCurrentActivity.Current?.Activity;
var activity = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (await _stateService.GetScreenCaptureAllowedAsync())
{
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;
using Bit.Core.Abstractions;
using Plugin.CurrentActivity;
using FileProvider = AndroidX.Core.Content.FileProvider;
namespace Bit.Droid.Services
@@ -43,7 +42,7 @@ namespace Bit.Droid.Services
{
try
{
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var intent = BuildOpenFileIntent(fileData, fileName);
if (intent == null)
{
@@ -60,7 +59,7 @@ namespace Bit.Droid.Services
{
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));
if (intent == null)
{
@@ -87,7 +86,7 @@ namespace Bit.Droid.Services
return null;
}
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var cachePath = activity.CacheDir;
var filePath = Path.Combine(cachePath.Path, fileName);
File.WriteAllBytes(filePath, fileData);
@@ -114,7 +113,7 @@ namespace Bit.Droid.Services
{
try
{
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (contentUri != null)
{
@@ -162,7 +161,7 @@ namespace Bit.Droid.Services
{
try
{
DeleteDir(CrossCurrentActivity.Current.Activity.CacheDir);
DeleteDir(Microsoft.Maui.ApplicationModel.Platform.CurrentActivity?.CacheDir);
await _stateService.SetLastFileCacheClearAsync(DateTime.UtcNow);
}
catch (Exception) { }
@@ -170,7 +169,7 @@ namespace Bit.Droid.Services
public Task SelectFileAsync()
{
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
var hasStorageWritePermission = !_cameraPermissionsDenied &&
HasPermission(Manifest.Permission.WriteExternalStorage);
var additionalIntents = new List<IParcelable>();
@@ -249,20 +248,30 @@ namespace Bit.Droid.Services
private bool HasPermission(string permission)
{
return ContextCompat.CheckSelfPermission(
CrossCurrentActivity.Current.Activity, permission) == Permission.Granted;
var activity = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (activity != null)
{
return ContextCompat.CheckSelfPermission(activity, permission) == Permission.Granted;
}
else
{
return false;
}
}
private void AskPermission(string permission)
{
ActivityCompat.RequestPermissions(CrossCurrentActivity.Current.Activity, new string[] { permission },
Core.Constants.SelectFilePermissionRequestCode);
var activity = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
if (activity != null)
{
ActivityCompat.RequestPermissions(activity, new string[] { permission }, Core.Constants.SelectFilePermissionRequestCode);
}
}
private List<IParcelable> GetCameraIntents(Android.Net.Uri outputUri)
{
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 listCam = pm.QueryIntentActivities(captureIntent, 0);
foreach (var res in listCam)

View File

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

View File

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

View File

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

View File

@@ -1,68 +1,10 @@
using System;
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
namespace Bit.App.Controls
{
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()
{
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"
x:Class="Bit.App.Controls.CipherViewCell"
xmlns:controls="clr-namespace:Bit.App.Controls"
xmlns:pages="clr-namespace:Bit.App.Pages"
xmlns:u="clr-namespace:Bit.App.Utilities"
xmlns:ff="clr-namespace:FFImageLoading.Maui;assembly=FFImageLoading.Compat.Maui"
xmlns:core="clr-namespace:Bit.Core"
StyleClass="list-row, list-row-platform"
RowSpacing="0"
ColumnSpacing="0"
x:DataType="controls:CipherViewCellViewModel"
x:DataType="pages:CipherItemViewModel"
AutomationId="CipherCell">
<Grid.Resources>
@@ -64,23 +65,23 @@
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Label
LineBreakMode="TailTruncation"
Grid.Column="0"
Grid.Row="0"
LineBreakMode="TailTruncation"
StyleClass="list-title, list-title-platform"
Text="{Binding Cipher.Name}"
AutomationId="CipherNameLabel" />
<Label
LineBreakMode="TailTruncation"
Grid.Column="0"
Grid.Row="1"
Grid.ColumnSpan="3"
LineBreakMode="TailTruncation"
StyleClass="list-subtitle, list-subtitle-platform"
Text="{Binding Cipher.SubTitle}"
IsVisible="{Binding Source={RelativeSource Self}, Path=Text,

View File

@@ -1,6 +1,6 @@
using System.Windows.Input;
using Bit.App.Abstractions;
using Bit.Core.Models.View;
using Bit.App.Pages;
using Bit.Core.Utilities;
namespace Bit.App.Controls
@@ -10,12 +10,6 @@ namespace Bit.App.Controls
private const int ICON_COLUMN_DEFAULT_WIDTH = 40;
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(
nameof(ButtonCommand), typeof(ICommand), typeof(CipherViewCell));
@@ -29,40 +23,17 @@ namespace Bit.App.Controls
_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
{
get => GetValue(ButtonCommandProperty) as ICommand;
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)
{
var cipher = ((sender as MiButton)?.BindingContext as CipherViewCellViewModel)?.Cipher;
if (cipher != null)
if (BindingContext is CipherItemViewModel cipherItem)
{
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.*")
var touchBehavior = new TouchBehavior()
{
NativeAnimation = true
NativeAnimation = true,
ShouldMakeChildrenInputTransparent = false
};
Behaviors.Add(touchBehavior);
#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.*")
var touchBehavior = new TouchBehavior()
{
NativeAnimation = true
NativeAnimation = true,
ShouldMakeChildrenInputTransparent = false
};
Behaviors.Add(touchBehavior);
#endif

View File

@@ -38,7 +38,7 @@
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<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.Compatibility" Version="2.88.4-preview.84" />
<PackageReference Include="FFImageLoadingCompat.Maui" Version="0.1.1" />
@@ -47,7 +47,6 @@
<PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
</ItemGroup>
<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.Activity.Ktx" Version="1.7.2.1" />
</ItemGroup>

View File

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

View File

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

View File

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

View File

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

View File

@@ -68,7 +68,8 @@ namespace Bit.App.Pages
{
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,
_platformUtilsService.GetApplicationVersion(),
_deviceActionService.GetBuildNumber());

View File

@@ -1,16 +1,11 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Bit.App.Models;
using Bit.Core.Resources.Localization;
using Bit.App.Models;
using Bit.App.Utilities;
using Bit.Core;
using Bit.Core.Enums;
using Bit.Core.Exceptions;
using Bit.Core.Models.View;
using Bit.Core.Resources.Localization;
using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Pages
{
@@ -48,7 +43,7 @@ namespace Bit.App.Pages
var groupedItems = new List<GroupingsPageListGroup>();
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;
if (matching?.Any() ?? false)
{
@@ -57,7 +52,7 @@ namespace Bit.App.Pages
}
var fuzzy = ciphers.Item2?.Select(c =>
new GroupingsPageListItem { Cipher = c, FuzzyAutofill = true }).ToList();
new CipherItemViewModel(c, WebsiteIconsEnabled, true)).ToList();
if (fuzzy?.Any() ?? false)
{
groupedItems.Add(
@@ -70,7 +65,7 @@ namespace Bit.App.Pages
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;
}

View File

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

View File

@@ -312,6 +312,7 @@ namespace Bit.App.Pages
public bool PasswordPrompt => Cipher != null && Cipher.Reprompt != CipherRepromptType.None;
public string PasswordVisibilityAccessibilityText => ShowPassword ? AppResources.PasswordIsVisibleTapToHide : AppResources.PasswordIsNotVisibleTapToShow;
public bool HasTotpValue => IsLogin && !string.IsNullOrEmpty(Cipher?.Login?.Totp);
public bool AllowTotpCopy => HasTotpValue && Cipher.ViewPassword;
public string SetupTotpText => $"{BitwardenIcons.Camera} {AppResources.SetupTotp}";
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>
<u:InverseBoolConverter x:Key="inverseBool" />
<controls:SelectionChangedEventArgsConverter x:Key="SelectionChangedEventArgsConverter" />
<controls:CipherViewToCipherViewCellViewModelConverter x:Key="cipherViewToCipherViewCellViewModel" />
<ToolbarItem
x:Name="_closeItem"
@@ -46,9 +45,7 @@
<DataTemplate x:Key="cipherTemplate"
x:DataType="pages:GroupingsPageListItem">
<controls:CipherViewCell
BindingContext="{Binding Cipher, Converter={StaticResource cipherViewToCipherViewCellViewModel}}"
ButtonCommand="{Binding BindingContext.CipherOptionsCommand, Source={x:Reference _page}}"
WebsiteIconsEnabled="{Binding BindingContext.WebsiteIconsEnabled, Source={x:Reference _page}}" />
ButtonCommand="{Binding BindingContext.CipherOptionsCommand, Source={x:Reference _page}}" />
</DataTemplate>
<DataTemplate

View File

@@ -1,14 +1,10 @@
using System;
using System.Threading.Tasks;
using Bit.App.Abstractions;
using Bit.App.Abstractions;
using Bit.App.Models;
using Bit.App.Utilities;
using Bit.Core.Abstractions;
using Bit.Core.Enums;
using Bit.Core.Services;
using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Pages
{
@@ -37,12 +33,10 @@ namespace Bit.App.Pages
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 (Device.RuntimePlatform == Device.iOS)
{
ToolbarItems.Add(_closeItem);
ToolbarItems.Add(_addItem);
}
#if IOS
ToolbarItems.Add(_closeItem);
ToolbarItems.Add(_addItem);
#endif
SetActivityIndicator(_mainContent);
_vm = BindingContext as CipherSelectionPageViewModel;
@@ -88,12 +82,12 @@ namespace Bit.App.Pages
{
if (message.Command == "syncStarted")
{
Device.BeginInvokeOnMainThread(() => IsBusy = true);
MainThread.BeginInvokeOnMainThread(() => IsBusy = true);
}
else if (message.Command == "syncCompleted")
{
await Task.Delay(500);
Device.BeginInvokeOnMainThread(() =>
MainThread.BeginInvokeOnMainThread(() =>
{
IsBusy = false;
if (_vm.LoadedOnce)
@@ -130,11 +124,10 @@ namespace Bit.App.Pages
_accountListOverlay.HideAsync().FireAndForget();
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)
{
_appOptions.Uri = null;
}
#if ANDROID
_appOptions.Uri = null;
#endif
return base.OnBackButtonPressed();
}

View File

@@ -1,20 +1,11 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows.Input;
using Bit.App.Abstractions;
using Bit.App.Controls;
using Bit.App.Models;
using Bit.Core.Resources.Localization;
using Bit.App.Utilities;
using Bit.Core;
using Bit.Core.Abstractions;
using Bit.Core.Models.View;
using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Pages
{
public abstract class CipherSelectionPageViewModel : BaseViewModel
@@ -108,10 +99,7 @@ namespace Bit.App.Pages
var groupedItems = await LoadGroupedItemsAsync();
// 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 (Device.RuntimePlatform == Device.Android
||
GroupedItems.Any())
if (DeviceInfo.Platform == DevicePlatform.Android || GroupedItems.Any())
{
var items = new List<IGroupingsPageListItem>();
foreach (var itemGroup in groupedItems)
@@ -140,7 +128,7 @@ namespace Bit.App.Pages
items.AddRange(itemGroup);
}
await Device.InvokeOnMainThreadAsync(() =>
await MainThread.InvokeOnMainThreadAsync(() =>
{
if (groupedItems.Any())
{
@@ -153,7 +141,7 @@ namespace Bit.App.Pages
}
});
}
await Device.InvokeOnMainThreadAsync(() =>
await MainThread.InvokeOnMainThreadAsync(() =>
{
ShowList = groupedItems.Any();
ShowNoData = !ShowList;

View File

@@ -18,8 +18,6 @@
<ContentPage.Resources>
<ResourceDictionary>
<controls:CipherViewToCipherViewCellViewModelConverter x:Key="cipherViewToCipherViewCellViewModel" />
<ToolbarItem Text="{u:I18n Close}" Clicked="Close_Clicked" Order="Primary" Priority="-1"
x:Name="_closeItem" x:Key="closeItem" />
<StackLayout
@@ -55,7 +53,7 @@
IsVisible="{Binding ShowVaultFilter}"
Orientation="Horizontal"
HorizontalOptions="FillAndExpand"
Margin="0,5,0,0">
Margin="{OnPlatform Android='0,5,0,0', iOS='0,15'}">
<Label
Text="{Binding VaultFilterDescription}"
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-->
<Grid>
<controls:CipherViewCell
BindingContext="{Binding ., Converter={StaticResource cipherViewToCipherViewCellViewModel}}"
ButtonCommand="{Binding BindingContext.CipherOptionsCommand, Source={x:Reference _page}}"
WebsiteIconsEnabled="{Binding BindingContext.WebsiteIconsEnabled, Source={x:Reference _page}}"
/>
ButtonCommand="{Binding BindingContext.CipherOptionsCommand, Source={x:Reference _page}}" />
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>

View File

@@ -1,13 +1,9 @@
using System;
using System.Linq;
using Bit.App.Controls;
using Bit.App.Controls;
using Bit.App.Models;
using Bit.Core.Resources.Localization;
using Bit.Core.Abstractions;
using Bit.Core.Models.View;
using Bit.Core.Resources.Localization;
using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Pages
{
@@ -41,8 +37,7 @@ namespace Bit.App.Pages
}
_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 (Device.RuntimePlatform == Device.iOS)
if (DeviceInfo.Platform == DevicePlatform.iOS)
{
ToolbarItems.Add(_closeItem);
_searchBar.Placeholder = AppResources.Search;
@@ -59,7 +54,7 @@ namespace Bit.App.Pages
public SearchBar SearchBar => _searchBar;
protected async override void OnAppearing()
protected override async void OnAppearing()
{
base.OnAppearing();
await _vm.InitAsync();
@@ -125,9 +120,9 @@ namespace Bit.App.Pages
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.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows.Input;
using Bit.App.Abstractions;
using Bit.App.Models;
using Bit.Core.Resources.Localization;
@@ -13,10 +8,6 @@ using Bit.Core.Exceptions;
using Bit.Core.Models.View;
using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
using Bit.App.Utilities;
namespace Bit.App.Pages
{
public class CiphersPageViewModel : VaultFilterViewModel
@@ -51,7 +42,7 @@ namespace Bit.App.Pages
_policyService = ServiceContainer.Resolve<IPolicyService>("policyService");
_logger = ServiceContainer.Resolve<ILogger>("logger");
Ciphers = new ExtendedObservableCollection<CipherView>();
Ciphers = new ExtendedObservableCollection<CipherItemViewModel>();
CipherOptionsCommand = CreateDefaultAsyncRelayCommand<CipherView>(cipher => Utilities.AppHelpers.CipherListOptions(Page, cipher, _passwordRepromptService),
onException: ex => HandleException(ex),
allowsMultipleExecutions: false);
@@ -62,7 +53,7 @@ namespace Bit.App.Pages
public ICommand CipherOptionsCommand { 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 string AutofillUrl { get; set; }
public bool Deleted { get; set; }
@@ -96,12 +87,6 @@ namespace Bit.App.Pages
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)
{
Filter = filter;
@@ -114,7 +99,7 @@ namespace Bit.App.Pages
public async Task InitAsync()
{
await InitVaultFilterAsync(true);
WebsiteIconsEnabled = !(await _stateService.GetDisableFaviconAsync()).GetValueOrDefault();
_websiteIconsEnabled = await _stateService.GetDisableFaviconAsync() != true;
PerformSearchIfPopulated();
}
@@ -164,9 +149,9 @@ namespace Bit.App.Pages
{
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;
ShowList = (searchable || shouldShowAllWhenEmpty) && !ShowNoData;
});

View File

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

View File

@@ -215,13 +215,21 @@ namespace Bit.App.Pages
return;
}
if (e.CurrentSelection?.FirstOrDefault() is GroupingsPageTOTPListItem totpItem)
var selection = e.CurrentSelection?.FirstOrDefault();
if (selection is GroupingsPageTOTPListItem totpItem)
{
await _vm.SelectCipherAsync(totpItem.Cipher);
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;
}
@@ -234,10 +242,6 @@ namespace Bit.App.Pages
{
await _vm.SelectTotpCodesAsync();
}
else if (item.Cipher != null)
{
await _vm.SelectCipherAsync(item.Cipher);
}
else if (item.Folder != null)
{
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.Enums;
using Bit.Core.Models.View;
using Bit.Core.Resources.Localization;
using CollectionView = Bit.Core.Models.View.CollectionView;
namespace Bit.App.Pages
@@ -14,10 +14,8 @@ namespace Bit.App.Pages
public FolderView Folder { get; set; }
public CollectionView Collection { get; set; }
public CipherView Cipher { get; set; }
public CipherType? Type { get; set; }
public string ItemCount { get; set; }
public bool FuzzyAutofill { get; set; }
public bool IsTrash { get; set; }
public bool IsTotpCode { get; set; }

View File

@@ -1,7 +1,4 @@
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Pages
namespace Bit.App.Pages
{
public class GroupingsPageListItemSelector : DataTemplateSelector
{
@@ -12,19 +9,24 @@ namespace Bit.App.Pages
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
if (item is GroupingsPageHeaderListItem)
{
return HeaderTemplate;
}
if (item is GroupingsPageTOTPListItem)
{
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;

View File

@@ -1,56 +1,34 @@
using System;
using System.Threading.Tasks;
using Bit.Core.Resources.Localization;
using Bit.App.Utilities;
using Bit.App.Utilities;
using Bit.Core.Abstractions;
using Bit.Core.Models.View;
using Bit.Core.Resources.Localization;
using Bit.Core.Utilities;
using CommunityToolkit.Mvvm.Input;
using Microsoft.Maui.ApplicationModel;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
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 CipherView _cipher;
private bool _websiteIconsEnabled;
private string _iconImageSource = string.Empty;
private double _progress;
private string _totpSec;
private string _totpCodeFormatted;
private TotpHelper _totpTickHelper;
private readonly TotpHelper _totpTickHelper;
public GroupingsPageTOTPListItem(CipherView cipherView, bool websiteIconsEnabled)
:base(cipherView, websiteIconsEnabled)
{
_totpService = ServiceContainer.Resolve<ITotpService>("totpService");
_platformUtilsService = ServiceContainer.Resolve<IPlatformUtilsService>("platformUtilsService");
_clipboardService = ServiceContainer.Resolve<IClipboardService>("clipboardService");
_clipboardService = ServiceContainer.Resolve<IClipboardService>();
Cipher = cipherView;
WebsiteIconsEnabled = websiteIconsEnabled;
CopyCommand = CreateDefaultAsyncRelayCommand(CopyToClipboardAsync,
onException: ex => _logger.Value.Exception(ex),
onException: _logger.Value.Exception,
allowsMultipleExecutions: false);
_totpTickHelper = new TotpHelper(cipherView);
}
public AsyncRelayCommand CopyCommand { get; set; }
public CipherView Cipher
{
get => _cipher;
set => SetProperty(ref _cipher, value);
}
public string TotpCodeFormatted
{
get => _totpCodeFormatted;
@@ -72,31 +50,6 @@ namespace Bit.App.Pages
get => _progress;
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];
@@ -105,7 +58,7 @@ namespace Bit.App.Pages
public async Task CopyToClipboardAsync()
{
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()

View File

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

View File

@@ -1,13 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Bit.Core.Resources.Localization;
using Bit.Core.Abstractions;
using Bit.Core.Abstractions;
using Bit.Core.Enums;
using Bit.Core.Resources.Localization;
using Bit.Core.Utilities;
using Microsoft.Maui.Controls;
using Microsoft.Maui;
namespace Bit.App.Pages
{
@@ -42,7 +36,7 @@ namespace Bit.App.Pages
if (ciphers?.Any() ?? false)
{
groupedItems.Add(
new GroupingsPageListGroup(ciphers.Select(c => new GroupingsPageListItem { Cipher = c }).ToList(),
new GroupingsPageListGroup(ciphers.Select(c => new CipherItemViewModel(c, WebsiteIconsEnabled)).ToList(),
AppResources.MatchingItems,
ciphers.Count,
false,
@@ -54,7 +48,7 @@ namespace Bit.App.Pages
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;
}

View File

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

View File

@@ -209,7 +209,7 @@
<value>GitHub repository-də problemi bildirin.</value>
</data>
<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 name="Folder" xml:space="preserve">
<value>Qovluq</value>
@@ -236,14 +236,14 @@
<comment>The button text that allows user to launch the website to their web browser.</comment>
</data>
<data name="HelpAndFeedback" xml:space="preserve">
<value>Kömək və əks əlaqə</value>
<value>Kömək və əks-əlaqə</value>
</data>
<data name="Hide" xml:space="preserve">
<value>Gizlət</value>
<comment>Hide a secret value that is currently shown (password).</comment>
</data>
<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>
</data>
<data name="InternetConnectionRequiredTitle" xml:space="preserve">
@@ -300,7 +300,7 @@
<comment>The title for the vault page.</comment>
</data>
<data name="Authenticator" xml:space="preserve">
<value>Kimlik təsdiqləyici</value>
<value>Kimlik doğrulayıcı</value>
<comment>Authenticator TOTP feature</comment>
</data>
<data name="Name" xml:space="preserve">
@@ -334,7 +334,7 @@
<comment>Message shown when interacting with the server</comment>
</data>
<data name="Settings" xml:space="preserve">
<value>Tənzimləmələr</value>
<value>Ayarlar</value>
<comment>The title for the settings page.</comment>
</data>
<data name="Show" xml:space="preserve">
@@ -379,13 +379,13 @@
<comment>Confirmation message after successfully copying a value to the clipboard.</comment>
</data>
<data name="VerifyFingerprint" xml:space="preserve">
<value>Barmaq izini təsdiqlə</value>
<value>Barmaq izini doğrula</value>
</data>
<data name="VerifyMasterPassword" xml:space="preserve">
<value>Ana parolu təsdiqlə</value>
<value>Ana parolu doğrula</value>
</data>
<data name="VerifyPIN" xml:space="preserve">
<value>PIN-i təsdiqlə</value>
<value>PIN-i doğrula</value>
</data>
<data name="Version" xml:space="preserve">
<value>Versiya</value>
@@ -413,7 +413,7 @@
<value>Element əlavə et</value>
</data>
<data name="AppExtension" xml:space="preserve">
<value>Tətbiq genişləndirməsi</value>
<value>Tətbiq uzantısı</value>
</data>
<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>
@@ -425,10 +425,10 @@
<value>Anlaşılmaz simvollardan çəkinin</value>
</data>
<data name="BitwardenAppExtension" xml:space="preserve">
<value>Bitwarden tətbiq genişləndirməsi</value>
<value>Bitwarden tətbiq uzantısı</value>
</data>
<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 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>
@@ -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>
</data>
<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 name="ExtensionAlmostDone" xml:space="preserve">
<value>Demək olar ki, hazırdır!</value>
</data>
<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 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>
@@ -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>
</data>
<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 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>
@@ -514,13 +514,13 @@
<value>Ana parolunuz üçün məsləhət alın</value>
</data>
<data name="ImportItems" xml:space="preserve">
<value>Elementləri idxal et</value>
<value>Elementləri daxilə köçür</value>
</data>
<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 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 name="LastSync" xml:space="preserve">
<value>Son eyniləşdirmə:</value>
@@ -553,7 +553,7 @@
<value>Anbara müraciət vaxtının bitmə əməliyyatı</value>
</data>
<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 name="LoggingIn" xml:space="preserve">
<value>Giriş edilir...</value>
@@ -589,10 +589,10 @@
<comment>Minimum special characters for password generator settings</comment>
</data>
<data name="MoreSettings" xml:space="preserve">
<value>Daha çox tənzimləmə</value>
<value>Daha çox ayar</value>
</data>
<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 name="Never" xml:space="preserve">
<value>Heç vaxt</value>
@@ -617,7 +617,7 @@
<comment>Confirmation, like "Ok, I understand it"</comment>
</data>
<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 name="Options" xml:space="preserve">
<value>Seçimlər</value>
@@ -708,11 +708,11 @@
<value>PIN kod ilə kilidi açın</value>
</data>
<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>
</data>
<data name="VerificationCode" xml:space="preserve">
<value>Təsdiqləmə kodu</value>
<value>Doğrulama kodu</value>
</data>
<data name="ViewItem" xml:space="preserve">
<value>Elementə bax</value>
@@ -721,14 +721,14 @@
<value>Bitwarden veb anbarı</value>
</data>
<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 name="Items" xml:space="preserve">
<value>Elementlər</value>
<comment>Screen title</comment>
</data>
<data name="ExtensionActivated" xml:space="preserve">
<value>Genişləndirmə aktivləşdirildi!</value>
<value>Uzantı aktivləşdirildi!</value>
</data>
<data name="Icons" xml:space="preserve">
<value>Nişanlar</value>
@@ -751,13 +751,13 @@
<value>Anbarınızdakı bir elementi avto-doldurmaq üçün bu bildirişə toxunun.</value>
</data>
<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 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>
</data>
<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 name="Disabled" xml:space="preserve">
<value>Sıradan çıxarıldı</value>
@@ -775,7 +775,7 @@
<value>Vəziyyət</value>
</data>
<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 name="Autofill" xml:space="preserve">
<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>
</data>
<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>
</data>
<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>
</data>
<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>
</data>
<data name="LoginUnavailable" xml:space="preserve">
@@ -822,7 +822,7 @@
<comment>For 2FA whenever there are no available providers on this device.</comment>
</data>
<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 name="RecoveryCodeTitle" xml:space="preserve">
<value>Bərpa kodu</value>
@@ -833,7 +833,7 @@
<comment>Remember my two-step login</comment>
</data>
<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>
</data>
<data name="TwoStepLoginOptions" xml:space="preserve">
@@ -843,11 +843,11 @@
<value>Başqa bir iki mərhələli giriş metodu istifadə edin</value>
</data>
<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>
</data>
<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>
</data>
<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>
</data>
<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 name="VerificationCodeTotp" xml:space="preserve">
<value>Təsdiqləmə kodu (TOTP)</value>
<value>Doğrulama kodu (TOTP)</value>
<comment>Totp code label</comment>
</data>
<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 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 name="PointYourCameraAtTheQRCode" xml:space="preserve">
<value>Kameranızı QR koduna yönəldin.
@@ -907,7 +907,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>TOTP-ni kopyala</value>
</data>
<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 name="CopyTotpAutomatically" xml:space="preserve">
<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>
</data>
<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 name="LearnMore" xml:space="preserve">
<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>
</data>
<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 name="FaceID" xml:space="preserve">
<value>Face ID</value>
<comment>What Apple calls their facial recognition reader.</comment>
</data>
<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 name="UseFaceIDToUnlock" xml:space="preserve">
<value>Kilidi açmaq üçün Face ID istifadə edin</value>
</data>
<data name="VerifyFaceID" xml:space="preserve">
<value>Face ID-ni təsdiqlə</value>
<value>Face ID-ni doğrula</value>
</data>
<data name="WindowsHello" xml:space="preserve">
<value>Windows Hello</value>
</data>
<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 name="CustomFieldName" xml:space="preserve">
<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>
</data>
<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 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>
@@ -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>
</data>
<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 name="AutofillTurnOn2" xml:space="preserve">
<value>2. "Parollar və Hesablar"a toxunun.</value>
@@ -1319,7 +1319,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Parolun avto-doldurulması</value>
</data>
<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 name="InvalidEmail" xml:space="preserve">
<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>
</data>
<data name="ExportVault" xml:space="preserve">
<value>Anbarı ixrac et</value>
<value>Anbarı xaricə köçür</value>
</data>
<data name="LockNow" xml:space="preserve">
<value>İndi kilidlə</value>
@@ -1483,20 +1483,20 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>30 dəqiqə</value>
</data>
<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 name="LoggedInAsOn" xml:space="preserve">
<value>{1} saytında {0} kimi giriş edildi.</value>
<comment>ex: Logged in as user@example.com on bitwarden.com.</comment>
</data>
<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 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 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 name="Dark" xml:space="preserve">
<value>Tünd</value>
@@ -1586,7 +1586,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Tətbiq yenidən başladılanda</value>
</data>
<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 name="ThemeAppliedOnRestart" xml:space="preserve">
<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>
</data>
<data name="BiometricsDirection" xml:space="preserve">
<value>Biometrik təsdiqləmə</value>
<value>Biometrik doğrulama</value>
</data>
<data name="Biometrics" xml:space="preserve">
<value>Biometrik</value>
@@ -1620,19 +1620,19 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Kilidi biometriklə aç</value>
</data>
<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 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 name="OverlayPermission" xml:space="preserve">
<value>İcazə</value>
</data>
<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 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 name="Denied" xml:space="preserve">
<value>Rədd edildi</value>
@@ -1644,38 +1644,38 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Fayl formatı</value>
</data>
<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 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 name="CodeSent" xml:space="preserve">
<value>Kod göndərildi!</value>
</data>
<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 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 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 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 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>
</data>
<data name="Warning" xml:space="preserve">
<value>Xəbərdarlıq</value>
</data>
<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 name="ExportVaultSuccess" xml:space="preserve">
<value>Anbar uğurla ixrac edildi</value>
<value>Anbar uğurla xaricə köçürüldü</value>
</data>
<data name="Clone" xml:space="preserve">
<value>Klonla</value>
@@ -1695,7 +1695,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Qoşma uğurla saxlanıldı</value>
</data>
<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 name="AutofillTileUriNotFound" xml:space="preserve">
<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>
</data>
<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 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 name="EnableSyncOnRefresh" xml:space="preserve">
<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>
</data>
<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 name="OrgIdentifier" xml:space="preserve">
<value>Təşkilat identifikatoru</value>
@@ -1765,10 +1765,10 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Hazırda SSO ilə giriş edilə bilmir</value>
</data>
<data name="SetMasterPassword" xml:space="preserve">
<value>Ana parolu tənzimlə</value>
<value>Ana parolu ayarla</value>
</data>
<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 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>
@@ -1795,7 +1795,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Yararsız parol</value>
</data>
<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 name="Loading" xml:space="preserve">
<value>Yüklənir</value>
@@ -1813,7 +1813,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Gizlilik Siyasəti</value>
</data>
<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 name="AutofillServices" xml:space="preserve">
<value>Avto-doldurma xidmətləri</value>
@@ -1924,7 +1924,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Bitmə vaxtı</value>
</data>
<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>
</data>
<data name="Expired" xml:space="preserve">
@@ -1934,7 +1934,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Maksimal müraciət sayı</value>
</data>
<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>
</data>
<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>
</data>
<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>
</data>
<data name="PasswordPrompt" xml:space="preserve">
@@ -2068,13 +2068,13 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>Ana parol təsdiqi</value>
</data>
<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 name="CaptchaRequired" xml:space="preserve">
<value>Captcha tələb olunur</value>
</data>
<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 name="UpdatedMasterPassword" xml:space="preserve">
<value>Güncəllənmiş ana parol</value>
@@ -2110,19 +2110,19 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>FIDO2 WebAuthn</value>
</data>
<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 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 name="Fido2AuthenticateWebAuthn" xml:space="preserve">
<value>WebAuthn-u təsdiqlə</value>
<value>WebAuthn kimlik doğrulama</value>
</data>
<data name="Fido2ReturnToApp" xml:space="preserve">
<value>Tətbiqə qayıt</value>
</data>
<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 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>
@@ -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>
</data>
<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 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 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 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 name="AddAccount" xml:space="preserve">
<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>
</data>
<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 name="DeletingYourAccount" xml:space="preserve">
<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>
</data>
<data name="InvalidVerificationCode" xml:space="preserve">
<value>Yararsız təsdiqləmə kodu.</value>
<value>Yararsız doğrulama kodu</value>
</data>
<data name="RequestOTP" xml:space="preserve">
<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>
</data>
<data name="Verifying" xml:space="preserve">
<value>Təsdiqlənir</value>
<value>Doğrulanır</value>
</data>
<data name="ResendCode" xml:space="preserve">
<value>Kodu təkrar göndər</value>
</data>
<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 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 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 name="SubmitCrashLogs" xml:space="preserve">
<value>Çökmə jurnallarını göndər</value>
@@ -2266,13 +2266,13 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>TOTP</value>
</data>
<data name="VerificationCodes" xml:space="preserve">
<value>Təsdiqləmə kodları</value>
<value>Doğrulama kodları</value>
</data>
<data name="PremiumSubscriptionRequired" xml:space="preserve">
<value>Premium abunəlik tələb olunur</value>
</data>
<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 name="ScanQRCode" xml:space="preserve">
<value>QR kodu skan edin</value>
@@ -2281,7 +2281,7 @@ Skan prosesi avtomatik baş tutacaq.</value>
<value>QR kodunu skan edə bilmədiniz? </value>
</data>
<data name="AuthenticatorKeyScanner" xml:space="preserve">
<value>Kimlik təsdiqləyici açarı</value>
<value>Kimlik doğrulayıcı açarı</value>
</data>
<data name="EnterKeyManually" xml:space="preserve">
<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>
</data>
<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 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 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 name="AllowScreenCapture" xml:space="preserve">
<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>
</data>
<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 name="AllowNotifications" xml:space="preserve">
<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>
</data>
<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 name="ResendNotification" xml:space="preserve">
<value>Bildirişi təkrar göndər</value>
@@ -2541,7 +2541,7 @@ Bu hesaba keçmək istəyirsiniz?</value>
<value>Dil</value>
</data>
<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 name="LanguageChangeRequiresAppRestart" xml:space="preserve">
<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>
</data>
<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 name="InvalidAPIKey" xml:space="preserve">
<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>
</data>
<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 name="LogInWithDevice" xml:space="preserve">
<value>Cihazla giriş et</value>

View File

@@ -2110,7 +2110,7 @@
<value>FIDO2 WebAuthn</value>
</data>
<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 name="Fido2Desc" xml:space="preserve">
<value>Идентификация чрез FIDO2 WebAuthn можете да се идентифицирате чрез външен ключ за сигурност.</value>
@@ -2293,8 +2293,8 @@
<value>Настройка на TOTP</value>
</data>
<data name="OnceTheKeyIsSuccessfullyEntered" xml:space="preserve">
<value>Once the key is successfully entered,
select Add TOTP to store the key safely</value>
<value>След като ключът бъде въведен успешно,
изберете „Добавяне на код за потвърждаване“, за да запазите ключа</value>
</data>
<data name="NeverLockWarning" xml:space="preserve">
<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>
</data>
<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>
</data>
<data name="Credits" xml:space="preserve">
@@ -186,11 +186,11 @@
<comment>Short label for an email address.</comment>
</data>
<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>
</data>
<data name="EmailUs" xml:space="preserve">
<value>Envíanos un correo</value>
<value>Envíanos correo electrónico</value>
</data>
<data name="EmailUsDescription" xml:space="preserve">
<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>
</data>
<data name="FileBugReport" xml:space="preserve">
<value>Reportar un fallo</value>
<value>Enviar un informe de error</value>
</data>
<data name="FileBugReportDescription" xml:space="preserve">
<value>Abrir una incidencia en el repositorio de GitHub.</value>
@@ -229,10 +229,10 @@
<value>Carpetas</value>
</data>
<data name="FolderUpdated" xml:space="preserve">
<value>Carpeta actualizada.</value>
<value>Carpeta guardada</value>
</data>
<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>
</data>
<data name="HelpAndFeedback" xml:space="preserve">
@@ -285,7 +285,7 @@
<value>Cuenta ya añadida</value>
</data>
<data name="SwitchToAlreadyAddedAccountConfirmation" xml:space="preserve">
<value>¿Quieres cambiarlo ahora?</value>
<value>¿Te gustaría cambiar a esa cuenta ahora?</value>
</data>
<data name="MasterPassword" xml:space="preserve">
<value>Contraseña maestra</value>
@@ -342,7 +342,7 @@
<comment>Reveal a hidden value (password).</comment>
</data>
<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>
</data>
<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>
</data>
<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>
</data>
<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>
</data>
<data name="AutofillService" xml:space="preserve">
<value>Servicio de autorrellenado</value>
<value>Servicio de autocompletado</value>
</data>
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
<value>Evitar caracteres ambiguos</value>
</data>
<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 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 name="BitwardenAppExtensionDescription" xml:space="preserve">
<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>
</data>
<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 name="ExtensionAlmostDone" xml:space="preserve">
<value>¡Casi estamos!</value>
</data>
<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 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>
@@ -490,7 +490,7 @@
<value>¡Ya estás identificado!</value>
</data>
<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 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>
@@ -553,7 +553,7 @@
<value>Acción de tiempo de espera de la caja fuerte</value>
</data>
<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 name="LoggingIn" xml:space="preserve">
<value>Iniciando sesión...</value>
@@ -598,7 +598,7 @@
<value>Nunca</value>
</data>
<data name="NewItemCreated" xml:space="preserve">
<value>Nuevo elemento creado.</value>
<value>Elemento agregado</value>
</data>
<data name="NoFavorites" xml:space="preserve">
<value>No hay favoritos en tu caja fuerte.</value>
@@ -626,7 +626,7 @@
<value>Otro</value>
</data>
<data name="PasswordGenerated" xml:space="preserve">
<value>Contraseña generada.</value>
<value>Contraseña generada</value>
</data>
<data name="PasswordGenerator" xml:space="preserve">
<value>Generador de contraseñas</value>
@@ -641,7 +641,7 @@
<value>¿Estás seguro de que quieres sobreescribir la contraseña actual?</value>
</data>
<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>
</data>
<data name="RateTheApp" xml:space="preserve">
@@ -654,7 +654,7 @@
<value>Regenerar contraseña</value>
</data>
<data name="RetypeMasterPassword" xml:space="preserve">
<value>Vuelve a escribir tu contraseña maestra</value>
<value>Reescribir contraseña maestra</value>
</data>
<data name="SearchVault" xml:space="preserve">
<value>Buscar en caja fuerte</value>
@@ -675,7 +675,7 @@
<value>Información del elemento</value>
</data>
<data name="ItemUpdated" xml:space="preserve">
<value>Elemento actualizado.</value>
<value>Elemento guardado</value>
</data>
<data name="Submitting" xml:space="preserve">
<value>Enviando...</value>
@@ -686,10 +686,10 @@
<comment>Message shown when interacting with the server</comment>
</data>
<data name="SyncingComplete" xml:space="preserve">
<value>Sincronización completada.</value>
<value>Sincronización completada</value>
</data>
<data name="SyncingFailed" xml:space="preserve">
<value>Sincronizado fallida.</value>
<value>Error en la Sincronización</value>
</data>
<data name="SyncVaultNow" xml:space="preserve">
<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>
</data>
<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 name="BitwardenAutofillServiceNotificationContent" xml:space="preserve">
<value>Pulsa en esta notificación para autorellenar una entrada desde tu caja fuerte.</value>
@@ -775,7 +775,7 @@
<value>Estado</value>
</data>
<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 name="Autofill" xml:space="preserve">
<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>
</data>
<data name="MatchingItems" xml:space="preserve">
<value>Elementos coincidientes</value>
<value>Elementos que coinciden</value>
</data>
<data name="PossibleMatchingItems" xml:space="preserve">
<value>Posibles elementos coincidientes</value>
<value>Posibles elementos que coinciden</value>
</data>
<data name="Search" xml:space="preserve">
<value>Buscar</value>
@@ -799,7 +799,7 @@
<value>Estás buscando una entrada para autorellenar "{0}".</value>
</data>
<data name="LearnOrg" xml:space="preserve">
<value>Aprenda sobre Organizaciones</value>
<value>Aprende sobre organizaciones</value>
</data>
<data name="CannotOpenApp" xml:space="preserve">
<value>No se puede abrir la aplicación "{0}".</value>
@@ -818,11 +818,11 @@
<comment>For 2FA</comment>
</data>
<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>
</data>
<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 name="RecoveryCodeTitle" xml:space="preserve">
<value>Código de recuperación</value>
@@ -837,7 +837,7 @@
<comment>For 2FA</comment>
</data>
<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 name="UseAnotherTwoStepMethod" xml:space="preserve">
<value>Utilizar otro método de autenticación en dos pasos</value>
@@ -847,18 +847,18 @@
<comment>For 2FA</comment>
</data>
<data name="VerificationEmailSent" xml:space="preserve">
<value>Correo de verificación enviado.</value>
<value>Correo de verificación enviado</value>
<comment>For 2FA</comment>
</data>
<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>
</data>
<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>
</data>
<data name="AddNewAttachment" xml:space="preserve">
<value>Añadir nuevo adjunto</value>
<value>Añadir nuevo archivo adjunto</value>
</data>
<data name="Attachments" xml:space="preserve">
<value>Adjuntos</value>
@@ -907,10 +907,10 @@ El escaneo se realizará automáticamente.</value>
<value>Copiar código TOTP</value>
</data>
<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 name="CopyTotpAutomatically" xml:space="preserve">
<value>Copiar automáticamente TOTP</value>
<value>Copiar TOTP automáticamente</value>
</data>
<data name="PremiumRequired" xml:space="preserve">
<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>
</data>
<data name="ChooseFile" xml:space="preserve">
<value>Seleccionar archivo</value>
<value>Elegir archivo</value>
</data>
<data name="File" xml:space="preserve">
<value>Archivo</value>
@@ -937,7 +937,7 @@ El escaneo se realizará automáticamente.</value>
<value>Fuente de archivo</value>
</data>
<data name="FeatureUnavailable" xml:space="preserve">
<value>Característica no disponible</value>
<value>Funcionalidad no disponible</value>
</data>
<data name="MaxFileSize" xml:space="preserve">
<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>
</data>
<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 name="LearnMore" xml:space="preserve">
<value>Aprender más</value>
<value>Aprende más</value>
</data>
<data name="ApiUrl" xml:space="preserve">
<value>URL del servidor de la API</value>
@@ -1032,7 +1032,7 @@ El escaneo se realizará automáticamente.</value>
<value>Marca</value>
</data>
<data name="CardholderName" xml:space="preserve">
<value>Nombre en la tarjeta</value>
<value>Nombre del propietario de la tarjeta</value>
</data>
<data name="CityTown" xml:space="preserve">
<value>Ciudad / Pueblo</value>
@@ -1077,7 +1077,7 @@ El escaneo se realizará automáticamente.</value>
<value>Nombre completo</value>
</data>
<data name="LicenseNumber" xml:space="preserve">
<value>Nº de licencia</value>
<value>Número de licencia</value>
</data>
<data name="March" xml:space="preserve">
<value>Marzo</value>
@@ -1086,7 +1086,7 @@ El escaneo se realizará automáticamente.</value>
<value>Mayo</value>
</data>
<data name="MiddleName" xml:space="preserve">
<value> nombre</value>
<value>Segundo nombre</value>
</data>
<data name="Mr" xml:space="preserve">
<value>Sr</value>
@@ -1098,7 +1098,7 @@ El escaneo se realizará automáticamente.</value>
<value>Srta</value>
</data>
<data name="Mx" xml:space="preserve">
<value>"Mx" = "Sr./Sra</value>
<value>Mx</value>
</data>
<data name="November" xml:space="preserve">
<value>Noviembre</value>
@@ -1107,7 +1107,7 @@ El escaneo se realizará automáticamente.</value>
<value>Octubre</value>
</data>
<data name="PassportNumber" xml:space="preserve">
<value>Nº de pasaporte</value>
<value>Número de pasaporte</value>
</data>
<data name="Phone" xml:space="preserve">
<value>Teléfono</value>
@@ -1116,7 +1116,7 @@ El escaneo se realizará automáticamente.</value>
<value>Septiembre</value>
</data>
<data name="SSN" xml:space="preserve">
<value>Nº de la seguridad social</value>
<value>Número de Seguro Social</value>
</data>
<data name="StateProvince" xml:space="preserve">
<value>Estado / Provincia</value>
@@ -1167,7 +1167,7 @@ El escaneo se realizará automáticamente.</value>
<value>Servicio de accesibilidad de autorellenado</value>
</data>
<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 name="BitwardenAutofillServiceDescription" xml:space="preserve">
<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>
</data>
<data name="URIMatchDetection" xml:space="preserve">
<value>Tipo de detección de URI</value>
<value>Detección de coincidencia URI</value>
</data>
<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>
</data>
<data name="YesAndSave" xml:space="preserve">
<value>Sí y guardar</value>
<value>Sí, y guardar</value>
</data>
<data name="AutofillAndSave" xml:space="preserve">
<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>
</data>
<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 name="AutofillSetup2" xml:space="preserve">
<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>
</data>
<data name="RequestAdminApproval" xml:space="preserve">
<value>Request admin approval</value>
<value>Solicitar aprobación del administrador</value>
</data>
<data name="ApproveWithMasterPassword" xml:space="preserve">
<value>Approve with master password</value>
<value>Aprobar con contraseña maestra</value>
</data>
<data name="TurnOffUsingPublicDevice" xml:space="preserve">
<value>Turn off using a public device</value>
<value>Deshabilitar usando un dispositivo público</value>
</data>
<data name="RememberThisDevice" xml:space="preserve">
<value>Remember this device</value>
<value>Recordar este dispositivo</value>
</data>
<data name="Passkey" xml:space="preserve">
<value>Passkey</value>
@@ -2648,28 +2648,29 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
<value>Passkeys</value>
</data>
<data name="Application" xml:space="preserve">
<value>Application</value>
<value>Aplicación</value>
</data>
<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 name="PasskeyWillNotBeCopied" xml:space="preserve">
<value>Passkey will not be copied</value>
<value>La contraseña maestra no será copiada</value>
</data>
<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 name="CopyApplication" xml:space="preserve">
<value>Copy application</value>
<value>Copiar aplicación</value>
</data>
<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 name="MasterPasswordRePromptHelp" xml:space="preserve">
<value>Ayuda de volver a pedir contraseña maestra</value>
</data>
<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 name="InvalidAPIKey" xml:space="preserve">
<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>
</data>
<data name="AdminApprovalRequested" xml:space="preserve">
<value>Admin approval requested</value>
<value>Aprobación del administrador solicitada</value>
</data>
<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 name="YouWillBeNotifiedOnceApproved" xml:space="preserve">
<value>You will be notified once approved. </value>
<value>Se te notificará una vez aprobada. </value>
</data>
<data name="TroubleLoggingIn" xml:space="preserve">
<value>Trouble logging in?</value>
<value>¿Problema para iniciar sesión?</value>
</data>
<data name="LoggingInAsX" xml:space="preserve">
<value>Logging in as {0}</value>
<value>Iniciando sesión como {0}</value>
</data>
<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 name="BlockAutoFill" xml:space="preserve">
<value>Block auto-fill</value>
<value>Bloquear autocompletar</value>
</data>
<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 name="NewBlockedURI" xml:space="preserve">
<value>New blocked URI</value>
<value>Nueva URI bloqueada</value>
</data>
<data name="URISaved" xml:space="preserve">
<value>URI saved</value>
<value>URI guardada</value>
</data>
<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>
</data>
<data name="EditURI" xml:space="preserve">
<value>Edit URI</value>
<value>Editar URI</value>
</data>
<data name="EnterURI" xml:space="preserve">
<value>Enter URI</value>
<value>Escribir URI</value>
</data>
<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 name="FormatX" xml:space="preserve">
<value>Format: {0}</value>
<value>Formato: {0}</value>
</data>
<data name="InvalidURI" xml:space="preserve">
<value>Invalid URI</value>
<value>URI no válida</value>
</data>
<data name="URIRemoved" xml:space="preserve">
<value>URI removed</value>
<value>URI eliminada</value>
</data>
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
<value>There are no blocked URIs</value>
<value>No hay URIs bloqueadas</value>
</data>
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
<value>The URI {0} is already blocked</value>
<value>El URI {0} ya está bloqueada</value>
</data>
<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 name="LoginApproved" xml:space="preserve">
<value>Login approved</value>
<value>Inicio de sesión aprobado</value>
</data>
<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 name="LogInWithDevice" xml:space="preserve">
<value>Log in with device</value>
<value>Iniciar sesión con el dispositivo</value>
</data>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
<value>Iniciando sesión en</value>
</data>
<data name="Vault" xml:space="preserve">
<value>Vault</value>
<value>Caja fuerte</value>
</data>
<data name="Appearance" xml:space="preserve">
<value>Appearance</value>
<value>Apariencia</value>
</data>
<data name="AccountSecurity" xml:space="preserve">
<value>Account security</value>
<value>Seguridad de la cuenta</value>
</data>
<data name="BitwardenHelpCenter" xml:space="preserve">
<value>Bitwarden Help Center</value>
<value>Centro de ayuda de Bitwarden</value>
</data>
<data name="ContactBitwardenSupport" xml:space="preserve">
<value>Contact Bitwarden support</value>
<value>Contactar al soporte de Bitwarden</value>
</data>
<data name="CopyAppInformation" xml:space="preserve">
<value>Copy app information</value>
<value>Copiar información de la aplicación</value>
</data>
<data name="SyncNow" xml:space="preserve">
<value>Sync now</value>
<value>Sincronizar ahora</value>
</data>
<data name="UnlockOptions" xml:space="preserve">
<value>Unlock options</value>
<value>Opciónes de desbloqueo</value>
</data>
<data name="SessionTimeout" xml:space="preserve">
<value>Session timeout</value>
<value>Tiempo de espera de sesión</value>
</data>
<data name="SessionTimeoutAction" xml:space="preserve">
<value>Session timeout action</value>
<value>Acción de tiempo de espera de sesión</value>
</data>
<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>
</data>
<data name="OneHourAndOneMinute" xml:space="preserve">
<value>One hour and one minute</value>
<value>Una hora y un minuto</value>
</data>
<data name="OneHourAndXMinute" xml:space="preserve">
<value>One hour and {0} minutes</value>
<value>Una hora y {0} minutos</value>
</data>
<data name="XHoursAndOneMinute" xml:space="preserve">
<value>{0} hours and one minute</value>
<value>{0} horas y un minuto</value>
</data>
<data name="XHoursAndYMinutes" xml:space="preserve">
<value>{0} hours and {1} minutes</value>
<value>{0} horas y {1} minutos</value>
</data>
<data name="XHours" xml:space="preserve">
<value>{0} hours</value>
<value>{0} horas</value>
</data>
<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 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 name="AdditionalOptions" xml:space="preserve">
<value>Additional options</value>
<value>Opciones adicionales</value>
</data>
<data name="ContinueToWebApp" xml:space="preserve">
<value>Continue to web app?</value>
<value>¿Continuar a la aplicación web?</value>
</data>
<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>
</data>
<data name="ContinueToHelpCenter" xml:space="preserve">
<value>Continue to Help center?</value>
<value>¿Continuar al centro de ayuda?</value>
</data>
<data name="ContinueToContactSupport" xml:space="preserve">
<value>Continue to contact support?</value>
<value>¿Continuar con el servicio de asistencia?</value>
</data>
<data name="ContinueToAppStore" xml:space="preserve">
<value>Continue to app store?</value>
<value>¿Continuar a la App Store?</value>
</data>
<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 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 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>
</data>
<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 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 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 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 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 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 name="CreatedXY" xml:space="preserve">
<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>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
<value>Demasiados intentos</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
<value>Sesión de la cuenta cerrada.</value>
</data>
<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 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 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>
</root>

View File

@@ -416,10 +416,10 @@
<value>Sovelluslaajennus</value>
</data>
<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 name="AutofillService" xml:space="preserve">
<value>Automaattisen täytön palvelu</value>
<value>Automaattitäytön palvelu</value>
</data>
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
<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>
</data>
<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 name="BitwardenAutofillService" xml:space="preserve">
<value>Bitwardenin automaattisen täytön palvelu</value>
<value>Bitwardenin automaattitäytön palvelu</value>
</data>
<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 name="ChangeEmail" xml:space="preserve">
<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>
</data>
<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 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 name="BitwardenAutofillServiceOpenAccessibilitySettings" xml:space="preserve">
<value>Avaa "Esteettömyys" -asetukset</value>
@@ -775,16 +775,16 @@
<value>Tila</value>
</data>
<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 name="Autofill" xml:space="preserve">
<value>Automaattinen täyttö</value>
<value>Automaattitäyttö</value>
</data>
<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 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 name="MatchingItems" xml:space="preserve">
<value>Tunnistetut kohteet</value>
@@ -796,7 +796,7 @@
<value>Etsi</value>
</data>
<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 name="LearnOrg" xml:space="preserve">
<value>Lisätietoja organisaatioista</value>
@@ -907,7 +907,7 @@ Koodi skannataan automaattisesti.</value>
<value>Kopioi TOTP-todennuskoodi</value>
</data>
<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 name="CopyTotpAutomatically" xml:space="preserve">
<value>TOTP-koodin kopiointi</value>
@@ -1143,7 +1143,7 @@ Koodi skannataan automaattisesti.</value>
<value>Kuvakepalvelimen URL</value>
</data>
<data name="AutofillWithBitwarden" xml:space="preserve">
<value>Täytä automaattisesti Bitwardenilla</value>
<value>Automaattitäytä Bitwardenilla</value>
</data>
<data name="VaultIsLocked" xml:space="preserve">
<value>Holvi on lukittu</value>
@@ -1164,13 +1164,13 @@ Koodi skannataan automaattisesti.</value>
<value>Roskakorissa ei ole kohteita.</value>
</data>
<data name="AutofillAccessibilityService" xml:space="preserve">
<value>Automaattisen täytön esteettömyyspalvelu</value>
<value>Automaattitäytön esteettömyyspalvelu</value>
</data>
<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 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 name="BitwardenAutofillServiceOpenAutofillSettings" xml:space="preserve">
<value>Avaa "Automaattinen täyttö -palvelu" -asetukset</value>
@@ -1256,7 +1256,7 @@ Koodi skannataan automaattisesti.</value>
<value>Kyllä, ja tallenna</value>
</data>
<data name="AutofillAndSave" xml:space="preserve">
<value>Täytä automaattisesti ja tallenna</value>
<value>Automaattitäytä ja tallenna</value>
</data>
<data name="Organization" xml:space="preserve">
<value>Organisaatio</value>
@@ -1272,7 +1272,7 @@ Koodi skannataan automaattisesti.</value>
<value>Jatka pitämällä YubiKey NEO -todennuslaitetta laitteen taustaa vasten.</value>
</data>
<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 name="DatePasswordUpdated" xml:space="preserve">
<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>
</data>
<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 name="AutofillTurnOn1" xml:space="preserve">
<value>1. Siirry iOS:n "Asetukset" -sovellukseen</value>
@@ -1316,7 +1316,7 @@ Koodi skannataan automaattisesti.</value>
<value>5. Valitse "Bitwarden"</value>
</data>
<data name="PasswordAutofill" xml:space="preserve">
<value>Salasanojen automaattinen täyttö</value>
<value>Salasanojen automaattitäyttö</value>
</data>
<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>
@@ -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>
</data>
<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>
</data>
<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 name="Theme" xml:space="preserve">
<value>Teema</value>
@@ -1586,7 +1586,7 @@ Koodi skannataan automaattisesti.</value>
<value>Kun sovellus käynnistetään uudelleen</value>
</data>
<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 name="ThemeAppliedOnRestart" xml:space="preserve">
<value>Teema vaihtuu kun sovellus käynnistetään uudelleen.</value>
@@ -1620,7 +1620,7 @@ Koodi skannataan automaattisesti.</value>
<value>Avaa biometrialla</value>
</data>
<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 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>
@@ -1695,7 +1695,7 @@ Koodi skannataan automaattisesti.</value>
<value>Tiedostoliite tallennettiin</value>
</data>
<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 name="AutofillTileUriNotFound" xml:space="preserve">
<value>Salasanakenttiä ei havaittu</value>
@@ -1814,10 +1814,10 @@ Koodi skannataan automaattisesti.</value>
<value>Tietosuojakäytäntö</value>
</data>
<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 name="AutofillServices" xml:space="preserve">
<value>Automaattisen täytön palvelut</value>
<value>Automaattitäytön palvelut</value>
</data>
<data name="InlineAutofill" xml:space="preserve">
<value>Tekstinsisäinen täyttö</value>
@@ -1829,10 +1829,10 @@ Koodi skannataan automaattisesti.</value>
<value>Esteettömyyspalvelu</value>
</data>
<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 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 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>
@@ -1847,7 +1847,7 @@ Koodi skannataan automaattisesti.</value>
<value>Sallii Bitwardenin esteettömyyspalvelun näyttää pikavalintapalkin aktiivisten kirjautumiskenttien ohessa.</value>
</data>
<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 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>
@@ -2426,7 +2426,7 @@ turvallisesti valitsemalla "Lisää TOTP"</value>
<comment>"Fastmail" is the product name and should not be translated.</comment>
</data>
<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>
</data>
<data name="APIAccessToken" xml:space="preserve">
@@ -2696,10 +2696,10 @@ Haluatko vaihtaa tähän tiliin?</value>
<value>Holvin aikakatkaisutoiminnoksi vaihdettiin uloskirjaus</value>
</data>
<data name="BlockAutoFill" xml:space="preserve">
<value>Estä automaattinen täyttö</value>
<value>Estä automaattitäyttö</value>
</data>
<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 name="NewBlockedURI" xml:space="preserve">
<value>Uusi estetty URI</value>

View File

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

View File

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

View File

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

View File

@@ -2670,7 +2670,7 @@
<value>Помоћ поновно тражење главне лозинке</value>
</data>
<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 name="InvalidAPIKey" xml:space="preserve">
<value>Неисправан API кључ</value>
@@ -2749,7 +2749,7 @@
<value>Пријавите се са уређајем</value>
</data>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
<value>Пријављено на</value>
</data>
<data name="Vault" xml:space="preserve">
<value>Сеф</value>

View File

@@ -1742,7 +1742,7 @@ Skanningen sker automatiskt.</value>
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
</data>
<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 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>
@@ -2613,10 +2613,10 @@ Vill du byta till detta konto?</value>
<value>Lokalt installerad</value>
</data>
<data name="DataRegion" xml:space="preserve">
<value>Dataområde</value>
<value>Dataregion</value>
</data>
<data name="Region" xml:space="preserve">
<value>Område</value>
<value>Region</value>
</data>
<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>
@@ -2631,7 +2631,7 @@ Vill du byta till detta konto?</value>
<value>Godkänn med min andra enhet</value>
</data>
<data name="RequestAdminApproval" xml:space="preserve">
<value>Request admin approval</value>
<value>Be om godkännande från administratör</value>
</data>
<data name="ApproveWithMasterPassword" xml:space="preserve">
<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>
</data>
<data name="Passkey" xml:space="preserve">
<value>Passkey</value>
<value>Nyckel</value>
</data>
<data name="Passkeys" xml:space="preserve">
<value>Passkeys</value>
<value>Nycklar</value>
</data>
<data name="Application" xml:space="preserve">
<value>Application</value>
<value>Applikation</value>
</data>
<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 name="PasskeyWillNotBeCopied" xml:space="preserve">
<value>Passkey will not be copied</value>
<value>Nyckel kommer inte kopieras</value>
</data>
<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 name="CopyApplication" xml:space="preserve">
<value>Copy application</value>
<value>Kopiera applikation</value>
</data>
<data name="AvailableForTwoStepLogin" xml:space="preserve">
<value>Available for two-step login</value>
<value>Tillgänglig för tvåstegsverifiering</value>
</data>
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
<value>Återupprepa huvudlösenord hjälp</value>
</data>
<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 name="InvalidAPIKey" xml:space="preserve">
<value>Ogiltig API-nyckel</value>
@@ -2679,10 +2679,10 @@ Vill du byta till detta konto?</value>
<value>Ogiltig API-token</value>
</data>
<data name="AdminApprovalRequested" xml:space="preserve">
<value>Admin approval requested</value>
<value>Godkännande från administratör har begärts</value>
</data>
<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 name="YouWillBeNotifiedOnceApproved" xml:space="preserve">
<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>
</data>
<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 name="BlockAutoFill" xml:space="preserve">
<value>Block auto-fill</value>
<value>Blockera autofyll</value>
</data>
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
<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>
</data>
<data name="LoginApproved" xml:space="preserve">
<value>Login approved</value>
<value>Inloggning godkänd</value>
</data>
<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 name="LogInWithDevice" xml:space="preserve">
<value>Logga in med enhet</value>
@@ -2758,31 +2758,31 @@ Vill du byta till detta konto?</value>
<value>Utseende</value>
</data>
<data name="AccountSecurity" xml:space="preserve">
<value>Account security</value>
<value>Kontosäkerhet</value>
</data>
<data name="BitwardenHelpCenter" xml:space="preserve">
<value>Bitwarden Hjälpcenter</value>
</data>
<data name="ContactBitwardenSupport" xml:space="preserve">
<value>Contact Bitwarden support</value>
<value>Kontakta Bitwarden support</value>
</data>
<data name="CopyAppInformation" xml:space="preserve">
<value>Copy app information</value>
<value>Kopiera appinformation</value>
</data>
<data name="SyncNow" xml:space="preserve">
<value>Synkronisera nu</value>
</data>
<data name="UnlockOptions" xml:space="preserve">
<value>Unlock options</value>
<value>Upplåsning</value>
</data>
<data name="SessionTimeout" xml:space="preserve">
<value>Session timeout</value>
<value>Tidsgräns för session</value>
</data>
<data name="SessionTimeoutAction" xml:space="preserve">
<value>Session timeout action</value>
<value>Åtgärd när tidsgränsen uppnås</value>
</data>
<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>
</data>
<data name="OneHourAndOneMinute" xml:space="preserve">
@@ -2801,13 +2801,13 @@ Vill du byta till detta konto?</value>
<value>{0} timmar</value>
</data>
<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 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 name="AdditionalOptions" xml:space="preserve">
<value>Additional options</value>
<value>Ytterligare alternativ</value>
</data>
<data name="ContinueToWebApp" xml:space="preserve">
<value>Fortsätt till webbapp?</value>
@@ -2820,56 +2820,56 @@ Vill du byta till detta konto?</value>
<value>Fortsätt till Hjälpcenter?</value>
</data>
<data name="ContinueToContactSupport" xml:space="preserve">
<value>Continue to contact support?</value>
<value>Fortsätt att kontakta supporten?</value>
</data>
<data name="ContinueToAppStore" xml:space="preserve">
<value>Continue to app store?</value>
<value>Fortsätt till appbutiken?</value>
</data>
<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 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 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>
</data>
<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 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 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 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 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 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 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>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>För många försök</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
<value>Kontot har loggats ut.</value>
</data>
<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 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 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>
</root>

View File

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

View File

@@ -2185,7 +2185,7 @@
<value>无效的验证码</value>
</data>
<data name="RequestOTP" xml:space="preserve">
<value>求一次性密码</value>
<value>求一次性密码</value>
</data>
<data name="SendCode" xml:space="preserve">
<value>发送验证码</value>
@@ -2780,7 +2780,7 @@
<value>会话超时动作</value>
</data>
<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>
</data>
<data name="OneHourAndOneMinute" xml:space="preserve">

View File

@@ -63,12 +63,20 @@ namespace Bit.Core.Services
/// </param>
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))
{
try
{
// Filter out accounts without auto key
if (!await _cryptoService.HasAutoUnlockKeyAsync(userId))
if (!hasAutoUnlockKey)
{
return true;
}
@@ -84,7 +92,6 @@ namespace Bit.Core.Services
// Legacy users must migrate on web vault before login
await LogOutAsync(false, userId);
}
}
// Check again to verify auto key was set

View File

@@ -40,7 +40,7 @@ namespace Bit.App.Utilities
string image = null;
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 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