mirror of
https://github.com/bitwarden/mobile
synced 2025-12-11 05:43:30 +00:00
Compare commits
73 Commits
pr-labeler
...
community/
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1da62d8211 | ||
|
|
c5f1df6e4c | ||
|
|
cd45992e6b | ||
|
|
ed75aa7942 | ||
|
|
743bf06b24 | ||
|
|
73f3ffceb2 | ||
|
|
39881d2c7f | ||
|
|
5aaff1ea20 | ||
|
|
0271a4db4c | ||
|
|
375718f945 | ||
|
|
9eda015371 | ||
|
|
ea81acb3bf | ||
|
|
174549e5bc | ||
|
|
87b1d18872 | ||
|
|
ae9ba810ff | ||
|
|
dd52ff0dcc | ||
|
|
c678c17ebc | ||
|
|
cd9e49b13b | ||
|
|
6d7970f767 | ||
|
|
9adc4d3080 | ||
|
|
1f20f70d13 | ||
|
|
a25da68437 | ||
|
|
fdc0313d10 | ||
|
|
f31c87b52e | ||
|
|
1e79e1182f | ||
|
|
fc79042212 | ||
|
|
dc6a0bbd33 | ||
|
|
11947ce99a | ||
|
|
4abb472998 | ||
|
|
1d541e5b8e | ||
|
|
175b9936b6 | ||
|
|
72e67bd6f2 | ||
|
|
216c6abcf6 | ||
|
|
1014563c75 | ||
|
|
3506269811 | ||
|
|
31487a31bb | ||
|
|
1407aa5655 | ||
|
|
16f59e2698 | ||
|
|
d876b54f45 | ||
|
|
6644e3b449 | ||
|
|
8d98d1d5bd | ||
|
|
3e9711f8f2 | ||
|
|
3af37f01d3 | ||
|
|
43d2d386b1 | ||
|
|
bc5c11b47f | ||
|
|
52843b4181 | ||
|
|
98705e443f | ||
|
|
1332ef7b43 | ||
|
|
04e30c2146 | ||
|
|
f604da13a1 | ||
|
|
dcf9acb51c | ||
|
|
3b087c50ae | ||
|
|
1c13ed9895 | ||
|
|
eeb634e698 | ||
|
|
8bc2df6c8a | ||
|
|
7cd40d4d89 | ||
|
|
bebf23785d | ||
|
|
e78833cbcb | ||
|
|
b7ff636862 | ||
|
|
0288a6659c | ||
|
|
c7fd113f26 | ||
|
|
79241731e7 | ||
|
|
74e9914f5b | ||
|
|
65307f6eab | ||
|
|
e9f83aee90 | ||
|
|
fdaf743868 | ||
|
|
9d6b938ba9 | ||
|
|
1c8328f62d | ||
|
|
f24b82f345 | ||
|
|
37f1a7087e | ||
|
|
6bb654e630 | ||
|
|
fc260f8159 | ||
|
|
bf463926a3 |
10
.github/labeler.yml
vendored
10
.github/labeler.yml
vendored
@@ -8,11 +8,11 @@ iOS:
|
|||||||
- src/Core/*
|
- src/Core/*
|
||||||
- lib/ios/*
|
- lib/ios/*
|
||||||
- src/iOS/*
|
- src/iOS/*
|
||||||
- src/iOS.Autofill/*
|
- 'src/iOS.Autofill/*'
|
||||||
- src/iOS.Core/*
|
- 'src/iOS.Core/*'
|
||||||
- src/iOS.Extension/*
|
- 'src/iOS.Extension/*'
|
||||||
- src/iOS.ShareExtension/*
|
- 'src/iOS.ShareExtension/*'
|
||||||
- src/iOS.Widget/*
|
- 'src/iOS.Widget/*'
|
||||||
- src/watchOS/*
|
- src/watchOS/*
|
||||||
|
|
||||||
watchOS:
|
watchOS:
|
||||||
|
|||||||
37
.github/renovate.json
vendored
37
.github/renovate.json
vendored
@@ -2,21 +2,36 @@
|
|||||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
"extends": [
|
"extends": [
|
||||||
"config:base",
|
"config:base",
|
||||||
"schedule:monthly",
|
":combinePatchMinorReleases",
|
||||||
":maintainLockFilesMonthly",
|
":dependencyDashboard",
|
||||||
":preserveSemverRanges",
|
":maintainLockFilesWeekly",
|
||||||
|
":pinAllExceptPeerDependencies",
|
||||||
|
":prConcurrentLimit10",
|
||||||
":rebaseStalePrs",
|
":rebaseStalePrs",
|
||||||
":disableDependencyDashboard"
|
"schedule:weekends",
|
||||||
],
|
":separateMajorReleases"
|
||||||
"enabledManagers": [
|
|
||||||
"nuget"
|
|
||||||
],
|
],
|
||||||
|
"enabledManagers": ["cargo", "github-actions", "npm", "nuget"],
|
||||||
"packageRules": [
|
"packageRules": [
|
||||||
{
|
{
|
||||||
|
"groupName": "cargo minor",
|
||||||
|
"matchManagers": ["cargo"],
|
||||||
|
"matchUpdateTypes": ["minor", "patch"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"groupName": "gh minor",
|
||||||
|
"matchManagers": ["github-actions"],
|
||||||
|
"matchUpdateTypes": ["minor", "patch"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"groupName": "npm minor",
|
||||||
|
"matchManagers": ["npm"],
|
||||||
|
"matchUpdateTypes": ["minor", "patch"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"groupName": "nuget minor",
|
||||||
"matchManagers": ["nuget"],
|
"matchManagers": ["nuget"],
|
||||||
"groupName": "Nuget updates",
|
"matchUpdateTypes": ["minor", "patch"]
|
||||||
"groupSlug": "nuget",
|
},
|
||||||
"separateMajorMinor": false
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
10
.github/workflows/automatic-issue-responses.yml
vendored
10
.github/workflows/automatic-issue-responses.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
|||||||
# Feature request
|
# Feature request
|
||||||
- if: github.event.label.name == 'feature-request'
|
- if: github.event.label.name == 'feature-request'
|
||||||
name: Feature request
|
name: Feature request
|
||||||
uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0
|
uses: peter-evans/close-issue@276d7966e389d888f011539a86c8920025ea0626 # v3.0.1
|
||||||
with:
|
with:
|
||||||
comment: |
|
comment: |
|
||||||
We use GitHub issues as a place to track bugs and other development related issues. The [Bitwarden Community Forums](https://community.bitwarden.com/) has a [Feature Requests](https://community.bitwarden.com/c/feature-requests) section for submitting, voting for, and discussing requests like this one.
|
We use GitHub issues as a place to track bugs and other development related issues. The [Bitwarden Community Forums](https://community.bitwarden.com/) has a [Feature Requests](https://community.bitwarden.com/c/feature-requests) section for submitting, voting for, and discussing requests like this one.
|
||||||
@@ -25,7 +25,7 @@ jobs:
|
|||||||
# Intended behavior
|
# Intended behavior
|
||||||
- if: github.event.label.name == 'intended-behavior'
|
- if: github.event.label.name == 'intended-behavior'
|
||||||
name: Intended behaviour
|
name: Intended behaviour
|
||||||
uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0
|
uses: peter-evans/close-issue@276d7966e389d888f011539a86c8920025ea0626 # v3.0.1
|
||||||
with:
|
with:
|
||||||
comment: |
|
comment: |
|
||||||
Your issue appears to be describing the intended behavior of the software. If you want this to be changed, it would be a feature request.
|
Your issue appears to be describing the intended behavior of the software. If you want this to be changed, it would be a feature request.
|
||||||
@@ -38,7 +38,7 @@ jobs:
|
|||||||
# Customer support request
|
# Customer support request
|
||||||
- if: github.event.label.name == 'customer-support'
|
- if: github.event.label.name == 'customer-support'
|
||||||
name: Customer Support request
|
name: Customer Support request
|
||||||
uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0
|
uses: peter-evans/close-issue@276d7966e389d888f011539a86c8920025ea0626 # v3.0.1
|
||||||
with:
|
with:
|
||||||
comment: |
|
comment: |
|
||||||
We use GitHub issues as a place to track bugs and other development related issues. Your issue appears to be a support request, or would otherwise be better handled by our dedicated Customer Success team.
|
We use GitHub issues as a place to track bugs and other development related issues. Your issue appears to be a support request, or would otherwise be better handled by our dedicated Customer Success team.
|
||||||
@@ -49,14 +49,14 @@ jobs:
|
|||||||
# Resolved
|
# Resolved
|
||||||
- if: github.event.label.name == 'resolved'
|
- if: github.event.label.name == 'resolved'
|
||||||
name: Resolved
|
name: Resolved
|
||||||
uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0
|
uses: peter-evans/close-issue@276d7966e389d888f011539a86c8920025ea0626 # v3.0.1
|
||||||
with:
|
with:
|
||||||
comment: |
|
comment: |
|
||||||
We’ve closed this issue, as it appears the original problem has been resolved. If this happens again or continues to be an problem, please respond to this issue with any additional detail to assist with reproduction and root cause analysis.
|
We’ve closed this issue, as it appears the original problem has been resolved. If this happens again or continues to be an problem, please respond to this issue with any additional detail to assist with reproduction and root cause analysis.
|
||||||
# Stale
|
# Stale
|
||||||
- if: github.event.label.name == 'stale'
|
- if: github.event.label.name == 'stale'
|
||||||
name: Stale
|
name: Stale
|
||||||
uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0
|
uses: peter-evans/close-issue@276d7966e389d888f011539a86c8920025ea0626 # v3.0.1
|
||||||
with:
|
with:
|
||||||
comment: |
|
comment: |
|
||||||
As we haven’t heard from you about this problem in some time, this issue will now be closed.
|
As we haven’t heard from you about this problem in some time, this issue will now be closed.
|
||||||
|
|||||||
55
.github/workflows/build.yml
vendored
55
.github/workflows/build.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
|||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
|
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
||||||
|
|
||||||
- name: Set up CLOC
|
- name: Set up CLOC
|
||||||
run: |
|
run: |
|
||||||
@@ -36,7 +36,7 @@ jobs:
|
|||||||
hotfix_branch_exists: ${{ steps.branch-check.outputs.hotfix_branch_exists }}
|
hotfix_branch_exists: ${{ steps.branch-check.outputs.hotfix_branch_exists }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
|
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
||||||
with:
|
with:
|
||||||
submodules: 'true'
|
submodules: 'true'
|
||||||
|
|
||||||
@@ -67,12 +67,17 @@ jobs:
|
|||||||
variant: ["prod", "qa"]
|
variant: ["prod", "qa"]
|
||||||
steps:
|
steps:
|
||||||
- name: Setup NuGet
|
- name: Setup NuGet
|
||||||
uses: nuget/setup-nuget@b2bc17b761a1d88cab755a776c7922eb26eefbfa # v1.0.6
|
uses: nuget/setup-nuget@296fd3ccf8528660c91106efefe2364482f86d6f # v1.2.0
|
||||||
with:
|
with:
|
||||||
nuget-version: 5.9.0
|
nuget-version: 5.9.0
|
||||||
|
|
||||||
|
- name: Set up .NET
|
||||||
|
uses: actions/setup-dotnet@3447fd6a9f9e57506b15f895c5b76d3b197dc7c2 # v3.2.0
|
||||||
|
with:
|
||||||
|
dotnet-version: '3.1.x'
|
||||||
|
|
||||||
- name: Set up MSBuild
|
- name: Set up MSBuild
|
||||||
uses: microsoft/setup-msbuild@ab534842b4bdf384b8aaf93765dc6f721d9f5fab
|
uses: microsoft/setup-msbuild@1ff57057b5cfdc39105cd07a01d78e9b0ea0c14c # v1.3.1
|
||||||
|
|
||||||
- name: Setup Windows builder
|
- name: Setup Windows builder
|
||||||
run: choco install checksum --no-progress
|
run: choco install checksum --no-progress
|
||||||
@@ -105,7 +110,7 @@ jobs:
|
|||||||
echo "GitHub event: $GITHUB_EVENT"
|
echo "GitHub event: $GITHUB_EVENT"
|
||||||
|
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
|
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Decrypt secrets
|
- name: Decrypt secrets
|
||||||
@@ -157,7 +162,7 @@ jobs:
|
|||||||
shell: pwsh
|
shell: pwsh
|
||||||
|
|
||||||
- name: Report test results
|
- name: Report test results
|
||||||
uses: dorny/test-reporter@c9b3d0e2bd2a4e96aaf424dbaa31c46b42318226
|
uses: dorny/test-reporter@c9b3d0e2bd2a4e96aaf424dbaa31c46b42318226 # v1.6.0
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: Test Results
|
name: Test Results
|
||||||
@@ -232,7 +237,7 @@ jobs:
|
|||||||
shell: pwsh
|
shell: pwsh
|
||||||
- name: Upload Prod .aab artifact
|
- name: Upload Prod .aab artifact
|
||||||
if: ${{ matrix.variant == 'prod' }}
|
if: ${{ matrix.variant == 'prod' }}
|
||||||
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
|
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
|
||||||
with:
|
with:
|
||||||
name: com.x8bit.bitwarden.aab
|
name: com.x8bit.bitwarden.aab
|
||||||
path: ./com.x8bit.bitwarden.aab
|
path: ./com.x8bit.bitwarden.aab
|
||||||
@@ -240,7 +245,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Upload Prod .apk artifact
|
- name: Upload Prod .apk artifact
|
||||||
if: ${{ matrix.variant == 'prod' }}
|
if: ${{ matrix.variant == 'prod' }}
|
||||||
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
|
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
|
||||||
with:
|
with:
|
||||||
name: com.x8bit.bitwarden.apk
|
name: com.x8bit.bitwarden.apk
|
||||||
path: ./com.x8bit.bitwarden.apk
|
path: ./com.x8bit.bitwarden.apk
|
||||||
@@ -248,7 +253,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Upload Other .apk artifact
|
- name: Upload Other .apk artifact
|
||||||
if: ${{ matrix.variant != 'prod' }}
|
if: ${{ matrix.variant != 'prod' }}
|
||||||
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
|
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
|
||||||
with:
|
with:
|
||||||
name: com.x8bit.bitwarden.${{ matrix.variant }}.apk
|
name: com.x8bit.bitwarden.${{ matrix.variant }}.apk
|
||||||
path: ./com.x8bit.bitwarden.${{ matrix.variant }}.apk
|
path: ./com.x8bit.bitwarden.${{ matrix.variant }}.apk
|
||||||
@@ -268,7 +273,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Upload .apk sha file for prod
|
- name: Upload .apk sha file for prod
|
||||||
if: ${{ matrix.variant == 'prod' }}
|
if: ${{ matrix.variant == 'prod' }}
|
||||||
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
|
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
|
||||||
with:
|
with:
|
||||||
name: bw-android-apk-sha256.txt
|
name: bw-android-apk-sha256.txt
|
||||||
path: ./bw-android-apk-sha256.txt
|
path: ./bw-android-apk-sha256.txt
|
||||||
@@ -276,7 +281,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Upload .apk sha file for other
|
- name: Upload .apk sha file for other
|
||||||
if: ${{ matrix.variant != 'prod' }}
|
if: ${{ matrix.variant != 'prod' }}
|
||||||
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
|
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
|
||||||
with:
|
with:
|
||||||
name: bw-android-${{ matrix.variant }}-apk-sha256.txt
|
name: bw-android-${{ matrix.variant }}-apk-sha256.txt
|
||||||
path: ./bw-android-${{ matrix.variant }}-apk-sha256.txt
|
path: ./bw-android-${{ matrix.variant }}-apk-sha256.txt
|
||||||
@@ -303,12 +308,12 @@ jobs:
|
|||||||
runs-on: windows-2022
|
runs-on: windows-2022
|
||||||
steps:
|
steps:
|
||||||
- name: Setup NuGet
|
- name: Setup NuGet
|
||||||
uses: nuget/setup-nuget@b2bc17b761a1d88cab755a776c7922eb26eefbfa # v1.0.6
|
uses: nuget/setup-nuget@296fd3ccf8528660c91106efefe2364482f86d6f # v1.2.0
|
||||||
with:
|
with:
|
||||||
nuget-version: 5.9.0
|
nuget-version: 5.9.0
|
||||||
|
|
||||||
- name: Set up MSBuild
|
- name: Set up MSBuild
|
||||||
uses: microsoft/setup-msbuild@ab534842b4bdf384b8aaf93765dc6f721d9f5fab
|
uses: microsoft/setup-msbuild@1ff57057b5cfdc39105cd07a01d78e9b0ea0c14c # v1.3.1
|
||||||
|
|
||||||
- name: Setup Windows builder
|
- name: Setup Windows builder
|
||||||
run: choco install checksum --no-progress
|
run: choco install checksum --no-progress
|
||||||
@@ -342,7 +347,7 @@ jobs:
|
|||||||
echo "GitHub event: $GITHUB_EVENT"
|
echo "GitHub event: $GITHUB_EVENT"
|
||||||
|
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
|
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
||||||
|
|
||||||
- name: Decrypt secrets
|
- name: Decrypt secrets
|
||||||
env:
|
env:
|
||||||
@@ -477,7 +482,7 @@ jobs:
|
|||||||
shell: pwsh
|
shell: pwsh
|
||||||
|
|
||||||
- name: Upload F-Droid .apk artifact
|
- name: Upload F-Droid .apk artifact
|
||||||
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
|
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
|
||||||
with:
|
with:
|
||||||
name: com.x8bit.bitwarden-fdroid.apk
|
name: com.x8bit.bitwarden-fdroid.apk
|
||||||
path: ./com.x8bit.bitwarden-fdroid.apk
|
path: ./com.x8bit.bitwarden-fdroid.apk
|
||||||
@@ -489,7 +494,7 @@ jobs:
|
|||||||
-t sha256 | Out-File -Encoding ASCII ./bw-fdroid-apk-sha256.txt
|
-t sha256 | Out-File -Encoding ASCII ./bw-fdroid-apk-sha256.txt
|
||||||
|
|
||||||
- name: Upload F-Droid sha file
|
- name: Upload F-Droid sha file
|
||||||
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
|
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
|
||||||
with:
|
with:
|
||||||
name: bw-fdroid-apk-sha256.txt
|
name: bw-fdroid-apk-sha256.txt
|
||||||
path: ./bw-fdroid-apk-sha256.txt
|
path: ./bw-fdroid-apk-sha256.txt
|
||||||
@@ -502,7 +507,7 @@ jobs:
|
|||||||
needs: setup
|
needs: setup
|
||||||
steps:
|
steps:
|
||||||
- name: Setup NuGet
|
- name: Setup NuGet
|
||||||
uses: nuget/setup-nuget@b2bc17b761a1d88cab755a776c7922eb26eefbfa # v1.0.6
|
uses: nuget/setup-nuget@296fd3ccf8528660c91106efefe2364482f86d6f # v1.2.0
|
||||||
with:
|
with:
|
||||||
nuget-version: 5.9.0
|
nuget-version: 5.9.0
|
||||||
|
|
||||||
@@ -515,12 +520,12 @@ jobs:
|
|||||||
echo "GitHub event: $GITHUB_EVENT"
|
echo "GitHub event: $GITHUB_EVENT"
|
||||||
|
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
|
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
||||||
with:
|
with:
|
||||||
submodules: 'true'
|
submodules: 'true'
|
||||||
|
|
||||||
- name: Login to Azure - CI Subscription
|
- name: Login to Azure - CI Subscription
|
||||||
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
|
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf # v1.4.3
|
||||||
with:
|
with:
|
||||||
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||||
|
|
||||||
@@ -698,7 +703,7 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: Upload App Store .ipa & dSYMs artifacts
|
- name: Upload App Store .ipa & dSYMs artifacts
|
||||||
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
|
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
|
||||||
with:
|
with:
|
||||||
name: Bitwarden iOS
|
name: Bitwarden iOS
|
||||||
path: |
|
path: |
|
||||||
@@ -771,10 +776,10 @@ jobs:
|
|||||||
_CROWDIN_PROJECT_ID: "269690"
|
_CROWDIN_PROJECT_ID: "269690"
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
|
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
||||||
|
|
||||||
- name: Login to Azure - CI Subscription
|
- name: Login to Azure - CI Subscription
|
||||||
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
|
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf # v1.4.3
|
||||||
with:
|
with:
|
||||||
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||||
|
|
||||||
@@ -793,7 +798,7 @@ jobs:
|
|||||||
done
|
done
|
||||||
|
|
||||||
- name: Upload Sources
|
- name: Upload Sources
|
||||||
uses: crowdin/github-action@9237b4cb361788dfce63feb2e2f15c09e2fe7415
|
uses: crowdin/github-action@965d501f160af7b1f88aed4c29154b0caf1e94b9 # v1.9.0
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}
|
CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}
|
||||||
@@ -840,7 +845,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Login to Azure - CI Subscription
|
- name: Login to Azure - CI Subscription
|
||||||
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
|
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf # v1.4.3
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||||
@@ -861,7 +866,7 @@ jobs:
|
|||||||
done
|
done
|
||||||
|
|
||||||
- name: Notify Slack on failure
|
- name: Notify Slack on failure
|
||||||
uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33
|
uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.0
|
||||||
if: failure()
|
if: failure()
|
||||||
env:
|
env:
|
||||||
SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }}
|
SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }}
|
||||||
|
|||||||
8
.github/workflows/crowdin-pull.yml
vendored
8
.github/workflows/crowdin-pull.yml
vendored
@@ -15,22 +15,22 @@ jobs:
|
|||||||
_CROWDIN_PROJECT_ID: "269690"
|
_CROWDIN_PROJECT_ID: "269690"
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
|
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
||||||
|
|
||||||
- name: Login to Azure - CI Subscription
|
- name: Login to Azure - CI Subscription
|
||||||
uses: Azure/login@77f1b2e3fb80c0e8645114159d17008b8a2e475a
|
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf # v1.4.3
|
||||||
with:
|
with:
|
||||||
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||||
|
|
||||||
- name: Retrieve secrets
|
- name: Retrieve secrets
|
||||||
id: retrieve-secrets
|
id: retrieve-secrets
|
||||||
uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af
|
uses: bitwarden/gh-actions/get-keyvault-secrets@34ecb67b2a357795dc893549df0795e7383ff50f
|
||||||
with:
|
with:
|
||||||
keyvault: "bitwarden-ci"
|
keyvault: "bitwarden-ci"
|
||||||
secrets: "crowdin-api-token, github-gpg-private-key, github-gpg-private-key-passphrase"
|
secrets: "crowdin-api-token, github-gpg-private-key, github-gpg-private-key-passphrase"
|
||||||
|
|
||||||
- name: Download translations
|
- name: Download translations
|
||||||
uses: crowdin/github-action@12143a68c213f3c6d9913c9e5023224f7231face
|
uses: crowdin/github-action@965d501f160af7b1f88aed4c29154b0caf1e94b9 # v1.9.0
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}
|
CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}
|
||||||
|
|||||||
2
.github/workflows/enforce-labels.yml
vendored
2
.github/workflows/enforce-labels.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
|||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Enforce Label
|
- name: Enforce Label
|
||||||
uses: yogevbd/enforce-label-action@8d1e1709b1011e6d90400a0e6cf7c0b77aa5efeb
|
uses: yogevbd/enforce-label-action@a3c219da6b8fa73f6ba62b68ff09c469b3a1c024 # 2.2.2
|
||||||
with:
|
with:
|
||||||
BANNED_LABELS: "hold,needs-qa"
|
BANNED_LABELS: "hold,needs-qa"
|
||||||
BANNED_LABELS_DESCRIPTION: "PRs with the hold or needs-qa labels cannot be merged"
|
BANNED_LABELS_DESCRIPTION: "PRs with the hold or needs-qa labels cannot be merged"
|
||||||
|
|||||||
20
.github/workflows/release.yml
vendored
20
.github/workflows/release.yml
vendored
@@ -38,11 +38,11 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
|
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
||||||
|
|
||||||
- name: Check Release Version
|
- name: Check Release Version
|
||||||
id: version
|
id: version
|
||||||
uses: bitwarden/gh-actions/release-version-check@8f055ef543c7433c967a1b9b04a0f230923233bb
|
uses: bitwarden/gh-actions/release-version-check@34ecb67b2a357795dc893549df0795e7383ff50f
|
||||||
with:
|
with:
|
||||||
release-type: ${{ github.event.inputs.release_type }}
|
release-type: ${{ github.event.inputs.release_type }}
|
||||||
project-type: xamarin
|
project-type: xamarin
|
||||||
@@ -56,7 +56,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Create GitHub deployment
|
- name: Create GitHub deployment
|
||||||
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
||||||
uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48
|
uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5
|
||||||
id: deployment
|
id: deployment
|
||||||
with:
|
with:
|
||||||
token: '${{ secrets.GITHUB_TOKEN }}'
|
token: '${{ secrets.GITHUB_TOKEN }}'
|
||||||
@@ -68,7 +68,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Download all artifacts
|
- name: Download all artifacts
|
||||||
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
||||||
uses: dawidd6/action-download-artifact@575b1e4167df67acf7e692af784566618b23c71e # v2.17.10
|
uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0
|
||||||
with:
|
with:
|
||||||
workflow: build.yml
|
workflow: build.yml
|
||||||
workflow_conclusion: success
|
workflow_conclusion: success
|
||||||
@@ -76,7 +76,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Dry Run - Download all artifacts
|
- name: Dry Run - Download all artifacts
|
||||||
if: ${{ github.event.inputs.release_type == 'Dry Run' }}
|
if: ${{ github.event.inputs.release_type == 'Dry Run' }}
|
||||||
uses: dawidd6/action-download-artifact@575b1e4167df67acf7e692af784566618b23c71e # v2.17.10
|
uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0
|
||||||
with:
|
with:
|
||||||
workflow: build.yml
|
workflow: build.yml
|
||||||
workflow_conclusion: success
|
workflow_conclusion: success
|
||||||
@@ -104,7 +104,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Update deployment status to Success
|
- name: Update deployment status to Success
|
||||||
if: ${{ github.event.inputs.release_type != 'Dry Run' && success() }}
|
if: ${{ github.event.inputs.release_type != 'Dry Run' && success() }}
|
||||||
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
|
uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1
|
||||||
with:
|
with:
|
||||||
token: '${{ secrets.GITHUB_TOKEN }}'
|
token: '${{ secrets.GITHUB_TOKEN }}'
|
||||||
state: 'success'
|
state: 'success'
|
||||||
@@ -112,7 +112,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Update deployment status to Failure
|
- name: Update deployment status to Failure
|
||||||
if: ${{ github.event.inputs.release_type != 'Dry Run' && failure() }}
|
if: ${{ github.event.inputs.release_type != 'Dry Run' && failure() }}
|
||||||
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
|
uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1
|
||||||
with:
|
with:
|
||||||
token: '${{ secrets.GITHUB_TOKEN }}'
|
token: '${{ secrets.GITHUB_TOKEN }}'
|
||||||
state: 'failure'
|
state: 'failure'
|
||||||
@@ -126,11 +126,11 @@ jobs:
|
|||||||
if: inputs.fdroid_publish
|
if: inputs.fdroid_publish
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
|
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
||||||
|
|
||||||
- name: Download F-Droid .apk artifact
|
- name: Download F-Droid .apk artifact
|
||||||
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
||||||
uses: dawidd6/action-download-artifact@575b1e4167df67acf7e692af784566618b23c71e # v2.17.10
|
uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0
|
||||||
with:
|
with:
|
||||||
workflow: build.yml
|
workflow: build.yml
|
||||||
workflow_conclusion: success
|
workflow_conclusion: success
|
||||||
@@ -139,7 +139,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Dry Run - Download F-Droid .apk artifact
|
- name: Dry Run - Download F-Droid .apk artifact
|
||||||
if: ${{ github.event.inputs.release_type == 'Dry Run' }}
|
if: ${{ github.event.inputs.release_type == 'Dry Run' }}
|
||||||
uses: dawidd6/action-download-artifact@575b1e4167df67acf7e692af784566618b23c71e # v2.17.10
|
uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0
|
||||||
with:
|
with:
|
||||||
workflow: build.yml
|
workflow: build.yml
|
||||||
workflow_conclusion: success
|
workflow_conclusion: success
|
||||||
|
|||||||
10
.github/workflows/version-auto-bump.yml
vendored
10
.github/workflows/version-auto-bump.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
|||||||
version_number: ${{ steps.version.outputs.new-version }}
|
version_number: ${{ steps.version.outputs.new-version }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Branch
|
- name: Checkout Branch
|
||||||
uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579
|
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
||||||
|
|
||||||
- name: Calculate bumped version
|
- name: Calculate bumped version
|
||||||
id: version
|
id: version
|
||||||
@@ -32,12 +32,8 @@ jobs:
|
|||||||
echo "new-version=$NEW_VER" >> $GITHUB_OUTPUT
|
echo "new-version=$NEW_VER" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
trigger_version_bump:
|
trigger_version_bump:
|
||||||
name: "Version bump"
|
name: Bump version to ${{ needs.setup.outputs.version_number }}
|
||||||
runs-on: ubuntu-22.04
|
needs: setup
|
||||||
needs:
|
|
||||||
- setup
|
|
||||||
steps:
|
|
||||||
- name: Bump version to ${{ needs.setup.outputs.version_number }}
|
|
||||||
uses: ./.github/workflows/version-bump.yml
|
uses: ./.github/workflows/version-bump.yml
|
||||||
secrets:
|
secrets:
|
||||||
AZURE_PROD_KV_CREDENTIALS: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
AZURE_PROD_KV_CREDENTIALS: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||||
|
|||||||
18
.github/workflows/version-bump.yml
vendored
18
.github/workflows/version-bump.yml
vendored
@@ -22,22 +22,22 @@ jobs:
|
|||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Branch
|
- name: Checkout Branch
|
||||||
uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579
|
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0
|
||||||
|
|
||||||
- name: Login to Azure - CI Subscription
|
- name: Login to Azure - CI Subscription
|
||||||
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
|
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf # v1.4.3
|
||||||
with:
|
with:
|
||||||
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||||
|
|
||||||
- name: Retrieve secrets
|
- name: Retrieve secrets
|
||||||
id: retrieve-secrets
|
id: retrieve-secrets
|
||||||
uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af
|
uses: bitwarden/gh-actions/get-keyvault-secrets@34ecb67b2a357795dc893549df0795e7383ff50f
|
||||||
with:
|
with:
|
||||||
keyvault: "bitwarden-ci"
|
keyvault: "bitwarden-ci"
|
||||||
secrets: "github-gpg-private-key, github-gpg-private-key-passphrase"
|
secrets: "github-gpg-private-key, github-gpg-private-key-passphrase"
|
||||||
|
|
||||||
- name: Import GPG key
|
- name: Import GPG key
|
||||||
uses: crazy-max/ghaction-import-gpg@c8bb57c57e8df1be8c73ff3d59deab1dbc00e0d1
|
uses: crazy-max/ghaction-import-gpg@111c56156bcc6918c056dbef52164cfa583dc549 # v5.2.0
|
||||||
with:
|
with:
|
||||||
gpg_private_key: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key }}
|
gpg_private_key: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key }}
|
||||||
passphrase: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key-passphrase }}
|
passphrase: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key-passphrase }}
|
||||||
@@ -48,31 +48,31 @@ jobs:
|
|||||||
run: git switch -c version_bump_${{ github.event.inputs.version_number }}
|
run: git switch -c version_bump_${{ github.event.inputs.version_number }}
|
||||||
|
|
||||||
- name: Bump Version - Android XML
|
- name: Bump Version - Android XML
|
||||||
uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945
|
uses: bitwarden/gh-actions/version-bump@34ecb67b2a357795dc893549df0795e7383ff50f
|
||||||
with:
|
with:
|
||||||
version: ${{ github.event.inputs.version_number }}
|
version: ${{ github.event.inputs.version_number }}
|
||||||
file_path: "./src/Android/Properties/AndroidManifest.xml"
|
file_path: "./src/Android/Properties/AndroidManifest.xml"
|
||||||
|
|
||||||
- name: Bump Version - iOS.Autofill
|
- name: Bump Version - iOS.Autofill
|
||||||
uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945
|
uses: bitwarden/gh-actions/version-bump@34ecb67b2a357795dc893549df0795e7383ff50f
|
||||||
with:
|
with:
|
||||||
version: ${{ github.event.inputs.version_number }}
|
version: ${{ github.event.inputs.version_number }}
|
||||||
file_path: "./src/iOS.Autofill/Info.plist"
|
file_path: "./src/iOS.Autofill/Info.plist"
|
||||||
|
|
||||||
- name: Bump Version - iOS.Extension
|
- name: Bump Version - iOS.Extension
|
||||||
uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945
|
uses: bitwarden/gh-actions/version-bump@34ecb67b2a357795dc893549df0795e7383ff50f
|
||||||
with:
|
with:
|
||||||
version: ${{ github.event.inputs.version_number }}
|
version: ${{ github.event.inputs.version_number }}
|
||||||
file_path: "./src/iOS.Extension/Info.plist"
|
file_path: "./src/iOS.Extension/Info.plist"
|
||||||
|
|
||||||
- name: Bump Version - iOS.ShareExtension
|
- name: Bump Version - iOS.ShareExtension
|
||||||
uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945
|
uses: bitwarden/gh-actions/version-bump@34ecb67b2a357795dc893549df0795e7383ff50f
|
||||||
with:
|
with:
|
||||||
version: ${{ github.event.inputs.version_number }}
|
version: ${{ github.event.inputs.version_number }}
|
||||||
file_path: "./src/iOS.ShareExtension/Info.plist"
|
file_path: "./src/iOS.ShareExtension/Info.plist"
|
||||||
|
|
||||||
- name: Bump Version - iOS
|
- name: Bump Version - iOS
|
||||||
uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945
|
uses: bitwarden/gh-actions/version-bump@34ecb67b2a357795dc893549df0795e7383ff50f
|
||||||
with:
|
with:
|
||||||
version: ${{ github.event.inputs.version_number }}
|
version: ${{ github.event.inputs.version_number }}
|
||||||
file_path: "./src/iOS/Info.plist"
|
file_path: "./src/iOS/Info.plist"
|
||||||
|
|||||||
2
.github/workflows/workflow-linter.yml
vendored
2
.github/workflows/workflow-linter.yml
vendored
@@ -8,4 +8,4 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
call-workflow:
|
call-workflow:
|
||||||
uses: bitwarden/gh-actions/.github/workflows/workflow-linter.yml@master
|
uses: bitwarden/gh-actions/.github/workflows/workflow-linter.yml@34ecb67b2a357795dc893549df0795e7383ff50f
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
# Bitwarden Mobile Application
|
# Bitwarden Mobile Application
|
||||||
|
|
||||||
<a href="https://play.google.com/store/apps/details?id=com.x8bit.bitwarden" target="_blank"><img alt="Get it on Google Play" src="https://imgur.com/YQzmZi9.png" width="153" height="46"></a> <a href="https://mobileapp.bitwarden.com/fdroid/" target="_blank"><img alt="Get it on Google Play" src="https://i.imgur.com/HDicnzz.png" width="154" height="46"></a> <a href="https://itunes.apple.com/us/app/bitwarden-free-password-manager/id1137397744?mt=8" target="_blank"><img src="https://imgur.com/GdGqPMY.png" width="135" height="40"></a>
|
<a href="https://play.google.com/store/apps/details?id=com.x8bit.bitwarden" target="_blank"><img alt="Get it on Google Play" src="https://imgur.com/YQzmZi9.png" width="153" height="46"></a> <a href="https://mobileapp.bitwarden.com/fdroid/" target="_blank"><img alt="Get it on F-Droid" src="https://i.imgur.com/HDicnzz.png" width="154" height="46"></a> <a href="https://itunes.apple.com/us/app/bitwarden-free-password-manager/id1137397744?mt=8" target="_blank"><img src="https://imgur.com/GdGqPMY.png" width="135" height="40"></a>
|
||||||
|
|
||||||
The Bitwarden mobile application is written in C# with Xamarin Android, Xamarin iOS, and Xamarin Forms.
|
The Bitwarden mobile application is written in C# with Xamarin Android, Xamarin iOS, and Xamarin Forms.
|
||||||
|
|
||||||
|
|||||||
12
crowdin.yml
12
crowdin.yml
@@ -38,3 +38,15 @@ files:
|
|||||||
pt-PT: pt-PT
|
pt-PT: pt-PT
|
||||||
en-GB: en-GB
|
en-GB: en-GB
|
||||||
en-IN: en-IN
|
en-IN: en-IN
|
||||||
|
- source: "/src/watchOS/bitwarden/bitwarden WatchKit Extension/Localization/en.lproj/Localizable.strings"
|
||||||
|
dest: "/src/watchOS/bitwarden/bitwarden WatchKit Extension/Localization/en.lproj/%original_file_name%"
|
||||||
|
translation: "/src/watchOS/bitwarden/bitwarden WatchKit Extension/Localization//%two_letters_code%.lproj/%original_file_name%"
|
||||||
|
update_option: update_as_unapproved
|
||||||
|
languages_mapping:
|
||||||
|
two_letters_code:
|
||||||
|
zh-CN: zh-Hans
|
||||||
|
zh-TW: zh-Hant
|
||||||
|
pt-BR: pt-BR
|
||||||
|
pt-PT: pt-PT
|
||||||
|
en-GB: en-GB
|
||||||
|
en-IN: en-IN
|
||||||
|
|||||||
@@ -78,21 +78,20 @@
|
|||||||
<Version>1.9.0</Version>
|
<Version>1.9.0</Version>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Xamarin.AndroidX.AppCompat" Version="1.5.1.1" />
|
<PackageReference Include="Xamarin.AndroidX.AppCompat" Version="1.5.1.1" />
|
||||||
<PackageReference Include="Xamarin.AndroidX.AutoFill" Version="1.1.0.14" />
|
<PackageReference Include="Xamarin.AndroidX.AutoFill" Version="1.1.0.16" />
|
||||||
<PackageReference Include="Xamarin.AndroidX.CardView" Version="1.0.0.17" />
|
<PackageReference Include="Xamarin.AndroidX.CardView" Version="1.0.0.19" />
|
||||||
<PackageReference Include="Xamarin.AndroidX.Core" Version="1.9.0.1" />
|
<PackageReference Include="Xamarin.AndroidX.Core" Version="1.10.0" />
|
||||||
<PackageReference Include="Xamarin.AndroidX.Legacy.Support.V4" Version="1.0.0.15" />
|
|
||||||
<PackageReference Include="Xamarin.AndroidX.MediaRouter" Version="1.3.1.1" />
|
<PackageReference Include="Xamarin.AndroidX.MediaRouter" Version="1.3.1.1" />
|
||||||
<PackageReference Include="Xamarin.Essentials">
|
<PackageReference Include="Xamarin.Essentials">
|
||||||
<Version>1.7.3</Version>
|
<Version>1.7.5</Version>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Xamarin.Firebase.Messaging">
|
<PackageReference Include="Xamarin.Firebase.Messaging">
|
||||||
<Version>123.0.8</Version>
|
<Version>123.1.1.1</Version>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Xamarin.Google.Android.Material" Version="1.6.1.1" />
|
<PackageReference Include="Xamarin.Google.Android.Material" Version="1.8.0" />
|
||||||
<PackageReference Include="Xamarin.Google.Dagger" Version="2.41.0.2" />
|
<PackageReference Include="Xamarin.Google.Dagger" Version="2.44.2.1" />
|
||||||
<PackageReference Include="Xamarin.GooglePlayServices.SafetyNet">
|
<PackageReference Include="Xamarin.GooglePlayServices.SafetyNet">
|
||||||
<Version>118.0.1.2</Version>
|
<Version>118.0.1.3</Version>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -160,6 +159,7 @@
|
|||||||
<Compile Include="Constants.cs" />
|
<Compile Include="Constants.cs" />
|
||||||
<Compile Include="Effects\RemoveFontPaddingEffect.cs" />
|
<Compile Include="Effects\RemoveFontPaddingEffect.cs" />
|
||||||
<Compile Include="Services\WatchDeviceService.cs" />
|
<Compile Include="Services\WatchDeviceService.cs" />
|
||||||
|
<Compile Include="Renderers\CustomLabelRenderer.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AndroidAsset Include="Assets\bwi-font.ttf" />
|
<AndroidAsset Include="Assets\bwi-font.ttf" />
|
||||||
@@ -233,6 +233,18 @@
|
|||||||
<SubType></SubType>
|
<SubType></SubType>
|
||||||
<Generator></Generator>
|
<Generator></Generator>
|
||||||
</AndroidResource>
|
</AndroidResource>
|
||||||
|
<AndroidResource Include="Resources\layout\validatable_input_dialog_layout.xml">
|
||||||
|
<SubType></SubType>
|
||||||
|
<Generator></Generator>
|
||||||
|
</AndroidResource>
|
||||||
|
<AndroidResource Include="Resources\drawable\empty_uris_placeholder.xml">
|
||||||
|
<SubType></SubType>
|
||||||
|
<Generator></Generator>
|
||||||
|
</AndroidResource>
|
||||||
|
<AndroidResource Include="Resources\drawable\empty_uris_placeholder_dark.xml">
|
||||||
|
<SubType></SubType>
|
||||||
|
<Generator></Generator>
|
||||||
|
</AndroidResource>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AndroidResource Include="Resources\drawable\splash_screen.xml" />
|
<AndroidResource Include="Resources\drawable\splash_screen.xml" />
|
||||||
|
|||||||
Binary file not shown.
@@ -54,16 +54,15 @@ namespace Bit.Droid.Autofill
|
|||||||
if (HintToFieldsMap.ContainsKey(View.AutofillHintPassword))
|
if (HintToFieldsMap.ContainsKey(View.AutofillHintPassword))
|
||||||
{
|
{
|
||||||
_passwordFields.AddRange(HintToFieldsMap[View.AutofillHintPassword]);
|
_passwordFields.AddRange(HintToFieldsMap[View.AutofillHintPassword]);
|
||||||
|
return _passwordFields;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
_passwordFields = Fields.Where(f => FieldIsPassword(f)).ToList();
|
_passwordFields = Fields.Where(f => FieldIsPassword(f)).ToList();
|
||||||
if (!_passwordFields.Any())
|
if (!_passwordFields.Any())
|
||||||
{
|
{
|
||||||
_passwordFields = Fields.Where(f => FieldHasPasswordTerms(f)).ToList();
|
_passwordFields = Fields.Where(f => FieldHasPasswordTerms(f)).ToList();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return _passwordFields;
|
return _passwordFields;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -87,9 +86,12 @@ namespace Bit.Droid.Autofill
|
|||||||
{
|
{
|
||||||
_usernameFields.AddRange(HintToFieldsMap[View.AutofillHintUsername]);
|
_usernameFields.AddRange(HintToFieldsMap[View.AutofillHintUsername]);
|
||||||
}
|
}
|
||||||
}
|
if (_usernameFields.Any())
|
||||||
else
|
|
||||||
{
|
{
|
||||||
|
return _usernameFields;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var passwordField in PasswordFields)
|
foreach (var passwordField in PasswordFields)
|
||||||
{
|
{
|
||||||
var usernameField = Fields.TakeWhile(f => f.AutofillId != passwordField.AutofillId)
|
var usernameField = Fields.TakeWhile(f => f.AutofillId != passwordField.AutofillId)
|
||||||
@@ -104,7 +106,6 @@ namespace Bit.Droid.Autofill
|
|||||||
{
|
{
|
||||||
_usernameFields = Fields.Where(f => FieldIsUsername(f)).ToList();
|
_usernameFields = Fields.Where(f => FieldIsUsername(f)).ToList();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return _usernameFields;
|
return _usernameFields;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2023.4.1" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2023.7.1" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
|
||||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
|
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.NFC" />
|
<uses-permission android:name="android.permission.NFC" />
|
||||||
|
|||||||
43
src/Android/Renderers/CustomLabelRenderer.cs
Normal file
43
src/Android/Renderers/CustomLabelRenderer.cs
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
using Android.Content;
|
||||||
|
using Android.OS;
|
||||||
|
using Bit.App.Controls;
|
||||||
|
using Bit.Droid.Renderers;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
using Xamarin.Forms.Platform.Android;
|
||||||
|
|
||||||
|
[assembly: ExportRenderer(typeof(CustomLabel), typeof(CustomLabelRenderer))]
|
||||||
|
namespace Bit.Droid.Renderers
|
||||||
|
{
|
||||||
|
public class CustomLabelRenderer : LabelRenderer
|
||||||
|
{
|
||||||
|
public CustomLabelRenderer(Context context)
|
||||||
|
: base(context)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
|
||||||
|
{
|
||||||
|
base.OnElementChanged(e);
|
||||||
|
|
||||||
|
if (Control != null && e.NewElement is CustomLabel label)
|
||||||
|
{
|
||||||
|
if (label.FontWeight.HasValue && Build.VERSION.SdkInt >= BuildVersionCodes.P)
|
||||||
|
{
|
||||||
|
Control.Typeface = Android.Graphics.Typeface.Create(null, label.FontWeight.Value, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
var label = sender as CustomLabel;
|
||||||
|
switch (e.PropertyName)
|
||||||
|
{
|
||||||
|
case nameof(CustomLabel.AutomationId):
|
||||||
|
Control.ContentDescription = label.AutomationId;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
base.OnElementPropertyChanged(sender, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
35
src/Android/Resources/drawable/empty_uris_placeholder.xml
Normal file
35
src/Android/Resources/drawable/empty_uris_placeholder.xml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:viewportWidth="129"
|
||||||
|
android:viewportHeight="124"
|
||||||
|
android:width="129dp"
|
||||||
|
android:height="124dp">
|
||||||
|
<path
|
||||||
|
android:pathData="M126.8227 61.9441A59.6843 59.6843 0 0 1 7.4541 61.9441A59.6843 59.6843 0 0 1 126.8227 61.9441Z"
|
||||||
|
android:fillColor="#F0F0F0"
|
||||||
|
android:strokeColor="#89929F"
|
||||||
|
android:strokeWidth="3" />
|
||||||
|
<path
|
||||||
|
android:pathData="M21.6167 100.851C52.597 103.31 79.6937 80.3264 82.1391 49.5156C83.6205 30.8497 76.0789 14.8844 62.7275 3.63385"
|
||||||
|
android:strokeColor="#89929F"
|
||||||
|
android:strokeWidth="1.5"
|
||||||
|
android:strokeLineCap="round" />
|
||||||
|
<path
|
||||||
|
android:pathData="M14.5633 34.2845C12.2035 66.7711 38.5225 96.3429 72.6666 98.8232C74.2596 98.9389 78.629 98.9975 80.1951 99C84.6245 98.8232 97.8063 96.593 106.813 91.8485C113.439 88.3581 119.745 84.6984 124.644 79.1121"
|
||||||
|
android:strokeColor="#89929F"
|
||||||
|
android:strokeWidth="1.5"
|
||||||
|
android:strokeLineCap="round" />
|
||||||
|
<path
|
||||||
|
android:pathData="M124.502 48.5051C106.554 24.3817 68.8237 21.6709 41.4178 42.0617C24.8146 54.4149 14.7327 72.4183 13.9255 90.1427"
|
||||||
|
android:strokeColor="#89929F"
|
||||||
|
android:strokeWidth="1.5"
|
||||||
|
android:strokeLineCap="round" />
|
||||||
|
<path
|
||||||
|
android:pathData="M83.4034 28.3934A5 5 0 0 1 73.4034 28.3934A5 5 0 0 1 83.4034 28.3934Z"
|
||||||
|
android:fillColor="#89929F" />
|
||||||
|
<path
|
||||||
|
android:pathData="M24.7698 66.5518A5 5 0 0 1 14.7698 66.5518A5 5 0 0 1 24.7698 66.5518Z"
|
||||||
|
android:fillColor="#89929F" />
|
||||||
|
<path
|
||||||
|
android:pathData="M57.344 94.4726A5 5 0 0 1 47.344 94.4726A5 5 0 0 1 57.344 94.4726Z"
|
||||||
|
android:fillColor="#89929F" />
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:viewportWidth="129"
|
||||||
|
android:viewportHeight="124"
|
||||||
|
android:width="129dp"
|
||||||
|
android:height="124dp">
|
||||||
|
<path
|
||||||
|
android:pathData="M126.8227 61.9441A59.6843 59.6843 0 0 1 7.4541 61.9441A59.6843 59.6843 0 0 1 126.8227 61.9441Z"
|
||||||
|
android:fillColor="@android:color/transparent"
|
||||||
|
android:strokeColor="#A3A3A3"
|
||||||
|
android:strokeWidth="3" />
|
||||||
|
<path
|
||||||
|
android:pathData="M21.6167 100.851C52.597 103.31 79.6937 80.3264 82.1391 49.5156C83.6205 30.8497 76.0789 14.8844 62.7275 3.63385"
|
||||||
|
android:strokeColor="#A3A3A3"
|
||||||
|
android:strokeWidth="1.5"
|
||||||
|
android:strokeLineCap="round" />
|
||||||
|
<path
|
||||||
|
android:pathData="M14.5633 34.2845C12.2035 66.7711 38.5225 96.3429 72.6666 98.8232C74.2596 98.9389 78.629 98.9975 80.1951 99C84.6245 98.8232 97.8063 96.593 106.813 91.8485C113.439 88.3581 119.745 84.6984 124.644 79.1121"
|
||||||
|
android:strokeColor="#A3A3A3"
|
||||||
|
android:strokeWidth="1.5"
|
||||||
|
android:strokeLineCap="round" />
|
||||||
|
<path
|
||||||
|
android:pathData="M124.502 48.5051C106.554 24.3817 68.8237 21.6709 41.4178 42.0617C24.8146 54.4149 14.7327 72.4183 13.9255 90.1427"
|
||||||
|
android:strokeColor="#A3A3A3"
|
||||||
|
android:strokeWidth="1.5"
|
||||||
|
android:strokeLineCap="round" />
|
||||||
|
<path
|
||||||
|
android:pathData="M83.4034 28.3934A5 5 0 0 1 73.4034 28.3934A5 5 0 0 1 83.4034 28.3934Z"
|
||||||
|
android:fillColor="#A3A3A3" />
|
||||||
|
<path
|
||||||
|
android:pathData="M24.7698 66.5518A5 5 0 0 1 14.7698 66.5518A5 5 0 0 1 24.7698 66.5518Z"
|
||||||
|
android:fillColor="#A3A3A3" />
|
||||||
|
<path
|
||||||
|
android:pathData="M57.344 94.4726A5 5 0 0 1 47.344 94.4726A5 5 0 0 1 57.344 94.4726Z"
|
||||||
|
android:fillColor="#A3A3A3" />
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingLeft="30dp"
|
||||||
|
android:paddingRight="30dp">
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/lblHeader"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="@dimen/dialog_header_text_size"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:layout_marginBottom="-3dp"
|
||||||
|
android:labelFor="@+id/txtValue"/>
|
||||||
|
<EditText
|
||||||
|
android:id="@id/txtValue"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="@dimen/dialog_input_text_size"/>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/lblValueSubinfo"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="@dimen/dialog_sub_value_info_text_size"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
@@ -2,4 +2,7 @@
|
|||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<dimen name="design_bottom_navigation_text_size" tools:override="true">15sp</dimen>
|
<dimen name="design_bottom_navigation_text_size" tools:override="true">15sp</dimen>
|
||||||
<dimen name="design_bottom_navigation_active_text_size" tools:override="true">15sp</dimen>
|
<dimen name="design_bottom_navigation_active_text_size" tools:override="true">15sp</dimen>
|
||||||
|
<dimen name="dialog_input_text_size">16sp</dimen>
|
||||||
|
<dimen name="dialog_header_text_size">12sp</dimen>
|
||||||
|
<dimen name="dialog_sub_value_info_text_size">12sp</dimen>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -13,12 +13,13 @@ using Android.Views.InputMethods;
|
|||||||
using Android.Widget;
|
using Android.Widget;
|
||||||
using Bit.App.Abstractions;
|
using Bit.App.Abstractions;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
|
using Bit.App.Utilities;
|
||||||
|
using Bit.App.Utilities.Prompts;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Utilities;
|
|
||||||
using Bit.Droid.Utilities;
|
using Bit.Droid.Utilities;
|
||||||
using Plugin.CurrentActivity;
|
using Plugin.CurrentActivity;
|
||||||
using static Bit.App.Pages.SettingsPageViewModel;
|
using Xamarin.Forms.Platform.Android;
|
||||||
|
|
||||||
namespace Bit.Droid.Services
|
namespace Bit.Droid.Services
|
||||||
{
|
{
|
||||||
@@ -209,10 +210,7 @@ namespace Bit.Droid.Services
|
|||||||
}
|
}
|
||||||
if (numericKeyboard)
|
if (numericKeyboard)
|
||||||
{
|
{
|
||||||
input.InputType = InputTypes.ClassNumber | InputTypes.NumberFlagDecimal | InputTypes.NumberFlagSigned;
|
SetNumericKeyboardTo(input);
|
||||||
#pragma warning disable CS0618 // Type or member is obsolete
|
|
||||||
input.KeyListener = DigitsKeyListener.GetInstance(false, false);
|
|
||||||
#pragma warning restore CS0618 // Type or member is obsolete
|
|
||||||
}
|
}
|
||||||
if (password)
|
if (password)
|
||||||
{
|
{
|
||||||
@@ -248,6 +246,83 @@ namespace Bit.Droid.Services
|
|||||||
return result.Task;
|
return result.Task;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task<ValidatablePromptResponse?> DisplayValidatablePromptAsync(ValidatablePromptConfig config)
|
||||||
|
{
|
||||||
|
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
|
||||||
|
if (activity == null)
|
||||||
|
{
|
||||||
|
return Task.FromResult<ValidatablePromptResponse?>(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
var alertBuilder = new AlertDialog.Builder(activity);
|
||||||
|
alertBuilder.SetTitle(config.Title);
|
||||||
|
var view = activity.LayoutInflater.Inflate(Resource.Layout.validatable_input_dialog_layout, null);
|
||||||
|
alertBuilder.SetView(view);
|
||||||
|
|
||||||
|
var result = new TaskCompletionSource<ValidatablePromptResponse?>();
|
||||||
|
|
||||||
|
alertBuilder.SetOnCancelListener(new BasicDialogWithResultCancelListener(result));
|
||||||
|
alertBuilder.SetPositiveButton(config.OkButtonText ?? AppResources.Ok, listener: null);
|
||||||
|
alertBuilder.SetNegativeButton(config.CancelButtonText ?? AppResources.Cancel, (sender, args) => result.TrySetResult(null));
|
||||||
|
if (!string.IsNullOrEmpty(config.ThirdButtonText))
|
||||||
|
{
|
||||||
|
alertBuilder.SetNeutralButton(config.ThirdButtonText, (sender, args) => result.TrySetResult(new ValidatablePromptResponse(null, true)));
|
||||||
|
}
|
||||||
|
|
||||||
|
var alert = alertBuilder.Create();
|
||||||
|
|
||||||
|
var input = view.FindViewById<EditText>(Resource.Id.txtValue);
|
||||||
|
var lblHeader = view.FindViewById<TextView>(Resource.Id.lblHeader);
|
||||||
|
var lblValueSubinfo = view.FindViewById<TextView>(Resource.Id.lblValueSubinfo);
|
||||||
|
|
||||||
|
lblHeader.Text = config.Subtitle;
|
||||||
|
lblValueSubinfo.Text = config.ValueSubInfo;
|
||||||
|
|
||||||
|
var defaultSubInfoColor = lblValueSubinfo.TextColors;
|
||||||
|
|
||||||
|
input.InputType = InputTypes.ClassText;
|
||||||
|
|
||||||
|
if (config.NumericKeyboard)
|
||||||
|
{
|
||||||
|
SetNumericKeyboardTo(input);
|
||||||
|
}
|
||||||
|
|
||||||
|
input.ImeOptions = input.ImeOptions | (ImeAction)ImeFlags.NoPersonalizedLearning | (ImeAction)ImeFlags.NoExtractUi;
|
||||||
|
input.Text = config.Text ?? string.Empty;
|
||||||
|
input.SetSelection(config.Text?.Length ?? 0);
|
||||||
|
input.AfterTextChanged += (sender, args) =>
|
||||||
|
{
|
||||||
|
if (lblValueSubinfo.Text != config.ValueSubInfo)
|
||||||
|
{
|
||||||
|
lblValueSubinfo.Text = config.ValueSubInfo;
|
||||||
|
lblHeader.SetTextColor(defaultSubInfoColor);
|
||||||
|
lblValueSubinfo.SetTextColor(defaultSubInfoColor);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
alert.Window.SetSoftInputMode(SoftInput.StateVisible);
|
||||||
|
alert.Show();
|
||||||
|
|
||||||
|
var positiveButton = alert.GetButton((int)DialogButtonType.Positive);
|
||||||
|
positiveButton.Click += (sender, args) =>
|
||||||
|
{
|
||||||
|
var error = config.ValidateText(input.Text);
|
||||||
|
if (error != null)
|
||||||
|
{
|
||||||
|
lblHeader.SetTextColor(ThemeManager.GetResourceColor("DangerColor").ToAndroid());
|
||||||
|
lblValueSubinfo.SetTextColor(ThemeManager.GetResourceColor("DangerColor").ToAndroid());
|
||||||
|
lblValueSubinfo.Text = error;
|
||||||
|
lblValueSubinfo.SendAccessibilityEvent(Android.Views.Accessibility.EventTypes.ViewFocused);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
result.TrySetResult(new ValidatablePromptResponse(input.Text, false));
|
||||||
|
alert.Dismiss();
|
||||||
|
};
|
||||||
|
|
||||||
|
return result.Task;
|
||||||
|
}
|
||||||
|
|
||||||
public void RateApp()
|
public void RateApp()
|
||||||
{
|
{
|
||||||
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
|
var activity = (MainActivity)CrossCurrentActivity.Current.Activity;
|
||||||
@@ -525,5 +600,29 @@ namespace Bit.Droid.Services
|
|||||||
// only used by iOS
|
// only used by iOS
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetNumericKeyboardTo(EditText editText)
|
||||||
|
{
|
||||||
|
editText.InputType = InputTypes.ClassNumber | InputTypes.NumberFlagDecimal | InputTypes.NumberFlagSigned;
|
||||||
|
#pragma warning disable CS0618 // Type or member is obsolete
|
||||||
|
editText.KeyListener = DigitsKeyListener.GetInstance(false, false);
|
||||||
|
#pragma warning restore CS0618 // Type or member is obsolete
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class BasicDialogWithResultCancelListener : Java.Lang.Object, IDialogInterfaceOnCancelListener
|
||||||
|
{
|
||||||
|
private readonly TaskCompletionSource<ValidatablePromptResponse?> _taskCompletionSource;
|
||||||
|
|
||||||
|
public BasicDialogWithResultCancelListener(TaskCompletionSource<ValidatablePromptResponse?> taskCompletionSource)
|
||||||
|
{
|
||||||
|
_taskCompletionSource = taskCompletionSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCancel(IDialogInterface dialog)
|
||||||
|
{
|
||||||
|
_taskCompletionSource?.TrySetResult(null);
|
||||||
|
dialog?.Dismiss();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using Android.Content;
|
using Android.Content;
|
||||||
using Android.OS;
|
using Android.OS;
|
||||||
|
using Java.Lang;
|
||||||
|
|
||||||
namespace Bit.Droid.Utilities
|
namespace Bit.Droid.Utilities
|
||||||
{
|
{
|
||||||
@@ -13,7 +14,12 @@ namespace Bit.Droid.Utilities
|
|||||||
// Note: getting the bundle like this will cause to call unparcel() internally
|
// Note: getting the bundle like this will cause to call unparcel() internally
|
||||||
var b = intent?.Extras?.GetBundle("trashstringwhichhasnousebuttocheckunparcel");
|
var b = intent?.Extras?.GetBundle("trashstringwhichhasnousebuttocheckunparcel");
|
||||||
}
|
}
|
||||||
catch (BadParcelableException)
|
catch (Exception ex) when
|
||||||
|
(
|
||||||
|
ex is BadParcelableException ||
|
||||||
|
ex is ClassNotFoundException ||
|
||||||
|
ex is RuntimeException
|
||||||
|
)
|
||||||
{
|
{
|
||||||
intent.ReplaceExtras((Bundle)null);
|
intent.ReplaceExtras((Bundle)null);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Bit.App.Utilities.Prompts;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models;
|
using Bit.Core.Models;
|
||||||
|
|
||||||
@@ -18,6 +19,7 @@ namespace Bit.App.Abstractions
|
|||||||
Task<string> DisplayPromptAync(string title = null, string description = null, string text = null,
|
Task<string> DisplayPromptAync(string title = null, string description = null, string text = null,
|
||||||
string okButtonText = null, string cancelButtonText = null, bool numericKeyboard = false,
|
string okButtonText = null, string cancelButtonText = null, bool numericKeyboard = false,
|
||||||
bool autofocus = true, bool password = false);
|
bool autofocus = true, bool password = false);
|
||||||
|
Task<ValidatablePromptResponse?> DisplayValidatablePromptAsync(ValidatablePromptConfig config);
|
||||||
Task<string> DisplayAlertAsync(string title, string message, string cancel, params string[] buttons);
|
Task<string> DisplayAlertAsync(string title, string message, string cancel, params string[] buttons);
|
||||||
Task<string> DisplayActionSheetAsync(string title, string cancel, string destruction, params string[] buttons);
|
Task<string> DisplayActionSheetAsync(string title, string cancel, string destruction, params string[] buttons);
|
||||||
|
|
||||||
|
|||||||
@@ -14,11 +14,11 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Plugin.Fingerprint" Version="2.1.5" />
|
<PackageReference Include="Plugin.Fingerprint" Version="2.1.5" />
|
||||||
<PackageReference Include="SkiaSharp.Views.Forms" Version="2.88.2" />
|
<PackageReference Include="SkiaSharp.Views.Forms" Version="2.88.3" />
|
||||||
<PackageReference Include="Xamarin.CommunityToolkit" Version="2.0.5" />
|
<PackageReference Include="Xamarin.CommunityToolkit" Version="2.0.6" />
|
||||||
<PackageReference Include="Xamarin.Essentials" Version="1.7.3" />
|
<PackageReference Include="Xamarin.Essentials" Version="1.7.5" />
|
||||||
<PackageReference Include="Xamarin.FFImageLoading.Forms" Version="2.4.11.982" />
|
<PackageReference Include="Xamarin.FFImageLoading.Forms" Version="2.4.11.982" />
|
||||||
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2515" />
|
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2578" />
|
||||||
<PackageReference Include="ZXing.Net.Mobile" Version="2.4.1" />
|
<PackageReference Include="ZXing.Net.Mobile" Version="2.4.1" />
|
||||||
<PackageReference Include="ZXing.Net.Mobile.Forms" Version="2.4.1" />
|
<PackageReference Include="ZXing.Net.Mobile.Forms" Version="2.4.1" />
|
||||||
<PackageReference Include="MessagePack" Version="2.4.59" />
|
<PackageReference Include="MessagePack" Version="2.4.59" />
|
||||||
@@ -145,6 +145,8 @@
|
|||||||
<Folder Include="Controls\DateTime\" />
|
<Folder Include="Controls\DateTime\" />
|
||||||
<Folder Include="Controls\IconLabelButton\" />
|
<Folder Include="Controls\IconLabelButton\" />
|
||||||
<Folder Include="Controls\PasswordStrengthProgressBar\" />
|
<Folder Include="Controls\PasswordStrengthProgressBar\" />
|
||||||
|
<Folder Include="Utilities\Automation\" />
|
||||||
|
<Folder Include="Utilities\Prompts\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -440,5 +442,7 @@
|
|||||||
<None Remove="MessagePack" />
|
<None Remove="MessagePack" />
|
||||||
<None Remove="MessagePack.MSBuild.Tasks" />
|
<None Remove="MessagePack.MSBuild.Tasks" />
|
||||||
<None Remove="Controls\PasswordStrengthProgressBar\" />
|
<None Remove="Controls\PasswordStrengthProgressBar\" />
|
||||||
|
<None Remove="Utilities\Automation\" />
|
||||||
|
<None Remove="Utilities\Prompts\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -18,12 +18,6 @@ using Bit.Core.Utilities;
|
|||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
using Xamarin.Forms.Xaml;
|
using Xamarin.Forms.Xaml;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
|
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
|
||||||
namespace Bit.App
|
namespace Bit.App
|
||||||
{
|
{
|
||||||
@@ -44,6 +38,7 @@ namespace Bit.App
|
|||||||
private readonly IFileService _fileService;
|
private readonly IFileService _fileService;
|
||||||
private readonly IAccountsManager _accountsManager;
|
private readonly IAccountsManager _accountsManager;
|
||||||
private readonly IPushNotificationService _pushNotificationService;
|
private readonly IPushNotificationService _pushNotificationService;
|
||||||
|
private readonly IConfigService _configService;
|
||||||
private static bool _isResumed;
|
private static bool _isResumed;
|
||||||
// these variables are static because the app is launching new activities on notification click, creating new instances of App.
|
// these variables are static because the app is launching new activities on notification click, creating new instances of App.
|
||||||
private static bool _pendingCheckPasswordlessLoginRequests;
|
private static bool _pendingCheckPasswordlessLoginRequests;
|
||||||
@@ -67,6 +62,7 @@ namespace Bit.App
|
|||||||
_fileService = ServiceContainer.Resolve<IFileService>();
|
_fileService = ServiceContainer.Resolve<IFileService>();
|
||||||
_accountsManager = ServiceContainer.Resolve<IAccountsManager>("accountsManager");
|
_accountsManager = ServiceContainer.Resolve<IAccountsManager>("accountsManager");
|
||||||
_pushNotificationService = ServiceContainer.Resolve<IPushNotificationService>();
|
_pushNotificationService = ServiceContainer.Resolve<IPushNotificationService>();
|
||||||
|
_configService = ServiceContainer.Resolve<IConfigService>();
|
||||||
|
|
||||||
_accountsManager.Init(() => Options, this);
|
_accountsManager.Init(() => Options, this);
|
||||||
|
|
||||||
@@ -175,6 +171,10 @@ namespace Bit.App
|
|||||||
new NavigationPage(new UpdateTempPasswordPage()));
|
new NavigationPage(new UpdateTempPasswordPage()));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else if (message.Command == "syncCompleted")
|
||||||
|
{
|
||||||
|
await _configService.GetAsync(true);
|
||||||
|
}
|
||||||
else if (message.Command == Constants.PasswordlessLoginRequestKey
|
else if (message.Command == Constants.PasswordlessLoginRequestKey
|
||||||
|| message.Command == "unlocked"
|
|| message.Command == "unlocked"
|
||||||
|| message.Command == AccountsManagerMessageCommands.ACCOUNT_SWITCH_COMPLETED)
|
|| message.Command == AccountsManagerMessageCommands.ACCOUNT_SWITCH_COMPLETED)
|
||||||
@@ -299,6 +299,8 @@ namespace Bit.App
|
|||||||
// Reset delay on every start
|
// Reset delay on every start
|
||||||
_vaultTimeoutService.DelayLockAndLogoutMs = null;
|
_vaultTimeoutService.DelayLockAndLogoutMs = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await _configService.GetAsync();
|
||||||
_messagingService.Send("startEventTimer");
|
_messagingService.Send("startEventTimer");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,13 +30,15 @@
|
|||||||
BackgroundColor="{DynamicResource BackgroundColor}"
|
BackgroundColor="{DynamicResource BackgroundColor}"
|
||||||
VerticalOptions="Start"
|
VerticalOptions="Start"
|
||||||
RowHeight="{Binding AccountListRowHeight, Source={x:Reference _mainOverlay}}"
|
RowHeight="{Binding AccountListRowHeight, Source={x:Reference _mainOverlay}}"
|
||||||
effects:ScrollViewContentInsetAdjustmentBehaviorEffect.ContentInsetAdjustmentBehavior="Never">
|
effects:ScrollViewContentInsetAdjustmentBehaviorEffect.ContentInsetAdjustmentBehavior="Never"
|
||||||
|
AutomationId="AccountListView">
|
||||||
<ListView.ItemTemplate>
|
<ListView.ItemTemplate>
|
||||||
<DataTemplate x:DataType="view:AccountView">
|
<DataTemplate x:DataType="view:AccountView">
|
||||||
<controls:AccountViewCell
|
<controls:AccountViewCell
|
||||||
Account="{Binding .}"
|
Account="{Binding .}"
|
||||||
SelectAccountCommand="{Binding SelectAccountCommand, Source={x:Reference _mainOverlay}}"
|
SelectAccountCommand="{Binding SelectAccountCommand, Source={x:Reference _mainOverlay}}"
|
||||||
LongPressAccountCommand="{Binding LongPressAccountCommand, Source={x:Reference _mainOverlay}}"
|
LongPressAccountCommand="{Binding LongPressAccountCommand, Source={x:Reference _mainOverlay}}"
|
||||||
|
AutomationId="AccountViewCell"
|
||||||
/>
|
/>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ListView.ItemTemplate>
|
</ListView.ItemTemplate>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<ViewCell xmlns="http://xamarin.com/schemas/2014/forms"
|
<ViewCell xmlns="http://xamarin.com/schemas/2014/forms"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
|
xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
|
||||||
@@ -60,20 +60,23 @@
|
|||||||
Text="{Binding AccountView.Email}"
|
Text="{Binding AccountView.Email}"
|
||||||
IsVisible="{Binding IsActive}"
|
IsVisible="{Binding IsActive}"
|
||||||
StyleClass="accountlist-title, accountlist-title-platform"
|
StyleClass="accountlist-title, accountlist-title-platform"
|
||||||
LineBreakMode="TailTruncation" />
|
LineBreakMode="TailTruncation"
|
||||||
|
AutomationId="AccountEmailLabel" />
|
||||||
<Label
|
<Label
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Text="{Binding AccountView.Email}"
|
Text="{Binding AccountView.Email}"
|
||||||
IsVisible="{Binding IsActive, Converter={StaticResource inverseBool}}"
|
IsVisible="{Binding IsActive, Converter={StaticResource inverseBool}}"
|
||||||
StyleClass="accountlist-title, accountlist-title-platform"
|
StyleClass="accountlist-title, accountlist-title-platform"
|
||||||
TextColor="{DynamicResource MutedColor}"
|
TextColor="{DynamicResource MutedColor}"
|
||||||
LineBreakMode="TailTruncation" />
|
LineBreakMode="TailTruncation"
|
||||||
|
AutomationId="AccountEmailLabel" />
|
||||||
<Label
|
<Label
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
IsVisible="{Binding ShowHostname}"
|
IsVisible="{Binding ShowHostname}"
|
||||||
Text="{Binding AccountView.Hostname}"
|
Text="{Binding AccountView.Hostname}"
|
||||||
StyleClass="accountlist-sub, accountlist-sub-platform"
|
StyleClass="accountlist-sub, accountlist-sub-platform"
|
||||||
LineBreakMode="TailTruncation" />
|
LineBreakMode="TailTruncation"
|
||||||
|
AutomationId="AccountHostUrlLabel" />
|
||||||
<Label
|
<Label
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Text="{u:I18n AccountUnlocked}"
|
Text="{u:I18n AccountUnlocked}"
|
||||||
@@ -81,7 +84,8 @@
|
|||||||
StyleClass="accountlist-sub, accountlist-sub-platform"
|
StyleClass="accountlist-sub, accountlist-sub-platform"
|
||||||
FontAttributes="Italic"
|
FontAttributes="Italic"
|
||||||
TextTransform="Lowercase"
|
TextTransform="Lowercase"
|
||||||
LineBreakMode="TailTruncation" />
|
LineBreakMode="TailTruncation"
|
||||||
|
AutomationId="AccountStatusLabel" />
|
||||||
<Label
|
<Label
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Text="{u:I18n AccountLocked}"
|
Text="{u:I18n AccountLocked}"
|
||||||
@@ -89,7 +93,8 @@
|
|||||||
StyleClass="accountlist-sub, accountlist-sub-platform"
|
StyleClass="accountlist-sub, accountlist-sub-platform"
|
||||||
FontAttributes="Italic"
|
FontAttributes="Italic"
|
||||||
TextTransform="Lowercase"
|
TextTransform="Lowercase"
|
||||||
LineBreakMode="TailTruncation" />
|
LineBreakMode="TailTruncation"
|
||||||
|
AutomationId="AccountStatusLabel" />
|
||||||
<Label
|
<Label
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Text="{u:I18n AccountLoggedOut}"
|
Text="{u:I18n AccountLoggedOut}"
|
||||||
@@ -97,7 +102,8 @@
|
|||||||
StyleClass="accountlist-sub, accountlist-sub-platform"
|
StyleClass="accountlist-sub, accountlist-sub-platform"
|
||||||
FontAttributes="Italic"
|
FontAttributes="Italic"
|
||||||
TextTransform="Lowercase"
|
TextTransform="Lowercase"
|
||||||
LineBreakMode="TailTruncation" />
|
LineBreakMode="TailTruncation"
|
||||||
|
AutomationId="AccountStatusLabel" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<controls:IconLabel
|
<controls:IconLabel
|
||||||
@@ -107,7 +113,8 @@
|
|||||||
Margin="12,0"
|
Margin="12,0"
|
||||||
HorizontalOptions="Center"
|
HorizontalOptions="Center"
|
||||||
VerticalOptions="Center"
|
VerticalOptions="Center"
|
||||||
StyleClass="list-icon, list-icon-platform" />
|
StyleClass="list-icon, list-icon-platform"
|
||||||
|
AutomationId="InactiveVaultIcon" />
|
||||||
<controls:IconLabel
|
<controls:IconLabel
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Text="{Binding AuthStatusIconActive}"
|
Text="{Binding AuthStatusIconActive}"
|
||||||
@@ -116,7 +123,8 @@
|
|||||||
HorizontalOptions="Center"
|
HorizontalOptions="Center"
|
||||||
VerticalOptions="Center"
|
VerticalOptions="Center"
|
||||||
StyleClass="list-icon, list-icon-platform"
|
StyleClass="list-icon, list-icon-platform"
|
||||||
TextColor="{DynamicResource TextColor}"/>
|
TextColor="{DynamicResource TextColor}"
|
||||||
|
AutomationId="ActiveVaultIcon" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<Grid
|
<Grid
|
||||||
@@ -147,7 +155,8 @@
|
|||||||
StyleClass="accountlist-title, accountlist-title-platform"
|
StyleClass="accountlist-title, accountlist-title-platform"
|
||||||
LineBreakMode="TailTruncation"
|
LineBreakMode="TailTruncation"
|
||||||
VerticalOptions="Center"
|
VerticalOptions="Center"
|
||||||
Grid.Column="1" />
|
Grid.Column="1"
|
||||||
|
AutomationId="AddAccountButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
</ViewCell>
|
</ViewCell>
|
||||||
@@ -9,7 +9,8 @@
|
|||||||
StyleClass="list-row, list-row-platform"
|
StyleClass="list-row, list-row-platform"
|
||||||
RowSpacing="0"
|
RowSpacing="0"
|
||||||
ColumnSpacing="0"
|
ColumnSpacing="0"
|
||||||
x:DataType="controls:CipherViewCellViewModel">
|
x:DataType="controls:CipherViewCellViewModel"
|
||||||
|
AutomationId="CipherCell">
|
||||||
|
|
||||||
<Grid.Resources>
|
<Grid.Resources>
|
||||||
<u:IconGlyphConverter x:Key="iconGlyphConverter"/>
|
<u:IconGlyphConverter x:Key="iconGlyphConverter"/>
|
||||||
@@ -36,7 +37,8 @@
|
|||||||
IsVisible="{Binding ShowIconImage, Converter={StaticResource inverseBool}}"
|
IsVisible="{Binding ShowIconImage, Converter={StaticResource inverseBool}}"
|
||||||
Text="{Binding Cipher, Converter={StaticResource iconGlyphConverter}}"
|
Text="{Binding Cipher, Converter={StaticResource iconGlyphConverter}}"
|
||||||
ShouldUpdateFontSizeDynamicallyForAccesibility="True"
|
ShouldUpdateFontSizeDynamicallyForAccesibility="True"
|
||||||
AutomationProperties.IsInAccessibleTree="False" />
|
AutomationProperties.IsInAccessibleTree="False"
|
||||||
|
AutomationId="CipherTypeIcon" />
|
||||||
|
|
||||||
<ff:CachedImage
|
<ff:CachedImage
|
||||||
x:Name="_iconImage"
|
x:Name="_iconImage"
|
||||||
@@ -52,7 +54,8 @@
|
|||||||
Aspect="AspectFit"
|
Aspect="AspectFit"
|
||||||
IsVisible="{Binding ShowIconImage}"
|
IsVisible="{Binding ShowIconImage}"
|
||||||
Source="{Binding IconImageSource, Mode=OneTime}"
|
Source="{Binding IconImageSource, Mode=OneTime}"
|
||||||
AutomationProperties.IsInAccessibleTree="False" />
|
AutomationProperties.IsInAccessibleTree="False"
|
||||||
|
AutomationId="CipherWebsiteIcon" />
|
||||||
|
|
||||||
<Grid RowSpacing="0" ColumnSpacing="0" Grid.Row="0" Grid.Column="1" VerticalOptions="Center" Padding="0, 7">
|
<Grid RowSpacing="0" ColumnSpacing="0" Grid.Row="0" Grid.Column="1" VerticalOptions="Center" Padding="0, 7">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
@@ -71,7 +74,8 @@
|
|||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
StyleClass="list-title, list-title-platform"
|
StyleClass="list-title, list-title-platform"
|
||||||
Text="{Binding Cipher.Name}" />
|
Text="{Binding Cipher.Name}"
|
||||||
|
AutomationId="CipherNameLabel" />
|
||||||
<Label
|
<Label
|
||||||
LineBreakMode="TailTruncation"
|
LineBreakMode="TailTruncation"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
@@ -80,7 +84,8 @@
|
|||||||
StyleClass="list-subtitle, list-subtitle-platform"
|
StyleClass="list-subtitle, list-subtitle-platform"
|
||||||
Text="{Binding Cipher.SubTitle}"
|
Text="{Binding Cipher.SubTitle}"
|
||||||
IsVisible="{Binding Source={RelativeSource Self}, Path=Text,
|
IsVisible="{Binding Source={RelativeSource Self}, Path=Text,
|
||||||
Converter={StaticResource stringHasValueConverter}}"/>
|
Converter={StaticResource stringHasValueConverter}}"
|
||||||
|
AutomationId="CipherSubTitleLabel" />
|
||||||
<controls:IconLabel
|
<controls:IconLabel
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
@@ -91,7 +96,8 @@
|
|||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Collection}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Collection}}"
|
||||||
IsVisible="{Binding Cipher.Shared, Mode=OneTime}"
|
IsVisible="{Binding Cipher.Shared, Mode=OneTime}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Shared}" />
|
AutomationProperties.Name="{u:I18n Shared}"
|
||||||
|
AutomationId="CipherInCollectionIcon" />
|
||||||
<controls:IconLabel
|
<controls:IconLabel
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
@@ -102,7 +108,8 @@
|
|||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Paperclip}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Paperclip}}"
|
||||||
IsVisible="{Binding Cipher.HasAttachments, Mode=OneTime}"
|
IsVisible="{Binding Cipher.HasAttachments, Mode=OneTime}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Attachments}" />
|
AutomationProperties.Name="{u:I18n Attachments}"
|
||||||
|
AutomationId="CipherWithAttachmentsIcon" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<controls:MiButton
|
<controls:MiButton
|
||||||
@@ -114,6 +121,7 @@
|
|||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
HorizontalOptions="EndAndExpand"
|
HorizontalOptions="EndAndExpand"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Options}" />
|
AutomationProperties.Name="{u:I18n Options}"
|
||||||
|
AutomationId="CipherOptionsButton" />
|
||||||
|
|
||||||
</controls:ExtendedGrid>
|
</controls:ExtendedGrid>
|
||||||
@@ -31,7 +31,7 @@ namespace Bit.App.Controls
|
|||||||
public bool ShowIconImage
|
public bool ShowIconImage
|
||||||
{
|
{
|
||||||
get => WebsiteIconsEnabled
|
get => WebsiteIconsEnabled
|
||||||
&& !string.IsNullOrWhiteSpace(Cipher.Login?.Uri)
|
&& !string.IsNullOrWhiteSpace(Cipher.LaunchUri)
|
||||||
&& IconImageSource != null;
|
&& IconImageSource != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ namespace Bit.App.Controls
|
|||||||
{
|
{
|
||||||
if (_iconImageSource == string.Empty) // default value since icon source can return null
|
if (_iconImageSource == string.Empty) // default value since icon source can return null
|
||||||
{
|
{
|
||||||
_iconImageSource = IconImageHelper.GetLoginIconImage(Cipher);
|
_iconImageSource = IconImageHelper.GetIconImage(Cipher);
|
||||||
}
|
}
|
||||||
return _iconImageSource;
|
return _iconImageSource;
|
||||||
}
|
}
|
||||||
|
|||||||
13
src/App/Controls/CustomLabel.cs
Normal file
13
src/App/Controls/CustomLabel.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Bit.App.Controls
|
||||||
|
{
|
||||||
|
public class CustomLabel : Label
|
||||||
|
{
|
||||||
|
public CustomLabel()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public int? FontWeight { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<controls:ExtendedGrid xmlns="http://xamarin.com/schemas/2014/forms"
|
<controls:ExtendedGrid xmlns="http://xamarin.com/schemas/2014/forms"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
x:Class="Bit.App.Controls.SendViewCell"
|
x:Class="Bit.App.Controls.SendViewCell"
|
||||||
@@ -54,14 +54,16 @@
|
|||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
StyleClass="list-title, list-title-platform"
|
StyleClass="list-title, list-title-platform"
|
||||||
Text="{Binding Send.Name}" />
|
Text="{Binding Send.Name}"
|
||||||
|
AutomationId="SendNameLabel" />
|
||||||
<Label
|
<Label
|
||||||
LineBreakMode="TailTruncation"
|
LineBreakMode="TailTruncation"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.ColumnSpan="6"
|
Grid.ColumnSpan="6"
|
||||||
StyleClass="list-subtitle, list-subtitle-platform"
|
StyleClass="list-subtitle, list-subtitle-platform"
|
||||||
Text="{Binding Send.DisplayDate}" />
|
Text="{Binding Send.DisplayDate}"
|
||||||
|
AutomationId="SendDateLabel" />
|
||||||
<controls:IconLabel
|
<controls:IconLabel
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
@@ -72,7 +74,8 @@
|
|||||||
Text="{Binding Source={x:Static core:BitwardenIcons.ExclamationTriangle}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.ExclamationTriangle}}"
|
||||||
IsVisible="{Binding Send.Disabled, Mode=OneTime}"
|
IsVisible="{Binding Send.Disabled, Mode=OneTime}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Disabled}" />
|
AutomationProperties.Name="{u:I18n Disabled}"
|
||||||
|
AutomationId="DisabledSendLabel" />
|
||||||
<controls:IconLabel
|
<controls:IconLabel
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
@@ -83,7 +86,8 @@
|
|||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Key}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Key}}"
|
||||||
IsVisible="{Binding Send.HasPassword, Mode=OneTime}"
|
IsVisible="{Binding Send.HasPassword, Mode=OneTime}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Password}" />
|
AutomationProperties.Name="{u:I18n Password}"
|
||||||
|
AutomationId="PasswordProtectedSendLabel" />
|
||||||
<controls:IconLabel
|
<controls:IconLabel
|
||||||
Grid.Column="3"
|
Grid.Column="3"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
@@ -94,7 +98,8 @@
|
|||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Ban}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Ban}}"
|
||||||
IsVisible="{Binding Send.MaxAccessCountReached, Mode=OneTime}"
|
IsVisible="{Binding Send.MaxAccessCountReached, Mode=OneTime}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n MaxAccessCountReached}" />
|
AutomationProperties.Name="{u:I18n MaxAccessCountReached}"
|
||||||
|
AutomationId="SendMaxAccessCountReachedLabel" />
|
||||||
<controls:IconLabel
|
<controls:IconLabel
|
||||||
Grid.Column="4"
|
Grid.Column="4"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
@@ -105,7 +110,8 @@
|
|||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Clock}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Clock}}"
|
||||||
IsVisible="{Binding Send.Expired, Mode=OneTime}"
|
IsVisible="{Binding Send.Expired, Mode=OneTime}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Expired}" />
|
AutomationProperties.Name="{u:I18n Expired}"
|
||||||
|
AutomationId="ExpiredSendLabel" />
|
||||||
<controls:IconLabel
|
<controls:IconLabel
|
||||||
Grid.Column="5"
|
Grid.Column="5"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
@@ -116,7 +122,8 @@
|
|||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Trash}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Trash}}"
|
||||||
IsVisible="{Binding Send.PendingDelete, Mode=OneTime}"
|
IsVisible="{Binding Send.PendingDelete, Mode=OneTime}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n PendingDelete}" />
|
AutomationProperties.Name="{u:I18n PendingDelete}"
|
||||||
|
AutomationId="SendWithPendingDeletionLabel" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<controls:MiButton
|
<controls:MiButton
|
||||||
@@ -129,6 +136,7 @@
|
|||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
HorizontalOptions="EndAndExpand"
|
HorizontalOptions="EndAndExpand"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Options}" />
|
AutomationProperties.Name="{u:I18n Options}"
|
||||||
|
AutomationId="SendOptionsButton" />
|
||||||
|
|
||||||
</controls:ExtendedGrid>
|
</controls:ExtendedGrid>
|
||||||
|
|||||||
@@ -33,7 +33,8 @@
|
|||||||
StyleClass="box-label"
|
StyleClass="box-label"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" />
|
IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}"
|
||||||
|
AutomationId="BooleanCustomFieldNameLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Field.Name, Mode=OneWay}"
|
Text="{Binding Field.Name, Mode=OneWay}"
|
||||||
IsVisible="{Binding IsEditing}"
|
IsVisible="{Binding IsEditing}"
|
||||||
@@ -49,13 +50,15 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="0, 5, 0, 0"
|
Margin="0, 5, 0, 0"
|
||||||
IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" />
|
IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}"
|
||||||
|
AutomationId="BooleanCustomFieldValueLabel" />
|
||||||
<Switch
|
<Switch
|
||||||
IsToggled="{Binding BooleanValue}"
|
IsToggled="{Binding BooleanValue}"
|
||||||
IsVisible="{Binding IsEditing}"
|
IsVisible="{Binding IsEditing}"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2" />
|
Grid.RowSpan="2"
|
||||||
|
AutomationId="BooleanCustomFieldValueToggle" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Cog}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Cog}}"
|
||||||
|
|||||||
@@ -31,7 +31,8 @@
|
|||||||
Text="{Binding Field.Name, Mode=OneWay}"
|
Text="{Binding Field.Name, Mode=OneWay}"
|
||||||
StyleClass="box-label"
|
StyleClass="box-label"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="HiddenCustomFieldNameLabel" />
|
||||||
<StackLayout
|
<StackLayout
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
@@ -39,7 +40,8 @@
|
|||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
Text="{Binding ValueText, Mode=OneWay}"
|
Text="{Binding ValueText, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
IsVisible="{Binding ShowHiddenValue}" />
|
IsVisible="{Binding ShowHiddenValue}"
|
||||||
|
AutomationId="HiddenCustomFieldValueLabel" />
|
||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
Text="{Binding Field.MaskedValue, Mode=OneWay}"
|
Text="{Binding Field.MaskedValue, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
@@ -54,7 +56,10 @@
|
|||||||
IsPassword="{Binding ShowHiddenValue, Converter={StaticResource inverseBool}}"
|
IsPassword="{Binding ShowHiddenValue, Converter={StaticResource inverseBool}}"
|
||||||
IsEnabled="{Binding ShowViewHidden}"
|
IsEnabled="{Binding ShowViewHidden}"
|
||||||
IsSpellCheckEnabled="False"
|
IsSpellCheckEnabled="False"
|
||||||
IsTextPredictionEnabled="False">
|
IsTextPredictionEnabled="False"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{Binding Field.Name}"
|
||||||
|
AutomationId="HiddenCustomFieldValueEntry">
|
||||||
<Entry.Keyboard>
|
<Entry.Keyboard>
|
||||||
<Keyboard x:FactoryMethod="Create">
|
<Keyboard x:FactoryMethod="Create">
|
||||||
<x:Arguments>
|
<x:Arguments>
|
||||||
@@ -72,7 +77,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}" />
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
|
AutomationId="HiddenCustomFieldShowValueButton" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
||||||
|
|||||||
@@ -29,13 +29,15 @@
|
|||||||
Text="{Binding Field.Name, Mode=OneWay}"
|
Text="{Binding Field.Name, Mode=OneWay}"
|
||||||
StyleClass="box-label"
|
StyleClass="box-label"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="LinkedCustomFieldNameLabel" />
|
||||||
<controls:IconLabel
|
<controls:IconLabel
|
||||||
Text="{Binding ValueText, Mode=OneWay}"
|
Text="{Binding ValueText, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" />
|
IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}"
|
||||||
|
AutomationId="LinkedCustomFieldValueLabel" />
|
||||||
<StackLayout
|
<StackLayout
|
||||||
StyleClass="box-row, box-row-input"
|
StyleClass="box-row, box-row-input"
|
||||||
IsVisible="{Binding IsEditing}">
|
IsVisible="{Binding IsEditing}">
|
||||||
@@ -44,7 +46,8 @@
|
|||||||
ItemsSource="{Binding LinkedFieldOptions, Mode=OneTime}"
|
ItemsSource="{Binding LinkedFieldOptions, Mode=OneTime}"
|
||||||
SelectedIndex="{Binding LinkedFieldOptionSelectedIndex}"
|
SelectedIndex="{Binding LinkedFieldOptionSelectedIndex}"
|
||||||
ItemDisplayBinding="{Binding Key}"
|
ItemDisplayBinding="{Binding Key}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="LinkedCustomFieldValuePicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
@@ -55,7 +58,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Options}" />
|
AutomationProperties.Name="{u:I18n Options}"
|
||||||
|
AutomationId="LinkedCustomFieldOptionsButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<BoxView StyleClass="box-row-separator" IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" />
|
<BoxView StyleClass="box-row-separator" IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
|
|||||||
@@ -29,19 +29,24 @@
|
|||||||
Text="{Binding Field.Name, Mode=OneWay}"
|
Text="{Binding Field.Name, Mode=OneWay}"
|
||||||
StyleClass="box-label"
|
StyleClass="box-label"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="TextCustomFieldNameLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding ValueText, Mode=OneWay}"
|
Text="{Binding ValueText, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" />
|
IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}"
|
||||||
|
AutomationId="TextCustomFieldValueLabel" />
|
||||||
<Entry
|
<Entry
|
||||||
Text="{Binding Field.Value}"
|
Text="{Binding Field.Value}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
IsVisible="{Binding IsEditing}" />
|
IsVisible="{Binding IsEditing}"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{Binding Field.Name}"
|
||||||
|
AutomationId="TextCustomFieldValueEntry" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
||||||
@@ -51,7 +56,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Copy}" />
|
AutomationProperties.Name="{u:I18n Copy}"
|
||||||
|
AutomationId="TextCustomFieldCopyValue" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Cog}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Cog}}"
|
||||||
@@ -61,7 +67,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Options}" />
|
AutomationProperties.Name="{u:I18n Options}"
|
||||||
|
AutomationId="TextCustomFieldOptionsButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<BoxView StyleClass="box-row-separator" IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" />
|
<BoxView StyleClass="box-row-separator" IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
|
|||||||
@@ -34,7 +34,8 @@
|
|||||||
Placeholder="ex. https://bitwarden.company.com"
|
Placeholder="ex. https://bitwarden.company.com"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
ReturnType="Go"
|
ReturnType="Go"
|
||||||
ReturnCommand="{Binding SubmitCommand}" />
|
ReturnCommand="{Binding SubmitCommand}"
|
||||||
|
AutomationId="ServerUrlEntry"/>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n SelfHostedEnvironmentFooter}"
|
Text="{u:I18n SelfHostedEnvironmentFooter}"
|
||||||
@@ -53,7 +54,8 @@
|
|||||||
x:Name="_webVaultEntry"
|
x:Name="_webVaultEntry"
|
||||||
Text="{Binding WebVaultUrl}"
|
Text="{Binding WebVaultUrl}"
|
||||||
Keyboard="Url"
|
Keyboard="Url"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="WebVaultUrlEntry"/>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row">
|
<StackLayout StyleClass="box-row">
|
||||||
<Label
|
<Label
|
||||||
@@ -63,7 +65,8 @@
|
|||||||
x:Name="_apiEntry"
|
x:Name="_apiEntry"
|
||||||
Text="{Binding ApiUrl}"
|
Text="{Binding ApiUrl}"
|
||||||
Keyboard="Url"
|
Keyboard="Url"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ApiUrlEntry"/>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row">
|
<StackLayout StyleClass="box-row">
|
||||||
<Label
|
<Label
|
||||||
@@ -73,7 +76,8 @@
|
|||||||
x:Name="_identityEntry"
|
x:Name="_identityEntry"
|
||||||
Text="{Binding IdentityUrl}"
|
Text="{Binding IdentityUrl}"
|
||||||
Keyboard="Url"
|
Keyboard="Url"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="IdentityUrlEntry"/>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row">
|
<StackLayout StyleClass="box-row">
|
||||||
<Label
|
<Label
|
||||||
@@ -85,7 +89,8 @@
|
|||||||
Keyboard="Url"
|
Keyboard="Url"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
ReturnType="Go"
|
ReturnType="Go"
|
||||||
ReturnCommand="{Binding SubmitCommand}" />
|
ReturnCommand="{Binding SubmitCommand}"
|
||||||
|
AutomationId="IconsUrlEntry"/>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n CustomEnvironmentFooter}"
|
Text="{u:I18n CustomEnvironmentFooter}"
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using System.Threading.Tasks;
|
|||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
|
using Bit.Core.Models.Data;
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
using Xamarin.CommunityToolkit.ObjectModel;
|
using Xamarin.CommunityToolkit.ObjectModel;
|
||||||
|
|
||||||
@@ -18,7 +19,8 @@ namespace Bit.App.Pages
|
|||||||
_environmentService = ServiceContainer.Resolve<IEnvironmentService>("environmentService");
|
_environmentService = ServiceContainer.Resolve<IEnvironmentService>("environmentService");
|
||||||
|
|
||||||
PageTitle = AppResources.Settings;
|
PageTitle = AppResources.Settings;
|
||||||
BaseUrl = _environmentService.BaseUrl;
|
BaseUrl = _environmentService.BaseUrl == EnvironmentUrlData.DefaultEU.Base || EnvironmentUrlData.DefaultUS.Base == _environmentService.BaseUrl ?
|
||||||
|
string.Empty : _environmentService.BaseUrl;
|
||||||
WebVaultUrl = _environmentService.WebVaultUrl;
|
WebVaultUrl = _environmentService.WebVaultUrl;
|
||||||
ApiUrl = _environmentService.ApiUrl;
|
ApiUrl = _environmentService.ApiUrl;
|
||||||
IdentityUrl = _environmentService.IdentityUrl;
|
IdentityUrl = _environmentService.IdentityUrl;
|
||||||
|
|||||||
@@ -23,12 +23,9 @@
|
|||||||
Priority="-1"
|
Priority="-1"
|
||||||
UseOriginalImage="True"
|
UseOriginalImage="True"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Account}" />
|
AutomationProperties.Name="{u:I18n Account}"
|
||||||
|
AutomationId="AccountIconButton" />
|
||||||
<ToolbarItem x:Name="_closeButton" Text="{u:I18n Close}" Command="{Binding CloseCommand}" Order="Primary" Priority="-1"/>
|
<ToolbarItem x:Name="_closeButton" Text="{u:I18n Close}" Command="{Binding CloseCommand}" Order="Primary" Priority="-1"/>
|
||||||
<ToolbarItem
|
|
||||||
Icon="cog_environment.png" Clicked="Environment_Clicked" Order="Primary"
|
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
|
||||||
AutomationProperties.Name="{u:I18n Options}" />
|
|
||||||
</ContentPage.ToolbarItems>
|
</ContentPage.ToolbarItems>
|
||||||
|
|
||||||
<ContentPage.Resources>
|
<ContentPage.Resources>
|
||||||
@@ -53,7 +50,9 @@
|
|||||||
Keyboard="Email"
|
Keyboard="Email"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
ReturnType="Go"
|
ReturnType="Go"
|
||||||
ReturnCommand="{Binding ContinueCommand}">
|
ReturnCommand="{Binding ContinueCommand}"
|
||||||
|
AutomationId="EmailAddressEntry"
|
||||||
|
>
|
||||||
<VisualStateManager.VisualStateGroups>
|
<VisualStateManager.VisualStateGroups>
|
||||||
<VisualStateGroup x:Name="CommonStates">
|
<VisualStateGroup x:Name="CommonStates">
|
||||||
<VisualState x:Name="Disabled">
|
<VisualState x:Name="Disabled">
|
||||||
@@ -66,7 +65,28 @@
|
|||||||
</Entry>
|
</Entry>
|
||||||
<StackLayout
|
<StackLayout
|
||||||
Orientation="Horizontal"
|
Orientation="Horizontal"
|
||||||
Margin="0, 16, 0 ,0">
|
Margin="0, 6, 0 ,0">
|
||||||
|
<StackLayout.GestureRecognizers>
|
||||||
|
<TapGestureRecognizer
|
||||||
|
Command="{Binding ShowEnvironmentPickerCommand}" />
|
||||||
|
</StackLayout.GestureRecognizers>
|
||||||
|
<Label
|
||||||
|
Text="{Binding RegionText}"
|
||||||
|
FontSize="13"
|
||||||
|
TextColor="{DynamicResource MutedColor}"
|
||||||
|
VerticalOptions="Center"
|
||||||
|
VerticalTextAlignment="Center"/>
|
||||||
|
<controls:IconLabel
|
||||||
|
Text="{Binding SelectedEnvironmentName}"
|
||||||
|
FontSize="13"
|
||||||
|
TextColor="{DynamicResource PrimaryColor}"
|
||||||
|
VerticalOptions="Center"
|
||||||
|
VerticalTextAlignment="Center"
|
||||||
|
AutomationId="RegionSelectorDropdown"/>
|
||||||
|
</StackLayout>
|
||||||
|
<StackLayout
|
||||||
|
Orientation="Horizontal"
|
||||||
|
Margin="0, 20, 0 ,0">
|
||||||
<StackLayout.GestureRecognizers>
|
<StackLayout.GestureRecognizers>
|
||||||
<TapGestureRecognizer
|
<TapGestureRecognizer
|
||||||
Command="{Binding RememberEmailCommand}" />
|
Command="{Binding RememberEmailCommand}" />
|
||||||
@@ -76,21 +96,27 @@
|
|||||||
StyleClass="text-sm"
|
StyleClass="text-sm"
|
||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
VerticalOptions="Center"
|
VerticalOptions="Center"
|
||||||
VerticalTextAlignment="Center"/>
|
VerticalTextAlignment="Center"
|
||||||
|
/>
|
||||||
<Switch
|
<Switch
|
||||||
Scale="0.8"
|
Scale="0.8"
|
||||||
IsToggled="{Binding RememberEmail}"
|
IsToggled="{Binding RememberEmail}"
|
||||||
VerticalOptions="Center"/>
|
VerticalOptions="Center"
|
||||||
|
AutomationId="RememberMeSwitch"
|
||||||
|
/>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Button Text="{u:I18n Continue}"
|
<Button Text="{u:I18n Continue}"
|
||||||
StyleClass="btn-primary"
|
StyleClass="btn-primary"
|
||||||
IsEnabled="{Binding CanContinue}"
|
IsEnabled="{Binding CanContinue}"
|
||||||
Command="{Binding ContinueCommand}" />
|
Command="{Binding ContinueCommand}"
|
||||||
|
AutomationId="ContinueButton"
|
||||||
|
/>
|
||||||
|
|
||||||
<Label FormattedText="{Binding CreateAccountText}"
|
<Label FormattedText="{Binding CreateAccountText}"
|
||||||
Margin="0, 10"
|
Margin="0, 10"
|
||||||
StyleClass="box-footer-label">
|
StyleClass="box-footer-label"
|
||||||
|
AutomationId="CreateAccountLabel">
|
||||||
<Label.GestureRecognizers>
|
<Label.GestureRecognizers>
|
||||||
<TapGestureRecognizer Command="{Binding CreateAccountCommand}" />
|
<TapGestureRecognizer Command="{Binding CreateAccountCommand}" />
|
||||||
</Label.GestureRecognizers>
|
</Label.GestureRecognizers>
|
||||||
@@ -116,5 +142,4 @@
|
|||||||
MainPage="{Binding Source={x:Reference _page}}"
|
MainPage="{Binding Source={x:Reference _page}}"
|
||||||
BindingContext="{Binding AccountSwitchingOverlayViewModel}"/>
|
BindingContext="{Binding AccountSwitchingOverlayViewModel}"/>
|
||||||
</AbsoluteLayout>
|
</AbsoluteLayout>
|
||||||
|
|
||||||
</pages:BaseContentPage>
|
</pages:BaseContentPage>
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ namespace Bit.App.Pages
|
|||||||
private readonly AppOptions _appOptions;
|
private readonly AppOptions _appOptions;
|
||||||
private IBroadcasterService _broadcasterService;
|
private IBroadcasterService _broadcasterService;
|
||||||
|
|
||||||
|
readonly LazyResolve<ILogger> _logger = new LazyResolve<ILogger>();
|
||||||
|
|
||||||
public HomePage(AppOptions appOptions = null)
|
public HomePage(AppOptions appOptions = null)
|
||||||
{
|
{
|
||||||
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
|
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
|
||||||
@@ -70,6 +72,14 @@ namespace Bit.App.Pages
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await _vm.UpdateEnvironment();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.Value?.Exception(ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool OnBackButtonPressed()
|
protected override bool OnBackButtonPressed()
|
||||||
@@ -128,14 +138,6 @@ namespace Bit.App.Pages
|
|||||||
await Navigation.PushModalAsync(new NavigationPage(page));
|
await Navigation.PushModalAsync(new NavigationPage(page));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Environment_Clicked(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (DoOnce())
|
|
||||||
{
|
|
||||||
_vm.StartEnvironmentAction();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task StartEnvironmentAsync()
|
private async Task StartEnvironmentAsync()
|
||||||
{
|
{
|
||||||
await _accountListOverlay.HideAsync();
|
await _accountListOverlay.HideAsync();
|
||||||
|
|||||||
@@ -4,7 +4,10 @@ using Bit.App.Abstractions;
|
|||||||
using Bit.App.Controls;
|
using Bit.App.Controls;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
using Bit.App.Utilities;
|
using Bit.App.Utilities;
|
||||||
|
using Bit.Core;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
|
using Bit.Core.Models.Data;
|
||||||
|
using Bit.Core.Models.Response;
|
||||||
using Bit.Core.Services;
|
using Bit.Core.Services;
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
using Xamarin.CommunityToolkit.ObjectModel;
|
using Xamarin.CommunityToolkit.ObjectModel;
|
||||||
@@ -17,16 +20,19 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
private readonly IStateService _stateService;
|
private readonly IStateService _stateService;
|
||||||
private readonly IMessagingService _messagingService;
|
private readonly IMessagingService _messagingService;
|
||||||
|
private readonly IPlatformUtilsService _platformUtilsService;
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
private readonly IEnvironmentService _environmentService;
|
||||||
|
private readonly IAccountsManager _accountManager;
|
||||||
|
private readonly IConfigService _configService;
|
||||||
|
|
||||||
private bool _showCancelButton;
|
private bool _showCancelButton;
|
||||||
private bool _rememberEmail;
|
private bool _rememberEmail;
|
||||||
private string _email;
|
private string _email;
|
||||||
|
private string _selectedEnvironmentName;
|
||||||
private bool _isEmailEnabled;
|
private bool _isEmailEnabled;
|
||||||
private bool _canLogin;
|
private bool _canLogin;
|
||||||
private IPlatformUtilsService _platformUtilsService;
|
private bool _displayEuEnvironment;
|
||||||
private ILogger _logger;
|
|
||||||
private IEnvironmentService _environmentService;
|
|
||||||
private IAccountsManager _accountManager;
|
|
||||||
|
|
||||||
public HomeViewModel()
|
public HomeViewModel()
|
||||||
{
|
{
|
||||||
@@ -36,6 +42,7 @@ namespace Bit.App.Pages
|
|||||||
_logger = ServiceContainer.Resolve<ILogger>();
|
_logger = ServiceContainer.Resolve<ILogger>();
|
||||||
_environmentService = ServiceContainer.Resolve<IEnvironmentService>();
|
_environmentService = ServiceContainer.Resolve<IEnvironmentService>();
|
||||||
_accountManager = ServiceContainer.Resolve<IAccountsManager>();
|
_accountManager = ServiceContainer.Resolve<IAccountsManager>();
|
||||||
|
_configService = ServiceContainer.Resolve<IConfigService>();
|
||||||
|
|
||||||
PageTitle = AppResources.Bitwarden;
|
PageTitle = AppResources.Bitwarden;
|
||||||
|
|
||||||
@@ -49,6 +56,8 @@ namespace Bit.App.Pages
|
|||||||
onException: _logger.Exception, allowsMultipleExecutions: false);
|
onException: _logger.Exception, allowsMultipleExecutions: false);
|
||||||
CloseCommand = new AsyncCommand(async () => await Device.InvokeOnMainThreadAsync(CloseAction),
|
CloseCommand = new AsyncCommand(async () => await Device.InvokeOnMainThreadAsync(CloseAction),
|
||||||
onException: _logger.Exception, allowsMultipleExecutions: false);
|
onException: _logger.Exception, allowsMultipleExecutions: false);
|
||||||
|
ShowEnvironmentPickerCommand = new AsyncCommand(ShowEnvironmentPickerAsync,
|
||||||
|
onException: _logger.Exception, allowsMultipleExecutions: false);
|
||||||
InitAsync().FireAndForget();
|
InitAsync().FireAndForget();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,6 +80,13 @@ namespace Bit.App.Pages
|
|||||||
additionalPropertyNames: new[] { nameof(CanContinue) });
|
additionalPropertyNames: new[] { nameof(CanContinue) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string SelectedEnvironmentName
|
||||||
|
{
|
||||||
|
get => $"{_selectedEnvironmentName} {BitwardenIcons.AngleDown}";
|
||||||
|
set => SetProperty(ref _selectedEnvironmentName, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string RegionText => $"{AppResources.Region}:";
|
||||||
public bool CanContinue => !string.IsNullOrEmpty(Email);
|
public bool CanContinue => !string.IsNullOrEmpty(Email);
|
||||||
|
|
||||||
public FormattedString CreateAccountText
|
public FormattedString CreateAccountText
|
||||||
@@ -101,11 +117,13 @@ namespace Bit.App.Pages
|
|||||||
public AsyncCommand ContinueCommand { get; }
|
public AsyncCommand ContinueCommand { get; }
|
||||||
public AsyncCommand CloseCommand { get; }
|
public AsyncCommand CloseCommand { get; }
|
||||||
public AsyncCommand CreateAccountCommand { get; }
|
public AsyncCommand CreateAccountCommand { get; }
|
||||||
|
public AsyncCommand ShowEnvironmentPickerCommand { get; }
|
||||||
|
|
||||||
public async Task InitAsync()
|
public async Task InitAsync()
|
||||||
{
|
{
|
||||||
Email = await _stateService.GetRememberedEmailAsync();
|
Email = await _stateService.GetRememberedEmailAsync();
|
||||||
RememberEmail = !string.IsNullOrEmpty(Email);
|
RememberEmail = !string.IsNullOrEmpty(Email);
|
||||||
|
_displayEuEnvironment = await _configService.GetFeatureFlagBoolAsync(Constants.DisplayEuEnvironmentFlag, forceRefresh: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task ContinueToLoginStepAsync()
|
public async Task ContinueToLoginStepAsync()
|
||||||
@@ -144,5 +162,59 @@ namespace Bit.App.Pages
|
|||||||
await _platformUtilsService.ShowDialogAsync(AppResources.GenericErrorMessage, AppResources.AnErrorHasOccurred, AppResources.Ok);
|
await _platformUtilsService.ShowDialogAsync(AppResources.GenericErrorMessage, AppResources.AnErrorHasOccurred, AppResources.Ok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task ShowEnvironmentPickerAsync()
|
||||||
|
{
|
||||||
|
_displayEuEnvironment = await _configService.GetFeatureFlagBoolAsync(Constants.DisplayEuEnvironmentFlag);
|
||||||
|
var options = _displayEuEnvironment
|
||||||
|
? new string[] { AppResources.US, AppResources.EU, AppResources.SelfHosted }
|
||||||
|
: new string[] { AppResources.US, AppResources.SelfHosted };
|
||||||
|
|
||||||
|
await Device.InvokeOnMainThreadAsync(async () =>
|
||||||
|
{
|
||||||
|
var result = await Page.DisplayActionSheet(AppResources.DataRegion, AppResources.Cancel, null, options);
|
||||||
|
|
||||||
|
if (result is null || result == AppResources.Cancel)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result == AppResources.SelfHosted)
|
||||||
|
{
|
||||||
|
StartEnvironmentAction?.Invoke();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await _environmentService.SetUrlsAsync(result == AppResources.EU ? EnvironmentUrlData.DefaultEU : EnvironmentUrlData.DefaultUS);
|
||||||
|
await _configService.GetAsync(true);
|
||||||
|
SelectedEnvironmentName = result;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateEnvironment()
|
||||||
|
{
|
||||||
|
var environmentsSaved = await _stateService.GetPreAuthEnvironmentUrlsAsync();
|
||||||
|
if (environmentsSaved == null || environmentsSaved.IsEmpty)
|
||||||
|
{
|
||||||
|
await _environmentService.SetUrlsAsync(EnvironmentUrlData.DefaultUS);
|
||||||
|
environmentsSaved = EnvironmentUrlData.DefaultUS;
|
||||||
|
SelectedEnvironmentName = AppResources.US;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (environmentsSaved.Base == EnvironmentUrlData.DefaultUS.Base)
|
||||||
|
{
|
||||||
|
SelectedEnvironmentName = AppResources.US;
|
||||||
|
}
|
||||||
|
else if (environmentsSaved.Base == EnvironmentUrlData.DefaultEU.Base)
|
||||||
|
{
|
||||||
|
SelectedEnvironmentName = AppResources.EU;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _configService.GetAsync(true);
|
||||||
|
SelectedEnvironmentName = AppResources.SelfHosted;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,8 @@
|
|||||||
Priority="-1"
|
Priority="-1"
|
||||||
UseOriginalImage="True"
|
UseOriginalImage="True"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Account}" />
|
AutomationProperties.Name="{u:I18n Account}"
|
||||||
|
AutomationId="AccountIconButton" />
|
||||||
</ContentPage.ToolbarItems>
|
</ContentPage.ToolbarItems>
|
||||||
|
|
||||||
<ContentPage.Resources>
|
<ContentPage.Resources>
|
||||||
@@ -71,7 +72,8 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
ReturnType="Go"
|
ReturnType="Go"
|
||||||
ReturnCommand="{Binding SubmitCommand}" />
|
ReturnCommand="{Binding SubmitCommand}"
|
||||||
|
AutomationId="PinEntry" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding ShowPasswordIcon}"
|
Text="{Binding ShowPasswordIcon}"
|
||||||
@@ -81,7 +83,8 @@
|
|||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"/>
|
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
|
||||||
|
AutomationId="PinVisibilityToggle" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid
|
<Grid
|
||||||
x:Name="_passwordGrid"
|
x:Name="_passwordGrid"
|
||||||
@@ -111,7 +114,8 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
ReturnType="Go"
|
ReturnType="Go"
|
||||||
ReturnCommand="{Binding SubmitCommand}" />
|
ReturnCommand="{Binding SubmitCommand}"
|
||||||
|
AutomationId="MasterPasswordEntry" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding ShowPasswordIcon}"
|
Text="{Binding ShowPasswordIcon}"
|
||||||
@@ -121,7 +125,9 @@
|
|||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}" />
|
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
|
||||||
|
AutomationId="PasswordVisibilityToggle"
|
||||||
|
/>
|
||||||
</Grid>
|
</Grid>
|
||||||
<StackLayout
|
<StackLayout
|
||||||
StyleClass="box-row"
|
StyleClass="box-row"
|
||||||
@@ -147,7 +153,8 @@
|
|||||||
x:Name="_unlockButton"
|
x:Name="_unlockButton"
|
||||||
Text="{u:I18n Unlock}"
|
Text="{u:I18n Unlock}"
|
||||||
StyleClass="btn-primary"
|
StyleClass="btn-primary"
|
||||||
Clicked="Unlock_Clicked" />
|
Clicked="Unlock_Clicked"
|
||||||
|
AutomationId="UnlockVaultButton" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|||||||
@@ -9,23 +9,23 @@
|
|||||||
xmlns:u="clr-namespace:Bit.App.Utilities"
|
xmlns:u="clr-namespace:Bit.App.Utilities"
|
||||||
x:DataType="pages:LoginPageViewModel"
|
x:DataType="pages:LoginPageViewModel"
|
||||||
x:Name="_page"
|
x:Name="_page"
|
||||||
Title="{Binding PageTitle}">
|
Title="{Binding PageTitle}"
|
||||||
|
AutomationId="PageTitleLabel">
|
||||||
|
|
||||||
<ContentPage.BindingContext>
|
<ContentPage.BindingContext>
|
||||||
<pages:LoginPageViewModel />
|
<pages:LoginPageViewModel />
|
||||||
</ContentPage.BindingContext>
|
</ContentPage.BindingContext>
|
||||||
|
|
||||||
<ContentPage.ToolbarItems>
|
<ContentPage.ToolbarItems>
|
||||||
<controls:ExtendedToolbarItem
|
<controls:ExtendedToolbarItem
|
||||||
x:Name="_accountAvatar"
|
x:Name="_accountAvatar"
|
||||||
x:Key="accountAvatar"
|
|
||||||
IconImageSource="{Binding AvatarImageSource}"
|
IconImageSource="{Binding AvatarImageSource}"
|
||||||
Command="{Binding Source={x:Reference _accountListOverlay}, Path=ToggleVisibililtyCommand}"
|
Command="{Binding Source={x:Reference _accountListOverlay}, Path=ToggleVisibililtyCommand}"
|
||||||
Order="Primary"
|
Order="Primary"
|
||||||
Priority="-1"
|
Priority="-1"
|
||||||
UseOriginalImage="True"
|
UseOriginalImage="True"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Account}" />
|
AutomationProperties.Name="{u:I18n Account}"
|
||||||
|
AutomationId="AccountIconButton" />
|
||||||
</ContentPage.ToolbarItems>
|
</ContentPage.ToolbarItems>
|
||||||
|
|
||||||
<ContentPage.Resources>
|
<ContentPage.Resources>
|
||||||
@@ -34,7 +34,8 @@
|
|||||||
<ToolbarItem Icon="more_vert.png" Clicked="More_Clicked" Order="Primary"
|
<ToolbarItem Icon="more_vert.png" Clicked="More_Clicked" Order="Primary"
|
||||||
x:Name="_moreItem" x:Key="moreItem"
|
x:Name="_moreItem" x:Key="moreItem"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Options}" />
|
AutomationProperties.Name="{u:I18n Options}"
|
||||||
|
AutomationId="OptionsButton" />
|
||||||
<ToolbarItem Text="{u:I18n GetPasswordHint}"
|
<ToolbarItem Text="{u:I18n GetPasswordHint}"
|
||||||
x:Key="getPasswordHint"
|
x:Key="getPasswordHint"
|
||||||
x:Name="_getPasswordHint"
|
x:Name="_getPasswordHint"
|
||||||
@@ -75,7 +76,9 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
ReturnType="Go"
|
ReturnType="Go"
|
||||||
ReturnCommand="{Binding LogInCommand}" />
|
ReturnCommand="{Binding LogInCommand}"
|
||||||
|
AutomationId="MasterPasswordEntry"
|
||||||
|
/>
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding ShowPasswordIcon}"
|
Text="{Binding ShowPasswordIcon}"
|
||||||
@@ -84,6 +87,7 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="1"
|
Grid.RowSpan="1"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationId="PasswordVisibilityToggle"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"/>
|
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"/>
|
||||||
<Label
|
<Label
|
||||||
@@ -93,7 +97,9 @@
|
|||||||
Padding="0,5,0,0"
|
Padding="0,5,0,0"
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Grid.ColumnSpan="2">
|
Grid.ColumnSpan="2"
|
||||||
|
AutomationId="GetMasterPasswordHintLabel"
|
||||||
|
>
|
||||||
<Label.GestureRecognizers>
|
<Label.GestureRecognizers>
|
||||||
<TapGestureRecognizer Tapped="Hint_Clicked" />
|
<TapGestureRecognizer Tapped="Hint_Clicked" />
|
||||||
</Label.GestureRecognizers>
|
</Label.GestureRecognizers>
|
||||||
@@ -104,19 +110,24 @@
|
|||||||
<Button x:Name="_loginWithMasterPassword"
|
<Button x:Name="_loginWithMasterPassword"
|
||||||
Text="{u:I18n LogInWithMasterPassword}"
|
Text="{u:I18n LogInWithMasterPassword}"
|
||||||
StyleClass="btn-primary"
|
StyleClass="btn-primary"
|
||||||
Clicked="LogIn_Clicked" />
|
Clicked="LogIn_Clicked"
|
||||||
|
AutomationId="LogInWithMasterPasswordButton"
|
||||||
|
/>
|
||||||
<controls:IconLabelButton
|
<controls:IconLabelButton
|
||||||
HorizontalOptions="Fill"
|
HorizontalOptions="Fill"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
Icon="{Binding Source={x:Static core:BitwardenIcons.Device}}"
|
Icon="{Binding Source={x:Static core:BitwardenIcons.Device}}"
|
||||||
Label="{u:I18n LogInWithAnotherDevice}"
|
Label="{u:I18n LogInWithAnotherDevice}"
|
||||||
ButtonCommand="{Binding LogInWithDeviceCommand}"
|
ButtonCommand="{Binding LogInWithDeviceCommand}"
|
||||||
IsVisible="{Binding IsKnownDevice}"/>
|
IsVisible="{Binding IsKnownDevice}"
|
||||||
|
AutomationId="LogInWithAnotherDeviceButton"
|
||||||
|
/>
|
||||||
<controls:IconLabelButton
|
<controls:IconLabelButton
|
||||||
HorizontalOptions="Fill"
|
HorizontalOptions="Fill"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
Icon="{Binding Source={x:Static core:BitwardenIcons.Suitcase}}"
|
Icon="{Binding Source={x:Static core:BitwardenIcons.Suitcase}}"
|
||||||
Label="{u:I18n LogInSso}">
|
Label="{u:I18n LogInSso}"
|
||||||
|
AutomationId="LogInWithSsoButton">
|
||||||
<controls:IconLabelButton.GestureRecognizers>
|
<controls:IconLabelButton.GestureRecognizers>
|
||||||
<TapGestureRecognizer Tapped="LogInSSO_Clicked" />
|
<TapGestureRecognizer Tapped="LogInSSO_Clicked" />
|
||||||
</controls:IconLabelButton.GestureRecognizers>
|
</controls:IconLabelButton.GestureRecognizers>
|
||||||
@@ -124,12 +135,15 @@
|
|||||||
<Label
|
<Label
|
||||||
Text="{Binding LoggingInAsText}"
|
Text="{Binding LoggingInAsText}"
|
||||||
StyleClass="text-sm"
|
StyleClass="text-sm"
|
||||||
Margin="0,40,0,0"/>
|
Margin="0,40,0,0"
|
||||||
|
AutomationId="LoggingInAsLabel"
|
||||||
|
/>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n NotYou}"
|
Text="{u:I18n NotYou}"
|
||||||
StyleClass="text-md"
|
StyleClass="text-md"
|
||||||
HorizontalOptions="Start"
|
HorizontalOptions="Start"
|
||||||
TextColor="{DynamicResource HyperlinkColor}">
|
TextColor="{DynamicResource HyperlinkColor}"
|
||||||
|
AutomationId="NotYouLabel">
|
||||||
<Label.GestureRecognizers>
|
<Label.GestureRecognizers>
|
||||||
<TapGestureRecognizer Tapped="Cancel_Clicked" />
|
<TapGestureRecognizer Tapped="Cancel_Clicked" />
|
||||||
</Label.GestureRecognizers>
|
</Label.GestureRecognizers>
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ namespace Bit.App.Pages
|
|||||||
private bool _isEmailEnabled;
|
private bool _isEmailEnabled;
|
||||||
private bool _isKnownDevice;
|
private bool _isKnownDevice;
|
||||||
private bool _isExecutingLogin;
|
private bool _isExecutingLogin;
|
||||||
|
private string _environmentHostName;
|
||||||
|
|
||||||
public LoginPageViewModel()
|
public LoginPageViewModel()
|
||||||
{
|
{
|
||||||
@@ -115,6 +116,16 @@ namespace Bit.App.Pages
|
|||||||
set => SetProperty(ref _isKnownDevice, value);
|
set => SetProperty(ref _isKnownDevice, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string EnvironmentDomainName
|
||||||
|
{
|
||||||
|
get => _environmentHostName;
|
||||||
|
set => SetProperty(ref _environmentHostName, value,
|
||||||
|
additionalPropertyNames: new string[]
|
||||||
|
{
|
||||||
|
nameof(LoggingInAsText)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public AccountSwitchingOverlayViewModel AccountSwitchingOverlayViewModel { get; }
|
public AccountSwitchingOverlayViewModel AccountSwitchingOverlayViewModel { get; }
|
||||||
public Command LogInCommand { get; }
|
public Command LogInCommand { get; }
|
||||||
public Command TogglePasswordCommand { get; }
|
public Command TogglePasswordCommand { get; }
|
||||||
@@ -122,7 +133,7 @@ namespace Bit.App.Pages
|
|||||||
public ICommand LogInWithDeviceCommand { get; }
|
public ICommand LogInWithDeviceCommand { get; }
|
||||||
public string ShowPasswordIcon => ShowPassword ? BitwardenIcons.EyeSlash : BitwardenIcons.Eye;
|
public string ShowPasswordIcon => ShowPassword ? BitwardenIcons.EyeSlash : BitwardenIcons.Eye;
|
||||||
public string PasswordVisibilityAccessibilityText => ShowPassword ? AppResources.PasswordIsVisibleTapToHide : AppResources.PasswordIsNotVisibleTapToShow;
|
public string PasswordVisibilityAccessibilityText => ShowPassword ? AppResources.PasswordIsVisibleTapToHide : AppResources.PasswordIsNotVisibleTapToShow;
|
||||||
public string LoggingInAsText => string.Format(AppResources.LoggingInAsX, Email);
|
public string LoggingInAsText => string.Format(AppResources.LoggingInAsXOnY, Email, EnvironmentDomainName);
|
||||||
public bool IsIosExtension { get; set; }
|
public bool IsIosExtension { get; set; }
|
||||||
public bool CanRemoveAccount { get; set; }
|
public bool CanRemoveAccount { get; set; }
|
||||||
public Action StartTwoFactorAction { get; set; }
|
public Action StartTwoFactorAction { get; set; }
|
||||||
@@ -151,6 +162,7 @@ namespace Bit.App.Pages
|
|||||||
Email = await _stateService.GetRememberedEmailAsync();
|
Email = await _stateService.GetRememberedEmailAsync();
|
||||||
}
|
}
|
||||||
CanRemoveAccount = await _stateService.GetActiveUserEmailAsync() != Email;
|
CanRemoveAccount = await _stateService.GetActiveUserEmailAsync() != Email;
|
||||||
|
EnvironmentDomainName = CoreHelpers.GetDomain((await _stateService.GetPreAuthEnvironmentUrlsAsync())?.Base);
|
||||||
IsKnownDevice = await _apiService.GetKnownDeviceAsync(Email, await _appIdService.GetAppIdAsync());
|
IsKnownDevice = await _apiService.GetKnownDeviceAsync(Email, await _appIdService.GetAppIdAsync());
|
||||||
}
|
}
|
||||||
catch (ApiException apiEx) when (apiEx.Error.StatusCode == System.Net.HttpStatusCode.Unauthorized)
|
catch (ApiException apiEx) when (apiEx.Error.StatusCode == System.Net.HttpStatusCode.Unauthorized)
|
||||||
|
|||||||
@@ -32,7 +32,8 @@
|
|||||||
<Label
|
<Label
|
||||||
Text="{Binding LogInAttemptByLabel}"
|
Text="{Binding LogInAttemptByLabel}"
|
||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
Margin="0,0,0,24"/>
|
Margin="0,0,0,24"
|
||||||
|
AutomationId="LogInAttemptByLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n FingerprintPhrase}"
|
Text="{u:I18n FingerprintPhrase}"
|
||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
@@ -41,7 +42,8 @@
|
|||||||
FormattedText="{Binding LoginRequest.FingerprintPhrase}"
|
FormattedText="{Binding LoginRequest.FingerprintPhrase}"
|
||||||
FontSize="Medium"
|
FontSize="Medium"
|
||||||
TextColor="{DynamicResource FingerprintPhrase}"
|
TextColor="{DynamicResource FingerprintPhrase}"
|
||||||
Margin="0,0,0,27"/>
|
Margin="0,0,0,27"
|
||||||
|
AutomationId="FingerprintValueLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n DeviceType}"
|
Text="{u:I18n DeviceType}"
|
||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
@@ -49,7 +51,8 @@
|
|||||||
<Label
|
<Label
|
||||||
Text="{Binding LoginRequest.DeviceType}"
|
Text="{Binding LoginRequest.DeviceType}"
|
||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
Margin="0,0,0,21"/>
|
Margin="0,0,0,21"
|
||||||
|
AutomationId="DeviceTypeValueLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n IpAddress}"
|
Text="{u:I18n IpAddress}"
|
||||||
IsVisible="{Binding ShowIpAddress}"
|
IsVisible="{Binding ShowIpAddress}"
|
||||||
@@ -59,7 +62,8 @@
|
|||||||
Text="{Binding LoginRequest.IpAddress}"
|
Text="{Binding LoginRequest.IpAddress}"
|
||||||
IsVisible="{Binding ShowIpAddress}"
|
IsVisible="{Binding ShowIpAddress}"
|
||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
Margin="0,0,0,21"/>
|
Margin="0,0,0,21"
|
||||||
|
AutomationId="IpAddressValueLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n Time}"
|
Text="{u:I18n Time}"
|
||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
@@ -67,7 +71,8 @@
|
|||||||
<Label
|
<Label
|
||||||
Text="{Binding TimeOfRequestText}"
|
Text="{Binding TimeOfRequestText}"
|
||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
Margin="0,0,0,57"/>
|
Margin="0,0,0,57"
|
||||||
|
AutomationId="TimeOfRequestValueLabel" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
@@ -75,11 +80,13 @@
|
|||||||
Text="{u:I18n ConfirmLogIn}"
|
Text="{u:I18n ConfirmLogIn}"
|
||||||
Command="{Binding AcceptRequestCommand}"
|
Command="{Binding AcceptRequestCommand}"
|
||||||
Margin="0,0,0,17"
|
Margin="0,0,0,17"
|
||||||
StyleClass="btn-primary"/>
|
StyleClass="btn-primary"
|
||||||
|
AutomationId="ConfirmLoginButton" />
|
||||||
<Button
|
<Button
|
||||||
Text="{u:I18n DenyLogIn}"
|
Text="{u:I18n DenyLogIn}"
|
||||||
Command="{Binding RejectRequestCommand}"
|
Command="{Binding RejectRequestCommand}"
|
||||||
StyleClass="btn-secundary"/>
|
StyleClass="btn-secundary"
|
||||||
|
AutomationId="DenyLoginButton" />
|
||||||
|
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</pages:BaseContentPage>
|
</pages:BaseContentPage>
|
||||||
|
|||||||
@@ -24,7 +24,8 @@
|
|||||||
Text="{u:I18n LogInInitiated}"
|
Text="{u:I18n LogInInitiated}"
|
||||||
FontSize="Title"
|
FontSize="Title"
|
||||||
FontAttributes="Bold"
|
FontAttributes="Bold"
|
||||||
Margin="0,14,0,21"/>
|
Margin="0,14,0,21"
|
||||||
|
AutomationId="LogInInitiatedLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n ANotificationHasBeenSentToYourDevice}"
|
Text="{u:I18n ANotificationHasBeenSentToYourDevice}"
|
||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
@@ -40,13 +41,15 @@
|
|||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
FormattedText="{Binding FingerprintPhrase}"
|
FormattedText="{Binding FingerprintPhrase}"
|
||||||
FontSize="Medium"
|
FontSize="Medium"
|
||||||
TextColor="{DynamicResource FingerprintPhrase}"/>
|
TextColor="{DynamicResource FingerprintPhrase}"
|
||||||
|
AutomationId="FingerprintPhraseValue" />
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n ResendNotification}"
|
Text="{u:I18n ResendNotification}"
|
||||||
StyleClass="text-md"
|
StyleClass="text-md"
|
||||||
HorizontalOptions="Start"
|
HorizontalOptions="Start"
|
||||||
Margin="0,40,0,0"
|
Margin="0,40,0,0"
|
||||||
TextColor="{DynamicResource HyperlinkColor}">
|
TextColor="{DynamicResource HyperlinkColor}"
|
||||||
|
AutomationId="ResendNotificationButton">
|
||||||
<Label.GestureRecognizers>
|
<Label.GestureRecognizers>
|
||||||
<TapGestureRecognizer Command="{Binding CreatePasswordlessLoginCommand}" />
|
<TapGestureRecognizer Command="{Binding CreatePasswordlessLoginCommand}" />
|
||||||
</Label.GestureRecognizers>
|
</Label.GestureRecognizers>
|
||||||
@@ -64,7 +67,8 @@
|
|||||||
VerticalTextAlignment="End"
|
VerticalTextAlignment="End"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
Margin="5, 0"
|
Margin="5, 0"
|
||||||
TextColor="{DynamicResource HyperlinkColor}">
|
TextColor="{DynamicResource HyperlinkColor}"
|
||||||
|
AutomationId="ViewAllLoginOptionsButton">
|
||||||
<Label.GestureRecognizers>
|
<Label.GestureRecognizers>
|
||||||
<TapGestureRecognizer Command="{Binding CloseCommand}" />
|
<TapGestureRecognizer Command="{Binding CloseCommand}" />
|
||||||
</Label.GestureRecognizers>
|
</Label.GestureRecognizers>
|
||||||
|
|||||||
@@ -121,9 +121,8 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
var ssoToken = response.Token;
|
var ssoToken = response.Token;
|
||||||
|
|
||||||
|
var passwordOptions = PasswordGenerationOptions.CreateDefault
|
||||||
var passwordOptions = new PasswordGenerationOptions(true);
|
.WithLength(64);
|
||||||
passwordOptions.Length = 64;
|
|
||||||
|
|
||||||
var codeVerifier = await _passwordGenerationService.GeneratePasswordAsync(passwordOptions);
|
var codeVerifier = await _passwordGenerationService.GeneratePasswordAsync(passwordOptions);
|
||||||
var codeVerifierHash = await _cryptoFunctionService.HashAsync(codeVerifier, CryptoHashAlgorithm.Sha256);
|
var codeVerifierHash = await _cryptoFunctionService.HashAsync(codeVerifier, CryptoHashAlgorithm.Sha256);
|
||||||
|
|||||||
@@ -35,7 +35,8 @@
|
|||||||
x:Name="_email"
|
x:Name="_email"
|
||||||
Text="{Binding Email}"
|
Text="{Binding Email}"
|
||||||
Keyboard="Email"
|
Keyboard="Email"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="EmailAddressEntry"/>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Grid StyleClass="box-row">
|
<Grid StyleClass="box-row">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
@@ -59,7 +60,8 @@
|
|||||||
IsTextPredictionEnabled="False"
|
IsTextPredictionEnabled="False"
|
||||||
IsPassword="{Binding ShowPassword, Converter={StaticResource inverseBool}}"
|
IsPassword="{Binding ShowPassword, Converter={StaticResource inverseBool}}"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="MasterPasswordEntry"/>
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding ShowPasswordIcon}"
|
Text="{Binding ShowPasswordIcon}"
|
||||||
@@ -69,7 +71,8 @@
|
|||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"/>
|
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
|
||||||
|
AutomationId="PasswordVisibilityToggle"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Label
|
<Label
|
||||||
StyleClass="box-sub-label"
|
StyleClass="box-sub-label"
|
||||||
@@ -109,7 +112,8 @@
|
|||||||
IsTextPredictionEnabled="False"
|
IsTextPredictionEnabled="False"
|
||||||
IsPassword="{Binding ShowPassword, Converter={StaticResource inverseBool}}"
|
IsPassword="{Binding ShowPassword, Converter={StaticResource inverseBool}}"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="ConfirmMasterPasswordEntry"/>
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding ShowPasswordIcon}"
|
Text="{Binding ShowPasswordIcon}"
|
||||||
@@ -118,6 +122,7 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationId="ConfirmPasswordVisibilityToggle"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}" />
|
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
@@ -130,7 +135,8 @@
|
|||||||
Text="{Binding Hint}"
|
Text="{Binding Hint}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
ReturnType="Go"
|
ReturnType="Go"
|
||||||
ReturnCommand="{Binding SubmitCommand}" />
|
ReturnCommand="{Binding SubmitCommand}"
|
||||||
|
AutomationId="MasterPasswordHintLabel" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n MasterPasswordHintDescription}"
|
Text="{u:I18n MasterPasswordHintDescription}"
|
||||||
@@ -142,7 +148,8 @@
|
|||||||
IsToggled="{Binding CheckExposedMasterPassword}"
|
IsToggled="{Binding CheckExposedMasterPassword}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="Start"
|
HorizontalOptions="Start"
|
||||||
Margin="0, 0, 10, 0"/>
|
Margin="0, 0, 10, 0"
|
||||||
|
AutomationId="CheckExposedMasterPasswordToggle"/>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n CheckKnownDataBreachesForThisPassword}"
|
Text="{u:I18n CheckKnownDataBreachesForThisPassword}"
|
||||||
StyleClass="box-footer-label"
|
StyleClass="box-footer-label"
|
||||||
@@ -154,7 +161,8 @@
|
|||||||
IsToggled="{Binding AcceptPolicies}"
|
IsToggled="{Binding AcceptPolicies}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="Start"
|
HorizontalOptions="Start"
|
||||||
Margin="0, 0, 10, 0"/>
|
Margin="0, 0, 10, 0"
|
||||||
|
AutomationId="AcceptPoliciesToggle"/>
|
||||||
<Label StyleClass="box-footer-label"
|
<Label StyleClass="box-footer-label"
|
||||||
HorizontalOptions="Fill">
|
HorizontalOptions="Fill">
|
||||||
<Label.FormattedText>
|
<Label.FormattedText>
|
||||||
|
|||||||
@@ -27,7 +27,8 @@
|
|||||||
Clicked="Clear_Clicked"
|
Clicked="Clear_Clicked"
|
||||||
Order="Secondary"
|
Order="Secondary"
|
||||||
x:Name="_clearItem"
|
x:Name="_clearItem"
|
||||||
x:Key="clearItem" />
|
x:Key="clearItem"
|
||||||
|
AutomationId="ClearPasswordList" />
|
||||||
<ToolbarItem Icon="more_vert.png"
|
<ToolbarItem Icon="more_vert.png"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Options}"
|
AutomationProperties.Name="{u:I18n Options}"
|
||||||
@@ -43,7 +44,8 @@
|
|||||||
Margin="20, 0"
|
Margin="20, 0"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
HorizontalOptions="CenterAndExpand"
|
HorizontalOptions="CenterAndExpand"
|
||||||
HorizontalTextAlignment="Center"></Label>
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="NoPasswordsDisplayedLabel"></Label>
|
||||||
<controls:ExtendedCollectionView
|
<controls:ExtendedCollectionView
|
||||||
IsVisible="{Binding ShowNoData, Converter={StaticResource inverseBool}}"
|
IsVisible="{Binding ShowNoData, Converter={StaticResource inverseBool}}"
|
||||||
ItemsSource="{Binding History}"
|
ItemsSource="{Binding History}"
|
||||||
@@ -56,7 +58,8 @@
|
|||||||
StyleClass="list-row, list-row-platform"
|
StyleClass="list-row, list-row-platform"
|
||||||
Padding="10"
|
Padding="10"
|
||||||
RowSpacing="0"
|
RowSpacing="0"
|
||||||
ColumnSpacing="10">
|
ColumnSpacing="10"
|
||||||
|
AutomationId="GeneratedPasswordRow">
|
||||||
|
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
@@ -71,12 +74,14 @@
|
|||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
StyleClass="list-title, list-title-platform, text-html"
|
StyleClass="list-title, list-title-platform, text-html"
|
||||||
Text="{Binding Password, Mode=OneWay, Converter={StaticResource coloredPassword}}" />
|
Text="{Binding Password, Mode=OneWay, Converter={StaticResource coloredPassword}}"
|
||||||
|
AutomationId="GeneratedPasswordValue" />
|
||||||
<Label LineBreakMode="TailTruncation"
|
<Label LineBreakMode="TailTruncation"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
StyleClass="list-subtitle, list-subtitle-platform"
|
StyleClass="list-subtitle, list-subtitle-platform"
|
||||||
Text="{Binding Date, Mode=OneWay, Converter={StaticResource dateTime}}" />
|
Text="{Binding Date, Mode=OneWay, Converter={StaticResource dateTime}}"
|
||||||
|
AutomationId="GeneratedPasswordDateLabel" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="list-row-button, list-row-button-platform"
|
StyleClass="list-row-button, list-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Paste}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Paste}}"
|
||||||
@@ -86,7 +91,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n CopyPassword}" />
|
AutomationProperties.Name="{u:I18n CopyPassword}"
|
||||||
|
AutomationId="CopyPasswordValueButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</CollectionView.ItemTemplate>
|
</CollectionView.ItemTemplate>
|
||||||
|
|||||||
@@ -71,7 +71,8 @@
|
|||||||
<Label
|
<Label
|
||||||
Text="{u:I18n PasswordGeneratorPolicyInEffect}"
|
Text="{u:I18n PasswordGeneratorPolicyInEffect}"
|
||||||
StyleClass="text-muted, text-sm, text-bold"
|
StyleClass="text-muted, text-sm, text-bold"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="PasswordGeneratorPolicyInEffectLabel" />
|
||||||
</Frame>
|
</Frame>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid IsVisible="{Binding IsUsername, Converter={StaticResource inverseBool}}"
|
<Grid IsVisible="{Binding IsUsername, Converter={StaticResource inverseBool}}"
|
||||||
@@ -82,21 +83,24 @@
|
|||||||
x:Name="lblPassword"
|
x:Name="lblPassword"
|
||||||
StyleClass="text-lg, text-html"
|
StyleClass="text-lg, text-html"
|
||||||
Text="{Binding ColoredPassword, Mode=OneWay}"
|
Text="{Binding ColoredPassword, Mode=OneWay}"
|
||||||
Margin="0, 20" />
|
Margin="0, 20"
|
||||||
|
AutomationId="GeneratedPasswordLabel" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
||||||
Command="{Binding CopyCommand}"
|
Command="{Binding CopyCommand}"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n CopyPassword}" />
|
AutomationProperties.Name="{u:I18n CopyPassword}"
|
||||||
|
AutomationId="CopyValueButton" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}"
|
||||||
Command="{Binding RegenerateCommand}"
|
Command="{Binding RegenerateCommand}"
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n GeneratePassword}" />
|
AutomationProperties.Name="{u:I18n GeneratePassword}"
|
||||||
|
AutomationId="RegenerateValueButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid IsVisible="{Binding IsUsername}"
|
<Grid IsVisible="{Binding IsUsername}"
|
||||||
StyleClass="box-row"
|
StyleClass="box-row"
|
||||||
@@ -107,21 +111,24 @@
|
|||||||
StyleClass="text-lg, text-html"
|
StyleClass="text-lg, text-html"
|
||||||
Text="{Binding ColoredUsername, Mode=OneWay}"
|
Text="{Binding ColoredUsername, Mode=OneWay}"
|
||||||
Margin="0, 20"
|
Margin="0, 20"
|
||||||
HorizontalOptions="Start" />
|
HorizontalOptions="Start"
|
||||||
|
AutomationId="GeneratedPasswordLabel" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
||||||
Command="{Binding CopyCommand}"
|
Command="{Binding CopyCommand}"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n CopyUsername}" />
|
AutomationProperties.Name="{u:I18n CopyUsername}"
|
||||||
|
AutomationId="CopyValueButton" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}"
|
||||||
Command="{Binding RegenerateUsernameCommand}"
|
Command="{Binding RegenerateUsernameCommand}"
|
||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n GenerateUsername}" />
|
AutomationProperties.Name="{u:I18n GenerateUsername}"
|
||||||
|
AutomationId="RegenerateValueButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<BoxView StyleClass="box-row-separator"/>
|
<BoxView StyleClass="box-row-separator"/>
|
||||||
<StackLayout StyleClass="box"
|
<StackLayout StyleClass="box"
|
||||||
@@ -135,7 +142,8 @@
|
|||||||
ItemsSource="{Binding GeneratorTypeOptions, Mode=OneTime}"
|
ItemsSource="{Binding GeneratorTypeOptions, Mode=OneTime}"
|
||||||
SelectedItem="{Binding GeneratorTypeSelected}"
|
SelectedItem="{Binding GeneratorTypeSelected}"
|
||||||
ItemDisplayBinding="{Binding ., Converter={StaticResource localizableEnum}}"
|
ItemDisplayBinding="{Binding ., Converter={StaticResource localizableEnum}}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="GeneratorTypePicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label Text="{u:I18n Options, Header=True}"
|
<Label Text="{u:I18n Options, Header=True}"
|
||||||
StyleClass="box-header, box-header-platform"
|
StyleClass="box-header, box-header-platform"
|
||||||
@@ -161,7 +169,8 @@
|
|||||||
ItemsSource="{Binding UsernameTypeOptions, Mode=OneTime}"
|
ItemsSource="{Binding UsernameTypeOptions, Mode=OneTime}"
|
||||||
SelectedItem="{Binding UsernameTypeSelected}"
|
SelectedItem="{Binding UsernameTypeSelected}"
|
||||||
ItemDisplayBinding="{Binding ., Converter={StaticResource localizableEnum}}"
|
ItemDisplayBinding="{Binding ., Converter={StaticResource localizableEnum}}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="UsernameTypePicker" />
|
||||||
<Label
|
<Label
|
||||||
StyleClass="box-footer-label"
|
StyleClass="box-footer-label"
|
||||||
Text="{Binding UsernameTypeDescriptionLabel}" />
|
Text="{Binding UsernameTypeDescriptionLabel}" />
|
||||||
@@ -172,7 +181,8 @@
|
|||||||
StyleClass="box-label" />
|
StyleClass="box-label" />
|
||||||
<Entry x:Name="_plusAddressedEmailEntry"
|
<Entry x:Name="_plusAddressedEmailEntry"
|
||||||
Text="{Binding PlusAddressedEmail}"
|
Text="{Binding PlusAddressedEmail}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="PlusAddressedEmailEntry" />
|
||||||
<Label IsVisible="{Binding ShowUsernameEmailType}"
|
<Label IsVisible="{Binding ShowUsernameEmailType}"
|
||||||
Text="{u:I18n EmailType}"
|
Text="{u:I18n EmailType}"
|
||||||
StyleClass="box-label"
|
StyleClass="box-label"
|
||||||
@@ -203,7 +213,8 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_catchAllEmailDomainNameEntry"
|
x:Name="_catchAllEmailDomainNameEntry"
|
||||||
Text="{Binding CatchAllEmailDomain}"
|
Text="{Binding CatchAllEmailDomain}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="CatchAllEmailDomainEntry" />
|
||||||
<Label IsVisible="{Binding ShowUsernameEmailType}"
|
<Label IsVisible="{Binding ShowUsernameEmailType}"
|
||||||
Text="{u:I18n EmailType}"
|
Text="{u:I18n EmailType}"
|
||||||
StyleClass="box-label"
|
StyleClass="box-label"
|
||||||
@@ -236,26 +247,27 @@
|
|||||||
ItemsSource="{Binding ForwardedEmailServiceTypeOptions, Mode=OneTime}"
|
ItemsSource="{Binding ForwardedEmailServiceTypeOptions, Mode=OneTime}"
|
||||||
SelectedItem="{Binding ForwardedEmailServiceSelected}"
|
SelectedItem="{Binding ForwardedEmailServiceSelected}"
|
||||||
ItemDisplayBinding="{Binding ., Converter={StaticResource localizableEnum}}"
|
ItemDisplayBinding="{Binding ., Converter={StaticResource localizableEnum}}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
<!--ANONADDY OPTIONS-->
|
AutomationId="ServiceTypePicker" />
|
||||||
<Grid IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.AnonAddy}}"
|
<Grid
|
||||||
Grid.RowDefinitions="Auto,*"
|
Grid.RowDefinitions="Auto,*"
|
||||||
Grid.ColumnDefinitions="*,Auto">
|
Grid.ColumnDefinitions="*,Auto">
|
||||||
<Label
|
<Label
|
||||||
Margin="0,10,0,0"
|
Margin="0,10,0,0"
|
||||||
Text="{u:I18n APIAccessToken}"
|
Text="{Binding ForwardedEmailApiSecretLabel}"
|
||||||
StyleClass="box-label"/>
|
StyleClass="box-label"/>
|
||||||
<Entry
|
<Entry
|
||||||
x:Name="_anonAddyApiAccessTokenEntry"
|
Text="{Binding ForwardedEmailApiSecret}"
|
||||||
Text="{Binding AnonAddyApiAccessToken}"
|
IsPassword="{Binding ShowForwardedEmailApiSecret, Converter={StaticResource inverseBool}}"
|
||||||
IsPassword="{Binding ShowAnonAddyApiAccessToken, Converter={StaticResource inverseBool}}"
|
Grid.Row="1"
|
||||||
Grid.Row="1"/>
|
AutomationId="ForwardedEmailApiSecretEntry" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding ShowAnonAddyApiAccessToken, Converter={StaticResource inverseBool, iconGlyphConverter}, ConverterParameter={x:Static u:BooleanGlyphType.Eye}}"
|
Text="{Binding ShowForwardedEmailApiSecret, Converter={StaticResource inverseBool, iconGlyphConverter}, ConverterParameter={x:Static u:BooleanGlyphType.Eye}}"
|
||||||
Command="{Binding ToggleForwardedEmailHiddenValueCommand}"
|
Command="{Binding ToggleForwardedEmailHiddenValueCommand}"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"/>
|
Grid.Column="1"
|
||||||
|
AutomationId="ShowForwardedEmailApiSecretButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<Label IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.AnonAddy}}"
|
<Label IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.AnonAddy}}"
|
||||||
Text="{u:I18n DomainNameRequiredParenthesis}"
|
Text="{u:I18n DomainNameRequiredParenthesis}"
|
||||||
@@ -264,91 +276,8 @@
|
|||||||
<Entry IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.AnonAddy}}"
|
<Entry IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.AnonAddy}}"
|
||||||
x:Name="_anonAddyDomainNameEntry"
|
x:Name="_anonAddyDomainNameEntry"
|
||||||
Text="{Binding AnonAddyDomainName}"
|
Text="{Binding AnonAddyDomainName}"
|
||||||
StyleClass="box-value"/>
|
|
||||||
<!--FIREFOX RELAY OPTIONS-->
|
|
||||||
<Grid StyleClass="box-row, box-row-input"
|
|
||||||
IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.FirefoxRelay}}"
|
|
||||||
Grid.RowDefinitions="Auto,*"
|
|
||||||
Grid.ColumnDefinitions="*,Auto">
|
|
||||||
<Label
|
|
||||||
Text="{u:I18n APIAccessToken}"
|
|
||||||
StyleClass="box-label"/>
|
|
||||||
<Entry
|
|
||||||
x:Name="_firefoxRelayApiAccessTokenEntry"
|
|
||||||
Text="{Binding FirefoxRelayApiAccessToken}"
|
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
AutomationId="AnonAddyDomainNameEntry" />
|
||||||
IsPassword="{Binding ShowFirefoxRelayApiAccessToken, Converter={StaticResource inverseBool}}"/>
|
|
||||||
<controls:IconButton
|
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
|
||||||
Text="{Binding ShowFirefoxRelayApiAccessToken, Converter={StaticResource inverseBool, iconGlyphConverter}, ConverterParameter={x:Static u:BooleanGlyphType.Eye}}"
|
|
||||||
Command="{Binding ToggleForwardedEmailHiddenValueCommand}"
|
|
||||||
Grid.Row="1"
|
|
||||||
Grid.Column="1"/>
|
|
||||||
</Grid>
|
|
||||||
<!--SIMPLELOGIN OPTIONS-->
|
|
||||||
<Grid StyleClass="box-row, box-row-input"
|
|
||||||
IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.SimpleLogin}}"
|
|
||||||
Grid.RowDefinitions="Auto,*"
|
|
||||||
Grid.ColumnDefinitions="*,Auto">
|
|
||||||
<Label
|
|
||||||
Text="{u:I18n APIKeyRequiredParenthesis}"
|
|
||||||
StyleClass="box-label"/>
|
|
||||||
<Entry
|
|
||||||
x:Name="_simpleLoginApiKeyEntry"
|
|
||||||
Text="{Binding SimpleLoginApiKey}"
|
|
||||||
StyleClass="box-value"
|
|
||||||
Grid.Row="1"
|
|
||||||
IsPassword="{Binding ShowSimpleLoginApiKey, Converter={StaticResource inverseBool}}"/>
|
|
||||||
<controls:IconButton
|
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
|
||||||
Text="{Binding ShowSimpleLoginApiKey, Converter={StaticResource inverseBool, iconGlyphConverter}, ConverterParameter={x:Static u:BooleanGlyphType.Eye}}"
|
|
||||||
Command="{Binding ToggleForwardedEmailHiddenValueCommand}"
|
|
||||||
Grid.Row="1"
|
|
||||||
Grid.Column="1"/>
|
|
||||||
</Grid>
|
|
||||||
<!--DUCKDUCKGO OPTIONS-->
|
|
||||||
<Grid StyleClass="box-row, box-row-input"
|
|
||||||
IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.DuckDuckGo}}"
|
|
||||||
Grid.RowDefinitions="Auto,*"
|
|
||||||
Grid.ColumnDefinitions="*,Auto">
|
|
||||||
<Label
|
|
||||||
Text="{u:I18n APIKeyRequiredParenthesis}"
|
|
||||||
StyleClass="box-label"/>
|
|
||||||
<Entry
|
|
||||||
x:Name="_duckDuckGoApiAccessTokenEntry"
|
|
||||||
Text="{Binding DuckDuckGoApiKey}"
|
|
||||||
StyleClass="box-value"
|
|
||||||
Grid.Row="1"
|
|
||||||
IsPassword="{Binding ShowDuckDuckGoApiKey, Converter={StaticResource inverseBool}}"/>
|
|
||||||
<controls:IconButton
|
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
|
||||||
Text="{Binding ShowDuckDuckGoApiKey, Converter={StaticResource inverseBool, iconGlyphConverter}, ConverterParameter={x:Static u:BooleanGlyphType.Eye}}"
|
|
||||||
Command="{Binding ToggleForwardedEmailHiddenValueCommand}"
|
|
||||||
Grid.Row="1"
|
|
||||||
Grid.Column="1"/>
|
|
||||||
</Grid>
|
|
||||||
<!--FASTMAIL OPTIONS-->
|
|
||||||
<Grid StyleClass="box-row, box-row-input"
|
|
||||||
IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.Fastmail}}"
|
|
||||||
Grid.RowDefinitions="Auto,*"
|
|
||||||
Grid.ColumnDefinitions="*,Auto">
|
|
||||||
<Label
|
|
||||||
Text="{u:I18n APIKeyRequiredParenthesis}"
|
|
||||||
StyleClass="box-label"/>
|
|
||||||
<Entry
|
|
||||||
x:Name="_fastmailApiAccessTokenEntry"
|
|
||||||
Text="{Binding FastmailApiKey}"
|
|
||||||
StyleClass="box-value"
|
|
||||||
Grid.Row="1"
|
|
||||||
IsPassword="{Binding ShowFastmailApiKey, Converter={StaticResource inverseBool}}"/>
|
|
||||||
<controls:IconButton
|
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
|
||||||
Text="{Binding ShowFastmailApiKey, Converter={StaticResource iconGlyphConverter}, ConverterParameter={x:Static u:BooleanGlyphType.Eye}}"
|
|
||||||
Command="{Binding ToggleForwardedEmailHiddenValueCommand}"
|
|
||||||
Grid.Row="1"
|
|
||||||
Grid.Column="1"/>
|
|
||||||
</Grid>
|
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<!--RANDOM WORD OPTIONS-->
|
<!--RANDOM WORD OPTIONS-->
|
||||||
<Grid IsVisible="{Binding UsernameTypeSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:UsernameType.RandomWord}}">
|
<Grid IsVisible="{Binding UsernameTypeSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:UsernameType.RandomWord}}">
|
||||||
@@ -359,7 +288,8 @@
|
|||||||
<Switch
|
<Switch
|
||||||
IsToggled="{Binding CapitalizeRandomWordUsername}"
|
IsToggled="{Binding CapitalizeRandomWordUsername}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End" />
|
HorizontalOptions="End"
|
||||||
|
AutomationId="CapitalizeRandomWordUsernameToggle" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<BoxView IsVisible="{Binding UsernameTypeSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:UsernameType.RandomWord}}"
|
<BoxView IsVisible="{Binding UsernameTypeSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:UsernameType.RandomWord}}"
|
||||||
StyleClass="box-row-separator" />
|
StyleClass="box-row-separator" />
|
||||||
@@ -371,7 +301,8 @@
|
|||||||
<Switch
|
<Switch
|
||||||
IsToggled="{Binding IncludeNumberRandomWordUsername}"
|
IsToggled="{Binding IncludeNumberRandomWordUsername}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End" />
|
HorizontalOptions="End"
|
||||||
|
AutomationId="IncludeNumberRandomWordUsernameToggle" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<BoxView IsVisible="{Binding UsernameTypeSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:UsernameType.RandomWord}}"
|
<BoxView IsVisible="{Binding UsernameTypeSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:UsernameType.RandomWord}}"
|
||||||
StyleClass="box-row-separator" />
|
StyleClass="box-row-separator" />
|
||||||
@@ -386,7 +317,8 @@
|
|||||||
x:Name="_passwordTypePicker"
|
x:Name="_passwordTypePicker"
|
||||||
ItemsSource="{Binding PasswordTypeOptions, Mode=OneTime}"
|
ItemsSource="{Binding PasswordTypeOptions, Mode=OneTime}"
|
||||||
SelectedIndex="{Binding PasswordTypeSelectedIndex}"
|
SelectedIndex="{Binding PasswordTypeSelectedIndex}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="PasswordTypePicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout Spacing="0"
|
<StackLayout Spacing="0"
|
||||||
Padding="0"
|
Padding="0"
|
||||||
@@ -403,12 +335,14 @@
|
|||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
HorizontalTextAlignment="End"
|
HorizontalTextAlignment="End"
|
||||||
VerticalOptions="FillAndExpand"
|
VerticalOptions="FillAndExpand"
|
||||||
VerticalTextAlignment="Center" />
|
VerticalTextAlignment="Center"
|
||||||
|
AutomationId="NumberOfWordsLabel" />
|
||||||
<controls:ExtendedStepper
|
<controls:ExtendedStepper
|
||||||
Value="{Binding NumWords}"
|
Value="{Binding NumWords}"
|
||||||
Maximum="20"
|
Maximum="20"
|
||||||
Minimum="3"
|
Minimum="3"
|
||||||
Increment="1" />
|
Increment="1"
|
||||||
|
AutomationId="NumberOfWordsStepper" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
@@ -419,7 +353,8 @@
|
|||||||
Text="{Binding WordSeparator}"
|
Text="{Binding WordSeparator}"
|
||||||
IsSpellCheckEnabled="False"
|
IsSpellCheckEnabled="False"
|
||||||
IsTextPredictionEnabled="False"
|
IsTextPredictionEnabled="False"
|
||||||
StyleClass="box-value">
|
StyleClass="box-value"
|
||||||
|
AutomationId="WordSeparatorEntry">
|
||||||
<Entry.Effects>
|
<Entry.Effects>
|
||||||
<effects:NoEmojiKeyboardEffect />
|
<effects:NoEmojiKeyboardEffect />
|
||||||
</Entry.Effects>
|
</Entry.Effects>
|
||||||
@@ -435,7 +370,8 @@
|
|||||||
IsEnabled="{Binding EnforcedPolicyOptions.Capitalize,
|
IsEnabled="{Binding EnforcedPolicyOptions.Capitalize,
|
||||||
Converter={StaticResource inverseBool}}"
|
Converter={StaticResource inverseBool}}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End" />
|
HorizontalOptions="End"
|
||||||
|
AutomationId="CapitalizePassphraseToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
<StackLayout StyleClass="box-row, box-row-switch">
|
<StackLayout StyleClass="box-row, box-row-switch">
|
||||||
@@ -448,7 +384,8 @@
|
|||||||
IsEnabled="{Binding EnforcedPolicyOptions.IncludeNumber,
|
IsEnabled="{Binding EnforcedPolicyOptions.IncludeNumber,
|
||||||
Converter={StaticResource inverseBool}}"
|
Converter={StaticResource inverseBool}}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End" />
|
HorizontalOptions="End"
|
||||||
|
AutomationId="IncludeNumbersToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout Spacing="0" Padding="0" IsVisible="{Binding IsPassword}">
|
<StackLayout Spacing="0" Padding="0" IsVisible="{Binding IsPassword}">
|
||||||
@@ -462,7 +399,8 @@
|
|||||||
StyleClass="box-sub-label"
|
StyleClass="box-sub-label"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
HorizontalTextAlignment="End"
|
HorizontalTextAlignment="End"
|
||||||
WidthRequest="50" />
|
WidthRequest="50"
|
||||||
|
AutomationId="PasswordLengthLabel" />
|
||||||
<controls:ExtendedSlider
|
<controls:ExtendedSlider
|
||||||
DragCompleted="LengthSlider_DragCompleted"
|
DragCompleted="LengthSlider_DragCompleted"
|
||||||
Value="{Binding Length}"
|
Value="{Binding Length}"
|
||||||
@@ -471,7 +409,8 @@
|
|||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
Maximum="128"
|
Maximum="128"
|
||||||
Minimum="5" />
|
Minimum="5"
|
||||||
|
AutomationId="PasswordLengthSlider" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
<StackLayout StyleClass="box-row, box-row-switch">
|
<StackLayout StyleClass="box-row, box-row-switch">
|
||||||
@@ -488,7 +427,8 @@
|
|||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End"
|
HorizontalOptions="End"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n UppercaseAtoZ}"/>
|
AutomationProperties.Name="{u:I18n UppercaseAtoZ}"
|
||||||
|
AutomationId="UppercaseAtoZToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
<StackLayout StyleClass="box-row, box-row-switch">
|
<StackLayout StyleClass="box-row, box-row-switch">
|
||||||
@@ -505,7 +445,8 @@
|
|||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End"
|
HorizontalOptions="End"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n LowercaseAtoZ}"/>
|
AutomationProperties.Name="{u:I18n LowercaseAtoZ}"
|
||||||
|
AutomationId="LowercaseAtoZToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
<StackLayout StyleClass="box-row, box-row-switch">
|
<StackLayout StyleClass="box-row, box-row-switch">
|
||||||
@@ -522,7 +463,8 @@
|
|||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End"
|
HorizontalOptions="End"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n NumbersZeroToNine}"/>
|
AutomationProperties.Name="{u:I18n NumbersZeroToNine}"
|
||||||
|
AutomationId="NumbersZeroToNineToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
<StackLayout StyleClass="box-row, box-row-switch">
|
<StackLayout StyleClass="box-row, box-row-switch">
|
||||||
@@ -539,7 +481,8 @@
|
|||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End"
|
HorizontalOptions="End"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n SpecialCharacters}"/>
|
AutomationProperties.Name="{u:I18n SpecialCharacters}"
|
||||||
|
AutomationId="SpecialCharactersToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
<StackLayout StyleClass="box-row, box-row-stepper">
|
<StackLayout StyleClass="box-row, box-row-stepper">
|
||||||
@@ -554,12 +497,14 @@
|
|||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
HorizontalTextAlignment="End"
|
HorizontalTextAlignment="End"
|
||||||
VerticalOptions="FillAndExpand"
|
VerticalOptions="FillAndExpand"
|
||||||
VerticalTextAlignment="Center" />
|
VerticalTextAlignment="Center"
|
||||||
|
AutomationId="MinNumberValueLabel" />
|
||||||
<controls:ExtendedStepper
|
<controls:ExtendedStepper
|
||||||
Value="{Binding MinNumber}"
|
Value="{Binding MinNumber}"
|
||||||
Maximum="5"
|
Maximum="5"
|
||||||
Minimum="0"
|
Minimum="0"
|
||||||
Increment="1" />
|
Increment="1"
|
||||||
|
AutomationId="MinNumberStepper" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
<StackLayout StyleClass="box-row, box-row-stepper">
|
<StackLayout StyleClass="box-row, box-row-stepper">
|
||||||
@@ -574,12 +519,14 @@
|
|||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
HorizontalTextAlignment="End"
|
HorizontalTextAlignment="End"
|
||||||
VerticalOptions="FillAndExpand"
|
VerticalOptions="FillAndExpand"
|
||||||
VerticalTextAlignment="Center" />
|
VerticalTextAlignment="Center"
|
||||||
|
AutomationId="MinSpecialValueLabel" />
|
||||||
<controls:ExtendedStepper
|
<controls:ExtendedStepper
|
||||||
Value="{Binding MinSpecial}"
|
Value="{Binding MinSpecial}"
|
||||||
Maximum="5"
|
Maximum="5"
|
||||||
Minimum="0"
|
Minimum="0"
|
||||||
Increment="1" />
|
Increment="1"
|
||||||
|
AutomationId="MinSpecialStepper" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
<StackLayout StyleClass="box-row, box-row-switch">
|
<StackLayout StyleClass="box-row, box-row-switch">
|
||||||
@@ -590,7 +537,8 @@
|
|||||||
<Switch
|
<Switch
|
||||||
IsToggled="{Binding AvoidAmbiguousChars}"
|
IsToggled="{Binding AvoidAmbiguousChars}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End" />
|
HorizontalOptions="End"
|
||||||
|
AutomationId="AvoidAmbiguousCharsToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using Bit.App.Utilities;
|
|||||||
using Bit.Core;
|
using Bit.Core;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
|
using Bit.Core.Exceptions;
|
||||||
using Bit.Core.Models.Domain;
|
using Bit.Core.Models.Domain;
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
using Xamarin.CommunityToolkit.ObjectModel;
|
using Xamarin.CommunityToolkit.ObjectModel;
|
||||||
@@ -23,7 +24,7 @@ namespace Bit.App.Pages
|
|||||||
private readonly IUsernameGenerationService _usernameGenerationService;
|
private readonly IUsernameGenerationService _usernameGenerationService;
|
||||||
private readonly ITokenService _tokenService;
|
private readonly ITokenService _tokenService;
|
||||||
private readonly IDeviceActionService _deviceActionService;
|
private readonly IDeviceActionService _deviceActionService;
|
||||||
readonly LazyResolve<ILogger> _logger = new LazyResolve<ILogger>("logger");
|
readonly LazyResolve<ILogger> _logger = new LazyResolve<ILogger>();
|
||||||
|
|
||||||
private PasswordGenerationOptions _options;
|
private PasswordGenerationOptions _options;
|
||||||
private UsernameGenerationOptions _usernameOptions;
|
private UsernameGenerationOptions _usernameOptions;
|
||||||
@@ -49,11 +50,7 @@ namespace Bit.App.Pages
|
|||||||
private bool _doneIniting;
|
private bool _doneIniting;
|
||||||
private bool _showTypePicker;
|
private bool _showTypePicker;
|
||||||
private string _emailWebsite;
|
private string _emailWebsite;
|
||||||
private bool _showFirefoxRelayApiAccessToken;
|
private bool _showForwardedEmailApiSecret;
|
||||||
private bool _showAnonAddyApiAccessToken;
|
|
||||||
private bool _showSimpleLoginApiKey;
|
|
||||||
private bool _showDuckDuckGoApiKey;
|
|
||||||
private bool _showFastmailApiKey;
|
|
||||||
private bool _editMode;
|
private bool _editMode;
|
||||||
|
|
||||||
public GeneratorPageViewModel()
|
public GeneratorPageViewModel()
|
||||||
@@ -96,7 +93,7 @@ namespace Bit.App.Pages
|
|||||||
UsernameTypePromptHelpCommand = new Command(UsernameTypePromptHelp);
|
UsernameTypePromptHelpCommand = new Command(UsernameTypePromptHelp);
|
||||||
RegenerateCommand = new AsyncCommand(RegenerateAsync, onException: ex => OnSubmitException(ex), allowsMultipleExecutions: false);
|
RegenerateCommand = new AsyncCommand(RegenerateAsync, onException: ex => OnSubmitException(ex), allowsMultipleExecutions: false);
|
||||||
RegenerateUsernameCommand = new AsyncCommand(RegenerateUsernameAsync, onException: ex => OnSubmitException(ex), allowsMultipleExecutions: false);
|
RegenerateUsernameCommand = new AsyncCommand(RegenerateUsernameAsync, onException: ex => OnSubmitException(ex), allowsMultipleExecutions: false);
|
||||||
ToggleForwardedEmailHiddenValueCommand = new AsyncCommand(ToggleForwardedEmailHiddenValueAsync, onException: ex => _logger.Value.Exception(ex), allowsMultipleExecutions: false);
|
ToggleForwardedEmailHiddenValueCommand = new Command(() => ShowForwardedEmailApiSecret = !ShowForwardedEmailApiSecret);
|
||||||
CopyCommand = new AsyncCommand(CopyAsync, onException: ex => _logger.Value.Exception(ex), allowsMultipleExecutions: false);
|
CopyCommand = new AsyncCommand(CopyAsync, onException: ex => _logger.Value.Exception(ex), allowsMultipleExecutions: false);
|
||||||
CloseCommand = new AsyncCommand(CloseAsync, onException: ex => _logger.Value.Exception(ex), allowsMultipleExecutions: false);
|
CloseCommand = new AsyncCommand(CloseAsync, onException: ex => _logger.Value.Exception(ex), allowsMultipleExecutions: false);
|
||||||
}
|
}
|
||||||
@@ -415,7 +412,6 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
public string UsernameTypeDescriptionLabel => GetUsernameTypeLabelDescription(UsernameTypeSelected);
|
public string UsernameTypeDescriptionLabel => GetUsernameTypeLabelDescription(UsernameTypeSelected);
|
||||||
|
|
||||||
|
|
||||||
public ForwardedEmailServiceType ForwardedEmailServiceSelected
|
public ForwardedEmailServiceType ForwardedEmailServiceSelected
|
||||||
{
|
{
|
||||||
get => _usernameOptions.ServiceType;
|
get => _usernameOptions.ServiceType;
|
||||||
@@ -425,7 +421,11 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
_usernameOptions.ServiceType = value;
|
_usernameOptions.ServiceType = value;
|
||||||
Username = Constants.DefaultUsernameGenerated;
|
Username = Constants.DefaultUsernameGenerated;
|
||||||
TriggerPropertyChanged(nameof(ForwardedEmailServiceSelected));
|
TriggerPropertyChanged(nameof(ForwardedEmailServiceSelected), new string[]
|
||||||
|
{
|
||||||
|
nameof(ForwardedEmailApiSecret),
|
||||||
|
nameof(ForwardedEmailApiSecretLabel)
|
||||||
|
});
|
||||||
SaveUsernameOptionsAsync(false).FireAndForget();
|
SaveUsernameOptionsAsync(false).FireAndForget();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -445,27 +445,104 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string AnonAddyApiAccessToken
|
public string ForwardedEmailApiSecret
|
||||||
{
|
{
|
||||||
get => _usernameOptions.AnonAddyApiAccessToken;
|
get
|
||||||
|
{
|
||||||
|
switch (ForwardedEmailServiceSelected)
|
||||||
|
{
|
||||||
|
case ForwardedEmailServiceType.AnonAddy:
|
||||||
|
return _usernameOptions.AnonAddyApiAccessToken;
|
||||||
|
case ForwardedEmailServiceType.DuckDuckGo:
|
||||||
|
return _usernameOptions.DuckDuckGoApiKey;
|
||||||
|
case ForwardedEmailServiceType.Fastmail:
|
||||||
|
return _usernameOptions.FastMailApiKey;
|
||||||
|
case ForwardedEmailServiceType.FirefoxRelay:
|
||||||
|
return _usernameOptions.FirefoxRelayApiAccessToken;
|
||||||
|
case ForwardedEmailServiceType.SimpleLogin:
|
||||||
|
return _usernameOptions.SimpleLoginApiKey;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
|
bool changed = false;
|
||||||
|
switch (ForwardedEmailServiceSelected)
|
||||||
|
{
|
||||||
|
case ForwardedEmailServiceType.AnonAddy:
|
||||||
if (_usernameOptions.AnonAddyApiAccessToken != value)
|
if (_usernameOptions.AnonAddyApiAccessToken != value)
|
||||||
{
|
{
|
||||||
_usernameOptions.AnonAddyApiAccessToken = value;
|
_usernameOptions.AnonAddyApiAccessToken = value;
|
||||||
TriggerPropertyChanged(nameof(AnonAddyApiAccessToken));
|
changed = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ForwardedEmailServiceType.DuckDuckGo:
|
||||||
|
if (_usernameOptions.DuckDuckGoApiKey != value)
|
||||||
|
{
|
||||||
|
_usernameOptions.DuckDuckGoApiKey = value;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ForwardedEmailServiceType.Fastmail:
|
||||||
|
if (_usernameOptions.FastMailApiKey != value)
|
||||||
|
{
|
||||||
|
_usernameOptions.FastMailApiKey = value;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ForwardedEmailServiceType.FirefoxRelay:
|
||||||
|
if (_usernameOptions.FirefoxRelayApiAccessToken != value)
|
||||||
|
{
|
||||||
|
_usernameOptions.FirefoxRelayApiAccessToken = value;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ForwardedEmailServiceType.SimpleLogin:
|
||||||
|
if (_usernameOptions.SimpleLoginApiKey != value)
|
||||||
|
{
|
||||||
|
_usernameOptions.SimpleLoginApiKey = value;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (changed)
|
||||||
|
{
|
||||||
|
TriggerPropertyChanged(nameof(ForwardedEmailApiSecret));
|
||||||
SaveUsernameOptionsAsync(false).FireAndForget();
|
SaveUsernameOptionsAsync(false).FireAndForget();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool ShowAnonAddyApiAccessToken
|
public string ForwardedEmailApiSecretLabel
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return _showAnonAddyApiAccessToken;
|
switch (ForwardedEmailServiceSelected)
|
||||||
|
{
|
||||||
|
case ForwardedEmailServiceType.AnonAddy:
|
||||||
|
case ForwardedEmailServiceType.FirefoxRelay:
|
||||||
|
return AppResources.APIAccessToken;
|
||||||
|
case ForwardedEmailServiceType.DuckDuckGo:
|
||||||
|
case ForwardedEmailServiceType.Fastmail:
|
||||||
|
case ForwardedEmailServiceType.SimpleLogin:
|
||||||
|
return AppResources.APIKeyRequiredParenthesis;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
set => SetProperty(ref _showAnonAddyApiAccessToken, value);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ShowForwardedEmailApiSecret
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _showForwardedEmailApiSecret;
|
||||||
|
}
|
||||||
|
set => SetProperty(ref _showForwardedEmailApiSecret, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string AnonAddyDomainName
|
public string AnonAddyDomainName
|
||||||
@@ -482,99 +559,6 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string FirefoxRelayApiAccessToken
|
|
||||||
{
|
|
||||||
get => _usernameOptions.FirefoxRelayApiAccessToken;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_usernameOptions.FirefoxRelayApiAccessToken != value)
|
|
||||||
{
|
|
||||||
_usernameOptions.FirefoxRelayApiAccessToken = value;
|
|
||||||
TriggerPropertyChanged(nameof(FirefoxRelayApiAccessToken));
|
|
||||||
SaveUsernameOptionsAsync(false).FireAndForget();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ShowFirefoxRelayApiAccessToken
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _showFirefoxRelayApiAccessToken;
|
|
||||||
}
|
|
||||||
set => SetProperty(ref _showFirefoxRelayApiAccessToken, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string SimpleLoginApiKey
|
|
||||||
{
|
|
||||||
get => _usernameOptions.SimpleLoginApiKey;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_usernameOptions.SimpleLoginApiKey != value)
|
|
||||||
{
|
|
||||||
_usernameOptions.SimpleLoginApiKey = value;
|
|
||||||
TriggerPropertyChanged(nameof(SimpleLoginApiKey));
|
|
||||||
SaveUsernameOptionsAsync(false).FireAndForget();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ShowSimpleLoginApiKey
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _showSimpleLoginApiKey;
|
|
||||||
}
|
|
||||||
set => SetProperty(ref _showSimpleLoginApiKey, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string DuckDuckGoApiKey
|
|
||||||
{
|
|
||||||
get => _usernameOptions.DuckDuckGoApiKey;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_usernameOptions.DuckDuckGoApiKey != value)
|
|
||||||
{
|
|
||||||
_usernameOptions.DuckDuckGoApiKey = value;
|
|
||||||
TriggerPropertyChanged(nameof(DuckDuckGoApiKey));
|
|
||||||
SaveUsernameOptionsAsync(false).FireAndForget();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ShowDuckDuckGoApiKey
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _showDuckDuckGoApiKey;
|
|
||||||
}
|
|
||||||
set => SetProperty(ref _showDuckDuckGoApiKey, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public string FastmailApiKey
|
|
||||||
{
|
|
||||||
get => _usernameOptions.FastMailApiKey;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_usernameOptions.FastMailApiKey != value)
|
|
||||||
{
|
|
||||||
_usernameOptions.FastMailApiKey = value;
|
|
||||||
TriggerPropertyChanged(nameof(FastmailApiKey));
|
|
||||||
SaveUsernameOptionsAsync(false).FireAndForget();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ShowFastmailApiKey
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _showFastmailApiKey;
|
|
||||||
}
|
|
||||||
set => SetProperty(ref _showFastmailApiKey, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool CapitalizeRandomWordUsername
|
public bool CapitalizeRandomWordUsername
|
||||||
{
|
{
|
||||||
get => _usernameOptions.CapitalizeRandomWordUsername;
|
get => _usernameOptions.CapitalizeRandomWordUsername;
|
||||||
@@ -807,12 +791,9 @@ namespace Bit.App.Pages
|
|||||||
TriggerPropertyChanged(nameof(PlusAddressedEmailTypeSelected));
|
TriggerPropertyChanged(nameof(PlusAddressedEmailTypeSelected));
|
||||||
TriggerPropertyChanged(nameof(IncludeNumberRandomWordUsername));
|
TriggerPropertyChanged(nameof(IncludeNumberRandomWordUsername));
|
||||||
TriggerPropertyChanged(nameof(CapitalizeRandomWordUsername));
|
TriggerPropertyChanged(nameof(CapitalizeRandomWordUsername));
|
||||||
TriggerPropertyChanged(nameof(SimpleLoginApiKey));
|
TriggerPropertyChanged(nameof(ForwardedEmailApiSecret));
|
||||||
TriggerPropertyChanged(nameof(FirefoxRelayApiAccessToken));
|
TriggerPropertyChanged(nameof(ForwardedEmailApiSecretLabel));
|
||||||
TriggerPropertyChanged(nameof(AnonAddyDomainName));
|
TriggerPropertyChanged(nameof(AnonAddyDomainName));
|
||||||
TriggerPropertyChanged(nameof(AnonAddyApiAccessToken));
|
|
||||||
TriggerPropertyChanged(nameof(DuckDuckGoApiKey));
|
|
||||||
TriggerPropertyChanged(nameof(FastmailApiKey));
|
|
||||||
TriggerPropertyChanged(nameof(CatchAllEmailDomain));
|
TriggerPropertyChanged(nameof(CatchAllEmailDomain));
|
||||||
TriggerPropertyChanged(nameof(ForwardedEmailServiceSelected));
|
TriggerPropertyChanged(nameof(ForwardedEmailServiceSelected));
|
||||||
TriggerPropertyChanged(nameof(UsernameTypeSelected));
|
TriggerPropertyChanged(nameof(UsernameTypeSelected));
|
||||||
@@ -827,7 +808,7 @@ namespace Bit.App.Pages
|
|||||||
private void SetOptions()
|
private void SetOptions()
|
||||||
{
|
{
|
||||||
_options.AllowAmbiguousChar = AllowAmbiguousChars;
|
_options.AllowAmbiguousChar = AllowAmbiguousChars;
|
||||||
_options.Type = PasswordTypeSelectedIndex == 1 ? "passphrase" : "password";
|
_options.Type = PasswordTypeSelectedIndex == 1 ? PasswordGenerationOptions.TYPE_PASSPHRASE : PasswordGenerationOptions.TYPE_PASSWORD;
|
||||||
_options.MinNumber = MinNumber;
|
_options.MinNumber = MinNumber;
|
||||||
_options.MinSpecial = MinSpecial;
|
_options.MinSpecial = MinSpecial;
|
||||||
_options.Special = Special;
|
_options.Special = Special;
|
||||||
@@ -845,17 +826,25 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
_logger.Value.Exception(ex);
|
_logger.Value.Exception(ex);
|
||||||
|
|
||||||
|
string message = AppResources.GenericErrorMessage;
|
||||||
|
|
||||||
if (IsUsername && UsernameTypeSelected == UsernameType.ForwardedEmailAlias)
|
if (IsUsername && UsernameTypeSelected == UsernameType.ForwardedEmailAlias)
|
||||||
{
|
{
|
||||||
await Device.InvokeOnMainThreadAsync(() => Page.DisplayAlert(
|
if (ex is ForwardedEmailInvalidSecretException)
|
||||||
AppResources.AnErrorHasOccurred, string.Format(AppResources.UnknownXErrorMessage, ForwardedEmailServiceSelected), AppResources.Ok));
|
{
|
||||||
|
message = ForwardedEmailServiceSelected == ForwardedEmailServiceType.AnonAddy || ForwardedEmailServiceSelected == ForwardedEmailServiceType.FirefoxRelay
|
||||||
|
? AppResources.InvalidAPIToken
|
||||||
|
: AppResources.InvalidAPIKey;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await Device.InvokeOnMainThreadAsync(() => Page.DisplayAlert(AppResources.AnErrorHasOccurred, AppResources.GenericErrorMessage, AppResources.Ok));
|
message = string.Format(AppResources.UnknownXErrorMessage, ForwardedEmailServiceSelected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await Device.InvokeOnMainThreadAsync(() => Page.DisplayAlert(AppResources.AnErrorHasOccurred, message, AppResources.Ok));
|
||||||
|
}
|
||||||
|
|
||||||
private string GetUsernameTypeLabelDescription(UsernameType value)
|
private string GetUsernameTypeLabelDescription(UsernameType value)
|
||||||
{
|
{
|
||||||
switch (value)
|
switch (value)
|
||||||
@@ -870,27 +859,5 @@ namespace Bit.App.Pages
|
|||||||
return string.Empty;
|
return string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task ToggleForwardedEmailHiddenValueAsync()
|
|
||||||
{
|
|
||||||
switch (ForwardedEmailServiceSelected)
|
|
||||||
{
|
|
||||||
case ForwardedEmailServiceType.AnonAddy:
|
|
||||||
ShowAnonAddyApiAccessToken = !ShowAnonAddyApiAccessToken;
|
|
||||||
break;
|
|
||||||
case ForwardedEmailServiceType.FirefoxRelay:
|
|
||||||
ShowFirefoxRelayApiAccessToken = !ShowFirefoxRelayApiAccessToken;
|
|
||||||
break;
|
|
||||||
case ForwardedEmailServiceType.SimpleLogin:
|
|
||||||
ShowSimpleLoginApiKey = !ShowSimpleLoginApiKey;
|
|
||||||
break;
|
|
||||||
case ForwardedEmailServiceType.DuckDuckGo:
|
|
||||||
ShowDuckDuckGoApiKey = !ShowDuckDuckGoApiKey;
|
|
||||||
break;
|
|
||||||
case ForwardedEmailServiceType.Fastmail:
|
|
||||||
ShowFastmailApiKey = !ShowFastmailApiKey;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,8 @@
|
|||||||
<Label
|
<Label
|
||||||
Text="{u:I18n SendDisabledWarning}"
|
Text="{u:I18n SendDisabledWarning}"
|
||||||
StyleClass="text-muted, text-sm, text-bold"
|
StyleClass="text-muted, text-sm, text-bold"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="SendDisabledWarningMessageLabel" />
|
||||||
</Frame>
|
</Frame>
|
||||||
<Frame
|
<Frame
|
||||||
IsVisible="{Binding SendOptionsPolicyInEffect}"
|
IsVisible="{Binding SendOptionsPolicyInEffect}"
|
||||||
@@ -83,7 +84,8 @@
|
|||||||
<Label
|
<Label
|
||||||
Text="{u:I18n SendOptionsPolicyInEffect}"
|
Text="{u:I18n SendOptionsPolicyInEffect}"
|
||||||
StyleClass="text-muted, text-sm, text-bold"
|
StyleClass="text-muted, text-sm, text-bold"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="SendOptionsPolicyInEffectLabel" />
|
||||||
</Frame>
|
</Frame>
|
||||||
<StackLayout StyleClass="box-row">
|
<StackLayout StyleClass="box-row">
|
||||||
<Label
|
<Label
|
||||||
@@ -93,7 +95,8 @@
|
|||||||
x:Name="_nameEntry"
|
x:Name="_nameEntry"
|
||||||
Text="{Binding Send.Name}"
|
Text="{Binding Send.Name}"
|
||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="SendNameEntry" />
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n NameInfo}"
|
Text="{u:I18n NameInfo}"
|
||||||
StyleClass="box-footer-label"
|
StyleClass="box-footer-label"
|
||||||
@@ -123,6 +126,7 @@
|
|||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n File}"
|
AutomationProperties.Name="{u:I18n File}"
|
||||||
AutomationProperties.HelpText="{Binding FileTypeAccessibilityLabel}"
|
AutomationProperties.HelpText="{Binding FileTypeAccessibilityLabel}"
|
||||||
|
AutomationId="SendFileButton"
|
||||||
Grid.Column="0">
|
Grid.Column="0">
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -135,6 +139,7 @@
|
|||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Text}"
|
AutomationProperties.Name="{u:I18n Text}"
|
||||||
AutomationProperties.HelpText="{Binding TextTypeAccessibilityLabel}"
|
AutomationProperties.HelpText="{Binding TextTypeAccessibilityLabel}"
|
||||||
|
AutomationId="SendTextButton"
|
||||||
Grid.Column="1">
|
Grid.Column="1">
|
||||||
</Button>
|
</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
@@ -152,12 +157,14 @@
|
|||||||
Text="{Binding Send.File.FileName, Mode=OneWay}"
|
Text="{Binding Send.File.FileName, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
VerticalTextAlignment="Center"
|
VerticalTextAlignment="Center"
|
||||||
HorizontalOptions="StartAndExpand" />
|
HorizontalOptions="StartAndExpand"
|
||||||
|
AutomationId="SendFileNameLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Send.File.SizeName, Mode=OneWay}"
|
Text="{Binding Send.File.SizeName, Mode=OneWay}"
|
||||||
StyleClass="box-sub-label"
|
StyleClass="box-sub-label"
|
||||||
HorizontalTextAlignment="End"
|
HorizontalTextAlignment="End"
|
||||||
VerticalTextAlignment="Center" />
|
VerticalTextAlignment="Center"
|
||||||
|
AutomationId="SendFileSizeLabel" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout
|
<StackLayout
|
||||||
IsVisible="{Binding EditMode, Converter={StaticResource inverseBool}}"
|
IsVisible="{Binding EditMode, Converter={StaticResource inverseBool}}"
|
||||||
@@ -168,20 +175,23 @@
|
|||||||
LineBreakMode="CharacterWrap"
|
LineBreakMode="CharacterWrap"
|
||||||
StyleClass="text-sm, text-muted"
|
StyleClass="text-sm, text-muted"
|
||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="SendNoFileChosenLabel" />
|
||||||
<Label
|
<Label
|
||||||
IsVisible="{Binding FileName, Converter={StaticResource notNull}}"
|
IsVisible="{Binding FileName, Converter={StaticResource notNull}}"
|
||||||
Text="{Binding FileName}"
|
Text="{Binding FileName}"
|
||||||
LineBreakMode="CharacterWrap"
|
LineBreakMode="CharacterWrap"
|
||||||
StyleClass="text-sm, text-muted"
|
StyleClass="text-sm, text-muted"
|
||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="SendCurrentFileNameLabel" />
|
||||||
<Button
|
<Button
|
||||||
Text="{u:I18n ChooseFile}"
|
Text="{u:I18n ChooseFile}"
|
||||||
IsVisible="{Binding IsAddFromShare, Converter={StaticResource inverseBool}}"
|
IsVisible="{Binding IsAddFromShare, Converter={StaticResource inverseBool}}"
|
||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
StyleClass="box-button-row"
|
StyleClass="box-button-row"
|
||||||
Clicked="ChooseFile_Clicked" />
|
Clicked="ChooseFile_Clicked"
|
||||||
|
AutomationId="SendChooseFileButton" />
|
||||||
<Label
|
<Label
|
||||||
Margin="0, 5, 0, 0"
|
Margin="0, 5, 0, 0"
|
||||||
Text="{u:I18n MaxFileSize}"
|
Text="{u:I18n MaxFileSize}"
|
||||||
@@ -208,6 +218,7 @@
|
|||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Margin="{Binding EditorMargins}"
|
Margin="{Binding EditorMargins}"
|
||||||
|
AutomationId="SendTextContentEntry"
|
||||||
effects:ScrollEnabledEffect.IsScrollEnabled="false" >
|
effects:ScrollEnabledEffect.IsScrollEnabled="false" >
|
||||||
<Editor.Behaviors>
|
<Editor.Behaviors>
|
||||||
<behaviors:EditorPreventAutoBottomScrollingOnFocusedBehavior ParentScrollView="{x:Reference _scrollView}" />
|
<behaviors:EditorPreventAutoBottomScrollingOnFocusedBehavior ParentScrollView="{x:Reference _scrollView}" />
|
||||||
@@ -235,7 +246,8 @@
|
|||||||
IsToggled="{Binding Send.Text.Hidden}"
|
IsToggled="{Binding Send.Text.Hidden}"
|
||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
HorizontalOptions="End"
|
HorizontalOptions="End"
|
||||||
Margin="10,0,0,0" />
|
Margin="10,0,0,0"
|
||||||
|
AutomationId="SendHideTextByDefaultToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout
|
<StackLayout
|
||||||
@@ -249,7 +261,8 @@
|
|||||||
IsToggled="{Binding ShareOnSave}"
|
IsToggled="{Binding ShareOnSave}"
|
||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
HorizontalOptions="End"
|
HorizontalOptions="End"
|
||||||
Margin="10,0,0,0" />
|
Margin="10,0,0,0"
|
||||||
|
AutomationId="SendShareSendAfterSaveToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout
|
<StackLayout
|
||||||
Orientation="Horizontal"
|
Orientation="Horizontal"
|
||||||
@@ -263,21 +276,24 @@
|
|||||||
StyleClass="box-row-button"
|
StyleClass="box-row-button"
|
||||||
TextColor="{DynamicResource PrimaryColor}"
|
TextColor="{DynamicResource PrimaryColor}"
|
||||||
Margin="0"
|
Margin="0"
|
||||||
AutomationProperties.IsInAccessibleTree="False"/>
|
AutomationProperties.IsInAccessibleTree="False"
|
||||||
|
AutomationId="SendShowHideOptionsButton" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
x:Name="_btnOptionsUp"
|
x:Name="_btnOptionsUp"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.ChevronUp}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.ChevronUp}}"
|
||||||
StyleClass="box-row-button"
|
StyleClass="box-row-button"
|
||||||
TextColor="{DynamicResource PrimaryColor}"
|
TextColor="{DynamicResource PrimaryColor}"
|
||||||
IsVisible="{Binding ShowOptions}"
|
IsVisible="{Binding ShowOptions}"
|
||||||
AutomationProperties.IsInAccessibleTree="False"/>
|
AutomationProperties.IsInAccessibleTree="False"
|
||||||
|
AutomationId="SendOptionsDisplayed" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
x:Name="_btnOptionsDown"
|
x:Name="_btnOptionsDown"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.AngleDown}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.AngleDown}}"
|
||||||
StyleClass="box-row-button"
|
StyleClass="box-row-button"
|
||||||
TextColor="{DynamicResource PrimaryColor}"
|
TextColor="{DynamicResource PrimaryColor}"
|
||||||
IsVisible="{Binding ShowOptions, Converter={StaticResource inverseBool}}"
|
IsVisible="{Binding ShowOptions, Converter={StaticResource inverseBool}}"
|
||||||
AutomationProperties.IsInAccessibleTree="False"/>
|
AutomationProperties.IsInAccessibleTree="False"
|
||||||
|
AutomationId="SendOptionsHidden" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout IsVisible="{Binding ShowOptions}">
|
<StackLayout IsVisible="{Binding ShowOptions}">
|
||||||
<StackLayout
|
<StackLayout
|
||||||
@@ -294,7 +310,8 @@
|
|||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n DeletionTime}" />
|
AutomationProperties.Name="{u:I18n DeletionTime}"
|
||||||
|
AutomationId="SendDeletionOptionsPicker" />
|
||||||
<Grid
|
<Grid
|
||||||
IsVisible="{Binding ShowDeletionCustomPickers}"
|
IsVisible="{Binding ShowDeletionCustomPickers}"
|
||||||
Margin="0,5,0,0">
|
Margin="0,5,0,0">
|
||||||
@@ -308,14 +325,16 @@
|
|||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n DeletionDate}"
|
AutomationProperties.Name="{u:I18n DeletionDate}"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="SendCustomDeletionDatePicker" />
|
||||||
<controls:ExtendedTimePicker
|
<controls:ExtendedTimePicker
|
||||||
NullableTime="{Binding DeletionDateTimeViewModel.Time, Mode=TwoWay}"
|
NullableTime="{Binding DeletionDateTimeViewModel.Time, Mode=TwoWay}"
|
||||||
Format="t"
|
Format="t"
|
||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n DeletionTime}"
|
AutomationProperties.Name="{u:I18n DeletionTime}"
|
||||||
Grid.Column="1" />
|
Grid.Column="1"
|
||||||
|
AutomationId="SendCustomDeletionTimePicker" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n DeletionDateInfo}"
|
Text="{u:I18n DeletionDateInfo}"
|
||||||
@@ -334,7 +353,8 @@
|
|||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ExpirationTime}" />
|
AutomationProperties.Name="{u:I18n ExpirationTime}"
|
||||||
|
AutomationId="SendExpirationOptionsPicker" />
|
||||||
<Grid
|
<Grid
|
||||||
IsVisible="{Binding ShowExpirationCustomPickers}"
|
IsVisible="{Binding ShowExpirationCustomPickers}"
|
||||||
Margin="0,5,0,0">
|
Margin="0,5,0,0">
|
||||||
@@ -349,7 +369,8 @@
|
|||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ExpirationDate}"
|
AutomationProperties.Name="{u:I18n ExpirationDate}"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="SendCustomExpirationDatePicker" />
|
||||||
<controls:ExtendedTimePicker
|
<controls:ExtendedTimePicker
|
||||||
NullableTime="{Binding ExpirationDateTimeViewModel.Time, Mode=TwoWay}"
|
NullableTime="{Binding ExpirationDateTimeViewModel.Time, Mode=TwoWay}"
|
||||||
PlaceHolder="--:-- --"
|
PlaceHolder="--:-- --"
|
||||||
@@ -357,7 +378,8 @@
|
|||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ExpirationTime}"
|
AutomationProperties.Name="{u:I18n ExpirationTime}"
|
||||||
Grid.Column="1" />
|
Grid.Column="1"
|
||||||
|
AutomationId="SendCustomExpirationTimePicker" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<StackLayout
|
<StackLayout
|
||||||
Orientation="Horizontal"
|
Orientation="Horizontal"
|
||||||
@@ -374,7 +396,8 @@
|
|||||||
FontSize="{Binding SegmentedButtonFontSize}"
|
FontSize="{Binding SegmentedButtonFontSize}"
|
||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
StyleClass="box-row-button"
|
StyleClass="box-row-button"
|
||||||
Clicked="ClearExpirationDate_Clicked" />
|
Clicked="ClearExpirationDate_Clicked"
|
||||||
|
AutomationId="SendClearExpirationDateButton" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout
|
<StackLayout
|
||||||
@@ -393,13 +416,15 @@
|
|||||||
Keyboard="Numeric"
|
Keyboard="Numeric"
|
||||||
MaxLength="9"
|
MaxLength="9"
|
||||||
TextChanged="OnMaxAccessCountTextChanged"
|
TextChanged="OnMaxAccessCountTextChanged"
|
||||||
HorizontalOptions="FillAndExpand" />
|
HorizontalOptions="FillAndExpand"
|
||||||
|
AutomationId="SendMaxAccessCountEntry" />
|
||||||
<controls:ExtendedStepper
|
<controls:ExtendedStepper
|
||||||
x:Name="_maxAccessCountStepper"
|
x:Name="_maxAccessCountStepper"
|
||||||
Value="{Binding MaxAccessCount}"
|
Value="{Binding MaxAccessCount}"
|
||||||
Maximum="999999999"
|
Maximum="999999999"
|
||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
Margin="10,0,0,0" />
|
Margin="10,0,0,0"
|
||||||
|
AutomationId="SendMaxAccessCountStepper" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n MaximumAccessCountInfo}"
|
Text="{u:I18n MaximumAccessCountInfo}"
|
||||||
@@ -419,7 +444,8 @@
|
|||||||
<Label
|
<Label
|
||||||
Text="{Binding Send.AccessCount, Mode=OneWay}"
|
Text="{Binding Send.AccessCount, Mode=OneWay}"
|
||||||
StyleClass="box-label"
|
StyleClass="box-label"
|
||||||
VerticalTextAlignment="Center" />
|
VerticalTextAlignment="Center"
|
||||||
|
AutomationId="SendCurrentAccessCountLabel" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout
|
<StackLayout
|
||||||
@@ -436,7 +462,8 @@
|
|||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
IsSpellCheckEnabled="False"
|
IsSpellCheckEnabled="False"
|
||||||
IsTextPredictionEnabled="False"
|
IsTextPredictionEnabled="False"
|
||||||
HorizontalOptions="FillAndExpand" />
|
HorizontalOptions="FillAndExpand"
|
||||||
|
AutomationId="SendNewPasswordEntry" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
@@ -445,7 +472,8 @@
|
|||||||
Margin="10,0,0,0"
|
Margin="10,0,0,0"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}" />
|
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
|
||||||
|
AutomationId="SendShowHidePasswordButton" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n PasswordInfo}"
|
Text="{u:I18n PasswordInfo}"
|
||||||
@@ -464,7 +492,8 @@
|
|||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Margin="{Binding EditorMargins}"
|
Margin="{Binding EditorMargins}"
|
||||||
effects:ScrollEnabledEffect.IsScrollEnabled="false" >
|
effects:ScrollEnabledEffect.IsScrollEnabled="false"
|
||||||
|
AutomationId="SendNotesEntry">
|
||||||
<Editor.Behaviors>
|
<Editor.Behaviors>
|
||||||
<behaviors:EditorPreventAutoBottomScrollingOnFocusedBehavior ParentScrollView="{x:Reference _scrollView}" />
|
<behaviors:EditorPreventAutoBottomScrollingOnFocusedBehavior ParentScrollView="{x:Reference _scrollView}" />
|
||||||
</Editor.Behaviors>
|
</Editor.Behaviors>
|
||||||
@@ -492,7 +521,8 @@
|
|||||||
IsToggled="{Binding Send.HideEmail}"
|
IsToggled="{Binding Send.HideEmail}"
|
||||||
IsEnabled="{Binding DisableHideEmailControl, Converter={StaticResource inverseBool}}"
|
IsEnabled="{Binding DisableHideEmailControl, Converter={StaticResource inverseBool}}"
|
||||||
HorizontalOptions="End"
|
HorizontalOptions="End"
|
||||||
Margin="10,0,0,0" />
|
Margin="10,0,0,0"
|
||||||
|
AutomationId="SendHideEmailSwitch" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout
|
<StackLayout
|
||||||
StyleClass="box-row, box-row-switch"
|
StyleClass="box-row, box-row-switch"
|
||||||
@@ -506,7 +536,8 @@
|
|||||||
IsToggled="{Binding Send.Disabled}"
|
IsToggled="{Binding Send.Disabled}"
|
||||||
IsEnabled="{Binding SendEnabled}"
|
IsEnabled="{Binding SendEnabled}"
|
||||||
HorizontalOptions="End"
|
HorizontalOptions="End"
|
||||||
Margin="10,0,0,0" />
|
Margin="10,0,0,0"
|
||||||
|
AutomationId="SendDeactivateSwitch" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,8 @@
|
|||||||
Priority="-2"
|
Priority="-2"
|
||||||
UseOriginalImage="True"
|
UseOriginalImage="True"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Account}" />
|
AutomationProperties.Name="{u:I18n Account}"
|
||||||
|
AutomationId="AccountIconButton" />
|
||||||
<ToolbarItem Text="{u:I18n Cancel}" Clicked="Close_Clicked" Order="Primary" Priority="-1" x:Name="_closeItem" />
|
<ToolbarItem Text="{u:I18n Cancel}" Clicked="Close_Clicked" Order="Primary" Priority="-1" x:Name="_closeItem" />
|
||||||
<ToolbarItem Text="{u:I18n Save}" Clicked="Save_Clicked" Order="Primary" x:Name="_saveItem"/>
|
<ToolbarItem Text="{u:I18n Save}" Clicked="Save_Clicked" Order="Primary" x:Name="_saveItem"/>
|
||||||
</ContentPage.ToolbarItems>
|
</ContentPage.ToolbarItems>
|
||||||
|
|||||||
@@ -44,13 +44,15 @@
|
|||||||
<controls:SendViewCell
|
<controls:SendViewCell
|
||||||
Send="{Binding Send}"
|
Send="{Binding Send}"
|
||||||
ButtonCommand="{Binding BindingContext.SendOptionsCommand, Source={x:Reference _page}}"
|
ButtonCommand="{Binding BindingContext.SendOptionsCommand, Source={x:Reference _page}}"
|
||||||
ShowOptions="{Binding BindingContext.SendEnabled, Source={x:Reference _page}}" />
|
ShowOptions="{Binding BindingContext.SendEnabled, Source={x:Reference _page}}"
|
||||||
|
AutomationId="SendCell" />
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
|
|
||||||
<DataTemplate x:Key="sendGroupTemplate"
|
<DataTemplate x:Key="sendGroupTemplate"
|
||||||
x:DataType="pages:SendGroupingsPageListItem">
|
x:DataType="pages:SendGroupingsPageListItem">
|
||||||
<controls:ExtendedStackLayout Orientation="Horizontal"
|
<controls:ExtendedStackLayout Orientation="Horizontal"
|
||||||
StyleClass="list-row, list-row-platform">
|
StyleClass="list-row, list-row-platform"
|
||||||
|
AutomationId="{Binding AutomationId}">
|
||||||
<controls:IconLabel Text="{Binding Icon, Mode=OneWay}"
|
<controls:IconLabel Text="{Binding Icon, Mode=OneWay}"
|
||||||
HorizontalOptions="Start"
|
HorizontalOptions="Start"
|
||||||
VerticalOptions="Center"
|
VerticalOptions="Center"
|
||||||
@@ -64,12 +66,14 @@
|
|||||||
LineBreakMode="TailTruncation"
|
LineBreakMode="TailTruncation"
|
||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
StyleClass="list-title" />
|
StyleClass="list-title"
|
||||||
|
AutomationId="SendFilterNameLabel" />
|
||||||
<Label Text="{Binding ItemCount, Mode=OneWay}"
|
<Label Text="{Binding ItemCount, Mode=OneWay}"
|
||||||
HorizontalOptions="End"
|
HorizontalOptions="End"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
HorizontalTextAlignment="End"
|
HorizontalTextAlignment="End"
|
||||||
StyleClass="list-sub" />
|
StyleClass="list-sub"
|
||||||
|
AutomationId="SendFilterCountLabel" />
|
||||||
</controls:ExtendedStackLayout>
|
</controls:ExtendedStackLayout>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
|
|
||||||
|
|||||||
@@ -66,5 +66,27 @@ namespace Bit.App.Pages
|
|||||||
return _icon;
|
return _icon;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string AutomationId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_name != null)
|
||||||
|
{
|
||||||
|
return "SendItem";
|
||||||
|
}
|
||||||
|
if (Type != null)
|
||||||
|
{
|
||||||
|
switch (Type.Value)
|
||||||
|
{
|
||||||
|
case SendType.Text:
|
||||||
|
return "SendTextFilter";
|
||||||
|
case SendType.File:
|
||||||
|
return "SendFileFilter";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,8 @@
|
|||||||
Margin="20, 0"
|
Margin="20, 0"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
HorizontalOptions="CenterAndExpand"
|
HorizontalOptions="CenterAndExpand"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="NoSendDisplayedLabel" />
|
||||||
<controls:ExtendedCollectionView
|
<controls:ExtendedCollectionView
|
||||||
IsVisible="{Binding ShowList}"
|
IsVisible="{Binding ShowList}"
|
||||||
ItemsSource="{Binding Sends}"
|
ItemsSource="{Binding Sends}"
|
||||||
@@ -67,13 +68,15 @@
|
|||||||
SelectionMode="Single"
|
SelectionMode="Single"
|
||||||
SelectionChanged="RowSelected"
|
SelectionChanged="RowSelected"
|
||||||
StyleClass="list, list-platform"
|
StyleClass="list, list-platform"
|
||||||
ExtraDataForLogging="Sends Page">
|
ExtraDataForLogging="Sends Page"
|
||||||
|
AutomationId="SendCellList">
|
||||||
<CollectionView.ItemTemplate>
|
<CollectionView.ItemTemplate>
|
||||||
<DataTemplate x:DataType="views:SendView">
|
<DataTemplate x:DataType="views:SendView">
|
||||||
<controls:SendViewCell
|
<controls:SendViewCell
|
||||||
Send="{Binding .}"
|
Send="{Binding .}"
|
||||||
ButtonCommand="{Binding BindingContext.SendOptionsCommand, Source={x:Reference _page}}"
|
ButtonCommand="{Binding BindingContext.SendOptionsCommand, Source={x:Reference _page}}"
|
||||||
ShowOptions="{Binding BindingContext.SendEnabled, Source={x:Reference _page}}" />
|
ShowOptions="{Binding BindingContext.SendEnabled, Source={x:Reference _page}}"
|
||||||
|
AutomationId="SendCell" />
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</CollectionView.ItemTemplate>
|
</CollectionView.ItemTemplate>
|
||||||
</controls:ExtendedCollectionView>
|
</controls:ExtendedCollectionView>
|
||||||
|
|||||||
86
src/App/Pages/Settings/BlockAutofillUrisPage.xaml
Normal file
86
src/App/Pages/Settings/BlockAutofillUrisPage.xaml
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<pages:BaseContentPage xmlns="http://xamarin.com/schemas/2014/forms"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="Bit.App.Pages.BlockAutofillUrisPage"
|
||||||
|
xmlns:pages="clr-namespace:Bit.App.Pages"
|
||||||
|
xmlns:controls="clr-namespace:Bit.App.Controls"
|
||||||
|
xmlns:u="clr-namespace:Bit.App.Utilities"
|
||||||
|
xmlns:core="clr-namespace:Bit.Core;assembly=BitwardenCore"
|
||||||
|
x:DataType="pages:BlockAutofillUrisPageViewModel"
|
||||||
|
NavigationPage.HasBackButton="False"
|
||||||
|
Title="{u:I18n BlockAutoFill}">
|
||||||
|
<ContentPage.BindingContext>
|
||||||
|
<pages:BlockAutofillUrisPageViewModel />
|
||||||
|
</ContentPage.BindingContext>
|
||||||
|
<ContentPage.Resources>
|
||||||
|
<ResourceDictionary>
|
||||||
|
<u:InverseBoolConverter x:Key="inverseBool" />
|
||||||
|
</ResourceDictionary>
|
||||||
|
</ContentPage.Resources>
|
||||||
|
<StackLayout Orientation="Vertical">
|
||||||
|
<Image
|
||||||
|
x:Name="_emptyUrisPlaceholder"
|
||||||
|
HorizontalOptions="Center"
|
||||||
|
WidthRequest="120"
|
||||||
|
HeightRequest="120"
|
||||||
|
Margin="0,100,0,0"
|
||||||
|
IsVisible="{Binding ShowList, Converter={StaticResource inverseBool}}"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n ThereAreNoBlockedURIs}" />
|
||||||
|
<controls:CustomLabel
|
||||||
|
StyleClass="box-label-regular"
|
||||||
|
Text="{u:I18n AutoFillWillNotBeOfferedForTheseURIs}"
|
||||||
|
FontWeight="500"
|
||||||
|
HorizontalTextAlignment="Center"
|
||||||
|
Margin="14,10,14,0"/>
|
||||||
|
<controls:ExtendedCollectionView
|
||||||
|
ItemsSource="{Binding BlockedUris}"
|
||||||
|
IsVisible="{Binding ShowList}"
|
||||||
|
VerticalOptions="FillAndExpand"
|
||||||
|
Margin="0,5,0,0"
|
||||||
|
SelectionMode="None"
|
||||||
|
StyleClass="list, list-platform"
|
||||||
|
ExtraDataForLogging="Blocked Autofill Uris"
|
||||||
|
AutomationId="BlockedUrisCellList">
|
||||||
|
<CollectionView.ItemTemplate>
|
||||||
|
<DataTemplate x:DataType="pages:BlockAutofillUriItemViewModel">
|
||||||
|
<StackLayout
|
||||||
|
Orientation="Vertical"
|
||||||
|
AutomationId="BlockedUriCell">
|
||||||
|
<StackLayout
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<controls:CustomLabel
|
||||||
|
VerticalOptions="Center"
|
||||||
|
StyleClass="box-label-regular"
|
||||||
|
Text="{Binding Uri}"
|
||||||
|
MaxLines="2"
|
||||||
|
LineBreakMode="TailTruncation"
|
||||||
|
FontWeight="500"
|
||||||
|
Margin="15,0,0,0"
|
||||||
|
HorizontalOptions="StartAndExpand"/>
|
||||||
|
<controls:IconButton
|
||||||
|
StyleClass="box-row-button-muted, box-row-button-platform"
|
||||||
|
Text="{Binding Source={x:Static core:BitwardenIcons.PencilSquare}}"
|
||||||
|
Command="{Binding EditUriCommand}"
|
||||||
|
Margin="5,0,15,0"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n EditURI}"
|
||||||
|
AutomationId="EditUriButton" />
|
||||||
|
</StackLayout>
|
||||||
|
<BoxView StyleClass="box-row-separator" />
|
||||||
|
</StackLayout>
|
||||||
|
</DataTemplate>
|
||||||
|
</CollectionView.ItemTemplate>
|
||||||
|
</controls:ExtendedCollectionView>
|
||||||
|
<Button
|
||||||
|
Text="{u:I18n NewBlockedURI}"
|
||||||
|
Command="{Binding AddUriCommand}"
|
||||||
|
VerticalOptions="End"
|
||||||
|
HeightRequest="40"
|
||||||
|
Opacity="0.8"
|
||||||
|
Margin="14,5,14,10"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n NewBlockedURI}"
|
||||||
|
AutomationId="NewBlockedUriButton" />
|
||||||
|
</StackLayout>
|
||||||
|
</pages:BaseContentPage>
|
||||||
44
src/App/Pages/Settings/BlockAutofillUrisPage.xaml.cs
Normal file
44
src/App/Pages/Settings/BlockAutofillUrisPage.xaml.cs
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
using Bit.App.Styles;
|
||||||
|
using Bit.App.Utilities;
|
||||||
|
using Bit.Core.Utilities;
|
||||||
|
using Xamarin.Essentials;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Bit.App.Pages
|
||||||
|
{
|
||||||
|
public partial class BlockAutofillUrisPage : BaseContentPage, IThemeDirtablePage
|
||||||
|
{
|
||||||
|
private readonly BlockAutofillUrisPageViewModel _vm;
|
||||||
|
|
||||||
|
public BlockAutofillUrisPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
_vm = BindingContext as BlockAutofillUrisPageViewModel;
|
||||||
|
_vm.Page = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnAppearing()
|
||||||
|
{
|
||||||
|
base.OnAppearing();
|
||||||
|
|
||||||
|
_vm.InitAsync().FireAndForget(_ => Navigation.PopAsync());
|
||||||
|
|
||||||
|
UpdatePlaceholder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task UpdateOnThemeChanged()
|
||||||
|
{
|
||||||
|
await base.UpdateOnThemeChanged();
|
||||||
|
|
||||||
|
UpdatePlaceholder();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdatePlaceholder()
|
||||||
|
{
|
||||||
|
MainThread.BeginInvokeOnMainThread(() =>
|
||||||
|
_emptyUrisPlaceholder.Source = ImageSource.FromFile(ThemeManager.UsingLightTheme ? "empty_uris_placeholder" : "empty_uris_placeholder_dark"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
186
src/App/Pages/Settings/BlockAutofillUrisPageViewModel.cs
Normal file
186
src/App/Pages/Settings/BlockAutofillUrisPageViewModel.cs
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using Bit.App.Abstractions;
|
||||||
|
using Bit.App.Resources;
|
||||||
|
using Bit.Core;
|
||||||
|
using Bit.Core.Abstractions;
|
||||||
|
using Bit.Core.Utilities;
|
||||||
|
using Xamarin.CommunityToolkit.ObjectModel;
|
||||||
|
using Xamarin.Essentials;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Bit.App.Pages
|
||||||
|
{
|
||||||
|
public class BlockAutofillUrisPageViewModel : BaseViewModel
|
||||||
|
{
|
||||||
|
private const char URI_SEPARARTOR = ',';
|
||||||
|
private const string URI_FORMAT = "https://domain.com";
|
||||||
|
|
||||||
|
private readonly IStateService _stateService;
|
||||||
|
private readonly IDeviceActionService _deviceActionService;
|
||||||
|
|
||||||
|
public BlockAutofillUrisPageViewModel()
|
||||||
|
{
|
||||||
|
_stateService = ServiceContainer.Resolve<IStateService>();
|
||||||
|
_deviceActionService = ServiceContainer.Resolve<IDeviceActionService>();
|
||||||
|
|
||||||
|
AddUriCommand = new AsyncCommand(AddUriAsync,
|
||||||
|
onException: ex => HandleException(ex),
|
||||||
|
allowsMultipleExecutions: false);
|
||||||
|
|
||||||
|
EditUriCommand = new AsyncCommand<BlockAutofillUriItemViewModel>(EditUriAsync,
|
||||||
|
onException: ex => HandleException(ex),
|
||||||
|
allowsMultipleExecutions: false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ObservableRangeCollection<BlockAutofillUriItemViewModel> BlockedUris { get; set; } = new ObservableRangeCollection<BlockAutofillUriItemViewModel>();
|
||||||
|
|
||||||
|
public bool ShowList => BlockedUris.Any();
|
||||||
|
|
||||||
|
public ICommand AddUriCommand { get; }
|
||||||
|
|
||||||
|
public ICommand EditUriCommand { get; }
|
||||||
|
|
||||||
|
public async Task InitAsync()
|
||||||
|
{
|
||||||
|
var blockedUrisList = await _stateService.GetAutofillBlacklistedUrisAsync();
|
||||||
|
if (blockedUrisList?.Any() != true)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await MainThread.InvokeOnMainThreadAsync(() =>
|
||||||
|
{
|
||||||
|
BlockedUris.AddRange(blockedUrisList.OrderBy(uri => uri).Select(u => new BlockAutofillUriItemViewModel(u, EditUriCommand)).ToList());
|
||||||
|
TriggerPropertyChanged(nameof(ShowList));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task AddUriAsync()
|
||||||
|
{
|
||||||
|
var response = await _deviceActionService.DisplayValidatablePromptAsync(new Utilities.Prompts.ValidatablePromptConfig
|
||||||
|
{
|
||||||
|
Title = AppResources.NewUri,
|
||||||
|
Subtitle = AppResources.EnterURI,
|
||||||
|
ValueSubInfo = string.Format(AppResources.FormatXSeparateMultipleURIsWithAComma, URI_FORMAT),
|
||||||
|
OkButtonText = AppResources.Save,
|
||||||
|
ValidateText = text => ValidateUris(text, true)
|
||||||
|
});
|
||||||
|
if (response?.Text is null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await MainThread.InvokeOnMainThreadAsync(() =>
|
||||||
|
{
|
||||||
|
foreach (var uri in response.Value.Text.Split(URI_SEPARARTOR).Where(s => !string.IsNullOrEmpty(s)))
|
||||||
|
{
|
||||||
|
var cleanedUri = uri.Replace(Environment.NewLine, string.Empty).Trim();
|
||||||
|
BlockedUris.Add(new BlockAutofillUriItemViewModel(cleanedUri, EditUriCommand));
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockedUris = new ObservableRangeCollection<BlockAutofillUriItemViewModel>(BlockedUris.OrderBy(b => b.Uri));
|
||||||
|
TriggerPropertyChanged(nameof(BlockedUris));
|
||||||
|
TriggerPropertyChanged(nameof(ShowList));
|
||||||
|
});
|
||||||
|
await UpdateAutofillBlacklistedUrisAsync();
|
||||||
|
_deviceActionService.Toast(AppResources.URISaved);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task EditUriAsync(BlockAutofillUriItemViewModel uriItemViewModel)
|
||||||
|
{
|
||||||
|
var response = await _deviceActionService.DisplayValidatablePromptAsync(new Utilities.Prompts.ValidatablePromptConfig
|
||||||
|
{
|
||||||
|
Title = AppResources.EditURI,
|
||||||
|
Subtitle = AppResources.EnterURI,
|
||||||
|
Text = uriItemViewModel.Uri,
|
||||||
|
ValueSubInfo = string.Format(AppResources.FormatX, URI_FORMAT),
|
||||||
|
OkButtonText = AppResources.Save,
|
||||||
|
ThirdButtonText = AppResources.Remove,
|
||||||
|
ValidateText = text => ValidateUris(text, false)
|
||||||
|
});
|
||||||
|
if (response is null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response.Value.ExecuteThirdAction)
|
||||||
|
{
|
||||||
|
await MainThread.InvokeOnMainThreadAsync(() =>
|
||||||
|
{
|
||||||
|
BlockedUris.Remove(uriItemViewModel);
|
||||||
|
TriggerPropertyChanged(nameof(ShowList));
|
||||||
|
});
|
||||||
|
await UpdateAutofillBlacklistedUrisAsync();
|
||||||
|
_deviceActionService.Toast(AppResources.URIRemoved);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var cleanedUri = response.Value.Text.Replace(Environment.NewLine, string.Empty).Trim();
|
||||||
|
await MainThread.InvokeOnMainThreadAsync(() =>
|
||||||
|
{
|
||||||
|
BlockedUris.Remove(uriItemViewModel);
|
||||||
|
BlockedUris.Add(new BlockAutofillUriItemViewModel(cleanedUri, EditUriCommand));
|
||||||
|
BlockedUris = new ObservableRangeCollection<BlockAutofillUriItemViewModel>(BlockedUris.OrderBy(b => b.Uri));
|
||||||
|
TriggerPropertyChanged(nameof(BlockedUris));
|
||||||
|
TriggerPropertyChanged(nameof(ShowList));
|
||||||
|
});
|
||||||
|
await UpdateAutofillBlacklistedUrisAsync();
|
||||||
|
_deviceActionService.Toast(AppResources.URISaved);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string ValidateUris(string uris, bool allowMultipleUris)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(uris))
|
||||||
|
{
|
||||||
|
return string.Format(AppResources.FormatX, URI_FORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!allowMultipleUris && uris.Contains(URI_SEPARARTOR))
|
||||||
|
{
|
||||||
|
return AppResources.CannotEditMultipleURIsAtOnce;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var uri in uris.Split(URI_SEPARARTOR).Where(u => !string.IsNullOrWhiteSpace(u)))
|
||||||
|
{
|
||||||
|
var cleanedUri = uri.Replace(Environment.NewLine, string.Empty).Trim();
|
||||||
|
if (!cleanedUri.StartsWith("http://") && !cleanedUri.StartsWith("https://") &&
|
||||||
|
!cleanedUri.StartsWith(Constants.AndroidAppProtocol))
|
||||||
|
{
|
||||||
|
return AppResources.InvalidFormatUseHttpsHttpOrAndroidApp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Uri.TryCreate(cleanedUri, UriKind.Absolute, out var _))
|
||||||
|
{
|
||||||
|
return AppResources.InvalidURI;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BlockedUris.Any(uriItem => uriItem.Uri == cleanedUri))
|
||||||
|
{
|
||||||
|
return string.Format(AppResources.TheURIXIsAlreadyBlocked, cleanedUri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task UpdateAutofillBlacklistedUrisAsync()
|
||||||
|
{
|
||||||
|
await _stateService.SetAutofillBlacklistedUrisAsync(BlockedUris.Any() ? BlockedUris.Select(bu => bu.Uri).ToList() : null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BlockAutofillUriItemViewModel : ExtendedViewModel
|
||||||
|
{
|
||||||
|
public BlockAutofillUriItemViewModel(string uri, ICommand editUriCommand)
|
||||||
|
{
|
||||||
|
Uri = uri;
|
||||||
|
EditUriCommand = new Command(() => editUriCommand.Execute(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Uri { get; }
|
||||||
|
|
||||||
|
public ICommand EditUriCommand { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,8 +13,13 @@
|
|||||||
</ContentPage.BindingContext>
|
</ContentPage.BindingContext>
|
||||||
|
|
||||||
<ContentPage.ToolbarItems>
|
<ContentPage.ToolbarItems>
|
||||||
<ToolbarItem Text="{u:I18n Cancel}" Clicked="Close_Clicked" Order="Primary" Priority="-1" />
|
<ToolbarItem Text="{u:I18n Cancel}"
|
||||||
<ToolbarItem Text="{u:I18n Save}" Clicked="Save_Clicked" Order="Primary" />
|
Clicked="Close_Clicked"
|
||||||
|
Order="Primary"
|
||||||
|
Priority="-1" />
|
||||||
|
<ToolbarItem Text="{u:I18n Save}"
|
||||||
|
Clicked="Save_Clicked"
|
||||||
|
Order="Primary" />
|
||||||
<ToolbarItem Text="{u:I18n Delete}"
|
<ToolbarItem Text="{u:I18n Delete}"
|
||||||
Clicked="Delete_Clicked"
|
Clicked="Delete_Clicked"
|
||||||
Order="Secondary"
|
Order="Secondary"
|
||||||
@@ -43,7 +48,8 @@
|
|||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
x:Name="_nameEntry"
|
x:Name="_nameEntry"
|
||||||
ReturnType="Go"
|
ReturnType="Go"
|
||||||
ReturnCommand="{Binding SubmitCommand}" />
|
ReturnCommand="{Binding SubmitCommand}"
|
||||||
|
AutomationId="FolderNameEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
|
|||||||
@@ -31,7 +31,8 @@
|
|||||||
Margin="20, 0"
|
Margin="20, 0"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
HorizontalOptions="CenterAndExpand"
|
HorizontalOptions="CenterAndExpand"
|
||||||
HorizontalTextAlignment="Center"></Label>
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="NoFoldersLabel"></Label>
|
||||||
<controls:ExtendedCollectionView
|
<controls:ExtendedCollectionView
|
||||||
IsVisible="{Binding ShowNoData, Converter={StaticResource inverseBool}}"
|
IsVisible="{Binding ShowNoData, Converter={StaticResource inverseBool}}"
|
||||||
ItemsSource="{Binding Folders}"
|
ItemsSource="{Binding Folders}"
|
||||||
@@ -44,10 +45,12 @@
|
|||||||
<DataTemplate x:DataType="views:FolderView">
|
<DataTemplate x:DataType="views:FolderView">
|
||||||
<controls:ExtendedStackLayout
|
<controls:ExtendedStackLayout
|
||||||
StyleClass="list-row, list-row-platform"
|
StyleClass="list-row, list-row-platform"
|
||||||
Padding="10">
|
Padding="10"
|
||||||
|
AutomationId="FolderCell">
|
||||||
<Label LineBreakMode="TailTruncation"
|
<Label LineBreakMode="TailTruncation"
|
||||||
StyleClass="list-title, list-title-platform"
|
StyleClass="list-title, list-title-platform"
|
||||||
Text="{Binding Name, Mode=OneWay}" />
|
Text="{Binding Name, Mode=OneWay}"
|
||||||
|
AutomationId="FolderName" />
|
||||||
</controls:ExtendedStackLayout>
|
</controls:ExtendedStackLayout>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</CollectionView.ItemTemplate>
|
</CollectionView.ItemTemplate>
|
||||||
|
|||||||
@@ -27,7 +27,8 @@
|
|||||||
x:Name="_themePicker"
|
x:Name="_themePicker"
|
||||||
ItemsSource="{Binding ThemeOptions, Mode=OneTime}"
|
ItemsSource="{Binding ThemeOptions, Mode=OneTime}"
|
||||||
SelectedIndex="{Binding ThemeSelectedIndex}"
|
SelectedIndex="{Binding ThemeSelectedIndex}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ThemeSelectorPicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label
|
<Label
|
||||||
StyleClass="box-footer-label"
|
StyleClass="box-footer-label"
|
||||||
@@ -44,7 +45,8 @@
|
|||||||
x:Name="_autoDarkThemePicker"
|
x:Name="_autoDarkThemePicker"
|
||||||
ItemsSource="{Binding AutoDarkThemeOptions, Mode=OneTime}"
|
ItemsSource="{Binding AutoDarkThemeOptions, Mode=OneTime}"
|
||||||
SelectedIndex="{Binding AutoDarkThemeSelectedIndex}"
|
SelectedIndex="{Binding AutoDarkThemeSelectedIndex}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="DefaultDarkThemePicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label
|
<Label
|
||||||
StyleClass="box-footer-label"
|
StyleClass="box-footer-label"
|
||||||
@@ -59,7 +61,8 @@
|
|||||||
x:Name="_uriMatchPicker"
|
x:Name="_uriMatchPicker"
|
||||||
ItemsSource="{Binding UriMatchOptions, Mode=OneTime}"
|
ItemsSource="{Binding UriMatchOptions, Mode=OneTime}"
|
||||||
SelectedIndex="{Binding UriMatchSelectedIndex}"
|
SelectedIndex="{Binding UriMatchSelectedIndex}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="DefaultUriMatchDetectionPicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n DefaultUriMatchDetectionDescription}"
|
Text="{u:I18n DefaultUriMatchDetectionDescription}"
|
||||||
@@ -74,7 +77,8 @@
|
|||||||
x:Name="_clearClipboardPicker"
|
x:Name="_clearClipboardPicker"
|
||||||
ItemsSource="{Binding ClearClipboardOptions, Mode=OneTime}"
|
ItemsSource="{Binding ClearClipboardOptions, Mode=OneTime}"
|
||||||
SelectedIndex="{Binding ClearClipboardSelectedIndex}"
|
SelectedIndex="{Binding ClearClipboardSelectedIndex}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ClearClipboardPicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n ClearClipboardDescription}"
|
Text="{u:I18n ClearClipboardDescription}"
|
||||||
@@ -90,7 +94,8 @@
|
|||||||
ItemsSource="{Binding LocalesOptions, Mode=OneTime}"
|
ItemsSource="{Binding LocalesOptions, Mode=OneTime}"
|
||||||
SelectedItem="{Binding SelectedLocale}"
|
SelectedItem="{Binding SelectedLocale}"
|
||||||
ItemDisplayBinding="{Binding Value}"
|
ItemDisplayBinding="{Binding Value}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="LanguagePicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n LanguageChangeRequiresAppRestart}"
|
Text="{u:I18n LanguageChangeRequiresAppRestart}"
|
||||||
@@ -105,7 +110,8 @@
|
|||||||
<Switch
|
<Switch
|
||||||
IsToggled="{Binding AutoTotpCopy}"
|
IsToggled="{Binding AutoTotpCopy}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End" />
|
HorizontalOptions="End"
|
||||||
|
AutomationId="CopyTotpAutomaticallyToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n CopyTotpAutomaticallyDescription}"
|
Text="{u:I18n CopyTotpAutomaticallyDescription}"
|
||||||
@@ -120,7 +126,8 @@
|
|||||||
<Switch
|
<Switch
|
||||||
IsToggled="{Binding Favicon}"
|
IsToggled="{Binding Favicon}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End" />
|
HorizontalOptions="End"
|
||||||
|
AutomationId="ShowWebsiteIconsToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n ShowWebsiteIconsDescription}"
|
Text="{u:I18n ShowWebsiteIconsDescription}"
|
||||||
@@ -146,22 +153,14 @@
|
|||||||
StyleClass="box-footer-label, box-footer-label-switch" />
|
StyleClass="box-footer-label, box-footer-label-switch" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box" IsVisible="{Binding ShowAndroidAutofillSettings}">
|
<StackLayout StyleClass="box" IsVisible="{Binding ShowAndroidAutofillSettings}">
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout.GestureRecognizers>
|
||||||
|
<TapGestureRecognizer Command="{Binding GoToBlockAutofillUrisCommand}" />
|
||||||
|
</StackLayout.GestureRecognizers>
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n AutofillBlockedUris}"
|
Text="{u:I18n BlockAutoFill}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label-regular" />
|
||||||
<Editor
|
|
||||||
x:Name="_autofillBlockedUrisEditor"
|
|
||||||
Text="{Binding AutofillBlockedUris}"
|
|
||||||
StyleClass="box-value"
|
|
||||||
AutoSize="TextChanges"
|
|
||||||
IsSpellCheckEnabled="False"
|
|
||||||
IsTextPredictionEnabled="False"
|
|
||||||
Keyboard="Url"
|
|
||||||
Unfocused="AutofillBlockedUrisEditor_Unfocused" />
|
|
||||||
</StackLayout>
|
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n AutofillBlockedUrisDescription}"
|
Text="{u:I18n AutoFillWillNotBeOfferedForTheseURIs}"
|
||||||
StyleClass="box-footer-label" />
|
StyleClass="box-footer-label" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
using Bit.App.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.App.Resources;
|
|
||||||
using Bit.Core.Abstractions;
|
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
using Xamarin.Forms.PlatformConfiguration;
|
using Xamarin.Forms.PlatformConfiguration;
|
||||||
@@ -44,17 +42,6 @@ namespace Bit.App.Pages
|
|||||||
await _vm.InitAsync();
|
await _vm.InitAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async override void OnDisappearing()
|
|
||||||
{
|
|
||||||
base.OnDisappearing();
|
|
||||||
await _vm.UpdateAutofillBlockedUris();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void AutofillBlockedUrisEditor_Unfocused(object sender, FocusEventArgs e)
|
|
||||||
{
|
|
||||||
await _vm.UpdateAutofillBlockedUris();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void Close_Clicked(object sender, System.EventArgs e)
|
private async void Close_Clicked(object sender, System.EventArgs e)
|
||||||
{
|
{
|
||||||
if (DoOnce())
|
if (DoOnce())
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Input;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
using Bit.App.Utilities;
|
using Bit.App.Utilities;
|
||||||
using Bit.Core;
|
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
|
using Xamarin.CommunityToolkit.ObjectModel;
|
||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
|
|
||||||
namespace Bit.App.Pages
|
namespace Bit.App.Pages
|
||||||
@@ -19,7 +20,6 @@ namespace Bit.App.Pages
|
|||||||
private readonly IPlatformUtilsService _platformUtilsService;
|
private readonly IPlatformUtilsService _platformUtilsService;
|
||||||
|
|
||||||
private bool _autofillSavePrompt;
|
private bool _autofillSavePrompt;
|
||||||
private string _autofillBlockedUris;
|
|
||||||
private bool _favicon;
|
private bool _favicon;
|
||||||
private bool _autoTotpCopy;
|
private bool _autoTotpCopy;
|
||||||
private int _clearClipboardSelectedIndex;
|
private int _clearClipboardSelectedIndex;
|
||||||
@@ -84,6 +84,10 @@ namespace Bit.App.Pages
|
|||||||
new KeyValuePair<string, string>(null, AppResources.DefaultSystem)
|
new KeyValuePair<string, string>(null, AppResources.DefaultSystem)
|
||||||
};
|
};
|
||||||
LocalesOptions.AddRange(_i18nService.LocaleNames.ToList());
|
LocalesOptions.AddRange(_i18nService.LocaleNames.ToList());
|
||||||
|
|
||||||
|
GoToBlockAutofillUrisCommand = new AsyncCommand(() => Page.Navigation.PushAsync(new BlockAutofillUrisPage()),
|
||||||
|
onException: ex => HandleException(ex),
|
||||||
|
allowsMultipleExecutions: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<KeyValuePair<int?, string>> ClearClipboardOptions { get; set; }
|
public List<KeyValuePair<int?, string>> ClearClipboardOptions { get; set; }
|
||||||
@@ -192,25 +196,18 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string AutofillBlockedUris
|
|
||||||
{
|
|
||||||
get => _autofillBlockedUris;
|
|
||||||
set => SetProperty(ref _autofillBlockedUris, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ShowAndroidAutofillSettings
|
public bool ShowAndroidAutofillSettings
|
||||||
{
|
{
|
||||||
get => _showAndroidAutofillSettings;
|
get => _showAndroidAutofillSettings;
|
||||||
set => SetProperty(ref _showAndroidAutofillSettings, value);
|
set => SetProperty(ref _showAndroidAutofillSettings, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ICommand GoToBlockAutofillUrisCommand { get; }
|
||||||
|
|
||||||
public async Task InitAsync()
|
public async Task InitAsync()
|
||||||
{
|
{
|
||||||
AutofillSavePrompt = !(await _stateService.GetAutofillDisableSavePromptAsync()).GetValueOrDefault();
|
AutofillSavePrompt = !(await _stateService.GetAutofillDisableSavePromptAsync()).GetValueOrDefault();
|
||||||
|
|
||||||
var blockedUrisList = await _stateService.GetAutofillBlacklistedUrisAsync();
|
|
||||||
AutofillBlockedUris = blockedUrisList != null ? string.Join(", ", blockedUrisList) : null;
|
|
||||||
|
|
||||||
AutoTotpCopy = !(await _stateService.GetDisableAutoTotpCopyAsync() ?? false);
|
AutoTotpCopy = !(await _stateService.GetDisableAutoTotpCopyAsync() ?? false);
|
||||||
|
|
||||||
Favicon = !(await _stateService.GetDisableFaviconAsync()).GetValueOrDefault();
|
Favicon = !(await _stateService.GetDisableFaviconAsync()).GetValueOrDefault();
|
||||||
@@ -288,41 +285,6 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateAutofillBlockedUris()
|
|
||||||
{
|
|
||||||
if (_inited)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrWhiteSpace(AutofillBlockedUris))
|
|
||||||
{
|
|
||||||
await _stateService.SetAutofillBlacklistedUrisAsync(null);
|
|
||||||
AutofillBlockedUris = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var csv = AutofillBlockedUris;
|
|
||||||
var urisList = new List<string>();
|
|
||||||
foreach (var uri in csv.Split(','))
|
|
||||||
{
|
|
||||||
if (string.IsNullOrWhiteSpace(uri))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
var cleanedUri = uri.Replace(System.Environment.NewLine, string.Empty).Trim();
|
|
||||||
if (!cleanedUri.StartsWith("http://") && !cleanedUri.StartsWith("https://") &&
|
|
||||||
!cleanedUri.StartsWith(Constants.AndroidAppProtocol))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
urisList.Add(cleanedUri);
|
|
||||||
}
|
|
||||||
await _stateService.SetAutofillBlacklistedUrisAsync(urisList);
|
|
||||||
AutofillBlockedUris = string.Join(", ", urisList);
|
|
||||||
}
|
|
||||||
catch { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task UpdateCurrentLocaleAsync()
|
private async Task UpdateCurrentLocaleAsync()
|
||||||
{
|
{
|
||||||
if (!_inited)
|
if (!_inited)
|
||||||
|
|||||||
@@ -32,19 +32,21 @@
|
|||||||
StyleClass="text-muted, text-sm, text-bold"
|
StyleClass="text-muted, text-sm, text-bold"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center" />
|
||||||
</Frame>
|
</Frame>
|
||||||
<Label IsVisible="{Binding UseFrame, Converter={StaticResource inverseBool}}"
|
<controls:CustomLabel IsVisible="{Binding UseFrame, Converter={StaticResource inverseBool}}"
|
||||||
Text="{Binding Name, Mode=OneWay}"
|
Text="{Binding Name, Mode=OneWay}"
|
||||||
LineBreakMode="{Binding LineBreakMode}"
|
LineBreakMode="{Binding LineBreakMode}"
|
||||||
HorizontalOptions="StartAndExpand"
|
HorizontalOptions="StartAndExpand"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
StyleClass="list-title"/>
|
StyleClass="list-title"
|
||||||
<Label Text="{Binding SubLabel, Mode=OneWay}"
|
AutomationId="{Binding AutomationIdSettingName}" />
|
||||||
|
<controls:CustomLabel Text="{Binding SubLabel, Mode=OneWay}"
|
||||||
IsVisible="{Binding ShowSubLabel}"
|
IsVisible="{Binding ShowSubLabel}"
|
||||||
HorizontalOptions="End"
|
HorizontalOptions="End"
|
||||||
HorizontalTextAlignment="End"
|
HorizontalTextAlignment="End"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
TextColor="{Binding SubLabelColor}"
|
TextColor="{Binding SubLabelColor}"
|
||||||
StyleClass="list-sub" />
|
StyleClass="list-sub"
|
||||||
|
AutomationId="{Binding AutomationIdSettingStatus}" />
|
||||||
</controls:ExtendedStackLayout>
|
</controls:ExtendedStackLayout>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
<DataTemplate
|
<DataTemplate
|
||||||
@@ -57,7 +59,8 @@
|
|||||||
Padding="10"
|
Padding="10"
|
||||||
HasShadow="False"
|
HasShadow="False"
|
||||||
BackgroundColor="Transparent"
|
BackgroundColor="Transparent"
|
||||||
BorderColor="{DynamicResource PrimaryColor}">
|
BorderColor="{DynamicResource PrimaryColor}"
|
||||||
|
AutomationId="SettingActivePolicyTextLabel">
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Name, Mode=OneWay}"
|
Text="{Binding Name, Mode=OneWay}"
|
||||||
StyleClass="text-muted, text-sm, text-bold"
|
StyleClass="text-muted, text-sm, text-bold"
|
||||||
@@ -75,7 +78,8 @@
|
|||||||
VerticalOptions="Center"
|
VerticalOptions="Center"
|
||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
TextColor="{Binding SubLabelColor}"
|
TextColor="{Binding SubLabelColor}"
|
||||||
StyleClass="list-sub" Margin="-5"/>
|
StyleClass="list-sub" Margin="-5"
|
||||||
|
AutomationId="SettingCustomVaultTimeoutPicker" />
|
||||||
<controls:ExtendedStackLayout.GestureRecognizers>
|
<controls:ExtendedStackLayout.GestureRecognizers>
|
||||||
<TapGestureRecognizer Tapped="ActivateTimePicker"/>
|
<TapGestureRecognizer Tapped="ActivateTimePicker"/>
|
||||||
</controls:ExtendedStackLayout.GestureRecognizers>
|
</controls:ExtendedStackLayout.GestureRecognizers>
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
using Bit.App.Utilities;
|
using Bit.App.Utilities;
|
||||||
|
using Bit.App.Utilities.Automation;
|
||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
|
|
||||||
namespace Bit.App.Pages
|
namespace Bit.App.Pages
|
||||||
@@ -22,5 +24,29 @@ namespace Bit.App.Pages
|
|||||||
public Color SubLabelColor => SubLabelTextEnabled ?
|
public Color SubLabelColor => SubLabelTextEnabled ?
|
||||||
ThemeManager.GetResourceColor("SuccessColor") :
|
ThemeManager.GetResourceColor("SuccessColor") :
|
||||||
ThemeManager.GetResourceColor("MutedColor");
|
ThemeManager.GetResourceColor("MutedColor");
|
||||||
|
|
||||||
|
public string AutomationIdSettingName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return AutomationIdsHelper.AddSuffixFor(
|
||||||
|
UseFrame ? "EnabledPolicy"
|
||||||
|
: AutomationIdsHelper.ToEnglishTitleCase(Name)
|
||||||
|
, SuffixType.Cell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string AutomationIdSettingStatus
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (UseFrame)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return AutomationIdsHelper.AddSuffixFor(AutomationIdsHelper.ToEnglishTitleCase(Name), SuffixType.SettingValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
// if we have a vault timeout policy, we need to filter the timeout options
|
// if we have a vault timeout policy, we need to filter the timeout options
|
||||||
_vaultTimeoutPolicy = (await _policyService.GetAll(PolicyType.MaximumVaultTimeout)).First();
|
_vaultTimeoutPolicy = (await _policyService.GetAll(PolicyType.MaximumVaultTimeout)).First();
|
||||||
var policyMinutes = _policyService.GetPolicyInt(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_MINUTES);
|
var policyMinutes = _vaultTimeoutPolicy.GetInt(Policy.MINUTES_KEY);
|
||||||
_vaultTimeoutOptions = _vaultTimeoutOptions.Where(t =>
|
_vaultTimeoutOptions = _vaultTimeoutOptions.Where(t =>
|
||||||
t.Value <= policyMinutes &&
|
t.Value <= policyMinutes &&
|
||||||
(t.Value > 0 || t.Value == CustomVaultTimeoutValue) &&
|
(t.Value > 0 || t.Value == CustomVaultTimeoutValue) &&
|
||||||
@@ -302,7 +302,7 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
if (_vaultTimeoutPolicy != null)
|
if (_vaultTimeoutPolicy != null)
|
||||||
{
|
{
|
||||||
var maximumTimeout = _policyService.GetPolicyInt(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_MINUTES);
|
var maximumTimeout = _vaultTimeoutPolicy.GetInt(Policy.MINUTES_KEY);
|
||||||
|
|
||||||
if (newTimeout > maximumTimeout)
|
if (newTimeout > maximumTimeout)
|
||||||
{
|
{
|
||||||
@@ -382,7 +382,7 @@ namespace Bit.App.Pages
|
|||||||
public async Task VaultTimeoutActionAsync()
|
public async Task VaultTimeoutActionAsync()
|
||||||
{
|
{
|
||||||
if (_vaultTimeoutPolicy != null &&
|
if (_vaultTimeoutPolicy != null &&
|
||||||
!string.IsNullOrEmpty(_policyService.GetPolicyString(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_ACTION)))
|
!string.IsNullOrEmpty(_vaultTimeoutPolicy.GetString(Policy.ACTION_KEY)))
|
||||||
{
|
{
|
||||||
// do nothing if we have a policy set
|
// do nothing if we have a policy set
|
||||||
return;
|
return;
|
||||||
@@ -610,8 +610,8 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
if (_vaultTimeoutPolicy != null)
|
if (_vaultTimeoutPolicy != null)
|
||||||
{
|
{
|
||||||
var policyMinutes = _policyService.GetPolicyInt(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_MINUTES);
|
var policyMinutes = _vaultTimeoutPolicy.GetInt(Policy.MINUTES_KEY);
|
||||||
var policyAction = _policyService.GetPolicyString(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_ACTION);
|
var policyAction = _vaultTimeoutPolicy.GetString(Policy.ACTION_KEY);
|
||||||
|
|
||||||
if (policyMinutes.HasValue || !string.IsNullOrWhiteSpace(policyAction))
|
if (policyMinutes.HasValue || !string.IsNullOrWhiteSpace(policyAction))
|
||||||
{
|
{
|
||||||
@@ -625,14 +625,14 @@ namespace Bit.App.Pages
|
|||||||
else if (!policyMinutes.HasValue && !string.IsNullOrWhiteSpace(policyAction))
|
else if (!policyMinutes.HasValue && !string.IsNullOrWhiteSpace(policyAction))
|
||||||
{
|
{
|
||||||
policyAlert = string.Format(AppResources.VaultTimeoutActionPolicyInEffect,
|
policyAlert = string.Format(AppResources.VaultTimeoutActionPolicyInEffect,
|
||||||
policyAction == PolicyService.TIMEOUT_POLICY_ACTION_LOCK ? AppResources.Lock : AppResources.LogOut);
|
policyAction == Policy.ACTION_LOCK ? AppResources.Lock : AppResources.LogOut);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
policyAlert = string.Format(AppResources.VaultTimeoutPolicyWithActionInEffect,
|
policyAlert = string.Format(AppResources.VaultTimeoutPolicyWithActionInEffect,
|
||||||
Math.Floor((float)policyMinutes / 60),
|
Math.Floor((float)policyMinutes / 60),
|
||||||
policyMinutes % 60,
|
policyMinutes % 60,
|
||||||
policyAction == PolicyService.TIMEOUT_POLICY_ACTION_LOCK ? AppResources.Lock : AppResources.LogOut);
|
policyAction == Policy.ACTION_LOCK ? AppResources.Lock : AppResources.LogOut);
|
||||||
}
|
}
|
||||||
securityItems.Insert(0, new SettingsPageListItem
|
securityItems.Insert(0, new SettingsPageListItem
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,23 +33,25 @@
|
|||||||
<StackLayout StyleClass="box">
|
<StackLayout StyleClass="box">
|
||||||
<StackLayout StyleClass="box-row" Padding="10, 20"
|
<StackLayout StyleClass="box-row" Padding="10, 20"
|
||||||
IsVisible="{Binding HasAttachments, Converter={StaticResource inverseBool}}">
|
IsVisible="{Binding HasAttachments, Converter={StaticResource inverseBool}}">
|
||||||
<Label Text="{u:I18n NoAttachments}" HorizontalTextAlignment="Center" />
|
<Label Text="{u:I18n NoAttachments}" HorizontalTextAlignment="Center" AutomationId="NoAttachmentsLabel" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<controls:RepeaterView ItemsSource="{Binding Attachments}" IsVisible="{Binding HasAttachments}">
|
<controls:RepeaterView ItemsSource="{Binding Attachments}" IsVisible="{Binding HasAttachments}" AutomationId="AttachmentsList">
|
||||||
<controls:RepeaterView.ItemTemplate>
|
<controls:RepeaterView.ItemTemplate>
|
||||||
<DataTemplate x:DataType="views:AttachmentView">
|
<DataTemplate x:DataType="views:AttachmentView">
|
||||||
<StackLayout Spacing="0" Padding="0">
|
<StackLayout Spacing="0" Padding="0">
|
||||||
<StackLayout Orientation="Horizontal" StyleClass="box-row" Spacing="10">
|
<StackLayout Orientation="Horizontal" StyleClass="box-row" Spacing="10" AutomationId="AttachmentRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding FileName, Mode=OneWay}"
|
Text="{Binding FileName, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
VerticalTextAlignment="Center"
|
VerticalTextAlignment="Center"
|
||||||
HorizontalOptions="StartAndExpand" />
|
HorizontalOptions="StartAndExpand"
|
||||||
|
AutomationId="AttachmentFileNameLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding SizeName, Mode=OneWay}"
|
Text="{Binding SizeName, Mode=OneWay}"
|
||||||
StyleClass="box-sub-label"
|
StyleClass="box-sub-label"
|
||||||
HorizontalTextAlignment="End"
|
HorizontalTextAlignment="End"
|
||||||
VerticalTextAlignment="Center" />
|
VerticalTextAlignment="Center"
|
||||||
|
AutomationId="AttachmentFileSizeLabel" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Trash}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Trash}}"
|
||||||
@@ -57,7 +59,8 @@
|
|||||||
CommandParameter="{Binding .}"
|
CommandParameter="{Binding .}"
|
||||||
VerticalOptions="Center"
|
VerticalOptions="Center"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Delete}" />
|
AutomationProperties.Name="{u:I18n Delete}"
|
||||||
|
AutomationId="AttachmentDeleteButton" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
@@ -77,17 +80,20 @@
|
|||||||
LineBreakMode="CharacterWrap"
|
LineBreakMode="CharacterWrap"
|
||||||
StyleClass="text-sm, text-muted"
|
StyleClass="text-sm, text-muted"
|
||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="NoFileChosenLabel" />
|
||||||
<Label
|
<Label
|
||||||
IsVisible="{Binding FileName, Converter={StaticResource notNull}}"
|
IsVisible="{Binding FileName, Converter={StaticResource notNull}}"
|
||||||
Text="{Binding FileName}"
|
Text="{Binding FileName}"
|
||||||
LineBreakMode="CharacterWrap"
|
LineBreakMode="CharacterWrap"
|
||||||
StyleClass="text-sm, text-muted"
|
StyleClass="text-sm, text-muted"
|
||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="NewAttachmentNameLabel" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Button Text="{u:I18n ChooseFile}" StyleClass="box-button-row"
|
<Button Text="{u:I18n ChooseFile}" StyleClass="box-button-row"
|
||||||
Clicked="ChooseFile_Clicked"></Button>
|
Clicked="ChooseFile_Clicked"
|
||||||
|
AutomationId="ChooseFileButton"></Button>
|
||||||
<Label
|
<Label
|
||||||
Margin="0, 10, 0, 0"
|
Margin="0, 10, 0, 0"
|
||||||
Text="{u:I18n MaxFileSize}"
|
Text="{u:I18n MaxFileSize}"
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ namespace Bit.App.Pages
|
|||||||
set => SetProperty(ref _cipher, value, additionalPropertyNames: AdditionalPropertiesToRaiseOnCipherChanged);
|
set => SetProperty(ref _cipher, value, additionalPropertyNames: AdditionalPropertiesToRaiseOnCipherChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string CreationDate => string.Format(AppResources.CreatedX, Cipher.CreationDate.ToShortDateString());
|
||||||
|
|
||||||
public AsyncCommand CheckPasswordCommand { get; }
|
public AsyncCommand CheckPasswordCommand { get; }
|
||||||
|
|
||||||
protected async Task CheckPasswordAsync()
|
protected async Task CheckPasswordAsync()
|
||||||
|
|||||||
@@ -57,16 +57,16 @@
|
|||||||
x:Key="deleteItem" />
|
x:Key="deleteItem" />
|
||||||
|
|
||||||
<DataTemplate x:Key="TextCustomFieldDataTemplate">
|
<DataTemplate x:Key="TextCustomFieldDataTemplate">
|
||||||
<il:TextCustomFieldItemLayout />
|
<il:TextCustomFieldItemLayout AutomationId="TextCustomFieldItem" />
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
<DataTemplate x:Key="BooleanCustomFieldDataTemplate">
|
<DataTemplate x:Key="BooleanCustomFieldDataTemplate">
|
||||||
<il:BooleanCustomFieldItemLayout />
|
<il:BooleanCustomFieldItemLayout AutomationId="BooleanCustomFieldItem" />
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
<DataTemplate x:Key="HiddenCustomFieldDataTemplate">
|
<DataTemplate x:Key="HiddenCustomFieldDataTemplate">
|
||||||
<il:HiddenCustomFieldItemLayout />
|
<il:HiddenCustomFieldItemLayout AutomationId="HiddenCustomFieldItem" />
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
<DataTemplate x:Key="LinkedCustomFieldDataTemplate">
|
<DataTemplate x:Key="LinkedCustomFieldDataTemplate">
|
||||||
<il:LinkedCustomFieldItemLayout />
|
<il:LinkedCustomFieldItemLayout AutomationId="LinkedCustomFieldItem" />
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
|
|
||||||
<dts:CustomFieldItemTemplateSelector x:Key="CustomFieldItemTemplateSelector"
|
<dts:CustomFieldItemTemplateSelector x:Key="CustomFieldItemTemplateSelector"
|
||||||
@@ -100,7 +100,8 @@
|
|||||||
<Label
|
<Label
|
||||||
Text="{u:I18n PersonalOwnershipPolicyInEffect}"
|
Text="{u:I18n PersonalOwnershipPolicyInEffect}"
|
||||||
StyleClass="text-muted, text-sm, text-bold"
|
StyleClass="text-muted, text-sm, text-bold"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="PersonalOwnershipPolicyLabel"/>
|
||||||
</Frame>
|
</Frame>
|
||||||
</Grid>
|
</Grid>
|
||||||
<StackLayout StyleClass="box-row-header">
|
<StackLayout StyleClass="box-row-header">
|
||||||
@@ -116,7 +117,8 @@
|
|||||||
x:Name="_typePicker"
|
x:Name="_typePicker"
|
||||||
ItemsSource="{Binding TypeOptions, Mode=OneTime}"
|
ItemsSource="{Binding TypeOptions, Mode=OneTime}"
|
||||||
SelectedIndex="{Binding TypeSelectedIndex}"
|
SelectedIndex="{Binding TypeSelectedIndex}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemTypePicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -125,7 +127,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_nameEntry"
|
x:Name="_nameEntry"
|
||||||
Text="{Binding Cipher.Name}"
|
Text="{Binding Cipher.Name}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Name}"
|
||||||
|
AutomationId="ItemNameEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout IsVisible="{Binding IsLogin}" Spacing="0" Padding="0">
|
<StackLayout IsVisible="{Binding IsLogin}" Spacing="0" Padding="0">
|
||||||
<Grid StyleClass="box-row, box-row-input"
|
<Grid StyleClass="box-row, box-row-input"
|
||||||
@@ -138,7 +143,10 @@
|
|||||||
x:Name="_loginUsernameEntry"
|
x:Name="_loginUsernameEntry"
|
||||||
Text="{Binding Cipher.Login.Username}"
|
Text="{Binding Cipher.Login.Username}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"/>
|
Grid.Row="1"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Username}"
|
||||||
|
AutomationId="LoginUsernameEntry" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}"
|
||||||
@@ -146,7 +154,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n GenerateUsername}" />
|
AutomationProperties.Name="{u:I18n GenerateUsername}"
|
||||||
|
AutomationId="GenerateUsernameButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid StyleClass="box-row, box-row-input">
|
<Grid StyleClass="box-row, box-row-input">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
@@ -174,7 +183,10 @@
|
|||||||
IsPassword="{Binding ShowPassword, Converter={StaticResource inverseBool}}"
|
IsPassword="{Binding ShowPassword, Converter={StaticResource inverseBool}}"
|
||||||
IsSpellCheckEnabled="False"
|
IsSpellCheckEnabled="False"
|
||||||
IsTextPredictionEnabled="False"
|
IsTextPredictionEnabled="False"
|
||||||
IsEnabled="{Binding Cipher.ViewPassword}"/>
|
IsEnabled="{Binding Cipher.ViewPassword}"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Password}"
|
||||||
|
AutomationId="LoginPasswordEntry" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.CheckCircle}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.CheckCircle}}"
|
||||||
@@ -184,7 +196,8 @@
|
|||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n CheckPassword}"
|
AutomationProperties.Name="{u:I18n CheckPassword}"
|
||||||
IsVisible="{Binding Cipher.ViewPassword}" />
|
IsVisible="{Binding Cipher.ViewPassword}"
|
||||||
|
AutomationId="CheckPasswordButton" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding ShowPasswordIcon}"
|
Text="{Binding ShowPasswordIcon}"
|
||||||
@@ -195,7 +208,8 @@
|
|||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
|
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
|
||||||
IsVisible="{Binding Cipher.ViewPassword}" />
|
IsVisible="{Binding Cipher.ViewPassword}"
|
||||||
|
AutomationId="ViewPasswordButton" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}"
|
||||||
@@ -205,9 +219,21 @@
|
|||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n GeneratePassword}"
|
AutomationProperties.Name="{u:I18n GeneratePassword}"
|
||||||
IsVisible="{Binding Cipher.ViewPassword}" />
|
IsVisible="{Binding Cipher.ViewPassword}"
|
||||||
|
AutomationId="RegeneratePasswordButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n Passkey}"
|
||||||
|
StyleClass="box-label"
|
||||||
|
Margin="0,10,0,0"
|
||||||
|
IsVisible="{Binding ShowPasskeyInfo}"/>
|
||||||
|
<Entry
|
||||||
|
Text="{u:I18n AvailableForTwoStepLogin}"
|
||||||
|
IsEnabled="False"
|
||||||
|
StyleClass="box-value,text-muted"
|
||||||
|
IsVisible="{Binding ShowPasskeyInfo}" />
|
||||||
|
|
||||||
<Grid StyleClass="box-row, box-row-input">
|
<Grid StyleClass="box-row, box-row-input">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
@@ -241,7 +267,8 @@
|
|||||||
Padding="0,15"
|
Padding="0,15"
|
||||||
HorizontalOptions="Center"
|
HorizontalOptions="Center"
|
||||||
VerticalOptions="FillAndExpand"
|
VerticalOptions="FillAndExpand"
|
||||||
VerticalTextAlignment="Center" />
|
VerticalTextAlignment="Center"
|
||||||
|
AutomationId="SetupTotpButton" />
|
||||||
</Frame>
|
</Frame>
|
||||||
<controls:MonoEntry
|
<controls:MonoEntry
|
||||||
x:Name="_loginTotpEntry"
|
x:Name="_loginTotpEntry"
|
||||||
@@ -254,7 +281,10 @@
|
|||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Grid.ColumnSpan="{Binding TotpColumnSpan}" />
|
Grid.ColumnSpan="{Binding TotpColumnSpan}"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n AuthenticatorKey}"
|
||||||
|
AutomationId="LoginTotpEntry" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
||||||
@@ -262,7 +292,10 @@
|
|||||||
IsVisible="{Binding HasTotpValue}"
|
IsVisible="{Binding HasTotpValue}"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2" />
|
Grid.RowSpan="2"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n CopyTotp}"
|
||||||
|
AutomationId="CopyTotpValueButton" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Camera}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Camera}}"
|
||||||
@@ -272,7 +305,8 @@
|
|||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
IsVisible="{Binding HasTotpValue}"
|
IsVisible="{Binding HasTotpValue}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ScanQrTitle}" />
|
AutomationProperties.Name="{u:I18n ScanQrTitle}"
|
||||||
|
/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout IsVisible="{Binding IsCard}" Spacing="0" Padding="0">
|
<StackLayout IsVisible="{Binding IsCard}" Spacing="0" Padding="0">
|
||||||
@@ -283,7 +317,8 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_cardholderNameEntry"
|
x:Name="_cardholderNameEntry"
|
||||||
Text="{Binding Cipher.Card.CardholderName}"
|
Text="{Binding Cipher.Card.CardholderName}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="CardholderNameEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Grid StyleClass="box-row, box-row-input">
|
<Grid StyleClass="box-row, box-row-input">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
@@ -307,7 +342,10 @@
|
|||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
IsPassword="{Binding ShowCardNumber, Converter={StaticResource inverseBool}}"
|
IsPassword="{Binding ShowCardNumber, Converter={StaticResource inverseBool}}"
|
||||||
IsSpellCheckEnabled="False"
|
IsSpellCheckEnabled="False"
|
||||||
IsTextPredictionEnabled="False" />
|
IsTextPredictionEnabled="False"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Number}"
|
||||||
|
AutomationId="CardNumberEntry" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding ShowCardNumberIcon}"
|
Text="{Binding ShowCardNumberIcon}"
|
||||||
@@ -316,7 +354,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}" />
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
|
AutomationId="ShowCardNumberButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -326,7 +365,8 @@
|
|||||||
x:Name="_cardBrandPicker"
|
x:Name="_cardBrandPicker"
|
||||||
ItemsSource="{Binding CardBrandOptions, Mode=OneTime}"
|
ItemsSource="{Binding CardBrandOptions, Mode=OneTime}"
|
||||||
SelectedIndex="{Binding CardBrandSelectedIndex}"
|
SelectedIndex="{Binding CardBrandSelectedIndex}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="CardBrandPicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -336,7 +376,8 @@
|
|||||||
x:Name="_cardExpMonthPicker"
|
x:Name="_cardExpMonthPicker"
|
||||||
ItemsSource="{Binding CardExpMonthOptions, Mode=OneTime}"
|
ItemsSource="{Binding CardExpMonthOptions, Mode=OneTime}"
|
||||||
SelectedIndex="{Binding CardExpMonthSelectedIndex}"
|
SelectedIndex="{Binding CardExpMonthSelectedIndex}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="CardExpirationMonthPicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -346,7 +387,10 @@
|
|||||||
x:Name="_cardExpYearEntry"
|
x:Name="_cardExpYearEntry"
|
||||||
Text="{Binding Cipher.Card.ExpYear}"
|
Text="{Binding Cipher.Card.ExpYear}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Keyboard="Numeric" />
|
Keyboard="Numeric"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n ExpirationYear}"
|
||||||
|
AutomationId="CardExpirationYearEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<Grid StyleClass="box-row, box-row-input">
|
<Grid StyleClass="box-row, box-row-input">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
@@ -371,7 +415,10 @@
|
|||||||
Keyboard="Numeric"
|
Keyboard="Numeric"
|
||||||
IsPassword="{Binding ShowCardCode, Converter={StaticResource inverseBool}}"
|
IsPassword="{Binding ShowCardCode, Converter={StaticResource inverseBool}}"
|
||||||
IsSpellCheckEnabled="False"
|
IsSpellCheckEnabled="False"
|
||||||
IsTextPredictionEnabled="False" />
|
IsTextPredictionEnabled="False"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n SecurityCode}"
|
||||||
|
AutomationId="CardSecurityCodeEntry" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding ShowCardCodeIcon}"
|
Text="{Binding ShowCardCodeIcon}"
|
||||||
@@ -380,7 +427,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}" />
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
|
AutomationId="CardShowSecurityCodeButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout IsVisible="{Binding IsIdentity}" Spacing="0" Padding="0">
|
<StackLayout IsVisible="{Binding IsIdentity}" Spacing="0" Padding="0">
|
||||||
@@ -392,7 +440,8 @@
|
|||||||
x:Name="_identityTitlePicker"
|
x:Name="_identityTitlePicker"
|
||||||
ItemsSource="{Binding IdentityTitleOptions, Mode=OneTime}"
|
ItemsSource="{Binding IdentityTitleOptions, Mode=OneTime}"
|
||||||
SelectedIndex="{Binding IdentityTitleSelectedIndex}"
|
SelectedIndex="{Binding IdentityTitleSelectedIndex}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="IdentityTitlePicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -401,7 +450,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityFirstNameEntry"
|
x:Name="_identityFirstNameEntry"
|
||||||
Text="{Binding Cipher.Identity.FirstName}"
|
Text="{Binding Cipher.Identity.FirstName}"
|
||||||
StyleClass="box-value,capitalize-word-input"/>
|
StyleClass="box-value,capitalize-word-input"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n FirstName}"
|
||||||
|
AutomationId="IdentityFirstNameEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -410,7 +462,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityMiddleNameEntry"
|
x:Name="_identityMiddleNameEntry"
|
||||||
Text="{Binding Cipher.Identity.MiddleName}"
|
Text="{Binding Cipher.Identity.MiddleName}"
|
||||||
StyleClass="box-value,capitalize-word-input" />
|
StyleClass="box-value,capitalize-word-input"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n MiddleName}"
|
||||||
|
AutomationId="IdentityMiddleNameEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -419,7 +474,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityLastNameEntry"
|
x:Name="_identityLastNameEntry"
|
||||||
Text="{Binding Cipher.Identity.LastName}"
|
Text="{Binding Cipher.Identity.LastName}"
|
||||||
StyleClass="box-value,capitalize-word-input" />
|
StyleClass="box-value,capitalize-word-input"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n LastName}"
|
||||||
|
AutomationId="IdentityLastNameEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -428,7 +486,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityUsernameEntry"
|
x:Name="_identityUsernameEntry"
|
||||||
Text="{Binding Cipher.Identity.Username}"
|
Text="{Binding Cipher.Identity.Username}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Username}"
|
||||||
|
AutomationId="IdentityUsernameEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -437,7 +498,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityCompanyEntry"
|
x:Name="_identityCompanyEntry"
|
||||||
Text="{Binding Cipher.Identity.Company}"
|
Text="{Binding Cipher.Identity.Company}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Company}"
|
||||||
|
AutomationId="IdentityCompanyEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -446,7 +510,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identitySsnEntry"
|
x:Name="_identitySsnEntry"
|
||||||
Text="{Binding Cipher.Identity.SSN}"
|
Text="{Binding Cipher.Identity.SSN}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n SSN}"
|
||||||
|
AutomationId="IdentitySsnEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -455,7 +522,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityPassportNumberEntry"
|
x:Name="_identityPassportNumberEntry"
|
||||||
Text="{Binding Cipher.Identity.PassportNumber}"
|
Text="{Binding Cipher.Identity.PassportNumber}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n PassportNumber}"
|
||||||
|
AutomationId="IdentityPassportNumberEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -464,7 +534,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityLicenseNumberEntry"
|
x:Name="_identityLicenseNumberEntry"
|
||||||
Text="{Binding Cipher.Identity.LicenseNumber}"
|
Text="{Binding Cipher.Identity.LicenseNumber}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n LicenseNumber}"
|
||||||
|
AutomationId="IdentityLicenseNumberEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -474,7 +547,10 @@
|
|||||||
x:Name="_identityEmailEntry"
|
x:Name="_identityEmailEntry"
|
||||||
Keyboard="Email"
|
Keyboard="Email"
|
||||||
Text="{Binding Cipher.Identity.Email}"
|
Text="{Binding Cipher.Identity.Email}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Email}"
|
||||||
|
AutomationId="IdentityEmailEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -484,7 +560,10 @@
|
|||||||
x:Name="_identityPhoneEntry"
|
x:Name="_identityPhoneEntry"
|
||||||
Text="{Binding Cipher.Identity.Phone}"
|
Text="{Binding Cipher.Identity.Phone}"
|
||||||
Keyboard="Telephone"
|
Keyboard="Telephone"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Phone}"
|
||||||
|
AutomationId="IdentityPhoneEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -493,7 +572,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityAddress1Entry"
|
x:Name="_identityAddress1Entry"
|
||||||
Text="{Binding Cipher.Identity.Address1}"
|
Text="{Binding Cipher.Identity.Address1}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Address1}"
|
||||||
|
AutomationId="IdentityAddressOneEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -502,7 +584,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityAddress2Entry"
|
x:Name="_identityAddress2Entry"
|
||||||
Text="{Binding Cipher.Identity.Address2}"
|
Text="{Binding Cipher.Identity.Address2}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Address2}"
|
||||||
|
AutomationId="IdentityAddressTwoEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -511,7 +596,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityAddress3Entry"
|
x:Name="_identityAddress3Entry"
|
||||||
Text="{Binding Cipher.Identity.Address3}"
|
Text="{Binding Cipher.Identity.Address3}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Address3}"
|
||||||
|
AutomationId="IdentityAddressThreeEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -520,7 +608,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityCityEntry"
|
x:Name="_identityCityEntry"
|
||||||
Text="{Binding Cipher.Identity.City}"
|
Text="{Binding Cipher.Identity.City}"
|
||||||
StyleClass="box-value,capitalize-sentence-input" />
|
StyleClass="box-value,capitalize-sentence-input"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n CityTown}"
|
||||||
|
AutomationId="IdentityCityEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -529,7 +620,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityStateEntry"
|
x:Name="_identityStateEntry"
|
||||||
Text="{Binding Cipher.Identity.State}"
|
Text="{Binding Cipher.Identity.State}"
|
||||||
StyleClass="box-value,capitalize-sentence-input" />
|
StyleClass="box-value,capitalize-sentence-input"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n StateProvince}"
|
||||||
|
AutomationId="IdentityStateEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -538,7 +632,10 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityPostalCodeEntry"
|
x:Name="_identityPostalCodeEntry"
|
||||||
Text="{Binding Cipher.Identity.PostalCode}"
|
Text="{Binding Cipher.Identity.PostalCode}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n ZipPostalCode}"
|
||||||
|
AutomationId="IdentityPostalCodeEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-input">
|
<StackLayout StyleClass="box-row, box-row-input">
|
||||||
<Label
|
<Label
|
||||||
@@ -547,9 +644,44 @@
|
|||||||
<Entry
|
<Entry
|
||||||
x:Name="_identityCountryEntry"
|
x:Name="_identityCountryEntry"
|
||||||
Text="{Binding Cipher.Identity.Country}"
|
Text="{Binding Cipher.Identity.Country}"
|
||||||
StyleClass="box-value,capitalize-sentence-input" />
|
StyleClass="box-value,capitalize-sentence-input"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Country}"
|
||||||
|
AutomationId="IdentityCountryEntry" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
|
|
||||||
|
<StackLayout IsVisible="{Binding IsFido2Key}" Spacing="0" Padding="0">
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n Username}"
|
||||||
|
StyleClass="box-label"
|
||||||
|
Margin="0,10,0,0"/>
|
||||||
|
<Entry
|
||||||
|
x:Name="_fido2KeyUsernameEntry"
|
||||||
|
Text="{Binding Cipher.Fido2Key.UserName}"
|
||||||
|
StyleClass="box-value"
|
||||||
|
Grid.Row="1"/>
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n Passkey}"
|
||||||
|
StyleClass="box-label"
|
||||||
|
Margin="0,10,0,0"/>
|
||||||
|
<Entry
|
||||||
|
Text="{Binding CreationDate}"
|
||||||
|
IsEnabled="False"
|
||||||
|
StyleClass="box-value,text-muted" />
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n Application}"
|
||||||
|
StyleClass="box-label"
|
||||||
|
Margin="0,10,0,0"/>
|
||||||
|
<Entry
|
||||||
|
Text="{Binding Cipher.Fido2Key.LaunchUri}"
|
||||||
|
IsEnabled="False"
|
||||||
|
StyleClass="box-value,text-muted" />
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey}"
|
||||||
|
StyleClass="box-sub-label" />
|
||||||
|
</StackLayout>
|
||||||
|
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box" IsVisible="{Binding IsLogin}">
|
<StackLayout StyleClass="box" IsVisible="{Binding IsLogin}">
|
||||||
<StackLayout StyleClass="box-row-header">
|
<StackLayout StyleClass="box-row-header">
|
||||||
@@ -559,7 +691,7 @@
|
|||||||
<controls:RepeaterView ItemsSource="{Binding Uris}">
|
<controls:RepeaterView ItemsSource="{Binding Uris}">
|
||||||
<controls:RepeaterView.ItemTemplate>
|
<controls:RepeaterView.ItemTemplate>
|
||||||
<DataTemplate x:DataType="views:LoginUriView">
|
<DataTemplate x:DataType="views:LoginUriView">
|
||||||
<Grid StyleClass="box-row, box-row-input">
|
<Grid StyleClass="box-row, box-row-input" AutomationId="UriListGrid" >
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
@@ -578,7 +710,10 @@
|
|||||||
Keyboard="Url"
|
Keyboard="Url"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n URI}"
|
||||||
|
AutomationId="LoginUriEntry" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Cog}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Cog}}"
|
||||||
@@ -588,13 +723,15 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Options}" />
|
AutomationProperties.Name="{u:I18n Options}"
|
||||||
|
AutomationId="LoginUriOptionsButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</controls:RepeaterView.ItemTemplate>
|
</controls:RepeaterView.ItemTemplate>
|
||||||
</controls:RepeaterView>
|
</controls:RepeaterView>
|
||||||
<Button Text="{u:I18n NewUri}" StyleClass="box-button-row"
|
<Button Text="{u:I18n NewUri}" StyleClass="box-button-row"
|
||||||
Clicked="NewUri_Clicked"></Button>
|
Clicked="NewUri_Clicked"
|
||||||
|
AutomationId="LoginAddNewUriButton"></Button>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box">
|
<StackLayout StyleClass="box">
|
||||||
<StackLayout StyleClass="box-row-header">
|
<StackLayout StyleClass="box-row-header">
|
||||||
@@ -609,7 +746,8 @@
|
|||||||
x:Name="_folderPicker"
|
x:Name="_folderPicker"
|
||||||
ItemsSource="{Binding FolderOptions, Mode=OneTime}"
|
ItemsSource="{Binding FolderOptions, Mode=OneTime}"
|
||||||
SelectedIndex="{Binding FolderSelectedIndex}"
|
SelectedIndex="{Binding FolderSelectedIndex}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="FolderPicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row, box-row-switch">
|
<StackLayout StyleClass="box-row, box-row-switch">
|
||||||
<Label
|
<Label
|
||||||
@@ -619,7 +757,8 @@
|
|||||||
<Switch
|
<Switch
|
||||||
IsToggled="{Binding Cipher.Favorite}"
|
IsToggled="{Binding Cipher.Favorite}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End" />
|
HorizontalOptions="End"
|
||||||
|
AutomationId="ItemFavoriteToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout x:Name="_passwordPrompt" StyleClass="box-row, box-row-switch">
|
<StackLayout x:Name="_passwordPrompt" StyleClass="box-row, box-row-switch">
|
||||||
<Label
|
<Label
|
||||||
@@ -631,13 +770,14 @@
|
|||||||
Command="{Binding PasswordPromptHelpCommand}"
|
Command="{Binding PasswordPromptHelpCommand}"
|
||||||
TextColor="{DynamicResource MutedColor}"
|
TextColor="{DynamicResource MutedColor}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
AutomationProperties.Name="{u:I18n MasterPasswordRePromptHelp}"
|
||||||
HorizontalOptions="StartAndExpand" />
|
HorizontalOptions="StartAndExpand" />
|
||||||
<Switch
|
<Switch
|
||||||
IsToggled="{Binding PasswordPrompt}"
|
IsToggled="{Binding PasswordPrompt}"
|
||||||
Toggled="PasswordPrompt_Toggled"
|
Toggled="PasswordPrompt_Toggled"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End" />
|
HorizontalOptions="End"
|
||||||
|
AutomationId="MasterPasswordRepromptToggle" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
@@ -652,7 +792,10 @@
|
|||||||
AutoSize="TextChanges"
|
AutoSize="TextChanges"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
effects:ScrollEnabledEffect.IsScrollEnabled="false"
|
effects:ScrollEnabledEffect.IsScrollEnabled="false"
|
||||||
Text="{Binding Cipher.Notes}">
|
Text="{Binding Cipher.Notes}"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Notes}"
|
||||||
|
AutomationId="ItemNotesEntry">
|
||||||
<Editor.Behaviors>
|
<Editor.Behaviors>
|
||||||
<behaviors:EditorPreventAutoBottomScrollingOnFocusedBehavior ParentScrollView="{x:Reference _scrollView}" />
|
<behaviors:EditorPreventAutoBottomScrollingOnFocusedBehavior ParentScrollView="{x:Reference _scrollView}" />
|
||||||
</Editor.Behaviors>
|
</Editor.Behaviors>
|
||||||
@@ -671,9 +814,11 @@
|
|||||||
<StackLayout
|
<StackLayout
|
||||||
Spacing="0"
|
Spacing="0"
|
||||||
BindableLayout.ItemsSource="{Binding Fields}"
|
BindableLayout.ItemsSource="{Binding Fields}"
|
||||||
BindableLayout.ItemTemplateSelector="{StaticResource CustomFieldItemTemplateSelector}" />
|
BindableLayout.ItemTemplateSelector="{StaticResource CustomFieldItemTemplateSelector}"
|
||||||
|
AutomationId="CustomFieldsList" />
|
||||||
<Button Text="{u:I18n NewCustomField}" StyleClass="box-button-row"
|
<Button Text="{u:I18n NewCustomField}" StyleClass="box-button-row"
|
||||||
Clicked="NewField_Clicked"></Button>
|
Clicked="NewField_Clicked"
|
||||||
|
AutomationId="NewCustomFieldButton"></Button>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box" IsVisible="{Binding ShowOwnershipOptions}">
|
<StackLayout StyleClass="box" IsVisible="{Binding ShowOwnershipOptions}">
|
||||||
<StackLayout StyleClass="box-row-header">
|
<StackLayout StyleClass="box-row-header">
|
||||||
@@ -688,7 +833,8 @@
|
|||||||
x:Name="_ownershipPicker"
|
x:Name="_ownershipPicker"
|
||||||
ItemsSource="{Binding OwnershipOptions, Mode=OneTime}"
|
ItemsSource="{Binding OwnershipOptions, Mode=OneTime}"
|
||||||
SelectedIndex="{Binding OwnershipSelectedIndex}"
|
SelectedIndex="{Binding OwnershipSelectedIndex}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemOwnershipPicker" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box" IsVisible="{Binding ShowCollections}">
|
<StackLayout StyleClass="box" IsVisible="{Binding ShowCollections}">
|
||||||
@@ -699,7 +845,8 @@
|
|||||||
<StackLayout Spacing="0" Padding="0"
|
<StackLayout Spacing="0" Padding="0"
|
||||||
IsVisible="{Binding HasCollections, Converter={StaticResource inverseBool}}">
|
IsVisible="{Binding HasCollections, Converter={StaticResource inverseBool}}">
|
||||||
<StackLayout StyleClass="box-row, box-row-switch">
|
<StackLayout StyleClass="box-row, box-row-switch">
|
||||||
<Label Text="{u:I18n NoCollectionsToList}" />
|
<Label Text="{u:I18n NoCollectionsToList}"
|
||||||
|
AutomationId="NoCollectionsToListLabel" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
@@ -709,15 +856,17 @@
|
|||||||
<controls:RepeaterView.ItemTemplate>
|
<controls:RepeaterView.ItemTemplate>
|
||||||
<DataTemplate x:DataType="pages:CollectionViewModel">
|
<DataTemplate x:DataType="pages:CollectionViewModel">
|
||||||
<StackLayout Spacing="0" Padding="0">
|
<StackLayout Spacing="0" Padding="0">
|
||||||
<StackLayout StyleClass="box-row, box-row-switch">
|
<StackLayout StyleClass="box-row, box-row-switch" AutomationId="CollectionItemCell">
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Collection.Name}"
|
Text="{Binding Collection.Name}"
|
||||||
StyleClass="box-label-regular"
|
StyleClass="box-label-regular"
|
||||||
HorizontalOptions="StartAndExpand" />
|
HorizontalOptions="StartAndExpand"
|
||||||
|
AutomationId="CollectionItemNameLabel" />
|
||||||
<Switch
|
<Switch
|
||||||
IsToggled="{Binding Checked}"
|
IsToggled="{Binding Checked}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
HorizontalOptions="End" />
|
HorizontalOptions="End"
|
||||||
|
AutomationId="CollectionItemSwitch" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
@@ -727,5 +876,4 @@
|
|||||||
</StackLayout>
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
</pages:BaseContentPage>
|
</pages:BaseContentPage>
|
||||||
|
|||||||
@@ -88,7 +88,6 @@ namespace Bit.App.Pages
|
|||||||
_watchDeviceService = ServiceContainer.Resolve<IWatchDeviceService>();
|
_watchDeviceService = ServiceContainer.Resolve<IWatchDeviceService>();
|
||||||
_accountsManager = ServiceContainer.Resolve<IAccountsManager>();
|
_accountsManager = ServiceContainer.Resolve<IAccountsManager>();
|
||||||
|
|
||||||
|
|
||||||
GeneratePasswordCommand = new Command(GeneratePassword);
|
GeneratePasswordCommand = new Command(GeneratePassword);
|
||||||
TogglePasswordCommand = new Command(TogglePassword);
|
TogglePasswordCommand = new Command(TogglePassword);
|
||||||
ToggleCardNumberCommand = new Command(ToggleCardNumber);
|
ToggleCardNumberCommand = new Command(ToggleCardNumber);
|
||||||
@@ -297,6 +296,7 @@ namespace Bit.App.Pages
|
|||||||
public bool IsIdentity => Cipher?.Type == CipherType.Identity;
|
public bool IsIdentity => Cipher?.Type == CipherType.Identity;
|
||||||
public bool IsCard => Cipher?.Type == CipherType.Card;
|
public bool IsCard => Cipher?.Type == CipherType.Card;
|
||||||
public bool IsSecureNote => Cipher?.Type == CipherType.SecureNote;
|
public bool IsSecureNote => Cipher?.Type == CipherType.SecureNote;
|
||||||
|
public bool IsFido2Key => Cipher?.Type == CipherType.Fido2Key;
|
||||||
public bool ShowUris => IsLogin && Cipher.Login.HasUris;
|
public bool ShowUris => IsLogin && Cipher.Login.HasUris;
|
||||||
public bool ShowAttachments => Cipher.HasAttachments;
|
public bool ShowAttachments => Cipher.HasAttachments;
|
||||||
public string ShowPasswordIcon => ShowPassword ? BitwardenIcons.EyeSlash : BitwardenIcons.Eye;
|
public string ShowPasswordIcon => ShowPassword ? BitwardenIcons.EyeSlash : BitwardenIcons.Eye;
|
||||||
@@ -309,6 +309,7 @@ namespace Bit.App.Pages
|
|||||||
public string PasswordVisibilityAccessibilityText => ShowPassword ? AppResources.PasswordIsVisibleTapToHide : AppResources.PasswordIsNotVisibleTapToShow;
|
public string PasswordVisibilityAccessibilityText => ShowPassword ? AppResources.PasswordIsVisibleTapToHide : AppResources.PasswordIsNotVisibleTapToShow;
|
||||||
public bool HasTotpValue => IsLogin && !string.IsNullOrEmpty(Cipher?.Login?.Totp);
|
public bool HasTotpValue => IsLogin && !string.IsNullOrEmpty(Cipher?.Login?.Totp);
|
||||||
public string SetupTotpText => $"{BitwardenIcons.Camera} {AppResources.SetupTotp}";
|
public string SetupTotpText => $"{BitwardenIcons.Camera} {AppResources.SetupTotp}";
|
||||||
|
public bool ShowPasskeyInfo => Cipher?.Login?.Fido2Key != null && !CloneMode;
|
||||||
|
|
||||||
public void Init()
|
public void Init()
|
||||||
{
|
{
|
||||||
@@ -367,6 +368,11 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
Cipher.OrganizationId = OrganizationId;
|
Cipher.OrganizationId = OrganizationId;
|
||||||
}
|
}
|
||||||
|
if (Cipher.Type == CipherType.Login)
|
||||||
|
{
|
||||||
|
// passkeys can't be cloned
|
||||||
|
Cipher.Login.Fido2Key = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (appOptions?.OtpData != null && Cipher.Type == CipherType.Login)
|
if (appOptions?.OtpData != null && Cipher.Type == CipherType.Login)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -45,20 +45,20 @@
|
|||||||
x:Name="_attachmentsItem" x:Key="attachmentsItem" />
|
x:Name="_attachmentsItem" x:Key="attachmentsItem" />
|
||||||
<ToolbarItem Text="{u:I18n Delete}" Clicked="Delete_Clicked" Order="Secondary" IsDestructive="True"
|
<ToolbarItem Text="{u:I18n Delete}" Clicked="Delete_Clicked" Order="Secondary" IsDestructive="True"
|
||||||
x:Name="_deleteItem" x:Key="deleteItem" />
|
x:Name="_deleteItem" x:Key="deleteItem" />
|
||||||
<ToolbarItem Text="{u:I18n Clone}" Clicked="Clone_Clicked" Order="Secondary"
|
<ToolbarItem Text="{u:I18n Clone}" Command="{Binding CloneCommand}" Order="Secondary"
|
||||||
x:Name="_cloneItem" x:Key="cloneItem" />
|
x:Name="_cloneItem" x:Key="cloneItem" />
|
||||||
|
|
||||||
<DataTemplate x:Key="TextCustomFieldDataTemplate">
|
<DataTemplate x:Key="TextCustomFieldDataTemplate">
|
||||||
<il:TextCustomFieldItemLayout />
|
<il:TextCustomFieldItemLayout AutomationId="TextCustomFieldItem" />
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
<DataTemplate x:Key="BooleanCustomFieldDataTemplate">
|
<DataTemplate x:Key="BooleanCustomFieldDataTemplate">
|
||||||
<il:BooleanCustomFieldItemLayout />
|
<il:BooleanCustomFieldItemLayout AutomationId="BooleanCustomFieldItem" />
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
<DataTemplate x:Key="HiddenCustomFieldDataTemplate">
|
<DataTemplate x:Key="HiddenCustomFieldDataTemplate">
|
||||||
<il:HiddenCustomFieldItemLayout />
|
<il:HiddenCustomFieldItemLayout AutomationId="HiddenCustomFieldItem" />
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
<DataTemplate x:Key="LinkedCustomFieldDataTemplate">
|
<DataTemplate x:Key="LinkedCustomFieldDataTemplate">
|
||||||
<il:LinkedCustomFieldItemLayout />
|
<il:LinkedCustomFieldItemLayout AutomationId="LinkedCustomFieldItem" />
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
|
|
||||||
<dts:CustomFieldItemTemplateSelector x:Key="CustomFieldItemTemplateSelector"
|
<dts:CustomFieldItemTemplateSelector x:Key="CustomFieldItemTemplateSelector"
|
||||||
@@ -69,23 +69,26 @@
|
|||||||
|
|
||||||
<ScrollView x:Key="scrollView" x:Name="_scrollView">
|
<ScrollView x:Key="scrollView" x:Name="_scrollView">
|
||||||
<StackLayout Spacing="20" x:Name="_mainLayout">
|
<StackLayout Spacing="20" x:Name="_mainLayout">
|
||||||
<StackLayout StyleClass="box">
|
<StackLayout StyleClass="box" AutomationId="ItemInformationSection">
|
||||||
<StackLayout StyleClass="box-row-header">
|
<StackLayout StyleClass="box-row-header">
|
||||||
<Label Text="{u:I18n ItemInformation, Header=True}"
|
<Label Text="{u:I18n ItemInformation, Header=True}"
|
||||||
StyleClass="box-header, box-header-platform" />
|
StyleClass="box-header, box-header-platform" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row">
|
<StackLayout StyleClass="box-row" AutomationId="ItemRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n Name}"
|
Text="{u:I18n Name}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Name, Mode=OneWay}"
|
Text="{Binding Cipher.Name, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
<StackLayout IsVisible="{Binding IsLogin}" Spacing="0" Padding="0">
|
<StackLayout IsVisible="{Binding IsLogin}" Spacing="0" Padding="0">
|
||||||
<Grid StyleClass="box-row"
|
<Grid StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Login.Username, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Login.Username, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
@@ -98,12 +101,14 @@
|
|||||||
Text="{u:I18n Username}"
|
Text="{u:I18n Username}"
|
||||||
StyleClass="box-label"
|
StyleClass="box-label"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Login.Username, Mode=OneWay}"
|
Text="{Binding Cipher.Login.Username, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
||||||
@@ -113,12 +118,14 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n CopyUsername}" />
|
AutomationProperties.Name="{u:I18n CopyUsername}"
|
||||||
|
AutomationId="CopyValueButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Login.Username, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Login.Username, Converter={StaticResource stringHasValue}}" />
|
||||||
<Grid StyleClass="box-row"
|
<Grid StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Login.Password, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Login.Password, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
@@ -133,20 +140,23 @@
|
|||||||
Text="{u:I18n Password}"
|
Text="{u:I18n Password}"
|
||||||
StyleClass="box-label"
|
StyleClass="box-label"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
Text="{Binding Cipher.Login.MaskedPassword, Mode=OneWay}"
|
Text="{Binding Cipher.Login.MaskedPassword, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
IsVisible="{Binding ShowPassword, Converter={StaticResource inverseBool}}" />
|
IsVisible="{Binding ShowPassword, Converter={StaticResource inverseBool}}"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
Text="{Binding ColoredPassword, Mode=OneWay}"
|
Text="{Binding ColoredPassword, Mode=OneWay}"
|
||||||
StyleClass="box-value, text-html"
|
StyleClass="box-value, text-html"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
LineBreakMode="CharacterWrap"
|
LineBreakMode="CharacterWrap"
|
||||||
IsVisible="{Binding ShowPassword}" />
|
IsVisible="{Binding ShowPassword}"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.CheckCircle}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.CheckCircle}}"
|
||||||
@@ -156,7 +166,8 @@
|
|||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n CheckPassword}"
|
AutomationProperties.Name="{u:I18n CheckPassword}"
|
||||||
IsVisible="{Binding Cipher.ViewPassword}" />
|
IsVisible="{Binding Cipher.ViewPassword}"
|
||||||
|
AutomationId="CheckPasswordButton" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding ShowPasswordIcon}"
|
Text="{Binding ShowPasswordIcon}"
|
||||||
@@ -167,7 +178,8 @@
|
|||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
|
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
|
||||||
IsVisible="{Binding Cipher.ViewPassword}" />
|
IsVisible="{Binding Cipher.ViewPassword}"
|
||||||
|
AutomationId="ShowValueButton" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
||||||
@@ -178,11 +190,24 @@
|
|||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n CopyPassword}"
|
AutomationProperties.Name="{u:I18n CopyPassword}"
|
||||||
IsVisible="{Binding Cipher.ViewPassword}" />
|
IsVisible="{Binding Cipher.ViewPassword}"
|
||||||
|
AutomationId="CopyValueButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Login.Password, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Login.Password, Converter={StaticResource stringHasValue}}" />
|
||||||
<Grid StyleClass="box-row" IsVisible="{Binding ShowTotp}">
|
<Label
|
||||||
|
Text="{u:I18n Passkey}"
|
||||||
|
StyleClass="box-label"
|
||||||
|
Margin="0,10,0,0"
|
||||||
|
IsVisible="{Binding Cipher.Login.Fido2Key, Converter={StaticResource notNull}}"/>
|
||||||
|
<Entry
|
||||||
|
Text="{u:I18n AvailableForTwoStepLogin}"
|
||||||
|
IsEnabled="False"
|
||||||
|
StyleClass="box-value,text-muted"
|
||||||
|
IsVisible="{Binding Cipher.Login.Fido2Key, Converter={StaticResource notNull}}" />
|
||||||
|
<Grid StyleClass="box-row"
|
||||||
|
IsVisible="{Binding ShowTotp}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
@@ -197,7 +222,8 @@
|
|||||||
Text="{u:I18n VerificationCodeTotp}"
|
Text="{u:I18n VerificationCodeTotp}"
|
||||||
StyleClass="box-label"
|
StyleClass="box-label"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
Text="{Binding TotpCodeFormatted, Mode=OneWay}"
|
Text="{Binding TotpCodeFormatted, Mode=OneWay}"
|
||||||
IsVisible="{Binding ShowUpgradePremiumTotpText, Converter={StaticResource inverseBool}}"
|
IsVisible="{Binding ShowUpgradePremiumTotpText, Converter={StaticResource inverseBool}}"
|
||||||
@@ -205,14 +231,16 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
VerticalTextAlignment="Start"
|
VerticalTextAlignment="Start"
|
||||||
VerticalOptions="Start" />
|
VerticalOptions="Start"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
<controls:CircularProgressbarView
|
<controls:CircularProgressbarView
|
||||||
Progress="{Binding TotpProgress}"
|
Progress="{Binding TotpProgress}"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
VerticalOptions="FillAndExpand" />
|
VerticalOptions="FillAndExpand"
|
||||||
|
AutomationId="LoginTotpProgressBar" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding TotpSec, Mode=OneWay}"
|
Text="{Binding TotpSec, Mode=OneWay}"
|
||||||
Style="{DynamicResource textTotp}"
|
Style="{DynamicResource textTotp}"
|
||||||
@@ -234,7 +262,8 @@
|
|||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n CopyTotp}" />
|
AutomationProperties.Name="{u:I18n CopyTotp}"
|
||||||
|
AutomationId="CopyValueButton" />
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n PremiumSubscriptionRequired}"
|
Text="{u:I18n PremiumSubscriptionRequired}"
|
||||||
StyleClass="box-footer-label"
|
StyleClass="box-footer-label"
|
||||||
@@ -242,24 +271,29 @@
|
|||||||
Margin="0,5,0,2"
|
Margin="0,5,0,2"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
HorizontalOptions="FillAndExpand" />
|
HorizontalOptions="FillAndExpand"
|
||||||
|
AutomationId="ShowUpgradePremiumTotpLabel" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<BoxView StyleClass="box-row-separator" IsVisible="{Binding ShowTotp}" />
|
<BoxView StyleClass="box-row-separator" IsVisible="{Binding ShowTotp}" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout IsVisible="{Binding IsCard}" Spacing="0" Padding="0">
|
<StackLayout IsVisible="{Binding IsCard}" Spacing="0" Padding="0">
|
||||||
<StackLayout StyleClass="box-row"
|
<StackLayout StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Card.CardholderName, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Card.CardholderName, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n CardholderName}"
|
Text="{u:I18n CardholderName}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Card.CardholderName, Mode=OneWay}"
|
Text="{Binding Cipher.Card.CardholderName, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Card.CardholderName, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Card.CardholderName, Converter={StaticResource stringHasValue}}" />
|
||||||
<Grid StyleClass="box-row"
|
<Grid StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Card.Number, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Card.Number, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
@@ -273,19 +307,22 @@
|
|||||||
Text="{u:I18n Number}"
|
Text="{u:I18n Number}"
|
||||||
StyleClass="box-label"
|
StyleClass="box-label"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
Text="{Binding Cipher.Card.MaskedNumber, Mode=OneWay}"
|
Text="{Binding Cipher.Card.MaskedNumber, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
IsVisible="{Binding ShowCardNumber, Converter={StaticResource inverseBool}}" />
|
IsVisible="{Binding ShowCardNumber, Converter={StaticResource inverseBool}}"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
Text="{Binding Cipher.Card.Number, Mode=OneWay}"
|
Text="{Binding Cipher.Card.Number, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
IsVisible="{Binding ShowCardNumber}" />
|
IsVisible="{Binding ShowCardNumber}"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding ShowCardNumberIcon}"
|
Text="{Binding ShowCardNumberIcon}"
|
||||||
@@ -294,7 +331,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}" />
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
|
AutomationId="ShowValueButton" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
||||||
@@ -304,34 +342,42 @@
|
|||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n CopyNumber}" />
|
AutomationProperties.Name="{u:I18n CopyNumber}"
|
||||||
|
AutomationId="CopyValueButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Card.Number, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Card.Number, Converter={StaticResource stringHasValue}}" />
|
||||||
<StackLayout StyleClass="box-row"
|
<StackLayout StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Card.Brand, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Card.Brand, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n Brand}"
|
Text="{u:I18n Brand}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Card.Brand, Mode=OneWay}"
|
Text="{Binding Cipher.Card.Brand, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Card.Brand, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Card.Brand, Converter={StaticResource stringHasValue}}" />
|
||||||
<StackLayout StyleClass="box-row"
|
<StackLayout StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Card.Expiration, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Card.Expiration, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n Expiration}"
|
Text="{u:I18n Expiration}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Card.Expiration, Mode=OneWay}"
|
Text="{Binding Cipher.Card.Expiration, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Card.Expiration, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Card.Expiration, Converter={StaticResource stringHasValue}}" />
|
||||||
<Grid StyleClass="box-row"
|
<Grid StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Card.Code, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Card.Code, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
@@ -345,19 +391,22 @@
|
|||||||
Text="{u:I18n SecurityCode}"
|
Text="{u:I18n SecurityCode}"
|
||||||
StyleClass="box-label"
|
StyleClass="box-label"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
Text="{Binding Cipher.Card.MaskedCode, Mode=OneWay}"
|
Text="{Binding Cipher.Card.MaskedCode, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
IsVisible="{Binding ShowCardCode, Converter={StaticResource inverseBool}}" />
|
IsVisible="{Binding ShowCardCode, Converter={StaticResource inverseBool}}"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
Text="{Binding Cipher.Card.Code, Mode=OneWay}"
|
Text="{Binding Cipher.Card.Code, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
IsVisible="{Binding ShowCardCode}" />
|
IsVisible="{Binding ShowCardCode}"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding ShowCardCodeIcon}"
|
Text="{Binding ShowCardCodeIcon}"
|
||||||
@@ -366,7 +415,8 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n ToggleVisibility}" />
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
|
AutomationId="ShowValueButton" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
||||||
@@ -376,138 +426,228 @@
|
|||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n CopySecurityCode}" />
|
AutomationProperties.Name="{u:I18n CopySecurityCode}"
|
||||||
|
AutomationId="CopyValueButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Card.Code, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Card.Code, Converter={StaticResource stringHasValue}}" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout IsVisible="{Binding IsIdentity}" Spacing="0" Padding="0">
|
<StackLayout IsVisible="{Binding IsIdentity}" Spacing="0" Padding="0">
|
||||||
<StackLayout StyleClass="box-row"
|
<StackLayout StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Identity.FullName, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Identity.FullName, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n IdentityName}"
|
Text="{u:I18n IdentityName}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.FullName, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.FullName, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Identity.FullName, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Identity.FullName, Converter={StaticResource stringHasValue}}" />
|
||||||
<StackLayout StyleClass="box-row"
|
<StackLayout StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Identity.Username, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Identity.Username, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n Username}"
|
Text="{u:I18n Username}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.Username, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.Username, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Identity.Username, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Identity.Username, Converter={StaticResource stringHasValue}}" />
|
||||||
<StackLayout StyleClass="box-row"
|
<StackLayout StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Identity.Company, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Identity.Company, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n Company}"
|
Text="{u:I18n Company}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.Company, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.Company, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Identity.Company, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Identity.Company, Converter={StaticResource stringHasValue}}" />
|
||||||
<StackLayout StyleClass="box-row"
|
<StackLayout StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Identity.SSN, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Identity.SSN, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n SSN}"
|
Text="{u:I18n SSN}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.SSN, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.SSN, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Identity.SSN, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Identity.SSN, Converter={StaticResource stringHasValue}}" />
|
||||||
<StackLayout StyleClass="box-row"
|
<StackLayout StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Identity.PassportNumber, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Identity.PassportNumber, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n PassportNumber}"
|
Text="{u:I18n PassportNumber}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.PassportNumber, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.PassportNumber, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Identity.PassportNumber, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Identity.PassportNumber, Converter={StaticResource stringHasValue}}" />
|
||||||
<StackLayout StyleClass="box-row"
|
<StackLayout StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Identity.LicenseNumber, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Identity.LicenseNumber, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n LicenseNumber}"
|
Text="{u:I18n LicenseNumber}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.LicenseNumber, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.LicenseNumber, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Identity.LicenseNumber, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Identity.LicenseNumber, Converter={StaticResource stringHasValue}}" />
|
||||||
<StackLayout StyleClass="box-row"
|
<StackLayout StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Identity.Email, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Identity.Email, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n Email}"
|
Text="{u:I18n Email}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.Email, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.Email, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Identity.Email, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Identity.Email, Converter={StaticResource stringHasValue}}" />
|
||||||
<StackLayout StyleClass="box-row"
|
<StackLayout StyleClass="box-row"
|
||||||
IsVisible="{Binding Cipher.Identity.Phone, Converter={StaticResource stringHasValue}}">
|
IsVisible="{Binding Cipher.Identity.Phone, Converter={StaticResource stringHasValue}}"
|
||||||
|
AutomationId="ItemRow" >
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n Phone}"
|
Text="{u:I18n Phone}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.Phone, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.Phone, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="ItemValue" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator"
|
<BoxView StyleClass="box-row-separator"
|
||||||
IsVisible="{Binding Cipher.Identity.Phone, Converter={StaticResource stringHasValue}}" />
|
IsVisible="{Binding Cipher.Identity.Phone, Converter={StaticResource stringHasValue}}" />
|
||||||
<StackLayout StyleClass="box-row" IsVisible="{Binding ShowIdentityAddress}">
|
<StackLayout StyleClass="box-row" IsVisible="{Binding ShowIdentityAddress}"
|
||||||
|
AutomationId="ItemRow">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n Address}"
|
Text="{u:I18n Address}"
|
||||||
StyleClass="box-label" />
|
StyleClass="box-label"
|
||||||
|
AutomationId="ItemName" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.Address1, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.Address1, Mode=OneWay}"
|
||||||
IsVisible="{Binding Cipher.Identity.Address1, Converter={StaticResource stringHasValue}}"
|
IsVisible="{Binding Cipher.Identity.Address1, Converter={StaticResource stringHasValue}}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="IdentityAddressOneLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.Address2, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.Address2, Mode=OneWay}"
|
||||||
IsVisible="{Binding Cipher.Identity.Address2, Converter={StaticResource stringHasValue}}"
|
IsVisible="{Binding Cipher.Identity.Address2, Converter={StaticResource stringHasValue}}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="IdentityAddressTwoLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.Address3, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.Address3, Mode=OneWay}"
|
||||||
IsVisible="{Binding Cipher.Identity.Address3, Converter={StaticResource stringHasValue}}"
|
IsVisible="{Binding Cipher.Identity.Address3, Converter={StaticResource stringHasValue}}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="IdentityAddressThreeLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.FullAddressPart2, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.FullAddressPart2, Mode=OneWay}"
|
||||||
IsVisible="{Binding Cipher.Identity.FullAddressPart2, Converter={StaticResource stringHasValue}}"
|
IsVisible="{Binding Cipher.Identity.FullAddressPart2, Converter={StaticResource stringHasValue}}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="IdentityFullAddressPartTwoLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding Cipher.Identity.Country, Mode=OneWay}"
|
Text="{Binding Cipher.Identity.Country, Mode=OneWay}"
|
||||||
IsVisible="{Binding Cipher.Identity.Country, Converter={StaticResource stringHasValue}}"
|
IsVisible="{Binding Cipher.Identity.Country, Converter={StaticResource stringHasValue}}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="IdentityCountryLabel" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" IsVisible="{Binding ShowIdentityAddress}" />
|
<BoxView StyleClass="box-row-separator" IsVisible="{Binding ShowIdentityAddress}" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
|
<StackLayout
|
||||||
|
IsVisible="{Binding IsFido2Key}"
|
||||||
|
Spacing="0"
|
||||||
|
Padding="0"
|
||||||
|
Margin="0,10,0,0">
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n Username}"
|
||||||
|
StyleClass="box-label" />
|
||||||
|
<Label
|
||||||
|
Text="{Binding Cipher.Fido2Key.UserName, Mode=OneWay}"
|
||||||
|
StyleClass="box-value" />
|
||||||
|
<BoxView StyleClass="box-row-separator" Margin="0,10,0,0" />
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n Passkey}"
|
||||||
|
StyleClass="box-label"
|
||||||
|
Margin="0,10,0,0" />
|
||||||
|
<Label
|
||||||
|
Text="{Binding CreationDate, Mode=OneWay}"
|
||||||
|
StyleClass="box-value" />
|
||||||
|
<BoxView StyleClass="box-row-separator" Margin="0,10,0,0" />
|
||||||
|
<Grid
|
||||||
|
StyleClass="box-row"
|
||||||
|
RowDefinitions="Auto,*,Auto"
|
||||||
|
ColumnDefinitions="*,Auto,Auto">
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n Application}"
|
||||||
|
StyleClass="box-label" />
|
||||||
|
<Label
|
||||||
|
Grid.Row="1"
|
||||||
|
Text="{Binding Cipher.Fido2Key.LaunchUri, Mode=OneWay}"
|
||||||
|
StyleClass="box-value" />
|
||||||
|
<controls:IconButton
|
||||||
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
|
Text="{Binding Source={x:Static core:BitwardenIcons.ShareSquare}}"
|
||||||
|
Command="{Binding LaunchUriCommand}"
|
||||||
|
CommandParameter="{Binding Cipher.Fido2Key}"
|
||||||
|
Grid.Column="1"
|
||||||
|
Grid.RowSpan="2"
|
||||||
|
VerticalOptions="End"
|
||||||
|
IsVisible="{Binding Cipher.Fido2Key.CanLaunch, Mode=OneWay}"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n Launch}" />
|
||||||
|
<controls:IconButton
|
||||||
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
|
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
||||||
|
Command="{Binding CopyCommand}"
|
||||||
|
CommandParameter="Fido2KeyApplication"
|
||||||
|
Grid.Column="2"
|
||||||
|
Grid.RowSpan="2"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n CopyApplication}" />
|
||||||
|
<BoxView
|
||||||
|
StyleClass="box-row-separator"
|
||||||
|
Margin="0,3,0,0"
|
||||||
|
Grid.Row="2"
|
||||||
|
Grid.ColumnSpan="3" />
|
||||||
|
</Grid>
|
||||||
|
</StackLayout>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box" IsVisible="{Binding ShowUris}">
|
<StackLayout StyleClass="box" IsVisible="{Binding ShowUris}">
|
||||||
<StackLayout StyleClass="box-row-header">
|
<StackLayout StyleClass="box-row-header">
|
||||||
<Label Text="{u:I18n URIs, Header=True}"
|
<Label Text="{u:I18n URIs, Header=True}"
|
||||||
StyleClass="box-header, box-header-platform" />
|
StyleClass="box-header, box-header-platform" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<controls:RepeaterView ItemsSource="{Binding Cipher.Login.Uris}">
|
<controls:RepeaterView ItemsSource="{Binding Cipher.Login.Uris}" AutomationId="CipherUriContainer">
|
||||||
<controls:RepeaterView.ItemTemplate>
|
<controls:RepeaterView.ItemTemplate>
|
||||||
<DataTemplate x:DataType="views:LoginUriView">
|
<DataTemplate x:DataType="views:LoginUriView">
|
||||||
<StackLayout Spacing="0" Padding="0">
|
<StackLayout Spacing="0" Padding="0">
|
||||||
<Grid StyleClass="box-row">
|
<Grid StyleClass="box-row" AutomationId="UriRow">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
@@ -533,7 +673,8 @@
|
|||||||
Text="{Binding HostOrUri, Mode=OneWay}"
|
Text="{Binding HostOrUri, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0" />
|
Grid.Column="0"
|
||||||
|
AutomationId="UriValue" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.ShareSquare}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.ShareSquare}}"
|
||||||
@@ -544,7 +685,8 @@
|
|||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
IsVisible="{Binding CanLaunch, Mode=OneWay}"
|
IsVisible="{Binding CanLaunch, Mode=OneWay}"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Launch}" />
|
AutomationProperties.Name="{u:I18n Launch}"
|
||||||
|
AutomationId="LaunchUriButton" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
|
||||||
@@ -554,7 +696,8 @@
|
|||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Grid.RowSpan="2"
|
Grid.RowSpan="2"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Copy}" />
|
AutomationProperties.Name="{u:I18n Copy}"
|
||||||
|
AutomationId="CopyUriButton" />
|
||||||
</Grid>
|
</Grid>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
@@ -568,14 +711,15 @@
|
|||||||
<Label Text="{u:I18n Notes, Header=True}"
|
<Label Text="{u:I18n Notes, Header=True}"
|
||||||
StyleClass="box-header, box-header-platform" />
|
StyleClass="box-header, box-header-platform" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-row">
|
<StackLayout StyleClass="box-row" AutomationId="NotesRow">
|
||||||
<controls:SelectableLabel
|
<controls:SelectableLabel
|
||||||
Text="{Binding Cipher.Notes, Mode=OneWay}"
|
Text="{Binding Cipher.Notes, Mode=OneWay}"
|
||||||
StyleClass="box-value" />
|
StyleClass="box-value"
|
||||||
|
AutomationId="CipherNotesLabel" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box" IsVisible="{Binding Cipher.HasFields}">
|
<StackLayout StyleClass="box" IsVisible="{Binding Cipher.HasFields}" AutomationId="CustomFieldsContainer">
|
||||||
<StackLayout StyleClass="box-row-header">
|
<StackLayout StyleClass="box-row-header">
|
||||||
<Label Text="{u:I18n CustomFields, Header=True}"
|
<Label Text="{u:I18n CustomFields, Header=True}"
|
||||||
StyleClass="box-header, box-header-platform" />
|
StyleClass="box-header, box-header-platform" />
|
||||||
@@ -590,21 +734,23 @@
|
|||||||
<Label Text="{u:I18n Attachments, Header=True}"
|
<Label Text="{u:I18n Attachments, Header=True}"
|
||||||
StyleClass="box-header, box-header-platform" />
|
StyleClass="box-header, box-header-platform" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<controls:RepeaterView ItemsSource="{Binding Cipher.Attachments}">
|
<controls:RepeaterView ItemsSource="{Binding Cipher.Attachments}" AutomationId="CipherAttachmentsContainer">
|
||||||
<controls:RepeaterView.ItemTemplate>
|
<controls:RepeaterView.ItemTemplate>
|
||||||
<DataTemplate x:DataType="views:AttachmentView">
|
<DataTemplate x:DataType="views:AttachmentView">
|
||||||
<StackLayout Spacing="0" Padding="0">
|
<StackLayout Spacing="0" Padding="0">
|
||||||
<StackLayout Orientation="Horizontal" StyleClass="box-row" Spacing="10">
|
<StackLayout Orientation="Horizontal" StyleClass="box-row" Spacing="10" AutomationId="CipherAttachment">
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding FileName, Mode=OneWay}"
|
Text="{Binding FileName, Mode=OneWay}"
|
||||||
StyleClass="box-value"
|
StyleClass="box-value"
|
||||||
VerticalTextAlignment="Center"
|
VerticalTextAlignment="Center"
|
||||||
HorizontalOptions="StartAndExpand" />
|
HorizontalOptions="StartAndExpand"
|
||||||
|
AutomationId="CipherAttachmentFileNameLabel" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding SizeName, Mode=OneWay}"
|
Text="{Binding SizeName, Mode=OneWay}"
|
||||||
StyleClass="box-sub-label"
|
StyleClass="box-sub-label"
|
||||||
HorizontalTextAlignment="End"
|
HorizontalTextAlignment="End"
|
||||||
VerticalTextAlignment="Center" />
|
VerticalTextAlignment="Center"
|
||||||
|
AutomationId="CipherAttachmentFileSizeLabel" />
|
||||||
<controls:IconButton
|
<controls:IconButton
|
||||||
StyleClass="box-row-button, box-row-button-platform"
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
Text="{Binding Source={x:Static core:BitwardenIcons.Download}}"
|
Text="{Binding Source={x:Static core:BitwardenIcons.Download}}"
|
||||||
@@ -612,7 +758,8 @@
|
|||||||
CommandParameter="{Binding .}"
|
CommandParameter="{Binding .}"
|
||||||
VerticalOptions="Center"
|
VerticalOptions="Center"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Download}" />
|
AutomationProperties.Name="{u:I18n Download}"
|
||||||
|
AutomationId="CipherAttachmentDownloadButton" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="box-row-separator" />
|
<BoxView StyleClass="box-row-separator" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
@@ -622,17 +769,20 @@
|
|||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box-bottom">
|
<StackLayout StyleClass="box-bottom">
|
||||||
<Label FormattedText="{Binding UpdatedText}"
|
<Label FormattedText="{Binding UpdatedText}"
|
||||||
StyleClass="box-footer-label" />
|
StyleClass="box-footer-label"
|
||||||
|
AutomationId="CipherUpdatedDateLabel" />
|
||||||
<Label FormattedText="{Binding PasswordUpdatedText}"
|
<Label FormattedText="{Binding PasswordUpdatedText}"
|
||||||
StyleClass="box-footer-label"
|
StyleClass="box-footer-label"
|
||||||
IsVisible="{Binding Cipher.PasswordRevisionDisplayDate, Converter={StaticResource notNull}}">
|
IsVisible="{Binding Cipher.PasswordRevisionDisplayDate, Converter={StaticResource notNull}}"
|
||||||
|
AutomationId="CipherUpdatedPasswordDateLabel">
|
||||||
<Label.GestureRecognizers>
|
<Label.GestureRecognizers>
|
||||||
<TapGestureRecognizer Tapped="PasswordHistory_Tapped" />
|
<TapGestureRecognizer Tapped="PasswordHistory_Tapped" />
|
||||||
</Label.GestureRecognizers>
|
</Label.GestureRecognizers>
|
||||||
</Label>
|
</Label>
|
||||||
<Label FormattedText="{Binding PasswordHistoryText}"
|
<Label FormattedText="{Binding PasswordHistoryText}"
|
||||||
StyleClass="box-footer-label"
|
StyleClass="box-footer-label"
|
||||||
IsVisible="{Binding Cipher.HasPasswordHistory}">
|
IsVisible="{Binding Cipher.HasPasswordHistory}"
|
||||||
|
AutomationId="CipherPasswordHistoryLabel">
|
||||||
<Label.GestureRecognizers>
|
<Label.GestureRecognizers>
|
||||||
<TapGestureRecognizer Tapped="PasswordHistory_Tapped" />
|
<TapGestureRecognizer Tapped="PasswordHistory_Tapped" />
|
||||||
</Label.GestureRecognizers>
|
</Label.GestureRecognizers>
|
||||||
@@ -662,6 +812,7 @@
|
|||||||
AbsoluteLayout.LayoutBounds="1, 1, AutoSize, AutoSize"
|
AbsoluteLayout.LayoutBounds="1, 1, AutoSize, AutoSize"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n EditItem}"
|
AutomationProperties.Name="{u:I18n EditItem}"
|
||||||
|
AutomationId="CipherEditButton"
|
||||||
IsVisible="{Binding CanEdit}">
|
IsVisible="{Binding CanEdit}">
|
||||||
<Button.Effects>
|
<Button.Effects>
|
||||||
<effects:FabShadowEffect />
|
<effects:FabShadowEffect />
|
||||||
|
|||||||
@@ -204,20 +204,7 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void Clone_Clicked(object sender, System.EventArgs e)
|
private async void More_Clicked(object sender, EventArgs e)
|
||||||
{
|
|
||||||
if (DoOnce())
|
|
||||||
{
|
|
||||||
if (!await _vm.PromptPasswordAsync())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var page = new CipherAddEditPage(_vm.CipherId, cloneMode: true, cipherDetailsPage: this);
|
|
||||||
await Navigation.PushModalAsync(new NavigationPage(page));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void More_Clicked(object sender, System.EventArgs e)
|
|
||||||
{
|
{
|
||||||
if (!DoOnce())
|
if (!DoOnce())
|
||||||
{
|
{
|
||||||
@@ -226,8 +213,12 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
var options = new List<string> { AppResources.Attachments };
|
var options = new List<string> { AppResources.Attachments };
|
||||||
if (_vm.Cipher.OrganizationId == null)
|
if (_vm.Cipher.OrganizationId == null)
|
||||||
|
{
|
||||||
|
if (_vm.CanClone)
|
||||||
{
|
{
|
||||||
options.Add(AppResources.Clone);
|
options.Add(AppResources.Clone);
|
||||||
|
}
|
||||||
|
|
||||||
options.Add(AppResources.MoveToOrganization);
|
options.Add(AppResources.MoveToOrganization);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -267,8 +258,7 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
else if (selection == AppResources.Clone)
|
else if (selection == AppResources.Clone)
|
||||||
{
|
{
|
||||||
var page = new CipherAddEditPage(_vm.CipherId, cloneMode: true, cipherDetailsPage: this);
|
_vm.CloneCommand.Execute(null);
|
||||||
await Navigation.PushModalAsync(new NavigationPage(page));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,13 +292,13 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
ToolbarItems.Remove(_collectionsItem);
|
ToolbarItems.Remove(_collectionsItem);
|
||||||
}
|
}
|
||||||
if (!ToolbarItems.Contains(_cloneItem))
|
if (_vm.CanClone && !ToolbarItems.Contains(_cloneItem))
|
||||||
{
|
{
|
||||||
ToolbarItems.Insert(1, _cloneItem);
|
ToolbarItems.Insert(1, _cloneItem);
|
||||||
}
|
}
|
||||||
if (!ToolbarItems.Contains(_shareItem))
|
if (!ToolbarItems.Contains(_shareItem))
|
||||||
{
|
{
|
||||||
ToolbarItems.Insert(2, _shareItem);
|
ToolbarItems.Insert(_vm.CanClone ? 2 : 1, _shareItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -68,7 +68,8 @@ namespace Bit.App.Pages
|
|||||||
CopyCommand = new AsyncCommand<string>((id) => CopyAsync(id, null), onException: ex => _logger.Exception(ex), allowsMultipleExecutions: false);
|
CopyCommand = new AsyncCommand<string>((id) => CopyAsync(id, null), onException: ex => _logger.Exception(ex), allowsMultipleExecutions: false);
|
||||||
CopyUriCommand = new AsyncCommand<LoginUriView>(uriView => CopyAsync("LoginUri", uriView.Uri), onException: ex => _logger.Exception(ex), allowsMultipleExecutions: false);
|
CopyUriCommand = new AsyncCommand<LoginUriView>(uriView => CopyAsync("LoginUri", uriView.Uri), onException: ex => _logger.Exception(ex), allowsMultipleExecutions: false);
|
||||||
CopyFieldCommand = new AsyncCommand<FieldView>(field => CopyAsync(field.Type == FieldType.Hidden ? "H_FieldValue" : "FieldValue", field.Value), onException: ex => _logger.Exception(ex), allowsMultipleExecutions: false);
|
CopyFieldCommand = new AsyncCommand<FieldView>(field => CopyAsync(field.Type == FieldType.Hidden ? "H_FieldValue" : "FieldValue", field.Value), onException: ex => _logger.Exception(ex), allowsMultipleExecutions: false);
|
||||||
LaunchUriCommand = new Command<LoginUriView>(LaunchUri);
|
LaunchUriCommand = new Command<ILaunchableView>(LaunchUri);
|
||||||
|
CloneCommand = new AsyncCommand(CloneAsync, onException: ex => HandleException(ex), allowsMultipleExecutions: false);
|
||||||
TogglePasswordCommand = new Command(TogglePassword);
|
TogglePasswordCommand = new Command(TogglePassword);
|
||||||
ToggleCardNumberCommand = new Command(ToggleCardNumber);
|
ToggleCardNumberCommand = new Command(ToggleCardNumber);
|
||||||
ToggleCardCodeCommand = new Command(ToggleCardCode);
|
ToggleCardCodeCommand = new Command(ToggleCardCode);
|
||||||
@@ -81,6 +82,7 @@ namespace Bit.App.Pages
|
|||||||
public ICommand CopyUriCommand { get; set; }
|
public ICommand CopyUriCommand { get; set; }
|
||||||
public ICommand CopyFieldCommand { get; set; }
|
public ICommand CopyFieldCommand { get; set; }
|
||||||
public Command LaunchUriCommand { get; set; }
|
public Command LaunchUriCommand { get; set; }
|
||||||
|
public ICommand CloneCommand { get; set; }
|
||||||
public Command TogglePasswordCommand { get; set; }
|
public Command TogglePasswordCommand { get; set; }
|
||||||
public Command ToggleCardNumberCommand { get; set; }
|
public Command ToggleCardNumberCommand { get; set; }
|
||||||
public Command ToggleCardCodeCommand { get; set; }
|
public Command ToggleCardCodeCommand { get; set; }
|
||||||
@@ -146,6 +148,7 @@ namespace Bit.App.Pages
|
|||||||
public bool IsIdentity => Cipher?.Type == Core.Enums.CipherType.Identity;
|
public bool IsIdentity => Cipher?.Type == Core.Enums.CipherType.Identity;
|
||||||
public bool IsCard => Cipher?.Type == Core.Enums.CipherType.Card;
|
public bool IsCard => Cipher?.Type == Core.Enums.CipherType.Card;
|
||||||
public bool IsSecureNote => Cipher?.Type == Core.Enums.CipherType.SecureNote;
|
public bool IsSecureNote => Cipher?.Type == Core.Enums.CipherType.SecureNote;
|
||||||
|
public bool IsFido2Key => Cipher?.Type == Core.Enums.CipherType.Fido2Key;
|
||||||
public FormattedString ColoredPassword => GeneratedValueFormatter.Format(Cipher.Login.Password);
|
public FormattedString ColoredPassword => GeneratedValueFormatter.Format(Cipher.Login.Password);
|
||||||
public FormattedString UpdatedText
|
public FormattedString UpdatedText
|
||||||
{
|
{
|
||||||
@@ -246,6 +249,7 @@ namespace Bit.App.Pages
|
|||||||
public double TotpProgress => string.IsNullOrEmpty(TotpSec) ? 0 : double.Parse(TotpSec) * 100 / _totpInterval;
|
public double TotpProgress => string.IsNullOrEmpty(TotpSec) ? 0 : double.Parse(TotpSec) * 100 / _totpInterval;
|
||||||
public bool IsDeleted => Cipher.IsDeleted;
|
public bool IsDeleted => Cipher.IsDeleted;
|
||||||
public bool CanEdit => !Cipher.IsDeleted;
|
public bool CanEdit => !Cipher.IsDeleted;
|
||||||
|
public bool CanClone => Cipher.IsClonable;
|
||||||
|
|
||||||
public async Task<bool> LoadAsync(Action finishedLoadingAction = null)
|
public async Task<bool> LoadAsync(Action finishedLoadingAction = null)
|
||||||
{
|
{
|
||||||
@@ -645,6 +649,11 @@ namespace Bit.App.Pages
|
|||||||
text = Cipher.Card.Code;
|
text = Cipher.Card.Code;
|
||||||
name = AppResources.SecurityCode;
|
name = AppResources.SecurityCode;
|
||||||
}
|
}
|
||||||
|
else if (id == "Fido2KeyApplication")
|
||||||
|
{
|
||||||
|
text = Cipher.Fido2Key?.LaunchUri;
|
||||||
|
name = AppResources.Application;
|
||||||
|
}
|
||||||
|
|
||||||
if (text != null)
|
if (text != null)
|
||||||
{
|
{
|
||||||
@@ -668,14 +677,25 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LaunchUri(LoginUriView uri)
|
private void LaunchUri(ILaunchableView launchableView)
|
||||||
{
|
{
|
||||||
if (uri.CanLaunch && (Page as BaseContentPage).DoOnce())
|
if (launchableView.CanLaunch && (Page as BaseContentPage).DoOnce())
|
||||||
{
|
{
|
||||||
_platformUtilsService.LaunchUri(uri.LaunchUri);
|
_platformUtilsService.LaunchUri(launchableView.LaunchUri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task CloneAsync()
|
||||||
|
{
|
||||||
|
if (!await CanCloneAsync() || !await PromptPasswordAsync())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var page = new CipherAddEditPage(CipherId, cloneMode: true, cipherDetailsPage: Page as CipherDetailsPage);
|
||||||
|
await Page.Navigation.PushModalAsync(new NavigationPage(page));
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<bool> PromptPasswordAsync()
|
public async Task<bool> PromptPasswordAsync()
|
||||||
{
|
{
|
||||||
if (Cipher.Reprompt == CipherRepromptType.None || _passwordReprompted)
|
if (Cipher.Reprompt == CipherRepromptType.None || _passwordReprompted)
|
||||||
@@ -685,5 +705,21 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
return _passwordReprompted = await _passwordRepromptService.ShowPasswordPromptAsync();
|
return _passwordReprompted = await _passwordRepromptService.ShowPasswordPromptAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<bool> CanCloneAsync()
|
||||||
|
{
|
||||||
|
if (Cipher.Type == CipherType.Fido2Key)
|
||||||
|
{
|
||||||
|
await _platformUtilsService.ShowDialogAsync(AppResources.PasskeyWillNotBeCopied);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Cipher.Type == CipherType.Login && Cipher.Login?.Fido2Key != null)
|
||||||
|
{
|
||||||
|
return await _platformUtilsService.ShowDialogAsync(AppResources.ThePasskeyWillNotBeCopiedToTheClonedItemDoYouWantToContinueCloningThisItem, AppResources.PasskeyWillNotBeCopied, AppResources.Yes, AppResources.No);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,8 @@
|
|||||||
Priority="-1"
|
Priority="-1"
|
||||||
UseOriginalImage="True"
|
UseOriginalImage="True"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Account}" />
|
AutomationProperties.Name="{u:I18n Account}"
|
||||||
|
AutomationId="AccountIconButton" />
|
||||||
<ToolbarItem IconImageSource="search.png" Clicked="Search_Clicked"
|
<ToolbarItem IconImageSource="search.png" Clicked="Search_Clicked"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Search}" />
|
AutomationProperties.Name="{u:I18n Search}" />
|
||||||
|
|||||||
@@ -41,7 +41,8 @@
|
|||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
TextChanged="SearchBar_TextChanged"
|
TextChanged="SearchBar_TextChanged"
|
||||||
SearchButtonPressed="SearchBar_SearchButtonPressed"
|
SearchButtonPressed="SearchBar_SearchButtonPressed"
|
||||||
Placeholder="{Binding PageTitle}" />
|
Placeholder="{Binding PageTitle}"
|
||||||
|
AutomationId="SearchBar" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="list-section-separator-bottom, list-section-separator-bottom-platform"
|
<BoxView StyleClass="list-section-separator-bottom, list-section-separator-bottom-platform"
|
||||||
x:Name="_separator" x:Key="separator" />
|
x:Name="_separator" x:Key="separator" />
|
||||||
@@ -91,7 +92,8 @@
|
|||||||
Source="empty_items_state" />
|
Source="empty_items_state" />
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n ThereAreNoItemsThatMatchTheSearch}"
|
Text="{u:I18n ThereAreNoItemsThatMatchTheSearch}"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="NoSearchResultsLabel" />
|
||||||
<Button
|
<Button
|
||||||
Text="{u:I18n AddAnItem}"
|
Text="{u:I18n AddAnItem}"
|
||||||
Command="{Binding AddCipherCommand}"
|
Command="{Binding AddCipherCommand}"
|
||||||
@@ -104,7 +106,8 @@
|
|||||||
SelectionMode="Single"
|
SelectionMode="Single"
|
||||||
SelectionChanged="RowSelected"
|
SelectionChanged="RowSelected"
|
||||||
StyleClass="list, list-platform"
|
StyleClass="list, list-platform"
|
||||||
ExtraDataForLogging="Ciphers Page">
|
ExtraDataForLogging="Ciphers Page"
|
||||||
|
AutomationId="CipherList">
|
||||||
<CollectionView.ItemTemplate>
|
<CollectionView.ItemTemplate>
|
||||||
<DataTemplate x:DataType="views:CipherView">
|
<DataTemplate x:DataType="views:CipherView">
|
||||||
<controls:CipherViewCell
|
<controls:CipherViewCell
|
||||||
|
|||||||
@@ -208,6 +208,11 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
else if (selection == AppResources.Autofill || selection == AppResources.AutofillAndSave)
|
else if (selection == AppResources.Autofill || selection == AppResources.AutofillAndSave)
|
||||||
{
|
{
|
||||||
|
if (cipher.Reprompt != CipherRepromptType.None && !await _passwordRepromptService.ShowPasswordPromptAsync())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (selection == AppResources.AutofillAndSave)
|
if (selection == AppResources.AutofillAndSave)
|
||||||
{
|
{
|
||||||
var uris = cipher.Login?.Uris?.ToList();
|
var uris = cipher.Login?.Uris?.ToList();
|
||||||
|
|||||||
@@ -25,7 +25,8 @@
|
|||||||
Priority="-1"
|
Priority="-1"
|
||||||
UseOriginalImage="True"
|
UseOriginalImage="True"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Account}" />
|
AutomationProperties.Name="{u:I18n Account}"
|
||||||
|
AutomationId="AccountIconButton" />
|
||||||
<ToolbarItem Icon="search.png" Clicked="Search_Clicked"
|
<ToolbarItem Icon="search.png" Clicked="Search_Clicked"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Search}" />
|
AutomationProperties.Name="{u:I18n Search}" />
|
||||||
@@ -65,7 +66,8 @@
|
|||||||
<DataTemplate x:Key="groupTemplate"
|
<DataTemplate x:Key="groupTemplate"
|
||||||
x:DataType="pages:GroupingsPageListItem">
|
x:DataType="pages:GroupingsPageListItem">
|
||||||
<controls:ExtendedStackLayout Orientation="Horizontal"
|
<controls:ExtendedStackLayout Orientation="Horizontal"
|
||||||
StyleClass="list-row, list-row-platform">
|
StyleClass="list-row, list-row-platform"
|
||||||
|
AutomationId="{Binding AutomationId}">
|
||||||
<controls:IconLabel Text="{Binding Icon, Mode=OneWay}"
|
<controls:IconLabel Text="{Binding Icon, Mode=OneWay}"
|
||||||
HorizontalOptions="Start"
|
HorizontalOptions="Start"
|
||||||
VerticalOptions="Center"
|
VerticalOptions="Center"
|
||||||
@@ -79,12 +81,14 @@
|
|||||||
LineBreakMode="TailTruncation"
|
LineBreakMode="TailTruncation"
|
||||||
HorizontalOptions="FillAndExpand"
|
HorizontalOptions="FillAndExpand"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
StyleClass="list-title"/>
|
StyleClass="list-title"
|
||||||
|
AutomationId="ItemNameLabel" />
|
||||||
<Label Text="{Binding ItemCount, Mode=OneWay}"
|
<Label Text="{Binding ItemCount, Mode=OneWay}"
|
||||||
HorizontalOptions="End"
|
HorizontalOptions="End"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
HorizontalTextAlignment="End"
|
HorizontalTextAlignment="End"
|
||||||
StyleClass="list-sub"/>
|
StyleClass="list-sub"
|
||||||
|
AutomationId="ItemCountLabel" />
|
||||||
</controls:ExtendedStackLayout>
|
</controls:ExtendedStackLayout>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
|
|
||||||
@@ -95,7 +99,8 @@
|
|||||||
Spacing="0"
|
Spacing="0"
|
||||||
Padding="0"
|
Padding="0"
|
||||||
VerticalOptions="FillAndExpand"
|
VerticalOptions="FillAndExpand"
|
||||||
StyleClass="list-row-header-container, list-row-header-container-platform">
|
StyleClass="list-row-header-container, list-row-header-container-platform"
|
||||||
|
AutomationId="{Binding AutomationId}">
|
||||||
<BoxView
|
<BoxView
|
||||||
StyleClass="list-section-separator-top, list-section-separator-top-platform" />
|
StyleClass="list-section-separator-top, list-section-separator-top-platform" />
|
||||||
<StackLayout StyleClass="list-row-header, list-row-header-platform">
|
<StackLayout StyleClass="list-row-header, list-row-header-platform">
|
||||||
@@ -104,7 +109,8 @@
|
|||||||
StyleClass="list-header, list-header-platform" />
|
StyleClass="list-header, list-header-platform" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding ItemCount}"
|
Text="{Binding ItemCount}"
|
||||||
StyleClass="list-header-sub" />
|
StyleClass="list-header-sub"
|
||||||
|
AutomationId="SectionItemCount" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
<BoxView StyleClass="list-section-separator-bottom, list-section-separator-bottom-platform" />
|
<BoxView StyleClass="list-section-separator-bottom, list-section-separator-bottom-platform" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
@@ -147,7 +153,8 @@
|
|||||||
IsVisible="{Binding ShowNoData}">
|
IsVisible="{Binding ShowNoData}">
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding NoDataText}"
|
Text="{Binding NoDataText}"
|
||||||
HorizontalTextAlignment="Center"></Label>
|
HorizontalTextAlignment="Center"
|
||||||
|
AutomationId="NoDataDisplayed"></Label>
|
||||||
<Button
|
<Button
|
||||||
Text="{u:I18n AddAnItem}"
|
Text="{u:I18n AddAnItem}"
|
||||||
Clicked="AddButton_Clicked"
|
Clicked="AddButton_Clicked"
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
namespace Bit.App.Pages
|
using Bit.App.Utilities.Automation;
|
||||||
|
|
||||||
|
namespace Bit.App.Pages
|
||||||
{
|
{
|
||||||
public class GroupingsPageHeaderListItem : IGroupingsPageListItem
|
public class GroupingsPageHeaderListItem : IGroupingsPageListItem
|
||||||
{
|
{
|
||||||
@@ -10,5 +12,12 @@
|
|||||||
|
|
||||||
public string Title { get; }
|
public string Title { get; }
|
||||||
public string ItemCount { get; set; }
|
public string ItemCount { get; set; }
|
||||||
|
public string AutomationId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return AutomationIdsHelper.AddSuffixFor(AutomationIdsHelper.ToEnglishTitleCase(Title), SuffixType.Header);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using Bit.App.Utilities.Automation;
|
||||||
|
|
||||||
namespace Bit.App.Pages
|
namespace Bit.App.Pages
|
||||||
{
|
{
|
||||||
@@ -32,5 +33,6 @@ namespace Bit.App.Pages
|
|||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public string NameShort => string.IsNullOrWhiteSpace(Name) || Name.Length == 0 ? "-" : Name[0].ToString();
|
public string NameShort => string.IsNullOrWhiteSpace(Name) || Name.Length == 0 ? "-" : Name[0].ToString();
|
||||||
public string ItemCount { get; set; }
|
public string ItemCount { get; set; }
|
||||||
|
public string AutomationId => AutomationIdsHelper.AddSuffixFor(NameShort, SuffixType.ListGroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
|
using Bit.App.Utilities.Automation;
|
||||||
using Bit.Core;
|
using Bit.Core;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.View;
|
using Bit.Core.Models.View;
|
||||||
@@ -59,6 +60,9 @@ namespace Bit.App.Pages
|
|||||||
case CipherType.Identity:
|
case CipherType.Identity:
|
||||||
_name = AppResources.TypeIdentity;
|
_name = AppResources.TypeIdentity;
|
||||||
break;
|
break;
|
||||||
|
case CipherType.Fido2Key:
|
||||||
|
_name = AppResources.Passkey;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -107,6 +111,9 @@ namespace Bit.App.Pages
|
|||||||
case CipherType.Identity:
|
case CipherType.Identity:
|
||||||
_icon = BitwardenIcons.IdCard;
|
_icon = BitwardenIcons.IdCard;
|
||||||
break;
|
break;
|
||||||
|
case CipherType.Fido2Key:
|
||||||
|
_icon = BitwardenIcons.Passkey;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
_icon = BitwardenIcons.Globe;
|
_icon = BitwardenIcons.Globe;
|
||||||
break;
|
break;
|
||||||
@@ -115,5 +122,38 @@ namespace Bit.App.Pages
|
|||||||
return _icon;
|
return _icon;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string AutomationId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (Type != null)
|
||||||
|
{
|
||||||
|
return AutomationIdsHelper.AddSuffixFor(System.Enum.GetName(typeof(CipherType), Type.Value), SuffixType.Filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsTrash)
|
||||||
|
{
|
||||||
|
return AutomationIdsHelper.AddSuffixFor("Trash", SuffixType.Filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Folder != null)
|
||||||
|
{
|
||||||
|
return AutomationIdsHelper.AddSuffixFor("Folder", SuffixType.Filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Collection != null)
|
||||||
|
{
|
||||||
|
return AutomationIdsHelper.AddSuffixFor("Collection", SuffixType.Filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsTotpCode)
|
||||||
|
{
|
||||||
|
return AutomationIdsHelper.AddSuffixFor("TOTP", SuffixType.ListItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -235,35 +235,18 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
AddTotpGroupItem(groupedItems, uppercaseGroupNames);
|
AddTotpGroupItem(groupedItems, uppercaseGroupNames);
|
||||||
|
|
||||||
groupedItems.Add(new GroupingsPageListGroup(
|
var types = new CipherType[] { CipherType.Login, CipherType.Card, CipherType.Identity, CipherType.SecureNote };
|
||||||
AppResources.Types, 4, uppercaseGroupNames, !hasFavorites)
|
var typesGroup = new GroupingsPageListGroup(AppResources.Types, types.Length, uppercaseGroupNames, !hasFavorites);
|
||||||
|
foreach (CipherType t in types)
|
||||||
{
|
{
|
||||||
new GroupingsPageListItem
|
typesGroup.Add(new GroupingsPageListItem
|
||||||
{
|
{
|
||||||
Type = CipherType.Login,
|
Type = t,
|
||||||
ItemCount = (_typeCounts.ContainsKey(CipherType.Login) ?
|
ItemCount = _typeCounts.GetValueOrDefault(t).ToString("N0")
|
||||||
_typeCounts[CipherType.Login] : 0).ToString("N0")
|
|
||||||
},
|
|
||||||
new GroupingsPageListItem
|
|
||||||
{
|
|
||||||
Type = CipherType.Card,
|
|
||||||
ItemCount = (_typeCounts.ContainsKey(CipherType.Card) ?
|
|
||||||
_typeCounts[CipherType.Card] : 0).ToString("N0")
|
|
||||||
},
|
|
||||||
new GroupingsPageListItem
|
|
||||||
{
|
|
||||||
Type = CipherType.Identity,
|
|
||||||
ItemCount = (_typeCounts.ContainsKey(CipherType.Identity) ?
|
|
||||||
_typeCounts[CipherType.Identity] : 0).ToString("N0")
|
|
||||||
},
|
|
||||||
new GroupingsPageListItem
|
|
||||||
{
|
|
||||||
Type = CipherType.SecureNote,
|
|
||||||
ItemCount = (_typeCounts.ContainsKey(CipherType.SecureNote) ?
|
|
||||||
_typeCounts[CipherType.SecureNote] : 0).ToString("N0")
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
groupedItems.Add(typesGroup);
|
||||||
|
}
|
||||||
if (NestedFolders?.Any() ?? false)
|
if (NestedFolders?.Any() ?? false)
|
||||||
{
|
{
|
||||||
var folderListItems = NestedFolders.Select(f =>
|
var folderListItems = NestedFolders.Select(f =>
|
||||||
@@ -330,6 +313,8 @@ namespace Bit.App.Pages
|
|||||||
items.AddRange(itemGroup);
|
items.AddRange(itemGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Device.BeginInvokeOnMainThread(() =>
|
||||||
|
{
|
||||||
if (Device.RuntimePlatform == Device.iOS)
|
if (Device.RuntimePlatform == Device.iOS)
|
||||||
{
|
{
|
||||||
// HACK: [PS-536] Fix to avoid blank list after back navigation on unlocking with previous page info
|
// HACK: [PS-536] Fix to avoid blank list after back navigation on unlocking with previous page info
|
||||||
@@ -337,6 +322,7 @@ namespace Bit.App.Pages
|
|||||||
GroupedItems.Clear();
|
GroupedItems.Clear();
|
||||||
}
|
}
|
||||||
GroupedItems.ReplaceRange(items);
|
GroupedItems.ReplaceRange(items);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -356,6 +342,8 @@ namespace Bit.App.Pages
|
|||||||
items.AddRange(itemGroup);
|
items.AddRange(itemGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Device.BeginInvokeOnMainThread(() =>
|
||||||
|
{
|
||||||
if (groupedItems.Any())
|
if (groupedItems.Any())
|
||||||
{
|
{
|
||||||
if (Device.RuntimePlatform == Device.iOS)
|
if (Device.RuntimePlatform == Device.iOS)
|
||||||
@@ -371,6 +359,7 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
GroupedItems.Clear();
|
GroupedItems.Clear();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
@@ -378,9 +367,12 @@ namespace Bit.App.Pages
|
|||||||
_doingLoad = false;
|
_doingLoad = false;
|
||||||
Loaded = true;
|
Loaded = true;
|
||||||
Loading = false;
|
Loading = false;
|
||||||
|
Device.BeginInvokeOnMainThread(() =>
|
||||||
|
{
|
||||||
ShowNoData = (MainPage && !HasCiphers) || !groupedItems.Any();
|
ShowNoData = (MainPage && !HasCiphers) || !groupedItems.Any();
|
||||||
ShowList = !ShowNoData;
|
ShowList = !ShowNoData;
|
||||||
DisableRefreshing();
|
DisableRefreshing();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -575,7 +567,9 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
else if (Type != null)
|
else if (Type != null)
|
||||||
{
|
{
|
||||||
Filter = c => c.Type == Type.Value && !c.IsDeleted;
|
Filter = c => !c.IsDeleted
|
||||||
|
&&
|
||||||
|
Type.Value.IsEqualToOrCanSignIn(c.Type);
|
||||||
}
|
}
|
||||||
else if (FolderId != null)
|
else if (FolderId != null)
|
||||||
{
|
{
|
||||||
@@ -642,14 +636,11 @@ namespace Bit.App.Pages
|
|||||||
NoFolderCiphers.Add(c);
|
NoFolderCiphers.Add(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_typeCounts.ContainsKey(c.Type))
|
// Fido2Key ciphers should be counted as Login ciphers
|
||||||
{
|
var countType = c.Type == CipherType.Fido2Key ? CipherType.Login : c.Type;
|
||||||
_typeCounts[c.Type] = _typeCounts[c.Type] + 1;
|
_typeCounts[countType] = _typeCounts.TryGetValue(countType, out var currentTypeCount)
|
||||||
}
|
? currentTypeCount + 1
|
||||||
else
|
: 1;
|
||||||
{
|
|
||||||
_typeCounts.Add(c.Type, 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c.IsDeleted)
|
if (c.IsDeleted)
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
<ContentPage.ToolbarItems>
|
<ContentPage.ToolbarItems>
|
||||||
<ToolbarItem Text="{u:I18n Cancel}" Clicked="Close_Clicked" Order="Primary" Priority="-1" />
|
<ToolbarItem Text="{u:I18n Cancel}" Clicked="Close_Clicked" Order="Primary" Priority="-1" />
|
||||||
<ToolbarItem Text="{u:I18n Move}" Clicked="Save_Clicked" />
|
<ToolbarItem Text="{u:I18n Move}" Command="{Binding MoveCommand}" />
|
||||||
</ContentPage.ToolbarItems>
|
</ContentPage.ToolbarItems>
|
||||||
|
|
||||||
<ContentPage.Resources>
|
<ContentPage.Resources>
|
||||||
|
|||||||
@@ -32,19 +32,6 @@ namespace Bit.App.Pages
|
|||||||
await LoadOnAppearedAsync(_scrollView, true, () => _vm.LoadAsync());
|
await LoadOnAppearedAsync(_scrollView, true, () => _vm.LoadAsync());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnDisappearing()
|
|
||||||
{
|
|
||||||
base.OnDisappearing();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void Save_Clicked(object sender, System.EventArgs e)
|
|
||||||
{
|
|
||||||
if (DoOnce())
|
|
||||||
{
|
|
||||||
await _vm.SubmitAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void Close_Clicked(object sender, System.EventArgs e)
|
private async void Close_Clicked(object sender, System.EventArgs e)
|
||||||
{
|
{
|
||||||
if (DoOnce())
|
if (DoOnce())
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Input;
|
||||||
using Bit.App.Abstractions;
|
using Bit.App.Abstractions;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
@@ -8,6 +9,7 @@ using Bit.Core.Enums;
|
|||||||
using Bit.Core.Exceptions;
|
using Bit.Core.Exceptions;
|
||||||
using Bit.Core.Models.View;
|
using Bit.Core.Models.View;
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
|
using Xamarin.CommunityToolkit.ObjectModel;
|
||||||
|
|
||||||
namespace Bit.App.Pages
|
namespace Bit.App.Pages
|
||||||
{
|
{
|
||||||
@@ -34,6 +36,8 @@ namespace Bit.App.Pages
|
|||||||
Collections = new ExtendedObservableCollection<CollectionViewModel>();
|
Collections = new ExtendedObservableCollection<CollectionViewModel>();
|
||||||
OrganizationOptions = new List<KeyValuePair<string, string>>();
|
OrganizationOptions = new List<KeyValuePair<string, string>>();
|
||||||
PageTitle = AppResources.MoveToOrganization;
|
PageTitle = AppResources.MoveToOrganization;
|
||||||
|
|
||||||
|
MoveCommand = new AsyncCommand(MoveAsync, onException: ex => HandleException(ex), allowsMultipleExecutions: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string CipherId { get; set; }
|
public string CipherId { get; set; }
|
||||||
@@ -62,6 +66,8 @@ namespace Bit.App.Pages
|
|||||||
set => SetProperty(ref _hasOrganizations, value);
|
set => SetProperty(ref _hasOrganizations, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ICommand MoveCommand { get; }
|
||||||
|
|
||||||
public async Task LoadAsync()
|
public async Task LoadAsync()
|
||||||
{
|
{
|
||||||
var allCollections = await _collectionService.GetAllDecryptedAsync();
|
var allCollections = await _collectionService.GetAllDecryptedAsync();
|
||||||
@@ -84,7 +90,7 @@ namespace Bit.App.Pages
|
|||||||
FilterCollections();
|
FilterCollections();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<bool> SubmitAsync()
|
public async Task<bool> MoveAsync()
|
||||||
{
|
{
|
||||||
var selectedCollectionIds = Collections?.Where(c => c.Checked).Select(c => c.Collection.Id);
|
var selectedCollectionIds = Collections?.Where(c => c.Checked).Select(c => c.Collection.Id);
|
||||||
if (!selectedCollectionIds?.Any() ?? true)
|
if (!selectedCollectionIds?.Any() ?? true)
|
||||||
@@ -107,8 +113,15 @@ namespace Bit.App.Pages
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _deviceActionService.ShowLoadingAsync(AppResources.Saving);
|
await _deviceActionService.ShowLoadingAsync(AppResources.Saving);
|
||||||
await _cipherService.ShareWithServerAsync(cipherView, OrganizationId, checkedCollectionIds);
|
var error = await _cipherService.ShareWithServerAsync(cipherView, OrganizationId, checkedCollectionIds);
|
||||||
await _deviceActionService.HideLoadingAsync();
|
await _deviceActionService.HideLoadingAsync();
|
||||||
|
|
||||||
|
if (error == ICipherService.ShareWithServerError.DuplicatedPasskeyInOrg)
|
||||||
|
{
|
||||||
|
_platformUtilsService.ShowToast(null, null, AppResources.ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
var movedItemToOrgText = string.Format(AppResources.MovedItemToOrg, cipherView.Name,
|
var movedItemToOrgText = string.Format(AppResources.MovedItemToOrg, cipherView.Name,
|
||||||
(await _organizationService.GetAsync(OrganizationId)).Name);
|
(await _organizationService.GetAsync(OrganizationId)).Name);
|
||||||
_platformUtilsService.ShowToast("success", null, movedItemToOrgText);
|
_platformUtilsService.ShowToast("success", null, movedItemToOrgText);
|
||||||
|
|||||||
349
src/App/Resources/AppResources.Designer.cs
generated
349
src/App/Resources/AppResources.Designer.cs
generated
@@ -202,6 +202,24 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Biometric unlock for this account is disabled pending verification of master password..
|
||||||
|
/// </summary>
|
||||||
|
public static string AccountBiometricInvalidated {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("AccountBiometricInvalidated", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Autofill biometric unlock for this account is disabled pending verification of master password..
|
||||||
|
/// </summary>
|
||||||
|
public static string AccountBiometricInvalidatedExtension {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("AccountBiometricInvalidatedExtension", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Your new account has been created! You may now log in..
|
/// Looks up a localized string similar to Your new account has been created! You may now log in..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -535,6 +553,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Application.
|
||||||
|
/// </summary>
|
||||||
|
public static string Application {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Application", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Approve login requests.
|
/// Looks up a localized string similar to Approve login requests.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -778,15 +805,6 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Auto-fill will not be offered for blocked URIs. Separate multiple URIs with a comma. For example: "https://twitter.com, androidapp://com.twitter.android"..
|
|
||||||
/// </summary>
|
|
||||||
public static string AutofillBlockedUrisDescription {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("AutofillBlockedUrisDescription", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Do you want to auto-fill or view this item?.
|
/// Looks up a localized string similar to Do you want to auto-fill or view this item?.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -922,6 +940,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Auto-fill will not be offered for these URIs..
|
||||||
|
/// </summary>
|
||||||
|
public static string AutoFillWillNotBeOfferedForTheseURIs {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("AutoFillWillNotBeOfferedForTheseURIs", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Auto-fill with Bitwarden.
|
/// Looks up a localized string similar to Auto-fill with Bitwarden.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -931,6 +958,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Available for two-step login.
|
||||||
|
/// </summary>
|
||||||
|
public static string AvailableForTwoStepLogin {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("AvailableForTwoStepLogin", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to A verification code was sent to your email.
|
/// Looks up a localized string similar to A verification code was sent to your email.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -967,24 +1003,6 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Biometric unlock disabled pending verification of master password..
|
|
||||||
/// </summary>
|
|
||||||
public static string AccountBiometricInvalidated {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("AccountBiometricInvalidated", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Biometric unlock for autofill disabled pending verification of master password..
|
|
||||||
/// </summary>
|
|
||||||
public static string AccountBiometricInvalidatedExtension {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("AccountBiometricInvalidatedExtension", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Biometrics.
|
/// Looks up a localized string similar to Biometrics.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1228,6 +1246,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Block auto-fill.
|
||||||
|
/// </summary>
|
||||||
|
public static string BlockAutoFill {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("BlockAutoFill", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Brand.
|
/// Looks up a localized string similar to Brand.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1264,6 +1291,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Cannot edit multiple URIs at once.
|
||||||
|
/// </summary>
|
||||||
|
public static string CannotEditMultipleURIsAtOnce {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("CannotEditMultipleURIsAtOnce", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Cannot open the app "{0}"..
|
/// Looks up a localized string similar to Cannot open the app "{0}"..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1552,6 +1588,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Copy application.
|
||||||
|
/// </summary>
|
||||||
|
public static string CopyApplication {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("CopyApplication", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Copy link.
|
/// Looks up a localized string similar to Copy link.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1660,6 +1705,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Created {0}.
|
||||||
|
/// </summary>
|
||||||
|
public static string CreatedX {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("CreatedX", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Creating account....
|
/// Looks up a localized string similar to Creating account....
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1750,6 +1804,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Data region.
|
||||||
|
/// </summary>
|
||||||
|
public static string DataRegion {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("DataRegion", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Password updated.
|
/// Looks up a localized string similar to Password updated.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2137,6 +2200,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Edit URI.
|
||||||
|
/// </summary>
|
||||||
|
public static string EditURI {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("EditURI", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Email.
|
/// Looks up a localized string similar to Email.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2290,6 +2362,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Enter URI.
|
||||||
|
/// </summary>
|
||||||
|
public static string EnterURI {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("EnterURI", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Enter the 6 digit verification code from your authenticator app..
|
/// Looks up a localized string similar to Enter the 6 digit verification code from your authenticator app..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2326,6 +2407,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to EU.
|
||||||
|
/// </summary>
|
||||||
|
public static string EU {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("EU", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Exact.
|
/// Looks up a localized string similar to Exact.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2929,6 +3019,24 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Format: {0}.
|
||||||
|
/// </summary>
|
||||||
|
public static string FormatX {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("FormatX", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Format: {0}. Separate multiple URIs with a comma..
|
||||||
|
/// </summary>
|
||||||
|
public static string FormatXSeparateMultipleURIsWithAComma {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("FormatXSeparateMultipleURIsWithAComma", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Forwarded email alias.
|
/// Looks up a localized string similar to Forwarded email alias.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -3244,6 +3352,24 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Invalid API key.
|
||||||
|
/// </summary>
|
||||||
|
public static string InvalidAPIKey {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("InvalidAPIKey", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Invalid API token.
|
||||||
|
/// </summary>
|
||||||
|
public static string InvalidAPIToken {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("InvalidAPIToken", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Invalid email address..
|
/// Looks up a localized string similar to Invalid email address..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -3253,6 +3379,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Invalid format. Use https://, http://, or androidapp://.
|
||||||
|
/// </summary>
|
||||||
|
public static string InvalidFormatUseHttpsHttpOrAndroidApp {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("InvalidFormatUseHttpsHttpOrAndroidApp", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Invalid master password. Try again..
|
/// Looks up a localized string similar to Invalid master password. Try again..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -3271,6 +3406,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Invalid URI.
|
||||||
|
/// </summary>
|
||||||
|
public static string InvalidURI {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("InvalidURI", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Invalid verification code.
|
/// Looks up a localized string similar to Invalid verification code.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -3569,11 +3713,11 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Logging in as {0}.
|
/// Looks up a localized string similar to Logging in as {0} on {1}.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string LoggingInAsX {
|
public static string LoggingInAsXOnY {
|
||||||
get {
|
get {
|
||||||
return ResourceManager.GetString("LoggingInAsX", resourceCulture);
|
return ResourceManager.GetString("LoggingInAsXOnY", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3876,6 +4020,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Master password re-prompt help.
|
||||||
|
/// </summary>
|
||||||
|
public static string MasterPasswordRePromptHelp {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("MasterPasswordRePromptHelp", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Match detection.
|
/// Looks up a localized string similar to Match detection.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -4173,6 +4326,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to New blocked URI.
|
||||||
|
/// </summary>
|
||||||
|
public static string NewBlockedURI {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("NewBlockedURI", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to New custom field.
|
/// Looks up a localized string similar to New custom field.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -4660,6 +4822,33 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Passkey.
|
||||||
|
/// </summary>
|
||||||
|
public static string Passkey {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Passkey", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Passkeys.
|
||||||
|
/// </summary>
|
||||||
|
public static string Passkeys {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Passkeys", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Passkey will not be copied.
|
||||||
|
/// </summary>
|
||||||
|
public static string PasskeyWillNotBeCopied {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("PasskeyWillNotBeCopied", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Passphrase.
|
/// Looks up a localized string similar to Passphrase.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -5129,6 +5318,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Region.
|
||||||
|
/// </summary>
|
||||||
|
public static string Region {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Region", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Remember me.
|
/// Looks up a localized string similar to Remember me.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -5462,6 +5660,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Self-hosted.
|
||||||
|
/// </summary>
|
||||||
|
public static string SelfHosted {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("SelfHosted", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Self-hosted environment.
|
/// Looks up a localized string similar to Self-hosted environment.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6056,6 +6263,24 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to The passkey will not be copied to the cloned item. Do you want to continue cloning this item?.
|
||||||
|
/// </summary>
|
||||||
|
public static string ThePasskeyWillNotBeCopiedToTheClonedItemDoYouWantToContinueCloningThisItem {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ThePasskeyWillNotBeCopiedToTheClonedItemDoYouWantToContinueCloningThisItem", resourceCulture);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Looks up a localized string similar to There are no blocked URIs.
|
||||||
|
/// </summary>
|
||||||
|
public static string ThereAreNoBlockedURIs {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ThereAreNoBlockedURIs", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to There are no items in your vault that match "{0}".
|
/// Looks up a localized string similar to There are no items in your vault that match "{0}".
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6074,6 +6299,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to The URI {0} is already blocked.
|
||||||
|
/// </summary>
|
||||||
|
public static string TheURIXIsAlreadyBlocked {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TheURIXIsAlreadyBlocked", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to 30 days.
|
/// Looks up a localized string similar to 30 days.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6101,6 +6335,16 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to This item cannot be shared with the organization because there is one already with the same passkey..
|
||||||
|
/// </summary>
|
||||||
|
public static string ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePassk" +
|
||||||
|
"ey", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to This request is no longer valid.
|
/// Looks up a localized string similar to This request is no longer valid.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6389,6 +6633,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve..
|
||||||
|
/// </summary>
|
||||||
|
public static string UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Unlock vault.
|
/// Looks up a localized string similar to Unlock vault.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6515,6 +6768,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to URI removed.
|
||||||
|
/// </summary>
|
||||||
|
public static string URIRemoved {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("URIRemoved", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to URIs.
|
/// Looks up a localized string similar to URIs.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6524,6 +6786,24 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to URI saved.
|
||||||
|
/// </summary>
|
||||||
|
public static string URISaved {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("URISaved", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to US.
|
||||||
|
/// </summary>
|
||||||
|
public static string US {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("US", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Use another two-step login method.
|
/// Looks up a localized string similar to Use another two-step login method.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -7037,6 +7317,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to You cannot edit passkey application because it would invalidate the passkey.
|
||||||
|
/// </summary>
|
||||||
|
public static string YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Your account has been permanently deleted.
|
/// Looks up a localized string similar to Your account has been permanently deleted.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1585,9 +1585,6 @@ Skandering gebeur outomaties.</value>
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Versperde URI’s vir outovul</value>
|
<value>Versperde URI’s vir outovul</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>Outovul sal nie vir versperde URI’s gebied word nie. Skei meerdere URI’s met ’n komma. Byvoorbeeld: “https://twitter.com, androidapp://com.twitter.android”.</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Vra om aantekening toe te voeg</value>
|
<value>Vra om aantekening toe te voeg</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1753,10 +1750,10 @@ Skandering gebeur outomaties.</value>
|
|||||||
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
|
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Biometric unlock for this account is disabled pending verification of master password.</value>
|
<value>Biometriese ontgrendeling vir hierdie rekening is gedeaktiveer hangende bevestiging van hoofwagwoord.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</value>
|
<value>Outovul-biometriese ontgrendeline vir hierdie rekening is gedeaktiveer hangende bevestiging van hoofwagwoord.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>Aktiveer sinchronisering by verfrissing</value>
|
<value>Aktiveer sinchronisering by verfrissing</value>
|
||||||
@@ -2495,8 +2492,8 @@ Wil u na die rekening omskakel?</value>
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Kry hoofwagwoord wenk</value>
|
<value>Kry hoofwagwoord wenk</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>Teken in as {0}</value>
|
<value>Teken aan as {0} op {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Nie jy nie?</value>
|
<value>Nie jy nie?</value>
|
||||||
@@ -2609,10 +2606,111 @@ Wil u na die rekening omskakel?</value>
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>Daar is geen items wat met die soekterm ooreenstem nie</value>
|
<value>Daar is geen items wat met die soekterm ooreenstem nie</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>VS</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>EU</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Selghehuisves</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Datastreek</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Streek</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour.</value>
|
<value>U hoofwagwoord voldoen nie aan een of meer van die organisasiebeleide nie. Om toegang tot die kluis te kry, moet u nou u hoofwagwoord bywerk. Deur voort te gaan sal u van u huidige sessie afgeteken word, en u sal weer moet aanteken. Aktiewe sessies op ander toestelle kan vir tot een uur aktief bly.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Current master password</value>
|
<value>Huidige hoofwagwoord</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Created {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey will not be copied</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Copy application</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Hulpteks vir vra weer vir hoofwagwoord</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>Ontgrendeling kan misluk as daar onvoldoende geheue is. Verminder u KDF-geheue-instellings om dit op te los.</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Ongeldige API-sleutel</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Ongeldige API-teken</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Block auto-fill</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Auto-fill will not be offered for these URIs.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>New blocked URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI saved</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Invalid format. Use https://, http://, or androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>Edit URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>Enter URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Format: {0}. Separate multiple URIs with a comma.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Format: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Invalid URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI removed</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>There are no blocked URIs</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>The URI {0} is already blocked</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Cannot edit multiple URIs at once</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -1585,9 +1585,6 @@
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>تعبئة العناوين المحجوبة تلقائياً</value>
|
<value>تعبئة العناوين المحجوبة تلقائياً</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>لن يتم عرض التعبئة التلقائية للعناوين المحجوبة. افصل عناوين متعددة بفاصلة. مثال: "https://twitter.com, androidapp://com.twitter.android".</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>اطلب إضافة تسجيل الدخول</value>
|
<value>اطلب إضافة تسجيل الدخول</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1753,10 +1750,10 @@
|
|||||||
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
|
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Biometric unlock for this account is disabled pending verification of master password.</value>
|
<value>تم تعطيل فتح القفل الحيوي لهذا الحساب في انتظار التحقق من كلمة المرور الرئيسية.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</value>
|
<value>إلغاء القفل الحيوي للملء التلقائي لهذا الحساب معطل في انتظار التحقق من كلمة المرور الرئيسية.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>تمكين المزامنة عند التحديث</value>
|
<value>تمكين المزامنة عند التحديث</value>
|
||||||
@@ -2496,8 +2493,8 @@
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>احصل على تلميح كلمة المرور الرئيسية</value>
|
<value>احصل على تلميح كلمة المرور الرئيسية</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>تسجيل الدخول كـ {0}</value>
|
<value>تسجيل الدخول كـ {0} في {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>ليس أنت؟</value>
|
<value>ليس أنت؟</value>
|
||||||
@@ -2610,10 +2607,111 @@
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>لا توجد عناصر تطابق البحث</value>
|
<value>لا توجد عناصر تطابق البحث</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>الولايات المتحدة</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>الاتحاد الأوروبي</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>استضافة ذاتية</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>منطقة البيانات</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>المنطقة</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>كلمة المرور الرئيسية الخاصة بك لا تفي بواحدة أو أكثر من سياسات مؤسستك. من أجل الوصول إلى الخزنة، يجب عليك تحديث كلمة المرور الرئيسية الآن. سيتم تسجيل خروجك من الجلسة الحالية، مما يتطلب منك تسجيل الدخول مرة أخرى. وقد تظل الجلسات النشطة على أجهزة أخرى نشطة لمدة تصل إلى ساعة واحدة.</value>
|
<value>كلمة المرور الرئيسية الخاصة بك لا تفي بواحدة أو أكثر من سياسات مؤسستك. من أجل الوصول إلى الخزنة، يجب عليك تحديث كلمة المرور الرئيسية الآن. سيتم تسجيل خروجك من الجلسة الحالية، مما يتطلب منك تسجيل الدخول مرة أخرى. وقد تظل الجلسات النشطة على أجهزة أخرى نشطة لمدة تصل إلى ساعة واحدة.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>كلمة المرور الرئيسية الحالية</value>
|
<value>كلمة المرور الرئيسية الحالية</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Created {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey will not be copied</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Copy application</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Master password re-prompt help</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Invalid API key</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Invalid API token</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Block auto-fill</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Auto-fill will not be offered for these URIs.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>New blocked URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI saved</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Invalid format. Use https://, http://, or androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>Edit URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>Enter URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Format: {0}. Separate multiple URIs with a comma.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Format: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Invalid URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI removed</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>There are no blocked URIs</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>The URI {0} is already blocked</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Cannot edit multiple URIs at once</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -1585,9 +1585,6 @@ Skan prosesi avtomatik baş tutacaq.</value>
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Əngəllənən URI-lərin avto-doldurulması</value>
|
<value>Əngəllənən URI-lərin avto-doldurulması</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>Əngəllənən URI-lər üçün avto-doldurma təklif edilmir. Çoxlu URI-ni vergüllə ayırır. Nümunə: "https://twitter.com, androidapp://com.twitter.android".</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Giriş əlavə etmək üçün soruş</value>
|
<value>Giriş əlavə etmək üçün soruş</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2494,8 +2491,8 @@ Bu hesaba keçmək istəyirsiniz?</value>
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Ana parol üçün məsləhət alın</value>
|
<value>Ana parol üçün məsləhət alın</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>{0} olaraq giriş edilir</value>
|
<value>{1} üzərində {0} olaraq giriş edildi</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Siz deyilsiniz?</value>
|
<value>Siz deyilsiniz?</value>
|
||||||
@@ -2608,10 +2605,111 @@ Bu hesaba keçmək istəyirsiniz?</value>
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>Axtarışa uyğun gələn heç bir element yoxdur</value>
|
<value>Axtarışa uyğun gələn heç bir element yoxdur</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>ABŞ</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>AB</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Öz-özünə sahiblik edən</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Data bölgəsi</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Bölgə</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Ana parolunuz təşkilatınızdakı siyasətlərdən birinə və ya bir neçəsinə uyğun gəlmir. Anbara müraciət üçün ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər.</value>
|
<value>Ana parolunuz təşkilatınızdakı siyasətlərdən birinə və ya bir neçəsinə uyğun gəlmir. Anbara müraciət üçün ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Hazırkı ana parol</value>
|
<value>Hazırkı ana parol</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Created {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey will not be copied</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Copy application</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<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</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Yararsız API açarı</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Yararsız API tokeni</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Avto-doldurmanı əngəllə</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Bu URI-lər üçün avto-doldurma təklif olunmayacaq.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>Yeni əngəllənən URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI saxlanıldı</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Yararsız format. https://, http:// və ya androidapp:// istifadə edin</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>URI-ə düzəliş et</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>URI-ni daxil et</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Format: {0}. Bir neçə URI-ı vergüllə ayırın.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Format: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Yararsız URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI silindi</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>Əngəllənən URI yoxdur</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>URI {0} artıq əngəllənib</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Bir dəfəyə bir neçə URI-a düzəliş etmək mümkün deyil</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -1584,9 +1584,6 @@
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Аўтазапаўненне заблакіраваных URI</value>
|
<value>Аўтазапаўненне заблакіраваных URI</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>Аўтазапаўненне не будзе прапаноўвацца для заблакіраваных URI. Раздзяляйце некалькі URI з дапамогай коскі. Напрыклад: "https://twitter.com, androidapp://com.twitter.android".</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Пытацца пры дадаванні лагіна</value>
|
<value>Пытацца пры дадаванні лагіна</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2495,8 +2492,8 @@
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Атрымаць падказку да асноўнага пароля</value>
|
<value>Атрымаць падказку да асноўнага пароля</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>Увайсці як {0}</value>
|
<value>Вы ўваходзіце як {0} у {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Не вы?</value>
|
<value>Не вы?</value>
|
||||||
@@ -2609,10 +2606,111 @@
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>Адсутнічаюць элементы, якія адпавядаюць пошуку</value>
|
<value>Адсутнічаюць элементы, якія адпавядаюць пошуку</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>ЗША</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>ЕС</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Уласнае размяшчэнне</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Рэгіён даных</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Рэгіён</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Ваш асноўны пароль не адпавядае адной або некалькім палітыкам арганізацыі. Для атрымання доступу да сховішча, вы павінны абнавіць яго. Працягваючы, вы выйдзіце з бягучага сеанса і вам неабходна будзе ўвайсці паўторна. Актыўныя сеансы на іншых прыладах могуць заставацца актыўнымі на працягу адной гадзіны.</value>
|
<value>Ваш асноўны пароль не адпавядае адной або некалькім палітыкам арганізацыі. Для атрымання доступу да сховішча, вы павінны абнавіць яго. Працягваючы, вы выйдзіце з бягучага сеанса і вам неабходна будзе ўвайсці паўторна. Актыўныя сеансы на іншых прыладах могуць заставацца актыўнымі на працягу адной гадзіны.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Бягучы асноўны пароль</value>
|
<value>Бягучы асноўны пароль</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Created {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey will not be copied</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Copy application</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Дапамога з паўторным запытам асноўнага пароля</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>Па прычыне недахопу памяці можа адбыцца збой разблакіроўкі. Паменшыце налады памяці KDF, каб вырашыць гэту праблему</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Памылковы ключ API</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Памылковы токен API</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Блакіраваць аўтазапаўненне</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Аўтазапаўненне для гэтых URI прапаноўвацца не будзе.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>Новы заблакіраваны URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI захаваны</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Памылковы фармат. Выкарыстоўвайце https://, http:// або androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>Рэдагаваць URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>Увесці URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Фармат: {0}. Раздзяліце некалькі значэнняў URI коскай.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Фармат: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Памылковы URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI выдалены</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>Заблакіраваных URI пакуль няма</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>Гэты URI {0} ужо заблакіраваны</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Немагчыма рэдагаваць некалькі URI адначасова</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -1585,9 +1585,6 @@
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Блокирани за авт. попълване адреси</value>
|
<value>Блокирани за авт. попълване адреси</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>За посочените блокирани адреси няма да се прави автоматично попълване. Разделяйте отделните адреси със запетая. Пример: „https://twitter.com, androidapp://com.twitter.android“.</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Питане за добавяне на запис</value>
|
<value>Питане за добавяне на запис</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2495,8 +2492,8 @@ select Add TOTP to store the key safely</value>
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Получете подсказване за главната парола</value>
|
<value>Получете подсказване за главната парола</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>Вписване като {0}</value>
|
<value>Влизате като {0} в {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Това не сте Вие?</value>
|
<value>Това не сте Вие?</value>
|
||||||
@@ -2609,10 +2606,111 @@ select Add TOTP to store the key safely</value>
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>Няма елементи, които отговарят на търсенето</value>
|
<value>Няма елементи, които отговарят на търсенето</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>САЩ</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>ЕС</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Собствен хостинг</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Регион на данните</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Регион</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Вашата главна парола не отговаря на една или повече политики на организацията Ви. За да получите достъп до трезора, трябва да промените главната си парола сега. Това означава, че ще бъдете отписан(а) от текущата си сесия и ще трябва да се впишете отново. Активните сесии на други устройства може да продължат да бъдат активни още един час.</value>
|
<value>Вашата главна парола не отговаря на една или повече политики на организацията Ви. За да получите достъп до трезора, трябва да промените главната си парола сега. Това означава, че ще бъдете отписан(а) от текущата си сесия и ще трябва да се впишете отново. Активните сесии на други устройства може да продължат да бъдат активни още един час.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Текуща главна парола</value>
|
<value>Текуща главна парола</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Създадено на {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Приложение</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey will not be copied</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Копиране на приложението</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Помощ за повторното запитване за главната парола</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>Отключването може да бъде неуспешно заради недостатъчно памет. Намалете настройките на паметта за KDF, за да разрешите проблема.</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Неправилен ключ за ППИ</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Неправилен идентификатор за ППИ</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Блокиране на авт. попълване</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Автоматичното попълване няма да бъде предлагано за тези адреси.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>Нов блокиран адрес</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>Адресът е запазен</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Неправилен формат. Използвайте https://, http:// или androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>Редактиране на адреса</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>Въведете адрес</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Формат: {0}. Ако въвеждате повече адреси, разделяйте ги със запетая.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Формат: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Неправилен адрес</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>Адресът е премахнат</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>Няма блокирани адреси</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>Адресът {0} вече е блокиран</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Не може да редактирате повече от един адрес едновременно</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -160,7 +160,7 @@
|
|||||||
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Credits" xml:space="preserve">
|
<data name="Credits" xml:space="preserve">
|
||||||
<value>Credits</value>
|
<value>কৃতিত্ব</value>
|
||||||
<comment>Title for page that we use to give credit to resources that we use.</comment>
|
<comment>Title for page that we use to give credit to resources that we use.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Delete" xml:space="preserve">
|
<data name="Delete" xml:space="preserve">
|
||||||
@@ -168,11 +168,11 @@
|
|||||||
<comment>Delete an entity (verb).</comment>
|
<comment>Delete an entity (verb).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Deleting" xml:space="preserve">
|
<data name="Deleting" xml:space="preserve">
|
||||||
<value>Deleting...</value>
|
<value>মোছা হচ্ছে...</value>
|
||||||
<comment>Message shown when interacting with the server</comment>
|
<comment>Message shown when interacting with the server</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="DoYouReallyWantToDelete" xml:space="preserve">
|
<data name="DoYouReallyWantToDelete" xml:space="preserve">
|
||||||
<value>Do you really want to delete? This cannot be undone.</value>
|
<value>আপনি কি সত্যিই মুছে ফেলতে চান? এটিকে পূর্বের মত করা যাবে না।.</value>
|
||||||
<comment>Confirmation alert message when deleteing something.</comment>
|
<comment>Confirmation alert message when deleteing something.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Edit" xml:space="preserve">
|
<data name="Edit" xml:space="preserve">
|
||||||
@@ -190,16 +190,16 @@
|
|||||||
<comment>Full label for a email address.</comment>
|
<comment>Full label for a email address.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="EmailUs" xml:space="preserve">
|
<data name="EmailUs" xml:space="preserve">
|
||||||
<value>Email us</value>
|
<value>আমাদের ইমেইল করুন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EmailUsDescription" xml:space="preserve">
|
<data name="EmailUsDescription" xml:space="preserve">
|
||||||
<value>Email us directly to get help or leave feedback.</value>
|
<value>সাহায্য পেতে বা মতামত দিতে সরাসরি আমাদের ইমেল করুন।</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnterPIN" xml:space="preserve">
|
<data name="EnterPIN" xml:space="preserve">
|
||||||
<value>Enter your PIN code.</value>
|
<value>আপনার পিন কোডটি প্রবেশ করান</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Favorites" xml:space="preserve">
|
<data name="Favorites" xml:space="preserve">
|
||||||
<value>Favorites</value>
|
<value>পছন্দসমূহ</value>
|
||||||
<comment>Title for your favorite items in the vault.</comment>
|
<comment>Title for your favorite items in the vault.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="FileBugReport" xml:space="preserve">
|
<data name="FileBugReport" xml:space="preserve">
|
||||||
@@ -216,7 +216,7 @@
|
|||||||
<comment>Label for a folder.</comment>
|
<comment>Label for a folder.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="FolderCreated" xml:space="preserve">
|
<data name="FolderCreated" xml:space="preserve">
|
||||||
<value>New folder created.</value>
|
<value>নতুন ফোল্ডার তৈরি হয়েছে।</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FolderDeleted" xml:space="preserve">
|
<data name="FolderDeleted" xml:space="preserve">
|
||||||
<value>Folder deleted.</value>
|
<value>Folder deleted.</value>
|
||||||
@@ -276,7 +276,7 @@
|
|||||||
<value>আপনি লগ আউট করতে চান?</value>
|
<value>আপনি লগ আউট করতে চান?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RemoveAccount" xml:space="preserve">
|
<data name="RemoveAccount" xml:space="preserve">
|
||||||
<value>Remove account</value>
|
<value>অ্যাকাউন্ট অপসারণ করুন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RemoveAccountConfirmation" xml:space="preserve">
|
<data name="RemoveAccountConfirmation" xml:space="preserve">
|
||||||
<value>Are you sure you want to remove this account?</value>
|
<value>Are you sure you want to remove this account?</value>
|
||||||
@@ -315,30 +315,30 @@
|
|||||||
<comment>Label for notes.</comment>
|
<comment>Label for notes.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Ok" xml:space="preserve">
|
<data name="Ok" xml:space="preserve">
|
||||||
<value>Ok</value>
|
<value>ঠিক আছে</value>
|
||||||
<comment>Acknowledgement.</comment>
|
<comment>Acknowledgement.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Password" xml:space="preserve">
|
<data name="Password" xml:space="preserve">
|
||||||
<value>Password</value>
|
<value>পাসওয়ার্ড</value>
|
||||||
<comment>Label for a password.</comment>
|
<comment>Label for a password.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Save" xml:space="preserve">
|
<data name="Save" xml:space="preserve">
|
||||||
<value>Save</value>
|
<value>সংরক্ষণ করুন</value>
|
||||||
<comment>Button text for a save operation (verb).</comment>
|
<comment>Button text for a save operation (verb).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Move" xml:space="preserve">
|
<data name="Move" xml:space="preserve">
|
||||||
<value>Move</value>
|
<value>স্থানান্তর করুন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Saving" xml:space="preserve">
|
<data name="Saving" xml:space="preserve">
|
||||||
<value>Saving...</value>
|
<value>Saving...</value>
|
||||||
<comment>Message shown when interacting with the server</comment>
|
<comment>Message shown when interacting with the server</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings" xml:space="preserve">
|
<data name="Settings" xml:space="preserve">
|
||||||
<value>Settings</value>
|
<value>সেটিংস</value>
|
||||||
<comment>The title for the settings page.</comment>
|
<comment>The title for the settings page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Show" xml:space="preserve">
|
<data name="Show" xml:space="preserve">
|
||||||
<value>Show</value>
|
<value>দেখান</value>
|
||||||
<comment>Reveal a hidden value (password).</comment>
|
<comment>Reveal a hidden value (password).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ItemDeleted" xml:space="preserve">
|
<data name="ItemDeleted" xml:space="preserve">
|
||||||
@@ -346,17 +346,17 @@
|
|||||||
<comment>Confirmation message after successfully deleting a login.</comment>
|
<comment>Confirmation message after successfully deleting a login.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submit" xml:space="preserve">
|
<data name="Submit" xml:space="preserve">
|
||||||
<value>Submit</value>
|
<value>জমা দিন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Sync" xml:space="preserve">
|
<data name="Sync" xml:space="preserve">
|
||||||
<value>Sync</value>
|
<value>Sync</value>
|
||||||
<comment>The title for the sync page.</comment>
|
<comment>The title for the sync page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThankYou" xml:space="preserve">
|
<data name="ThankYou" xml:space="preserve">
|
||||||
<value>Thank you</value>
|
<value>ধন্যবাদ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Tools" xml:space="preserve">
|
<data name="Tools" xml:space="preserve">
|
||||||
<value>Tools</value>
|
<value>টুলস</value>
|
||||||
<comment>The title for the tools page.</comment>
|
<comment>The title for the tools page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="URI" xml:space="preserve">
|
<data name="URI" xml:space="preserve">
|
||||||
@@ -379,7 +379,7 @@
|
|||||||
<comment>Confirmation message after successfully copying a value to the clipboard.</comment>
|
<comment>Confirmation message after successfully copying a value to the clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerifyFingerprint" xml:space="preserve">
|
<data name="VerifyFingerprint" xml:space="preserve">
|
||||||
<value>Verify fingerprint</value>
|
<value>আঙ্গুলের ছাপ যাচাই করুন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerifyMasterPassword" xml:space="preserve">
|
<data name="VerifyMasterPassword" xml:space="preserve">
|
||||||
<value>প্রধান পাসওয়ার্ড যাচাইকরণ</value>
|
<value>প্রধান পাসওয়ার্ড যাচাইকরণ</value>
|
||||||
@@ -388,32 +388,32 @@
|
|||||||
<value>Verify PIN</value>
|
<value>Verify PIN</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Version" xml:space="preserve">
|
<data name="Version" xml:space="preserve">
|
||||||
<value>Version</value>
|
<value>সংস্করণ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="View" xml:space="preserve">
|
<data name="View" xml:space="preserve">
|
||||||
<value>View</value>
|
<value>View</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VisitOurWebsite" xml:space="preserve">
|
<data name="VisitOurWebsite" xml:space="preserve">
|
||||||
<value>Visit our website</value>
|
<value>আমাদের ওয়েবসাইটে ঢু মেরে আসুন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VisitOurWebsiteDescription" xml:space="preserve">
|
<data name="VisitOurWebsiteDescription" xml:space="preserve">
|
||||||
<value>Visit our website to get help, news, email us, and/or learn more about how to use Bitwarden.</value>
|
<value>সাহায্য পেতে, খবর পেতে, আমাদের ইমেল করতে এবং/অথবা বিটওয়ার্ডেন কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও জানতে আমাদের ওয়েবসাইট দেখুন।</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Website" xml:space="preserve">
|
<data name="Website" xml:space="preserve">
|
||||||
<value>Website</value>
|
<value>ওয়েবসাইট</value>
|
||||||
<comment>Label for a website.</comment>
|
<comment>Label for a website.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Yes" xml:space="preserve">
|
<data name="Yes" xml:space="preserve">
|
||||||
<value>Yes</value>
|
<value>হ্যাঁ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Account" xml:space="preserve">
|
<data name="Account" xml:space="preserve">
|
||||||
<value>Account</value>
|
<value>অ্যাকাউন্ট</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountCreated" xml:space="preserve">
|
<data name="AccountCreated" xml:space="preserve">
|
||||||
<value>Your new account has been created! You may now log in.</value>
|
<value>আপনার নতুন অ্যাকাউন্ট তৈরি করা হয়েছে! আপনি এখন লগইন করতে পারবেন।</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAnItem" xml:space="preserve">
|
<data name="AddAnItem" xml:space="preserve">
|
||||||
<value>Add an Item</value>
|
<value>একটি আইটেম যোগ করুন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AppExtension" xml:space="preserve">
|
<data name="AppExtension" xml:space="preserve">
|
||||||
<value>App extension</value>
|
<value>App extension</value>
|
||||||
@@ -425,7 +425,7 @@
|
|||||||
<value>Auto-fill service</value>
|
<value>Auto-fill service</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
||||||
<value>Avoid ambiguous characters</value>
|
<value>অস্পষ্ট বর্ণগুলি বাদ দিয়ে যান</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAppExtension" xml:space="preserve">
|
<data name="BitwardenAppExtension" xml:space="preserve">
|
||||||
<value>Bitwarden app extension</value>
|
<value>Bitwarden app extension</value>
|
||||||
@@ -440,13 +440,13 @@
|
|||||||
<value>Bitwarden Auto-fill Service</value>
|
<value>Bitwarden Auto-fill Service</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillAccessibilityServiceDescription" xml:space="preserve">
|
<data name="BitwardenAutofillAccessibilityServiceDescription" xml:space="preserve">
|
||||||
<value>Use the Bitwarden accessibility service to auto-fill your logins.</value>
|
<value>আপনার লগইনগুলি স্বয়ংক্রিয়ভাবে পূরণ করতে বিটওয়ার্ডেন অ্যাক্সেসিবিলিটি পরিষেবা ব্যবহার করুন৷</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChangeEmail" xml:space="preserve">
|
<data name="ChangeEmail" xml:space="preserve">
|
||||||
<value>Change email</value>
|
<value>ইমেইল পরিবর্তন করুন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChangeEmailConfirmation" xml:space="preserve">
|
<data name="ChangeEmailConfirmation" xml:space="preserve">
|
||||||
<value>You can change your email address on the bitwarden.com web vault. Do you want to visit the website now?</value>
|
<value>আপনি bitwarden.com ওয়েব ভল্টে আপনার ইমেল ঠিকানা পরিবর্তন করতে পারেন। আপনি কি এখনই ওয়েবসাইট ভিজিট করতে চান?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChangeMasterPassword" xml:space="preserve">
|
<data name="ChangeMasterPassword" xml:space="preserve">
|
||||||
<value>প্রধান পাসওয়ার্ড পরিবর্তন</value>
|
<value>প্রধান পাসওয়ার্ড পরিবর্তন</value>
|
||||||
@@ -455,7 +455,7 @@
|
|||||||
<value>আপনি bitwarden.com ওয়েব ভল্ট থেকে প্রধান পাসওয়ার্ডটি পরিবর্তন করতে পারেন। আপনি কি এখনই ওয়েবসাইটটি দেখতে চান?</value>
|
<value>আপনি bitwarden.com ওয়েব ভল্ট থেকে প্রধান পাসওয়ার্ডটি পরিবর্তন করতে পারেন। আপনি কি এখনই ওয়েবসাইটটি দেখতে চান?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Close" xml:space="preserve">
|
<data name="Close" xml:space="preserve">
|
||||||
<value>Close</value>
|
<value>বন্ধ করুন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Continue" xml:space="preserve">
|
<data name="Continue" xml:space="preserve">
|
||||||
<value>অবিরত</value>
|
<value>অবিরত</value>
|
||||||
@@ -480,7 +480,7 @@
|
|||||||
<value>Reactivate app extension</value>
|
<value>Reactivate app extension</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionAlmostDone" xml:space="preserve">
|
<data name="ExtensionAlmostDone" xml:space="preserve">
|
||||||
<value>Almost done!</value>
|
<value>প্রায় হয়ে গেছে!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionEnable" xml:space="preserve">
|
<data name="ExtensionEnable" xml:space="preserve">
|
||||||
<value>Activate app extension</value>
|
<value>Activate app extension</value>
|
||||||
@@ -493,7 +493,7 @@
|
|||||||
<value>Get instant access to your passwords!</value>
|
<value>Get instant access to your passwords!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionReady" xml:space="preserve">
|
<data name="ExtensionReady" xml:space="preserve">
|
||||||
<value>You're ready to log in!</value>
|
<value>আপনি লগইন করার জন্য একদম তৈরি!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionSetup" xml:space="preserve">
|
<data name="ExtensionSetup" xml:space="preserve">
|
||||||
<value>Your logins are now easily accessible from Safari, Chrome, and other supported apps.</value>
|
<value>Your logins are now easily accessible from Safari, Chrome, and other supported apps.</value>
|
||||||
@@ -511,7 +511,7 @@
|
|||||||
<value>প্রিয়</value>
|
<value>প্রিয়</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Fingerprint" xml:space="preserve">
|
<data name="Fingerprint" xml:space="preserve">
|
||||||
<value>Fingerprint</value>
|
<value>আঙুলের ছাপ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GeneratePassword" xml:space="preserve">
|
<data name="GeneratePassword" xml:space="preserve">
|
||||||
<value>পাসওয়ার্ড তৈরি করুন</value>
|
<value>পাসওয়ার্ড তৈরি করুন</value>
|
||||||
@@ -584,7 +584,7 @@
|
|||||||
<value>যদি আপনি আপনার পাসওয়ার্ড ভুলে যান তাহলে একটি প্রধান পাসওয়ার্ডের ইঙ্গিতটি আপনাকে মনে করাতে সাহায্য করতে পারে।</value>
|
<value>যদি আপনি আপনার পাসওয়ার্ড ভুলে যান তাহলে একটি প্রধান পাসওয়ার্ডের ইঙ্গিতটি আপনাকে মনে করাতে সাহায্য করতে পারে।</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>Master password must be at least {0} characters long.</value>
|
<value>মাস্টার পাসওয়ার্ড কমপক্ষে {0} অক্ষরের হতে হবে।</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>সর্বনিম্ন সংখ্যা</value>
|
<value>সর্বনিম্ন সংখ্যা</value>
|
||||||
@@ -595,7 +595,7 @@
|
|||||||
<comment>Minimum special characters for password generator settings</comment>
|
<comment>Minimum special characters for password generator settings</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="MoreSettings" xml:space="preserve">
|
<data name="MoreSettings" xml:space="preserve">
|
||||||
<value>More settings</value>
|
<value>আরও সেটিংস</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MustLogInMainApp" xml:space="preserve">
|
<data name="MustLogInMainApp" xml:space="preserve">
|
||||||
<value>You must log into the main Bitwarden app before you can use the extension.</value>
|
<value>You must log into the main Bitwarden app before you can use the extension.</value>
|
||||||
@@ -651,7 +651,7 @@
|
|||||||
<comment>Push notifications for apple products</comment>
|
<comment>Push notifications for apple products</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="RateTheApp" xml:space="preserve">
|
<data name="RateTheApp" xml:space="preserve">
|
||||||
<value>Rate the app</value>
|
<value>অ্যাপ্লিকেশনটকে রেট দিন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RateTheAppDescription" xml:space="preserve">
|
<data name="RateTheAppDescription" xml:space="preserve">
|
||||||
<value>দয়া করে একটি ভাল পর্যালোচনার মাধ্যমে সাহায্য করতে আমাদের বিবেচনা করুন!</value>
|
<value>দয়া করে একটি ভাল পর্যালোচনার মাধ্যমে সাহায্য করতে আমাদের বিবেচনা করুন!</value>
|
||||||
@@ -684,7 +684,7 @@
|
|||||||
<value>Item saved</value>
|
<value>Item saved</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submitting" xml:space="preserve">
|
<data name="Submitting" xml:space="preserve">
|
||||||
<value>Submitting...</value>
|
<value>জমা দেওয়া হচ্ছে...</value>
|
||||||
<comment>Message shown when interacting with the server</comment>
|
<comment>Message shown when interacting with the server</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Syncing" xml:space="preserve">
|
<data name="Syncing" xml:space="preserve">
|
||||||
@@ -701,7 +701,7 @@
|
|||||||
<value>Sync vault now</value>
|
<value>Sync vault now</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TouchID" xml:space="preserve">
|
<data name="TouchID" xml:space="preserve">
|
||||||
<value>Touch ID</value>
|
<value>টাচ আইডি</value>
|
||||||
<comment>What Apple calls their fingerprint reader.</comment>
|
<comment>What Apple calls their fingerprint reader.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="TwoStepLogin" xml:space="preserve">
|
<data name="TwoStepLogin" xml:space="preserve">
|
||||||
@@ -717,17 +717,17 @@
|
|||||||
<value>Unlock with PIN code</value>
|
<value>Unlock with PIN code</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Validating" xml:space="preserve">
|
<data name="Validating" xml:space="preserve">
|
||||||
<value>Validating</value>
|
<value>কার্যকর করা হচ্ছে</value>
|
||||||
<comment>Message shown when interacting with the server</comment>
|
<comment>Message shown when interacting with the server</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerificationCode" xml:space="preserve">
|
<data name="VerificationCode" xml:space="preserve">
|
||||||
<value>Verification code</value>
|
<value>যাচাইকরণ কোড</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ViewItem" xml:space="preserve">
|
<data name="ViewItem" xml:space="preserve">
|
||||||
<value>View item</value>
|
<value>View item</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WebVault" xml:space="preserve">
|
<data name="WebVault" xml:space="preserve">
|
||||||
<value>Bitwarden web vault</value>
|
<value>বিটওয়ার্ডেন ওয়েব ভল্ট</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Lost2FAApp" xml:space="preserve">
|
<data name="Lost2FAApp" xml:space="preserve">
|
||||||
<value>Lost authenticator app?</value>
|
<value>Lost authenticator app?</value>
|
||||||
@@ -740,10 +740,10 @@
|
|||||||
<value>Extension activated!</value>
|
<value>Extension activated!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Icons" xml:space="preserve">
|
<data name="Icons" xml:space="preserve">
|
||||||
<value>Icons</value>
|
<value>আইকন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Translations" xml:space="preserve">
|
<data name="Translations" xml:space="preserve">
|
||||||
<value>Translations</value>
|
<value>অনুবাদসমূহ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ItemsForUri" xml:space="preserve">
|
<data name="ItemsForUri" xml:space="preserve">
|
||||||
<value>Items for {0}</value>
|
<value>Items for {0}</value>
|
||||||
@@ -769,19 +769,19 @@
|
|||||||
<value>2. Switch on the toggle and press OK to accept.</value>
|
<value>2. Switch on the toggle and press OK to accept.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Disabled" xml:space="preserve">
|
<data name="Disabled" xml:space="preserve">
|
||||||
<value>Disabled</value>
|
<value>নিষ্ক্রিয়</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Enabled" xml:space="preserve">
|
<data name="Enabled" xml:space="preserve">
|
||||||
<value>Enabled</value>
|
<value>সক্রিয়</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Off" xml:space="preserve">
|
<data name="Off" xml:space="preserve">
|
||||||
<value>Off</value>
|
<value>বন্ধ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="On" xml:space="preserve">
|
<data name="On" xml:space="preserve">
|
||||||
<value>On</value>
|
<value>চালু</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Status" xml:space="preserve">
|
<data name="Status" xml:space="preserve">
|
||||||
<value>Status</value>
|
<value>অবস্থা</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillServiceAlert2" xml:space="preserve">
|
<data name="BitwardenAutofillServiceAlert2" xml:space="preserve">
|
||||||
<value>The easiest way to add new logins to your vault is from the Bitwarden Auto-fill Service. Learn more about using the Bitwarden Auto-fill Service by navigating to the "Settings" screen.</value>
|
<value>The easiest way to add new logins to your vault is from the Bitwarden Auto-fill Service. Learn more about using the Bitwarden Auto-fill Service by navigating to the "Settings" screen.</value>
|
||||||
@@ -876,7 +876,7 @@
|
|||||||
<value>Unable to download file.</value>
|
<value>Unable to download file.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UnableToOpenFile" xml:space="preserve">
|
<data name="UnableToOpenFile" xml:space="preserve">
|
||||||
<value>Your device cannot open this type of file.</value>
|
<value>আপনার ডিভাইস এই ধরনের ফাইল খুলতে পারে না।</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Downloading" xml:space="preserve">
|
<data name="Downloading" xml:space="preserve">
|
||||||
<value>ডাউনলোড হচ্ছে...</value>
|
<value>ডাউনলোড হচ্ছে...</value>
|
||||||
@@ -904,13 +904,13 @@
|
|||||||
Scanning will happen automatically.</value>
|
Scanning will happen automatically.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ScanQrTitle" xml:space="preserve">
|
<data name="ScanQrTitle" xml:space="preserve">
|
||||||
<value>Scan QR Code</value>
|
<value>QR কোড স্ক্যান করুন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Camera" xml:space="preserve">
|
<data name="Camera" xml:space="preserve">
|
||||||
<value>Camera</value>
|
<value>ক্যামেরা</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Photos" xml:space="preserve">
|
<data name="Photos" xml:space="preserve">
|
||||||
<value>Photos</value>
|
<value>ছবিসমূহ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyTotp" xml:space="preserve">
|
<data name="CopyTotp" xml:space="preserve">
|
||||||
<value>Copy TOTP</value>
|
<value>Copy TOTP</value>
|
||||||
@@ -934,7 +934,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Choose file</value>
|
<value>Choose file</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="File" xml:space="preserve">
|
<data name="File" xml:space="preserve">
|
||||||
<value>File</value>
|
<value>ফাইল</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoFileChosen" xml:space="preserve">
|
<data name="NoFileChosen" xml:space="preserve">
|
||||||
<value>No file chosen</value>
|
<value>No file chosen</value>
|
||||||
@@ -1080,7 +1080,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>নামের শেষাংশ</value>
|
<value>নামের শেষাংশ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FullName" xml:space="preserve">
|
<data name="FullName" xml:space="preserve">
|
||||||
<value>Full name</value>
|
<value>পুরো নাম</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LicenseNumber" xml:space="preserve">
|
<data name="LicenseNumber" xml:space="preserve">
|
||||||
<value>লাইসেন্স নম্বর</value>
|
<value>লাইসেন্স নম্বর</value>
|
||||||
@@ -1107,34 +1107,34 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Mx</value>
|
<value>Mx</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="November" xml:space="preserve">
|
<data name="November" xml:space="preserve">
|
||||||
<value>November</value>
|
<value>নভেম্বর</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="October" xml:space="preserve">
|
<data name="October" xml:space="preserve">
|
||||||
<value>October</value>
|
<value>অক্টোবর</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PassportNumber" xml:space="preserve">
|
<data name="PassportNumber" xml:space="preserve">
|
||||||
<value>Passport number</value>
|
<value>পাসপোর্ট নম্বর</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Phone" xml:space="preserve">
|
<data name="Phone" xml:space="preserve">
|
||||||
<value>Phone</value>
|
<value>ফোন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="September" xml:space="preserve">
|
<data name="September" xml:space="preserve">
|
||||||
<value>September</value>
|
<value>সেপ্টেম্বর</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SSN" xml:space="preserve">
|
<data name="SSN" xml:space="preserve">
|
||||||
<value>Social Security number</value>
|
<value>সামাজিক সুরক্ষা নম্বর</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="StateProvince" xml:space="preserve">
|
<data name="StateProvince" xml:space="preserve">
|
||||||
<value>State / Province</value>
|
<value>রাজ্য / প্রদেশ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Title" xml:space="preserve">
|
<data name="Title" xml:space="preserve">
|
||||||
<value>Title</value>
|
<value>শিরোনাম</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ZipPostalCode" xml:space="preserve">
|
<data name="ZipPostalCode" xml:space="preserve">
|
||||||
<value>Zip / Postal code</value>
|
<value>জিপ / পোস্টকোড</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Address" xml:space="preserve">
|
<data name="Address" xml:space="preserve">
|
||||||
<value>Address</value>
|
<value>ঠিকানা</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Expiration" xml:space="preserve">
|
<data name="Expiration" xml:space="preserve">
|
||||||
<value>Expiration</value>
|
<value>Expiration</value>
|
||||||
@@ -1204,7 +1204,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Custom field name</value>
|
<value>Custom field name</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FieldTypeBoolean" xml:space="preserve">
|
<data name="FieldTypeBoolean" xml:space="preserve">
|
||||||
<value>Boolean</value>
|
<value>বুলিয়ান</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FieldTypeHidden" xml:space="preserve">
|
<data name="FieldTypeHidden" xml:space="preserve">
|
||||||
<value>Hidden</value>
|
<value>Hidden</value>
|
||||||
@@ -1225,7 +1225,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Remove</value>
|
<value>Remove</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NewUri" xml:space="preserve">
|
<data name="NewUri" xml:space="preserve">
|
||||||
<value>New URI</value>
|
<value>নতুন URI</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="URIPosition" xml:space="preserve">
|
<data name="URIPosition" xml:space="preserve">
|
||||||
<value>URI {0}</value>
|
<value>URI {0}</value>
|
||||||
@@ -1272,7 +1272,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Hold your Yubikey near the top of the device.</value>
|
<value>Hold your Yubikey near the top of the device.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TryAgain" xml:space="preserve">
|
<data name="TryAgain" xml:space="preserve">
|
||||||
<value>Try again</value>
|
<value>আবার চেষ্টা করুন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="YubiKeyInstructionIos" xml:space="preserve">
|
<data name="YubiKeyInstructionIos" xml:space="preserve">
|
||||||
<value>To continue, hold your YubiKey NEO against the back of the device.</value>
|
<value>To continue, hold your YubiKey NEO against the back of the device.</value>
|
||||||
@@ -1440,16 +1440,16 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved.</value>
|
<value>Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NumberOfWords" xml:space="preserve">
|
<data name="NumberOfWords" xml:space="preserve">
|
||||||
<value>Number of words</value>
|
<value>শব্দসংখ্যা</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Passphrase" xml:space="preserve">
|
<data name="Passphrase" xml:space="preserve">
|
||||||
<value>Passphrase</value>
|
<value>গুপ্ত-বাক্যাংশ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WordSeparator" xml:space="preserve">
|
<data name="WordSeparator" xml:space="preserve">
|
||||||
<value>Word separator</value>
|
<value>শব্দ বিভাজক</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Clear" xml:space="preserve">
|
<data name="Clear" xml:space="preserve">
|
||||||
<value>Clear</value>
|
<value>পরিষ্কার করুন</value>
|
||||||
<comment>To clear something out. example: To clear browser history.</comment>
|
<comment>To clear something out. example: To clear browser history.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Generator" xml:space="preserve">
|
<data name="Generator" xml:space="preserve">
|
||||||
@@ -1474,42 +1474,42 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Export vault</value>
|
<value>Export vault</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LockNow" xml:space="preserve">
|
<data name="LockNow" xml:space="preserve">
|
||||||
<value>Lock now</value>
|
<value>এখনই লক করুন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PIN" xml:space="preserve">
|
<data name="PIN" xml:space="preserve">
|
||||||
<value>PIN</value>
|
<value>পিন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Unlock" xml:space="preserve">
|
<data name="Unlock" xml:space="preserve">
|
||||||
<value>Unlock</value>
|
<value>আনলক করুন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UnlockVault" xml:space="preserve">
|
<data name="UnlockVault" xml:space="preserve">
|
||||||
<value>Unlock vault</value>
|
<value>Unlock vault</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThirtyMinutes" xml:space="preserve">
|
<data name="ThirtyMinutes" xml:space="preserve">
|
||||||
<value>30 minutes</value>
|
<value>৩০ মিনিট</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SetPINDescription" xml:space="preserve">
|
<data name="SetPINDescription" xml:space="preserve">
|
||||||
<value>Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application.</value>
|
<value>Bitwarden আনলক করার জন্য আপনার পিন কোডটি সেট করুন। আপনি যদি অ্যাপ্লিকেশনটি থেকে পুরোপুরি লগ আউট করেন তবে আপনার পিন সেটিংস রিসেট করা হবে।</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggedInAsOn" xml:space="preserve">
|
<data name="LoggedInAsOn" xml:space="preserve">
|
||||||
<value>Logged in as {0} on {1}.</value>
|
<value>{1}-এ {0} হিসেবে লগইন করা হয়েছে।</value>
|
||||||
<comment>ex: Logged in as user@example.com on bitwarden.com.</comment>
|
<comment>ex: Logged in as user@example.com on bitwarden.com.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultLockedMasterPassword" xml:space="preserve">
|
<data name="VaultLockedMasterPassword" xml:space="preserve">
|
||||||
<value>আপনার ভল্ট লক করা আছে। চালিয়ে যেতে আপনার প্রধান পাসওয়ার্ডটি যাচাই করান।</value>
|
<value>আপনার ভল্ট লক করা আছে। চালিয়ে যেতে আপনার প্রধান পাসওয়ার্ডটি যাচাই করান।</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultLockedPIN" xml:space="preserve">
|
<data name="VaultLockedPIN" xml:space="preserve">
|
||||||
<value>Your vault is locked. Verify your PIN code to continue.</value>
|
<value>আপনার ভল্ট লক করা আছে। চালিয়ে যেতে আপনার পিন কোড যাচাই করান।</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultLockedIdentity" xml:space="preserve">
|
<data name="VaultLockedIdentity" xml:space="preserve">
|
||||||
<value>Your vault is locked. Verify your identity to continue.</value>
|
<value>আপনার ভল্ট লক করা আছে। চালিয়ে যেতে আপনার পরিচয় যাচাই করান।</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Dark" xml:space="preserve">
|
<data name="Dark" xml:space="preserve">
|
||||||
<value>Dark</value>
|
<value>গাঢ়</value>
|
||||||
<comment>A dark color</comment>
|
<comment>A dark color</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Light" xml:space="preserve">
|
<data name="Light" xml:space="preserve">
|
||||||
<value>Light</value>
|
<value>উজ্জ্বল</value>
|
||||||
<comment>A light color</comment>
|
<comment>A light color</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="FiveMinutes" xml:space="preserve">
|
<data name="FiveMinutes" xml:space="preserve">
|
||||||
@@ -1585,9 +1585,6 @@ Scanning will happen automatically.</value>
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Auto-fill blocked URIs</value>
|
<value>Auto-fill blocked URIs</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>Auto-fill will not be offered for blocked URIs. Separate multiple URIs with a comma. For example: "https://twitter.com, androidapp://com.twitter.android".</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Ask to add login</value>
|
<value>Ask to add login</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1887,10 +1884,10 @@ Scanning will happen automatically.</value>
|
|||||||
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Text" xml:space="preserve">
|
<data name="Text" xml:space="preserve">
|
||||||
<value>Text</value>
|
<value>লেখা</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TypeText" xml:space="preserve">
|
<data name="TypeText" xml:space="preserve">
|
||||||
<value>Text</value>
|
<value>লেখা</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TypeTextInfo" xml:space="preserve">
|
<data name="TypeTextInfo" xml:space="preserve">
|
||||||
<value>The text you want to send.</value>
|
<value>The text you want to send.</value>
|
||||||
@@ -1900,7 +1897,7 @@ Scanning will happen automatically.</value>
|
|||||||
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="TypeFile" xml:space="preserve">
|
<data name="TypeFile" xml:space="preserve">
|
||||||
<value>File</value>
|
<value>ফাইল</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TypeFileInfo" xml:space="preserve">
|
<data name="TypeFileInfo" xml:space="preserve">
|
||||||
<value>The file you want to send.</value>
|
<value>The file you want to send.</value>
|
||||||
@@ -1918,7 +1915,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Text type is not selected, tap to select.</value>
|
<value>Text type is not selected, tap to select.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DeletionDate" xml:space="preserve">
|
<data name="DeletionDate" xml:space="preserve">
|
||||||
<value>Deletion date</value>
|
<value>মুছে ফেলার তারিখ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DeletionTime" xml:space="preserve">
|
<data name="DeletionTime" xml:space="preserve">
|
||||||
<value>Deletion time</value>
|
<value>Deletion time</value>
|
||||||
@@ -1957,7 +1954,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Current access count</value>
|
<value>Current access count</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NewPassword" xml:space="preserve">
|
<data name="NewPassword" xml:space="preserve">
|
||||||
<value>New password</value>
|
<value>নতুন পাসওয়ার্ড</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordInfo" xml:space="preserve">
|
<data name="PasswordInfo" xml:space="preserve">
|
||||||
<value>Optionally require a password for users to access this Send.</value>
|
<value>Optionally require a password for users to access this Send.</value>
|
||||||
@@ -2030,19 +2027,19 @@ Scanning will happen automatically.</value>
|
|||||||
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="OneDay" xml:space="preserve">
|
<data name="OneDay" xml:space="preserve">
|
||||||
<value>1 day</value>
|
<value>১ দিন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TwoDays" xml:space="preserve">
|
<data name="TwoDays" xml:space="preserve">
|
||||||
<value>2 days</value>
|
<value>২ দিন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThreeDays" xml:space="preserve">
|
<data name="ThreeDays" xml:space="preserve">
|
||||||
<value>3 days</value>
|
<value>3 days</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SevenDays" xml:space="preserve">
|
<data name="SevenDays" xml:space="preserve">
|
||||||
<value>7 days</value>
|
<value>৭ দিন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThirtyDays" xml:space="preserve">
|
<data name="ThirtyDays" xml:space="preserve">
|
||||||
<value>30 days</value>
|
<value>৩০ দিন</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Custom" xml:space="preserve">
|
<data name="Custom" xml:space="preserve">
|
||||||
<value>Custom</value>
|
<value>Custom</value>
|
||||||
@@ -2240,16 +2237,16 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Options are collapsed, tap to expand.</value>
|
<value>Options are collapsed, tap to expand.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UppercaseAtoZ" xml:space="preserve">
|
<data name="UppercaseAtoZ" xml:space="preserve">
|
||||||
<value>Uppercase (A to Z)</value>
|
<value>বড় হাতের অক্ষর (A-Z)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LowercaseAtoZ" xml:space="preserve">
|
<data name="LowercaseAtoZ" xml:space="preserve">
|
||||||
<value>Lowercase (A to Z)</value>
|
<value>Lowercase (A to Z)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NumbersZeroToNine" xml:space="preserve">
|
<data name="NumbersZeroToNine" xml:space="preserve">
|
||||||
<value>Numbers (0 to 9)</value>
|
<value>সংখ্যা (0-9)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SpecialCharacters" xml:space="preserve">
|
<data name="SpecialCharacters" xml:space="preserve">
|
||||||
<value>Special characters (!@#$%^&*)</value>
|
<value>বিশেষ অক্ষর (!@#$%^&*)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TapToGoBack" xml:space="preserve">
|
<data name="TapToGoBack" xml:space="preserve">
|
||||||
<value>Tap to go back</value>
|
<value>Tap to go back</value>
|
||||||
@@ -2352,10 +2349,10 @@ select Add TOTP to store the key safely</value>
|
|||||||
<value>Deny login</value>
|
<value>Deny login</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="JustNow" xml:space="preserve">
|
<data name="JustNow" xml:space="preserve">
|
||||||
<value>Just now</value>
|
<value>এইমাত্র</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="XMinutesAgo" xml:space="preserve">
|
<data name="XMinutesAgo" xml:space="preserve">
|
||||||
<value>{0} minutes ago</value>
|
<value>{0} মিনিট আগে</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInAccepted" xml:space="preserve">
|
<data name="LogInAccepted" xml:space="preserve">
|
||||||
<value>Login confirmed</value>
|
<value>Login confirmed</value>
|
||||||
@@ -2496,8 +2493,8 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Get master password hint</value>
|
<value>Get master password hint</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>Logging in as {0}</value>
|
<value>Logging in as {0} on {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Not you?</value>
|
<value>Not you?</value>
|
||||||
@@ -2548,7 +2545,7 @@ Do you want to switch to this account?</value>
|
|||||||
<value>Enable camera permission to use the scanner</value>
|
<value>Enable camera permission to use the scanner</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Language" xml:space="preserve">
|
<data name="Language" xml:space="preserve">
|
||||||
<value>Language</value>
|
<value>ভাষা</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LanguageChangeXDescription" xml:space="preserve">
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
<value>The language has been changed to {0}. Please restart the app to see the change</value>
|
<value>The language has been changed to {0}. Please restart the app to see the change</value>
|
||||||
@@ -2575,10 +2572,10 @@ Do you want to switch to this account?</value>
|
|||||||
<value>Weak</value>
|
<value>Weak</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Good" xml:space="preserve">
|
<data name="Good" xml:space="preserve">
|
||||||
<value>Good</value>
|
<value>ভালো</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Strong" xml:space="preserve">
|
<data name="Strong" xml:space="preserve">
|
||||||
<value>Strong</value>
|
<value>শক্তিশালী</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CheckKnownDataBreachesForThisPassword" xml:space="preserve">
|
<data name="CheckKnownDataBreachesForThisPassword" xml:space="preserve">
|
||||||
<value>Check known data breaches for this password</value>
|
<value>Check known data breaches for this password</value>
|
||||||
@@ -2610,10 +2607,111 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>There are no items that match the search</value>
|
<value>There are no items that match the search</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>US</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>EU</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Self-hosted</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Data region</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Region</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour.</value>
|
<value>Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Current master password</value>
|
<value>Current master password</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Created {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey will not be copied</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Copy application</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Master password re-prompt help</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Invalid API key</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Invalid API token</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Block auto-fill</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Auto-fill will not be offered for these URIs.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>New blocked URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI saved</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Invalid format. Use https://, http://, or androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>Edit URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>Enter URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Format: {0}. Separate multiple URIs with a comma.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Format: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Invalid URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI removed</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>There are no blocked URIs</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>The URI {0} is already blocked</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Cannot edit multiple URIs at once</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -1585,9 +1585,6 @@ Skeniranje će biti izvršeno automatski.</value>
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Auto-popunjavanje blokiranih URI-ja</value>
|
<value>Auto-popunjavanje blokiranih URI-ja</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>Auto-popunjavanje neće biti ponuđeno za blokirane URI-je. Odvoji višestruke URI-je zarezom. Npr. „https://twitter.com, androidapp://com.twitter.android”.</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Upitaj za dodavanje prijave</value>
|
<value>Upitaj za dodavanje prijave</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2494,8 +2491,8 @@ Skeniranje će biti izvršeno automatski.</value>
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Dobijte podsjetnik glavne lozinke</value>
|
<value>Dobijte podsjetnik glavne lozinke</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>Prijava kao {0}</value>
|
<value>Logging in as {0} on {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Nisi ti?</value>
|
<value>Nisi ti?</value>
|
||||||
@@ -2608,10 +2605,111 @@ Skeniranje će biti izvršeno automatski.</value>
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>There are no items that match the search</value>
|
<value>There are no items that match the search</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>US</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>EU</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Self-hosted</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Data region</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Region</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour.</value>
|
<value>Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Current master password</value>
|
<value>Current master password</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Created {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey will not be copied</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Copy application</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Master password re-prompt help</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Invalid API key</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Invalid API token</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Block auto-fill</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Auto-fill will not be offered for these URIs.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>New blocked URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI saved</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Invalid format. Use https://, http://, or androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>Edit URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>Enter URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Format: {0}. Separate multiple URIs with a comma.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Format: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Invalid URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI removed</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>There are no blocked URIs</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>The URI {0} is already blocked</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Cannot edit multiple URIs at once</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -1585,9 +1585,6 @@ L'escaneig es farà automàticament.</value>
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Emplena automàticament els URI bloquejats</value>
|
<value>Emplena automàticament els URI bloquejats</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>L'emplenament automàtic no s'oferirà per als URI bloquejats. Separeu diversos URI amb una coma. Per exemple: "https://twitter.com, androidapp://com.twitter.android".</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Sol·licita afegir els inicis de sessió</value>
|
<value>Sol·licita afegir els inicis de sessió</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2495,8 +2492,8 @@ Voleu canviar a aquest compte?</value>
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Obteniu la pista de la contrasenya mestra</value>
|
<value>Obteniu la pista de la contrasenya mestra</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>Connectat com {0}</value>
|
<value>Inici de sessió com a {0} a {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>No sou vosaltres?</value>
|
<value>No sou vosaltres?</value>
|
||||||
@@ -2609,10 +2606,111 @@ Voleu canviar a aquest compte?</value>
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>No hi ha elements que coincidisquen amb la cerca</value>
|
<value>No hi ha elements que coincidisquen amb la cerca</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>EUA</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>UE</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Autoallotjat</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Regió de dades</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Regió</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>La vostra contrasenya mestra no compleix una o més de les polítiques de l'organització. Per accedir a la caixa forta, heu d'actualitzar-la ara. Si continueu, es tancarà la sessió actual i us demanarà que torneu a iniciar-la. Les sessions en altres dispositius poden continuar romanent actives fins a una hora.</value>
|
<value>La vostra contrasenya mestra no compleix una o més de les polítiques de l'organització. Per accedir a la caixa forta, heu d'actualitzar-la ara. Si continueu, es tancarà la sessió actual i us demanarà que torneu a iniciar-la. Les sessions en altres dispositius poden continuar romanent actives fins a una hora.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Contrasenya mestra actual</value>
|
<value>Contrasenya mestra actual</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Created {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey will not be copied</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Copy application</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Ajuda per tornar a demanar la contrasenya mestra</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>El desbloqueig pot fallar a causa de memòria insuficient. Disminueix la configuració de memòria KDF per resoldre-ho</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Clau API no vàlida</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Token API no vàlid</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Block auto-fill</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Auto-fill will not be offered for these URIs.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>New blocked URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI saved</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Invalid format. Use https://, http://, or androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>Edit URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>Enter URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Format: {0}. Separate multiple URIs with a comma.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Format: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Invalid URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI removed</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>There are no blocked URIs</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>The URI {0} is already blocked</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Cannot edit multiple URIs at once</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -1585,9 +1585,6 @@ Načtení proběhne automaticky.</value>
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Automatické vyplňování blokovaných URI</value>
|
<value>Automatické vyplňování blokovaných URI</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>Automatické vyplňování nebude pro blokované URI nabídnuto. Více URI oddělte čárkou. Například: "https://twitter.com,androidapp://com.twitter.android".</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Ptát se na přidání přihlášení</value>
|
<value>Ptát se na přidání přihlášení</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2494,8 +2491,8 @@ Chcete se přepnout na tento účet?</value>
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Získat nápovědu pro hlavní heslo</value>
|
<value>Získat nápovědu pro hlavní heslo</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>Přihlášování jako {0}</value>
|
<value>Přihlašování jako {0} na {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Nejste to Vy?</value>
|
<value>Nejste to Vy?</value>
|
||||||
@@ -2608,10 +2605,111 @@ Chcete se přepnout na tento účet?</value>
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>Neexistují žádné položky, které by odpovídaly hledání</value>
|
<value>Neexistují žádné položky, které by odpovídaly hledání</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>US</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>EU</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Vlastní hosting</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Datový region</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Region</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Vaše hlavní heslo nesplňuje jednu nebo více zásad Vaší organizace. Pro přístup k trezoru musíte nyní aktualizovat své hlavní heslo. Pokračování Vás odhlásí z Vaší aktuální relace a bude nutné se přihlásit. Aktivní relace na jiných zařízeních mohou zůstat aktivní až po dobu jedné hodiny.</value>
|
<value>Vaše hlavní heslo nesplňuje jednu nebo více zásad Vaší organizace. Pro přístup k trezoru musíte nyní aktualizovat své hlavní heslo. Pokračování Vás odhlásí z Vaší aktuální relace a bude nutné se přihlásit. Aktivní relace na jiných zařízeních mohou zůstat aktivní až po dobu jedné hodiny.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Aktuální hlavní heslo</value>
|
<value>Aktuální hlavní heslo</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Přístupový klíč</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Přístupové klíče</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Vytvořeno {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Aplikace</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>Nemůžete upravovat aplikaci pro přístupové klíče, protože by to zneplatnilo přístupový klíč</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Přístupový klíč nebude zkopírován</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThePasskeyWillNotBeCopiedToTheClonedItemDoYouWantToContinueCloningThisItem" xml:space="preserve">
|
||||||
|
<value>Přístupový klíč nebude zkopírován do duplikované položky. Chete pokračovat v duplikování této položky?</value>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Kopírovat aplikaci</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Dostupné pro dvoufázové přihlášení</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Nápověda pro znovuzeptání se na hlavní heslo</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>Odemknutí může selhat z důvodu nedostatku paměti. Pro vyřešení snižte nastavení paměti KDF.</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Neplatný klíč API</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Neplatný token API</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>Tuto položku nelze sdílet s organizací, protože již existuje jedna se stejným přístupovým klíčem.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Blokovat automatické vyplňování</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Pro tento URI nebude nabízeno automatické vyplňování.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>Nový blokovaný URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI byl uložen</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Neplatný formát. Použijte https://, http:// nebo androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>Upravit URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>Zadat URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Formát: {0}. Oddělte více URI čárkou.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Formát: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Neplatný URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI byl odebrán</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>Nejsou žádné blokované URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>URI {0} je již blokován</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Najednou nelze upravovat více URI</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -118,25 +118,25 @@
|
|||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="About" xml:space="preserve">
|
<data name="About" xml:space="preserve">
|
||||||
<value>About</value>
|
<value>Ynghylch</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Add" xml:space="preserve">
|
<data name="Add" xml:space="preserve">
|
||||||
<value>Add</value>
|
<value>Ychwanegu</value>
|
||||||
<comment>Add/create a new entity (verb).</comment>
|
<comment>Add/create a new entity (verb).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddFolder" xml:space="preserve">
|
<data name="AddFolder" xml:space="preserve">
|
||||||
<value>Add Folder</value>
|
<value>Ychwanegu ffolder</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddItem" xml:space="preserve">
|
<data name="AddItem" xml:space="preserve">
|
||||||
<value>Add Item</value>
|
<value>Ychwanegu eitem</value>
|
||||||
<comment>The title for the add item page.</comment>
|
<comment>The title for the add item page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AnErrorHasOccurred" xml:space="preserve">
|
<data name="AnErrorHasOccurred" xml:space="preserve">
|
||||||
<value>An error has occurred.</value>
|
<value>Bu gwall.</value>
|
||||||
<comment>Alert title when something goes wrong.</comment>
|
<comment>Alert title when something goes wrong.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Back" xml:space="preserve">
|
<data name="Back" xml:space="preserve">
|
||||||
<value>Back</value>
|
<value>Yn ôl</value>
|
||||||
<comment>Navigate back to the previous screen.</comment>
|
<comment>Navigate back to the previous screen.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Bitwarden" xml:space="preserve">
|
<data name="Bitwarden" xml:space="preserve">
|
||||||
@@ -148,7 +148,7 @@
|
|||||||
<comment>Cancel an operation.</comment>
|
<comment>Cancel an operation.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Copy" xml:space="preserve">
|
<data name="Copy" xml:space="preserve">
|
||||||
<value>Copy</value>
|
<value>Copïo</value>
|
||||||
<comment>Copy some value to your clipboard.</comment>
|
<comment>Copy some value to your clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyPassword" xml:space="preserve">
|
<data name="CopyPassword" xml:space="preserve">
|
||||||
@@ -160,15 +160,15 @@
|
|||||||
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Credits" xml:space="preserve">
|
<data name="Credits" xml:space="preserve">
|
||||||
<value>Credits</value>
|
<value>Clodrestr</value>
|
||||||
<comment>Title for page that we use to give credit to resources that we use.</comment>
|
<comment>Title for page that we use to give credit to resources that we use.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Delete" xml:space="preserve">
|
<data name="Delete" xml:space="preserve">
|
||||||
<value>Delete</value>
|
<value>Dileu</value>
|
||||||
<comment>Delete an entity (verb).</comment>
|
<comment>Delete an entity (verb).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Deleting" xml:space="preserve">
|
<data name="Deleting" xml:space="preserve">
|
||||||
<value>Deleting...</value>
|
<value>Wrthi'n dileu...</value>
|
||||||
<comment>Message shown when interacting with the server</comment>
|
<comment>Message shown when interacting with the server</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="DoYouReallyWantToDelete" xml:space="preserve">
|
<data name="DoYouReallyWantToDelete" xml:space="preserve">
|
||||||
@@ -176,17 +176,17 @@
|
|||||||
<comment>Confirmation alert message when deleteing something.</comment>
|
<comment>Confirmation alert message when deleteing something.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Edit" xml:space="preserve">
|
<data name="Edit" xml:space="preserve">
|
||||||
<value>Edit</value>
|
<value>Golygu</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EditFolder" xml:space="preserve">
|
<data name="EditFolder" xml:space="preserve">
|
||||||
<value>Edit folder</value>
|
<value>Edit folder</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Email" xml:space="preserve">
|
<data name="Email" xml:space="preserve">
|
||||||
<value>Email</value>
|
<value>Ebost</value>
|
||||||
<comment>Short label for an email address.</comment>
|
<comment>Short label for an email address.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="EmailAddress" xml:space="preserve">
|
<data name="EmailAddress" xml:space="preserve">
|
||||||
<value>Email address</value>
|
<value>Cyfeiriad ebost</value>
|
||||||
<comment>Full label for a email address.</comment>
|
<comment>Full label for a email address.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="EmailUs" xml:space="preserve">
|
<data name="EmailUs" xml:space="preserve">
|
||||||
@@ -199,11 +199,11 @@
|
|||||||
<value>Enter your PIN code.</value>
|
<value>Enter your PIN code.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Favorites" xml:space="preserve">
|
<data name="Favorites" xml:space="preserve">
|
||||||
<value>Favorites</value>
|
<value>Ffefrynnau</value>
|
||||||
<comment>Title for your favorite items in the vault.</comment>
|
<comment>Title for your favorite items in the vault.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="FileBugReport" xml:space="preserve">
|
<data name="FileBugReport" xml:space="preserve">
|
||||||
<value>File a bug report</value>
|
<value>Adrodd nam</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FileBugReportDescription" xml:space="preserve">
|
<data name="FileBugReportDescription" xml:space="preserve">
|
||||||
<value>Open an issue at our GitHub repository.</value>
|
<value>Open an issue at our GitHub repository.</value>
|
||||||
@@ -212,7 +212,7 @@
|
|||||||
<value>Use your fingerprint to verify.</value>
|
<value>Use your fingerprint to verify.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Folder" xml:space="preserve">
|
<data name="Folder" xml:space="preserve">
|
||||||
<value>Folder</value>
|
<value>Ffolder</value>
|
||||||
<comment>Label for a folder.</comment>
|
<comment>Label for a folder.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="FolderCreated" xml:space="preserve">
|
<data name="FolderCreated" xml:space="preserve">
|
||||||
@@ -226,7 +226,7 @@
|
|||||||
<comment>Items that have no folder specified go in this special "catch-all" folder.</comment>
|
<comment>Items that have no folder specified go in this special "catch-all" folder.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Folders" xml:space="preserve">
|
<data name="Folders" xml:space="preserve">
|
||||||
<value>Folders</value>
|
<value>Ffolderi</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FolderUpdated" xml:space="preserve">
|
<data name="FolderUpdated" xml:space="preserve">
|
||||||
<value>Folder saved</value>
|
<value>Folder saved</value>
|
||||||
@@ -236,32 +236,32 @@
|
|||||||
<comment>The button text that allows user to launch the website to their web browser.</comment>
|
<comment>The button text that allows user to launch the website to their web browser.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="HelpAndFeedback" xml:space="preserve">
|
<data name="HelpAndFeedback" xml:space="preserve">
|
||||||
<value>Help and feedback</value>
|
<value>Cymorth ac adborth</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Hide" xml:space="preserve">
|
<data name="Hide" xml:space="preserve">
|
||||||
<value>Hide</value>
|
<value>Cuddio</value>
|
||||||
<comment>Hide a secret value that is currently shown (password).</comment>
|
<comment>Hide a secret value that is currently shown (password).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="InternetConnectionRequiredMessage" xml:space="preserve">
|
<data name="InternetConnectionRequiredMessage" xml:space="preserve">
|
||||||
<value>Please connect to the internet before continuing.</value>
|
<value>Cysylltwch â'r rhyngrwyd cyn parhau.</value>
|
||||||
<comment>Description message for the alert when internet connection is required to continue.</comment>
|
<comment>Description message for the alert when internet connection is required to continue.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="InternetConnectionRequiredTitle" xml:space="preserve">
|
<data name="InternetConnectionRequiredTitle" xml:space="preserve">
|
||||||
<value>Internet connection required</value>
|
<value>Mae angen cysylltiad â'r we</value>
|
||||||
<comment>Title for the alert when internet connection is required to continue.</comment>
|
<comment>Title for the alert when internet connection is required to continue.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="InvalidMasterPassword" xml:space="preserve">
|
<data name="InvalidMasterPassword" xml:space="preserve">
|
||||||
<value>Invalid master password. Try again.</value>
|
<value>Prif gyfrinair annilys. Rhowch gynnig arall arni.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="InvalidPIN" xml:space="preserve">
|
<data name="InvalidPIN" xml:space="preserve">
|
||||||
<value>Invalid PIN. Try again.</value>
|
<value>PIN annilys. Rhowch gynnig arall arni.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Launch" xml:space="preserve">
|
<data name="Launch" xml:space="preserve">
|
||||||
<value>Launch</value>
|
<value>Lansio</value>
|
||||||
<comment>The button text that allows user to launch the website to their web browser.</comment>
|
<comment>The button text that allows user to launch the website to their web browser.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogIn" xml:space="preserve">
|
<data name="LogIn" xml:space="preserve">
|
||||||
<value>Log In</value>
|
<value>Mewngofnodi</value>
|
||||||
<comment>The login button text (verb).</comment>
|
<comment>The login button text (verb).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInNoun" xml:space="preserve">
|
<data name="LogInNoun" xml:space="preserve">
|
||||||
@@ -269,11 +269,11 @@
|
|||||||
<comment>Title for login page. (noun)</comment>
|
<comment>Title for login page. (noun)</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogOut" xml:space="preserve">
|
<data name="LogOut" xml:space="preserve">
|
||||||
<value>Log out</value>
|
<value>Allgofnodi</value>
|
||||||
<comment>The log out button text (verb).</comment>
|
<comment>The log out button text (verb).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogoutConfirmation" xml:space="preserve">
|
<data name="LogoutConfirmation" xml:space="preserve">
|
||||||
<value>Are you sure you want to log out?</value>
|
<value>Ydych chi'n siŵr eich bod am allgofnodi?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RemoveAccount" xml:space="preserve">
|
<data name="RemoveAccount" xml:space="preserve">
|
||||||
<value>Remove account</value>
|
<value>Remove account</value>
|
||||||
@@ -288,11 +288,11 @@
|
|||||||
<value>Would you like to switch to it now?</value>
|
<value>Would you like to switch to it now?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPassword" xml:space="preserve">
|
<data name="MasterPassword" xml:space="preserve">
|
||||||
<value>Master password</value>
|
<value>Prif gyfrinair</value>
|
||||||
<comment>Label for a master password.</comment>
|
<comment>Label for a master password.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="More" xml:space="preserve">
|
<data name="More" xml:space="preserve">
|
||||||
<value>More</value>
|
<value>Mwy</value>
|
||||||
<comment>Text to define that there are more options things to see.</comment>
|
<comment>Text to define that there are more options things to see.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="MyVault" xml:space="preserve">
|
<data name="MyVault" xml:space="preserve">
|
||||||
@@ -323,7 +323,7 @@
|
|||||||
<comment>Label for a password.</comment>
|
<comment>Label for a password.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Save" xml:space="preserve">
|
<data name="Save" xml:space="preserve">
|
||||||
<value>Save</value>
|
<value>Cadw</value>
|
||||||
<comment>Button text for a save operation (verb).</comment>
|
<comment>Button text for a save operation (verb).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Move" xml:space="preserve">
|
<data name="Move" xml:space="preserve">
|
||||||
@@ -334,7 +334,7 @@
|
|||||||
<comment>Message shown when interacting with the server</comment>
|
<comment>Message shown when interacting with the server</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings" xml:space="preserve">
|
<data name="Settings" xml:space="preserve">
|
||||||
<value>Settings</value>
|
<value>Gosodiadau</value>
|
||||||
<comment>The title for the settings page.</comment>
|
<comment>The title for the settings page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Show" xml:space="preserve">
|
<data name="Show" xml:space="preserve">
|
||||||
@@ -353,10 +353,10 @@
|
|||||||
<comment>The title for the sync page.</comment>
|
<comment>The title for the sync page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThankYou" xml:space="preserve">
|
<data name="ThankYou" xml:space="preserve">
|
||||||
<value>Thank you</value>
|
<value>Diolch</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Tools" xml:space="preserve">
|
<data name="Tools" xml:space="preserve">
|
||||||
<value>Tools</value>
|
<value>Offer</value>
|
||||||
<comment>The title for the tools page.</comment>
|
<comment>The title for the tools page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="URI" xml:space="preserve">
|
<data name="URI" xml:space="preserve">
|
||||||
@@ -367,7 +367,7 @@
|
|||||||
<value>Use fingerprint to unlock</value>
|
<value>Use fingerprint to unlock</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Username" xml:space="preserve">
|
<data name="Username" xml:space="preserve">
|
||||||
<value>Username</value>
|
<value>Enw defnyddiwr</value>
|
||||||
<comment>Label for a username.</comment>
|
<comment>Label for a username.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ValidationFieldRequired" xml:space="preserve">
|
<data name="ValidationFieldRequired" xml:space="preserve">
|
||||||
@@ -388,7 +388,7 @@
|
|||||||
<value>Verify PIN</value>
|
<value>Verify PIN</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Version" xml:space="preserve">
|
<data name="Version" xml:space="preserve">
|
||||||
<value>Version</value>
|
<value>Fersiwn</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="View" xml:space="preserve">
|
<data name="View" xml:space="preserve">
|
||||||
<value>View</value>
|
<value>View</value>
|
||||||
@@ -407,13 +407,13 @@
|
|||||||
<value>Yes</value>
|
<value>Yes</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Account" xml:space="preserve">
|
<data name="Account" xml:space="preserve">
|
||||||
<value>Account</value>
|
<value>Cyfrif</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountCreated" xml:space="preserve">
|
<data name="AccountCreated" xml:space="preserve">
|
||||||
<value>Your new account has been created! You may now log in.</value>
|
<value>Your new account has been created! You may now log in.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAnItem" xml:space="preserve">
|
<data name="AddAnItem" xml:space="preserve">
|
||||||
<value>Add an Item</value>
|
<value>Ychwanegu eitem</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AppExtension" xml:space="preserve">
|
<data name="AppExtension" xml:space="preserve">
|
||||||
<value>App extension</value>
|
<value>App extension</value>
|
||||||
@@ -422,7 +422,7 @@
|
|||||||
<value>Use the Bitwarden accessibility service to auto-fill your logins across apps and the web.</value>
|
<value>Use the Bitwarden accessibility service to auto-fill your logins across apps and the web.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillService" xml:space="preserve">
|
<data name="AutofillService" xml:space="preserve">
|
||||||
<value>Auto-fill service</value>
|
<value>Gwasanaeth llenwi awtomatig</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
||||||
<value>Avoid ambiguous characters</value>
|
<value>Avoid ambiguous characters</value>
|
||||||
@@ -437,41 +437,41 @@
|
|||||||
<value>Use Bitwarden in Safari and other apps to auto-fill your logins.</value>
|
<value>Use Bitwarden in Safari and other apps to auto-fill your logins.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillService" xml:space="preserve">
|
<data name="BitwardenAutofillService" xml:space="preserve">
|
||||||
<value>Bitwarden Auto-fill Service</value>
|
<value>Gwasanaeth llenwi awtomatig Bitwarden</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillAccessibilityServiceDescription" xml:space="preserve">
|
<data name="BitwardenAutofillAccessibilityServiceDescription" xml:space="preserve">
|
||||||
<value>Use the Bitwarden accessibility service to auto-fill your logins.</value>
|
<value>Use the Bitwarden accessibility service to auto-fill your logins.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChangeEmail" xml:space="preserve">
|
<data name="ChangeEmail" xml:space="preserve">
|
||||||
<value>Change email</value>
|
<value>Newid ebost</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChangeEmailConfirmation" xml:space="preserve">
|
<data name="ChangeEmailConfirmation" xml:space="preserve">
|
||||||
<value>You can change your email address on the bitwarden.com web vault. Do you want to visit the website now?</value>
|
<value>You can change your email address on the bitwarden.com web vault. Do you want to visit the website now?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChangeMasterPassword" xml:space="preserve">
|
<data name="ChangeMasterPassword" xml:space="preserve">
|
||||||
<value>Change master password</value>
|
<value>Newid y prif gyfrinair</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChangePasswordConfirmation" xml:space="preserve">
|
<data name="ChangePasswordConfirmation" xml:space="preserve">
|
||||||
<value>You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?</value>
|
<value>You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Close" xml:space="preserve">
|
<data name="Close" xml:space="preserve">
|
||||||
<value>Close</value>
|
<value>Cau</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Continue" xml:space="preserve">
|
<data name="Continue" xml:space="preserve">
|
||||||
<value>Continue</value>
|
<value>Parhau</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CreateAccount" xml:space="preserve">
|
<data name="CreateAccount" xml:space="preserve">
|
||||||
<value>Create account</value>
|
<value>Creu cyfrif</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CreatingAccount" xml:space="preserve">
|
<data name="CreatingAccount" xml:space="preserve">
|
||||||
<value>Creating account...</value>
|
<value>Wrthi'n creu cyfrif...</value>
|
||||||
<comment>Message shown when interacting with the server</comment>
|
<comment>Message shown when interacting with the server</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="EditItem" xml:space="preserve">
|
<data name="EditItem" xml:space="preserve">
|
||||||
<value>Edit item</value>
|
<value>Edit item</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
||||||
<value>Allow automatic syncing</value>
|
<value>Caniatáu cysoni awtomatig</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnterEmailForHint" xml:space="preserve">
|
<data name="EnterEmailForHint" xml:space="preserve">
|
||||||
<value>Enter your account email address to receive your master password hint.</value>
|
<value>Enter your account email address to receive your master password hint.</value>
|
||||||
@@ -480,7 +480,7 @@
|
|||||||
<value>Reactivate app extension</value>
|
<value>Reactivate app extension</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionAlmostDone" xml:space="preserve">
|
<data name="ExtensionAlmostDone" xml:space="preserve">
|
||||||
<value>Almost done!</value>
|
<value>Bron yn barod!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionEnable" xml:space="preserve">
|
<data name="ExtensionEnable" xml:space="preserve">
|
||||||
<value>Activate app extension</value>
|
<value>Activate app extension</value>
|
||||||
@@ -493,7 +493,7 @@
|
|||||||
<value>Get instant access to your passwords!</value>
|
<value>Get instant access to your passwords!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionReady" xml:space="preserve">
|
<data name="ExtensionReady" xml:space="preserve">
|
||||||
<value>You're ready to log in!</value>
|
<value>Rydych chi'n barod i fewngofnodi!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionSetup" xml:space="preserve">
|
<data name="ExtensionSetup" xml:space="preserve">
|
||||||
<value>Your logins are now easily accessible from Safari, Chrome, and other supported apps.</value>
|
<value>Your logins are now easily accessible from Safari, Chrome, and other supported apps.</value>
|
||||||
@@ -511,10 +511,10 @@
|
|||||||
<value>Favorite</value>
|
<value>Favorite</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Fingerprint" xml:space="preserve">
|
<data name="Fingerprint" xml:space="preserve">
|
||||||
<value>Fingerprint</value>
|
<value>Ôl bys</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GeneratePassword" xml:space="preserve">
|
<data name="GeneratePassword" xml:space="preserve">
|
||||||
<value>Generate password</value>
|
<value>Cynhyrchu cyfrinair</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GetPasswordHint" xml:space="preserve">
|
<data name="GetPasswordHint" xml:space="preserve">
|
||||||
<value>Get your master password hint</value>
|
<value>Get your master password hint</value>
|
||||||
@@ -529,10 +529,10 @@
|
|||||||
<value>Quickly bulk import your items from other password management apps.</value>
|
<value>Quickly bulk import your items from other password management apps.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LastSync" xml:space="preserve">
|
<data name="LastSync" xml:space="preserve">
|
||||||
<value>Last sync:</value>
|
<value>Cysonwyd ddiwethaf:</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Length" xml:space="preserve">
|
<data name="Length" xml:space="preserve">
|
||||||
<value>Length</value>
|
<value>Hyd</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Lock" xml:space="preserve">
|
<data name="Lock" xml:space="preserve">
|
||||||
<value>Lock</value>
|
<value>Lock</value>
|
||||||
@@ -1585,9 +1585,6 @@ Scanning will happen automatically.</value>
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Auto-fill blocked URIs</value>
|
<value>Auto-fill blocked URIs</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>Auto-fill will not be offered for blocked URIs. Separate multiple URIs with a comma. For example: "https://twitter.com, androidapp://com.twitter.android".</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Ask to add login</value>
|
<value>Ask to add login</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2337,7 +2334,7 @@ select Add TOTP to store the key safely</value>
|
|||||||
<value>Device type</value>
|
<value>Device type</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="IpAddress" xml:space="preserve">
|
<data name="IpAddress" xml:space="preserve">
|
||||||
<value>IP address</value>
|
<value>Cyfeiriad IP</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Time" xml:space="preserve">
|
<data name="Time" xml:space="preserve">
|
||||||
<value>Time</value>
|
<value>Time</value>
|
||||||
@@ -2370,7 +2367,7 @@ select Add TOTP to store the key safely</value>
|
|||||||
<value>Use this device to approve login requests made from other devices.</value>
|
<value>Use this device to approve login requests made from other devices.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AllowNotifications" xml:space="preserve">
|
<data name="AllowNotifications" xml:space="preserve">
|
||||||
<value>Allow notifications</value>
|
<value>Caniatáu hysbysiadau</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ReceivePushNotificationsForNewLoginRequests" xml:space="preserve">
|
<data name="ReceivePushNotificationsForNewLoginRequests" xml:space="preserve">
|
||||||
<value>Receive push notifications for new login requests</value>
|
<value>Receive push notifications for new login requests</value>
|
||||||
@@ -2444,7 +2441,7 @@ select Add TOTP to store the key safely</value>
|
|||||||
<value>Are you sure you want to overwrite the current username?</value>
|
<value>Are you sure you want to overwrite the current username?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GenerateUsername" xml:space="preserve">
|
<data name="GenerateUsername" xml:space="preserve">
|
||||||
<value>Generate username</value>
|
<value>Cynhyrchu enw defnyddiwr</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EmailType" xml:space="preserve">
|
<data name="EmailType" xml:space="preserve">
|
||||||
<value>Email Type</value>
|
<value>Email Type</value>
|
||||||
@@ -2496,8 +2493,8 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Get master password hint</value>
|
<value>Get master password hint</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>Logging in as {0}</value>
|
<value>Logging in as {0} on {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Not you?</value>
|
<value>Not you?</value>
|
||||||
@@ -2560,7 +2557,7 @@ Do you want to switch to this account?</value>
|
|||||||
<value>Default (System)</value>
|
<value>Default (System)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Important</value>
|
<value>Pwysig</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="YourMasterPasswordCannotBeRecoveredIfYouForgetItXCharactersMinimum" xml:space="preserve">
|
<data name="YourMasterPasswordCannotBeRecoveredIfYouForgetItXCharactersMinimum" xml:space="preserve">
|
||||||
<value>Your master password cannot be recovered if you forget it! {0} characters minimum.</value>
|
<value>Your master password cannot be recovered if you forget it! {0} characters minimum.</value>
|
||||||
@@ -2610,10 +2607,111 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>There are no items that match the search</value>
|
<value>There are no items that match the search</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>US</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>EU</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Self-hosted</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Data region</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Region</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour.</value>
|
<value>Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Current master password</value>
|
<value>Current master password</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Created {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey will not be copied</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Copy application</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Master password re-prompt help</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Invalid API key</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Invalid API token</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Block auto-fill</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Auto-fill will not be offered for these URIs.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>New blocked URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI saved</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Invalid format. Use https://, http://, or androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>Edit URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>Enter URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Format: {0}. Separate multiple URIs with a comma.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Format: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Invalid URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI removed</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>There are no blocked URIs</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>The URI {0} is already blocked</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Cannot edit multiple URIs at once</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -1585,9 +1585,6 @@ Skanning vil ske automatisk.</value>
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Autoudfyld blokerede URI'er</value>
|
<value>Autoudfyld blokerede URI'er</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>Autoudfyldning tilbydes ikke for blokerede URI'er. Adskil flere URI'er med komma. F.eks.: "https://twitter.com, androidapp://com.twitter.android".</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Spørg om at tilføje login</value>
|
<value>Spørg om at tilføje login</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2495,8 +2492,8 @@ Vil du skifte til denne konto?</value>
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Få hovedadgangskodetip</value>
|
<value>Få hovedadgangskodetip</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>Logger ind som {0}</value>
|
<value>Logger ind som {0} på {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Ikke dig?</value>
|
<value>Ikke dig?</value>
|
||||||
@@ -2609,10 +2606,111 @@ Vil du skifte til denne konto?</value>
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>Ingen emner matcher søgningen</value>
|
<value>Ingen emner matcher søgningen</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>USA</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>EU</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Selv-hostet</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Dataregion</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Region</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Din hovedadgangskode overholder ikke én eller flere organisationspolitikker. For at få adgang til boksen skal hovedadgangskode opdateres nu. Fortsættes, logges du ud af den nuværende session og vil skulle logger ind igen. Aktive sessioner på andre enheder kan forblive aktive i op til én time.</value>
|
<value>Din hovedadgangskode overholder ikke én eller flere organisationspolitikker. For at få adgang til boksen skal hovedadgangskode opdateres nu. Fortsættes, logges du ud af den nuværende session og vil skulle logger ind igen. Aktive sessioner på andre enheder kan forblive aktive i op til én time.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Aktuel hovedadgangskode</value>
|
<value>Aktuel hovedadgangskode</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Created {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey will not be copied</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Copy application</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Hjælp til genanmodning om hovedadgangskode</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>Oplåsning kan fejle grundet utilstrækkelig hukommelse. Reducér KDF-hukommelsesindstillinger for at afhjælpe</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Ugyldig API-nøgle</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Ugyldigt API-token</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Blokér autoudfyldning</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Autoudfyldning vil ikke blive tilbudt for disse URI'er.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>Ny blokeret URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI gemt</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Ugyldigt format. Brug https://, http:// eller androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>Redigér URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>Angiv URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Format: {0}. Separér flere URI'er med komma.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Format: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Ugyldig URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI fjernet</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>Der er ingen blokerede URI'er</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>URI'en {0} er allerede blokeret</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Kan ikke redigere flere URI'er på én gang</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -1083,7 +1083,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Vollständiger Name</value>
|
<value>Vollständiger Name</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LicenseNumber" xml:space="preserve">
|
<data name="LicenseNumber" xml:space="preserve">
|
||||||
<value>Führerscheinnummer</value>
|
<value>Lizenznummer</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="March" xml:space="preserve">
|
<data name="March" xml:space="preserve">
|
||||||
<value>März</value>
|
<value>März</value>
|
||||||
@@ -1585,9 +1585,6 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Blockierte URIs automatisch ausfüllen</value>
|
<value>Blockierte URIs automatisch ausfüllen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>Auto-Ausfüllen wird für blockierte URIs nicht angeboten. Trenne mehrere URIs mit einem Komma. Beispiel: "https://twitter.com, androidapp://com.twitter.android".</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Nach dem Hinzufügen von Zugangsdaten fragen</value>
|
<value>Nach dem Hinzufügen von Zugangsdaten fragen</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1753,7 +1750,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
|
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Biometrie zum Entsperren ist für dieses Konto deaktiviert, bis das Master-Passwort verifiziert wurde.</value>
|
<value>Das Entsperren über Biometrie ist für dieses Konto deaktiviert, bis das Master-Passwort verifiziert wurde.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Das Entsperren von Auto-Ausfüllen über Biometrie ist für dieses Konto deaktiviert, bis das Master-Passwort verifiziert wurde.</value>
|
<value>Das Entsperren von Auto-Ausfüllen über Biometrie ist für dieses Konto deaktiviert, bis das Master-Passwort verifiziert wurde.</value>
|
||||||
@@ -2494,8 +2491,8 @@ Möchtest du zu diesem Konto wechseln?</value>
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Hinweis zum Master-Passwort erhalten</value>
|
<value>Hinweis zum Master-Passwort erhalten</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>Anmelden als {0}</value>
|
<value>Anmelden als {0} auf {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Nicht du?</value>
|
<value>Nicht du?</value>
|
||||||
@@ -2608,10 +2605,111 @@ Möchtest du zu diesem Konto wechseln?</value>
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>Es gibt keine Einträge, die mit der Suche übereinstimmen</value>
|
<value>Es gibt keine Einträge, die mit der Suche übereinstimmen</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>US</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>EU</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Selbst gehostet</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Datenregion</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Region</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Dein Master-Passwort entspricht nicht einer oder mehreren Richtlinien deiner Organisation. Um auf den Tresor zugreifen zu können, musst du dein Master-Passwort jetzt aktualisieren. Wenn du fortfährst, wirst du von deiner aktuellen Sitzung abgemeldet und musst dich erneut anmelden. Aktive Sitzungen auf anderen Geräten können noch bis zu einer Stunde lang aktiv bleiben.</value>
|
<value>Dein Master-Passwort entspricht nicht einer oder mehreren Richtlinien deiner Organisation. Um auf den Tresor zugreifen zu können, musst du dein Master-Passwort jetzt aktualisieren. Wenn du fortfährst, wirst du von deiner aktuellen Sitzung abgemeldet und musst dich erneut anmelden. Aktive Sitzungen auf anderen Geräten können noch bis zu einer Stunde lang aktiv bleiben.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Aktuelles Master-Passwort</value>
|
<value>Aktuelles Master-Passwort</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Erstellt am {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Anwendung</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey wird nicht kopiert</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Anwendung kopieren</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Hilfe zum erneuten Abfragen des Master-Passworts</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>Das Entsperren kann aufgrund von unzureichendem Arbeitsspeicher fehlschlagen. Verringere deine KDF-Speichereinstellungen, um das Problem zu beheben.</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Ungültiger API-Schlüssel</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Ungültiger API-Token</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Auto-Ausfüllen blockieren</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Auto-Ausfüllen wird für diese URIs nicht angeboten.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>Neue gesperrte URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI gespeichert</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Ungültiges Format. Verwende https://, http://, oder androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>URI bearbeiten</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>URI eingeben</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Format: {0}. Trenne mehrere URIs mit einem Komma.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Format: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Ungültige URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI entfernt</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>Es gibt keine gesperrten URIs</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>Die URI {0} ist bereits gesperrt</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Es können nicht mehrere URIs auf einmal bearbeitet werden</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -1585,9 +1585,6 @@
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Αυτόματη συμπλήρωση μπλοκαρισμένων URIs</value>
|
<value>Αυτόματη συμπλήρωση μπλοκαρισμένων URIs</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>Η αυτόματη συμπλήρωση δεν θα προσφερθεί για μπλοκαρισμένα URI. Ξεχωρίστε πολλαπλά URI με κόμμα. Για παράδειγμα: "https://twitter.com, androidapp://com.twitter.android".</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Ζητήστε να προσθέστε σύνδεση</value>
|
<value>Ζητήστε να προσθέστε σύνδεση</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1753,10 +1750,10 @@
|
|||||||
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
|
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Biometric unlock for this account is disabled pending verification of master password.</value>
|
<value>Το βιομετρικό ξεκλείδωμα για αυτόν τον λογαριασμό είναι απενεργοποιημένο εν αναμονή της επαλήθευσης του κύριου κωδικού πρόσβασης.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</value>
|
<value>Το βιομετρικό ξεκλείδωμα αυτόματης συμπλήρωσης για αυτό το λογαριασμό είναι απενεργοποιημένο εν αναμονή της επαλήθευσης του κύριου κωδικού πρόσβασης.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>Ενεργοποίηση συγχρονισμού κατά την ανανέωση</value>
|
<value>Ενεργοποίηση συγχρονισμού κατά την ανανέωση</value>
|
||||||
@@ -2143,10 +2140,10 @@
|
|||||||
<value>Οι πολιτικές του οργανισμού σας επηρεάζουν το χρονικό όριο vault σας. Το μέγιστο επιτρεπόμενο Χρονικό όριο Vault είναι {0} ώρα(ες) και {1} λεπτό(ά)</value>
|
<value>Οι πολιτικές του οργανισμού σας επηρεάζουν το χρονικό όριο vault σας. Το μέγιστο επιτρεπόμενο Χρονικό όριο Vault είναι {0} ώρα(ες) και {1} λεπτό(ά)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
|
||||||
<value>Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). Your vault timeout action is set to {2}.</value>
|
<value>Οι πολιτικές του οργανισμού σας επηρεάζουν το χρονικό όριο του vault σας. Το μέγιστο επιτρεπόμενο χρονικό όριο vault είναι {0} ώρα(ες) και {1} λεπτό(ά). Το χρονικό όριο του vault σας έχει οριστεί σε {2}.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
<value>Your organization policies have set your vault timeout action to {0}.</value>
|
<value>Οι πολιτικές του οργανισμού σας έχουν ορίσει την ενέργεια χρονικού ορίου vault σε {0}.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>Το χρονικό όριο του vault σας υπερβαίνει τους περιορισμούς που έχει ορίσει ο οργανισμός σας.</value>
|
<value>Το χρονικό όριο του vault σας υπερβαίνει τους περιορισμούς που έχει ορίσει ο οργανισμός σας.</value>
|
||||||
@@ -2495,8 +2492,8 @@
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Λάβετε υπόδειξη κύριου κωδικού</value>
|
<value>Λάβετε υπόδειξη κύριου κωδικού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>Σύνδεση ως {0}</value>
|
<value>Σύνδεση ως {0} στις {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Δεν είστε εσείς;</value>
|
<value>Δεν είστε εσείς;</value>
|
||||||
@@ -2609,10 +2606,111 @@
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>Δεν υπάρχουν στοιχεία που να ταιριάζουν με την αναζήτηση</value>
|
<value>Δεν υπάρχουν στοιχεία που να ταιριάζουν με την αναζήτηση</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>ΗΠΑ</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>ΕΕ</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Αυτο-φιλοξενούμενο</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Περιοχή δεδομένων</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Περιοχή</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour.</value>
|
<value>Ο κύριος κωδικός πρόσβασής σας δεν πληροί μία ή περισσότερες πολιτικές του οργανισμού σας. Για να αποκτήσετε πρόσβαση στο Vault σας, πρέπει να ενημερώσετε τον κύριο κωδικό πρόσβασής σας τώρα. Η διαδικασία θα σας αποσυνδέσει από την τρέχουσα συνεδρία σας, απαιτώντας από εσάς να συνδεθείτε ξανά. Οι ενεργές συνεδρίες σε άλλες συσκευές ενδέχεται να συνεχίσουν να είναι ενεργές εώς και μία ώρα.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Current master password</value>
|
<value>Τρέχων κύριος κωδικός</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Created {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey will not be copied</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Copy application</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Master password re-prompt help</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Invalid API key</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Invalid API token</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Block auto-fill</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Auto-fill will not be offered for these URIs.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>New blocked URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI saved</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Invalid format. Use https://, http://, or androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>Edit URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>Enter URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Format: {0}. Separate multiple URIs with a comma.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Format: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Invalid URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI removed</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>There are no blocked URIs</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>The URI {0} is already blocked</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Cannot edit multiple URIs at once</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -1585,9 +1585,6 @@ Scanning will happen automatically.</value>
|
|||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Auto-fill blocked URIs</value>
|
<value>Auto-fill blocked URIs</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
|
||||||
<value>Auto-fill will not be offered for blocked URIs. Separate multiple URIs with a comma. For example: "https://twitter.com, androidapp://com.twitter.android".</value>
|
|
||||||
</data>
|
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Ask to add login</value>
|
<value>Ask to add login</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2495,8 +2492,8 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Get master password hint</value>
|
<value>Get master password hint</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsXOnY" xml:space="preserve">
|
||||||
<value>Logging in as {0}</value>
|
<value>Logging in as {0} on {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Not you?</value>
|
<value>Not you?</value>
|
||||||
@@ -2609,10 +2606,111 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
<value>There are no items that match the search</value>
|
<value>There are no items that match the search</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="US" xml:space="preserve">
|
||||||
|
<value>US</value>
|
||||||
|
</data>
|
||||||
|
<data name="EU" xml:space="preserve">
|
||||||
|
<value>EU</value>
|
||||||
|
</data>
|
||||||
|
<data name="SelfHosted" xml:space="preserve">
|
||||||
|
<value>Self-hosted</value>
|
||||||
|
</data>
|
||||||
|
<data name="DataRegion" xml:space="preserve">
|
||||||
|
<value>Data region</value>
|
||||||
|
</data>
|
||||||
|
<data name="Region" xml:space="preserve">
|
||||||
|
<value>Region</value>
|
||||||
|
</data>
|
||||||
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour.</value>
|
<value>Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CurrentMasterPassword" xml:space="preserve">
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
<value>Current master password</value>
|
<value>Current master password</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Passkey" xml:space="preserve">
|
||||||
|
<value>Passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="Passkeys" xml:space="preserve">
|
||||||
|
<value>Passkeys</value>
|
||||||
|
</data>
|
||||||
|
<data name="CreatedX" xml:space="preserve">
|
||||||
|
<value>Created {0}</value>
|
||||||
|
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
|
||||||
|
</data>
|
||||||
|
<data name="Application" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
|
||||||
|
<value>You cannot edit passkey application because it would invalidate the passkey</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
|
||||||
|
<value>Passkey will not be copied</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>
|
||||||
|
</data>
|
||||||
|
<data name="CopyApplication" xml:space="preserve">
|
||||||
|
<value>Copy application</value>
|
||||||
|
</data>
|
||||||
|
<data name="AvailableForTwoStepLogin" xml:space="preserve">
|
||||||
|
<value>Available for two-step login</value>
|
||||||
|
</data>
|
||||||
|
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
|
||||||
|
<value>Master password re-prompt help</value>
|
||||||
|
</data>
|
||||||
|
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
|
||||||
|
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIKey" xml:space="preserve">
|
||||||
|
<value>Invalid API key</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidAPIToken" xml:space="preserve">
|
||||||
|
<value>Invalid API token</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
|
||||||
|
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
|
||||||
|
</data>
|
||||||
|
<data name="BlockAutoFill" xml:space="preserve">
|
||||||
|
<value>Block auto-fill</value>
|
||||||
|
</data>
|
||||||
|
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
|
||||||
|
<value>Auto-fill will not be offered for these URIs.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewBlockedURI" xml:space="preserve">
|
||||||
|
<value>New blocked URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URISaved" xml:space="preserve">
|
||||||
|
<value>URI saved</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
|
||||||
|
<value>Invalid format. Use https://, http://, or androidapp://</value>
|
||||||
|
<comment>https://, http://, androidapp:// should not be translated</comment>
|
||||||
|
</data>
|
||||||
|
<data name="EditURI" xml:space="preserve">
|
||||||
|
<value>Edit URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="EnterURI" xml:space="preserve">
|
||||||
|
<value>Enter URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
|
||||||
|
<value>Format: {0}. Separate multiple URIs with a comma.</value>
|
||||||
|
</data>
|
||||||
|
<data name="FormatX" xml:space="preserve">
|
||||||
|
<value>Format: {0}</value>
|
||||||
|
</data>
|
||||||
|
<data name="InvalidURI" xml:space="preserve">
|
||||||
|
<value>Invalid URI</value>
|
||||||
|
</data>
|
||||||
|
<data name="URIRemoved" xml:space="preserve">
|
||||||
|
<value>URI removed</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
|
||||||
|
<value>There are no blocked URIs</value>
|
||||||
|
</data>
|
||||||
|
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
|
||||||
|
<value>The URI {0} is already blocked</value>
|
||||||
|
</data>
|
||||||
|
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
|
||||||
|
<value>Cannot edit multiple URIs at once</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user