Compare commits
82 Commits
community/
...
localize-w
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a4280b6db | ||
|
|
b7ff636862 | ||
|
|
0288a6659c | ||
|
|
c7fd113f26 | ||
|
|
79241731e7 | ||
|
|
74e9914f5b | ||
|
|
65307f6eab | ||
|
|
e9f83aee90 | ||
|
|
fdaf743868 | ||
|
|
9d6b938ba9 | ||
|
|
1c8328f62d | ||
|
|
f24b82f345 | ||
|
|
37f1a7087e | ||
|
|
6bb654e630 | ||
|
|
fc260f8159 | ||
|
|
bf463926a3 | ||
|
|
c1673a1bbf | ||
|
|
7b44395e1a | ||
|
|
0f3529aab8 | ||
|
|
a72779997c | ||
|
|
49da536c7a | ||
|
|
c985c0a62b | ||
|
|
0f417b8434 | ||
|
|
4f0238122b | ||
|
|
52ff634f00 | ||
|
|
e820537fce | ||
|
|
7130d8a18c | ||
|
|
659d34dfc2 | ||
|
|
6a5c999628 | ||
|
|
3bcb44ea71 | ||
|
|
b108b4e71d | ||
|
|
a72f267558 | ||
|
|
cc75cebdb8 | ||
|
|
3a0510d6b4 | ||
|
|
0c4b88e562 | ||
|
|
ac3b0c2bad | ||
|
|
1823efa0e5 | ||
|
|
e5ce1760a6 | ||
|
|
e77a971519 | ||
|
|
d7715c90f0 | ||
|
|
8fe9bd7347 | ||
|
|
11d3d71c32 | ||
|
|
0462f4db63 | ||
|
|
120f1d6859 | ||
|
|
99ceb8dbc1 | ||
|
|
d7d044f717 | ||
|
|
53d892a0ba | ||
|
|
80e38f8669 | ||
|
|
3e76f6b054 | ||
|
|
55a3b76f45 | ||
|
|
bd9b767339 | ||
|
|
276a93c497 | ||
|
|
c6bdb67981 | ||
|
|
a6bb089633 | ||
|
|
606b00142f | ||
|
|
151ecf83e7 | ||
|
|
ccd71202de | ||
|
|
839aa9134c | ||
|
|
dcb5854557 | ||
|
|
ad9ca125a0 | ||
|
|
fe12b0e908 | ||
|
|
f733d22d55 | ||
|
|
9f8307a4ff | ||
|
|
a18f74a72a | ||
|
|
4d2b53c809 | ||
|
|
c02cd1f15b | ||
|
|
74139627e2 | ||
|
|
3f86bb0cd7 | ||
|
|
a81dfc271c | ||
|
|
470e08f165 | ||
|
|
5164762f2e | ||
|
|
6da1875ab6 | ||
|
|
3f72d35145 | ||
|
|
b26b9ea41b | ||
|
|
0539eda57e | ||
|
|
c5d72ad7cb | ||
|
|
bf7d9b5646 | ||
|
|
8ec6c7f0f7 | ||
|
|
2321122e81 | ||
|
|
bc439b45c9 | ||
|
|
e7d6783156 | ||
|
|
44e5682b1d |
6
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,5 +1,8 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
|
- name: Customer Support
|
||||||
|
url: https://bitwarden.com/contact/
|
||||||
|
about: Please contact our customer support for account issues and general customer support.
|
||||||
- name: Report mobile autofill failure
|
- name: Report mobile autofill failure
|
||||||
url: https://docs.google.com/forms/d/e/1FAIpQLScMopHyN7KGJs8hW562VTzbIGL4KcFnx0wJcsW0GYE1BnPiGA/viewform
|
url: https://docs.google.com/forms/d/e/1FAIpQLScMopHyN7KGJs8hW562VTzbIGL4KcFnx0wJcsW0GYE1BnPiGA/viewform
|
||||||
about: We are aware of some situations where the Bitwarden mobile app will not autofill information correctly. This is something the Bitwarden team is actively working on but need your help as a community and active Bitwarden users!
|
about: We are aware of some situations where the Bitwarden mobile app will not autofill information correctly. This is something the Bitwarden team is actively working on but need your help as a community and active Bitwarden users!
|
||||||
@@ -9,9 +12,6 @@ contact_links:
|
|||||||
- name: Bitwarden Community Forums
|
- name: Bitwarden Community Forums
|
||||||
url: https://community.bitwarden.com
|
url: https://community.bitwarden.com
|
||||||
about: Please visit the community forums for general community discussion, support and the development roadmap.
|
about: Please visit the community forums for general community discussion, support and the development roadmap.
|
||||||
- name: Customer Support
|
|
||||||
url: https://bitwarden.com/contact/
|
|
||||||
about: Please contact our customer support for account issues and general customer support.
|
|
||||||
- name: Security Issues
|
- name: Security Issues
|
||||||
url: https://hackerone.com/bitwarden
|
url: https://hackerone.com/bitwarden
|
||||||
about: We use HackerOne to manage security disclosures.
|
about: We use HackerOne to manage security disclosures.
|
||||||
|
|||||||
19
.github/labeler.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
android:
|
||||||
|
- src/App/*
|
||||||
|
- src/Core/*
|
||||||
|
- src/Android/*
|
||||||
|
|
||||||
|
iOS:
|
||||||
|
- src/App/*
|
||||||
|
- src/Core/*
|
||||||
|
- lib/ios/*
|
||||||
|
- src/iOS/*
|
||||||
|
- 'src/iOS.Autofill/*'
|
||||||
|
- 'src/iOS.Core/*'
|
||||||
|
- 'src/iOS.Extension/*'
|
||||||
|
- 'src/iOS.ShareExtension/*'
|
||||||
|
- 'src/iOS.Widget/*'
|
||||||
|
- src/watchOS/*
|
||||||
|
|
||||||
|
watchOS:
|
||||||
|
- src/watchOS/*
|
||||||
39
.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
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,13 +7,13 @@
|
|||||||
<key>provisioningProfiles</key>
|
<key>provisioningProfiles</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>com.8bit.bitwarden</key>
|
<key>com.8bit.bitwarden</key>
|
||||||
<string>Dist: Bitwarden 2021</string>
|
<string>Dist: Bitwarden</string>
|
||||||
<key>com.8bit.bitwarden.autofill</key>
|
<key>com.8bit.bitwarden.autofill</key>
|
||||||
<string>Dist: Autofill 2021</string>
|
<string>Dist: Autofill</string>
|
||||||
<key>com.8bit.bitwarden.find-login-action-extension</key>
|
<key>com.8bit.bitwarden.find-login-action-extension</key>
|
||||||
<string>Dist: Extension 2021</string>
|
<string>Dist: Extension</string>
|
||||||
<key>com.8bit.bitwarden.share-extension</key>
|
<key>com.8bit.bitwarden.share-extension</key>
|
||||||
<string>Dist: Share Extension 2021</string>
|
<string>Dist: Share Extension</string>
|
||||||
<key>com.8bit.bitwarden.watchkitapp</key>
|
<key>com.8bit.bitwarden.watchkitapp</key>
|
||||||
<string>Dist: Bitwarden Watch App</string>
|
<string>Dist: Bitwarden Watch App</string>
|
||||||
<key>com.8bit.bitwarden.watchkitapp.watchkitextension</key>
|
<key>com.8bit.bitwarden.watchkitapp.watchkitextension</key>
|
||||||
|
|||||||
BIN
.github/secrets/dist_autofill.mobileprovision.gpg
vendored
BIN
.github/secrets/dist_bitwarden.mobileprovision.gpg
vendored
BIN
.github/secrets/dist_extension.mobileprovision.gpg
vendored
BIN
.github/secrets/dist_watch_app.mobileprovision.gpg
vendored
BIN
.github/secrets/iphone-distribution-cert.p12.gpg
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.
|
||||||
|
|||||||
74
.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,9 @@ 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:
|
||||||
|
submodules: 'true'
|
||||||
|
|
||||||
- name: Check if special branches exist
|
- name: Check if special branches exist
|
||||||
id: branch-check
|
id: branch-check
|
||||||
@@ -65,12 +67,12 @@ 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 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
|
||||||
@@ -103,7 +105,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
|
||||||
@@ -155,7 +157,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
|
||||||
@@ -230,7 +232,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
|
||||||
@@ -238,7 +240,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
|
||||||
@@ -246,7 +248,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
|
||||||
@@ -266,7 +268,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
|
||||||
@@ -274,7 +276,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
|
||||||
@@ -301,12 +303,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
|
||||||
@@ -340,7 +342,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:
|
||||||
@@ -475,7 +477,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
|
||||||
@@ -487,7 +489,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
|
||||||
@@ -500,7 +502,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
|
||||||
|
|
||||||
@@ -513,17 +515,19 @@ 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: Login to Azure - Prod Subscription
|
|
||||||
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
|
|
||||||
with:
|
with:
|
||||||
creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
|
submodules: 'true'
|
||||||
|
|
||||||
|
- name: Login to Azure - CI Subscription
|
||||||
|
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf # v1.4.3
|
||||||
|
with:
|
||||||
|
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||||
|
|
||||||
- name: Retrieve secrets
|
- name: Retrieve secrets
|
||||||
id: retrieve-secrets
|
id: retrieve-secrets
|
||||||
env:
|
env:
|
||||||
KEYVAULT: bitwarden-prod-kv
|
KEYVAULT: bitwarden-ci
|
||||||
SECRETS: |
|
SECRETS: |
|
||||||
appcenter-ios-token
|
appcenter-ios-token
|
||||||
run: |
|
run: |
|
||||||
@@ -694,7 +698,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: |
|
||||||
@@ -767,17 +771,17 @@ 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
|
- name: Login to Azure - CI Subscription
|
||||||
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
|
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf # v1.4.3
|
||||||
with:
|
with:
|
||||||
creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
|
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||||
|
|
||||||
- name: Retrieve secrets
|
- name: Retrieve secrets
|
||||||
id: retrieve-secrets
|
id: retrieve-secrets
|
||||||
env:
|
env:
|
||||||
KEYVAULT: bitwarden-prod-kv
|
KEYVAULT: bitwarden-ci
|
||||||
SECRETS: |
|
SECRETS: |
|
||||||
crowdin-api-token
|
crowdin-api-token
|
||||||
run: |
|
run: |
|
||||||
@@ -789,7 +793,7 @@ jobs:
|
|||||||
done
|
done
|
||||||
|
|
||||||
- name: Upload Sources
|
- name: Upload Sources
|
||||||
uses: crowdin/github-action@9237b4cb361788dfce63feb2e2f15c09e2fe7415
|
uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9
|
||||||
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 }}
|
||||||
@@ -835,17 +839,17 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Login to Azure - Prod 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_PROD_KV_CREDENTIALS }}
|
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||||
|
|
||||||
- name: Retrieve secrets
|
- name: Retrieve secrets
|
||||||
id: retrieve-secrets
|
id: retrieve-secrets
|
||||||
if: failure()
|
if: failure()
|
||||||
env:
|
env:
|
||||||
KEYVAULT: bitwarden-prod-kv
|
KEYVAULT: bitwarden-ci
|
||||||
SECRETS: |
|
SECRETS: |
|
||||||
devops-alerts-slack-webhook-url
|
devops-alerts-slack-webhook-url
|
||||||
run: |
|
run: |
|
||||||
@@ -857,7 +861,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 }}
|
||||||
|
|||||||
14
.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
|
- name: Login to Azure - CI Subscription
|
||||||
uses: Azure/login@77f1b2e3fb80c0e8645114159d17008b8a2e475a
|
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf # v1.4.3
|
||||||
with:
|
with:
|
||||||
creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
|
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-prod-kv"
|
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@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9
|
||||||
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
@@ -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 # v2.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"
|
||||||
|
|||||||
17
.github/workflows/pr-labeler.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
name: "Pull Request Labeler"
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target: {}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
labeler:
|
||||||
|
name: "Pull Request Labeler"
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/labeler@ba790c862c380240c6d5e7427be5ace9a05c754b # v4.0.3
|
||||||
|
with:
|
||||||
|
sync-labels: true
|
||||||
16
.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 }}'
|
||||||
@@ -93,8 +93,8 @@ jobs:
|
|||||||
./com.x8bit.bitwarden.apk/com.x8bit.bitwarden.apk,
|
./com.x8bit.bitwarden.apk/com.x8bit.bitwarden.apk,
|
||||||
./com.x8bit.bitwarden-fdroid.apk/com.x8bit.bitwarden-fdroid.apk,
|
./com.x8bit.bitwarden-fdroid.apk/com.x8bit.bitwarden-fdroid.apk,
|
||||||
./Bitwarden iOS.zip,
|
./Bitwarden iOS.zip,
|
||||||
./bw-android-apk-sha256.txt,
|
./bw-android-apk-sha256.txt/bw-android-apk-sha256.txt,
|
||||||
./bw-fdroid-apk-sha256.txt"
|
./bw-fdroid-apk-sha256.txt/bw-fdroid-apk-sha256.txt"
|
||||||
commit: ${{ github.sha }}
|
commit: ${{ github.sha }}
|
||||||
tag: v${{ steps.version.outputs.version }}
|
tag: v${{ steps.version.outputs.version }}
|
||||||
name: Version ${{ steps.version.outputs.version }}
|
name: Version ${{ steps.version.outputs.version }}
|
||||||
@@ -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,7 +126,7 @@ 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' }}
|
||||||
|
|||||||
32
.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,32 +32,14 @@ jobs:
|
|||||||
echo "new-version=$NEW_VER" >> $GITHUB_OUTPUT
|
echo "new-version=$NEW_VER" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
trigger_version_bump:
|
trigger_version_bump:
|
||||||
name: "Trigger version bump workflow"
|
name: "Version bump"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
needs:
|
needs:
|
||||||
- setup
|
- setup
|
||||||
steps:
|
steps:
|
||||||
- name: Login to Azure
|
- name: Bump version to ${{ needs.setup.outputs.version_number }}
|
||||||
uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010
|
uses: ./.github/workflows/version-bump.yml
|
||||||
|
secrets:
|
||||||
|
AZURE_PROD_KV_CREDENTIALS: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||||
with:
|
with:
|
||||||
creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
|
version_number: ${{ needs.setup.outputs.version_number }}
|
||||||
|
|
||||||
- name: Retrieve secrets
|
|
||||||
id: retrieve-secrets
|
|
||||||
uses: bitwarden/gh-actions/get-keyvault-secrets@c3b3285993151c5af47cefcb3b9134c28ab479af
|
|
||||||
with:
|
|
||||||
keyvault: "bitwarden-prod-kv"
|
|
||||||
secrets: "github-pat-bitwarden-devops-bot-repo-scope"
|
|
||||||
|
|
||||||
- name: Call GitHub API to trigger workflow bump
|
|
||||||
env:
|
|
||||||
TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}
|
|
||||||
VERSION: ${{ needs.setup.outputs.version_number}}
|
|
||||||
run: |
|
|
||||||
JSON_STRING=$(printf '{"ref":"master", "inputs": { "version_number":"%s"}}' "$VERSION")
|
|
||||||
curl \
|
|
||||||
-X POST \
|
|
||||||
-i -u bitwarden-devops-bot:$TOKEN \
|
|
||||||
-H "Accept: application/vnd.github.v3+json" \
|
|
||||||
https://api.github.com/repos/bitwarden/mobile/actions/workflows/version-bump.yml/dispatches \
|
|
||||||
-d $JSON_STRING
|
|
||||||
|
|||||||
32
.github/workflows/version-bump.yml
vendored
@@ -7,6 +7,14 @@ on:
|
|||||||
version_number:
|
version_number:
|
||||||
description: "New Version"
|
description: "New Version"
|
||||||
required: true
|
required: true
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
version_number:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
secrets:
|
||||||
|
AZURE_PROD_KV_CREDENTIALS:
|
||||||
|
required: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
bump_version:
|
bump_version:
|
||||||
@@ -14,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 - Prod Subscription
|
- name: Login to Azure - CI Subscription
|
||||||
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
|
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf # v1.4.3
|
||||||
with:
|
with:
|
||||||
creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
|
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-prod-kv"
|
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 }}
|
||||||
@@ -40,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
@@ -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
|
||||||
|
|||||||
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "lib/MessagePack"]
|
||||||
|
path = lib/MessagePack
|
||||||
|
url = https://github.com/bitwarden/MessagePack.git
|
||||||
12
README.md
@@ -23,15 +23,3 @@ Interested in contributing in a big way? Consider joining our team! We're hiring
|
|||||||
Code contributions are welcome! Please commit any pull requests against the `master` branch. Learn more about how to contribute by reading the [Contributing Guidelines](https://contributing.bitwarden.com/contributing/). Check out the [Contributing Documentation](https://contributing.bitwarden.com/) for how to get started with your first contribution.
|
Code contributions are welcome! Please commit any pull requests against the `master` branch. Learn more about how to contribute by reading the [Contributing Guidelines](https://contributing.bitwarden.com/contributing/). Check out the [Contributing Documentation](https://contributing.bitwarden.com/) for how to get started with your first contribution.
|
||||||
|
|
||||||
Security audits and feedback are welcome. Please open an issue or email us privately if the report is sensitive in nature. You can read our security policy in the [`SECURITY.md`](SECURITY.md) file.
|
Security audits and feedback are welcome. Please open an issue or email us privately if the report is sensitive in nature. You can read our security policy in the [`SECURITY.md`](SECURITY.md) file.
|
||||||
|
|
||||||
### Dotnet-format
|
|
||||||
|
|
||||||
We recently migrated to using dotnet-format as code formatter. All previous branches will need to updated to avoid large merge conflicts using the following steps:
|
|
||||||
|
|
||||||
1. Check out your local Branch
|
|
||||||
2. Run `git merge e0efcfbe45b2a27c73e9593bfd7a71fad2aa7a35`
|
|
||||||
3. Resolve any merge conflicts, commit.
|
|
||||||
4. Run `dotnet tool run dotnet-format`
|
|
||||||
5. Commit
|
|
||||||
6. Run `git merge -Xours 04539af2a66668b6e85476d5cf318c9150ec4357`
|
|
||||||
7. Push
|
|
||||||
|
|||||||
11
appIcons/Android/beta-layered-excluded.svg
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<svg width="108" height="108" viewBox="0 0 108 108" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_41_29)">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M70.214 34C70.7096 34 71.1457 34.1883 71.5124 34.555C71.8791 34.9217 72.0674 35.3479 72.0971 35.8534V50.4336H71.0669V51.9453H72.0971V58.0938C72.0971 59.749 71.7701 61.3942 71.1258 63.0295C70.4816 64.6549 69.6788 66.1019 68.7274 67.3706C67.766 68.6293 66.6262 69.8582 65.308 71.0575C63.98 72.2567 62.7609 73.2478 61.6409 74.0407C60.521 74.8237 59.3515 75.5769 58.1324 76.2806C56.9134 76.9843 56.0511 77.4699 55.5357 77.7177C55.0303 77.9655 54.614 78.1538 54.3068 78.2926C54.0788 78.4115 53.8211 78.471 53.5535 78.471C53.2859 78.471 53.0282 78.4115 52.8003 78.2926C52.5297 78.1791 52.1822 78.0118 51.7511 77.8042C51.6927 77.7761 51.6328 77.7473 51.5713 77.7177C51.0559 77.46 50.1937 76.9843 48.9746 76.2806C47.7555 75.5769 46.586 74.8336 45.4661 74.0407C44.3461 73.2478 43.1172 72.2567 41.799 71.0575C40.4709 69.8682 39.3311 68.6392 38.3797 67.3706C37.4183 66.1119 36.6155 64.6648 35.9713 63.0295C35.3271 61.4041 35 59.749 35 58.0938V35.8534C35 35.3479 35.1883 34.9217 35.555 34.555C35.9217 34.1883 36.3479 34 36.8534 34H70.214ZM67.211 57.5H70.1118V59H67.177C66.4282 66.7468 53.5337 73.2875 53.5337 73.2875V38.7573H67.211V50.4336H70.1118V51.9219H67.211V53.8027H69.895V55.291H67.211V57.5Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M58 46C56.3431 46 55 47.3431 55 49V60C55 61.6569 56.3431 63 58 63H107C108.657 63 110 61.6569 110 60V49C110 47.3431 108.657 46 107 46H58ZM59.7817 50.4336H57.1157V59H60.3208C60.9692 59 61.5278 58.9023 61.9966 58.707C62.4692 58.5078 62.8325 58.2227 63.0864 57.8516C63.3403 57.4805 63.4673 57.0352 63.4673 56.5156C63.4673 56.0664 63.397 55.707 63.2563 55.4375C63.1196 55.1641 62.936 54.957 62.7056 54.8164C62.4751 54.6719 62.2173 54.5703 61.9321 54.5117V54.4531C62.2134 54.4023 62.4517 54.293 62.647 54.125C62.8423 53.957 62.9907 53.7422 63.0923 53.4805C63.1978 53.2188 63.2505 52.9258 63.2505 52.6016C63.2505 51.7969 62.9575 51.2344 62.3716 50.9141C61.7856 50.5938 60.9224 50.4336 59.7817 50.4336ZM59.9868 53.8262H58.9321V51.9219H59.8872C60.4067 51.9219 60.7856 51.9941 61.0239 52.1387C61.2661 52.2793 61.3872 52.5137 61.3872 52.8418C61.3872 53.166 61.2856 53.4121 61.0825 53.5801C60.8794 53.7441 60.5142 53.8262 59.9868 53.8262ZM58.9321 57.5V55.2676H60.0571C60.4438 55.2676 60.7466 55.3125 60.9653 55.4023C61.188 55.4922 61.3462 55.6172 61.4399 55.7773C61.5337 55.9375 61.5806 56.123 61.5806 56.334C61.5806 56.6895 61.4731 56.9727 61.2583 57.1836C61.0435 57.3945 60.6626 57.5 60.1157 57.5H58.9321ZM65.1782 59H70.1118V57.5H66.9946V55.291H69.895V53.8027H66.9946V51.9219H70.1118V50.4336H65.1782V59ZM73.3931 59H75.2095V51.9453H77.5356V50.4336H71.0669V51.9453H73.3931V59ZM83.4771 56.9609L84.0981 59H86.0552L83.02 50.3984H80.7993L77.7759 59H79.7329L80.354 56.9609H83.4771ZM82.4224 53.4453L83.0435 55.4375H80.811L81.4263 53.4453C81.4536 53.3555 81.4985 53.2051 81.561 52.9941C81.6235 52.7832 81.688 52.5605 81.7544 52.3262C81.8247 52.0879 81.8794 51.8887 81.9185 51.7285C81.9575 51.8887 82.0083 52.0781 82.0708 52.2969C82.1372 52.5117 82.2017 52.7246 82.2642 52.9355C82.3306 53.1426 82.3833 53.3125 82.4224 53.4453Z" fill="#6795E8"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_41_29">
|
||||||
|
<rect width="108" height="108" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.3 KiB |
17
appIcons/Android/beta-layered.svg
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<svg width="108" height="108" viewBox="0 0 108 108" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_36_10)">
|
||||||
|
<path d="M71.5717 34.6343L113 76.0625L89.709 119.077L40.6492 70.0168L53.5336 77.4501L70.8779 60.1057L71.5717 34.6343Z" fill="url(#paint0_linear_36_10)"/>
|
||||||
|
<path d="M71.5124 34.555C71.1457 34.1883 70.7096 34 70.214 34H36.8534C36.3479 34 35.9217 34.1883 35.555 34.555C35.1883 34.9217 35 35.3479 35 35.8534V58.0938C35 59.749 35.3271 61.4041 35.9713 63.0295C36.6155 64.6648 37.4183 66.1119 38.3797 67.3706C39.3311 68.6392 40.4709 69.8682 41.799 71.0575C43.1172 72.2567 44.3461 73.2478 45.4661 74.0407C46.586 74.8336 47.7555 75.5769 48.9746 76.2806C50.1937 76.9843 51.0559 77.46 51.5713 77.7177C52.0867 77.9655 52.493 78.1637 52.8003 78.2926C53.0282 78.4115 53.2859 78.471 53.5535 78.471C53.8211 78.471 54.0788 78.4115 54.3068 78.2926C54.614 78.1538 55.0303 77.9655 55.5357 77.7177C56.0511 77.4699 56.9134 76.9843 58.1324 76.2806C59.3515 75.5769 60.521 74.8237 61.6409 74.0407C62.7609 73.2478 63.98 72.2567 65.308 71.0575C66.6262 69.8582 67.766 68.6293 68.7274 67.3706C69.6788 66.1019 70.4816 64.6549 71.1258 63.0295C71.7701 61.3942 72.0971 59.749 72.0971 58.0938V35.8534C72.0674 35.3479 71.8791 34.9217 71.5124 34.555ZM67.211 58.3019C67.211 66.3497 53.5337 73.2875 53.5337 73.2875V38.7573H67.211C67.211 38.7573 67.211 50.2542 67.211 58.3019Z" fill="white"/>
|
||||||
|
<path d="M55 49C55 47.3431 56.3431 46 58 46H107C108.657 46 110 47.3431 110 49V60C110 61.6569 108.657 63 107 63H58C56.3431 63 55 61.6569 55 60V49Z" fill="#6795E8"/>
|
||||||
|
<path d="M57.116 50.4336H59.782C60.9226 50.4336 61.7859 50.5938 62.3718 50.9141C62.9578 51.2344 63.2507 51.7969 63.2507 52.6016C63.2507 52.9258 63.198 53.2188 63.0925 53.4805C62.991 53.7422 62.8425 53.957 62.6472 54.125C62.4519 54.293 62.2136 54.4023 61.9324 54.4531V54.5117C62.2175 54.5703 62.4753 54.6719 62.7058 54.8164C62.9363 54.957 63.1199 55.1641 63.2566 55.4375C63.3972 55.707 63.4675 56.0664 63.4675 56.5156C63.4675 57.0352 63.3406 57.4805 63.0867 57.8516C62.8328 58.2227 62.4695 58.5078 61.9968 58.707C61.5281 58.9023 60.9695 59 60.321 59H57.116V50.4336ZM58.9324 53.8262H59.9871C60.5144 53.8262 60.8796 53.7441 61.0828 53.5801C61.2859 53.4121 61.3875 53.166 61.3875 52.8418C61.3875 52.5137 61.2664 52.2793 61.0242 52.1387C60.7859 51.9941 60.407 51.9219 59.8875 51.9219H58.9324V53.8262ZM58.9324 55.2676V57.5H60.116C60.6628 57.5 61.0437 57.3945 61.2585 57.1836C61.4734 56.9727 61.5808 56.6895 61.5808 56.334C61.5808 56.123 61.5339 55.9375 61.4402 55.7773C61.3464 55.6172 61.1882 55.4922 60.9656 55.4023C60.7468 55.3125 60.4441 55.2676 60.0574 55.2676H58.9324ZM70.1121 59H65.1785V50.4336H70.1121V51.9219H66.9949V53.8027H69.8953V55.291H66.9949V57.5H70.1121V59ZM75.2097 59H73.3933V51.9453H71.0671V50.4336H77.5359V51.9453H75.2097V59ZM84.0984 59L83.4773 56.9609H80.3542L79.7332 59H77.7761L80.7996 50.3984H83.0203L86.0554 59H84.0984ZM83.0437 55.4375L82.4226 53.4453C82.3835 53.3125 82.3308 53.1426 82.2644 52.9355C82.2019 52.7246 82.1375 52.5117 82.071 52.2969C82.0085 52.0781 81.9578 51.8887 81.9187 51.7285C81.8796 51.8887 81.825 52.0879 81.7546 52.3262C81.6882 52.5605 81.6238 52.7832 81.5613 52.9941C81.4988 53.2051 81.4539 53.3555 81.4265 53.4453L80.8113 55.4375H83.0437Z" fill="#212529"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_36_10" x1="37.8512" y1="38.8122" x2="89.011" y2="89.972" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-opacity="0.247059"/>
|
||||||
|
<stop offset="1" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clip0_36_10">
|
||||||
|
<rect width="108" height="108" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.5 KiB |
11
appIcons/Android/dev-layered-excluded.svg
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<svg width="108" height="108" viewBox="0 0 108 108" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_41_21)">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M70.214 34C70.7096 34 71.1457 34.1883 71.5124 34.555C71.8791 34.9217 72.0674 35.3479 72.0971 35.8534V50.4336H71.647L72.0971 51.7604V58.0938C72.0971 59.749 71.7701 61.3942 71.1258 63.0295C70.4816 64.6549 69.6788 66.1019 68.7274 67.3706C67.766 68.6293 66.6262 69.8582 65.308 71.0575C63.98 72.2567 62.7609 73.2478 61.6409 74.0407C60.521 74.8237 59.3515 75.5769 58.1324 76.2806C56.9134 76.9843 56.0511 77.4699 55.5357 77.7177C55.0303 77.9655 54.614 78.1538 54.3068 78.2926C54.0788 78.4115 53.8211 78.471 53.5535 78.471C53.2859 78.471 53.0282 78.4115 52.8003 78.2926C52.5297 78.1791 52.1822 78.0118 51.7511 77.8042C51.6927 77.7761 51.6328 77.7473 51.5713 77.7177C51.0559 77.46 50.1937 76.9843 48.9746 76.2806C47.7555 75.5769 46.586 74.8336 45.4661 74.0407C44.3461 73.2478 43.1172 72.2567 41.799 71.0575C40.4709 69.8682 39.3311 68.6392 38.3797 67.3706C37.4183 66.1119 36.6155 64.6648 35.9713 63.0295C35.3271 61.4041 35 59.749 35 58.0938V35.8534C35 35.3479 35.1883 34.9217 35.555 34.555C35.9217 34.1883 36.3479 34 36.8534 34H70.214ZM67.177 59C66.4282 66.7468 53.5337 73.2875 53.5337 73.2875V38.7573H67.211V50.4336H70.9321V51.9219H67.8149V53.8027H70.7153V55.291H67.8149V57.5H70.9321V59H67.177Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M58 46C56.3431 46 55 47.3431 55 49V60C55 61.6569 56.3431 63 58 63H107C108.657 63 110 61.6569 110 60V49C110 47.3431 108.657 46 107 46H58ZM63.6665 57.0547C64.0376 56.4062 64.2231 55.5996 64.2231 54.6348C64.2231 53.7168 64.0415 52.9473 63.6782 52.3262C63.3149 51.7012 62.8032 51.2305 62.1431 50.9141C61.4829 50.5938 60.7036 50.4336 59.8052 50.4336H57.1157V59H59.5415C60.5259 59 61.3677 58.8379 62.0669 58.5137C62.7661 58.1855 63.2993 57.6992 63.6665 57.0547ZM62.0552 53.123C62.2427 53.5293 62.3364 54.0488 62.3364 54.6816C62.3364 55.6152 62.1196 56.3184 61.686 56.791C61.2563 57.2637 60.5981 57.5 59.7114 57.5H58.9321V51.9219H59.8989C60.4302 51.9219 60.8755 52.0195 61.2349 52.2148C61.5981 52.4102 61.8716 52.7129 62.0552 53.123ZM65.9985 59H70.9321V57.5H67.8149V55.291H70.7153V53.8027H67.8149V51.9219H70.9321V50.4336H65.9985V59ZM76.5337 59L79.4458 50.4336H77.6118L75.9888 55.5312C75.9614 55.6211 75.9165 55.7852 75.854 56.0234C75.7954 56.2578 75.7349 56.5059 75.6724 56.7676C75.6138 57.0293 75.5728 57.2461 75.5493 57.418C75.5259 57.2461 75.481 57.0293 75.4146 56.7676C75.3521 56.502 75.2896 56.252 75.2271 56.0176C75.1646 55.7793 75.1196 55.6172 75.0923 55.5312L73.481 50.4336H71.647L74.5532 59H76.5337Z" fill="#2DA49D"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_41_21">
|
||||||
|
<rect width="108" height="108" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.7 KiB |
17
appIcons/Android/dev-layered.svg
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<svg width="108" height="108" viewBox="0 0 108 108" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_36_2)">
|
||||||
|
<path d="M71.5717 34.6343L113 76.0625L89.709 119.077L40.6492 70.0168L53.5336 77.4501L70.8779 60.1057L71.5717 34.6343Z" fill="url(#paint0_linear_36_2)"/>
|
||||||
|
<path d="M71.5124 34.555C71.1457 34.1883 70.7096 34 70.214 34H36.8534C36.3479 34 35.9217 34.1883 35.555 34.555C35.1883 34.9217 35 35.3479 35 35.8534V58.0938C35 59.749 35.3271 61.4041 35.9713 63.0295C36.6155 64.6648 37.4183 66.1119 38.3797 67.3706C39.3311 68.6392 40.4709 69.8682 41.799 71.0575C43.1172 72.2567 44.3461 73.2478 45.4661 74.0407C46.586 74.8336 47.7555 75.5769 48.9746 76.2806C50.1937 76.9843 51.0559 77.46 51.5713 77.7177C52.0867 77.9655 52.493 78.1637 52.8003 78.2926C53.0282 78.4115 53.2859 78.471 53.5535 78.471C53.8211 78.471 54.0788 78.4115 54.3068 78.2926C54.614 78.1538 55.0303 77.9655 55.5357 77.7177C56.0511 77.4699 56.9134 76.9843 58.1324 76.2806C59.3515 75.5769 60.521 74.8237 61.6409 74.0407C62.7609 73.2478 63.98 72.2567 65.308 71.0575C66.6262 69.8582 67.766 68.6293 68.7274 67.3706C69.6788 66.1019 70.4816 64.6549 71.1258 63.0295C71.7701 61.3942 72.0971 59.749 72.0971 58.0938V35.8534C72.0674 35.3479 71.8791 34.9217 71.5124 34.555ZM67.211 58.3019C67.211 66.3497 53.5337 73.2875 53.5337 73.2875V38.7573H67.211C67.211 38.7573 67.211 50.2542 67.211 58.3019Z" fill="white"/>
|
||||||
|
<path d="M55 49C55 47.3431 56.3431 46 58 46H107C108.657 46 110 47.3431 110 49V60C110 61.6569 108.657 63 107 63H58C56.3431 63 55 61.6569 55 60V49Z" fill="#2DA49D"/>
|
||||||
|
<path d="M64.2234 54.6348C64.2234 55.5996 64.0378 56.4062 63.6667 57.0547C63.2996 57.6992 62.7664 58.1855 62.0671 58.5137C61.3679 58.8379 60.5261 59 59.5417 59H57.116V50.4336H59.8054C60.7039 50.4336 61.4832 50.5938 62.1433 50.9141C62.8035 51.2305 63.3152 51.7012 63.6785 52.3262C64.0417 52.9473 64.2234 53.7168 64.2234 54.6348ZM62.3367 54.6816C62.3367 54.0488 62.2429 53.5293 62.0554 53.123C61.8718 52.7129 61.5984 52.4102 61.2351 52.2148C60.8757 52.0195 60.4304 51.9219 59.8992 51.9219H58.9324V57.5H59.7117C60.5984 57.5 61.2566 57.2637 61.6863 56.791C62.1199 56.3184 62.3367 55.6152 62.3367 54.6816ZM70.9324 59H65.9988V50.4336H70.9324V51.9219H67.8152V53.8027H70.7156V55.291H67.8152V57.5H70.9324V59ZM79.446 50.4336L76.5339 59H74.5535L71.6472 50.4336H73.4812L75.0925 55.5312C75.1199 55.6172 75.1648 55.7793 75.2273 56.0176C75.2898 56.252 75.3523 56.502 75.4148 56.7676C75.4812 57.0293 75.5261 57.2461 75.5496 57.418C75.573 57.2461 75.614 57.0293 75.6726 56.7676C75.7351 56.5059 75.7957 56.2578 75.8542 56.0234C75.9167 55.7852 75.9617 55.6211 75.989 55.5312L77.6121 50.4336H79.446Z" fill="#212529"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_36_2" x1="37.8512" y1="38.8122" x2="89.011" y2="89.972" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-opacity="0.247059"/>
|
||||||
|
<stop offset="1" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clip0_36_2">
|
||||||
|
<rect width="108" height="108" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.9 KiB |
11
appIcons/Android/qa-layered-excluded.svg
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<svg width="108" height="108" viewBox="0 0 108 108" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_41_13)">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M70.214 34C70.7096 34 71.1457 34.1883 71.5124 34.555C71.8791 34.9217 72.0674 35.3479 72.0971 35.8534V52.9823L70.8325 49.3984H68.6118L67.211 53.3838V38.7573H53.5337V73.2875C53.5337 73.2875 67.211 66.3497 67.211 58.3019V58H67.5454L68.1665 55.9609H71.2896L71.9106 58H72.0971V58.0938C72.0971 59.749 71.7701 61.3942 71.1258 63.0295C70.4816 64.6549 69.6788 66.1019 68.7274 67.3706C67.766 68.6293 66.6262 69.8582 65.308 71.0575C63.98 72.2567 62.7609 73.2478 61.6409 74.0407C60.521 74.8237 59.3515 75.5769 58.1324 76.2806C56.9134 76.9843 56.0511 77.4699 55.5357 77.7177C55.0303 77.9655 54.614 78.1538 54.3068 78.2926C54.0788 78.4115 53.8211 78.471 53.5535 78.471C53.2859 78.471 53.0282 78.4115 52.8003 78.2926C52.5297 78.1791 52.1822 78.0118 51.7511 77.8042C51.6927 77.7761 51.6328 77.7473 51.5713 77.7177C51.0559 77.46 50.1937 76.9843 48.9746 76.2806C47.7555 75.5769 46.586 74.8336 45.4661 74.0407C44.3461 73.2478 43.1172 72.2567 41.799 71.0575C40.4709 69.8682 39.3311 68.6392 38.3797 67.3706C37.4183 66.1119 36.6155 64.6648 35.9713 63.0295C35.3271 61.4041 35 59.749 35 58.0938V35.8534C35 35.3479 35.1883 34.9217 35.555 34.555C35.9217 34.1883 36.3479 34 36.8534 34H70.214ZM70.2349 52.4453L70.856 54.4375H68.6235L69.2388 52.4453C69.2661 52.3555 69.311 52.2051 69.3735 51.9941C69.436 51.7832 69.5005 51.5605 69.5669 51.3262C69.6372 51.0879 69.6919 50.8887 69.731 50.7285C69.77 50.8887 69.8208 51.0781 69.8833 51.2969C69.9497 51.5117 70.0142 51.7246 70.0767 51.9355C70.1431 52.1426 70.1958 52.3125 70.2349 52.4453Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M58 46C56.3431 46 55 47.3431 55 49V60C55 61.6569 56.3431 63 58 63H107C108.657 63 110 61.6569 110 60V49C110 47.3431 108.657 46 107 46H58ZM64.6626 55.457C64.8149 54.9258 64.8911 54.3418 64.8911 53.7051C64.8911 52.8145 64.7446 52.0391 64.4517 51.3789C64.1626 50.7188 63.7173 50.207 63.1157 49.8438C62.5181 49.4805 61.7544 49.2988 60.8247 49.2988C59.8911 49.2988 59.1216 49.4805 58.5161 49.8438C57.9106 50.207 57.4614 50.7188 57.1685 51.3789C56.8794 52.0352 56.7349 52.8066 56.7349 53.6934C56.7349 54.3574 56.8169 54.9609 56.981 55.5039C57.145 56.0469 57.3931 56.5137 57.7251 56.9043C58.061 57.2949 58.4849 57.5957 58.9966 57.8066C59.5083 58.0137 60.1138 58.1172 60.813 58.1172H60.8774H60.9478L62.5181 60.0391H64.8442L62.7817 57.7363C63.2622 57.5176 63.6587 57.2148 63.9712 56.8281C64.2837 56.4414 64.5142 55.9844 64.6626 55.457ZM58.8618 55.252C58.7134 54.8184 58.6392 54.3027 58.6392 53.7051C58.6392 53.1035 58.7134 52.5879 58.8618 52.1582C59.0142 51.7246 59.2505 51.3926 59.5708 51.1621C59.895 50.9277 60.313 50.8105 60.8247 50.8105C61.5942 50.8105 62.147 51.0684 62.4829 51.584C62.8188 52.0996 62.9868 52.8066 62.9868 53.7051C62.9868 54.3027 62.9126 54.8184 62.7642 55.252C62.6196 55.6816 62.3872 56.0137 62.0669 56.248C61.7466 56.4785 61.3286 56.5938 60.813 56.5938C60.3052 56.5938 59.8911 56.4785 59.5708 56.248C59.2505 56.0137 59.0142 55.6816 58.8618 55.252ZM71.2896 55.9609L71.9106 58H73.8677L70.8325 49.3984H68.6118L65.5884 58H67.5454L68.1665 55.9609H71.2896ZM70.2349 52.4453L70.856 54.4375H68.6235L69.2388 52.4453C69.2661 52.3555 69.311 52.2051 69.3735 51.9941C69.436 51.7832 69.5005 51.5605 69.5669 51.3262C69.6372 51.0879 69.6919 50.8887 69.731 50.7285C69.77 50.8887 69.8208 51.0781 69.8833 51.2969C69.9497 51.5117 70.0142 51.7246 70.0767 51.9355C70.1431 52.1426 70.1958 52.3125 70.2349 52.4453Z" fill="#C32998"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_41_13">
|
||||||
|
<rect width="108" height="108" rx="34" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.6 KiB |
17
appIcons/Android/qa-layered.svg
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<svg width="108" height="108" viewBox="0 0 108 108" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_34_2)">
|
||||||
|
<path d="M71.5717 34.6343L113 76.0625L89.709 119.077L40.6492 70.0168L53.5336 77.4501L70.8779 60.1057L71.5717 34.6343Z" fill="url(#paint0_linear_34_2)"/>
|
||||||
|
<path d="M71.5124 34.555C71.1457 34.1883 70.7096 34 70.214 34H36.8534C36.3479 34 35.9217 34.1883 35.555 34.555C35.1883 34.9217 35 35.3479 35 35.8534V58.0938C35 59.749 35.3271 61.4041 35.9713 63.0295C36.6155 64.6648 37.4183 66.1119 38.3797 67.3706C39.3311 68.6392 40.4709 69.8682 41.799 71.0575C43.1172 72.2567 44.3461 73.2478 45.4661 74.0407C46.586 74.8336 47.7555 75.5769 48.9746 76.2806C50.1937 76.9843 51.0559 77.46 51.5713 77.7177C52.0867 77.9655 52.493 78.1637 52.8003 78.2926C53.0282 78.4115 53.2859 78.471 53.5535 78.471C53.8211 78.471 54.0788 78.4115 54.3068 78.2926C54.614 78.1538 55.0303 77.9655 55.5357 77.7177C56.0511 77.4699 56.9134 76.9843 58.1324 76.2806C59.3515 75.5769 60.521 74.8237 61.6409 74.0407C62.7609 73.2478 63.98 72.2567 65.308 71.0575C66.6262 69.8582 67.766 68.6293 68.7274 67.3706C69.6788 66.1019 70.4816 64.6549 71.1258 63.0295C71.7701 61.3942 72.0971 59.749 72.0971 58.0938V35.8534C72.0674 35.3479 71.8791 34.9217 71.5124 34.555ZM67.211 58.3019C67.211 66.3497 53.5337 73.2875 53.5337 73.2875V38.7573H67.211C67.211 38.7573 67.211 50.2542 67.211 58.3019Z" fill="white"/>
|
||||||
|
<path d="M55 49C55 47.3431 56.3431 46 58 46H107C108.657 46 110 47.3431 110 49V60C110 61.6569 108.657 63 107 63H58C56.3431 63 55 61.6569 55 60V49Z" fill="#C32998"/>
|
||||||
|
<path d="M64.8914 53.7051C64.8914 54.3418 64.8152 54.9258 64.6628 55.457C64.5144 55.9844 64.2839 56.4414 63.9714 56.8281C63.6589 57.2148 63.2625 57.5176 62.782 57.7363L64.8445 60.0391H62.5183L60.948 58.1172C60.9207 58.1172 60.8972 58.1172 60.8777 58.1172C60.8582 58.1172 60.8367 58.1172 60.8132 58.1172C60.114 58.1172 59.5085 58.0137 58.9968 57.8066C58.4851 57.5957 58.0613 57.2949 57.7253 56.9043C57.3933 56.5137 57.1453 56.0469 56.9812 55.5039C56.8171 54.9609 56.7351 54.3574 56.7351 53.6934C56.7351 52.8066 56.8796 52.0352 57.1687 51.3789C57.4617 50.7188 57.9109 50.207 58.5164 49.8438C59.1218 49.4805 59.8914 49.2988 60.825 49.2988C61.7546 49.2988 62.5183 49.4805 63.116 49.8438C63.7175 50.207 64.1628 50.7188 64.4519 51.3789C64.7449 52.0391 64.8914 52.8145 64.8914 53.7051ZM58.6394 53.7051C58.6394 54.3027 58.7136 54.8184 58.8621 55.252C59.0144 55.6816 59.2507 56.0137 59.571 56.248C59.8914 56.4785 60.3054 56.5938 60.8132 56.5938C61.3289 56.5938 61.7468 56.4785 62.0671 56.248C62.3875 56.0137 62.6199 55.6816 62.7644 55.252C62.9128 54.8184 62.9871 54.3027 62.9871 53.7051C62.9871 52.8066 62.8191 52.0996 62.4832 51.584C62.1472 51.0684 61.5945 50.8105 60.825 50.8105C60.3132 50.8105 59.8953 50.9277 59.571 51.1621C59.2507 51.3926 59.0144 51.7246 58.8621 52.1582C58.7136 52.5879 58.6394 53.1035 58.6394 53.7051ZM71.9109 58L71.2898 55.9609H68.1667L67.5457 58H65.5886L68.6121 49.3984H70.8328L73.8679 58H71.9109ZM70.8562 54.4375L70.2351 52.4453C70.196 52.3125 70.1433 52.1426 70.0769 51.9355C70.0144 51.7246 69.95 51.5117 69.8835 51.2969C69.821 51.0781 69.7703 50.8887 69.7312 50.7285C69.6921 50.8887 69.6375 51.0879 69.5671 51.3262C69.5007 51.5605 69.4363 51.7832 69.3738 51.9941C69.3113 52.2051 69.2664 52.3555 69.239 52.4453L68.6238 54.4375H70.8562Z" fill="white"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_34_2" x1="37.8512" y1="38.8122" x2="89.011" y2="89.972" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-opacity="0.247059"/>
|
||||||
|
<stop offset="1" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clip0_34_2">
|
||||||
|
<rect width="108" height="108" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.6 KiB |
BIN
appIcons/iOS/beta.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
appIcons/iOS/dev.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
appIcons/iOS/prod.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
appIcons/iOS/qa.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
136
appIcons/icongen.sh
Executable file
@@ -0,0 +1,136 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
function print_example() {
|
||||||
|
echo "Example"
|
||||||
|
echo " icons ios ~/AppIcon.pdf ~/Icons/"
|
||||||
|
}
|
||||||
|
|
||||||
|
function print_usage() {
|
||||||
|
echo "Usage"
|
||||||
|
echo " icons <ios|watch|complication|macos> in-file.pdf (out-dir)"
|
||||||
|
}
|
||||||
|
|
||||||
|
function command_exists() {
|
||||||
|
if type "$1" >/dev/null 2>&1; then
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if command_exists "sips" == 0 ; then
|
||||||
|
echo "sips tool not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$1" = "--help" ] || [ "$1" = "-h" ] ; then
|
||||||
|
print_usage
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
PLATFORM="$1"
|
||||||
|
FILE="$2"
|
||||||
|
if [ -z "$PLATFORM" ] || [ -z "$FILE" ] ; then
|
||||||
|
echo "Error: missing arguments"
|
||||||
|
echo ""
|
||||||
|
print_usage
|
||||||
|
echo ""
|
||||||
|
print_example
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
DIR="$3"
|
||||||
|
if [ -z "$DIR" ] ; then
|
||||||
|
DIR=$(dirname $FILE)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create directory if needed
|
||||||
|
mkdir -p "$DIR"
|
||||||
|
|
||||||
|
if [[ "$PLATFORM" == *"ios"* ]] ; then # iOS
|
||||||
|
sips -s format png -Z '180' "${FILE}" --out "${DIR}"/Icon-180.png
|
||||||
|
sips -s format png -Z '29' "${FILE}" --out "${DIR}"/Icon-29.png
|
||||||
|
sips -s format png -Z '58' "${FILE}" --out "${DIR}"/Icon-58.png
|
||||||
|
sips -s format png -Z '120' "${FILE}" --out "${DIR}"/Icon-120.png
|
||||||
|
sips -s format png -Z '87' "${FILE}" --out "${DIR}"/Icon-87.png
|
||||||
|
sips -s format png -Z '40' "${FILE}" --out "${DIR}"/Icon-40.png
|
||||||
|
sips -s format png -Z '80' "${FILE}" --out "${DIR}"/Icon-80.png
|
||||||
|
sips -s format png -Z '76' "${FILE}" --out "${DIR}"/Icon-76.png
|
||||||
|
sips -s format png -Z '152' "${FILE}" --out "${DIR}"/Icon-152.png
|
||||||
|
sips -s format png -Z '167' "${FILE}" --out "${DIR}"/Icon-167.png
|
||||||
|
sips -s format png -Z '60' "${FILE}" --out "${DIR}"/Icon-60.png
|
||||||
|
sips -s format png -Z '20' "${FILE}" --out "${DIR}"/Icon-20.png
|
||||||
|
sips -s format png -Z '1024' "${FILE}" --out "${DIR}"/Icon-1024.png
|
||||||
|
|
||||||
|
# https://developer.apple.com/library/archive/documentation/Xcode/Reference/xcode_ref-Asset_Catalog_Format/AppIconType.html
|
||||||
|
contents_json='{"images":[{"size":"20x20","idiom":"iphone","filename":"iPhoneNotification@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"iPhoneNotification@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"iPhoneSettings@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"iPhoneSettings@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"iPhoneSpotlight@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"iPhoneSpotlight@3x.png","scale":"3x"},{"size":"60x60","idiom":"iphone","filename":"iPhone@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"iPhone@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"iPadNotification.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"iPadNotification@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"iPadSettings.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"iPadSettings@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"iPadSpotlight.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"iPadSpotlight@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"iPad.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"iPad@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"iPadPro@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"AppStoreMarketing.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}'
|
||||||
|
echo $contents_json > "${DIR}"/Contents.json
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$PLATFORM" == *"watch"* ]] ; then # Apple Watch
|
||||||
|
sips -s format png -Z '48' "${FILE}" --out "${DIR}"/Watch38mmNotificationCenter.png
|
||||||
|
sips -s format png -Z '55' "${FILE}" --out "${DIR}"/Watch42mmNotificationCenter.png
|
||||||
|
sips -s format png -Z '66' "${FILE}" --out "${DIR}"/Watch66NotificationCenter.png
|
||||||
|
sips -s format png -Z '58' "${FILE}" --out "${DIR}"/WatchCompanionSettings@2x.png
|
||||||
|
sips -s format png -Z '87' "${FILE}" --out "${DIR}"/WatchCompanionSettings@3x.png
|
||||||
|
sips -s format png -Z '80' "${FILE}" --out "${DIR}"/Watch38MM42MMHomeScreen.png
|
||||||
|
sips -s format png -Z '88' "${FILE}" --out "${DIR}"/Watch40MMHomeScreen.png
|
||||||
|
sips -s format png -Z '92' "${FILE}" --out "${DIR}"/Watch41MMHomeScreen.png
|
||||||
|
sips -s format png -Z '100' "${FILE}" --out "${DIR}"/Watch44MMHomeScreen.png
|
||||||
|
sips -s format png -Z '102' "${FILE}" --out "${DIR}"/Watch45MMHomeScreen.png
|
||||||
|
sips -s format png -Z '108' "${FILE}" --out "${DIR}"/Watch49MMHomeScreen.png
|
||||||
|
sips -s format png -Z '172' "${FILE}" --out "${DIR}"/Watch38MMShortLook.png
|
||||||
|
sips -s format png -Z '196' "${FILE}" --out "${DIR}"/Watch40MM42MMShortLook.png
|
||||||
|
sips -s format png -Z '216' "${FILE}" --out "${DIR}"/Watch44MMShortLook.png
|
||||||
|
sips -s format png -Z '234' "${FILE}" --out "${DIR}"/Watch234ShortLook.png
|
||||||
|
sips -s format png -Z '258' "${FILE}" --out "${DIR}"/Watch258ShortLook.png
|
||||||
|
sips -s format png -Z '1024' "${FILE}" --out "${DIR}"/WatchAppStore.png
|
||||||
|
|
||||||
|
# https://developer.apple.com/library/archive/documentation/Xcode/Reference/xcode_ref-Asset_Catalog_Format/AppIconType.html
|
||||||
|
contents_json='{"images":[{"size":"24x24","idiom":"watch","scale":"2x","filename":"Watch38mmNotificationCenter.png","role":"notificationCenter","subtype":"38mm"},{"size":"27.5x27.5","idiom":"watch","scale":"2x","filename":"Watch42mmNotificationCenter.png","role":"notificationCenter","subtype":"42mm"},{"size":"29x29","idiom":"watch","filename":"WatchCompanionSettings@2x.png","role":"companionSettings","scale":"2x"},{"size":"29x29","idiom":"watch","filename":"WatchCompanionSettings@3x.png","role":"companionSettings","scale":"3x"},{"size":"40x40","idiom":"watch","filename":"Watch38MM42MMHomeScreen.png","scale":"2x","role":"appLauncher","subtype":"38mm"},{"size":"44x44","idiom":"watch","scale":"2x","filename":"Watch40MMHomeScreen.png","role":"appLauncher","subtype":"40mm"},{"size":"50x50","idiom":"watch","scale":"2x","filename":"Watch44MMHomeScreen.png","role":"appLauncher","subtype":"44mm"},{"size":"86x86","idiom":"watch","scale":"2x","filename":"Watch38MMShortLook.png","role":"quickLook","subtype":"38mm"},{"size":"98x98","idiom":"watch","scale":"2x","filename":"Watch40MM42MMShortLook.png","role":"quickLook","subtype":"42mm"},{"size":"108x108","idiom":"watch","scale":"2x","filename":"Watch44MMShortLook.png","role":"quickLook","subtype":"44mm"},{"idiom":"watch-marketing","filename":"WatchAppStore.png","size":"1024x1024","scale":"1x"}],"info":{"version":1,"author":"xcode"}}'
|
||||||
|
echo $contents_json > "${DIR}"/Contents.json
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$PLATFORM" == *"complication"* ]] ; then # Apple Watch
|
||||||
|
sips -s format png -Z '32' "${FILE}" --out "${DIR}"/Circular38mm2x.png
|
||||||
|
sips -s format png -Z '36' "${FILE}" --out "${DIR}"/Circular40mm2x.png
|
||||||
|
sips -s format png -Z '36' "${FILE}" --out "${DIR}"/Circular42mm2x.png
|
||||||
|
sips -s format png -Z '40' "${FILE}" --out "${DIR}"/Circular44mm2x.png
|
||||||
|
sips -s format png -Z '182' "${FILE}" --out "${DIR}"/ExtraLarge38mm2x.png
|
||||||
|
sips -s format png -Z '203' "${FILE}" --out "${DIR}"/ExtraLarge40mm2x.png
|
||||||
|
sips -s format png -Z '203' "${FILE}" --out "${DIR}"/ExtraLarge42mm2x.png
|
||||||
|
sips -s format png -Z '224' "${FILE}" --out "${DIR}"/ExtraLarge44mm2x.png
|
||||||
|
sips -s format png -Z '84' "${FILE}" --out "${DIR}"/GraphicBezel40mm2x.png
|
||||||
|
sips -s format png -Z '84' "${FILE}" --out "${DIR}"/GraphicBezel42mm2x.png
|
||||||
|
sips -s format png -Z '94' "${FILE}" --out "${DIR}"/GraphicBezel44mm2x.png
|
||||||
|
sips -s format png -Z '84' "${FILE}" --out "${DIR}"/GraphicCircular40mm2x.png
|
||||||
|
sips -s format png -Z '84' "${FILE}" --out "${DIR}"/GraphicCircular42mm2x.png
|
||||||
|
sips -s format png -Z '94' "${FILE}" --out "${DIR}"/GraphicCircular44mm2x.png
|
||||||
|
sips -s format png -Z '40' "${FILE}" --out "${DIR}"/GraphicCorner40mm2x.png
|
||||||
|
sips -s format png -Z '40' "${FILE}" --out "${DIR}"/GraphicCorner42mm2x.png
|
||||||
|
sips -s format png -Z '44' "${FILE}" --out "${DIR}"/GraphicCorner44mm2x.png
|
||||||
|
sips -s format png -Z '52' "${FILE}" --out "${DIR}"/GraphicModular38mm2x.png
|
||||||
|
sips -s format png -Z '58' "${FILE}" --out "${DIR}"/GraphicModular40mm2x.png
|
||||||
|
sips -s format png -Z '58' "${FILE}" --out "${DIR}"/GraphicModular42mm2x.png
|
||||||
|
sips -s format png -Z '64' "${FILE}" --out "${DIR}"/GraphicModular44mm2x.png
|
||||||
|
sips -s format png -Z '40' "${FILE}" --out "${DIR}"/GraphicUtilitarian38mm2x.png
|
||||||
|
sips -s format png -Z '44' "${FILE}" --out "${DIR}"/GraphicUtilitarian40mm2x.png
|
||||||
|
sips -s format png -Z '44' "${FILE}" --out "${DIR}"/GraphicUtilitarian42mm2x.png
|
||||||
|
sips -s format png -Z '50' "${FILE}" --out "${DIR}"/GraphicUtilitarian44mm2x.png
|
||||||
|
sips -s format png -Z '206' "${FILE}" --out "${DIR}"/GraphicExtraLarge38mm2x.png
|
||||||
|
sips -s format png -Z '264' "${FILE}" --out "${DIR}"/GraphicExtraLarge44mm2x.png
|
||||||
|
echo "NOTE: Graphic Extra Large is not generated since that is not rectangular"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$PLATFORM" == *"macos"* ]] ; then # macOS
|
||||||
|
sips -s format png -Z '1024' "${FILE}" --out "${DIR}"/icon_512x512@2x.png
|
||||||
|
sips -s format png -Z '512' "${FILE}" --out "${DIR}"/icon_512x512.png
|
||||||
|
sips -s format png -Z '512' "${FILE}" --out "${DIR}"/icon_256x256@2x.png
|
||||||
|
sips -s format png -Z '256' "${FILE}" --out "${DIR}"/icon_256x256.png
|
||||||
|
sips -s format png -Z '256' "${FILE}" --out "${DIR}"/icon_128x128@2x.png
|
||||||
|
sips -s format png -Z '128' "${FILE}" --out "${DIR}"/icon_128x128.png
|
||||||
|
sips -s format png -Z '64' "${FILE}" --out "${DIR}"/icon_32x32@2x.png
|
||||||
|
sips -s format png -Z '32' "${FILE}" --out "${DIR}"/icon_32x32.png
|
||||||
|
sips -s format png -Z '32' "${FILE}" --out "${DIR}"/icon_16x16@2x.png
|
||||||
|
sips -s format png -Z '16' "${FILE}" --out "${DIR}"/icon_16x16.png
|
||||||
|
fi
|
||||||
106
build.cake
@@ -4,6 +4,7 @@
|
|||||||
#addin nuget:?package=Cake.Incubator&version=7.0.0
|
#addin nuget:?package=Cake.Incubator&version=7.0.0
|
||||||
#tool dotnet:?package=GitVersion.Tool&version=5.10.3
|
#tool dotnet:?package=GitVersion.Tool&version=5.10.3
|
||||||
using Path = System.IO.Path;
|
using Path = System.IO.Path;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
var debugScript = Argument<bool>("debugScript", false);
|
var debugScript = Argument<bool>("debugScript", false);
|
||||||
var target = Argument("target", "Default");
|
var target = Argument("target", "Default");
|
||||||
@@ -35,6 +36,7 @@ VariantConfig GetVariant() => variant.ToLower() switch{
|
|||||||
GitVersion _gitVersion; //will be set by GetGitInfo task
|
GitVersion _gitVersion; //will be set by GetGitInfo task
|
||||||
var _slnPath = Path.Combine(""); //base path used to access files. If build.cake file is moved, just update this
|
var _slnPath = Path.Combine(""); //base path used to access files. If build.cake file is moved, just update this
|
||||||
string _androidPackageName = string.Empty; //will be set by UpdateAndroidManifest task
|
string _androidPackageName = string.Empty; //will be set by UpdateAndroidManifest task
|
||||||
|
string _iOSVersionName = string.Empty; //will be set by UpdateiOSPlist task
|
||||||
string CreateFeatureBranch(string prevVersionName, GitVersion git) => $"{prevVersionName}-{git.BranchName.Replace("/","-")}";
|
string CreateFeatureBranch(string prevVersionName, GitVersion git) => $"{prevVersionName}-{git.BranchName.Replace("/","-")}";
|
||||||
string GetVersionName(string prevVersionName, VariantConfig buildVariant, GitVersion git) => buildVariant is Prod? prevVersionName : CreateFeatureBranch(prevVersionName, git);
|
string GetVersionName(string prevVersionName, VariantConfig buildVariant, GitVersion git) => buildVariant is Prod? prevVersionName : CreateFeatureBranch(prevVersionName, git);
|
||||||
int CreateBuildNumber(int previousNumber) => ++previousNumber;
|
int CreateBuildNumber(int previousNumber) => ++previousNumber;
|
||||||
@@ -163,7 +165,8 @@ enum iOSProjectType
|
|||||||
MainApp,
|
MainApp,
|
||||||
Autofill,
|
Autofill,
|
||||||
Extension,
|
Extension,
|
||||||
ShareExtension
|
ShareExtension,
|
||||||
|
WatchApp
|
||||||
}
|
}
|
||||||
|
|
||||||
string GetiOSBundleId(VariantConfig buildVariant, iOSProjectType projectType) => projectType switch
|
string GetiOSBundleId(VariantConfig buildVariant, iOSProjectType projectType) => projectType switch
|
||||||
@@ -171,6 +174,7 @@ string GetiOSBundleId(VariantConfig buildVariant, iOSProjectType projectType) =>
|
|||||||
iOSProjectType.Autofill => $"{buildVariant.iOSBundleId}.autofill",
|
iOSProjectType.Autofill => $"{buildVariant.iOSBundleId}.autofill",
|
||||||
iOSProjectType.Extension => $"{buildVariant.iOSBundleId}.find-login-action-extension",
|
iOSProjectType.Extension => $"{buildVariant.iOSBundleId}.find-login-action-extension",
|
||||||
iOSProjectType.ShareExtension => $"{buildVariant.iOSBundleId}.share-extension",
|
iOSProjectType.ShareExtension => $"{buildVariant.iOSBundleId}.share-extension",
|
||||||
|
iOSProjectType.WatchApp => $"{buildVariant.iOSBundleId}.watchkitapp",
|
||||||
_ => buildVariant.iOSBundleId
|
_ => buildVariant.iOSBundleId
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -205,6 +209,7 @@ private void UpdateiOSInfoPlist(string plistPath, VariantConfig buildVariant, Gi
|
|||||||
|
|
||||||
if(projectType == iOSProjectType.MainApp)
|
if(projectType == iOSProjectType.MainApp)
|
||||||
{
|
{
|
||||||
|
_iOSVersionName = newVersionName;
|
||||||
plist["CFBundleURLTypes"][0]["CFBundleURLName"] = $"{buildVariant.iOSBundleId}.url";
|
plist["CFBundleURLTypes"][0]["CFBundleURLName"] = $"{buildVariant.iOSBundleId}.url";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,10 +245,79 @@ private void UpdateiOSEntitlementsPlist(string entitlementsPath, VariantConfig b
|
|||||||
Information($"{entitlementsPath} updated with success!");
|
Information($"{entitlementsPath} updated with success!");
|
||||||
}
|
}
|
||||||
|
|
||||||
Task("UpdateiOSIcon")
|
private void UpdateWatchKitAppInfoPlist(string plistPath, VariantConfig buildVariant)
|
||||||
|
{
|
||||||
|
var plistFile = File(plistPath);
|
||||||
|
dynamic plist = DeserializePlist(plistFile);
|
||||||
|
|
||||||
|
var prevBundleId = plist["NSExtension"]["NSExtensionAttributes"]["WKAppBundleIdentifier"];
|
||||||
|
var newBundleId = GetiOSBundleId(buildVariant, iOSProjectType.WatchApp);
|
||||||
|
|
||||||
|
plist["NSExtension"]["NSExtensionAttributes"]["WKAppBundleIdentifier"] = newBundleId;
|
||||||
|
|
||||||
|
SerializePlist(plistFile, plist);
|
||||||
|
|
||||||
|
Information($"Changed Bundle Identifier from {prevBundleId} to {newBundleId}");
|
||||||
|
Information($"{plistPath} updated with success!");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateWatchPbxproj(string pbxprojPath, string newVersion)
|
||||||
|
{
|
||||||
|
var fileText = FileReadText(pbxprojPath);
|
||||||
|
if (string.IsNullOrEmpty(fileText))
|
||||||
|
{
|
||||||
|
throw new Exception($"Couldn't find {pbxprojPath}");
|
||||||
|
}
|
||||||
|
|
||||||
|
const string pattern = @"MARKETING_VERSION = [^;]*;";
|
||||||
|
|
||||||
|
fileText = Regex.Replace(fileText, pattern, $"MARKETING_VERSION = {newVersion};");
|
||||||
|
|
||||||
|
FileWriteText(pbxprojPath, fileText);
|
||||||
|
Information($"{pbxprojPath} modified successfully.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the target icons on the given appiconset target
|
||||||
|
/// taking as source the icon in appIcons/iOS folder for the giving variant
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="target">It can be <ios|watch|complication|macos></param>
|
||||||
|
/// <param name="appiconsetTarget">Folder to copy the generated icons to</param>
|
||||||
|
private void UpdateAppleIcons(string target, string appiconsetTarget)
|
||||||
|
{
|
||||||
|
Information($"Updating {target} App Icons");
|
||||||
|
|
||||||
|
var iconsTempDirPath = Path.Combine(_slnPath, "appIcons", "temp");
|
||||||
|
CreateDirectory(iconsTempDirPath);
|
||||||
|
|
||||||
|
var arguments = new ProcessArgumentBuilder();
|
||||||
|
arguments.Append(target);
|
||||||
|
arguments.Append(Path.Combine(_slnPath, "appIcons", "iOS", $"{variant}.png"));
|
||||||
|
arguments.Append(iconsTempDirPath);
|
||||||
|
|
||||||
|
using(var process = StartAndReturnProcess(Path.Combine(_slnPath, "appIcons", "icongen.sh"),
|
||||||
|
new ProcessSettings { Arguments = arguments }))
|
||||||
|
{
|
||||||
|
process.WaitForExit();
|
||||||
|
Information("Exit code: {0}", process.GetExitCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
var generatedIconsPath = Path.Combine(iconsTempDirPath, "*.png");
|
||||||
|
CopyFiles(generatedIconsPath, appiconsetTarget);
|
||||||
|
|
||||||
|
DeleteDirectory(iconsTempDirPath, new DeleteDirectorySettings {
|
||||||
|
Recursive = true,
|
||||||
|
Force = true
|
||||||
|
});
|
||||||
|
|
||||||
|
Information($"{target} App Icons have been updated");
|
||||||
|
}
|
||||||
|
|
||||||
|
Task("UpdateiOSIcons")
|
||||||
.Does(()=>{
|
.Does(()=>{
|
||||||
//TODO we'll implement variant icons later
|
UpdateAppleIcons("ios", Path.Combine(_slnPath, "src", "iOS", "Resources", "Assets.xcassets", "AppIcons.appiconset"));
|
||||||
Information($"Updating IOS App Icon");
|
UpdateAppleIcons("watch", Path.Combine(_slnPath, "src", "watchOS", "bitwarden", "bitwarden WatchKit App", "Assets.xcassets", "AppIcon.appiconset"));
|
||||||
|
// TODO: Update complication icons when they start working
|
||||||
});
|
});
|
||||||
|
|
||||||
Task("UpdateiOSPlist")
|
Task("UpdateiOSPlist")
|
||||||
@@ -296,8 +370,10 @@ Task("UpdateiOSCodeFiles")
|
|||||||
var fileList = new string[] {
|
var fileList = new string[] {
|
||||||
Path.Combine(_slnPath, "src", "iOS.Core", "Utilities", "iOSCoreHelpers.cs"),
|
Path.Combine(_slnPath, "src", "iOS.Core", "Utilities", "iOSCoreHelpers.cs"),
|
||||||
Path.Combine(_slnPath, "src", "iOS.Core", "Constants.cs"),
|
Path.Combine(_slnPath, "src", "iOS.Core", "Constants.cs"),
|
||||||
|
Path.Combine(_slnPath, "src", "watchOS", "bitwarden", "bitwarden.xcodeproj", "project.pbxproj"),
|
||||||
|
Path.Combine(_slnPath, "src", "watchOS", "bitwarden", "bitwarden WatchKit Extension", "Helpers", "KeychainHelper.swift"),
|
||||||
Path.Combine(".github", "resources", "export-options-ad-hoc.plist"),
|
Path.Combine(".github", "resources", "export-options-ad-hoc.plist"),
|
||||||
Path.Combine(".github", "resources", "export-options-app-store.plist"),
|
Path.Combine(".github", "resources", "export-options-app-store.plist")
|
||||||
};
|
};
|
||||||
|
|
||||||
foreach(string path in fileList)
|
foreach(string path in fileList)
|
||||||
@@ -305,6 +381,22 @@ Task("UpdateiOSCodeFiles")
|
|||||||
ReplaceInFile(path, "com.8bit.bitwarden", buildVariant.iOSBundleId);
|
ReplaceInFile(path, "com.8bit.bitwarden", buildVariant.iOSBundleId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Task("UpdateWatchProject")
|
||||||
|
.IsDependentOn("UpdateiOSPlist")
|
||||||
|
.WithCriteria(() => !string.IsNullOrEmpty(_iOSVersionName))
|
||||||
|
.Does(()=> {
|
||||||
|
var watchProjectPath = Path.Combine(_slnPath, "src", "watchOS", "bitwarden", "bitwarden.xcodeproj", "project.pbxproj");
|
||||||
|
UpdateWatchPbxproj(watchProjectPath, _iOSVersionName);
|
||||||
|
});
|
||||||
|
|
||||||
|
Task("UpdateWatchKitAppInfoPlist")
|
||||||
|
.Does(()=> {
|
||||||
|
var buildVariant = GetVariant();
|
||||||
|
var infoPath = Path.Combine(_slnPath, "src", "watchOS", "bitwarden", "bitwarden WatchKit Extension", "Info.plist");
|
||||||
|
UpdateWatchKitAppInfoPlist(infoPath, buildVariant);
|
||||||
|
});
|
||||||
|
|
||||||
#endregion iOS
|
#endregion iOS
|
||||||
|
|
||||||
#region Main Tasks
|
#region Main Tasks
|
||||||
@@ -318,12 +410,14 @@ Task("Android")
|
|||||||
});
|
});
|
||||||
|
|
||||||
Task("iOS")
|
Task("iOS")
|
||||||
//.IsDependentOn("UpdateiOSIcon")
|
.IsDependentOn("UpdateiOSIcons")
|
||||||
.IsDependentOn("UpdateiOSPlist")
|
.IsDependentOn("UpdateiOSPlist")
|
||||||
.IsDependentOn("UpdateiOSAutofillPlist")
|
.IsDependentOn("UpdateiOSAutofillPlist")
|
||||||
.IsDependentOn("UpdateiOSExtensionPlist")
|
.IsDependentOn("UpdateiOSExtensionPlist")
|
||||||
.IsDependentOn("UpdateiOSShareExtensionPlist")
|
.IsDependentOn("UpdateiOSShareExtensionPlist")
|
||||||
.IsDependentOn("UpdateiOSCodeFiles")
|
.IsDependentOn("UpdateiOSCodeFiles")
|
||||||
|
.IsDependentOn("UpdateWatchProject")
|
||||||
|
.IsDependentOn("UpdateWatchKitAppInfoPlist")
|
||||||
.Does(()=>
|
.Does(()=>
|
||||||
{
|
{
|
||||||
Information("iOS app updated");
|
Information("iOS app updated");
|
||||||
|
|||||||
1
lib/MessagePack
Submodule
@@ -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>
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ namespace Bit.Droid.Autofill
|
|||||||
|
|
||||||
if (!_usernameFields.Any())
|
if (!_usernameFields.Any())
|
||||||
{
|
{
|
||||||
_usernameFields = Fields.Where(f => FieldHasUsernameTerms(f)).ToList();
|
_usernameFields = Fields.Where(f => FieldIsUsername(f)).ToList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return _usernameFields;
|
return _usernameFields;
|
||||||
@@ -327,7 +327,7 @@ namespace Bit.Droid.Autofill
|
|||||||
}
|
}
|
||||||
|
|
||||||
return inputTypePassword && !ValueContainsAnyTerms(f.IdEntry, _ignoreSearchTerms) &&
|
return inputTypePassword && !ValueContainsAnyTerms(f.IdEntry, _ignoreSearchTerms) &&
|
||||||
!ValueContainsAnyTerms(f.Hint, _ignoreSearchTerms) && !FieldHasUsernameTerms(f);
|
!ValueContainsAnyTerms(f.Hint, _ignoreSearchTerms) && !FieldIsUsername(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool FieldHasPasswordTerms(Field f)
|
private bool FieldHasPasswordTerms(Field f)
|
||||||
@@ -335,6 +335,11 @@ namespace Bit.Droid.Autofill
|
|||||||
return ValueContainsAnyTerms(f.IdEntry, _passwordTerms) || ValueContainsAnyTerms(f.Hint, _passwordTerms);
|
return ValueContainsAnyTerms(f.IdEntry, _passwordTerms) || ValueContainsAnyTerms(f.Hint, _passwordTerms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool FieldIsUsername(Field f)
|
||||||
|
{
|
||||||
|
return f.InputType.HasFlag(InputTypes.TextVariationWebEmailAddress) || FieldHasUsernameTerms(f);
|
||||||
|
}
|
||||||
|
|
||||||
private bool FieldHasUsernameTerms(Field f)
|
private bool FieldHasUsernameTerms(Field f)
|
||||||
{
|
{
|
||||||
return ValueContainsAnyTerms(f.IdEntry, _usernameTerms) || ValueContainsAnyTerms(f.Hint, _usernameTerms);
|
return ValueContainsAnyTerms(f.IdEntry, _usernameTerms) || ValueContainsAnyTerms(f.Hint, _usernameTerms);
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ namespace Bit.Droid
|
|||||||
private IAppIdService _appIdService;
|
private IAppIdService _appIdService;
|
||||||
private IEventService _eventService;
|
private IEventService _eventService;
|
||||||
private IPushNotificationListenerService _pushNotificationListenerService;
|
private IPushNotificationListenerService _pushNotificationListenerService;
|
||||||
|
private IVaultTimeoutService _vaultTimeoutService;
|
||||||
private ILogger _logger;
|
private ILogger _logger;
|
||||||
private PendingIntent _eventUploadPendingIntent;
|
private PendingIntent _eventUploadPendingIntent;
|
||||||
private AppOptions _appOptions;
|
private AppOptions _appOptions;
|
||||||
@@ -68,6 +69,7 @@ namespace Bit.Droid
|
|||||||
_appIdService = ServiceContainer.Resolve<IAppIdService>("appIdService");
|
_appIdService = ServiceContainer.Resolve<IAppIdService>("appIdService");
|
||||||
_eventService = ServiceContainer.Resolve<IEventService>("eventService");
|
_eventService = ServiceContainer.Resolve<IEventService>("eventService");
|
||||||
_pushNotificationListenerService = ServiceContainer.Resolve<IPushNotificationListenerService>();
|
_pushNotificationListenerService = ServiceContainer.Resolve<IPushNotificationListenerService>();
|
||||||
|
_vaultTimeoutService = ServiceContainer.Resolve<IVaultTimeoutService>();
|
||||||
_logger = ServiceContainer.Resolve<ILogger>("logger");
|
_logger = ServiceContainer.Resolve<ILogger>("logger");
|
||||||
|
|
||||||
TabLayoutResource = Resource.Layout.Tabbar;
|
TabLayoutResource = Resource.Layout.Tabbar;
|
||||||
@@ -170,7 +172,7 @@ namespace Bit.Droid
|
|||||||
{
|
{
|
||||||
if (intent?.GetStringExtra("uri") is string uri)
|
if (intent?.GetStringExtra("uri") is string uri)
|
||||||
{
|
{
|
||||||
_messagingService.Send("popAllAndGoToAutofillCiphers");
|
_messagingService.Send(App.App.POP_ALL_AND_GO_TO_AUTOFILL_CIPHERS_MESSAGE);
|
||||||
if (_appOptions != null)
|
if (_appOptions != null)
|
||||||
{
|
{
|
||||||
_appOptions.Uri = uri;
|
_appOptions.Uri = uri;
|
||||||
@@ -178,7 +180,7 @@ namespace Bit.Droid
|
|||||||
}
|
}
|
||||||
else if (intent.GetBooleanExtra("generatorTile", false))
|
else if (intent.GetBooleanExtra("generatorTile", false))
|
||||||
{
|
{
|
||||||
_messagingService.Send("popAllAndGoToTabGenerator");
|
_messagingService.Send(App.App.POP_ALL_AND_GO_TO_TAB_GENERATOR_MESSAGE);
|
||||||
if (_appOptions != null)
|
if (_appOptions != null)
|
||||||
{
|
{
|
||||||
_appOptions.GeneratorTile = true;
|
_appOptions.GeneratorTile = true;
|
||||||
@@ -186,7 +188,7 @@ namespace Bit.Droid
|
|||||||
}
|
}
|
||||||
else if (intent.GetBooleanExtra("myVaultTile", false))
|
else if (intent.GetBooleanExtra("myVaultTile", false))
|
||||||
{
|
{
|
||||||
_messagingService.Send("popAllAndGoToTabMyVault");
|
_messagingService.Send(App.App.POP_ALL_AND_GO_TO_TAB_MYVAULT_MESSAGE);
|
||||||
if (_appOptions != null)
|
if (_appOptions != null)
|
||||||
{
|
{
|
||||||
_appOptions.MyVaultTile = true;
|
_appOptions.MyVaultTile = true;
|
||||||
@@ -198,7 +200,7 @@ namespace Bit.Droid
|
|||||||
{
|
{
|
||||||
_appOptions.CreateSend = GetCreateSendRequest(intent);
|
_appOptions.CreateSend = GetCreateSendRequest(intent);
|
||||||
}
|
}
|
||||||
_messagingService.Send("popAllAndGoToTabSend");
|
_messagingService.Send(App.App.POP_ALL_AND_GO_TO_TAB_SEND_MESSAGE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -232,6 +234,7 @@ namespace Bit.Droid
|
|||||||
|
|
||||||
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
|
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
|
||||||
{
|
{
|
||||||
|
_vaultTimeoutService.ResetTimeoutDelay = true;
|
||||||
if (resultCode == Result.Ok &&
|
if (resultCode == Result.Ok &&
|
||||||
(requestCode == Core.Constants.SelectFileRequestCode || requestCode == Core.Constants.SaveFileRequestCode))
|
(requestCode == Core.Constants.SelectFileRequestCode || requestCode == Core.Constants.SaveFileRequestCode))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ using Bit.App.Utilities;
|
|||||||
using Bit.App.Pages;
|
using Bit.App.Pages;
|
||||||
using Bit.App.Utilities.AccountManagement;
|
using Bit.App.Utilities.AccountManagement;
|
||||||
using Bit.App.Controls;
|
using Bit.App.Controls;
|
||||||
|
using Bit.Core.Enums;
|
||||||
#if !FDROID
|
#if !FDROID
|
||||||
using Android.Gms.Security;
|
using Android.Gms.Security;
|
||||||
#endif
|
#endif
|
||||||
@@ -81,7 +82,8 @@ namespace Bit.Droid
|
|||||||
ServiceContainer.Resolve<IAuthService>("authService"),
|
ServiceContainer.Resolve<IAuthService>("authService"),
|
||||||
ServiceContainer.Resolve<ILogger>("logger"),
|
ServiceContainer.Resolve<ILogger>("logger"),
|
||||||
ServiceContainer.Resolve<IMessagingService>("messagingService"),
|
ServiceContainer.Resolve<IMessagingService>("messagingService"),
|
||||||
ServiceContainer.Resolve<IWatchDeviceService>());
|
ServiceContainer.Resolve<IWatchDeviceService>(),
|
||||||
|
ServiceContainer.Resolve<IConditionedAwaiterManager>());
|
||||||
ServiceContainer.Register<IAccountsManager>("accountsManager", accountsManager);
|
ServiceContainer.Register<IAccountsManager>("accountsManager", accountsManager);
|
||||||
}
|
}
|
||||||
#if !FDROID
|
#if !FDROID
|
||||||
@@ -143,9 +145,10 @@ namespace Bit.Droid
|
|||||||
var secureStorageService = new SecureStorageService();
|
var secureStorageService = new SecureStorageService();
|
||||||
var cryptoPrimitiveService = new CryptoPrimitiveService();
|
var cryptoPrimitiveService = new CryptoPrimitiveService();
|
||||||
var mobileStorageService = new MobileStorageService(preferencesStorage, liteDbStorage);
|
var mobileStorageService = new MobileStorageService(preferencesStorage, liteDbStorage);
|
||||||
var stateService = new StateService(mobileStorageService, secureStorageService, messagingService);
|
var storageMediatorService = new StorageMediatorService(mobileStorageService, secureStorageService, preferencesStorage);
|
||||||
|
var stateService = new StateService(mobileStorageService, secureStorageService, storageMediatorService, messagingService);
|
||||||
var stateMigrationService =
|
var stateMigrationService =
|
||||||
new StateMigrationService(liteDbStorage, preferencesStorage, secureStorageService);
|
new StateMigrationService(DeviceType.Android, liteDbStorage, preferencesStorage, secureStorageService);
|
||||||
var clipboardService = new ClipboardService(stateService);
|
var clipboardService = new ClipboardService(stateService);
|
||||||
var deviceActionService = new DeviceActionService(stateService, messagingService);
|
var deviceActionService = new DeviceActionService(stateService, messagingService);
|
||||||
var fileService = new FileService(stateService, broadcasterService);
|
var fileService = new FileService(stateService, broadcasterService);
|
||||||
@@ -153,11 +156,12 @@ namespace Bit.Droid
|
|||||||
messagingService, broadcasterService);
|
messagingService, broadcasterService);
|
||||||
var autofillHandler = new AutofillHandler(stateService, messagingService, clipboardService,
|
var autofillHandler = new AutofillHandler(stateService, messagingService, clipboardService,
|
||||||
platformUtilsService, new LazyResolve<IEventService>());
|
platformUtilsService, new LazyResolve<IEventService>());
|
||||||
var biometricService = new BiometricService();
|
var biometricService = new BiometricService(stateService);
|
||||||
var cryptoFunctionService = new PclCryptoFunctionService(cryptoPrimitiveService);
|
var cryptoFunctionService = new PclCryptoFunctionService(cryptoPrimitiveService);
|
||||||
var cryptoService = new CryptoService(stateService, cryptoFunctionService);
|
var cryptoService = new CryptoService(stateService, cryptoFunctionService);
|
||||||
var passwordRepromptService = new MobilePasswordRepromptService(platformUtilsService, cryptoService);
|
var passwordRepromptService = new MobilePasswordRepromptService(platformUtilsService, cryptoService);
|
||||||
|
|
||||||
|
ServiceContainer.Register<ISynchronousStorageService>(preferencesStorage);
|
||||||
ServiceContainer.Register<IBroadcasterService>("broadcasterService", broadcasterService);
|
ServiceContainer.Register<IBroadcasterService>("broadcasterService", broadcasterService);
|
||||||
ServiceContainer.Register<IMessagingService>("messagingService", messagingService);
|
ServiceContainer.Register<IMessagingService>("messagingService", messagingService);
|
||||||
ServiceContainer.Register<ILocalizeService>("localizeService", localizeService);
|
ServiceContainer.Register<ILocalizeService>("localizeService", localizeService);
|
||||||
@@ -165,6 +169,7 @@ namespace Bit.Droid
|
|||||||
ServiceContainer.Register<ICryptoPrimitiveService>("cryptoPrimitiveService", cryptoPrimitiveService);
|
ServiceContainer.Register<ICryptoPrimitiveService>("cryptoPrimitiveService", cryptoPrimitiveService);
|
||||||
ServiceContainer.Register<IStorageService>("storageService", mobileStorageService);
|
ServiceContainer.Register<IStorageService>("storageService", mobileStorageService);
|
||||||
ServiceContainer.Register<IStorageService>("secureStorageService", secureStorageService);
|
ServiceContainer.Register<IStorageService>("secureStorageService", secureStorageService);
|
||||||
|
ServiceContainer.Register<IStorageMediatorService>(storageMediatorService);
|
||||||
ServiceContainer.Register<IStateService>("stateService", stateService);
|
ServiceContainer.Register<IStateService>("stateService", stateService);
|
||||||
ServiceContainer.Register<IStateMigrationService>("stateMigrationService", stateMigrationService);
|
ServiceContainer.Register<IStateMigrationService>("stateMigrationService", stateMigrationService);
|
||||||
ServiceContainer.Register<IClipboardService>("clipboardService", clipboardService);
|
ServiceContainer.Register<IClipboardService>("clipboardService", clipboardService);
|
||||||
@@ -197,7 +202,9 @@ namespace Bit.Droid
|
|||||||
|
|
||||||
private void Bootstrap()
|
private void Bootstrap()
|
||||||
{
|
{
|
||||||
(ServiceContainer.Resolve<II18nService>("i18nService") as MobileI18nService).Init();
|
var locale = ServiceContainer.Resolve<IStateService>().GetLocale();
|
||||||
|
(ServiceContainer.Resolve<II18nService>("i18nService") as MobileI18nService)
|
||||||
|
.Init(locale != null ? new System.Globalization.CultureInfo(locale) : null);
|
||||||
ServiceContainer.Resolve<IAuthService>("authService").Init();
|
ServiceContainer.Resolve<IAuthService>("authService").Init();
|
||||||
// Note: This is not awaited
|
// Note: This is not awaited
|
||||||
var bootstrapTask = BootstrapAsync();
|
var bootstrapTask = BootstrapAsync();
|
||||||
|
|||||||
@@ -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.1.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.4.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" />
|
||||||
@@ -45,11 +45,11 @@
|
|||||||
<queries>
|
<queries>
|
||||||
<intent>
|
<intent>
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
<data android:scheme="http"/>
|
<data android:scheme="http" />
|
||||||
</intent>
|
</intent>
|
||||||
<intent>
|
<intent>
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
<data android:scheme="https"/>
|
<data android:scheme="https" />
|
||||||
</intent>
|
</intent>
|
||||||
</queries>
|
</queries>
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -4,7 +4,6 @@ using Android.OS;
|
|||||||
using Android.Security.Keystore;
|
using Android.Security.Keystore;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.Core.Services;
|
using Bit.Core.Services;
|
||||||
using Bit.Core.Utilities;
|
|
||||||
using Java.Security;
|
using Java.Security;
|
||||||
using Javax.Crypto;
|
using Javax.Crypto;
|
||||||
|
|
||||||
@@ -12,6 +11,8 @@ namespace Bit.Droid.Services
|
|||||||
{
|
{
|
||||||
public class BiometricService : IBiometricService
|
public class BiometricService : IBiometricService
|
||||||
{
|
{
|
||||||
|
private readonly IStateService _stateService;
|
||||||
|
|
||||||
private const string KeyName = "com.8bit.bitwarden.biometric_integrity";
|
private const string KeyName = "com.8bit.bitwarden.biometric_integrity";
|
||||||
|
|
||||||
private const string KeyStoreName = "AndroidKeyStore";
|
private const string KeyStoreName = "AndroidKeyStore";
|
||||||
@@ -23,28 +24,28 @@ namespace Bit.Droid.Services
|
|||||||
|
|
||||||
private readonly KeyStore _keystore;
|
private readonly KeyStore _keystore;
|
||||||
|
|
||||||
public BiometricService()
|
public BiometricService(IStateService stateService)
|
||||||
{
|
{
|
||||||
|
_stateService = stateService;
|
||||||
_keystore = KeyStore.GetInstance(KeyStoreName);
|
_keystore = KeyStore.GetInstance(KeyStoreName);
|
||||||
_keystore.Load(null);
|
_keystore.Load(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<bool> SetupBiometricAsync(string bioIntegrityKey = null)
|
public async Task<bool> SetupBiometricAsync(string bioIntegritySrcKey = null)
|
||||||
{
|
{
|
||||||
// bioIntegrityKey used in iOS only
|
|
||||||
if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
|
if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
|
||||||
{
|
{
|
||||||
CreateKey();
|
await CreateKeyAsync(bioIntegritySrcKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.FromResult(true);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<bool> ValidateIntegrityAsync(string bioIntegrityKey = null)
|
public async Task<bool> IsSystemBiometricIntegrityValidAsync(string bioIntegritySrcKey = null)
|
||||||
{
|
{
|
||||||
if (Build.VERSION.SdkInt < BuildVersionCodes.M)
|
if (Build.VERSION.SdkInt < BuildVersionCodes.M)
|
||||||
{
|
{
|
||||||
return Task.FromResult(true);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -55,7 +56,7 @@ namespace Bit.Droid.Services
|
|||||||
|
|
||||||
if (key == null || cipher == null)
|
if (key == null || cipher == null)
|
||||||
{
|
{
|
||||||
return Task.FromResult(true);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
cipher.Init(CipherMode.EncryptMode, key);
|
cipher.Init(CipherMode.EncryptMode, key);
|
||||||
@@ -63,25 +64,32 @@ namespace Bit.Droid.Services
|
|||||||
catch (KeyPermanentlyInvalidatedException e)
|
catch (KeyPermanentlyInvalidatedException e)
|
||||||
{
|
{
|
||||||
// Biometric has changed
|
// Biometric has changed
|
||||||
return Task.FromResult(false);
|
await ClearStateAsync(bioIntegritySrcKey);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
catch (UnrecoverableKeyException e)
|
catch (UnrecoverableKeyException e)
|
||||||
{
|
{
|
||||||
// Biometric was disabled and re-enabled
|
// Biometric was disabled and re-enabled
|
||||||
return Task.FromResult(false);
|
await ClearStateAsync(bioIntegritySrcKey);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
catch (InvalidKeyException e)
|
catch (InvalidKeyException e)
|
||||||
{
|
{
|
||||||
// Fallback for old bitwarden users without a key
|
// Fallback for old bitwarden users without a key
|
||||||
LoggerHelper.LogEvenIfCantBeResolved(e);
|
LoggerHelper.LogEvenIfCantBeResolved(e);
|
||||||
CreateKey();
|
await CreateKeyAsync(bioIntegritySrcKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.FromResult(true);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CreateKey()
|
private async Task CreateKeyAsync(string bioIntegritySrcKey = null)
|
||||||
{
|
{
|
||||||
|
bioIntegritySrcKey ??= Core.Constants.BiometricIntegritySourceKey;
|
||||||
|
await _stateService.SetSystemBiometricIntegrityState(bioIntegritySrcKey,
|
||||||
|
await GetStateAsync(bioIntegritySrcKey));
|
||||||
|
await _stateService.SetAccountBiometricIntegrityValidAsync(bioIntegritySrcKey);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var keyGen = KeyGenerator.GetInstance(KeyAlgorithm, KeyStoreName);
|
var keyGen = KeyGenerator.GetInstance(KeyAlgorithm, KeyStoreName);
|
||||||
@@ -101,5 +109,16 @@ namespace Bit.Droid.Services
|
|||||||
LoggerHelper.LogEvenIfCantBeResolved(e);
|
LoggerHelper.LogEvenIfCantBeResolved(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<string> GetStateAsync(string bioIntegritySrcKey)
|
||||||
|
{
|
||||||
|
return await _stateService.GetSystemBiometricIntegrityState(bioIntegritySrcKey) ??
|
||||||
|
Guid.NewGuid().ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ClearStateAsync(string bioIntegritySrcKey)
|
||||||
|
{
|
||||||
|
await _stateService.SetSystemBiometricIntegrityState(bioIntegritySrcKey, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,12 +49,6 @@ namespace Bit.Droid.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsCopyNotificationHandledByPlatform()
|
|
||||||
{
|
|
||||||
// Android 13+ provides built-in notification when text is copied to the clipboard
|
|
||||||
return (int)Build.VERSION.SdkInt >= 33;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CopyToClipboard(string text, bool isSensitive = true)
|
private void CopyToClipboard(string text, bool isSensitive = true)
|
||||||
{
|
{
|
||||||
var clipboardManager = Application.Context.GetSystemService(Context.ClipboardService) as ClipboardManager;
|
var clipboardManager = Application.Context.GetSystemService(Context.ClipboardService) as ClipboardManager;
|
||||||
|
|||||||
@@ -502,11 +502,6 @@ namespace Bit.Droid.Services
|
|||||||
|
|
||||||
public async Task SetScreenCaptureAllowedAsync()
|
public async Task SetScreenCaptureAllowedAsync()
|
||||||
{
|
{
|
||||||
if (CoreHelpers.ForceScreenCaptureEnabled())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var activity = CrossCurrentActivity.Current?.Activity;
|
var activity = CrossCurrentActivity.Current?.Activity;
|
||||||
if (await _stateService.GetScreenCaptureAllowedAsync())
|
if (await _stateService.GetScreenCaptureAllowedAsync())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Bit.App.Services;
|
using Bit.App.Services;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.Core.Models;
|
|
||||||
|
|
||||||
namespace Bit.Droid.Services
|
namespace Bit.Droid.Services
|
||||||
{
|
{
|
||||||
@@ -22,7 +21,7 @@ namespace Bit.Droid.Services
|
|||||||
|
|
||||||
protected override bool CanSendData => false;
|
protected override bool CanSendData => false;
|
||||||
|
|
||||||
protected override Task SendDataToWatchAsync(WatchDTO watchDto) => throw new NotImplementedException();
|
protected override Task SendDataToWatchAsync(byte[] rawData) => throw new NotImplementedException();
|
||||||
|
|
||||||
protected override void ConnectToWatch() => throw new NotImplementedException();
|
protected override void ConnectToWatch() => throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ namespace Bit.App.Abstractions
|
|||||||
{
|
{
|
||||||
void Init(Func<AppOptions> getOptionsFunc, IAccountsManagerHost accountsManagerHost);
|
void Init(Func<AppOptions> getOptionsFunc, IAccountsManagerHost accountsManagerHost);
|
||||||
Task NavigateOnAccountChangeAsync(bool? isAuthed = null);
|
Task NavigateOnAccountChangeAsync(bool? isAuthed = null);
|
||||||
|
Task StartDefaultNavigationFlowAsync(Action<AppOptions> appOptionsAction);
|
||||||
Task LogOutAsync(string userId, bool userInitiated, bool expired);
|
Task LogOutAsync(string userId, bool userInitiated, bool expired);
|
||||||
Task PromptToSwitchToExistingAccountAsync(string userId);
|
Task PromptToSwitchToExistingAccountAsync(string userId);
|
||||||
}
|
}
|
||||||
|
|||||||
9
src/App/Abstractions/IDeepLinkContext.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Bit.App.Abstractions
|
||||||
|
{
|
||||||
|
public interface IDeepLinkContext
|
||||||
|
{
|
||||||
|
bool OnNewUri(Uri uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,13 +14,14 @@
|
|||||||
|
|
||||||
<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" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -436,6 +437,8 @@
|
|||||||
<None Remove="Utilities\AccountManagement\" />
|
<None Remove="Utilities\AccountManagement\" />
|
||||||
<None Remove="Controls\DateTime\" />
|
<None Remove="Controls\DateTime\" />
|
||||||
<None Remove="Controls\IconLabelButton\" />
|
<None Remove="Controls\IconLabelButton\" />
|
||||||
|
<None Remove="MessagePack" />
|
||||||
|
<None Remove="MessagePack.MSBuild.Tasks" />
|
||||||
<None Remove="Controls\PasswordStrengthProgressBar\" />
|
<None Remove="Controls\PasswordStrengthProgressBar\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -23,6 +23,11 @@ namespace Bit.App
|
|||||||
{
|
{
|
||||||
public partial class App : Application, IAccountsManagerHost
|
public partial class App : Application, IAccountsManagerHost
|
||||||
{
|
{
|
||||||
|
public const string POP_ALL_AND_GO_TO_TAB_GENERATOR_MESSAGE = "popAllAndGoToTabGenerator";
|
||||||
|
public const string POP_ALL_AND_GO_TO_TAB_MYVAULT_MESSAGE = "popAllAndGoToTabMyVault";
|
||||||
|
public const string POP_ALL_AND_GO_TO_TAB_SEND_MESSAGE = "popAllAndGoToTabSend";
|
||||||
|
public const string POP_ALL_AND_GO_TO_AUTOFILL_CIPHERS_MESSAGE = "popAllAndGoToAutofillCiphers";
|
||||||
|
|
||||||
private readonly IBroadcasterService _broadcasterService;
|
private readonly IBroadcasterService _broadcasterService;
|
||||||
private readonly IMessagingService _messagingService;
|
private readonly IMessagingService _messagingService;
|
||||||
private readonly IStateService _stateService;
|
private readonly IStateService _stateService;
|
||||||
@@ -33,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;
|
||||||
@@ -56,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);
|
||||||
|
|
||||||
@@ -103,12 +110,18 @@ namespace Bit.App
|
|||||||
await Task.Delay(1000);
|
await Task.Delay(1000);
|
||||||
await _accountsManager.NavigateOnAccountChangeAsync();
|
await _accountsManager.NavigateOnAccountChangeAsync();
|
||||||
}
|
}
|
||||||
else if (message.Command == "popAllAndGoToTabGenerator" ||
|
else if (message.Command == POP_ALL_AND_GO_TO_TAB_GENERATOR_MESSAGE ||
|
||||||
message.Command == "popAllAndGoToTabMyVault" ||
|
message.Command == POP_ALL_AND_GO_TO_TAB_MYVAULT_MESSAGE ||
|
||||||
message.Command == "popAllAndGoToTabSend" ||
|
message.Command == POP_ALL_AND_GO_TO_TAB_SEND_MESSAGE ||
|
||||||
message.Command == "popAllAndGoToAutofillCiphers")
|
message.Command == POP_ALL_AND_GO_TO_AUTOFILL_CIPHERS_MESSAGE ||
|
||||||
|
message.Command == DeepLinkContext.NEW_OTP_MESSAGE)
|
||||||
{
|
{
|
||||||
Device.BeginInvokeOnMainThread(async () =>
|
if (message.Command == DeepLinkContext.NEW_OTP_MESSAGE)
|
||||||
|
{
|
||||||
|
Options.OtpData = new OtpData((string)message.Data);
|
||||||
|
}
|
||||||
|
|
||||||
|
await Device.InvokeOnMainThreadAsync(async () =>
|
||||||
{
|
{
|
||||||
if (Current.MainPage is TabsPage tabsPage)
|
if (Current.MainPage is TabsPage tabsPage)
|
||||||
{
|
{
|
||||||
@@ -116,24 +129,29 @@ namespace Bit.App
|
|||||||
{
|
{
|
||||||
await tabsPage.Navigation.PopModalAsync(false);
|
await tabsPage.Navigation.PopModalAsync(false);
|
||||||
}
|
}
|
||||||
if (message.Command == "popAllAndGoToAutofillCiphers")
|
if (message.Command == POP_ALL_AND_GO_TO_AUTOFILL_CIPHERS_MESSAGE)
|
||||||
{
|
{
|
||||||
Current.MainPage = new NavigationPage(new AutofillCiphersPage(Options));
|
Current.MainPage = new NavigationPage(new CipherSelectionPage(Options));
|
||||||
}
|
}
|
||||||
else if (message.Command == "popAllAndGoToTabMyVault")
|
else if (message.Command == POP_ALL_AND_GO_TO_TAB_MYVAULT_MESSAGE)
|
||||||
{
|
{
|
||||||
Options.MyVaultTile = false;
|
Options.MyVaultTile = false;
|
||||||
tabsPage.ResetToVaultPage();
|
tabsPage.ResetToVaultPage();
|
||||||
}
|
}
|
||||||
else if (message.Command == "popAllAndGoToTabGenerator")
|
else if (message.Command == POP_ALL_AND_GO_TO_TAB_GENERATOR_MESSAGE)
|
||||||
{
|
{
|
||||||
Options.GeneratorTile = false;
|
Options.GeneratorTile = false;
|
||||||
tabsPage.ResetToGeneratorPage();
|
tabsPage.ResetToGeneratorPage();
|
||||||
}
|
}
|
||||||
else if (message.Command == "popAllAndGoToTabSend")
|
else if (message.Command == POP_ALL_AND_GO_TO_TAB_SEND_MESSAGE)
|
||||||
{
|
{
|
||||||
tabsPage.ResetToSendPage();
|
tabsPage.ResetToSendPage();
|
||||||
}
|
}
|
||||||
|
else if (message.Command == DeepLinkContext.NEW_OTP_MESSAGE)
|
||||||
|
{
|
||||||
|
tabsPage.ResetToVaultPage();
|
||||||
|
await tabsPage.Navigation.PushModalAsync(new NavigationPage(new CipherSelectionPage(Options)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -145,6 +163,18 @@ namespace Bit.App
|
|||||||
new NavigationPage(new RemoveMasterPasswordPage()));
|
new NavigationPage(new RemoveMasterPasswordPage()));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else if (message.Command == Constants.ForceUpdatePassword)
|
||||||
|
{
|
||||||
|
Device.BeginInvokeOnMainThread(async () =>
|
||||||
|
{
|
||||||
|
await Application.Current.MainPage.Navigation.PushModalAsync(
|
||||||
|
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)
|
||||||
@@ -201,7 +231,7 @@ namespace Bit.App
|
|||||||
Id = loginRequestData.Id,
|
Id = loginRequestData.Id,
|
||||||
IpAddress = loginRequestData.RequestIpAddress,
|
IpAddress = loginRequestData.RequestIpAddress,
|
||||||
Email = await _stateService.GetEmailAsync(),
|
Email = await _stateService.GetEmailAsync(),
|
||||||
FingerprintPhrase = loginRequestData.RequestFingerprint,
|
FingerprintPhrase = loginRequestData.FingerprintPhrase,
|
||||||
RequestDate = loginRequestData.CreationDate,
|
RequestDate = loginRequestData.CreationDate,
|
||||||
DeviceType = loginRequestData.RequestDeviceType,
|
DeviceType = loginRequestData.RequestDeviceType,
|
||||||
Origin = loginRequestData.Origin
|
Origin = loginRequestData.Origin
|
||||||
@@ -267,8 +297,10 @@ namespace Bit.App
|
|||||||
{
|
{
|
||||||
await _vaultTimeoutService.CheckVaultTimeoutAsync();
|
await _vaultTimeoutService.CheckVaultTimeoutAsync();
|
||||||
// Reset delay on every start
|
// Reset delay on every start
|
||||||
_vaultTimeoutService.DelayLockAndLogoutMs = null;
|
_vaultTimeoutService.DelayTimeoutMs = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await _configService.GetAsync();
|
||||||
_messagingService.Send("startEventTimer");
|
_messagingService.Send("startEventTimer");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -308,6 +340,7 @@ namespace Bit.App
|
|||||||
private async Task SleptAsync()
|
private async Task SleptAsync()
|
||||||
{
|
{
|
||||||
await _vaultTimeoutService.CheckVaultTimeoutAsync();
|
await _vaultTimeoutService.CheckVaultTimeoutAsync();
|
||||||
|
await ClearSensitiveFieldsAsync();
|
||||||
_messagingService.Send("stopEventTimer");
|
_messagingService.Send("stopEventTimer");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,6 +348,7 @@ namespace Bit.App
|
|||||||
{
|
{
|
||||||
await _stateService.CheckExtensionActiveUserAndSwitchIfNeededAsync();
|
await _stateService.CheckExtensionActiveUserAndSwitchIfNeededAsync();
|
||||||
await _vaultTimeoutService.CheckVaultTimeoutAsync();
|
await _vaultTimeoutService.CheckVaultTimeoutAsync();
|
||||||
|
await ClearSensitiveFieldsAsync();
|
||||||
_messagingService.Send("startEventTimer");
|
_messagingService.Send("startEventTimer");
|
||||||
await UpdateThemeAsync();
|
await UpdateThemeAsync();
|
||||||
await ClearCacheIfNeededAsync();
|
await ClearCacheIfNeededAsync();
|
||||||
@@ -335,6 +369,14 @@ namespace Bit.App
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task ClearSensitiveFieldsAsync()
|
||||||
|
{
|
||||||
|
await Device.InvokeOnMainThreadAsync(() =>
|
||||||
|
{
|
||||||
|
_messagingService.Send(Constants.ClearSensitiveFields);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private void SetCulture()
|
private void SetCulture()
|
||||||
{
|
{
|
||||||
// Calendars are removed by linker. ref https://bugzilla.xamarin.com/show_bug.cgi?id=59077
|
// Calendars are removed by linker. ref https://bugzilla.xamarin.com/show_bug.cgi?id=59077
|
||||||
@@ -484,7 +526,8 @@ namespace Bit.App
|
|||||||
Current.MainPage = new NavigationPage(new CipherAddEditPage(appOptions: Options));
|
Current.MainPage = new NavigationPage(new CipherAddEditPage(appOptions: Options));
|
||||||
break;
|
break;
|
||||||
case NavigationTarget.AutofillCiphers:
|
case NavigationTarget.AutofillCiphers:
|
||||||
Current.MainPage = new NavigationPage(new AutofillCiphersPage(Options));
|
case NavigationTarget.OtpCipherSelection:
|
||||||
|
Current.MainPage = new NavigationPage(new CipherSelectionPage(Options));
|
||||||
break;
|
break;
|
||||||
case NavigationTarget.SendAddEdit:
|
case NavigationTarget.SendAddEdit:
|
||||||
Current.MainPage = new NavigationPage(new SendAddEditPage(Options));
|
Current.MainPage = new NavigationPage(new SendAddEditPage(Options));
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Windows.Input;
|
||||||
using Bit.App.Abstractions;
|
using Bit.App.Abstractions;
|
||||||
using Bit.Core.Models.View;
|
using Bit.Core.Models.View;
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
@@ -18,7 +19,7 @@ namespace Bit.App.Controls
|
|||||||
nameof(WebsiteIconsEnabled), typeof(bool?), typeof(CipherViewCell));
|
nameof(WebsiteIconsEnabled), typeof(bool?), typeof(CipherViewCell));
|
||||||
|
|
||||||
public static readonly BindableProperty ButtonCommandProperty = BindableProperty.Create(
|
public static readonly BindableProperty ButtonCommandProperty = BindableProperty.Create(
|
||||||
nameof(ButtonCommand), typeof(Command<CipherView>), typeof(CipherViewCell));
|
nameof(ButtonCommand), typeof(ICommand), typeof(CipherViewCell));
|
||||||
|
|
||||||
public CipherViewCell()
|
public CipherViewCell()
|
||||||
{
|
{
|
||||||
@@ -42,9 +43,9 @@ namespace Bit.App.Controls
|
|||||||
set => SetValue(CipherProperty, value);
|
set => SetValue(CipherProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Command<CipherView> ButtonCommand
|
public ICommand ButtonCommand
|
||||||
{
|
{
|
||||||
get => GetValue(ButtonCommandProperty) as Command<CipherView>;
|
get => GetValue(ButtonCommandProperty) as ICommand;
|
||||||
set => SetValue(ButtonCommandProperty, value);
|
set => SetValue(ButtonCommandProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
|
using Bit.Core.Utilities;
|
||||||
|
|
||||||
namespace Bit.App.Models
|
namespace Bit.App.Models
|
||||||
{
|
{
|
||||||
@@ -23,6 +24,7 @@ namespace Bit.App.Models
|
|||||||
public Tuple<SendType, string, byte[], string> CreateSend { get; set; }
|
public Tuple<SendType, string, byte[], string> CreateSend { get; set; }
|
||||||
public bool CopyInsteadOfShareAfterSaving { get; set; }
|
public bool CopyInsteadOfShareAfterSaving { get; set; }
|
||||||
public bool HideAccountSwitcher { get; set; }
|
public bool HideAccountSwitcher { get; set; }
|
||||||
|
public OtpData? OtpData { get; set; }
|
||||||
|
|
||||||
public void SetAllFrom(AppOptions o)
|
public void SetAllFrom(AppOptions o)
|
||||||
{
|
{
|
||||||
@@ -48,6 +50,7 @@ namespace Bit.App.Models
|
|||||||
CreateSend = o.CreateSend;
|
CreateSend = o.CreateSend;
|
||||||
CopyInsteadOfShareAfterSaving = o.CopyInsteadOfShareAfterSaving;
|
CopyInsteadOfShareAfterSaving = o.CopyInsteadOfShareAfterSaving;
|
||||||
HideAccountSwitcher = o.HideAccountSwitcher;
|
HideAccountSwitcher = o.HideAccountSwitcher;
|
||||||
|
OtpData = o.OtpData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Text;
|
||||||
using System.Text;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Bit.App.Abstractions;
|
using Bit.App.Abstractions;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
using Bit.App.Utilities;
|
|
||||||
using Bit.Core;
|
using Bit.Core;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.Core.Models.Domain;
|
using Bit.Core.Models.Domain;
|
||||||
@@ -73,13 +70,13 @@ namespace Bit.App.Pages
|
|||||||
set => SetProperty(ref _policy, value);
|
set => SetProperty(ref _policy, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ShowPasswordIcon => ShowPassword ? "" : "";
|
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 MasterPassword { get; set; }
|
public string MasterPassword { get; set; }
|
||||||
public string ConfirmMasterPassword { get; set; }
|
public string ConfirmMasterPassword { get; set; }
|
||||||
public string Hint { get; set; }
|
public string Hint { get; set; }
|
||||||
|
|
||||||
public async Task InitAsync(bool forceSync = false)
|
public virtual async Task InitAsync(bool forceSync = false)
|
||||||
{
|
{
|
||||||
if (forceSync)
|
if (forceSync)
|
||||||
{
|
{
|
||||||
@@ -162,7 +159,7 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
if (MasterPassword.Length < Constants.MasterPasswordMinimumChars)
|
if (MasterPassword.Length < Constants.MasterPasswordMinimumChars)
|
||||||
{
|
{
|
||||||
await _platformUtilsService.ShowDialogAsync(AppResources.MasterPasswordLengthValMessage,
|
await _platformUtilsService.ShowDialogAsync(string.Format(AppResources.MasterPasswordLengthValMessageX, Constants.MasterPasswordMinimumChars),
|
||||||
AppResources.MasterPasswordPolicyValidationTitle, AppResources.Ok);
|
AppResources.MasterPasswordPolicyValidationTitle, AppResources.Ok);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -25,10 +25,6 @@
|
|||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Account}" />
|
AutomationProperties.Name="{u:I18n Account}" />
|
||||||
<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>
|
||||||
@@ -66,7 +62,27 @@
|
|||||||
</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"/>
|
||||||
|
</StackLayout>
|
||||||
|
<StackLayout
|
||||||
|
Orientation="Horizontal"
|
||||||
|
Margin="0, 20, 0 ,0">
|
||||||
<StackLayout.GestureRecognizers>
|
<StackLayout.GestureRecognizers>
|
||||||
<TapGestureRecognizer
|
<TapGestureRecognizer
|
||||||
Command="{Binding RememberEmailCommand}" />
|
Command="{Binding RememberEmailCommand}" />
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,7 +137,7 @@
|
|||||||
</StackLayout>
|
</StackLayout>
|
||||||
<StackLayout Padding="10, 0">
|
<StackLayout Padding="10, 0">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n BiometricInvalidated}"
|
Text="{u:I18n AccountBiometricInvalidated}"
|
||||||
StyleClass="box-footer-label,text-danger,text-bold"
|
StyleClass="box-footer-label,text-danger,text-bold"
|
||||||
IsVisible="{Binding BiometricIntegrityValid, Converter={StaticResource inverseBool}}" />
|
IsVisible="{Binding BiometricIntegrityValid, Converter={StaticResource inverseBool}}" />
|
||||||
<Button Text="{Binding BiometricButtonText}" Clicked="Biometric_Clicked"
|
<Button Text="{Binding BiometricButtonText}" Clicked="Biometric_Clicked"
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ using System.Threading.Tasks;
|
|||||||
using Bit.App.Models;
|
using Bit.App.Models;
|
||||||
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.Utilities;
|
using Bit.Core.Utilities;
|
||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
|
|
||||||
@@ -10,6 +12,7 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
public partial class LockPage : BaseContentPage
|
public partial class LockPage : BaseContentPage
|
||||||
{
|
{
|
||||||
|
private readonly IBroadcasterService _broadcasterService;
|
||||||
private readonly AppOptions _appOptions;
|
private readonly AppOptions _appOptions;
|
||||||
private readonly bool _autoPromptBiometric;
|
private readonly bool _autoPromptBiometric;
|
||||||
private readonly LockPageViewModel _vm;
|
private readonly LockPageViewModel _vm;
|
||||||
@@ -22,6 +25,7 @@ namespace Bit.App.Pages
|
|||||||
_appOptions = appOptions;
|
_appOptions = appOptions;
|
||||||
_autoPromptBiometric = autoPromptBiometric;
|
_autoPromptBiometric = autoPromptBiometric;
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>();
|
||||||
_vm = BindingContext as LockPageViewModel;
|
_vm = BindingContext as LockPageViewModel;
|
||||||
_vm.Page = this;
|
_vm.Page = this;
|
||||||
_vm.UnlockedAction = () => Device.BeginInvokeOnMainThread(async () => await UnlockedAsync());
|
_vm.UnlockedAction = () => Device.BeginInvokeOnMainThread(async () => await UnlockedAsync());
|
||||||
@@ -64,6 +68,13 @@ namespace Bit.App.Pages
|
|||||||
protected override async void OnAppearing()
|
protected override async void OnAppearing()
|
||||||
{
|
{
|
||||||
base.OnAppearing();
|
base.OnAppearing();
|
||||||
|
_broadcasterService.Subscribe(nameof(LockPage), message =>
|
||||||
|
{
|
||||||
|
if (message.Command == Constants.ClearSensitiveFields)
|
||||||
|
{
|
||||||
|
Device.BeginInvokeOnMainThread(_vm.ResetPinPasswordFields);
|
||||||
|
}
|
||||||
|
});
|
||||||
if (_appeared)
|
if (_appeared)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -129,6 +140,7 @@ namespace Bit.App.Pages
|
|||||||
base.OnDisappearing();
|
base.OnDisappearing();
|
||||||
|
|
||||||
_accountAvatar?.OnDisappearing();
|
_accountAvatar?.OnDisappearing();
|
||||||
|
_broadcasterService.Unsubscribe(nameof(LockPage));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Unlock_Clicked(object sender, EventArgs e)
|
private void Unlock_Clicked(object sender, EventArgs e)
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using Bit.Core.Abstractions;
|
|||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Domain;
|
using Bit.Core.Models.Domain;
|
||||||
using Bit.Core.Models.Request;
|
using Bit.Core.Models.Request;
|
||||||
|
using Bit.Core.Services;
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
using Xamarin.CommunityToolkit.Helpers;
|
using Xamarin.CommunityToolkit.Helpers;
|
||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
@@ -30,8 +31,12 @@ namespace Bit.App.Pages
|
|||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly IWatchDeviceService _watchDeviceService;
|
private readonly IWatchDeviceService _watchDeviceService;
|
||||||
private readonly WeakEventManager<int?> _secretEntryFocusWeakEventManager = new WeakEventManager<int?>();
|
private readonly WeakEventManager<int?> _secretEntryFocusWeakEventManager = new WeakEventManager<int?>();
|
||||||
|
private readonly IPolicyService _policyService;
|
||||||
|
private readonly IPasswordGenerationService _passwordGenerationService;
|
||||||
|
|
||||||
private string _email;
|
private string _email;
|
||||||
|
private string _masterPassword;
|
||||||
|
private string _pin;
|
||||||
private bool _showPassword;
|
private bool _showPassword;
|
||||||
private bool _pinLock;
|
private bool _pinLock;
|
||||||
private bool _biometricLock;
|
private bool _biometricLock;
|
||||||
@@ -58,6 +63,8 @@ namespace Bit.App.Pages
|
|||||||
_keyConnectorService = ServiceContainer.Resolve<IKeyConnectorService>("keyConnectorService");
|
_keyConnectorService = ServiceContainer.Resolve<IKeyConnectorService>("keyConnectorService");
|
||||||
_logger = ServiceContainer.Resolve<ILogger>("logger");
|
_logger = ServiceContainer.Resolve<ILogger>("logger");
|
||||||
_watchDeviceService = ServiceContainer.Resolve<IWatchDeviceService>();
|
_watchDeviceService = ServiceContainer.Resolve<IWatchDeviceService>();
|
||||||
|
_policyService = ServiceContainer.Resolve<IPolicyService>();
|
||||||
|
_passwordGenerationService = ServiceContainer.Resolve<IPasswordGenerationService>();
|
||||||
|
|
||||||
PageTitle = AppResources.VerifyMasterPassword;
|
PageTitle = AppResources.VerifyMasterPassword;
|
||||||
TogglePasswordCommand = new Command(TogglePassword);
|
TogglePasswordCommand = new Command(TogglePassword);
|
||||||
@@ -70,6 +77,18 @@ namespace Bit.App.Pages
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string MasterPassword
|
||||||
|
{
|
||||||
|
get => _masterPassword;
|
||||||
|
set => SetProperty(ref _masterPassword, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Pin
|
||||||
|
{
|
||||||
|
get => _pin;
|
||||||
|
set => SetProperty(ref _pin, value);
|
||||||
|
}
|
||||||
|
|
||||||
public bool ShowPassword
|
public bool ShowPassword
|
||||||
{
|
{
|
||||||
get => _showPassword;
|
get => _showPassword;
|
||||||
@@ -134,8 +153,6 @@ namespace Bit.App.Pages
|
|||||||
public Command TogglePasswordCommand { get; }
|
public Command TogglePasswordCommand { 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 MasterPassword { get; set; }
|
|
||||||
public string Pin { get; set; }
|
|
||||||
public Action UnlockedAction { get; set; }
|
public Action UnlockedAction { get; set; }
|
||||||
public event Action<int?> FocusSecretEntry
|
public event Action<int?> FocusSecretEntry
|
||||||
{
|
{
|
||||||
@@ -192,7 +209,7 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
if (BiometricLock)
|
if (BiometricLock)
|
||||||
{
|
{
|
||||||
BiometricIntegrityValid = await _biometricService.ValidateIntegrityAsync();
|
BiometricIntegrityValid = await _platformUtilsService.IsBiometricIntegrityValidAsync();
|
||||||
if (!_biometricIntegrityValid)
|
if (!_biometricIntegrityValid)
|
||||||
{
|
{
|
||||||
BiometricButtonVisible = false;
|
BiometricButtonVisible = false;
|
||||||
@@ -281,6 +298,7 @@ namespace Bit.App.Pages
|
|||||||
var key = await _cryptoService.MakeKeyAsync(MasterPassword, _email, kdfConfig);
|
var key = await _cryptoService.MakeKeyAsync(MasterPassword, _email, kdfConfig);
|
||||||
var storedKeyHash = await _cryptoService.GetKeyHashAsync();
|
var storedKeyHash = await _cryptoService.GetKeyHashAsync();
|
||||||
var passwordValid = false;
|
var passwordValid = false;
|
||||||
|
MasterPasswordPolicyOptions enforcedMasterPasswordOptions = null;
|
||||||
|
|
||||||
if (storedKeyHash != null)
|
if (storedKeyHash != null)
|
||||||
{
|
{
|
||||||
@@ -292,9 +310,11 @@ namespace Bit.App.Pages
|
|||||||
var keyHash = await _cryptoService.HashPasswordAsync(MasterPassword, key, HashPurpose.ServerAuthorization);
|
var keyHash = await _cryptoService.HashPasswordAsync(MasterPassword, key, HashPurpose.ServerAuthorization);
|
||||||
var request = new PasswordVerificationRequest();
|
var request = new PasswordVerificationRequest();
|
||||||
request.MasterPasswordHash = keyHash;
|
request.MasterPasswordHash = keyHash;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _apiService.PostAccountVerifyPasswordAsync(request);
|
var response = await _apiService.PostAccountVerifyPasswordAsync(request);
|
||||||
|
enforcedMasterPasswordOptions = response.MasterPasswordPolicy;
|
||||||
passwordValid = true;
|
passwordValid = true;
|
||||||
var localKeyHash = await _cryptoService.HashPasswordAsync(MasterPassword, key, HashPurpose.LocalAuthorization);
|
var localKeyHash = await _cryptoService.HashPasswordAsync(MasterPassword, key, HashPurpose.LocalAuthorization);
|
||||||
await _cryptoService.SetKeyHashAsync(localKeyHash);
|
await _cryptoService.SetKeyHashAsync(localKeyHash);
|
||||||
@@ -315,6 +335,14 @@ namespace Bit.App.Pages
|
|||||||
var pinKey = await _cryptoService.MakePinKeyAysnc(decPin, _email, kdfConfig);
|
var pinKey = await _cryptoService.MakePinKeyAysnc(decPin, _email, kdfConfig);
|
||||||
await _stateService.SetPinProtectedKeyAsync(await _cryptoService.EncryptAsync(key.Key, pinKey));
|
await _stateService.SetPinProtectedKeyAsync(await _cryptoService.EncryptAsync(key.Key, pinKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (await RequirePasswordChangeAsync(enforcedMasterPasswordOptions))
|
||||||
|
{
|
||||||
|
// Save the ForcePasswordResetReason to force a password reset after unlock
|
||||||
|
await _stateService.SetForcePasswordResetReasonAsync(
|
||||||
|
ForcePasswordResetReason.WeakMasterPasswordOnLogin);
|
||||||
|
}
|
||||||
|
|
||||||
MasterPassword = string.Empty;
|
MasterPassword = string.Empty;
|
||||||
await AppHelpers.ResetInvalidUnlockAttemptsAsync();
|
await AppHelpers.ResetInvalidUnlockAttemptsAsync();
|
||||||
await SetKeyAndContinueAsync(key);
|
await SetKeyAndContinueAsync(key);
|
||||||
@@ -339,6 +367,37 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks if the master password requires updating to meet the enforced policy requirements
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="options"></param>
|
||||||
|
private async Task<bool> RequirePasswordChangeAsync(MasterPasswordPolicyOptions options = null)
|
||||||
|
{
|
||||||
|
// If no policy options are provided, attempt to load them from the policy service
|
||||||
|
var enforcedOptions = options ?? await _policyService.GetMasterPasswordPolicyOptions();
|
||||||
|
|
||||||
|
// No policy to enforce on login/unlock
|
||||||
|
if (!(enforcedOptions is { EnforceOnLogin: true }))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var strength = _passwordGenerationService.PasswordStrength(
|
||||||
|
MasterPassword, _passwordGenerationService.GetPasswordStrengthUserInput(_email))?.Score;
|
||||||
|
|
||||||
|
if (!strength.HasValue)
|
||||||
|
{
|
||||||
|
_logger.Error("Unable to evaluate master password strength during unlock");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !await _policyService.EvaluateMasterPassword(
|
||||||
|
strength.Value,
|
||||||
|
MasterPassword,
|
||||||
|
enforcedOptions
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public async Task LogOutAsync()
|
public async Task LogOutAsync()
|
||||||
{
|
{
|
||||||
var confirmed = await _platformUtilsService.ShowDialogAsync(AppResources.LogoutConfirmation,
|
var confirmed = await _platformUtilsService.ShowDialogAsync(AppResources.LogoutConfirmation,
|
||||||
@@ -349,6 +408,20 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ResetPinPasswordFields()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
MasterPassword = string.Empty;
|
||||||
|
Pin = string.Empty;
|
||||||
|
ShowPassword = false;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LoggerHelper.LogEvenIfCantBeResolved(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void TogglePassword()
|
public void TogglePassword()
|
||||||
{
|
{
|
||||||
ShowPassword = !ShowPassword;
|
ShowPassword = !ShowPassword;
|
||||||
@@ -358,7 +431,8 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
public async Task PromptBiometricAsync()
|
public async Task PromptBiometricAsync()
|
||||||
{
|
{
|
||||||
BiometricIntegrityValid = await _biometricService.ValidateIntegrityAsync();
|
BiometricIntegrityValid = await _platformUtilsService.IsBiometricIntegrityValidAsync();
|
||||||
|
BiometricButtonVisible = BiometricIntegrityValid;
|
||||||
if (!BiometricLock || !BiometricIntegrityValid)
|
if (!BiometricLock || !BiometricIntegrityValid)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Bit.App.Models;
|
using Bit.App.Models;
|
||||||
using Bit.App.Utilities;
|
using Bit.App.Utilities;
|
||||||
|
using Bit.Core;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.Core.Services;
|
using Bit.Core.Services;
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
@@ -12,6 +13,7 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
public partial class LoginPage : BaseContentPage
|
public partial class LoginPage : BaseContentPage
|
||||||
{
|
{
|
||||||
|
private readonly IBroadcasterService _broadcasterService;
|
||||||
private readonly LoginPageViewModel _vm;
|
private readonly LoginPageViewModel _vm;
|
||||||
private readonly AppOptions _appOptions;
|
private readonly AppOptions _appOptions;
|
||||||
|
|
||||||
@@ -23,6 +25,7 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
_appOptions = appOptions;
|
_appOptions = appOptions;
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>();
|
||||||
_vm = BindingContext as LoginPageViewModel;
|
_vm = BindingContext as LoginPageViewModel;
|
||||||
_vm.Page = this;
|
_vm.Page = this;
|
||||||
_vm.StartTwoFactorAction = () => Device.BeginInvokeOnMainThread(async () => await StartTwoFactorAsync());
|
_vm.StartTwoFactorAction = () => Device.BeginInvokeOnMainThread(async () => await StartTwoFactorAsync());
|
||||||
@@ -70,6 +73,13 @@ namespace Bit.App.Pages
|
|||||||
protected override async void OnAppearing()
|
protected override async void OnAppearing()
|
||||||
{
|
{
|
||||||
base.OnAppearing();
|
base.OnAppearing();
|
||||||
|
_broadcasterService.Subscribe(nameof(LoginPage), message =>
|
||||||
|
{
|
||||||
|
if (message.Command == Constants.ClearSensitiveFields)
|
||||||
|
{
|
||||||
|
Device.BeginInvokeOnMainThread(_vm.ResetPasswordField);
|
||||||
|
}
|
||||||
|
});
|
||||||
_mainContent.Content = _mainLayout;
|
_mainContent.Content = _mainLayout;
|
||||||
_accountAvatar?.OnAppearing();
|
_accountAvatar?.OnAppearing();
|
||||||
|
|
||||||
@@ -104,6 +114,7 @@ namespace Bit.App.Pages
|
|||||||
base.OnDisappearing();
|
base.OnDisappearing();
|
||||||
|
|
||||||
_accountAvatar?.OnDisappearing();
|
_accountAvatar?.OnDisappearing();
|
||||||
|
_broadcasterService.Unsubscribe(nameof(LoginPage));
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void LogIn_Clicked(object sender, EventArgs e)
|
private async void LogIn_Clicked(object sender, EventArgs e)
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ namespace Bit.App.Pages
|
|||||||
private string _masterPassword;
|
private string _masterPassword;
|
||||||
private bool _isEmailEnabled;
|
private bool _isEmailEnabled;
|
||||||
private bool _isKnownDevice;
|
private bool _isKnownDevice;
|
||||||
|
private bool _isExecutingLogin;
|
||||||
|
private string _environmentHostName;
|
||||||
|
|
||||||
public LoginPageViewModel()
|
public LoginPageViewModel()
|
||||||
{
|
{
|
||||||
@@ -114,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; }
|
||||||
@@ -121,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; }
|
||||||
@@ -143,20 +155,28 @@ namespace Bit.App.Pages
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _deviceActionService.ShowLoadingAsync(AppResources.Loading);
|
await _deviceActionService.ShowLoadingAsync(AppResources.Loading);
|
||||||
|
await _stateService.SetPreLoginEmailAsync(Email);
|
||||||
await AccountSwitchingOverlayViewModel.RefreshAccountViewsAsync();
|
await AccountSwitchingOverlayViewModel.RefreshAccountViewsAsync();
|
||||||
if (string.IsNullOrWhiteSpace(Email))
|
if (string.IsNullOrWhiteSpace(Email))
|
||||||
{
|
{
|
||||||
Email = await _stateService.GetRememberedEmailAsync();
|
Email = await _stateService.GetRememberedEmailAsync();
|
||||||
}
|
}
|
||||||
var deviceIdentifier = await _appIdService.GetAppIdAsync();
|
|
||||||
IsKnownDevice = await _apiService.GetKnownDeviceAsync(Email, deviceIdentifier);
|
|
||||||
CanRemoveAccount = await _stateService.GetActiveUserEmailAsync() != Email;
|
CanRemoveAccount = await _stateService.GetActiveUserEmailAsync() != Email;
|
||||||
await _deviceActionService.HideLoadingAsync();
|
EnvironmentDomainName = CoreHelpers.GetDomain((await _stateService.GetPreAuthEnvironmentUrlsAsync())?.Base);
|
||||||
|
IsKnownDevice = await _apiService.GetKnownDeviceAsync(Email, await _appIdService.GetAppIdAsync());
|
||||||
|
}
|
||||||
|
catch (ApiException apiEx) when (apiEx.Error.StatusCode == System.Net.HttpStatusCode.Unauthorized)
|
||||||
|
{
|
||||||
|
_logger.Exception(apiEx);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
HandleException(ex);
|
HandleException(ex);
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await _deviceActionService.HideLoadingAsync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task LogInAsync(bool showLoading = true, bool checkForExistingAccount = false)
|
public async Task LogInAsync(bool showLoading = true, bool checkForExistingAccount = false)
|
||||||
@@ -191,6 +211,7 @@ namespace Bit.App.Pages
|
|||||||
ShowPassword = false;
|
ShowPassword = false;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
_isExecutingLogin = true;
|
||||||
if (checkForExistingAccount)
|
if (checkForExistingAccount)
|
||||||
{
|
{
|
||||||
var userId = await _stateService.GetUserIdAsync(Email);
|
var userId = await _stateService.GetUserIdAsync(Email);
|
||||||
@@ -252,6 +273,26 @@ namespace Bit.App.Pages
|
|||||||
AppResources.AnErrorHasOccurred, AppResources.Ok);
|
AppResources.AnErrorHasOccurred, AppResources.Ok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_isExecutingLogin = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ResetPasswordField()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!_isExecutingLogin)
|
||||||
|
{
|
||||||
|
MasterPassword = string.Empty;
|
||||||
|
ShowPassword = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LoggerHelper.LogEvenIfCantBeResolved(ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task MoreAsync()
|
private async Task MoreAsync()
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ namespace Bit.App.Pages
|
|||||||
var response = await _authService.PasswordlessCreateLoginRequestAsync(_email);
|
var response = await _authService.PasswordlessCreateLoginRequestAsync(_email);
|
||||||
if (response != null)
|
if (response != null)
|
||||||
{
|
{
|
||||||
FingerprintPhrase = response.RequestFingerprint;
|
FingerprintPhrase = response.FingerprintPhrase;
|
||||||
_requestId = response.Id;
|
_requestId = response.Id;
|
||||||
_requestAccessCode = response.RequestAccessCode;
|
_requestAccessCode = response.RequestAccessCode;
|
||||||
_requestKeyPair = response.RequestKeyPair;
|
_requestKeyPair = response.RequestKeyPair;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Net;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using Bit.App.Abstractions;
|
using Bit.App.Abstractions;
|
||||||
@@ -27,6 +28,7 @@ namespace Bit.App.Pages
|
|||||||
private readonly IPlatformUtilsService _platformUtilsService;
|
private readonly IPlatformUtilsService _platformUtilsService;
|
||||||
private readonly IStateService _stateService;
|
private readonly IStateService _stateService;
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
private readonly IOrganizationService _organizationService;
|
||||||
|
|
||||||
private string _orgIdentifier;
|
private string _orgIdentifier;
|
||||||
|
|
||||||
@@ -42,6 +44,7 @@ namespace Bit.App.Pages
|
|||||||
_platformUtilsService = ServiceContainer.Resolve<IPlatformUtilsService>("platformUtilsService");
|
_platformUtilsService = ServiceContainer.Resolve<IPlatformUtilsService>("platformUtilsService");
|
||||||
_stateService = ServiceContainer.Resolve<IStateService>("stateService");
|
_stateService = ServiceContainer.Resolve<IStateService>("stateService");
|
||||||
_logger = ServiceContainer.Resolve<ILogger>("logger");
|
_logger = ServiceContainer.Resolve<ILogger>("logger");
|
||||||
|
_organizationService = ServiceContainer.Resolve<IOrganizationService>();
|
||||||
|
|
||||||
|
|
||||||
PageTitle = AppResources.Bitwarden;
|
PageTitle = AppResources.Bitwarden;
|
||||||
@@ -63,11 +66,27 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
public async Task InitAsync()
|
public async Task InitAsync()
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (await TryClaimedDomainLogin())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(OrgIdentifier))
|
if (string.IsNullOrWhiteSpace(OrgIdentifier))
|
||||||
{
|
{
|
||||||
OrgIdentifier = await _stateService.GetRememberedOrgIdentifierAsync();
|
OrgIdentifier = await _stateService.GetRememberedOrgIdentifierAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.Exception(ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await _deviceActionService.HideLoadingAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task LogInAsync()
|
public async Task LogInAsync()
|
||||||
{
|
{
|
||||||
@@ -102,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);
|
||||||
@@ -207,5 +225,37 @@ namespace Bit.App.Pages
|
|||||||
AppResources.AnErrorHasOccurred);
|
AppResources.AnErrorHasOccurred);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<bool> TryClaimedDomainLogin()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await _deviceActionService.ShowLoadingAsync(AppResources.Loading);
|
||||||
|
var userEmail = await _stateService.GetPreLoginEmailAsync();
|
||||||
|
var claimedDomainOrgDetails = await _organizationService.GetClaimedOrganizationDomainAsync(userEmail);
|
||||||
|
await _deviceActionService.HideLoadingAsync();
|
||||||
|
|
||||||
|
if (claimedDomainOrgDetails == null || !claimedDomainOrgDetails.SsoAvailable)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(claimedDomainOrgDetails.OrganizationIdentifier))
|
||||||
|
{
|
||||||
|
await _platformUtilsService.ShowDialogAsync(AppResources.OrganizationSsoIdentifierRequired, AppResources.AnErrorHasOccurred);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
OrgIdentifier = claimedDomainOrgDetails.OrganizationIdentifier;
|
||||||
|
await LogInAsync();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
HandleException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
if (MasterPassword.Length < Constants.MasterPasswordMinimumChars)
|
if (MasterPassword.Length < Constants.MasterPasswordMinimumChars)
|
||||||
{
|
{
|
||||||
await _platformUtilsService.ShowDialogAsync(AppResources.MasterPasswordLengthValMessage,
|
await _platformUtilsService.ShowDialogAsync(string.Format(AppResources.MasterPasswordLengthValMessageX, Constants.MasterPasswordMinimumChars),
|
||||||
AppResources.AnErrorHasOccurred, AppResources.Ok);
|
AppResources.AnErrorHasOccurred, AppResources.Ok);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ namespace Bit.App.Pages
|
|||||||
if (MasterPassword.Length < Constants.MasterPasswordMinimumChars)
|
if (MasterPassword.Length < Constants.MasterPasswordMinimumChars)
|
||||||
{
|
{
|
||||||
await Page.DisplayAlert(AppResources.MasterPasswordPolicyValidationTitle,
|
await Page.DisplayAlert(AppResources.MasterPasswordPolicyValidationTitle,
|
||||||
AppResources.MasterPasswordLengthValMessage, AppResources.Ok);
|
string.Format(AppResources.MasterPasswordLengthValMessageX, Constants.MasterPasswordMinimumChars), AppResources.Ok);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
BackgroundColor="Transparent"
|
BackgroundColor="Transparent"
|
||||||
BorderColor="{DynamicResource PrimaryColor}">
|
BorderColor="{DynamicResource PrimaryColor}">
|
||||||
<Label
|
<Label
|
||||||
Text="{u:I18n UpdateMasterPasswordWarning}"
|
Text="{Binding UpdateMasterPasswordWarningText }"
|
||||||
StyleClass="text-muted, text-sm, text-bold"
|
StyleClass="text-muted, text-sm, text-bold"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center" />
|
||||||
</Frame>
|
</Frame>
|
||||||
@@ -74,6 +74,40 @@
|
|||||||
HorizontalTextAlignment="Start" />
|
HorizontalTextAlignment="Start" />
|
||||||
</Frame>
|
</Frame>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
<Grid StyleClass="box-row" IsVisible="{Binding RequireCurrentPassword }">
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="*" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n CurrentMasterPassword}"
|
||||||
|
StyleClass="box-label"
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="0" />
|
||||||
|
<controls:MonoEntry
|
||||||
|
x:Name="_currentMasterPassword"
|
||||||
|
Text="{Binding CurrentMasterPassword}"
|
||||||
|
StyleClass="box-value"
|
||||||
|
IsSpellCheckEnabled="False"
|
||||||
|
IsTextPredictionEnabled="False"
|
||||||
|
IsPassword="{Binding ShowPassword, Converter={StaticResource inverseBool}}"
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="0" />
|
||||||
|
<controls:IconButton
|
||||||
|
StyleClass="box-row-button, box-row-button-platform"
|
||||||
|
Text="{Binding ShowPasswordIcon}"
|
||||||
|
Command="{Binding TogglePasswordCommand}"
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="1"
|
||||||
|
Grid.RowSpan="2"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n ToggleVisibility}"
|
||||||
|
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}" />
|
||||||
|
</Grid>
|
||||||
<Grid StyleClass="box-row">
|
<Grid StyleClass="box-row">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
|
|||||||
@@ -1,27 +1,68 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
|
using Bit.Core.Abstractions;
|
||||||
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Exceptions;
|
using Bit.Core.Exceptions;
|
||||||
|
using Bit.Core.Models.Domain;
|
||||||
using Bit.Core.Models.Request;
|
using Bit.Core.Models.Request;
|
||||||
|
using Bit.Core.Utilities;
|
||||||
|
using Xamarin.CommunityToolkit.ObjectModel;
|
||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
|
|
||||||
namespace Bit.App.Pages
|
namespace Bit.App.Pages
|
||||||
{
|
{
|
||||||
public class UpdateTempPasswordPageViewModel : BaseChangePasswordViewModel
|
public class UpdateTempPasswordPageViewModel : BaseChangePasswordViewModel
|
||||||
{
|
{
|
||||||
|
private readonly IUserVerificationService _userVerificationService;
|
||||||
|
|
||||||
|
private ForcePasswordResetReason _reason = ForcePasswordResetReason.AdminForcePasswordReset;
|
||||||
|
|
||||||
public UpdateTempPasswordPageViewModel()
|
public UpdateTempPasswordPageViewModel()
|
||||||
{
|
{
|
||||||
PageTitle = AppResources.UpdateMasterPassword;
|
PageTitle = AppResources.UpdateMasterPassword;
|
||||||
TogglePasswordCommand = new Command(TogglePassword);
|
TogglePasswordCommand = new Command(TogglePassword);
|
||||||
ToggleConfirmPasswordCommand = new Command(ToggleConfirmPassword);
|
ToggleConfirmPasswordCommand = new Command(ToggleConfirmPassword);
|
||||||
SubmitCommand = new Command(async () => await SubmitAsync());
|
SubmitCommand = new AsyncCommand(SubmitAsync,
|
||||||
|
onException: ex => HandleException(ex),
|
||||||
|
allowsMultipleExecutions: false);
|
||||||
|
|
||||||
|
_userVerificationService = ServiceContainer.Resolve<IUserVerificationService>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Command SubmitCommand { get; }
|
public AsyncCommand SubmitCommand { get; }
|
||||||
public Command TogglePasswordCommand { get; }
|
public Command TogglePasswordCommand { get; }
|
||||||
public Command ToggleConfirmPasswordCommand { get; }
|
public Command ToggleConfirmPasswordCommand { get; }
|
||||||
public Action UpdateTempPasswordSuccessAction { get; set; }
|
public Action UpdateTempPasswordSuccessAction { get; set; }
|
||||||
public Action LogOutAction { get; set; }
|
public Action LogOutAction { get; set; }
|
||||||
|
public string CurrentMasterPassword { get; set; }
|
||||||
|
|
||||||
|
public override async Task InitAsync(bool forceSync = false)
|
||||||
|
{
|
||||||
|
await base.InitAsync(forceSync);
|
||||||
|
|
||||||
|
var forcePasswordResetReason = await _stateService.GetForcePasswordResetReasonAsync();
|
||||||
|
|
||||||
|
if (forcePasswordResetReason.HasValue)
|
||||||
|
{
|
||||||
|
_reason = forcePasswordResetReason.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool RequireCurrentPassword
|
||||||
|
{
|
||||||
|
get => _reason == ForcePasswordResetReason.WeakMasterPasswordOnLogin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string UpdateMasterPasswordWarningText
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _reason == ForcePasswordResetReason.WeakMasterPasswordOnLogin
|
||||||
|
? AppResources.UpdateWeakMasterPasswordWarning
|
||||||
|
: AppResources.UpdateMasterPasswordWarning;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void TogglePassword()
|
public void TogglePassword()
|
||||||
{
|
{
|
||||||
@@ -42,6 +83,12 @@ namespace Bit.App.Pages
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (RequireCurrentPassword &&
|
||||||
|
!await _userVerificationService.VerifyUser(CurrentMasterPassword, VerificationType.MasterPassword))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve details for key generation
|
// Retrieve details for key generation
|
||||||
var kdfConfig = await _stateService.GetActiveUserCustomDataAsync(a => new KdfConfig(a?.Profile));
|
var kdfConfig = await _stateService.GetActiveUserCustomDataAsync(a => new KdfConfig(a?.Profile));
|
||||||
var email = await _stateService.GetEmailAsync();
|
var email = await _stateService.GetEmailAsync();
|
||||||
@@ -53,21 +100,29 @@ namespace Bit.App.Pages
|
|||||||
// Create new encKey for the User
|
// Create new encKey for the User
|
||||||
var newEncKey = await _cryptoService.RemakeEncKeyAsync(key);
|
var newEncKey = await _cryptoService.RemakeEncKeyAsync(key);
|
||||||
|
|
||||||
// Create request
|
|
||||||
var request = new UpdateTempPasswordRequest
|
|
||||||
{
|
|
||||||
Key = newEncKey.Item2.EncryptedString,
|
|
||||||
NewMasterPasswordHash = masterPasswordHash,
|
|
||||||
MasterPasswordHint = Hint
|
|
||||||
};
|
|
||||||
|
|
||||||
// Initiate API action
|
// Initiate API action
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _deviceActionService.ShowLoadingAsync(AppResources.UpdatingPassword);
|
await _deviceActionService.ShowLoadingAsync(AppResources.UpdatingPassword);
|
||||||
await _apiService.PutUpdateTempPasswordAsync(request);
|
|
||||||
|
switch (_reason)
|
||||||
|
{
|
||||||
|
case ForcePasswordResetReason.AdminForcePasswordReset:
|
||||||
|
await UpdateTempPasswordAsync(masterPasswordHash, newEncKey.Item2.EncryptedString);
|
||||||
|
break;
|
||||||
|
case ForcePasswordResetReason.WeakMasterPasswordOnLogin:
|
||||||
|
await UpdatePasswordAsync(masterPasswordHash, newEncKey.Item2.EncryptedString);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
}
|
||||||
await _deviceActionService.HideLoadingAsync();
|
await _deviceActionService.HideLoadingAsync();
|
||||||
|
|
||||||
|
// Clear the force reset password reason
|
||||||
|
await _stateService.SetForcePasswordResetReasonAsync(null);
|
||||||
|
|
||||||
|
_platformUtilsService.ShowToast(null, null, AppResources.UpdatedMasterPassword);
|
||||||
|
|
||||||
UpdateTempPasswordSuccessAction?.Invoke();
|
UpdateTempPasswordSuccessAction?.Invoke();
|
||||||
}
|
}
|
||||||
catch (ApiException e)
|
catch (ApiException e)
|
||||||
@@ -85,5 +140,32 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task UpdateTempPasswordAsync(string newMasterPasswordHash, string newEncKey)
|
||||||
|
{
|
||||||
|
var request = new UpdateTempPasswordRequest
|
||||||
|
{
|
||||||
|
Key = newEncKey,
|
||||||
|
NewMasterPasswordHash = newMasterPasswordHash,
|
||||||
|
MasterPasswordHint = Hint
|
||||||
|
};
|
||||||
|
|
||||||
|
await _apiService.PutUpdateTempPasswordAsync(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task UpdatePasswordAsync(string newMasterPasswordHash, string newEncKey)
|
||||||
|
{
|
||||||
|
var currentPasswordHash = await _cryptoService.HashPasswordAsync(CurrentMasterPassword, null);
|
||||||
|
|
||||||
|
var request = new PasswordRequest
|
||||||
|
{
|
||||||
|
MasterPasswordHash = currentPasswordHash,
|
||||||
|
Key = newEncKey,
|
||||||
|
NewMasterPasswordHash = newMasterPasswordHash,
|
||||||
|
MasterPasswordHint = Hint
|
||||||
|
};
|
||||||
|
|
||||||
|
await _apiService.PostPasswordAsync(request);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -827,7 +827,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;
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
Padding="0, 10, 0 ,0"
|
Padding="0, 10, 0 ,0"
|
||||||
FontAttributes="Bold"/>
|
FontAttributes="Bold"/>
|
||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
FormattedText="{Binding RequestFingerprint}"
|
FormattedText="{Binding FingerprintPhrase}"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.ColumnSpan="2"
|
Grid.ColumnSpan="2"
|
||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ namespace Bit.App.Pages
|
|||||||
Id = loginRequestData.Id,
|
Id = loginRequestData.Id,
|
||||||
IpAddress = loginRequestData.RequestIpAddress,
|
IpAddress = loginRequestData.RequestIpAddress,
|
||||||
Email = await _stateService.GetEmailAsync(),
|
Email = await _stateService.GetEmailAsync(),
|
||||||
FingerprintPhrase = loginRequestData.RequestFingerprint,
|
FingerprintPhrase = loginRequestData.FingerprintPhrase,
|
||||||
RequestDate = loginRequestData.CreationDate,
|
RequestDate = loginRequestData.CreationDate,
|
||||||
DeviceType = loginRequestData.RequestDeviceType,
|
DeviceType = loginRequestData.RequestDeviceType,
|
||||||
Origin = loginRequestData.Origin
|
Origin = loginRequestData.Origin
|
||||||
|
|||||||
@@ -80,6 +80,22 @@
|
|||||||
Text="{u:I18n ClearClipboardDescription}"
|
Text="{u:I18n ClearClipboardDescription}"
|
||||||
StyleClass="box-footer-label" />
|
StyleClass="box-footer-label" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
|
<StackLayout StyleClass="box">
|
||||||
|
<StackLayout StyleClass="box-row, box-row-input, box-row-input-options-platform">
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n Language}"
|
||||||
|
StyleClass="box-label" />
|
||||||
|
<Picker
|
||||||
|
x:Name="_languagePicker"
|
||||||
|
ItemsSource="{Binding LocalesOptions, Mode=OneTime}"
|
||||||
|
SelectedItem="{Binding SelectedLocale}"
|
||||||
|
ItemDisplayBinding="{Binding Value}"
|
||||||
|
StyleClass="box-value" />
|
||||||
|
</StackLayout>
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n LanguageChangeRequiresAppRestart}"
|
||||||
|
StyleClass="box-footer-label" />
|
||||||
|
</StackLayout>
|
||||||
<StackLayout StyleClass="box">
|
<StackLayout StyleClass="box">
|
||||||
<StackLayout StyleClass="box-row, box-row-switch">
|
<StackLayout StyleClass="box-row, box-row-switch">
|
||||||
<Label
|
<Label
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ namespace Bit.App.Pages
|
|||||||
_autoDarkThemePicker.On<iOS>().SetUpdateMode(UpdateMode.WhenFinished);
|
_autoDarkThemePicker.On<iOS>().SetUpdateMode(UpdateMode.WhenFinished);
|
||||||
_uriMatchPicker.On<iOS>().SetUpdateMode(UpdateMode.WhenFinished);
|
_uriMatchPicker.On<iOS>().SetUpdateMode(UpdateMode.WhenFinished);
|
||||||
_clearClipboardPicker.On<iOS>().SetUpdateMode(UpdateMode.WhenFinished);
|
_clearClipboardPicker.On<iOS>().SetUpdateMode(UpdateMode.WhenFinished);
|
||||||
|
_languagePicker.On<iOS>().SetUpdateMode(UpdateMode.WhenFinished);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
using Bit.App.Utilities;
|
using Bit.App.Utilities;
|
||||||
@@ -14,7 +15,8 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
private readonly IStateService _stateService;
|
private readonly IStateService _stateService;
|
||||||
private readonly IMessagingService _messagingService;
|
private readonly IMessagingService _messagingService;
|
||||||
|
private readonly II18nService _i18nService;
|
||||||
|
private readonly IPlatformUtilsService _platformUtilsService;
|
||||||
|
|
||||||
private bool _autofillSavePrompt;
|
private bool _autofillSavePrompt;
|
||||||
private string _autofillBlockedUris;
|
private string _autofillBlockedUris;
|
||||||
@@ -24,6 +26,7 @@ namespace Bit.App.Pages
|
|||||||
private int _themeSelectedIndex;
|
private int _themeSelectedIndex;
|
||||||
private int _autoDarkThemeSelectedIndex;
|
private int _autoDarkThemeSelectedIndex;
|
||||||
private int _uriMatchSelectedIndex;
|
private int _uriMatchSelectedIndex;
|
||||||
|
private KeyValuePair<string, string> _selectedLocale;
|
||||||
private bool _inited;
|
private bool _inited;
|
||||||
private bool _updatingAutofill;
|
private bool _updatingAutofill;
|
||||||
private bool _showAndroidAutofillSettings;
|
private bool _showAndroidAutofillSettings;
|
||||||
@@ -32,6 +35,8 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
_stateService = ServiceContainer.Resolve<IStateService>("stateService");
|
_stateService = ServiceContainer.Resolve<IStateService>("stateService");
|
||||||
_messagingService = ServiceContainer.Resolve<IMessagingService>("messagingService");
|
_messagingService = ServiceContainer.Resolve<IMessagingService>("messagingService");
|
||||||
|
_i18nService = ServiceContainer.Resolve<II18nService>();
|
||||||
|
_platformUtilsService = ServiceContainer.Resolve<IPlatformUtilsService>();
|
||||||
|
|
||||||
PageTitle = AppResources.Options;
|
PageTitle = AppResources.Options;
|
||||||
var iosIos = Device.RuntimePlatform == Device.iOS;
|
var iosIos = Device.RuntimePlatform == Device.iOS;
|
||||||
@@ -74,12 +79,18 @@ namespace Bit.App.Pages
|
|||||||
new KeyValuePair<UriMatchType?, string>(UriMatchType.Exact, AppResources.Exact),
|
new KeyValuePair<UriMatchType?, string>(UriMatchType.Exact, AppResources.Exact),
|
||||||
new KeyValuePair<UriMatchType?, string>(UriMatchType.Never, AppResources.Never),
|
new KeyValuePair<UriMatchType?, string>(UriMatchType.Never, AppResources.Never),
|
||||||
};
|
};
|
||||||
|
LocalesOptions = new List<KeyValuePair<string, string>>
|
||||||
|
{
|
||||||
|
new KeyValuePair<string, string>(null, AppResources.DefaultSystem)
|
||||||
|
};
|
||||||
|
LocalesOptions.AddRange(_i18nService.LocaleNames.ToList());
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<KeyValuePair<int?, string>> ClearClipboardOptions { get; set; }
|
public List<KeyValuePair<int?, string>> ClearClipboardOptions { get; set; }
|
||||||
public List<KeyValuePair<string, string>> ThemeOptions { get; set; }
|
public List<KeyValuePair<string, string>> ThemeOptions { get; set; }
|
||||||
public List<KeyValuePair<string, string>> AutoDarkThemeOptions { get; set; }
|
public List<KeyValuePair<string, string>> AutoDarkThemeOptions { get; set; }
|
||||||
public List<KeyValuePair<UriMatchType?, string>> UriMatchOptions { get; set; }
|
public List<KeyValuePair<UriMatchType?, string>> UriMatchOptions { get; set; }
|
||||||
|
public List<KeyValuePair<string, string>> LocalesOptions { get; }
|
||||||
|
|
||||||
public int ClearClipboardSelectedIndex
|
public int ClearClipboardSelectedIndex
|
||||||
{
|
{
|
||||||
@@ -133,6 +144,18 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public KeyValuePair<string, string> SelectedLocale
|
||||||
|
{
|
||||||
|
get => _selectedLocale;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (SetProperty(ref _selectedLocale, value))
|
||||||
|
{
|
||||||
|
UpdateCurrentLocaleAsync().FireAndForget();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool Favicon
|
public bool Favicon
|
||||||
{
|
{
|
||||||
get => _favicon;
|
get => _favicon;
|
||||||
@@ -184,19 +207,30 @@ namespace Bit.App.Pages
|
|||||||
public async Task InitAsync()
|
public async Task InitAsync()
|
||||||
{
|
{
|
||||||
AutofillSavePrompt = !(await _stateService.GetAutofillDisableSavePromptAsync()).GetValueOrDefault();
|
AutofillSavePrompt = !(await _stateService.GetAutofillDisableSavePromptAsync()).GetValueOrDefault();
|
||||||
|
|
||||||
var blockedUrisList = await _stateService.GetAutofillBlacklistedUrisAsync();
|
var blockedUrisList = await _stateService.GetAutofillBlacklistedUrisAsync();
|
||||||
AutofillBlockedUris = blockedUrisList != null ? string.Join(", ", blockedUrisList) : null;
|
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();
|
||||||
|
|
||||||
var theme = await _stateService.GetThemeAsync();
|
var theme = await _stateService.GetThemeAsync();
|
||||||
ThemeSelectedIndex = ThemeOptions.FindIndex(k => k.Key == theme);
|
ThemeSelectedIndex = ThemeOptions.FindIndex(k => k.Key == theme);
|
||||||
|
|
||||||
var autoDarkTheme = await _stateService.GetAutoDarkThemeAsync() ?? "dark";
|
var autoDarkTheme = await _stateService.GetAutoDarkThemeAsync() ?? "dark";
|
||||||
AutoDarkThemeSelectedIndex = AutoDarkThemeOptions.FindIndex(k => k.Key == autoDarkTheme);
|
AutoDarkThemeSelectedIndex = AutoDarkThemeOptions.FindIndex(k => k.Key == autoDarkTheme);
|
||||||
|
|
||||||
var defaultUriMatch = await _stateService.GetDefaultUriMatchAsync();
|
var defaultUriMatch = await _stateService.GetDefaultUriMatchAsync();
|
||||||
UriMatchSelectedIndex = defaultUriMatch == null ? 0 :
|
UriMatchSelectedIndex = defaultUriMatch == null ? 0 :
|
||||||
UriMatchOptions.FindIndex(k => (int?)k.Key == defaultUriMatch);
|
UriMatchOptions.FindIndex(k => (int?)k.Key == defaultUriMatch);
|
||||||
|
|
||||||
var clearClipboard = await _stateService.GetClearClipboardAsync();
|
var clearClipboard = await _stateService.GetClearClipboardAsync();
|
||||||
ClearClipboardSelectedIndex = ClearClipboardOptions.FindIndex(k => k.Key == clearClipboard);
|
ClearClipboardSelectedIndex = ClearClipboardOptions.FindIndex(k => k.Key == clearClipboard);
|
||||||
|
|
||||||
|
var appLocale = _stateService.GetLocale();
|
||||||
|
SelectedLocale = appLocale == null ? LocalesOptions.First() : LocalesOptions.FirstOrDefault(kv => kv.Key == appLocale);
|
||||||
|
|
||||||
_inited = true;
|
_inited = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,5 +322,17 @@ namespace Bit.App.Pages
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task UpdateCurrentLocaleAsync()
|
||||||
|
{
|
||||||
|
if (!_inited)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_stateService.SetLocale(SelectedLocale.Key);
|
||||||
|
|
||||||
|
await _platformUtilsService.ShowDialogAsync(string.Format(AppResources.LanguageChangeXDescription, SelectedLocale.Value), AppResources.Language, AppResources.Ok);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,10 +7,7 @@ using Bit.App.Pages.Accounts;
|
|||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models;
|
|
||||||
using Bit.Core.Models.Domain;
|
using Bit.Core.Models.Domain;
|
||||||
using Bit.Core.Models.Response;
|
|
||||||
using Bit.Core.Models.View;
|
|
||||||
using Bit.Core.Services;
|
using Bit.Core.Services;
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
using Xamarin.CommunityToolkit.ObjectModel;
|
using Xamarin.CommunityToolkit.ObjectModel;
|
||||||
@@ -51,7 +48,7 @@ namespace Bit.App.Pages
|
|||||||
private bool _reportLoggingEnabled;
|
private bool _reportLoggingEnabled;
|
||||||
private bool _approvePasswordlessLoginRequests;
|
private bool _approvePasswordlessLoginRequests;
|
||||||
private bool _shouldConnectToWatch;
|
private bool _shouldConnectToWatch;
|
||||||
private List<KeyValuePair<string, int?>> _vaultTimeouts =
|
private readonly static List<KeyValuePair<string, int?>> VaultTimeoutOptions =
|
||||||
new List<KeyValuePair<string, int?>>
|
new List<KeyValuePair<string, int?>>
|
||||||
{
|
{
|
||||||
new KeyValuePair<string, int?>(AppResources.Immediately, 0),
|
new KeyValuePair<string, int?>(AppResources.Immediately, 0),
|
||||||
@@ -65,7 +62,7 @@ namespace Bit.App.Pages
|
|||||||
new KeyValuePair<string, int?>(AppResources.Never, null),
|
new KeyValuePair<string, int?>(AppResources.Never, null),
|
||||||
new KeyValuePair<string, int?>(AppResources.Custom, CustomVaultTimeoutValue),
|
new KeyValuePair<string, int?>(AppResources.Custom, CustomVaultTimeoutValue),
|
||||||
};
|
};
|
||||||
private List<KeyValuePair<string, VaultTimeoutAction>> _vaultTimeoutActions =
|
private readonly static List<KeyValuePair<string, VaultTimeoutAction>> VaultTimeoutActionOptions =
|
||||||
new List<KeyValuePair<string, VaultTimeoutAction>>
|
new List<KeyValuePair<string, VaultTimeoutAction>>
|
||||||
{
|
{
|
||||||
new KeyValuePair<string, VaultTimeoutAction>(AppResources.Lock, VaultTimeoutAction.Lock),
|
new KeyValuePair<string, VaultTimeoutAction>(AppResources.Lock, VaultTimeoutAction.Lock),
|
||||||
@@ -74,6 +71,8 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
private Policy _vaultTimeoutPolicy;
|
private Policy _vaultTimeoutPolicy;
|
||||||
private int? _vaultTimeout;
|
private int? _vaultTimeout;
|
||||||
|
private List<KeyValuePair<string, int?>> _vaultTimeoutOptions = VaultTimeoutOptions;
|
||||||
|
private List<KeyValuePair<string, VaultTimeoutAction>> _vaultTimeoutActionOptions = VaultTimeoutActionOptions;
|
||||||
|
|
||||||
public SettingsPageViewModel()
|
public SettingsPageViewModel()
|
||||||
{
|
{
|
||||||
@@ -117,20 +116,28 @@ namespace Bit.App.Pages
|
|||||||
_localizeService.GetLocaleShortTime(lastSync.Value));
|
_localizeService.GetLocaleShortTime(lastSync.Value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_vaultTimeoutPolicy = null;
|
||||||
|
_vaultTimeoutOptions = VaultTimeoutOptions;
|
||||||
|
_vaultTimeoutActionOptions = VaultTimeoutActionOptions;
|
||||||
|
|
||||||
|
_vaultTimeout = await _vaultTimeoutService.GetVaultTimeout();
|
||||||
|
_vaultTimeoutDisplayValue = _vaultTimeoutOptions.FirstOrDefault(o => o.Value == _vaultTimeout).Key;
|
||||||
|
_vaultTimeoutDisplayValue ??= _vaultTimeoutOptions.Where(o => o.Value == CustomVaultTimeoutValue).First().Key;
|
||||||
|
|
||||||
|
var action = await _vaultTimeoutService.GetVaultTimeoutAction() ?? VaultTimeoutAction.Lock;
|
||||||
|
_vaultTimeoutActionDisplayValue = _vaultTimeoutActionOptions.FirstOrDefault(o => o.Value == action).Key;
|
||||||
|
|
||||||
if (await _policyService.PolicyAppliesToUser(PolicyType.MaximumVaultTimeout))
|
if (await _policyService.PolicyAppliesToUser(PolicyType.MaximumVaultTimeout))
|
||||||
{
|
{
|
||||||
|
// 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 minutes = _policyService.GetPolicyInt(_vaultTimeoutPolicy, "minutes").GetValueOrDefault();
|
var policyMinutes = _vaultTimeoutPolicy.GetInt(Policy.MINUTES_KEY);
|
||||||
_vaultTimeouts = _vaultTimeouts.Where(t =>
|
_vaultTimeoutOptions = _vaultTimeoutOptions.Where(t =>
|
||||||
t.Value <= minutes &&
|
t.Value <= policyMinutes &&
|
||||||
(t.Value > 0 || t.Value == CustomVaultTimeoutValue) &&
|
(t.Value > 0 || t.Value == CustomVaultTimeoutValue) &&
|
||||||
t.Value != null).ToList();
|
t.Value != null).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
_vaultTimeout = await _vaultTimeoutService.GetVaultTimeout();
|
|
||||||
_vaultTimeoutDisplayValue = _vaultTimeouts.FirstOrDefault(o => o.Value == _vaultTimeout).Key;
|
|
||||||
var action = await _stateService.GetVaultTimeoutActionAsync() ?? VaultTimeoutAction.Lock;
|
|
||||||
_vaultTimeoutActionDisplayValue = _vaultTimeoutActions.FirstOrDefault(o => o.Value == action).Key;
|
|
||||||
var pinSet = await _vaultTimeoutService.IsPinLockSetAsync();
|
var pinSet = await _vaultTimeoutService.IsPinLockSetAsync();
|
||||||
_pin = pinSet.Item1 || pinSet.Item2;
|
_pin = pinSet.Item1 || pinSet.Item2;
|
||||||
_biometric = await _vaultTimeoutService.IsBiometricLockSetAsync();
|
_biometric = await _vaultTimeoutService.IsBiometricLockSetAsync();
|
||||||
@@ -266,7 +273,7 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
var oldTimeout = _vaultTimeout;
|
var oldTimeout = _vaultTimeout;
|
||||||
|
|
||||||
var options = _vaultTimeouts.Select(
|
var options = _vaultTimeoutOptions.Select(
|
||||||
o => o.Key == _vaultTimeoutDisplayValue ? $"✓ {o.Key}" : o.Key).ToArray();
|
o => o.Key == _vaultTimeoutDisplayValue ? $"✓ {o.Key}" : o.Key).ToArray();
|
||||||
if (promptOptions)
|
if (promptOptions)
|
||||||
{
|
{
|
||||||
@@ -277,7 +284,7 @@ namespace Bit.App.Pages
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var cleanSelection = selection.Replace("✓ ", string.Empty);
|
var cleanSelection = selection.Replace("✓ ", string.Empty);
|
||||||
var selectionOption = _vaultTimeouts.FirstOrDefault(o => o.Key == cleanSelection);
|
var selectionOption = _vaultTimeoutOptions.FirstOrDefault(o => o.Key == cleanSelection);
|
||||||
|
|
||||||
// Check if the selected Timeout action is "Never" and if it's different from the previous selected value
|
// Check if the selected Timeout action is "Never" and if it's different from the previous selected value
|
||||||
if (selectionOption.Value == null && selectionOption.Value != oldTimeout)
|
if (selectionOption.Value == null && selectionOption.Value != oldTimeout)
|
||||||
@@ -295,13 +302,13 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
if (_vaultTimeoutPolicy != null)
|
if (_vaultTimeoutPolicy != null)
|
||||||
{
|
{
|
||||||
var maximumTimeout = _policyService.GetPolicyInt(_vaultTimeoutPolicy, "minutes");
|
var maximumTimeout = _vaultTimeoutPolicy.GetInt(Policy.MINUTES_KEY);
|
||||||
|
|
||||||
if (newTimeout > maximumTimeout)
|
if (newTimeout > maximumTimeout)
|
||||||
{
|
{
|
||||||
await _platformUtilsService.ShowDialogAsync(AppResources.VaultTimeoutToLarge, AppResources.Warning);
|
await _platformUtilsService.ShowDialogAsync(AppResources.VaultTimeoutToLarge, AppResources.Warning);
|
||||||
var timeout = await _vaultTimeoutService.GetVaultTimeout();
|
var timeout = await _vaultTimeoutService.GetVaultTimeout();
|
||||||
_vaultTimeoutDisplayValue = _vaultTimeouts.FirstOrDefault(o => o.Value == timeout).Key ??
|
_vaultTimeoutDisplayValue = _vaultTimeoutOptions.FirstOrDefault(o => o.Value == timeout).Key ??
|
||||||
AppResources.Custom;
|
AppResources.Custom;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -374,7 +381,13 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
public async Task VaultTimeoutActionAsync()
|
public async Task VaultTimeoutActionAsync()
|
||||||
{
|
{
|
||||||
var options = _vaultTimeoutActions.Select(o =>
|
if (_vaultTimeoutPolicy != null &&
|
||||||
|
!string.IsNullOrEmpty(_vaultTimeoutPolicy.GetString(Policy.ACTION_KEY)))
|
||||||
|
{
|
||||||
|
// do nothing if we have a policy set
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var options = _vaultTimeoutActionOptions.Select(o =>
|
||||||
o.Key == _vaultTimeoutActionDisplayValue ? $"✓ {o.Key}" : o.Key).ToArray();
|
o.Key == _vaultTimeoutActionDisplayValue ? $"✓ {o.Key}" : o.Key).ToArray();
|
||||||
var selection = await Page.DisplayActionSheet(AppResources.VaultTimeoutAction,
|
var selection = await Page.DisplayActionSheet(AppResources.VaultTimeoutAction,
|
||||||
AppResources.Cancel, null, options);
|
AppResources.Cancel, null, options);
|
||||||
@@ -393,7 +406,7 @@ namespace Bit.App.Pages
|
|||||||
cleanSelection = AppResources.Lock;
|
cleanSelection = AppResources.Lock;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var selectionOption = _vaultTimeoutActions.FirstOrDefault(o => o.Key == cleanSelection);
|
var selectionOption = _vaultTimeoutActionOptions.FirstOrDefault(o => o.Key == cleanSelection);
|
||||||
var changed = _vaultTimeoutActionDisplayValue != selectionOption.Key;
|
var changed = _vaultTimeoutActionDisplayValue != selectionOption.Key;
|
||||||
_vaultTimeoutActionDisplayValue = selectionOption.Key;
|
_vaultTimeoutActionDisplayValue = selectionOption.Key;
|
||||||
await _vaultTimeoutService.SetVaultTimeoutOptionsAsync(_vaultTimeout,
|
await _vaultTimeoutService.SetVaultTimeoutOptionsAsync(_vaultTimeout,
|
||||||
@@ -597,15 +610,37 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
if (_vaultTimeoutPolicy != null)
|
if (_vaultTimeoutPolicy != null)
|
||||||
{
|
{
|
||||||
var maximumTimeout = _policyService.GetPolicyInt(_vaultTimeoutPolicy, "minutes").GetValueOrDefault();
|
var policyMinutes = _vaultTimeoutPolicy.GetInt(Policy.MINUTES_KEY);
|
||||||
|
var policyAction = _vaultTimeoutPolicy.GetString(Policy.ACTION_KEY);
|
||||||
|
|
||||||
|
if (policyMinutes.HasValue || !string.IsNullOrWhiteSpace(policyAction))
|
||||||
|
{
|
||||||
|
string policyAlert;
|
||||||
|
if (policyMinutes.HasValue && string.IsNullOrWhiteSpace(policyAction))
|
||||||
|
{
|
||||||
|
policyAlert = string.Format(AppResources.VaultTimeoutPolicyInEffect,
|
||||||
|
Math.Floor((float)policyMinutes / 60),
|
||||||
|
policyMinutes % 60);
|
||||||
|
}
|
||||||
|
else if (!policyMinutes.HasValue && !string.IsNullOrWhiteSpace(policyAction))
|
||||||
|
{
|
||||||
|
policyAlert = string.Format(AppResources.VaultTimeoutActionPolicyInEffect,
|
||||||
|
policyAction == Policy.ACTION_LOCK ? AppResources.Lock : AppResources.LogOut);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
policyAlert = string.Format(AppResources.VaultTimeoutPolicyWithActionInEffect,
|
||||||
|
Math.Floor((float)policyMinutes / 60),
|
||||||
|
policyMinutes % 60,
|
||||||
|
policyAction == Policy.ACTION_LOCK ? AppResources.Lock : AppResources.LogOut);
|
||||||
|
}
|
||||||
securityItems.Insert(0, new SettingsPageListItem
|
securityItems.Insert(0, new SettingsPageListItem
|
||||||
{
|
{
|
||||||
Name = string.Format(AppResources.VaultTimeoutPolicyInEffect,
|
Name = policyAlert,
|
||||||
Math.Floor((float)maximumTimeout / 60),
|
|
||||||
maximumTimeout % 60),
|
|
||||||
UseFrame = true,
|
UseFrame = true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (Device.RuntimePlatform == Device.Android)
|
if (Device.RuntimePlatform == Device.Android)
|
||||||
{
|
{
|
||||||
securityItems.Add(new SettingsPageListItem
|
securityItems.Add(new SettingsPageListItem
|
||||||
@@ -792,12 +827,12 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
private VaultTimeoutAction GetVaultTimeoutActionFromKey(string key)
|
private VaultTimeoutAction GetVaultTimeoutActionFromKey(string key)
|
||||||
{
|
{
|
||||||
return _vaultTimeoutActions.FirstOrDefault(o => o.Key == key).Value;
|
return _vaultTimeoutActionOptions.FirstOrDefault(o => o.Key == key).Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int? GetVaultTimeoutFromKey(string key)
|
private int? GetVaultTimeoutFromKey(string key)
|
||||||
{
|
{
|
||||||
return _vaultTimeouts.FirstOrDefault(o => o.Key == key).Value;
|
return _vaultTimeoutOptions.FirstOrDefault(o => o.Key == key).Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string CreateSelectableOption(string option, bool selected) => selected ? $"✓ {option}" : option;
|
private string CreateSelectableOption(string option, bool selected) => selected ? $"✓ {option}" : option;
|
||||||
@@ -806,11 +841,6 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
public async Task SetScreenCaptureAllowedAsync()
|
public async Task SetScreenCaptureAllowedAsync()
|
||||||
{
|
{
|
||||||
if (CoreHelpers.ForceScreenCaptureEnabled())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!_screenCaptureAllowed
|
if (!_screenCaptureAllowed
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using System.Threading.Tasks;
|
|||||||
using Bit.App.Effects;
|
using Bit.App.Effects;
|
||||||
using Bit.App.Models;
|
using Bit.App.Models;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
|
using Bit.Core;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.Core.Models.Data;
|
using Bit.Core.Models.Data;
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
@@ -15,6 +16,7 @@ namespace Bit.App.Pages
|
|||||||
private readonly IBroadcasterService _broadcasterService;
|
private readonly IBroadcasterService _broadcasterService;
|
||||||
private readonly IMessagingService _messagingService;
|
private readonly IMessagingService _messagingService;
|
||||||
private readonly IKeyConnectorService _keyConnectorService;
|
private readonly IKeyConnectorService _keyConnectorService;
|
||||||
|
private readonly IStateService _stateService;
|
||||||
private readonly LazyResolve<ILogger> _logger = new LazyResolve<ILogger>("logger");
|
private readonly LazyResolve<ILogger> _logger = new LazyResolve<ILogger>("logger");
|
||||||
|
|
||||||
private NavigationPage _groupingsPage;
|
private NavigationPage _groupingsPage;
|
||||||
@@ -26,6 +28,7 @@ namespace Bit.App.Pages
|
|||||||
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
|
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
|
||||||
_messagingService = ServiceContainer.Resolve<IMessagingService>("messagingService");
|
_messagingService = ServiceContainer.Resolve<IMessagingService>("messagingService");
|
||||||
_keyConnectorService = ServiceContainer.Resolve<IKeyConnectorService>("keyConnectorService");
|
_keyConnectorService = ServiceContainer.Resolve<IKeyConnectorService>("keyConnectorService");
|
||||||
|
_stateService = ServiceContainer.Resolve<IStateService>();
|
||||||
|
|
||||||
_groupingsPage = new NavigationPage(new GroupingsPage(true, previousPage: previousPage))
|
_groupingsPage = new NavigationPage(new GroupingsPage(true, previousPage: previousPage))
|
||||||
{
|
{
|
||||||
@@ -95,6 +98,13 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
_messagingService.Send("convertAccountToKeyConnector");
|
_messagingService.Send("convertAccountToKeyConnector");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var forcePasswordResetReason = await _stateService.GetForcePasswordResetReasonAsync();
|
||||||
|
|
||||||
|
if (forcePasswordResetReason.HasValue)
|
||||||
|
{
|
||||||
|
_messagingService.Send(Constants.ForceUpdatePassword);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnDisappearing()
|
protected override void OnDisappearing()
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ namespace Bit.App.Pages
|
|||||||
// Prevent Android from locking if vault timeout set to "immediate"
|
// Prevent Android from locking if vault timeout set to "immediate"
|
||||||
if (Device.RuntimePlatform == Device.Android)
|
if (Device.RuntimePlatform == Device.Android)
|
||||||
{
|
{
|
||||||
_vaultTimeoutService.DelayLockAndLogoutMs = 60000;
|
_vaultTimeoutService.DelayTimeoutMs = 60000;
|
||||||
}
|
}
|
||||||
await _fileService.SelectFileAsync();
|
await _fileService.SelectFileAsync();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,91 +1,29 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Bit.App.Abstractions;
|
|
||||||
using Bit.App.Controls;
|
|
||||||
using Bit.App.Models;
|
using Bit.App.Models;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
using Bit.App.Utilities;
|
using Bit.App.Utilities;
|
||||||
using Bit.Core;
|
using Bit.Core;
|
||||||
using Bit.Core.Abstractions;
|
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Exceptions;
|
using Bit.Core.Exceptions;
|
||||||
using Bit.Core.Models.View;
|
using Bit.Core.Models.View;
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
using Xamarin.CommunityToolkit.ObjectModel;
|
|
||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
|
|
||||||
namespace Bit.App.Pages
|
namespace Bit.App.Pages
|
||||||
{
|
{
|
||||||
public class AutofillCiphersPageViewModel : BaseViewModel
|
public class AutofillCiphersPageViewModel : CipherSelectionPageViewModel
|
||||||
{
|
{
|
||||||
private readonly IPlatformUtilsService _platformUtilsService;
|
private CipherType? _fillType;
|
||||||
private readonly IDeviceActionService _deviceActionService;
|
|
||||||
private readonly IAutofillHandler _autofillHandler;
|
|
||||||
private readonly ICipherService _cipherService;
|
|
||||||
private readonly IStateService _stateService;
|
|
||||||
private readonly IPasswordRepromptService _passwordRepromptService;
|
|
||||||
private readonly IMessagingService _messagingService;
|
|
||||||
private readonly ILogger _logger;
|
|
||||||
|
|
||||||
private bool _showNoData;
|
|
||||||
private bool _showList;
|
|
||||||
private string _noDataText;
|
|
||||||
private bool _websiteIconsEnabled;
|
|
||||||
|
|
||||||
public AutofillCiphersPageViewModel()
|
|
||||||
{
|
|
||||||
_platformUtilsService = ServiceContainer.Resolve<IPlatformUtilsService>("platformUtilsService");
|
|
||||||
_cipherService = ServiceContainer.Resolve<ICipherService>("cipherService");
|
|
||||||
_deviceActionService = ServiceContainer.Resolve<IDeviceActionService>("deviceActionService");
|
|
||||||
_autofillHandler = ServiceContainer.Resolve<IAutofillHandler>();
|
|
||||||
_stateService = ServiceContainer.Resolve<IStateService>("stateService");
|
|
||||||
_passwordRepromptService = ServiceContainer.Resolve<IPasswordRepromptService>("passwordRepromptService");
|
|
||||||
_messagingService = ServiceContainer.Resolve<IMessagingService>("messagingService");
|
|
||||||
_logger = ServiceContainer.Resolve<ILogger>("logger");
|
|
||||||
|
|
||||||
GroupedItems = new ObservableRangeCollection<IGroupingsPageListItem>();
|
|
||||||
CipherOptionsCommand = new Command<CipherView>(CipherOptionsAsync);
|
|
||||||
|
|
||||||
AccountSwitchingOverlayViewModel = new AccountSwitchingOverlayViewModel(_stateService, _messagingService, _logger)
|
|
||||||
{
|
|
||||||
AllowAddAccountRow = false
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Name { get; set; }
|
|
||||||
public string Uri { get; set; }
|
public string Uri { get; set; }
|
||||||
public Command CipherOptionsCommand { get; set; }
|
|
||||||
public bool LoadedOnce { get; set; }
|
|
||||||
public ObservableRangeCollection<IGroupingsPageListItem> GroupedItems { get; set; }
|
|
||||||
public AccountSwitchingOverlayViewModel AccountSwitchingOverlayViewModel { get; }
|
|
||||||
|
|
||||||
public bool ShowNoData
|
public override void Init(AppOptions appOptions)
|
||||||
{
|
|
||||||
get => _showNoData;
|
|
||||||
set => SetProperty(ref _showNoData, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ShowList
|
|
||||||
{
|
|
||||||
get => _showList;
|
|
||||||
set => SetProperty(ref _showList, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string NoDataText
|
|
||||||
{
|
|
||||||
get => _noDataText;
|
|
||||||
set => SetProperty(ref _noDataText, value);
|
|
||||||
}
|
|
||||||
public bool WebsiteIconsEnabled
|
|
||||||
{
|
|
||||||
get => _websiteIconsEnabled;
|
|
||||||
set => SetProperty(ref _websiteIconsEnabled, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Init(AppOptions appOptions)
|
|
||||||
{
|
{
|
||||||
Uri = appOptions?.Uri;
|
Uri = appOptions?.Uri;
|
||||||
|
_fillType = appOptions.FillType;
|
||||||
|
|
||||||
string name = null;
|
string name = null;
|
||||||
if (Uri?.StartsWith(Constants.AndroidAppProtocol) ?? false)
|
if (Uri?.StartsWith(Constants.AndroidAppProtocol) ?? false)
|
||||||
{
|
{
|
||||||
@@ -104,14 +42,11 @@ namespace Bit.App.Pages
|
|||||||
NoDataText = string.Format(AppResources.NoItemsForUri, Name ?? "--");
|
NoDataText = string.Format(AppResources.NoItemsForUri, Name ?? "--");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task LoadAsync()
|
protected override async Task<List<GroupingsPageListGroup>> LoadGroupedItemsAsync()
|
||||||
{
|
{
|
||||||
LoadedOnce = true;
|
|
||||||
ShowList = false;
|
|
||||||
ShowNoData = false;
|
|
||||||
WebsiteIconsEnabled = !(await _stateService.GetDisableFaviconAsync()).GetValueOrDefault();
|
|
||||||
var groupedItems = new List<GroupingsPageListGroup>();
|
var groupedItems = new List<GroupingsPageListGroup>();
|
||||||
var ciphers = await _cipherService.GetAllDecryptedByUrlAsync(Uri, null);
|
var ciphers = await _cipherService.GetAllDecryptedByUrlAsync(Uri, null);
|
||||||
|
|
||||||
var matching = ciphers.Item1?.Select(c => new GroupingsPageListItem { Cipher = c }).ToList();
|
var matching = ciphers.Item1?.Select(c => new GroupingsPageListItem { Cipher = c }).ToList();
|
||||||
var hasMatching = matching?.Any() ?? false;
|
var hasMatching = matching?.Any() ?? false;
|
||||||
if (matching?.Any() ?? false)
|
if (matching?.Any() ?? false)
|
||||||
@@ -119,6 +54,7 @@ namespace Bit.App.Pages
|
|||||||
groupedItems.Add(
|
groupedItems.Add(
|
||||||
new GroupingsPageListGroup(matching, AppResources.MatchingItems, matching.Count, false, true));
|
new GroupingsPageListGroup(matching, AppResources.MatchingItems, matching.Count, false, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
var fuzzy = ciphers.Item2?.Select(c =>
|
var fuzzy = ciphers.Item2?.Select(c =>
|
||||||
new GroupingsPageListItem { Cipher = c, FuzzyAutofill = true }).ToList();
|
new GroupingsPageListItem { Cipher = c, FuzzyAutofill = true }).ToList();
|
||||||
if (fuzzy?.Any() ?? false)
|
if (fuzzy?.Any() ?? false)
|
||||||
@@ -128,70 +64,30 @@ namespace Bit.App.Pages
|
|||||||
!hasMatching));
|
!hasMatching));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: refactor this
|
return groupedItems;
|
||||||
if (Device.RuntimePlatform == Device.Android
|
|
||||||
||
|
|
||||||
GroupedItems.Any())
|
|
||||||
{
|
|
||||||
var items = new List<IGroupingsPageListItem>();
|
|
||||||
foreach (var itemGroup in groupedItems)
|
|
||||||
{
|
|
||||||
items.Add(new GroupingsPageHeaderListItem(itemGroup.Name, itemGroup.ItemCount));
|
|
||||||
items.AddRange(itemGroup);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupedItems.ReplaceRange(items);
|
protected override async Task SelectCipherAsync(IGroupingsPageListItem item)
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
// HACK: we need this on iOS, so that it doesn't crash when adding coming from an empty list
|
if (!(item is GroupingsPageListItem listItem) || listItem.Cipher is null)
|
||||||
var first = true;
|
|
||||||
var items = new List<IGroupingsPageListItem>();
|
|
||||||
foreach (var itemGroup in groupedItems)
|
|
||||||
{
|
|
||||||
if (!first)
|
|
||||||
{
|
|
||||||
items.Add(new GroupingsPageHeaderListItem(itemGroup.Name, itemGroup.ItemCount));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
first = false;
|
|
||||||
}
|
|
||||||
items.AddRange(itemGroup);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (groupedItems.Any())
|
|
||||||
{
|
|
||||||
GroupedItems.ReplaceRange(new List<IGroupingsPageListItem> { new GroupingsPageHeaderListItem(groupedItems[0].Name, groupedItems[0].ItemCount) });
|
|
||||||
GroupedItems.AddRange(items);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GroupedItems.Clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ShowList = groupedItems.Any();
|
|
||||||
ShowNoData = !ShowList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task SelectCipherAsync(CipherView cipher, bool fuzzy)
|
|
||||||
{
|
|
||||||
if (cipher == null)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var cipher = listItem.Cipher;
|
||||||
|
|
||||||
if (_deviceActionService.SystemMajorVersion() < 21)
|
if (_deviceActionService.SystemMajorVersion() < 21)
|
||||||
{
|
{
|
||||||
await AppHelpers.CipherListOptions(Page, cipher, _passwordRepromptService);
|
await AppHelpers.CipherListOptions(Page, cipher, _passwordRepromptService);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if (cipher.Reprompt != CipherRepromptType.None && !await _passwordRepromptService.ShowPasswordPromptAsync())
|
if (cipher.Reprompt != CipherRepromptType.None && !await _passwordRepromptService.ShowPasswordPromptAsync())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var autofillResponse = AppResources.Yes;
|
var autofillResponse = AppResources.Yes;
|
||||||
if (fuzzy)
|
if (listItem.FuzzyAutofill)
|
||||||
{
|
{
|
||||||
var options = new List<string> { AppResources.Yes };
|
var options = new List<string> { AppResources.Yes };
|
||||||
if (cipher.Type == CipherType.Login &&
|
if (cipher.Type == CipherType.Login &&
|
||||||
@@ -237,14 +133,19 @@ namespace Bit.App.Pages
|
|||||||
_autofillHandler.Autofill(cipher);
|
_autofillHandler.Autofill(cipher);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override async Task AddCipherAsync()
|
||||||
|
{
|
||||||
|
if (_fillType.HasValue && _fillType != CipherType.Login)
|
||||||
|
{
|
||||||
|
var pageForOther = new CipherAddEditPage(type: _fillType, fromAutofill: true);
|
||||||
|
await Page.Navigation.PushModalAsync(new NavigationPage(pageForOther));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void CipherOptionsAsync(CipherView cipher)
|
var pageForLogin = new CipherAddEditPage(null, CipherType.Login, uri: Uri, name: Name,
|
||||||
{
|
fromAutofill: true);
|
||||||
if ((Page as BaseContentPage).DoOnce())
|
await Page.Navigation.PushModalAsync(new NavigationPage(pageForLogin));
|
||||||
{
|
|
||||||
await AppHelpers.CipherListOptions(Page, cipher, _passwordRepromptService);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Bit.App.Abstractions;
|
||||||
using Bit.App.Lists.ItemViewModels.CustomFields;
|
using Bit.App.Lists.ItemViewModels.CustomFields;
|
||||||
using Bit.App.Models;
|
using Bit.App.Models;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
@@ -30,6 +31,7 @@ namespace Bit.App.Pages
|
|||||||
private readonly IClipboardService _clipboardService;
|
private readonly IClipboardService _clipboardService;
|
||||||
private readonly IAutofillHandler _autofillHandler;
|
private readonly IAutofillHandler _autofillHandler;
|
||||||
private readonly IWatchDeviceService _watchDeviceService;
|
private readonly IWatchDeviceService _watchDeviceService;
|
||||||
|
private readonly IAccountsManager _accountsManager;
|
||||||
|
|
||||||
private bool _showNotesSeparator;
|
private bool _showNotesSeparator;
|
||||||
private bool _showPassword;
|
private bool _showPassword;
|
||||||
@@ -44,6 +46,8 @@ namespace Bit.App.Pages
|
|||||||
private bool _hasCollections;
|
private bool _hasCollections;
|
||||||
private string _previousCipherId;
|
private string _previousCipherId;
|
||||||
private List<Core.Models.View.CollectionView> _writeableCollections;
|
private List<Core.Models.View.CollectionView> _writeableCollections;
|
||||||
|
private bool _fromOtp;
|
||||||
|
|
||||||
protected override string[] AdditionalPropertiesToRaiseOnCipherChanged => new string[]
|
protected override string[] AdditionalPropertiesToRaiseOnCipherChanged => new string[]
|
||||||
{
|
{
|
||||||
nameof(IsLogin),
|
nameof(IsLogin),
|
||||||
@@ -82,6 +86,8 @@ namespace Bit.App.Pages
|
|||||||
_clipboardService = ServiceContainer.Resolve<IClipboardService>("clipboardService");
|
_clipboardService = ServiceContainer.Resolve<IClipboardService>("clipboardService");
|
||||||
_autofillHandler = ServiceContainer.Resolve<IAutofillHandler>();
|
_autofillHandler = ServiceContainer.Resolve<IAutofillHandler>();
|
||||||
_watchDeviceService = ServiceContainer.Resolve<IWatchDeviceService>();
|
_watchDeviceService = ServiceContainer.Resolve<IWatchDeviceService>();
|
||||||
|
_accountsManager = ServiceContainer.Resolve<IAccountsManager>();
|
||||||
|
|
||||||
|
|
||||||
GeneratePasswordCommand = new Command(GeneratePassword);
|
GeneratePasswordCommand = new Command(GeneratePassword);
|
||||||
TogglePasswordCommand = new Command(TogglePassword);
|
TogglePasswordCommand = new Command(TogglePassword);
|
||||||
@@ -115,6 +121,7 @@ namespace Bit.App.Pages
|
|||||||
new KeyValuePair<string, string>("JCB", "JCB"),
|
new KeyValuePair<string, string>("JCB", "JCB"),
|
||||||
new KeyValuePair<string, string>("Maestro", "Maestro"),
|
new KeyValuePair<string, string>("Maestro", "Maestro"),
|
||||||
new KeyValuePair<string, string>("UnionPay", "UnionPay"),
|
new KeyValuePair<string, string>("UnionPay", "UnionPay"),
|
||||||
|
new KeyValuePair<string, string>("RuPay", "RuPay"),
|
||||||
new KeyValuePair<string, string>(AppResources.Other, "Other")
|
new KeyValuePair<string, string>(AppResources.Other, "Other")
|
||||||
};
|
};
|
||||||
CardExpMonthOptions = new List<KeyValuePair<string, string>>
|
CardExpMonthOptions = new List<KeyValuePair<string, string>>
|
||||||
@@ -302,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 void Init()
|
public void Init()
|
||||||
{
|
{
|
||||||
PageTitle = EditMode && !CloneMode ? AppResources.EditItem : AppResources.AddItem;
|
PageTitle = EditMode && !CloneMode ? AppResources.EditItem : AppResources.AddItem;
|
||||||
@@ -309,6 +317,8 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
public async Task<bool> LoadAsync(AppOptions appOptions = null)
|
public async Task<bool> LoadAsync(AppOptions appOptions = null)
|
||||||
{
|
{
|
||||||
|
_fromOtp = appOptions?.OtpData != null;
|
||||||
|
|
||||||
var myEmail = await _stateService.GetEmailAsync();
|
var myEmail = await _stateService.GetEmailAsync();
|
||||||
OwnershipOptions.Add(new KeyValuePair<string, string>(myEmail, null));
|
OwnershipOptions.Add(new KeyValuePair<string, string>(myEmail, null));
|
||||||
var orgs = await _organizationService.GetAllAsync();
|
var orgs = await _organizationService.GetAllAsync();
|
||||||
@@ -358,6 +368,10 @@ namespace Bit.App.Pages
|
|||||||
Cipher.OrganizationId = OrganizationId;
|
Cipher.OrganizationId = OrganizationId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (appOptions?.OtpData != null && Cipher.Type == CipherType.Login)
|
||||||
|
{
|
||||||
|
Cipher.Login.Totp = appOptions.OtpData.Value.Uri;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -380,6 +394,7 @@ namespace Bit.App.Pages
|
|||||||
Cipher.Type = appOptions.SaveType.GetValueOrDefault(Cipher.Type);
|
Cipher.Type = appOptions.SaveType.GetValueOrDefault(Cipher.Type);
|
||||||
Cipher.Login.Username = appOptions.SaveUsername;
|
Cipher.Login.Username = appOptions.SaveUsername;
|
||||||
Cipher.Login.Password = appOptions.SavePassword;
|
Cipher.Login.Password = appOptions.SavePassword;
|
||||||
|
Cipher.Login.Totp = appOptions.OtpData?.Uri;
|
||||||
Cipher.Card.Code = appOptions.SaveCardCode;
|
Cipher.Card.Code = appOptions.SaveCardCode;
|
||||||
if (int.TryParse(appOptions.SaveCardExpMonth, out int month) && month <= 12 && month >= 1)
|
if (int.TryParse(appOptions.SaveCardExpMonth, out int month) && month <= 12 && month >= 1)
|
||||||
{
|
{
|
||||||
@@ -424,6 +439,11 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
Fields.ResetWithRange(Cipher.Fields?.Select(f => _customFieldItemFactory.CreateCustomFieldItem(f, true, Cipher, null, null, FieldOptionsCommand)));
|
Fields.ResetWithRange(Cipher.Fields?.Select(f => _customFieldItemFactory.CreateCustomFieldItem(f, true, Cipher, null, null, FieldOptionsCommand)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (appOptions?.OtpData != null)
|
||||||
|
{
|
||||||
|
_platformUtilsService.ShowToast(null, AppResources.AuthenticatorKey, AppResources.AuthenticatorKeyAdded);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EditMode && _previousCipherId != CipherId)
|
if (EditMode && _previousCipherId != CipherId)
|
||||||
@@ -517,6 +537,10 @@ namespace Bit.App.Pages
|
|||||||
// Close and go back to app
|
// Close and go back to app
|
||||||
_autofillHandler.CloseAutofill();
|
_autofillHandler.CloseAutofill();
|
||||||
}
|
}
|
||||||
|
else if (_fromOtp)
|
||||||
|
{
|
||||||
|
await _accountsManager.StartDefaultNavigationFlowAsync(op => op.OtpData = null);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (CloneMode)
|
if (CloneMode)
|
||||||
|
|||||||
@@ -1,19 +1,15 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<pages:BaseContentPage xmlns="http://xamarin.com/schemas/2014/forms"
|
<pages:BaseContentPage 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.Pages.AutofillCiphersPage"
|
xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
|
||||||
|
x:Class="Bit.App.Pages.CipherSelectionPage"
|
||||||
xmlns:pages="clr-namespace:Bit.App.Pages"
|
xmlns:pages="clr-namespace:Bit.App.Pages"
|
||||||
xmlns:u="clr-namespace:Bit.App.Utilities"
|
xmlns:u="clr-namespace:Bit.App.Utilities"
|
||||||
xmlns:controls="clr-namespace:Bit.App.Controls"
|
xmlns:controls="clr-namespace:Bit.App.Controls"
|
||||||
xmlns:effects="clr-namespace:Bit.App.Effects;assembly=BitwardenApp"
|
xmlns:effects="clr-namespace:Bit.App.Effects;assembly=BitwardenApp"
|
||||||
x:DataType="pages:AutofillCiphersPageViewModel"
|
x:DataType="pages:CipherSelectionPageViewModel"
|
||||||
Title="{Binding PageTitle}"
|
Title="{Binding PageTitle}"
|
||||||
x:Name="_page">
|
x:Name="_page">
|
||||||
|
|
||||||
<ContentPage.BindingContext>
|
|
||||||
<pages:AutofillCiphersPageViewModel />
|
|
||||||
</ContentPage.BindingContext>
|
|
||||||
|
|
||||||
<ContentPage.ToolbarItems>
|
<ContentPage.ToolbarItems>
|
||||||
<controls:ExtendedToolbarItem
|
<controls:ExtendedToolbarItem
|
||||||
x:Name="_accountAvatar"
|
x:Name="_accountAvatar"
|
||||||
@@ -24,7 +20,7 @@
|
|||||||
UseOriginalImage="True"
|
UseOriginalImage="True"
|
||||||
AutomationProperties.IsInAccessibleTree="True"
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
AutomationProperties.Name="{u:I18n Account}" />
|
AutomationProperties.Name="{u:I18n Account}" />
|
||||||
<ToolbarItem Icon="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}" />
|
||||||
</ContentPage.ToolbarItems>
|
</ContentPage.ToolbarItems>
|
||||||
@@ -32,6 +28,21 @@
|
|||||||
<ContentPage.Resources>
|
<ContentPage.Resources>
|
||||||
<ResourceDictionary>
|
<ResourceDictionary>
|
||||||
<u:InverseBoolConverter x:Key="inverseBool" />
|
<u:InverseBoolConverter x:Key="inverseBool" />
|
||||||
|
<controls:SelectionChangedEventArgsConverter x:Key="SelectionChangedEventArgsConverter" />
|
||||||
|
|
||||||
|
<ToolbarItem
|
||||||
|
x:Name="_closeItem"
|
||||||
|
x:Key="_closeItem"
|
||||||
|
Text="{u:I18n Close}"
|
||||||
|
Clicked="CloseItem_Clicked"
|
||||||
|
Order="Primary"
|
||||||
|
Priority="-1" />
|
||||||
|
<ToolbarItem x:Name="_addItem" x:Key="addItem"
|
||||||
|
IconImageSource="plus.png"
|
||||||
|
Command="{Binding AddCipherCommand}"
|
||||||
|
Order="Primary"
|
||||||
|
AutomationProperties.IsInAccessibleTree="True"
|
||||||
|
AutomationProperties.Name="{u:I18n AddItem}" />
|
||||||
|
|
||||||
<DataTemplate x:Key="cipherTemplate"
|
<DataTemplate x:Key="cipherTemplate"
|
||||||
x:DataType="pages:GroupingsPageListItem">
|
x:DataType="pages:GroupingsPageListItem">
|
||||||
@@ -70,23 +81,44 @@
|
|||||||
Padding="20, 0"
|
Padding="20, 0"
|
||||||
Spacing="20"
|
Spacing="20"
|
||||||
IsVisible="{Binding ShowNoData}">
|
IsVisible="{Binding ShowNoData}">
|
||||||
|
<Image
|
||||||
|
Source="empty_items_state" />
|
||||||
<Label
|
<Label
|
||||||
Text="{Binding NoDataText}"
|
Text="{Binding NoDataText}"
|
||||||
HorizontalTextAlignment="Center"></Label>
|
HorizontalTextAlignment="Center"></Label>
|
||||||
<Button
|
<Button
|
||||||
Text="{u:I18n AddAnItem}"
|
Text="{u:I18n AddAnItem}"
|
||||||
Clicked="AddButton_Clicked"></Button>
|
Command="{Binding AddCipherCommand}" />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
|
|
||||||
|
<Frame
|
||||||
|
IsVisible="{Binding ShowCallout}"
|
||||||
|
Padding="10"
|
||||||
|
Margin="20, 10"
|
||||||
|
HasShadow="False"
|
||||||
|
BackgroundColor="Transparent"
|
||||||
|
BorderColor="{DynamicResource PrimaryColor}">
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n AddTheKeyToAnExistingOrNewItem}"
|
||||||
|
StyleClass="text-muted, text-sm, text-bold"
|
||||||
|
HorizontalTextAlignment="Center" />
|
||||||
|
</Frame>
|
||||||
|
|
||||||
<controls:ExtendedCollectionView
|
<controls:ExtendedCollectionView
|
||||||
IsVisible="{Binding ShowList}"
|
IsVisible="{Binding ShowList}"
|
||||||
ItemsSource="{Binding GroupedItems}"
|
ItemsSource="{Binding GroupedItems}"
|
||||||
VerticalOptions="FillAndExpand"
|
VerticalOptions="FillAndExpand"
|
||||||
ItemTemplate="{StaticResource listItemDataTemplateSelector}"
|
ItemTemplate="{StaticResource listItemDataTemplateSelector}"
|
||||||
SelectionMode="Single"
|
SelectionMode="Single"
|
||||||
SelectionChanged="RowSelected"
|
|
||||||
StyleClass="list, list-platform"
|
StyleClass="list, list-platform"
|
||||||
ExtraDataForLogging="Autofill Ciphers Page" />
|
ExtraDataForLogging="Autofill Ciphers Page">
|
||||||
|
<controls:ExtendedCollectionView.Behaviors>
|
||||||
|
<xct:EventToCommandBehavior
|
||||||
|
EventName="SelectionChanged"
|
||||||
|
Command="{Binding SelectCipherCommand}"
|
||||||
|
EventArgsConverter="{StaticResource SelectionChangedEventArgsConverter}" />
|
||||||
|
</controls:ExtendedCollectionView.Behaviors>
|
||||||
|
</controls:ExtendedCollectionView>
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
</ContentPage.Resources>
|
</ContentPage.Resources>
|
||||||
@@ -104,9 +136,10 @@
|
|||||||
<!-- Android FAB -->
|
<!-- Android FAB -->
|
||||||
<Button
|
<Button
|
||||||
x:Name="_fab"
|
x:Name="_fab"
|
||||||
Image="plus.png"
|
ImageSource="plus.png"
|
||||||
Clicked="AddButton_Clicked"
|
Command="{Binding AddCipherCommand}"
|
||||||
Style="{StaticResource btn-fab}"
|
Style="{StaticResource btn-fab}"
|
||||||
|
IsVisible="{OnPlatform iOS=false, Android=true}"
|
||||||
AbsoluteLayout.LayoutFlags="PositionProportional"
|
AbsoluteLayout.LayoutFlags="PositionProportional"
|
||||||
AbsoluteLayout.LayoutBounds="1, 1, AutoSize, AutoSize">
|
AbsoluteLayout.LayoutBounds="1, 1, AutoSize, AutoSize">
|
||||||
<Button.Effects>
|
<Button.Effects>
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Bit.App.Controls;
|
using Bit.App.Abstractions;
|
||||||
using Bit.App.Models;
|
using Bit.App.Models;
|
||||||
using Bit.App.Utilities;
|
using Bit.App.Utilities;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
@@ -12,27 +11,46 @@ using Xamarin.Forms;
|
|||||||
|
|
||||||
namespace Bit.App.Pages
|
namespace Bit.App.Pages
|
||||||
{
|
{
|
||||||
public partial class AutofillCiphersPage : BaseContentPage
|
public partial class CipherSelectionPage : BaseContentPage
|
||||||
{
|
{
|
||||||
private readonly AppOptions _appOptions;
|
private readonly AppOptions _appOptions;
|
||||||
private readonly IBroadcasterService _broadcasterService;
|
private readonly IBroadcasterService _broadcasterService;
|
||||||
private readonly ISyncService _syncService;
|
private readonly ISyncService _syncService;
|
||||||
private readonly IVaultTimeoutService _vaultTimeoutService;
|
private readonly IVaultTimeoutService _vaultTimeoutService;
|
||||||
|
private readonly IAccountsManager _accountsManager;
|
||||||
|
|
||||||
private AutofillCiphersPageViewModel _vm;
|
private readonly CipherSelectionPageViewModel _vm;
|
||||||
|
|
||||||
public AutofillCiphersPage(AppOptions appOptions)
|
public CipherSelectionPage(AppOptions appOptions)
|
||||||
{
|
{
|
||||||
_appOptions = appOptions;
|
_appOptions = appOptions;
|
||||||
|
|
||||||
|
if (appOptions?.OtpData is null)
|
||||||
|
{
|
||||||
|
BindingContext = new AutofillCiphersPageViewModel();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BindingContext = new OTPCipherSelectionPageViewModel();
|
||||||
|
}
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
if (Device.RuntimePlatform == Device.iOS)
|
||||||
|
{
|
||||||
|
ToolbarItems.Add(_closeItem);
|
||||||
|
ToolbarItems.Add(_addItem);
|
||||||
|
}
|
||||||
|
|
||||||
SetActivityIndicator(_mainContent);
|
SetActivityIndicator(_mainContent);
|
||||||
_vm = BindingContext as AutofillCiphersPageViewModel;
|
_vm = BindingContext as CipherSelectionPageViewModel;
|
||||||
_vm.Page = this;
|
_vm.Page = this;
|
||||||
_vm.Init(appOptions);
|
_vm.Init(appOptions);
|
||||||
|
|
||||||
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
|
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
|
||||||
_syncService = ServiceContainer.Resolve<ISyncService>("syncService");
|
_syncService = ServiceContainer.Resolve<ISyncService>("syncService");
|
||||||
_vaultTimeoutService = ServiceContainer.Resolve<IVaultTimeoutService>("vaultTimeoutService");
|
_vaultTimeoutService = ServiceContainer.Resolve<IVaultTimeoutService>("vaultTimeoutService");
|
||||||
|
_accountsManager = ServiceContainer.Resolve<IAccountsManager>();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async override void OnAppearing()
|
protected async override void OnAppearing()
|
||||||
@@ -51,10 +69,18 @@ namespace Bit.App.Pages
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// don't crash the app if the avatar can't be loaded, just log the ex
|
||||||
_accountAvatar?.OnAppearing();
|
_accountAvatar?.OnAppearing();
|
||||||
_vm.AvatarImageSource = await GetAvatarImageSourceAsync();
|
_vm.AvatarImageSource = await GetAvatarImageSourceAsync();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LoggerHelper.LogEvenIfCantBeResolved(ex);
|
||||||
|
}
|
||||||
|
|
||||||
_broadcasterService.Subscribe(nameof(AutofillCiphersPage), async (message) =>
|
_broadcasterService.Subscribe(nameof(CipherSelectionPage), async (message) =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -116,40 +142,44 @@ namespace Bit.App.Pages
|
|||||||
_accountAvatar?.OnDisappearing();
|
_accountAvatar?.OnDisappearing();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void RowSelected(object sender, SelectionChangedEventArgs e)
|
private void AddButton_Clicked(object sender, System.EventArgs e)
|
||||||
{
|
{
|
||||||
((ExtendedCollectionView)sender).SelectedItem = null;
|
|
||||||
if (!DoOnce())
|
if (!DoOnce())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (e.CurrentSelection?.FirstOrDefault() is GroupingsPageListItem item && item.Cipher != null)
|
|
||||||
|
if (_vm is AutofillCiphersPageViewModel autofillVM)
|
||||||
{
|
{
|
||||||
await _vm.SelectCipherAsync(item.Cipher, item.FuzzyAutofill);
|
AddFromAutofill(autofillVM).FireAndForget();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void AddButton_Clicked(object sender, System.EventArgs e)
|
private async Task AddFromAutofill(AutofillCiphersPageViewModel autofillVM)
|
||||||
{
|
{
|
||||||
if (!DoOnce())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (_appOptions.FillType.HasValue && _appOptions.FillType != CipherType.Login)
|
if (_appOptions.FillType.HasValue && _appOptions.FillType != CipherType.Login)
|
||||||
{
|
{
|
||||||
var pageForOther = new CipherAddEditPage(type: _appOptions.FillType, fromAutofill: true);
|
var pageForOther = new CipherAddEditPage(type: _appOptions.FillType, fromAutofill: true);
|
||||||
await Navigation.PushModalAsync(new NavigationPage(pageForOther));
|
await Navigation.PushModalAsync(new NavigationPage(pageForOther));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var pageForLogin = new CipherAddEditPage(null, CipherType.Login, uri: _vm.Uri, name: _vm.Name,
|
var pageForLogin = new CipherAddEditPage(null, CipherType.Login, uri: autofillVM.Uri, name: _vm.Name,
|
||||||
fromAutofill: true);
|
fromAutofill: true);
|
||||||
await Navigation.PushModalAsync(new NavigationPage(pageForLogin));
|
await Navigation.PushModalAsync(new NavigationPage(pageForLogin));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Search_Clicked(object sender, System.EventArgs e)
|
private void Search_Clicked(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var page = new CiphersPage(null, autofillUrl: _vm.Uri);
|
var page = new CiphersPage(null, appOptions: _appOptions);
|
||||||
Application.Current.MainPage = new NavigationPage(page);
|
Navigation.PushModalAsync(new NavigationPage(page)).FireAndForget();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloseItem_Clicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (DoOnce())
|
||||||
|
{
|
||||||
|
_accountsManager.StartDefaultNavigationFlowAsync(op => op.OtpData = null).FireAndForget();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
167
src/App/Pages/Vault/CipherSelectionPageViewModel.cs
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using Bit.App.Abstractions;
|
||||||
|
using Bit.App.Controls;
|
||||||
|
using Bit.App.Models;
|
||||||
|
using Bit.App.Resources;
|
||||||
|
using Bit.App.Utilities;
|
||||||
|
using Bit.Core;
|
||||||
|
using Bit.Core.Abstractions;
|
||||||
|
using Bit.Core.Models.View;
|
||||||
|
using Bit.Core.Utilities;
|
||||||
|
using Xamarin.CommunityToolkit.ObjectModel;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Bit.App.Pages
|
||||||
|
{
|
||||||
|
public abstract class CipherSelectionPageViewModel : BaseViewModel
|
||||||
|
{
|
||||||
|
protected readonly IPlatformUtilsService _platformUtilsService;
|
||||||
|
protected readonly IDeviceActionService _deviceActionService;
|
||||||
|
protected readonly IAutofillHandler _autofillHandler;
|
||||||
|
protected readonly ICipherService _cipherService;
|
||||||
|
protected readonly IStateService _stateService;
|
||||||
|
protected readonly IPasswordRepromptService _passwordRepromptService;
|
||||||
|
protected readonly IMessagingService _messagingService;
|
||||||
|
protected readonly ILogger _logger;
|
||||||
|
|
||||||
|
protected bool _showNoData;
|
||||||
|
protected bool _showList;
|
||||||
|
protected string _noDataText;
|
||||||
|
protected bool _websiteIconsEnabled;
|
||||||
|
|
||||||
|
public CipherSelectionPageViewModel()
|
||||||
|
{
|
||||||
|
_platformUtilsService = ServiceContainer.Resolve<IPlatformUtilsService>();
|
||||||
|
_cipherService = ServiceContainer.Resolve<ICipherService>();
|
||||||
|
_deviceActionService = ServiceContainer.Resolve<IDeviceActionService>();
|
||||||
|
_autofillHandler = ServiceContainer.Resolve<IAutofillHandler>();
|
||||||
|
_stateService = ServiceContainer.Resolve<IStateService>();
|
||||||
|
_passwordRepromptService = ServiceContainer.Resolve<IPasswordRepromptService>();
|
||||||
|
_messagingService = ServiceContainer.Resolve<IMessagingService>();
|
||||||
|
_logger = ServiceContainer.Resolve<ILogger>();
|
||||||
|
|
||||||
|
GroupedItems = new ObservableRangeCollection<IGroupingsPageListItem>();
|
||||||
|
CipherOptionsCommand = new AsyncCommand<CipherView>(cipher => AppHelpers.CipherListOptions(Page, cipher, _passwordRepromptService),
|
||||||
|
onException: ex => HandleException(ex),
|
||||||
|
allowsMultipleExecutions: false);
|
||||||
|
SelectCipherCommand = new AsyncCommand<IGroupingsPageListItem>(SelectCipherAsync,
|
||||||
|
onException: ex => HandleException(ex),
|
||||||
|
allowsMultipleExecutions: false);
|
||||||
|
AddCipherCommand = new AsyncCommand(AddCipherAsync,
|
||||||
|
onException: ex => HandleException(ex),
|
||||||
|
allowsMultipleExecutions: false);
|
||||||
|
|
||||||
|
AccountSwitchingOverlayViewModel = new AccountSwitchingOverlayViewModel(_stateService, _messagingService, _logger)
|
||||||
|
{
|
||||||
|
AllowAddAccountRow = false
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name { get; set; }
|
||||||
|
public bool LoadedOnce { get; set; }
|
||||||
|
public ObservableRangeCollection<IGroupingsPageListItem> GroupedItems { get; set; }
|
||||||
|
public AccountSwitchingOverlayViewModel AccountSwitchingOverlayViewModel { get; }
|
||||||
|
|
||||||
|
public ICommand CipherOptionsCommand { get; set; }
|
||||||
|
public ICommand SelectCipherCommand { get; set; }
|
||||||
|
public ICommand AddCipherCommand { get; set; }
|
||||||
|
|
||||||
|
public bool ShowNoData
|
||||||
|
{
|
||||||
|
get => _showNoData;
|
||||||
|
set => SetProperty(ref _showNoData, value, additionalPropertyNames: new string[] { nameof(ShowCallout) });
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ShowList
|
||||||
|
{
|
||||||
|
get => _showList;
|
||||||
|
set => SetProperty(ref _showList, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string NoDataText
|
||||||
|
{
|
||||||
|
get => _noDataText;
|
||||||
|
set => SetProperty(ref _noDataText, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool WebsiteIconsEnabled
|
||||||
|
{
|
||||||
|
get => _websiteIconsEnabled;
|
||||||
|
set => SetProperty(ref _websiteIconsEnabled, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual bool ShowCallout => false;
|
||||||
|
|
||||||
|
public abstract void Init(Models.AppOptions options);
|
||||||
|
|
||||||
|
public async Task LoadAsync()
|
||||||
|
{
|
||||||
|
LoadedOnce = true;
|
||||||
|
ShowList = false;
|
||||||
|
ShowNoData = false;
|
||||||
|
WebsiteIconsEnabled = !(await _stateService.GetDisableFaviconAsync()).GetValueOrDefault();
|
||||||
|
|
||||||
|
var groupedItems = await LoadGroupedItemsAsync();
|
||||||
|
|
||||||
|
// TODO: refactor this
|
||||||
|
if (Device.RuntimePlatform == Device.Android
|
||||||
|
||
|
||||||
|
GroupedItems.Any())
|
||||||
|
{
|
||||||
|
var items = new List<IGroupingsPageListItem>();
|
||||||
|
foreach (var itemGroup in groupedItems)
|
||||||
|
{
|
||||||
|
items.Add(new GroupingsPageHeaderListItem(itemGroup.Name, itemGroup.ItemCount));
|
||||||
|
items.AddRange(itemGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
GroupedItems.ReplaceRange(items);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// HACK: we need this on iOS, so that it doesn't crash when adding coming from an empty list
|
||||||
|
var first = true;
|
||||||
|
var items = new List<IGroupingsPageListItem>();
|
||||||
|
foreach (var itemGroup in groupedItems)
|
||||||
|
{
|
||||||
|
if (!first)
|
||||||
|
{
|
||||||
|
items.Add(new GroupingsPageHeaderListItem(itemGroup.Name, itemGroup.ItemCount));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
items.AddRange(itemGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
await Device.InvokeOnMainThreadAsync(() =>
|
||||||
|
{
|
||||||
|
if (groupedItems.Any())
|
||||||
|
{
|
||||||
|
GroupedItems.ReplaceRange(new List<IGroupingsPageListItem> { new GroupingsPageHeaderListItem(groupedItems[0].Name, groupedItems[0].ItemCount) });
|
||||||
|
GroupedItems.AddRange(items);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GroupedItems.Clear();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
await Device.InvokeOnMainThreadAsync(() =>
|
||||||
|
{
|
||||||
|
ShowList = groupedItems.Any();
|
||||||
|
ShowNoData = !ShowList;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract Task<List<GroupingsPageListGroup>> LoadGroupedItemsAsync();
|
||||||
|
|
||||||
|
protected abstract Task SelectCipherAsync(IGroupingsPageListItem item);
|
||||||
|
|
||||||
|
protected abstract Task AddCipherAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -81,12 +81,22 @@
|
|||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
HorizontalOptions="CenterAndExpand"
|
HorizontalOptions="CenterAndExpand"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center" />
|
||||||
<Label IsVisible="{Binding ShowNoData}"
|
<StackLayout
|
||||||
Text="{u:I18n NoItemsToList}"
|
HorizontalOptions="Center"
|
||||||
Margin="20, 0"
|
VerticalOptions="StartAndExpand"
|
||||||
VerticalOptions="CenterAndExpand"
|
Margin="20, 80, 20, 0"
|
||||||
HorizontalOptions="CenterAndExpand"
|
Spacing="20"
|
||||||
|
IsVisible="{Binding ShowNoData}">
|
||||||
|
<Image
|
||||||
|
Source="empty_items_state" />
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n ThereAreNoItemsThatMatchTheSearch}"
|
||||||
HorizontalTextAlignment="Center" />
|
HorizontalTextAlignment="Center" />
|
||||||
|
<Button
|
||||||
|
Text="{u:I18n AddAnItem}"
|
||||||
|
Command="{Binding AddCipherCommand}"
|
||||||
|
IsVisible="{Binding ShowAddCipher}"/>
|
||||||
|
</StackLayout>
|
||||||
<controls:ExtendedCollectionView
|
<controls:ExtendedCollectionView
|
||||||
IsVisible="{Binding ShowList}"
|
IsVisible="{Binding ShowList}"
|
||||||
ItemsSource="{Binding Ciphers}"
|
ItemsSource="{Binding Ciphers}"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Bit.App.Controls;
|
using Bit.App.Controls;
|
||||||
|
using Bit.App.Models;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.Core.Models.View;
|
using Bit.Core.Models.View;
|
||||||
@@ -17,15 +18,18 @@ namespace Bit.App.Pages
|
|||||||
private CiphersPageViewModel _vm;
|
private CiphersPageViewModel _vm;
|
||||||
private bool _hasFocused;
|
private bool _hasFocused;
|
||||||
|
|
||||||
public CiphersPage(Func<CipherView, bool> filter, string pageTitle = null, string vaultFilterSelection = null,
|
public CiphersPage(Func<CipherView, bool> filter,
|
||||||
string autofillUrl = null, bool deleted = false)
|
string pageTitle = null,
|
||||||
|
string vaultFilterSelection = null,
|
||||||
|
bool deleted = false,
|
||||||
|
AppOptions appOptions = null)
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
_vm = BindingContext as CiphersPageViewModel;
|
_vm = BindingContext as CiphersPageViewModel;
|
||||||
_vm.Page = this;
|
_vm.Page = this;
|
||||||
_vm.Filter = filter;
|
_autofillUrl = appOptions?.Uri;
|
||||||
_vm.AutofillUrl = _autofillUrl = autofillUrl;
|
_vm.Prepare(filter, deleted, appOptions);
|
||||||
_vm.Deleted = deleted;
|
|
||||||
if (pageTitle != null)
|
if (pageTitle != null)
|
||||||
{
|
{
|
||||||
_vm.PageTitle = string.Format(AppResources.SearchGroup, pageTitle);
|
_vm.PageTitle = string.Format(AppResources.SearchGroup, pageTitle);
|
||||||
|
|||||||
@@ -3,13 +3,16 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Input;
|
||||||
using Bit.App.Abstractions;
|
using Bit.App.Abstractions;
|
||||||
|
using Bit.App.Models;
|
||||||
using Bit.App.Resources;
|
using Bit.App.Resources;
|
||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Exceptions;
|
using Bit.Core.Exceptions;
|
||||||
using Bit.Core.Models.View;
|
using Bit.Core.Models.View;
|
||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
|
using Xamarin.CommunityToolkit.ObjectModel;
|
||||||
using Xamarin.Forms;
|
using Xamarin.Forms;
|
||||||
|
|
||||||
namespace Bit.App.Pages
|
namespace Bit.App.Pages
|
||||||
@@ -31,6 +34,7 @@ namespace Bit.App.Pages
|
|||||||
private bool _showNoData;
|
private bool _showNoData;
|
||||||
private bool _showList;
|
private bool _showList;
|
||||||
private bool _websiteIconsEnabled;
|
private bool _websiteIconsEnabled;
|
||||||
|
private AppOptions _appOptions;
|
||||||
|
|
||||||
public CiphersPageViewModel()
|
public CiphersPageViewModel()
|
||||||
{
|
{
|
||||||
@@ -46,14 +50,21 @@ namespace Bit.App.Pages
|
|||||||
_logger = ServiceContainer.Resolve<ILogger>("logger");
|
_logger = ServiceContainer.Resolve<ILogger>("logger");
|
||||||
|
|
||||||
Ciphers = new ExtendedObservableCollection<CipherView>();
|
Ciphers = new ExtendedObservableCollection<CipherView>();
|
||||||
CipherOptionsCommand = new Command<CipherView>(CipherOptionsAsync);
|
CipherOptionsCommand = new AsyncCommand<CipherView>(cipher => Utilities.AppHelpers.CipherListOptions(Page, cipher, _passwordRepromptService),
|
||||||
|
onException: ex => HandleException(ex),
|
||||||
|
allowsMultipleExecutions: false);
|
||||||
|
AddCipherCommand = new AsyncCommand(AddCipherAsync,
|
||||||
|
onException: ex => HandleException(ex),
|
||||||
|
allowsMultipleExecutions: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Command CipherOptionsCommand { get; set; }
|
public ICommand CipherOptionsCommand { get; }
|
||||||
|
public ICommand AddCipherCommand { get; }
|
||||||
public ExtendedObservableCollection<CipherView> Ciphers { get; set; }
|
public ExtendedObservableCollection<CipherView> Ciphers { get; set; }
|
||||||
public Func<CipherView, bool> Filter { get; set; }
|
public Func<CipherView, bool> Filter { get; set; }
|
||||||
public string AutofillUrl { get; set; }
|
public string AutofillUrl { get; set; }
|
||||||
public bool Deleted { get; set; }
|
public bool Deleted { get; set; }
|
||||||
|
public bool ShowAllIfSearchTextEmpty { get; set; }
|
||||||
|
|
||||||
protected override ICipherService cipherService => _cipherService;
|
protected override ICipherService cipherService => _cipherService;
|
||||||
protected override IPolicyService policyService => _policyService;
|
protected override IPolicyService policyService => _policyService;
|
||||||
@@ -65,7 +76,8 @@ namespace Bit.App.Pages
|
|||||||
get => _showNoData;
|
get => _showNoData;
|
||||||
set => SetProperty(ref _showNoData, value, additionalPropertyNames: new string[]
|
set => SetProperty(ref _showNoData, value, additionalPropertyNames: new string[]
|
||||||
{
|
{
|
||||||
nameof(ShowSearchDirection)
|
nameof(ShowSearchDirection),
|
||||||
|
nameof(ShowAddCipher)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,12 +92,23 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
public bool ShowSearchDirection => !ShowList && !ShowNoData;
|
public bool ShowSearchDirection => !ShowList && !ShowNoData;
|
||||||
|
|
||||||
|
public bool ShowAddCipher => ShowNoData && _appOptions?.OtpData != null;
|
||||||
|
|
||||||
public bool WebsiteIconsEnabled
|
public bool WebsiteIconsEnabled
|
||||||
{
|
{
|
||||||
get => _websiteIconsEnabled;
|
get => _websiteIconsEnabled;
|
||||||
set => SetProperty(ref _websiteIconsEnabled, value);
|
set => SetProperty(ref _websiteIconsEnabled, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void Prepare(Func<CipherView, bool> filter, bool deleted, AppOptions appOptions)
|
||||||
|
{
|
||||||
|
Filter = filter;
|
||||||
|
AutofillUrl = appOptions?.Uri;
|
||||||
|
Deleted = deleted;
|
||||||
|
ShowAllIfSearchTextEmpty = appOptions?.OtpData != null;
|
||||||
|
_appOptions = appOptions;
|
||||||
|
}
|
||||||
|
|
||||||
public async Task InitAsync()
|
public async Task InitAsync()
|
||||||
{
|
{
|
||||||
await InitVaultFilterAsync(true);
|
await InitVaultFilterAsync(true);
|
||||||
@@ -101,25 +124,33 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
List<CipherView> ciphers = null;
|
List<CipherView> ciphers = null;
|
||||||
var searchable = !string.IsNullOrWhiteSpace(searchText) && searchText.Length > 1;
|
var searchable = !string.IsNullOrWhiteSpace(searchText) && searchText.Length > 1;
|
||||||
if (searchable)
|
var shouldShowAllWhenEmpty = ShowAllIfSearchTextEmpty && string.IsNullOrEmpty(searchText);
|
||||||
|
if (searchable || shouldShowAllWhenEmpty)
|
||||||
{
|
{
|
||||||
if (timeout != null)
|
if (timeout != null)
|
||||||
{
|
{
|
||||||
await Task.Delay(timeout.Value);
|
await Task.Delay(timeout.Value);
|
||||||
}
|
}
|
||||||
if (searchText != (Page as CiphersPage).SearchBar.Text)
|
if (searchText != (Page as CiphersPage).SearchBar.Text
|
||||||
|
&&
|
||||||
|
!shouldShowAllWhenEmpty)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
previousCts?.Cancel();
|
previousCts?.Cancel();
|
||||||
}
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var vaultFilteredCiphers = await GetAllCiphersAsync();
|
var vaultFilteredCiphers = await GetAllCiphersAsync();
|
||||||
|
if (!shouldShowAllWhenEmpty)
|
||||||
|
{
|
||||||
ciphers = await _searchService.SearchCiphersAsync(searchText,
|
ciphers = await _searchService.SearchCiphersAsync(searchText,
|
||||||
Filter ?? (c => c.IsDeleted == Deleted), vaultFilteredCiphers, cts.Token);
|
Filter ?? (c => c.IsDeleted == Deleted), vaultFilteredCiphers, cts.Token);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ciphers = vaultFilteredCiphers;
|
||||||
|
}
|
||||||
cts.Token.ThrowIfCancellationRequested();
|
cts.Token.ThrowIfCancellationRequested();
|
||||||
}
|
}
|
||||||
catch (OperationCanceledException)
|
catch (OperationCanceledException)
|
||||||
@@ -134,8 +165,8 @@ namespace Bit.App.Pages
|
|||||||
Device.BeginInvokeOnMainThread(() =>
|
Device.BeginInvokeOnMainThread(() =>
|
||||||
{
|
{
|
||||||
Ciphers.ResetWithRange(ciphers);
|
Ciphers.ResetWithRange(ciphers);
|
||||||
ShowNoData = searchable && Ciphers.Count == 0;
|
ShowNoData = !shouldShowAllWhenEmpty && searchable && Ciphers.Count == 0;
|
||||||
ShowList = searchable && !ShowNoData;
|
ShowList = (searchable || shouldShowAllWhenEmpty) && !ShowNoData;
|
||||||
});
|
});
|
||||||
}, cts.Token);
|
}, cts.Token);
|
||||||
_searchCancellationTokenSource = cts;
|
_searchCancellationTokenSource = cts;
|
||||||
@@ -144,6 +175,7 @@ namespace Bit.App.Pages
|
|||||||
public async Task SelectCipherAsync(CipherView cipher)
|
public async Task SelectCipherAsync(CipherView cipher)
|
||||||
{
|
{
|
||||||
string selection = null;
|
string selection = null;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(AutofillUrl))
|
if (!string.IsNullOrWhiteSpace(AutofillUrl))
|
||||||
{
|
{
|
||||||
var options = new List<string> { AppResources.Autofill };
|
var options = new List<string> { AppResources.Autofill };
|
||||||
@@ -156,6 +188,19 @@ namespace Bit.App.Pages
|
|||||||
selection = await Page.DisplayActionSheet(AppResources.AutofillOrView, AppResources.Cancel, null,
|
selection = await Page.DisplayActionSheet(AppResources.AutofillOrView, AppResources.Cancel, null,
|
||||||
options.ToArray());
|
options.ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_appOptions?.OtpData != null)
|
||||||
|
{
|
||||||
|
if (cipher.Reprompt != CipherRepromptType.None && !await _passwordRepromptService.ShowPasswordPromptAsync())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var editCipherPage = new CipherAddEditPage(cipher.Id, appOptions: _appOptions);
|
||||||
|
await Page.Navigation.PushModalAsync(new NavigationPage(editCipherPage));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (selection == AppResources.View || string.IsNullOrWhiteSpace(AutofillUrl))
|
if (selection == AppResources.View || string.IsNullOrWhiteSpace(AutofillUrl))
|
||||||
{
|
{
|
||||||
var page = new CipherDetailsPage(cipher.Id);
|
var page = new CipherDetailsPage(cipher.Id);
|
||||||
@@ -205,7 +250,7 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
private void PerformSearchIfPopulated()
|
private void PerformSearchIfPopulated()
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrWhiteSpace((Page as CiphersPage).SearchBar.Text))
|
if (!string.IsNullOrWhiteSpace((Page as CiphersPage).SearchBar.Text) || ShowAllIfSearchTextEmpty)
|
||||||
{
|
{
|
||||||
Search((Page as CiphersPage).SearchBar.Text, 200);
|
Search((Page as CiphersPage).SearchBar.Text, 200);
|
||||||
}
|
}
|
||||||
@@ -216,12 +261,10 @@ namespace Bit.App.Pages
|
|||||||
PerformSearchIfPopulated();
|
PerformSearchIfPopulated();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void CipherOptionsAsync(CipherView cipher)
|
private async Task AddCipherAsync()
|
||||||
{
|
{
|
||||||
if ((Page as BaseContentPage).DoOnce())
|
var pageForLogin = new CipherAddEditPage(null, CipherType.Login, name: _appOptions?.OtpData?.Issuer ?? _appOptions?.OtpData?.AccountName, appOptions: _appOptions);
|
||||||
{
|
await Page.Navigation.PushModalAsync(new NavigationPage(pageForLogin));
|
||||||
await Utilities.AppHelpers.CipherListOptions(Page, cipher, _passwordRepromptService);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,9 @@ namespace Bit.App.Pages
|
|||||||
Refreshing = true;
|
Refreshing = true;
|
||||||
await LoadAsync();
|
await LoadAsync();
|
||||||
});
|
});
|
||||||
CipherOptionsCommand = new Command<CipherView>(CipherOptionsAsync);
|
CipherOptionsCommand = new AsyncCommand<CipherView>(cipher => AppHelpers.CipherListOptions(Page, cipher, _passwordRepromptService),
|
||||||
|
onException: ex => _logger.Exception(ex),
|
||||||
|
allowsMultipleExecutions: false);
|
||||||
VaultFilterCommand = new AsyncCommand(VaultFilterOptionsAsync,
|
VaultFilterCommand = new AsyncCommand(VaultFilterOptionsAsync,
|
||||||
onException: ex => _logger.Exception(ex),
|
onException: ex => _logger.Exception(ex),
|
||||||
allowsMultipleExecutions: false);
|
allowsMultipleExecutions: false);
|
||||||
@@ -168,7 +170,7 @@ namespace Bit.App.Pages
|
|||||||
public AccountSwitchingOverlayViewModel AccountSwitchingOverlayViewModel { get; }
|
public AccountSwitchingOverlayViewModel AccountSwitchingOverlayViewModel { get; }
|
||||||
public ObservableRangeCollection<IGroupingsPageListItem> GroupedItems { get; set; }
|
public ObservableRangeCollection<IGroupingsPageListItem> GroupedItems { get; set; }
|
||||||
public Command RefreshCommand { get; set; }
|
public Command RefreshCommand { get; set; }
|
||||||
public Command<CipherView> CipherOptionsCommand { get; set; }
|
public ICommand CipherOptionsCommand { get; }
|
||||||
public bool LoadedOnce { get; set; }
|
public bool LoadedOnce { get; set; }
|
||||||
|
|
||||||
public async Task LoadAsync()
|
public async Task LoadAsync()
|
||||||
@@ -709,13 +711,5 @@ namespace Bit.App.Pages
|
|||||||
var folders = decFolders.Where(f => _allCiphers.Any(c => c.FolderId == f.Id)).ToList();
|
var folders = decFolders.Where(f => _allCiphers.Any(c => c.FolderId == f.Id)).ToList();
|
||||||
return folders.Any() ? folders : null;
|
return folders.Any() ? folders : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void CipherOptionsAsync(CipherView cipher)
|
|
||||||
{
|
|
||||||
if ((Page as BaseContentPage).DoOnce())
|
|
||||||
{
|
|
||||||
await AppHelpers.CipherListOptions(Page, cipher, _passwordRepromptService);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
79
src/App/Pages/Vault/OTPCipherSelectionPageViewModel.cs
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Bit.App.Resources;
|
||||||
|
using Bit.Core.Abstractions;
|
||||||
|
using Bit.Core.Enums;
|
||||||
|
using Bit.Core.Utilities;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
|
||||||
|
namespace Bit.App.Pages
|
||||||
|
{
|
||||||
|
public class OTPCipherSelectionPageViewModel : CipherSelectionPageViewModel
|
||||||
|
{
|
||||||
|
private readonly ISearchService _searchService = ServiceContainer.Resolve<ISearchService>();
|
||||||
|
|
||||||
|
private OtpData _otpData;
|
||||||
|
private Models.AppOptions _appOptions;
|
||||||
|
|
||||||
|
public override bool ShowCallout => !ShowNoData;
|
||||||
|
|
||||||
|
public override void Init(Models.AppOptions options)
|
||||||
|
{
|
||||||
|
_appOptions = options;
|
||||||
|
_otpData = options.OtpData.Value;
|
||||||
|
|
||||||
|
Name = _otpData.Issuer ?? _otpData.AccountName;
|
||||||
|
PageTitle = string.Format(AppResources.ItemsForUri, Name ?? "--");
|
||||||
|
NoDataText = string.Format(AppResources.ThereAreNoItemsInYourVaultThatMatchX, Name ?? "--")
|
||||||
|
+ Environment.NewLine
|
||||||
|
+ AppResources.SearchForAnItemOrAddANewItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override async Task<List<GroupingsPageListGroup>> LoadGroupedItemsAsync()
|
||||||
|
{
|
||||||
|
var groupedItems = new List<GroupingsPageListGroup>();
|
||||||
|
var allCiphers = await _cipherService.GetAllDecryptedAsync();
|
||||||
|
var ciphers = await _searchService.SearchCiphersAsync(_otpData.Issuer ?? _otpData.AccountName,
|
||||||
|
c => c.Type == CipherType.Login && !c.IsDeleted, allCiphers);
|
||||||
|
|
||||||
|
if (ciphers?.Any() ?? false)
|
||||||
|
{
|
||||||
|
groupedItems.Add(
|
||||||
|
new GroupingsPageListGroup(ciphers.Select(c => new GroupingsPageListItem { Cipher = c }).ToList(),
|
||||||
|
AppResources.MatchingItems,
|
||||||
|
ciphers.Count,
|
||||||
|
false,
|
||||||
|
true));
|
||||||
|
}
|
||||||
|
|
||||||
|
return groupedItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override async Task SelectCipherAsync(IGroupingsPageListItem item)
|
||||||
|
{
|
||||||
|
if (!(item is GroupingsPageListItem listItem) || listItem.Cipher is null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var cipher = listItem.Cipher;
|
||||||
|
|
||||||
|
if (cipher.Reprompt != CipherRepromptType.None && !await _passwordRepromptService.ShowPasswordPromptAsync())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var editCipherPage = new CipherAddEditPage(cipher.Id, appOptions: _appOptions);
|
||||||
|
await Page.Navigation.PushModalAsync(new NavigationPage(editCipherPage));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override async Task AddCipherAsync()
|
||||||
|
{
|
||||||
|
var pageForLogin = new CipherAddEditPage(null, CipherType.Login, name: Name, appOptions: _appOptions);
|
||||||
|
await Page.Navigation.PushModalAsync(new NavigationPage(pageForLogin));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
206
src/App/Resources/AppResources.Designer.cs
generated
@@ -382,6 +382,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Add the key to an existing or new item.
|
||||||
|
/// </summary>
|
||||||
|
public static string AddTheKeyToAnExistingOrNewItem {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("AddTheKeyToAnExistingOrNewItem", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Add TOTP.
|
/// Looks up a localized string similar to Add TOTP.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -961,18 +970,18 @@ namespace Bit.App.Resources {
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Biometric unlock disabled pending verification of master password..
|
/// Looks up a localized string similar to Biometric unlock disabled pending verification of master password..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string BiometricInvalidated {
|
public static string AccountBiometricInvalidated {
|
||||||
get {
|
get {
|
||||||
return ResourceManager.GetString("BiometricInvalidated", resourceCulture);
|
return ResourceManager.GetString("AccountBiometricInvalidated", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Biometric unlock for autofill disabled pending verification of master password..
|
/// Looks up a localized string similar to Biometric unlock for autofill disabled pending verification of master password..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string BiometricInvalidatedExtension {
|
public static string AccountBiometricInvalidatedExtension {
|
||||||
get {
|
get {
|
||||||
return ResourceManager.GetString("BiometricInvalidatedExtension", resourceCulture);
|
return ResourceManager.GetString("AccountBiometricInvalidatedExtension", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1678,6 +1687,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Current master password.
|
||||||
|
/// </summary>
|
||||||
|
public static string CurrentMasterPassword {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("CurrentMasterPassword", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Custom.
|
/// Looks up a localized string similar to Custom.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1732,6 +1750,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>
|
||||||
@@ -1804,6 +1831,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Default (System).
|
||||||
|
/// </summary>
|
||||||
|
public static string DefaultSystem {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("DefaultSystem", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Default URI match detection.
|
/// Looks up a localized string similar to Default URI match detection.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2299,6 +2335,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>
|
||||||
@@ -3370,6 +3415,33 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Language.
|
||||||
|
/// </summary>
|
||||||
|
public static string Language {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Language", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Language change requires app restart.
|
||||||
|
/// </summary>
|
||||||
|
public static string LanguageChangeRequiresAppRestart {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("LanguageChangeRequiresAppRestart", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to The language has been changed to {0}. Please restart the app to see the change.
|
||||||
|
/// </summary>
|
||||||
|
public static string LanguageChangeXDescription {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("LanguageChangeXDescription", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Last name.
|
/// Looks up a localized string similar to Last name.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -3515,11 +3587,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3670,7 +3742,7 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Log In with another device.
|
/// Looks up a localized string similar to Log in with device.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string LogInWithAnotherDevice {
|
public static string LogInWithAnotherDevice {
|
||||||
get {
|
get {
|
||||||
@@ -3787,11 +3859,11 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Master password must be at least 8 characters long..
|
/// Looks up a localized string similar to Master password must be at least {0} characters long..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string MasterPasswordLengthValMessage {
|
public static string MasterPasswordLengthValMessageX {
|
||||||
get {
|
get {
|
||||||
return ResourceManager.GetString("MasterPasswordLengthValMessage", resourceCulture);
|
return ResourceManager.GetString("MasterPasswordLengthValMessageX", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4020,17 +4092,6 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Mx.
|
|
||||||
/// </summary>
|
|
||||||
public static string Mx
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return ResourceManager.GetString("Mx", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to You must log into the main Bitwarden app before you can use the extension..
|
/// Looks up a localized string similar to You must log into the main Bitwarden app before you can use the extension..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -4049,6 +4110,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Mx.
|
||||||
|
/// </summary>
|
||||||
|
public static string Mx {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Mx", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to My vault.
|
/// Looks up a localized string similar to My vault.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -4563,6 +4633,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Organization SSO identifier required..
|
||||||
|
/// </summary>
|
||||||
|
public static string OrganizationSsoIdentifierRequired {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("OrganizationSsoIdentifierRequired", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Organization identifier.
|
/// Looks up a localized string similar to Organization identifier.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -5068,6 +5147,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>
|
||||||
@@ -5293,6 +5381,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Search for an item or add a new item.
|
||||||
|
/// </summary>
|
||||||
|
public static string SearchForAnItemOrAddANewItem {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("SearchForAnItemOrAddANewItem", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Search {0}.
|
/// Looks up a localized string similar to Search {0}.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -5392,6 +5489,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>
|
||||||
@@ -5986,6 +6092,24 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to There are no items in your vault that match "{0}".
|
||||||
|
/// </summary>
|
||||||
|
public static string ThereAreNoItemsInYourVaultThatMatchX {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ThereAreNoItemsInYourVaultThatMatchX", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to There are no items that match the search.
|
||||||
|
/// </summary>
|
||||||
|
public static string ThereAreNoItemsThatMatchTheSearch {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ThereAreNoItemsThatMatchTheSearch", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to 30 days.
|
/// Looks up a localized string similar to 30 days.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6373,6 +6497,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 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..
|
||||||
|
/// </summary>
|
||||||
|
public static string UpdateWeakMasterPasswordWarning {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("UpdateWeakMasterPasswordWarning", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Updating password.
|
/// Looks up a localized string similar to Updating password.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6427,6 +6560,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <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>
|
||||||
@@ -6598,6 +6740,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Your organization policies have set your vault timeout action to {0}..
|
||||||
|
/// </summary>
|
||||||
|
public static string VaultTimeoutActionPolicyInEffect {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("VaultTimeoutActionPolicyInEffect", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?.
|
/// Looks up a localized string similar to Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6608,7 +6759,7 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s).
|
/// Looks up a localized string similar to Your organization policies have set your maximum allowed vault timeout to {0} hour(s) and {1} minute(s)..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string VaultTimeoutPolicyInEffect {
|
public static string VaultTimeoutPolicyInEffect {
|
||||||
get {
|
get {
|
||||||
@@ -6616,6 +6767,15 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to 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}..
|
||||||
|
/// </summary>
|
||||||
|
public static string VaultTimeoutPolicyWithActionInEffect {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("VaultTimeoutPolicyWithActionInEffect", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Your vault timeout exceeds the restrictions set by your organization..
|
/// Looks up a localized string similar to Your vault timeout exceeds the restrictions set by your organization..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -583,8 +583,8 @@
|
|||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>’n Hoofwagwoordwenk kan u help om u wagwoord te onthou indien u dit sou vergeet.</value>
|
<value>’n Hoofwagwoordwenk kan u help om u wagwoord te onthou indien u dit sou vergeet.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessage" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>Hoofwagwoord moet ten minste 8 karakters lank wees.</value>
|
<value>Die hoofwagwoord moet ten minste {0} karakters lank wees.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>Min. aantal syfers</value>
|
<value>Min. aantal syfers</value>
|
||||||
@@ -1752,11 +1752,11 @@ Skandering gebeur outomaties.</value>
|
|||||||
<value>Wil u dit regtig na die asblik stuur?</value>
|
<value>Wil u dit regtig na die asblik stuur?</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="BiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Biometriese ontgrendeling gedeaktiveer hangende bevestiging van hoofwagwoord.</value>
|
<value>Biometric unlock for this account is disabled pending verification of master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Biometriese ontgrendeling vir outovul gedeaktiveer hangende bevestiging van hoofwagwoord.</value>
|
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</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>
|
||||||
@@ -2142,10 +2142,16 @@ Skandering gebeur outomaties.</value>
|
|||||||
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
||||||
<value>U organisasiebeleide beïnvloed u kluisuitelling. Maksimum toegelate kluisuittelling is {0} uur en {1} minuut(e).</value>
|
<value>U organisasiebeleide beïnvloed u kluisuitelling. Maksimum toegelate kluisuittelling is {0} uur en {1} minuut(e).</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
|
||||||
|
<value>Jou organisasie se beleid affekteer jou kluis-uittel tyd. Maksimum toelaatbare kluis-uittel tyd is {0} uur(ure) en {1} minuut(minute). Jou kluis-uittel aksie is gestel na {2}.</value>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
|
<value>Jou organisasie se beleid het jou kluis-uittel aksie na {0} verander.</value>
|
||||||
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>U kluisuittelling oorskry die beperkinge wat deur u organisasie daargestel is.</value>
|
<value>U kluisuittelling oorskry die beperkinge wat deur u organisasie daargestel is.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DisablePersonalVaultExportPolicyInEffect">
|
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
|
||||||
<value>Een of meer organisasiebeleide verhoed u om u persoonlike kluis uit te stuur.</value>
|
<value>Een of meer organisasiebeleide verhoed u om u persoonlike kluis uit te stuur.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAccount" xml:space="preserve">
|
<data name="AddAccount" xml:space="preserve">
|
||||||
@@ -2489,8 +2495,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>Logging in as {0} on {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>
|
||||||
@@ -2523,57 +2529,105 @@ Wil u na die rekening omskakel?</value>
|
|||||||
<value>Hierdie versoek is nie langer gelding nie</value>
|
<value>Hierdie versoek is nie langer gelding nie</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PendingLogInRequests" xml:space="preserve">
|
<data name="PendingLogInRequests" xml:space="preserve">
|
||||||
<value>Pending login requests</value>
|
<value>In afwagting vir aantekeningsversoeke</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DeclineAllRequests" xml:space="preserve">
|
<data name="DeclineAllRequests" xml:space="preserve">
|
||||||
<value>Decline all requests</value>
|
<value>Weier alle versoeke</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AreYouSureYouWantToDeclineAllPendingLogInRequests" xml:space="preserve">
|
<data name="AreYouSureYouWantToDeclineAllPendingLogInRequests" xml:space="preserve">
|
||||||
<value>Are you sure you want to decline all pending login requests?</value>
|
<value>Is jy seker dat jy alle hangende aantekeningsversoeke wil weier?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RequestsDeclined" xml:space="preserve">
|
<data name="RequestsDeclined" xml:space="preserve">
|
||||||
<value>Requests declined</value>
|
<value>Versoeke geweier</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoPendingRequests" xml:space="preserve">
|
<data name="NoPendingRequests" xml:space="preserve">
|
||||||
<value>No pending requests</value>
|
<value>Geen hangende versoeke</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
||||||
<value>Laat die kamera versoek toe om die skandeerder te gebruik</value>
|
<value>Laat die kamera versoek toe om die skandeerder te gebruik</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Language" xml:space="preserve">
|
||||||
|
<value>Taal</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
|
<value>Die taal is na {0} verander. Asseblief herbegin die toep om die veranderinge te sien</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
|
||||||
|
<value>Die taal verandering vereis 'n herbegin van die toep</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
|
<value>Verstek (Sisteem)</value>
|
||||||
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Important</value>
|
<value>Belangrik</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>Jou hoofwagwoord kan nie geherstel word as jy dit vergeet het nie! {0} karakters minimum.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakMasterPassword" xml:space="preserve">
|
<data name="WeakMasterPassword" xml:space="preserve">
|
||||||
<value>Swak Hoofwagwoord</value>
|
<value>Swak Hoofwagwoord</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakPasswordIdentifiedUseAStrongPasswordToProtectYourAccount" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedUseAStrongPasswordToProtectYourAccount" xml:space="preserve">
|
||||||
<value>Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?</value>
|
<value>Swak wagwoord geïdentifiseer. Gebruik 'n sterk wagwoord om jou rekening te beskerm. Is jy seker dat jy 'n swak wagwoord wil gebruik?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Weak" xml:space="preserve">
|
<data name="Weak" xml:space="preserve">
|
||||||
<value>Swak</value>
|
<value>Swak</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Good" xml:space="preserve">
|
<data name="Good" xml:space="preserve">
|
||||||
<value>Good</value>
|
<value>Goed</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Strong" xml:space="preserve">
|
<data name="Strong" xml:space="preserve">
|
||||||
<value>Strong</value>
|
<value>Sterk</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>Ondersoek bekende data lekkasies vir dié wagwoord</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExposedMasterPassword" xml:space="preserve">
|
<data name="ExposedMasterPassword" xml:space="preserve">
|
||||||
<value>Exposed Master Password</value>
|
<value>Blootgestelde Hoofwagwoord</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="PasswordFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?</value>
|
<value>Dié wagwoord was in data lekkasie gevind. Gebruik 'n unieke wagwoord om jou rekening te beskerm. Is jy seker dat jy 'n blootgestelde wagwoord wil gebruik?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakAndExposedMasterPassword" xml:space="preserve">
|
<data name="WeakAndExposedMasterPassword" xml:space="preserve">
|
||||||
<value>Weak and Exposed Master Password</value>
|
<value>Swak en Blootgestelde Hoofwagwoord</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?</value>
|
<value>Swak wagwoord geïdentifiseer en in 'n data lekkasie gevind. Gebruik 'n sterk en unieke wagwoord om jou rekening te beskerm. Is jy seker dat jy hierdie wagwoord wil gebruik?</value>
|
||||||
|
</data>
|
||||||
|
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
|
||||||
|
<value>Organisasie SSO identifiseerder vereis.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
|
||||||
|
<value>Voeg die sleutel by 'n huidige of nuwe item</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
|
||||||
|
<value>Daar is geen items in jou kluis wat met "{0}" ooreenstem nie</value>
|
||||||
|
</data>
|
||||||
|
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
|
||||||
|
<value>Soek vir 'n item of voeg 'n nuwe een by</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
|
<value>Daar is geen items wat met die soekterm ooreenstem nie</value>
|
||||||
|
</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">
|
||||||
|
<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 name="CurrentMasterPassword" xml:space="preserve">
|
||||||
|
<value>Current master password</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -583,8 +583,8 @@
|
|||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>يمكن أن تساعدك فكرة كلمة المرور الرئيسية على تذكر كلمة المرور الخاصة بك إذا نسيت.</value>
|
<value>يمكن أن تساعدك فكرة كلمة المرور الرئيسية على تذكر كلمة المرور الخاصة بك إذا نسيت.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessage" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>يجب أن تكون كلمة المرور الرئيسية أكثر من 8 أحرف.</value>
|
<value>كلمة المرور الرئيسية يجب أن تكون على الأقل {0} حرفاً.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>الحد الأدنى للأرقام</value>
|
<value>الحد الأدنى للأرقام</value>
|
||||||
@@ -1752,11 +1752,11 @@
|
|||||||
<value>هل تريد حقاً أن ترسل إلى سلة المهملات؟</value>
|
<value>هل تريد حقاً أن ترسل إلى سلة المهملات؟</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="BiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>تم تعطيل فتح القفل الحيوي في انتظار التحقق من كلمة المرور الرئيسية.</value>
|
<value>Biometric unlock for this account is disabled pending verification of master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>تم تعطيل إلغاء القفل البيومتري للملء التلقائي في انتظار التحقق من كلمة المرور الرئيسية.</value>
|
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>تمكين المزامنة عند التحديث</value>
|
<value>تمكين المزامنة عند التحديث</value>
|
||||||
@@ -2143,10 +2143,16 @@
|
|||||||
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
||||||
<value>سياسات مؤسستك تؤثر على مهلة الخزنة الخاص بك. الحد الأقصى المسموح به لمهلة الخزنة هو {0} ساعة و {1} دقيقة</value>
|
<value>سياسات مؤسستك تؤثر على مهلة الخزنة الخاص بك. الحد الأقصى المسموح به لمهلة الخزنة هو {0} ساعة و {1} دقيقة</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
|
||||||
|
<value>سياسات مؤسستك تؤثر على مهلة خزنتك. الحد الأقصى المسموح به لمهلة الخزنة هو {0} ساعة(ساعات) و {1} دقيقة(دقائق). يتم تعيين إجراء مهلة المخزن الخاص بك إلى {2}.</value>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
|
<value>سياسات مؤسستك قامت بتعيين إجراء مهلة خزنتك إلى {0}.</value>
|
||||||
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>مهلة خزنتك تتجاوز القيود التي تضعها مؤسستك.</value>
|
<value>مهلة خزنتك تتجاوز القيود التي تضعها مؤسستك.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DisablePersonalVaultExportPolicyInEffect">
|
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
|
||||||
<value>واحدة أو أكثر من سياسات المؤسسة تمنعك من تصدير خزانتك الشخصية.</value>
|
<value>واحدة أو أكثر من سياسات المؤسسة تمنعك من تصدير خزانتك الشخصية.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAccount" xml:space="preserve">
|
<data name="AddAccount" xml:space="preserve">
|
||||||
@@ -2490,8 +2496,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>Logging in as {0} on {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>ليس أنت؟</value>
|
<value>ليس أنت؟</value>
|
||||||
@@ -2524,57 +2530,105 @@
|
|||||||
<value>هذا الطلب لم يعد صالحًا</value>
|
<value>هذا الطلب لم يعد صالحًا</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PendingLogInRequests" xml:space="preserve">
|
<data name="PendingLogInRequests" xml:space="preserve">
|
||||||
<value>Pending login requests</value>
|
<value>طلبات تسجيل الدخول المعلقة</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DeclineAllRequests" xml:space="preserve">
|
<data name="DeclineAllRequests" xml:space="preserve">
|
||||||
<value>Decline all requests</value>
|
<value>رفض جميع الطلبات</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AreYouSureYouWantToDeclineAllPendingLogInRequests" xml:space="preserve">
|
<data name="AreYouSureYouWantToDeclineAllPendingLogInRequests" xml:space="preserve">
|
||||||
<value>Are you sure you want to decline all pending login requests?</value>
|
<value>هل أنت متأكد من أنك تريد رفض جميع طلبات تسجيل الدخول المعلقة؟</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RequestsDeclined" xml:space="preserve">
|
<data name="RequestsDeclined" xml:space="preserve">
|
||||||
<value>Requests declined</value>
|
<value>تم رفض الطلبات</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoPendingRequests" xml:space="preserve">
|
<data name="NoPendingRequests" xml:space="preserve">
|
||||||
<value>No pending requests</value>
|
<value>لا توجد طلبات معلقة</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
||||||
<value>تمكين إذن الكاميرا لاستخدام الماسح الضوئي</value>
|
<value>تمكين إذن الكاميرا لاستخدام الماسح الضوئي</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Language" xml:space="preserve">
|
||||||
|
<value>اللّغة</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
|
<value>تم تغيير اللغة إلى {0}. الرجاء إعادة تشغيل التطبيق لرؤية التغيير</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
|
||||||
|
<value>تغيير اللّغة يتطلب إعادة تشغيل التطبيق</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
|
<value>الافتراضي (النظام)</value>
|
||||||
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Important</value>
|
<value>مهم</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>لا يمكن استعادة كلمة المرور الرئيسية الخاصة بك إذا نسيت ذلك! {0} أحرف الحد الأدنى.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakMasterPassword" xml:space="preserve">
|
<data name="WeakMasterPassword" xml:space="preserve">
|
||||||
<value>Weak Master Password</value>
|
<value>كلمة المرور الرئيسية الضعيفة</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakPasswordIdentifiedUseAStrongPasswordToProtectYourAccount" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedUseAStrongPasswordToProtectYourAccount" xml:space="preserve">
|
||||||
<value>Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?</value>
|
<value>تم تحديد كلمة المرور ضعيفة. استخدم كلمة مرور قوية لحماية حسابك. هل أنت متأكد من أنك تريد استخدام كلمة مرور ضعيفة؟</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Weak" xml:space="preserve">
|
<data name="Weak" xml:space="preserve">
|
||||||
<value>Weak</value>
|
<value>ضعيفة</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>تحقق من خروقات البيانات المعروفة لكلمة المرور هذه</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExposedMasterPassword" xml:space="preserve">
|
<data name="ExposedMasterPassword" xml:space="preserve">
|
||||||
<value>Exposed Master Password</value>
|
<value>كلمة المرور الرئيسية مكشوفة</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="PasswordFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?</value>
|
<value>كلمة المرور موجودة في خرق البيانات. استخدم كلمة مرور فريدة لحماية حسابك. هل أنت متأكد من أنك تريد استخدام كلمة مرور مكشوفة؟</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakAndExposedMasterPassword" xml:space="preserve">
|
<data name="WeakAndExposedMasterPassword" xml:space="preserve">
|
||||||
<value>Weak and Exposed Master Password</value>
|
<value>كلمة المرور الرئيسية ضعيفة ومكشوفة</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?</value>
|
<value>كلمة مرور ضعيفة محددة وموجودة في خرق البيانات. استخدم كلمة مرور قوية وفريدة لحماية حسابك. هل أنت متأكد من أنك تريد استخدام كلمة المرور هذه؟</value>
|
||||||
|
</data>
|
||||||
|
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
|
||||||
|
<value>معرف الـSSO للمنظمة مطلوب.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
|
||||||
|
<value>إضافة المفتاح إلى عنصر موجود أو جديد</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
|
||||||
|
<value>لا توجد عناصر في خزانتك تتطابق مع "{0}"</value>
|
||||||
|
</data>
|
||||||
|
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
|
||||||
|
<value>البحث عن عنصر أو إضافة عنصر جديد</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
|
<value>لا توجد عناصر تطابق البحث</value>
|
||||||
|
</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">
|
||||||
|
<value>كلمة المرور الرئيسية الخاصة بك لا تفي بواحدة أو أكثر من سياسات مؤسستك. من أجل الوصول إلى الخزنة، يجب عليك تحديث كلمة المرور الرئيسية الآن. سيتم تسجيل خروجك من الجلسة الحالية، مما يتطلب منك تسجيل الدخول مرة أخرى. وقد تظل الجلسات النشطة على أجهزة أخرى نشطة لمدة تصل إلى ساعة واحدة.</value>
|
||||||
|
</data>
|
||||||
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
|
<value>كلمة المرور الرئيسية الحالية</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -583,8 +583,8 @@
|
|||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>Ana parol məsləhəti, unutduğunuz parolu xatırlamağınıza kömək edir.</value>
|
<value>Ana parol məsləhəti, unutduğunuz parolu xatırlamağınıza kömək edir.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessage" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>Ana parol ən azı 8 simvol uzunluğunda olmalıdır.</value>
|
<value>Ana parol ən azı {0} simvol uzunluğunda olmalıdır.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>Minimum rəqəm</value>
|
<value>Minimum rəqəm</value>
|
||||||
@@ -1752,11 +1752,11 @@ Skan prosesi avtomatik baş tutacaq.</value>
|
|||||||
<value>Həqiqətən tullantı qutusuna göndərmək istəyirsiniz?</value>
|
<value>Həqiqətən tullantı qutusuna göndərmək istəyirsiniz?</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="BiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Ana parolun təsdiqlənməsi gözlənildiyi üçün biometrik kilid açma sıradan çıxarıldı.</value>
|
<value>Ana parolun təsdiqlənməsi gözlənildiyi üçün bu hesab üzrə biometrik kilid açma sıradan çıxarıldı.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Ana parolun təsdiqlənməsi gözlənildiyi üçün avto-doldurma üzrə biometrik kilid açma sıradan çıxarıldı.</value>
|
<value>Ana parolun təsdiqlənməsi gözlənildiyi üçün bu hesab üzrə avto-doldurma biometrik kilid açma sıradan çıxarıldı.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>Təzələmə əsnasında eyniləşdirməni fəallaşdır</value>
|
<value>Təzələmə əsnasında eyniləşdirməni fəallaşdır</value>
|
||||||
@@ -2142,10 +2142,16 @@ Skan prosesi avtomatik baş tutacaq.</value>
|
|||||||
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
||||||
<value>Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt {0} saat {1} dəqiqədir</value>
|
<value>Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt {0} saat {1} dəqiqədir</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
|
||||||
|
<value>Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt {0} saat {1} dəqiqədir. Anbar vaxt bitişi əməliyyatı {2} olaraq tənzimləndi.</value>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
|
<value>Təşkilatınızın siyasətləri, anbar vaxt bitişi əməliyyatınızı {0} olaraq tənzimlədi.</value>
|
||||||
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>Anbar vaxt bitişi, təşkilatınız tərəfindən tənzimlənən məhdudiyyətləri aşır.</value>
|
<value>Anbar vaxt bitişi, təşkilatınız tərəfindən tənzimlənən məhdudiyyətləri aşır.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DisablePersonalVaultExportPolicyInEffect">
|
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
|
||||||
<value>Bir və ya daha çox təşkilat siyasəti, fərdi anbarınızı ixrac etməyinizin qarşısını alır.</value>
|
<value>Bir və ya daha çox təşkilat siyasəti, fərdi anbarınızı ixrac etməyinizin qarşısını alır.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAccount" xml:space="preserve">
|
<data name="AddAccount" xml:space="preserve">
|
||||||
@@ -2488,8 +2494,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>
|
||||||
@@ -2539,6 +2545,18 @@ Bu hesaba keçmək istəyirsiniz?</value>
|
|||||||
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
||||||
<value>Skaneri istifadə etmək üçün kamera icazəsini fəallaşdırın</value>
|
<value>Skaneri istifadə etmək üçün kamera icazəsini fəallaşdırın</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Language" xml:space="preserve">
|
||||||
|
<value>Dil</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
|
<value>Dil, {0} olaraq dəyişdirildi. Dəyişiklikləri görmək üçün zəhmət olmasa tətbiqi yenidən başladın</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
|
||||||
|
<value>Dil dəyişikliyi, tətbiqin yenidən başladılmasını tələb edir</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
|
<value>İlkin (Sistem)</value>
|
||||||
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Vacib</value>
|
<value>Vacib</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2575,4 +2593,40 @@ Bu hesaba keçmək istəyirsiniz?</value>
|
|||||||
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Zəif parol məlumat pozuntusunda aşkarlandı və tapıldı. Hesabınızı qorumaq üçün güclü və unikal bir parol istifadə edin. Bu parolu istifadə etmək istədiyinizə əminsiniz?</value>
|
<value>Zəif parol məlumat pozuntusunda aşkarlandı və tapıldı. Hesabınızı qorumaq üçün güclü və unikal bir parol istifadə edin. Bu parolu istifadə etmək istədiyinizə əminsiniz?</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
|
||||||
|
<value>Təşkilat SSO identifikatoru tələb olundu.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
|
||||||
|
<value>Açarı, mövcud və ya yeni bir elementə əlavə edin</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
|
||||||
|
<value>Anbarınızda {0} ilə uyğunlaşan heç bir element yoxdur</value>
|
||||||
|
</data>
|
||||||
|
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
|
||||||
|
<value>Bir element axtarın və ya yenisini əlavə edin</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
|
<value>Axtarışa uyğun gələn heç bir element yoxdur</value>
|
||||||
|
</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">
|
||||||
|
<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 name="CurrentMasterPassword" xml:space="preserve">
|
||||||
|
<value>Hazırkı ana parol</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -583,8 +583,8 @@
|
|||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>Падказка да асноўнага пароля можа дапамагчы вам успомніць яго, калі вы яго забылі.</value>
|
<value>Падказка да асноўнага пароля можа дапамагчы вам успомніць яго, калі вы яго забылі.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessage" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>Асноўны пароль павінен змяшчаць прынамсі 8 сімвалаў.</value>
|
<value>Асноўны пароль павінен змяшчаць прынамсі {0} сімвалаў.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>Мінімум лічбаў</value>
|
<value>Мінімум лічбаў</value>
|
||||||
@@ -1751,11 +1751,11 @@
|
|||||||
<value>Вы сапраўды хочаце адправіць элемент у сметніцу?</value>
|
<value>Вы сапраўды хочаце адправіць элемент у сметніцу?</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="BiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Разблакіраванне па біяметрыі адключана. Чакаецца праверка асноўным паролем.</value>
|
<value>Разблакіроўка па біяметрыі для гэтага ўліковага запісу адключана. Чакаецца праверка асноўным паролем.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Разблакіраванне па біяметрыі для аўтазапаўнення адключана. Чакаецца праверка асноўным паролем.</value>
|
<value>Аўтазапаўненне з дапамогай разблакіроўкі па біяметрыі для гэтага ўліковага запісу адключана. Чакаецца праверка асноўным паролем.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>Уключыць сінхранізацыю пры абнаўленні</value>
|
<value>Уключыць сінхранізацыю пры абнаўленні</value>
|
||||||
@@ -2142,10 +2142,16 @@
|
|||||||
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
||||||
<value>Палітыка вашай арганізацыі ўплывае на час чакання сховішча. Максімальны дазволены час чакання сховішча складае {0} гадз. і {1} хв.</value>
|
<value>Палітыка вашай арганізацыі ўплывае на час чакання сховішча. Максімальны дазволены час чакання сховішча складае {0} гадз. і {1} хв.</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
|
||||||
|
<value>Палітыка вашай арганізацыі ўплывае на час чакання сховішча. Максімальны дазволены час чакання сховішча складае гадзін: {0}; хвілін: {1}. Для часу чакання вашага сховішча прызначана дзеянне {2}.</value>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
|
<value>Палітыкай вашай арганізацыі прызначана дзеянне {0} для часу чакання вашага сховішча.</value>
|
||||||
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>Час чакання вашага сховішча перавышае дазволеныя абмежаванні, якія прызначыла ваша арганізацыя.</value>
|
<value>Час чакання вашага сховішча перавышае дазволеныя абмежаванні, якія прызначыла ваша арганізацыя.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DisablePersonalVaultExportPolicyInEffect">
|
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
|
||||||
<value>Адна або больш палітык арганізацыі не дазваляюць вам экспартаваць асабістае сховішча.</value>
|
<value>Адна або больш палітык арганізацыі не дазваляюць вам экспартаваць асабістае сховішча.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAccount" xml:space="preserve">
|
<data name="AddAccount" xml:space="preserve">
|
||||||
@@ -2489,8 +2495,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>Logging in as {0} on {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Не вы?</value>
|
<value>Не вы?</value>
|
||||||
@@ -2540,6 +2546,18 @@
|
|||||||
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
||||||
<value>Каб выкарыстоўваць сканер дайце дазвол на выкарыстанне камеры</value>
|
<value>Каб выкарыстоўваць сканер дайце дазвол на выкарыстанне камеры</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Language" xml:space="preserve">
|
||||||
|
<value>Мова</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
|
<value>Мова была зменена на {0}. Перазапусціце праграму, каб убачыць змены</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
|
||||||
|
<value>Для змены мовы неабходна перазапусціць праграму</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
|
<value>Прадвызначана (сістэмная)</value>
|
||||||
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Важна</value>
|
<value>Важна</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2576,4 +2594,40 @@
|
|||||||
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Вызначаны ненадзейны пароль, які знойдзены ва ўцечках даных. Выкарыстоўвайце надзейныя і ўнікальныя паролі для абароны свайго ўліковага запісу. Вы сапраўды хочаце выкарыстоўваць гэты пароль?</value>
|
<value>Вызначаны ненадзейны пароль, які знойдзены ва ўцечках даных. Выкарыстоўвайце надзейныя і ўнікальныя паролі для абароны свайго ўліковага запісу. Вы сапраўды хочаце выкарыстоўваць гэты пароль?</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
|
||||||
|
<value>Неабходны ідэнтыфікатар SSO арганізацыі.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
|
||||||
|
<value>Дадаць ключ да існуючага або новага элемента</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
|
||||||
|
<value>У вашым сховішчы адсутнічаюць элементы, якія адпавядаюць "{0}"</value>
|
||||||
|
</data>
|
||||||
|
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
|
||||||
|
<value>Пошук або дабаўленне новага элемента</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
|
<value>Адсутнічаюць элементы, якія адпавядаюць пошуку</value>
|
||||||
|
</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">
|
||||||
|
<value>Ваш асноўны пароль не адпавядае адной або некалькім палітыкам арганізацыі. Для атрымання доступу да сховішча, вы павінны абнавіць яго. Працягваючы, вы выйдзіце з бягучага сеанса і вам неабходна будзе ўвайсці паўторна. Актыўныя сеансы на іншых прыладах могуць заставацца актыўнымі на працягу адной гадзіны.</value>
|
||||||
|
</data>
|
||||||
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
|
<value>Бягучы асноўны пароль</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -583,8 +583,8 @@
|
|||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>Подсказката помага да си спомните паролата, ако сте я забравили.</value>
|
<value>Подсказката помага да си спомните паролата, ако сте я забравили.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessage" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>Главната парола трябва да е дълга поне 8 знака.</value>
|
<value>Главната парола трябва да е дълга поне {0} знака.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>Минимален брой цифри</value>
|
<value>Минимален брой цифри</value>
|
||||||
@@ -1752,11 +1752,11 @@
|
|||||||
<value>Сигурни ли сте, че искате да преместите записа в кошчето?</value>
|
<value>Сигурни ли сте, че искате да преместите записа в кошчето?</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="BiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Засечена е промяна в биометричните данни. Впишете се с главната парола, за да я включите отново биометричната идентификация.</value>
|
<value>Потвърждаването с биометрични данни е изключено за тази регистрация. Въведете главната парола, за да го включите.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Потвърждаването с биометрични данни е изключено. Въведете главната парола, за да го включите.</value>
|
<value>Автоматичното попълване за потвърждаване с биометрични данни е изключено за тази регистрация. Въведете главната парола, за да го включите.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>Синхронизация при опресняване</value>
|
<value>Синхронизация при опресняване</value>
|
||||||
@@ -2083,11 +2083,10 @@
|
|||||||
<value>Това действие е защитено. За да продължите, въведете отново главната си парола, за да потвърдите самоличността си.</value>
|
<value>Това действие е защитено. За да продължите, въведете отново главната си парола, за да потвърдите самоличността си.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CaptchaRequired" xml:space="preserve">
|
<data name="CaptchaRequired" xml:space="preserve">
|
||||||
<value>Адресът за hCaptcha е задължителен</value>
|
<value>Проверката е задължителна</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CaptchaFailed" xml:space="preserve">
|
<data name="CaptchaFailed" xml:space="preserve">
|
||||||
<value>
|
<value>Грешка. Опитайте отново.</value>
|
||||||
Грешка. Моля опитайте пак</value>
|
|
||||||
</data>
|
</data>
|
||||||
<data name="UpdatedMasterPassword" xml:space="preserve">
|
<data name="UpdatedMasterPassword" xml:space="preserve">
|
||||||
<value>Главната парола е променена</value>
|
<value>Главната парола е променена</value>
|
||||||
@@ -2143,10 +2142,16 @@
|
|||||||
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
||||||
<value>Настройките на организацията Ви влияят върху времето за достъп до трезора Ви. Максималното разрешено време за достъп е {0} час(а) и {1} минути</value>
|
<value>Настройките на организацията Ви влияят върху времето за достъп до трезора Ви. Максималното разрешено време за достъп е {0} час(а) и {1} минути</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
|
||||||
|
<value>Настройките на организацията Ви влияят върху времето за достъп до трезора Ви. Максималното разрешено време за достъп е {0} час(а) и {1} минута/и. Зададеното действие при изтичане на това време е {2}.</value>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
|
<value>Настройките на организацията Ви задават следното действие при изтичане на времето за достъп до трезора: {0}.</value>
|
||||||
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>Времето за достъп до трезора Ви превишава ограничението, определено от организацията Ви.</value>
|
<value>Времето за достъп до трезора Ви превишава ограничението, определено от организацията Ви.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DisablePersonalVaultExportPolicyInEffect">
|
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
|
||||||
<value>Една или повече от настройките на организацията Ви не позволяват да изнасяте личния си трезор.</value>
|
<value>Една или повече от настройките на организацията Ви не позволяват да изнасяте личния си трезор.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAccount" xml:space="preserve">
|
<data name="AddAccount" xml:space="preserve">
|
||||||
@@ -2294,10 +2299,10 @@
|
|||||||
<value>Ръчно въвеждане на кода</value>
|
<value>Ръчно въвеждане на кода</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddTotp" xml:space="preserve">
|
<data name="AddTotp" xml:space="preserve">
|
||||||
<value>Копиране на кода за потвърждаване</value>
|
<value>Добавяне на TOTP</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SetupTotp" xml:space="preserve">
|
<data name="SetupTotp" xml:space="preserve">
|
||||||
<value>Копиране на кода за потвърждаване</value>
|
<value>Настройка на TOTP</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OnceTheKeyIsSuccessfullyEntered" xml:space="preserve">
|
<data name="OnceTheKeyIsSuccessfullyEntered" xml:space="preserve">
|
||||||
<value>Once the key is successfully entered,
|
<value>Once the key is successfully entered,
|
||||||
@@ -2490,8 +2495,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>
|
||||||
@@ -2541,6 +2546,18 @@ select Add TOTP to store the key safely</value>
|
|||||||
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
||||||
<value>Разрешете достъпа до камерата, за да използвате скенера</value>
|
<value>Разрешете достъпа до камерата, за да използвате скенера</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Language" xml:space="preserve">
|
||||||
|
<value>Език</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
|
<value>Езикът беше променен на {0}. Рестартирайте приложението, за да влезе промяната в сила</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
|
||||||
|
<value>Промяната на езика изисква рестартиране на приложението</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
|
<value>По подразбиране (от системата)</value>
|
||||||
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Важно</value>
|
<value>Важно</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2577,4 +2594,40 @@ select Add TOTP to store the key safely</value>
|
|||||||
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?</value>
|
<value>Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
|
||||||
|
<value>Идентификаторът за еднократн идентификация на организация е задължителен.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
|
||||||
|
<value>Добавяне на ключа към съществуващ или нов елемент</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
|
||||||
|
<value>В трезора липсват елементи, които отговарят на „{0}“</value>
|
||||||
|
</data>
|
||||||
|
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
|
||||||
|
<value>Търсене на елемент или добавяне на нов</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
|
<value>Няма елементи, които отговарят на търсенето</value>
|
||||||
|
</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">
|
||||||
|
<value>Вашата главна парола не отговаря на една или повече политики на организацията Ви. За да получите достъп до трезора, трябва да промените главната си парола сега. Това означава, че ще бъдете отписан(а) от текущата си сесия и ще трябва да се впишете отново. Активните сесии на други устройства може да продължат да бъдат активни още един час.</value>
|
||||||
|
</data>
|
||||||
|
<data name="CurrentMasterPassword" 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>
|
||||||
@@ -583,8 +583,8 @@
|
|||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>যদি আপনি আপনার পাসওয়ার্ড ভুলে যান তাহলে একটি প্রধান পাসওয়ার্ডের ইঙ্গিতটি আপনাকে মনে করাতে সাহায্য করতে পারে।</value>
|
<value>যদি আপনি আপনার পাসওয়ার্ড ভুলে যান তাহলে একটি প্রধান পাসওয়ার্ডের ইঙ্গিতটি আপনাকে মনে করাতে সাহায্য করতে পারে।</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessage" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>প্রধান পাসওয়ার্ড কমপক্ষে ৮ অক্ষর দীর্ঘ হওয়া উচিত।</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">
|
||||||
@@ -1752,11 +1752,11 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Do you really want to send to the trash?</value>
|
<value>Do you really want to send to the trash?</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="BiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Biometric unlock disabled pending verification of master password.</value>
|
<value>Biometric unlock for this account is disabled pending verification of master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Biometric unlock for autofill disabled pending verification of master password.</value>
|
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>Allow sync on refresh</value>
|
<value>Allow sync on refresh</value>
|
||||||
@@ -1887,10 +1887,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 +1900,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 +1918,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 +1957,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 +2030,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>
|
||||||
@@ -2141,12 +2141,18 @@ Scanning will happen automatically.</value>
|
|||||||
<value>This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password.</value>
|
<value>This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
||||||
<value>Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s)</value>
|
<value>Your organization policies have set your maximum allowed vault timeout to {0} hour(s) and {1} minute(s).</value>
|
||||||
|
</data>
|
||||||
|
<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>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
|
<value>Your organization policies have set your vault timeout action to {0}.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>Your vault timeout exceeds the restrictions set by your organization.</value>
|
<value>Your vault timeout exceeds the restrictions set by your organization.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DisablePersonalVaultExportPolicyInEffect">
|
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
|
||||||
<value>One or more organization policies prevents your from exporting your individual vault.</value>
|
<value>One or more organization policies prevents your from exporting your individual vault.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAccount" xml:space="preserve">
|
<data name="AddAccount" xml:space="preserve">
|
||||||
@@ -2234,16 +2240,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>
|
||||||
@@ -2346,10 +2352,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>
|
||||||
@@ -2490,8 +2496,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>
|
||||||
@@ -2541,6 +2547,18 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
||||||
<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">
|
||||||
|
<value>ভাষা</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
|
<value>The language has been changed to {0}. Please restart the app to see the change</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
|
||||||
|
<value>Language change requires app restart</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
|
<value>Default (System)</value>
|
||||||
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Important</value>
|
<value>Important</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2557,10 +2575,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>
|
||||||
@@ -2577,4 +2595,40 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?</value>
|
<value>Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
|
||||||
|
<value>Organization SSO identifier required.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
|
||||||
|
<value>Add the key to an existing or new item</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
|
||||||
|
<value>There are no items in your vault that match "{0}"</value>
|
||||||
|
</data>
|
||||||
|
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
|
||||||
|
<value>Search for an item or add a new item</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
|
<value>There are no items that match the search</value>
|
||||||
|
</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">
|
||||||
|
<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 name="CurrentMasterPassword" xml:space="preserve">
|
||||||
|
<value>Current master password</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -300,7 +300,7 @@
|
|||||||
<comment>The title for the vault page.</comment>
|
<comment>The title for the vault page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Authenticator" xml:space="preserve">
|
<data name="Authenticator" xml:space="preserve">
|
||||||
<value>Authenticator</value>
|
<value>Aplikacija za autentifikaciju</value>
|
||||||
<comment>Authenticator TOTP feature</comment>
|
<comment>Authenticator TOTP feature</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Name" xml:space="preserve">
|
<data name="Name" xml:space="preserve">
|
||||||
@@ -583,8 +583,8 @@
|
|||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>Nagoveštaj glavne lozinke može Vam pomoći da zapamtite lozinku ako je zaboravite.</value>
|
<value>Nagoveštaj glavne lozinke može Vam pomoći da zapamtite lozinku ako je zaboravite.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessage" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>Glavna lozinka mora imati najmanje 8 znakova.</value>
|
<value>Master password must be at least {0} characters long.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>Minimalno brojeva</value>
|
<value>Minimalno brojeva</value>
|
||||||
@@ -775,10 +775,10 @@
|
|||||||
<value>Omogućeno</value>
|
<value>Omogućeno</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Off" xml:space="preserve">
|
<data name="Off" xml:space="preserve">
|
||||||
<value>Off</value>
|
<value>Isključeno</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="On" xml:space="preserve">
|
<data name="On" xml:space="preserve">
|
||||||
<value>On</value>
|
<value>Uključeno</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Status" xml:space="preserve">
|
<data name="Status" xml:space="preserve">
|
||||||
<value>Status</value>
|
<value>Status</value>
|
||||||
@@ -900,8 +900,8 @@
|
|||||||
<value>Ne može se pročitati ključ autentifikatora.</value>
|
<value>Ne može se pročitati ključ autentifikatora.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PointYourCameraAtTheQRCode" xml:space="preserve">
|
<data name="PointYourCameraAtTheQRCode" xml:space="preserve">
|
||||||
<value>Point your camera at the QR Code.
|
<value>Usmjerite kameru prema QR kodu.
|
||||||
Scanning will happen automatically.</value>
|
Skeniranje će biti izvršeno automatski.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ScanQrTitle" xml:space="preserve">
|
<data name="ScanQrTitle" xml:space="preserve">
|
||||||
<value>Skenirajte QR kod</value>
|
<value>Skenirajte QR kod</value>
|
||||||
@@ -916,10 +916,10 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Iskopirajte TOTP</value>
|
<value>Iskopirajte TOTP</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyTotpAutomaticallyDescription" xml:space="preserve">
|
<data name="CopyTotpAutomaticallyDescription" xml:space="preserve">
|
||||||
<value>If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login.</value>
|
<value>Ako je za Vašu prijavu priložen autentifikacioni ključ, TOTP verifikacioni kod se automatski kopira u Vašu memoriju kad god automatski popunite prijavu.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyTotpAutomatically" xml:space="preserve">
|
<data name="CopyTotpAutomatically" xml:space="preserve">
|
||||||
<value>Copy TOTP automatically</value>
|
<value>Kopiraj TOTP (autentifikacijski kod) automatski</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PremiumRequired" xml:space="preserve">
|
<data name="PremiumRequired" xml:space="preserve">
|
||||||
<value>Za korišćenje ove funkcije potrebno je premium članstvo.</value>
|
<value>Za korišćenje ove funkcije potrebno je premium članstvo.</value>
|
||||||
@@ -1104,7 +1104,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Gđica</value>
|
<value>Gđica</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Mx" xml:space="preserve">
|
<data name="Mx" xml:space="preserve">
|
||||||
<value>Mx</value>
|
<value>Rodno neutralan</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="November" xml:space="preserve">
|
<data name="November" xml:space="preserve">
|
||||||
<value>Novembar</value>
|
<value>Novembar</value>
|
||||||
@@ -1140,10 +1140,10 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Rok upotrebe</value>
|
<value>Rok upotrebe</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ShowWebsiteIcons" xml:space="preserve">
|
<data name="ShowWebsiteIcons" xml:space="preserve">
|
||||||
<value>Show website icons</value>
|
<value>Pokaži ikone web stranica</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ShowWebsiteIconsDescription" xml:space="preserve">
|
<data name="ShowWebsiteIconsDescription" xml:space="preserve">
|
||||||
<value>Show a recognizable image next to each login.</value>
|
<value>Prikaži prepoznatljivu sliku pored svake prijave.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="IconsUrl" xml:space="preserve">
|
<data name="IconsUrl" xml:space="preserve">
|
||||||
<value>URL adresa servera ikona</value>
|
<value>URL adresa servera ikona</value>
|
||||||
@@ -1415,7 +1415,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Nema kolekcija za prikazati.</value>
|
<value>Nema kolekcija za prikazati.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MovedItemToOrg" xml:space="preserve">
|
<data name="MovedItemToOrg" xml:space="preserve">
|
||||||
<value>{0} moved to {1}.</value>
|
<value>{0} premješteno u {1}.</value>
|
||||||
<comment>ex: Item moved to Organization.</comment>
|
<comment>ex: Item moved to Organization.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ItemShared" xml:space="preserve">
|
<data name="ItemShared" xml:space="preserve">
|
||||||
@@ -1556,7 +1556,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Zadana tamna tema</value>
|
<value>Zadana tamna tema</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DefaultDarkThemeDescription" xml:space="preserve">
|
<data name="DefaultDarkThemeDescription" xml:space="preserve">
|
||||||
<value>Choose the dark theme to use when using Default (System) theme while your device's dark mode is in use.</value>
|
<value>Odaberi korištenje tamne teme kada je uređaj već zadano koristi.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyNotes" xml:space="preserve">
|
<data name="CopyNotes" xml:space="preserve">
|
||||||
<value>Kopiraj bilješke</value>
|
<value>Kopiraj bilješke</value>
|
||||||
@@ -1583,16 +1583,16 @@ Scanning will happen automatically.</value>
|
|||||||
<comment>'Solarized Dark' is the name of a specific color scheme. It should not be translated.</comment>
|
<comment>'Solarized Dark' is the name of a specific color scheme. It should not be translated.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Auto-fill blocked URIs</value>
|
<value>Auto-popunjavanje blokiranih URI-ja</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUrisDescription" xml:space="preserve">
|
<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>
|
<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>
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Ask to add login</value>
|
<value>Upitaj za dodavanje prijave</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AskToAddLoginDescription" xml:space="preserve">
|
<data name="AskToAddLoginDescription" xml:space="preserve">
|
||||||
<value>Ask to add an item if one isn't found in your vault.</value>
|
<value>Upitaj za dodavanje, ako se stavka već ne nalazi u trezoru.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OnRestart" xml:space="preserve">
|
<data name="OnRestart" xml:space="preserve">
|
||||||
<value>Kod ponovnog pokretanja</value>
|
<value>Kod ponovnog pokretanja</value>
|
||||||
@@ -1752,11 +1752,11 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Želite li zaista poslati u smeće?</value>
|
<value>Želite li zaista poslati u smeće?</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="BiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Biometrijsko otključavanje onemogućeno do potvrde glavne lozinke.</value>
|
<value>Biometric unlock for this account is disabled pending verification of master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Biometrijsko otključavanje za auto-ispunu onemogućeno do potvrde glavne lozinke.</value>
|
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>Uključi sinkronizaciju pri osvježavanju</value>
|
<value>Uključi sinkronizaciju pri osvježavanju</value>
|
||||||
@@ -1886,7 +1886,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="Text" xml:space="preserve">
|
<data name="Text" xml:space="preserve">
|
||||||
<value>Text</value>
|
<value>Tekst</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TypeText" xml:space="preserve">
|
<data name="TypeText" xml:space="preserve">
|
||||||
<value>Tekst</value>
|
<value>Tekst</value>
|
||||||
@@ -1905,16 +1905,16 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Datoteka koju želiš poslati</value>
|
<value>Datoteka koju želiš poslati</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FileTypeIsSelected" xml:space="preserve">
|
<data name="FileTypeIsSelected" xml:space="preserve">
|
||||||
<value>File type is selected.</value>
|
<value>Odabrana je vrsta datoteke.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FileTypeIsNotSelected" xml:space="preserve">
|
<data name="FileTypeIsNotSelected" xml:space="preserve">
|
||||||
<value>File type is not selected, tap to select.</value>
|
<value>Vrsta datoteke nije odabrana, dodirnite za odabir.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TextTypeIsSelected" xml:space="preserve">
|
<data name="TextTypeIsSelected" xml:space="preserve">
|
||||||
<value>Text type is selected.</value>
|
<value>Vrsta teksta je odabrana.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TextTypeIsNotSelected" xml:space="preserve">
|
<data name="TextTypeIsNotSelected" xml:space="preserve">
|
||||||
<value>Text type is not selected, tap to select.</value>
|
<value>Vrsta teksta nije odabrana, dodirnite za odabir.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DeletionDate" xml:space="preserve">
|
<data name="DeletionDate" xml:space="preserve">
|
||||||
<value>Datum brisanja</value>
|
<value>Datum brisanja</value>
|
||||||
@@ -2142,10 +2142,16 @@ Scanning will happen automatically.</value>
|
|||||||
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
||||||
<value>Pravilo tvoje organizacije utječe na vrijeme isteka trezora. Najveće dozvoljeno vrijeme isteka je {0} sata(i) i {1} minuta.</value>
|
<value>Pravilo tvoje organizacije utječe na vrijeme isteka trezora. Najveće dozvoljeno vrijeme isteka je {0} sata(i) i {1} minuta.</value>
|
||||||
</data>
|
</data>
|
||||||
|
<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>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
|
<value>Your organization policies have set your vault timeout action to {0}.</value>
|
||||||
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>Vrijeme isteka premašuje ograničenje koju je postavila tvoja organizacija.</value>
|
<value>Vrijeme isteka premašuje ograničenje koju je postavila tvoja organizacija.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DisablePersonalVaultExportPolicyInEffect">
|
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
|
||||||
<value>Jedno ili više pravila organizacija onemogućuje izvoz osobnog trezora. </value>
|
<value>Jedno ili više pravila organizacija onemogućuje izvoz osobnog trezora. </value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAccount" xml:space="preserve">
|
<data name="AddAccount" xml:space="preserve">
|
||||||
@@ -2221,89 +2227,88 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Unesi verifikacijski kod koji je poslan na tvoj E-Mail</value>
|
<value>Unesi verifikacijski kod koji je poslan na tvoj E-Mail</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SubmitCrashLogs" xml:space="preserve">
|
<data name="SubmitCrashLogs" xml:space="preserve">
|
||||||
<value>Submit crash logs</value>
|
<value>Pošaljite evidenciju o pogreškama u radu aplikacije</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SubmitCrashLogsDescription" xml:space="preserve">
|
<data name="SubmitCrashLogsDescription" xml:space="preserve">
|
||||||
<value>Help Bitwarden improve app stability by submitting crash reports.</value>
|
<value>Pomozi Bitwardenu poboljšati stabilnost aplikacije šaljući evidenciju o pogreškama u radu aplikacije.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OptionsExpanded" xml:space="preserve">
|
<data name="OptionsExpanded" xml:space="preserve">
|
||||||
<value>Options are expanded, tap to collapse.</value>
|
<value>Opcije su proširene, dodirni za smanjivanje.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OptionsCollapsed" xml:space="preserve">
|
<data name="OptionsCollapsed" xml:space="preserve">
|
||||||
<value>Options are collapsed, tap to expand.</value>
|
<value>Opcije su smanjene, dodirni za proširenje.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UppercaseAtoZ" xml:space="preserve">
|
<data name="UppercaseAtoZ" xml:space="preserve">
|
||||||
<value>Uppercase (A to Z)</value>
|
<value>Velika slova (A-Z)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LowercaseAtoZ" xml:space="preserve">
|
<data name="LowercaseAtoZ" xml:space="preserve">
|
||||||
<value>Lowercase (A to Z)</value>
|
<value>Mala slova (a - z)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NumbersZeroToNine" xml:space="preserve">
|
<data name="NumbersZeroToNine" xml:space="preserve">
|
||||||
<value>Numbers (0 to 9)</value>
|
<value>Brojevi (0-9)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SpecialCharacters" xml:space="preserve">
|
<data name="SpecialCharacters" xml:space="preserve">
|
||||||
<value>Special characters (!@#$%^&*)</value>
|
<value>Posebni znakovi (!@#$%^&*)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TapToGoBack" xml:space="preserve">
|
<data name="TapToGoBack" xml:space="preserve">
|
||||||
<value>Tap to go back</value>
|
<value>Dodirnite za povratak</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordIsVisibleTapToHide" xml:space="preserve">
|
<data name="PasswordIsVisibleTapToHide" xml:space="preserve">
|
||||||
<value>Password is visible, tap to hide.</value>
|
<value>Lozinka je vidljiva, dodirnite za skrivanje.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordIsNotVisibleTapToShow" xml:space="preserve">
|
<data name="PasswordIsNotVisibleTapToShow" xml:space="preserve">
|
||||||
<value>Password is not visible, tap to show.</value>
|
<value>Lozinka nije vidljiva, dodirnite za prikaz.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FilterByVault" xml:space="preserve">
|
<data name="FilterByVault" xml:space="preserve">
|
||||||
<value>Filter items by vault</value>
|
<value>Filtrirajte stavke prema trezoru</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AllVaults" xml:space="preserve">
|
<data name="AllVaults" xml:space="preserve">
|
||||||
<value>All vaults</value>
|
<value>Svi trezori</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Vaults" xml:space="preserve">
|
<data name="Vaults" xml:space="preserve">
|
||||||
<value>Vaults</value>
|
<value>Trezori</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultFilterDescription" xml:space="preserve">
|
<data name="VaultFilterDescription" xml:space="preserve">
|
||||||
<value>Vault: {0}</value>
|
<value>Trezor: {0}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="All" xml:space="preserve">
|
<data name="All" xml:space="preserve">
|
||||||
<value>All</value>
|
<value>Sve</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Totp" xml:space="preserve">
|
<data name="Totp" xml:space="preserve">
|
||||||
<value>TOTP</value>
|
<value>TOTP</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerificationCodes" xml:space="preserve">
|
<data name="VerificationCodes" xml:space="preserve">
|
||||||
<value>Verification codes</value>
|
<value>Autentifikacijski kodovi</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PremiumSubscriptionRequired" xml:space="preserve">
|
<data name="PremiumSubscriptionRequired" xml:space="preserve">
|
||||||
<value>Premium subscription required</value>
|
<value>Potrebna Premium pretplata</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CannotAddAuthenticatorKey" xml:space="preserve">
|
<data name="CannotAddAuthenticatorKey" xml:space="preserve">
|
||||||
<value>Cannot add authenticator key? </value>
|
<value>Nije moguće dodati autentifikacijski ključ? </value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ScanQRCode" xml:space="preserve">
|
<data name="ScanQRCode" xml:space="preserve">
|
||||||
<value>Scan QR Code</value>
|
<value>Skenirajte QR kod</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CannotScanQRCode" xml:space="preserve">
|
<data name="CannotScanQRCode" xml:space="preserve">
|
||||||
<value>Cannot scan QR Code? </value>
|
<value>Nije moguće skenirati QR kod? </value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AuthenticatorKeyScanner" xml:space="preserve">
|
<data name="AuthenticatorKeyScanner" xml:space="preserve">
|
||||||
<value>Authenticator key</value>
|
<value>Autentifikacijski ključ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnterKeyManually" xml:space="preserve">
|
<data name="EnterKeyManually" xml:space="preserve">
|
||||||
<value>Enter key manually</value>
|
<value>Ručno unesi ključ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddTotp" xml:space="preserve">
|
<data name="AddTotp" xml:space="preserve">
|
||||||
<value>Add TOTP</value>
|
<value>Dodaj TOTP</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SetupTotp" xml:space="preserve">
|
<data name="SetupTotp" xml:space="preserve">
|
||||||
<value>Set up TOTP</value>
|
<value>Podesi TOTP</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OnceTheKeyIsSuccessfullyEntered" xml:space="preserve">
|
<data name="OnceTheKeyIsSuccessfullyEntered" xml:space="preserve">
|
||||||
<value>Once the key is successfully entered,
|
<value>Jednom kada je ključ uspješno unesen, odaberi „Dodaj TOTP” za sigurno spremanje ključa</value>
|
||||||
select Add TOTP to store the key safely</value>
|
|
||||||
</data>
|
</data>
|
||||||
<data name="NeverLockWarning" xml:space="preserve">
|
<data name="NeverLockWarning" xml:space="preserve">
|
||||||
<value>Setting your lock options to “Never” keeps your vault available to anyone with access to your device. If you use this option, you should ensure that you keep your device properly protected.</value>
|
<value>Postavljanje zaključavanja na „Nikad” čini tvoj trezor dostupnim svima koji imaju pristupom tvom uređaju. Ako koristiš ovu mogućnost, pobrini se da je uređaj adekvatno zaštićen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnvironmentPageUrlsError" xml:space="preserve">
|
<data name="EnvironmentPageUrlsError" xml:space="preserve">
|
||||||
<value>One or more of the URLs entered are invalid. Please revise it and try to save again.</value>
|
<value>One or more of the URLs entered are invalid. Please revise it and try to save again.</value>
|
||||||
@@ -2461,119 +2466,167 @@ select Add TOTP to store the key safely</value>
|
|||||||
<value>Random</value>
|
<value>Random</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ConnectToWatch" xml:space="preserve">
|
<data name="ConnectToWatch" xml:space="preserve">
|
||||||
<value>Connect to Watch</value>
|
<value>Poveži se na Apple Watch</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccessibilityServiceDisclosure" xml:space="preserve">
|
<data name="AccessibilityServiceDisclosure" xml:space="preserve">
|
||||||
<value>Accessibility Service Disclosure</value>
|
<value>Odobrenje servisa pristupačnosti</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccessibilityDisclosureText" xml:space="preserve">
|
<data name="AccessibilityDisclosureText" xml:space="preserve">
|
||||||
<value>Bitwarden uses the Accessibility Service to search for login fields in apps and websites, then establish the appropriate field IDs for entering a username & password when a match for the app or site is found. We do not store any of the information presented to us by the service, nor do we make any attempt to control any on-screen elements beyond text entry of credentials.</value>
|
<value>Bitwarden koristi servis pristupačnosti za pretragu polja za prijavu u aplikacijama i na web stranicama, te potom određuje ID polja za unos korisničkog imena i lozinke kada su pronađeni odgovarajući podaci. Ne spremamo podatke koje servis daje, niti pokušavamo upravljati bilo kojim elementima na zaslonu osim tekstualnog unosa podataka.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Accept" xml:space="preserve">
|
<data name="Accept" xml:space="preserve">
|
||||||
<value>Accept</value>
|
<value>Prihvati</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Decline" xml:space="preserve">
|
<data name="Decline" xml:space="preserve">
|
||||||
<value>Decline</value>
|
<value>Odbij</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoginRequestHasAlreadyExpired" xml:space="preserve">
|
<data name="LoginRequestHasAlreadyExpired" xml:space="preserve">
|
||||||
<value>Login request has already expired.</value>
|
<value>Zahtjev za prijavu je već istekao.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoginAttemptFromXDoYouWantToSwitchToThisAccount" xml:space="preserve">
|
<data name="LoginAttemptFromXDoYouWantToSwitchToThisAccount" xml:space="preserve">
|
||||||
<value>Login attempt from:
|
<value>Pokušaj prijave od:
|
||||||
{0}
|
{0}
|
||||||
Do you want to switch to this account?</value>
|
Želiš li se prebaciti na ovaj račun?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NewAroundHere" xml:space="preserve">
|
<data name="NewAroundHere" xml:space="preserve">
|
||||||
<value>New around here?</value>
|
<value>Novi ovdje?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
<data name="GetMasterPasswordwordHint" xml:space="preserve">
|
||||||
<value>Get master password hint</value>
|
<value>Dobijte podsjetnik glavne lozinke</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>Nisi ti?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInWithMasterPassword" xml:space="preserve">
|
<data name="LogInWithMasterPassword" xml:space="preserve">
|
||||||
<value>Log in with master password</value>
|
<value>Prijava sa glavnom lozinkom</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInWithAnotherDevice" xml:space="preserve">
|
<data name="LogInWithAnotherDevice" xml:space="preserve">
|
||||||
<value>Log in with device</value>
|
<value>Prijava sa drugim uređajem</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInInitiated" xml:space="preserve">
|
<data name="LogInInitiated" xml:space="preserve">
|
||||||
<value>Log in initiated</value>
|
<value>Prijava je pokrenuta</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ANotificationHasBeenSentToYourDevice" xml:space="preserve">
|
<data name="ANotificationHasBeenSentToYourDevice" xml:space="preserve">
|
||||||
<value>A notification has been sent to your device.</value>
|
<value>Obavijest je poslana na tvoj uređaj.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PleaseMakeSureYourVaultIsUnlockedAndTheFingerprintPhraseMatchesOnTheOtherDevice" xml:space="preserve">
|
<data name="PleaseMakeSureYourVaultIsUnlockedAndTheFingerprintPhraseMatchesOnTheOtherDevice" xml:space="preserve">
|
||||||
<value>Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device.</value>
|
<value>Provjeri je li trezor otključan i slaže li se jedinstvena fraza s drugim uređajem.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ResendNotification" xml:space="preserve">
|
<data name="ResendNotification" xml:space="preserve">
|
||||||
<value>Resend notification</value>
|
<value>Ponovno pošalji obavijest</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NeedAnotherOption" xml:space="preserve">
|
<data name="NeedAnotherOption" xml:space="preserve">
|
||||||
<value>Need another option?</value>
|
<value>Trebaš drugu opciju?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ViewAllLoginOptions" xml:space="preserve">
|
<data name="ViewAllLoginOptions" xml:space="preserve">
|
||||||
<value>View all log in options</value>
|
<value>Pogledaj sve mogućnosti prijave</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThisRequestIsNoLongerValid" xml:space="preserve">
|
<data name="ThisRequestIsNoLongerValid" xml:space="preserve">
|
||||||
<value>This request is no longer valid</value>
|
<value>Ovaj zahtjev više ne važi</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PendingLogInRequests" xml:space="preserve">
|
<data name="PendingLogInRequests" xml:space="preserve">
|
||||||
<value>Pending login requests</value>
|
<value>Zahtjevi za prijavu koji su na čekanju</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DeclineAllRequests" xml:space="preserve">
|
<data name="DeclineAllRequests" xml:space="preserve">
|
||||||
<value>Decline all requests</value>
|
<value>Odbij sve zahtjeve</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AreYouSureYouWantToDeclineAllPendingLogInRequests" xml:space="preserve">
|
<data name="AreYouSureYouWantToDeclineAllPendingLogInRequests" xml:space="preserve">
|
||||||
<value>Are you sure you want to decline all pending login requests?</value>
|
<value>Jeste li sigurni da želite odbiti sve zahtjeve koji su na čekanju?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RequestsDeclined" xml:space="preserve">
|
<data name="RequestsDeclined" xml:space="preserve">
|
||||||
<value>Requests declined</value>
|
<value>Zahtjevi odbijeni</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoPendingRequests" xml:space="preserve">
|
<data name="NoPendingRequests" xml:space="preserve">
|
||||||
<value>No pending requests</value>
|
<value>Nema zahtjeva na čekanju</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
||||||
<value>Enable camera permission to use the scanner</value>
|
<value>Omogućite dozvolu za korištenje kamere da bi koristili skener</value>
|
||||||
|
</data>
|
||||||
|
<data name="Language" xml:space="preserve">
|
||||||
|
<value>Language</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
|
<value>The language has been changed to {0}. Please restart the app to see the change</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
|
||||||
|
<value>Language change requires app restart</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
|
<value>Default (System)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Important</value>
|
<value>Važno</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>Tvoja glavna lozinka ne može biti oporavljena ukoliko je zaboraviš! {0} znakova najmanje.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakMasterPassword" xml:space="preserve">
|
<data name="WeakMasterPassword" xml:space="preserve">
|
||||||
<value>Weak Master Password</value>
|
<value>Slaba glavna lozinka</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakPasswordIdentifiedUseAStrongPasswordToProtectYourAccount" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedUseAStrongPasswordToProtectYourAccount" xml:space="preserve">
|
||||||
<value>Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?</value>
|
<value>Slaba lozinka prepoznata. Koristite jaku lozinku za zaštitu Vašeg računa. Da li ste sigurni da želite koristiti slabu lozinku?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Weak" xml:space="preserve">
|
<data name="Weak" xml:space="preserve">
|
||||||
<value>Weak</value>
|
<value>Slabo</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Good" xml:space="preserve">
|
<data name="Good" xml:space="preserve">
|
||||||
<value>Good</value>
|
<value>Dobro</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Strong" xml:space="preserve">
|
<data name="Strong" xml:space="preserve">
|
||||||
<value>Strong</value>
|
<value>Jako</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>Provjeri da li postoji kompromitovana baza podataka povezana sa ovom lozinkom</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExposedMasterPassword" xml:space="preserve">
|
<data name="ExposedMasterPassword" xml:space="preserve">
|
||||||
<value>Exposed Master Password</value>
|
<value>Glavna lozinka je kompromitovana</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="PasswordFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?</value>
|
<value>Lozinka je pronađena u bazama podataka koje su provaljene. Koristite jedinstvenu lozinku da zaštitite vaš račun. Da li ste sigurni da želite koritstiti već kompromitovanu lozinku?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakAndExposedMasterPassword" xml:space="preserve">
|
<data name="WeakAndExposedMasterPassword" xml:space="preserve">
|
||||||
<value>Weak and Exposed Master Password</value>
|
<value>Slaba i kompromitovana glavna lozinka</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?</value>
|
<value>Slaba lozinka prepoznata i pronađena u kompromitovanim bazama podataka. Koristite jaku lozinku za zaštitu Vašeg računa. Da li ste sigurni da želite koristiti ovu lozinku?</value>
|
||||||
|
</data>
|
||||||
|
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
|
||||||
|
<value>Organization SSO identifier required.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
|
||||||
|
<value>Add the key to an existing or new item</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
|
||||||
|
<value>There are no items in your vault that match "{0}"</value>
|
||||||
|
</data>
|
||||||
|
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
|
||||||
|
<value>Search for an item or add a new item</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
|
<value>There are no items that match the search</value>
|
||||||
|
</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">
|
||||||
|
<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 name="CurrentMasterPassword" xml:space="preserve">
|
||||||
|
<value>Current master password</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -583,8 +583,8 @@
|
|||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>Una pista de contrasenya mestra pot ajudar-vos a recordar-la si la oblideu.</value>
|
<value>Una pista de contrasenya mestra pot ajudar-vos a recordar-la si la oblideu.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessage" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>La contrasenya ha de contenir almenys 8 caràcters.</value>
|
<value>La contrasenya mestra ha de contenir almenys {0} caràcters.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>Mínim de caràcters numèrics</value>
|
<value>Mínim de caràcters numèrics</value>
|
||||||
@@ -1752,11 +1752,11 @@ L'escaneig es farà automàticament.</value>
|
|||||||
<value>Esteu segur que voleu enviar-ho a la paperera?</value>
|
<value>Esteu segur que voleu enviar-ho a la paperera?</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="BiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>S'ha detectat un canvi biomètric. Inicieu la sessió mitjançant la contrasenya principal per tornar a activar-la.</value>
|
<value>El desbloqueig biomètric d'aquest compte està deshabilitat mentre es verifica la contrasenya mestra.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Desbloqueig biomètric d'emplenament automàtic deshabilitat. Està pendent de verificació de la contrasenya mestra.</value>
|
<value>El desbloqueig biomètric d'emplenament automàtic d'aquest compte està deshabilitat mentre es verifica la contrasenya mestra.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>Activa la sincronització en actualitzar-se</value>
|
<value>Activa la sincronització en actualitzar-se</value>
|
||||||
@@ -2140,12 +2140,18 @@ L'escaneig es farà automàticament.</value>
|
|||||||
<value>Aquesta organització té una política empresarial que us inscriurà automàticament al restabliment de la contrasenya. La inscripció permetrà als administradors de l’organització canviar la vostra contrasenya mestra.</value>
|
<value>Aquesta organització té una política empresarial que us inscriurà automàticament al restabliment de la contrasenya. La inscripció permetrà als administradors de l’organització canviar la vostra contrasenya mestra.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
||||||
<value>Les polítiques de la vostra organització afecten el temps d'espera de la vostra caixa forta. El temps d'espera màxim permès de la caixa forta és de {0} hores i {1} minuts</value>
|
<value>Les polítiques de l'organització afecten el temps d'espera de la caixa forta. El temps d'espera màxim permès de la caixa forta és de {0} hores i {1} minuts</value>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
|
||||||
|
<value>Les polítiques de l'organització afecten el temps d'espera de la vostra caixa forta. El temps d'espera màxim permès és de {0} hores i {1} minuts. L'acció de temps d'espera de la caixa forta està definida en {2}.</value>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
|
<value>Les polítiques de l'organització han establert l'acció de temps d'espera de la caixa forta a {0}.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>El temps d'espera de la caixa forta supera les restriccions establertes per la vostra organització.</value>
|
<value>El temps d'espera de la caixa forta supera les restriccions establertes per la vostra organització.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DisablePersonalVaultExportPolicyInEffect">
|
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
|
||||||
<value>Una o més polítiques d'organització us impedeixen exportar la vostra caixa forta.</value>
|
<value>Una o més polítiques d'organització us impedeixen exportar la vostra caixa forta.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAccount" xml:space="preserve">
|
<data name="AddAccount" xml:space="preserve">
|
||||||
@@ -2489,8 +2495,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>
|
||||||
@@ -2540,6 +2546,18 @@ Voleu canviar a aquest compte?</value>
|
|||||||
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
||||||
<value>Habilita el permís de la càmera per utilitzar l'escàner</value>
|
<value>Habilita el permís de la càmera per utilitzar l'escàner</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Language" xml:space="preserve">
|
||||||
|
<value>Idioma</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
|
<value>L'idioma s'ha canviat a {0}. Reinicieu l'aplicació per veure el canvi</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
|
||||||
|
<value>El canvi d'idioma requereix un reinici de l'aplicació</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
|
<value>Per defecte (Sistema)</value>
|
||||||
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Important</value>
|
<value>Important</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2576,4 +2594,40 @@ Voleu canviar a aquest compte?</value>
|
|||||||
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Contrasenya feble identificada i trobada en una filtració de dades. Utilitzeu una contrasenya única i segura per protegir el vostre compte. Esteu segur que voleu utilitzar aquesta contrasenya?</value>
|
<value>Contrasenya feble identificada i trobada en una filtració de dades. Utilitzeu una contrasenya única i segura per protegir el vostre compte. Esteu segur que voleu utilitzar aquesta contrasenya?</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
|
||||||
|
<value>L’identificador SSO de l’organització és obligatori.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
|
||||||
|
<value>Afig la clau a un element existent o nou</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
|
||||||
|
<value>No hi ha cap element a la caixa forta que coincidisca amb "{0}"</value>
|
||||||
|
</data>
|
||||||
|
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
|
||||||
|
<value>Cerca un element o n'afig un nou</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
|
<value>No hi ha elements que coincidisquen amb la cerca</value>
|
||||||
|
</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">
|
||||||
|
<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 name="CurrentMasterPassword" xml:space="preserve">
|
||||||
|
<value>Contrasenya mestra actual</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
2634
src/App/Resources/AppResources.cy.resx
Normal file
@@ -583,8 +583,8 @@
|
|||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>Et hovedeadgangskodentip kan hjælpe dig med at huske din adgangskode, hvis du glemmer den.</value>
|
<value>Et hovedeadgangskodentip kan hjælpe dig med at huske din adgangskode, hvis du glemmer den.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessage" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>Hovedadgangskode skal være på minimum 8 tegn.</value>
|
<value>Hovedadgangskoden skal udgøre mindst {0} tegn.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>Mindste antal cifre</value>
|
<value>Mindste antal cifre</value>
|
||||||
@@ -1104,7 +1104,7 @@ Skanning vil ske automatisk.</value>
|
|||||||
<value>Frk</value>
|
<value>Frk</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Mx" xml:space="preserve">
|
<data name="Mx" xml:space="preserve">
|
||||||
<value>Mx</value>
|
<value>Neutral</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="November" xml:space="preserve">
|
<data name="November" xml:space="preserve">
|
||||||
<value>November</value>
|
<value>November</value>
|
||||||
@@ -1752,11 +1752,11 @@ Skanning vil ske automatisk.</value>
|
|||||||
<value>Er du sikker på, at du sende til papirkurven?</value>
|
<value>Er du sikker på, at du sende til papirkurven?</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="BiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Biometrisk oplåsning deaktiveret - afventer verifikation af hovedadgangskoden.</value>
|
<value>Biometrisk oplåsning af denne konto deaktiveret afventende bekræftelse af hovedadgangskode.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Biometrisk oplåsning til autoudfyldning deaktiveret - afventer verifikation af hovedadgangskoden.</value>
|
<value>Autoudfyldelse for biometrisk oplåsning af denne konto deaktiveret afventende bekræftelse af hovedadgangskode.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>Tillad synk ved opfriskning</value>
|
<value>Tillad synk ved opfriskning</value>
|
||||||
@@ -2142,10 +2142,16 @@ Skanning vil ske automatisk.</value>
|
|||||||
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
||||||
<value>Dine organisationspolitikker påvirker din boks-timeout. Maksimum tilladte boks-timeout er {0} time(r) og {1} minut(ter)</value>
|
<value>Dine organisationspolitikker påvirker din boks-timeout. Maksimum tilladte boks-timeout er {0} time(r) og {1} minut(ter)</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
|
||||||
|
<value>Organisationspolitikkerne påvirker boks-timeout. Maks. tilladt boks-timeout er {0} time(r) og {1} minut(ter). Boks-timeout er pt. sat til {2}.</value>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
|
<value>Organisationspolitikker har sat boks-timeouthandlingen til {0}.</value>
|
||||||
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>Timeout for din boks overskrider de begrænsninger, der er angivet af din organisation.</value>
|
<value>Timeout for din boks overskrider de begrænsninger, der er angivet af din organisation.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DisablePersonalVaultExportPolicyInEffect">
|
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
|
||||||
<value>En eller flere organisationspolitikker forhindrer eksport af din personlige boks.</value>
|
<value>En eller flere organisationspolitikker forhindrer eksport af din personlige boks.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAccount" xml:space="preserve">
|
<data name="AddAccount" xml:space="preserve">
|
||||||
@@ -2489,8 +2495,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>
|
||||||
@@ -2499,7 +2505,7 @@ Vil du skifte til denne konto?</value>
|
|||||||
<value>Log ind med hovedadgangskoden</value>
|
<value>Log ind med hovedadgangskoden</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInWithAnotherDevice" xml:space="preserve">
|
<data name="LogInWithAnotherDevice" xml:space="preserve">
|
||||||
<value>Log ind med en anden enhed</value>
|
<value>Log ind med enhed</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInInitiated" xml:space="preserve">
|
<data name="LogInInitiated" xml:space="preserve">
|
||||||
<value>Indlogning påbegyndt</value>
|
<value>Indlogning påbegyndt</value>
|
||||||
@@ -2540,6 +2546,18 @@ Vil du skifte til denne konto?</value>
|
|||||||
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
||||||
<value>Tildel kameratilladelse for brug af skanneren</value>
|
<value>Tildel kameratilladelse for brug af skanneren</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Language" xml:space="preserve">
|
||||||
|
<value>Sprog</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
|
<value>Sproget er blevet ændret til {0}. Genstart appen for at se ændringen</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
|
||||||
|
<value>Skift af sprog kræver app-genstart</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
|
<value>Standard (system)</value>
|
||||||
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Vigtigt</value>
|
<value>Vigtigt</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2576,4 +2594,40 @@ Vil du skifte til denne konto?</value>
|
|||||||
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Svag adgangskode identificeret og fundet i datalæk. Brug en unik adgangskode til at beskytte din konto. Sikker på, at du vil bruge denne adgangskode?</value>
|
<value>Svag adgangskode identificeret og fundet i datalæk. Brug en unik adgangskode til at beskytte din konto. Sikker på, at du vil bruge denne adgangskode?</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
|
||||||
|
<value>Organisations-SSO obligatorisk.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
|
||||||
|
<value>Føj nøglen til et eksisterende eller nyt emne</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
|
||||||
|
<value>Der er ingen emner i boksen matchende "{0}"</value>
|
||||||
|
</data>
|
||||||
|
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
|
||||||
|
<value>Søg efter, eller tilføj et nyt, emne</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
|
<value>Ingen emner matcher søgningen</value>
|
||||||
|
</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">
|
||||||
|
<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 name="CurrentMasterPassword" xml:space="preserve">
|
||||||
|
<value>Aktuel hovedadgangskode</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -156,7 +156,7 @@
|
|||||||
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyUsername" xml:space="preserve">
|
<data name="CopyUsername" xml:space="preserve">
|
||||||
<value>Nutzernamen kopieren</value>
|
<value>Benutzername kopieren</value>
|
||||||
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Credits" xml:space="preserve">
|
<data name="Credits" xml:space="preserve">
|
||||||
@@ -229,10 +229,10 @@
|
|||||||
<value>Ordner</value>
|
<value>Ordner</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FolderUpdated" xml:space="preserve">
|
<data name="FolderUpdated" xml:space="preserve">
|
||||||
<value>Ordner aktualisiert</value>
|
<value>Ordner gespeichert</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GoToWebsite" xml:space="preserve">
|
<data name="GoToWebsite" xml:space="preserve">
|
||||||
<value>Webseite besuchen</value>
|
<value>Zur Website</value>
|
||||||
<comment>The button text that allows user to launch the website to their web browser.</comment>
|
<comment>The button text that allows user to launch the website to their web browser.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="HelpAndFeedback" xml:space="preserve">
|
<data name="HelpAndFeedback" xml:space="preserve">
|
||||||
@@ -285,10 +285,10 @@
|
|||||||
<value>Konto bereits hinzugefügt</value>
|
<value>Konto bereits hinzugefügt</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SwitchToAlreadyAddedAccountConfirmation" xml:space="preserve">
|
<data name="SwitchToAlreadyAddedAccountConfirmation" xml:space="preserve">
|
||||||
<value>Möchtest du jetzt darauf umschalten?</value>
|
<value>Möchtest du jetzt dazu wechseln?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPassword" xml:space="preserve">
|
<data name="MasterPassword" xml:space="preserve">
|
||||||
<value>Masterpasswort</value>
|
<value>Master-Passwort</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">
|
||||||
@@ -375,14 +375,14 @@
|
|||||||
<comment>Validation message for when a form field is left blank and is required to be entered.</comment>
|
<comment>Validation message for when a form field is left blank and is required to be entered.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ValueHasBeenCopied" xml:space="preserve">
|
<data name="ValueHasBeenCopied" xml:space="preserve">
|
||||||
<value>{0} wurde kopiert</value>
|
<value>{0} kopiert</value>
|
||||||
<comment>Confirmation message after successfully copying a value to the clipboard.</comment>
|
<comment>Confirmation message after successfully copying a value to the clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerifyFingerprint" xml:space="preserve">
|
<data name="VerifyFingerprint" xml:space="preserve">
|
||||||
<value>Fingerabdruck überprüfen</value>
|
<value>Fingerabdruck verifizieren</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerifyMasterPassword" xml:space="preserve">
|
<data name="VerifyMasterPassword" xml:space="preserve">
|
||||||
<value>Masterpasswort überprüfen</value>
|
<value>Master-Passwort verifizieren</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerifyPIN" xml:space="preserve">
|
<data name="VerifyPIN" xml:space="preserve">
|
||||||
<value>PIN überprüfen</value>
|
<value>PIN überprüfen</value>
|
||||||
@@ -394,7 +394,7 @@
|
|||||||
<value>Ansicht</value>
|
<value>Ansicht</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VisitOurWebsite" xml:space="preserve">
|
<data name="VisitOurWebsite" xml:space="preserve">
|
||||||
<value>Besuchen Sie unsere Website</value>
|
<value>Besuche unsere Website</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VisitOurWebsiteDescription" xml:space="preserve">
|
<data name="VisitOurWebsiteDescription" xml:space="preserve">
|
||||||
<value>Besuche unsere Webseite um Hilfe zu erhalten, Neuigkeiten zu erfahren, Kontakt aufzunehmen und mehr über die Verwendung von Bitwarden zu lernen.</value>
|
<value>Besuche unsere Webseite um Hilfe zu erhalten, Neuigkeiten zu erfahren, Kontakt aufzunehmen und mehr über die Verwendung von Bitwarden zu lernen.</value>
|
||||||
@@ -422,7 +422,7 @@
|
|||||||
<value>Verwende den Bitwarden Dienst in den Bedienungshilfen, um deine Zugangsdaten in Apps und im Web automatisch ausfüllen zu lassen.</value>
|
<value>Verwende den Bitwarden Dienst in den Bedienungshilfen, um deine Zugangsdaten in Apps und im Web automatisch ausfüllen zu lassen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillService" xml:space="preserve">
|
<data name="AutofillService" xml:space="preserve">
|
||||||
<value>Auto-Ausfüllen Funktion</value>
|
<value>Auto-Ausfüllen-Dienst</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
||||||
<value>Mehrdeutige Zeichen vermeiden</value>
|
<value>Mehrdeutige Zeichen vermeiden</value>
|
||||||
@@ -431,7 +431,7 @@
|
|||||||
<value>Bitwarden App-Erweiterung</value>
|
<value>Bitwarden App-Erweiterung</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAppExtensionAlert2" xml:space="preserve">
|
<data name="BitwardenAppExtensionAlert2" xml:space="preserve">
|
||||||
<value>Die einfachste Möglichkeit, neue Anmeldedaten zu Ihrem Tresor hinzuzufügen, ist die Bitwarden App Erweiterung. Erfahren Sie mehr über die Bitwarden App Erweiterung, indem Sie zu dem "Einstellungen"-Bildschirm navigieren.</value>
|
<value>Die einfachste Möglichkeit, neue Zugangsdaten zu deinem Tresor hinzuzufügen, ist die Bitwarden App-Erweiterung. Erfahre mehr über die Benutzung der Bitwarden App-Erweiterung, indem du zu den "Einstellungen" wechselst.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAppExtensionDescription" xml:space="preserve">
|
<data name="BitwardenAppExtensionDescription" xml:space="preserve">
|
||||||
<value>Nutze Bitwarden in Safari und anderen Apps, um Zugangsdaten automatisch einzufügen.</value>
|
<value>Nutze Bitwarden in Safari und anderen Apps, um Zugangsdaten automatisch einzufügen.</value>
|
||||||
@@ -443,7 +443,7 @@
|
|||||||
<value>Verwende den Bitwarden Dienst in den Bedienungshilfen um deine Zugangsdaten automatisch einzufügen.</value>
|
<value>Verwende den Bitwarden Dienst in den Bedienungshilfen um deine Zugangsdaten automatisch einzufügen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChangeEmail" xml:space="preserve">
|
<data name="ChangeEmail" xml:space="preserve">
|
||||||
<value>E-Mail Adresse ändern</value>
|
<value>E-Mail-Adresse ändern</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChangeEmailConfirmation" xml:space="preserve">
|
<data name="ChangeEmailConfirmation" xml:space="preserve">
|
||||||
<value>Du kannst deine E-Mail Adresse im Bitwarden.com Web-Tresor ändern. Möchtest du die Seite jetzt öffnen?</value>
|
<value>Du kannst deine E-Mail Adresse im Bitwarden.com Web-Tresor ändern. Möchtest du die Seite jetzt öffnen?</value>
|
||||||
@@ -471,13 +471,13 @@
|
|||||||
<value>Eintrag bearbeiten</value>
|
<value>Eintrag bearbeiten</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
||||||
<value>Automatische Synchronisierung aktivieren</value>
|
<value>Automatische Synchronisierung zulassen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnterEmailForHint" xml:space="preserve">
|
<data name="EnterEmailForHint" xml:space="preserve">
|
||||||
<value>Gebe die E-Mail Adresse deines Kontos ein, um den Hinweis für dein Master-Passwort zu erhalten.</value>
|
<value>Gebe die E-Mail Adresse deines Kontos ein, um den Hinweis für dein Master-Passwort zu erhalten.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExntesionReenable" xml:space="preserve">
|
<data name="ExntesionReenable" xml:space="preserve">
|
||||||
<value>App-Erweiterung wieder aktivieren</value>
|
<value>App-Erweiterung reaktivieren</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionAlmostDone" xml:space="preserve">
|
<data name="ExtensionAlmostDone" xml:space="preserve">
|
||||||
<value>Fast geschafft!</value>
|
<value>Fast geschafft!</value>
|
||||||
@@ -514,7 +514,7 @@
|
|||||||
<value>Fingerabdruck</value>
|
<value>Fingerabdruck</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GeneratePassword" xml:space="preserve">
|
<data name="GeneratePassword" xml:space="preserve">
|
||||||
<value>Passwort erstellen</value>
|
<value>Passwort generieren</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GetPasswordHint" xml:space="preserve">
|
<data name="GetPasswordHint" xml:space="preserve">
|
||||||
<value>Hinweis zum Masterpasswort zusenden</value>
|
<value>Hinweis zum Masterpasswort zusenden</value>
|
||||||
@@ -566,7 +566,7 @@
|
|||||||
<comment>Message shown when interacting with the server</comment>
|
<comment>Message shown when interacting with the server</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoginOrCreateNewAccount" xml:space="preserve">
|
<data name="LoginOrCreateNewAccount" xml:space="preserve">
|
||||||
<value>Melde dich an oder erstelle einen neuen Account, um auf Deinen Tresor zuzugreifen.</value>
|
<value>Melde dich an oder erstelle ein neues Konto, um auf deinen Tresor zuzugreifen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Manage" xml:space="preserve">
|
<data name="Manage" xml:space="preserve">
|
||||||
<value>Verwalten</value>
|
<value>Verwalten</value>
|
||||||
@@ -583,11 +583,11 @@
|
|||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>Ein Hinweis auf dein Master-Passwort kann dir helfen, dich an das Passwort zu erinnern, solltest du es vergessen.</value>
|
<value>Ein Hinweis auf dein Master-Passwort kann dir helfen, dich an das Passwort zu erinnern, solltest du es vergessen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessage" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>Das Masterpasswort muss mindestens 8 Zeichen lang sein.</value>
|
<value>Das Master-Passwort muss mindestens {0} Zeichen lang sein.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>Mindestanzahl Zahlen</value>
|
<value>Mindestanzahl Ziffern</value>
|
||||||
<comment>Minimum numeric characters for password generator settings</comment>
|
<comment>Minimum numeric characters for password generator settings</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinSpecial" xml:space="preserve">
|
<data name="MinSpecial" xml:space="preserve">
|
||||||
@@ -635,10 +635,10 @@
|
|||||||
<value>Passwort generiert</value>
|
<value>Passwort generiert</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordGenerator" xml:space="preserve">
|
<data name="PasswordGenerator" xml:space="preserve">
|
||||||
<value>Passwortgenerator</value>
|
<value>Passwort-Generator</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordHint" xml:space="preserve">
|
<data name="PasswordHint" xml:space="preserve">
|
||||||
<value>Passworthinweis</value>
|
<value>Passwort-Hinweis</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordHintAlert" xml:space="preserve">
|
<data name="PasswordHintAlert" xml:space="preserve">
|
||||||
<value>Wir haben Ihnen eine E-Mail mit Ihrem Masterpassworthinweis gesendet.</value>
|
<value>Wir haben Ihnen eine E-Mail mit Ihrem Masterpassworthinweis gesendet.</value>
|
||||||
@@ -647,7 +647,7 @@
|
|||||||
<value>Bist du sicher, dass du das aktuelle Passwort überschreiben möchtest?</value>
|
<value>Bist du sicher, dass du das aktuelle Passwort überschreiben möchtest?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PushNotificationAlert" xml:space="preserve">
|
<data name="PushNotificationAlert" xml:space="preserve">
|
||||||
<value>Bitwarden aktualisiert deinen Tresor mit Push-Benachrichtigungen. Für die bestmögliche Benutzererfahrung tippe im folgenden Dialogfenster auf "Ok", um Push-Benachrichtigungen zu aktivieren.</value>
|
<value>Bitwarden hält deinen Tresor durch Push-Benachrichtigungen automatisch synchronisiert. Für die bestmögliche Benutzererfahrung tippe im folgenden Dialogfenster auf "Erlauben", um Push-Benachrichtigungen zu erlauben.</value>
|
||||||
<comment>Push notifications for apple products</comment>
|
<comment>Push notifications for apple products</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="RateTheApp" xml:space="preserve">
|
<data name="RateTheApp" xml:space="preserve">
|
||||||
@@ -678,10 +678,10 @@
|
|||||||
<value>Gebe deine 4-stellige PIN ein, um die App zu entsperren.</value>
|
<value>Gebe deine 4-stellige PIN ein, um die App zu entsperren.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ItemInformation" xml:space="preserve">
|
<data name="ItemInformation" xml:space="preserve">
|
||||||
<value>Eintrags-Information</value>
|
<value>Eintragsinformationen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ItemUpdated" xml:space="preserve">
|
<data name="ItemUpdated" xml:space="preserve">
|
||||||
<value>Eintrag aktualisiert</value>
|
<value>Eintrag gespeichert</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submitting" xml:space="preserve">
|
<data name="Submitting" xml:space="preserve">
|
||||||
<value>Wird übermittelt...</value>
|
<value>Wird übermittelt...</value>
|
||||||
@@ -708,7 +708,7 @@
|
|||||||
<value>Zwei-Faktor-Authentifizierung</value>
|
<value>Zwei-Faktor-Authentifizierung</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TwoStepLoginConfirmation" xml:space="preserve">
|
<data name="TwoStepLoginConfirmation" xml:space="preserve">
|
||||||
<value>Mit der Zwei-Faktor-Authentifizierung wird dein Account zusätzlich abgesichert, da jede Anmeldung durch einen Sicherheitscode, eine Authentifizierungs-App, SMS, einen Anruf oder eine E-Mail verifiziert werden muss. Die Zwei-Faktor-Authentifizierung kann im Web-Tresor unter bitwarden.com aktiviert werden. Möchtest du die Seite jetzt öffnen?</value>
|
<value>Mit der Zwei-Faktor-Authentifizierung wird dein Konto zusätzlich abgesichert, da jede Anmeldung mit einem anderen Gerät wie einem Sicherheitsschlüssel, einer Authentifizierungs-App, einer SMS, einem Anruf oder einer E-Mail verifiziert werden muss. Die Zwei-Faktor-Authentifizierung kann im bitwarden.com Web-Tresor aktiviert werden. Möchtest du die Webseite jetzt öffnen?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UnlockWith" xml:space="preserve">
|
<data name="UnlockWith" xml:space="preserve">
|
||||||
<value>Mit {0} entsperren</value>
|
<value>Mit {0} entsperren</value>
|
||||||
@@ -721,7 +721,7 @@
|
|||||||
<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>Verifizierungscode </value>
|
<value>Verifizierungscode</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ViewItem" xml:space="preserve">
|
<data name="ViewItem" xml:space="preserve">
|
||||||
<value>Eintrag anzeigen</value>
|
<value>Eintrag anzeigen</value>
|
||||||
@@ -815,7 +815,7 @@
|
|||||||
<comment>Message shown when trying to launch an app that does not exist on the user's device.</comment>
|
<comment>Message shown when trying to launch an app that does not exist on the user's device.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AuthenticatorAppTitle" xml:space="preserve">
|
<data name="AuthenticatorAppTitle" xml:space="preserve">
|
||||||
<value>Authentifizierungs-App</value>
|
<value>Authenticator App</value>
|
||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnterVerificationCodeApp" xml:space="preserve">
|
<data name="EnterVerificationCodeApp" xml:space="preserve">
|
||||||
@@ -827,11 +827,11 @@
|
|||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoginUnavailable" xml:space="preserve">
|
<data name="LoginUnavailable" xml:space="preserve">
|
||||||
<value>Zugangsdaten nicht verfügbar</value>
|
<value>Anmeldung nicht verfügbar</value>
|
||||||
<comment>For 2FA whenever there are no available providers on this device.</comment>
|
<comment>For 2FA whenever there are no available providers on this device.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoTwoStepAvailable" xml:space="preserve">
|
<data name="NoTwoStepAvailable" xml:space="preserve">
|
||||||
<value>Dieses Konto hat eine aktive Zwei-Faktor-Authentifizierung, allerdings wird keiner der konfigurierten Zwei-Faktor-Anbieter von diesem Gerät unterstützt. Bitte nutzen Sie ein unterstütztes Gerät und / oder fügen Sie zusätzliche Anbieter hinzu, die von mehr Geräten unterstützt werden (wie eine Authentifizierungs-App).</value>
|
<value>Für dieses Konto ist eine aktive Zwei-Faktor-Authentifizierung eingerichtet, allerdings wird keiner der konfigurierten Zwei-Faktor-Anbieter von diesem Gerät unterstützt. Bitte nutze ein unterstütztes Gerät und / oder füge zusätzliche Anbieter hinzu, die von mehr Geräten unterstützt werden (wie eine Authentifizierungs-App).</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RecoveryCodeTitle" xml:space="preserve">
|
<data name="RecoveryCodeTitle" xml:space="preserve">
|
||||||
<value>Wiederherstellungscode</value>
|
<value>Wiederherstellungscode</value>
|
||||||
@@ -846,7 +846,7 @@
|
|||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="TwoStepLoginOptions" xml:space="preserve">
|
<data name="TwoStepLoginOptions" xml:space="preserve">
|
||||||
<value>Optionen für Zwei-Faktor Authentifizierung</value>
|
<value>Optionen für Zwei-Faktor-Authentifizierung</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UseAnotherTwoStepMethod" xml:space="preserve">
|
<data name="UseAnotherTwoStepMethod" xml:space="preserve">
|
||||||
<value>Verwende eine andere Zwei-Faktor Authentifizierungsmethode</value>
|
<value>Verwende eine andere Zwei-Faktor Authentifizierungsmethode</value>
|
||||||
@@ -856,18 +856,18 @@
|
|||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerificationEmailSent" xml:space="preserve">
|
<data name="VerificationEmailSent" xml:space="preserve">
|
||||||
<value>Bestätigungsmail wurde gesendet</value>
|
<value>Verifizierung-E-Mail versendet</value>
|
||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="YubiKeyInstruction" xml:space="preserve">
|
<data name="YubiKeyInstruction" xml:space="preserve">
|
||||||
<value>Halte deinen YubiKey NEO an die Rückseite des Geräts, um fortzufahren.</value>
|
<value>Halte deinen YubiKey NEO an die Rückseite des Geräts, um fortzufahren.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="YubiKeyTitle" xml:space="preserve">
|
<data name="YubiKeyTitle" xml:space="preserve">
|
||||||
<value>YubiKey NEO Sicherheitsschlüssel</value>
|
<value>YubiKey Sicherheitsschlüssel</value>
|
||||||
<comment>"YubiKey" is the product name and should not be translated.</comment>
|
<comment>"YubiKey" is the product name and should not be translated.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddNewAttachment" xml:space="preserve">
|
<data name="AddNewAttachment" xml:space="preserve">
|
||||||
<value>Anhang hinzufügen</value>
|
<value>Neuen Anhang hinzufügen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Attachments" xml:space="preserve">
|
<data name="Attachments" xml:space="preserve">
|
||||||
<value>Anhänge</value>
|
<value>Anhänge</value>
|
||||||
@@ -916,7 +916,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>TOTP kopieren</value>
|
<value>TOTP kopieren</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyTotpAutomaticallyDescription" xml:space="preserve">
|
<data name="CopyTotpAutomaticallyDescription" xml:space="preserve">
|
||||||
<value>Falls Zugangsdaten einen Authentifizierungsschlüssel haben, den TOTP-Verifizierungsscode nach dem automatischen Ausfüllen in die Zwischenablage kopieren.</value>
|
<value>Ist ein Authentifizierungsschlüssel mit deinen Zugangsdaten verknüpft, wird der TOTP Verifizierungscode in die Zwischenablage kopiert, wenn du die Zugangsdaten automatisch einfügen lässt.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyTotpAutomatically" xml:space="preserve">
|
<data name="CopyTotpAutomatically" xml:space="preserve">
|
||||||
<value>TOTP automatisch kopieren</value>
|
<value>TOTP automatisch kopieren</value>
|
||||||
@@ -958,7 +958,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Mehr erfahren</value>
|
<value>Mehr erfahren</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ApiUrl" xml:space="preserve">
|
<data name="ApiUrl" xml:space="preserve">
|
||||||
<value>API Server URL</value>
|
<value>API Server-URL</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CustomEnvironment" xml:space="preserve">
|
<data name="CustomEnvironment" xml:space="preserve">
|
||||||
<value>Benutzerdefinierte Umgebung</value>
|
<value>Benutzerdefinierte Umgebung</value>
|
||||||
@@ -974,11 +974,11 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<comment>Validation error when something is not formatted correctly, such as a URL or email address.</comment>
|
<comment>Validation error when something is not formatted correctly, such as a URL or email address.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="IdentityUrl" xml:space="preserve">
|
<data name="IdentityUrl" xml:space="preserve">
|
||||||
<value>Identitätsserver-URL</value>
|
<value>URL des Identitätsservers</value>
|
||||||
<comment>"Identity" refers to an identity server. See more context here https://en.wikipedia.org/wiki/Identity_management</comment>
|
<comment>"Identity" refers to an identity server. See more context here https://en.wikipedia.org/wiki/Identity_management</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SelfHostedEnvironment" xml:space="preserve">
|
<data name="SelfHostedEnvironment" xml:space="preserve">
|
||||||
<value>Selbstgehostete Umgebung</value>
|
<value>Selbst gehostete Umgebung</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SelfHostedEnvironmentFooter" xml:space="preserve">
|
<data name="SelfHostedEnvironmentFooter" xml:space="preserve">
|
||||||
<value>Bitte gebe die Basis-URL deiner selbst gehosteten Bitwarden-Installation an.</value>
|
<value>Bitte gebe die Basis-URL deiner selbst gehosteten Bitwarden-Installation an.</value>
|
||||||
@@ -987,7 +987,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Server URL</value>
|
<value>Server URL</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WebVaultUrl" xml:space="preserve">
|
<data name="WebVaultUrl" xml:space="preserve">
|
||||||
<value>Web-Tresor Server URL</value>
|
<value>URL des Web-Tresor-Servers</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillServiceNotificationContentOld" xml:space="preserve">
|
<data name="BitwardenAutofillServiceNotificationContentOld" xml:space="preserve">
|
||||||
<value>Tippe auf diese Benachrichtigung um Einträge aus deinem Tresor anzusehen.</value>
|
<value>Tippe auf diese Benachrichtigung um Einträge aus deinem Tresor anzusehen.</value>
|
||||||
@@ -1140,13 +1140,13 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Gültig bis</value>
|
<value>Gültig bis</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ShowWebsiteIcons" xml:space="preserve">
|
<data name="ShowWebsiteIcons" xml:space="preserve">
|
||||||
<value>Zeige Webseiten-Icons</value>
|
<value>Website-Symbole anzeigen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ShowWebsiteIconsDescription" xml:space="preserve">
|
<data name="ShowWebsiteIconsDescription" xml:space="preserve">
|
||||||
<value>Ein wiedererkennbares Bild neben jeden Zugangsdaten anzeigen.</value>
|
<value>Ein wiedererkennbares Bild neben jeden Zugangsdaten anzeigen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="IconsUrl" xml:space="preserve">
|
<data name="IconsUrl" xml:space="preserve">
|
||||||
<value>Icons Server URL</value>
|
<value>URL des Icons-Servers</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillWithBitwarden" xml:space="preserve">
|
<data name="AutofillWithBitwarden" xml:space="preserve">
|
||||||
<value>Mit Bitwarden automatisch ausfüllen</value>
|
<value>Mit Bitwarden automatisch ausfüllen</value>
|
||||||
@@ -1173,10 +1173,10 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Auto-Fill Bedienungshilfe</value>
|
<value>Auto-Fill Bedienungshilfe</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillServiceDescription" xml:space="preserve">
|
<data name="AutofillServiceDescription" xml:space="preserve">
|
||||||
<value>Der Bitwarden Auto-Fill Service benutzt das Android Autofill Framework, um Logins, Kreditkarten und Identitätsinformationen in anderen Apps auf Ihrem Gerät zu befüllen.</value>
|
<value>Der Auto-Ausfüllen-Dienst von Bitwarden benutzt das Android Autofill Framework, um Zugangsdaten in anderen Apps auf deinem Gerät auszufüllen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillServiceDescription" xml:space="preserve">
|
<data name="BitwardenAutofillServiceDescription" xml:space="preserve">
|
||||||
<value>Verwende den Bitwarden Dienst in den Bedienungshilfen, um deine Zugangsdaten automatisch einzufügen.</value>
|
<value>Verwende den Auto-Ausfüllen-Dienst von Bitwarden, um Anmeldedaten in anderen Apps auszufüllen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillServiceOpenAutofillSettings" xml:space="preserve">
|
<data name="BitwardenAutofillServiceOpenAutofillSettings" xml:space="preserve">
|
||||||
<value>Öffne Auto-Fill Einstellungen</value>
|
<value>Öffne Auto-Fill Einstellungen</value>
|
||||||
@@ -1201,7 +1201,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Die Android Auto-Fill Einstellungen konnten nicht automatisch geöffnet werden. Über Android Einstellungen > Sprachen & Eingabe > AutoFill-Dienst kannst du manuell zu den Auto-Fill Einstellungen navigieren.</value>
|
<value>Die Android Auto-Fill Einstellungen konnten nicht automatisch geöffnet werden. Über Android Einstellungen > Sprachen & Eingabe > AutoFill-Dienst kannst du manuell zu den Auto-Fill Einstellungen navigieren.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CustomFieldName" xml:space="preserve">
|
<data name="CustomFieldName" xml:space="preserve">
|
||||||
<value>Name Benutzerdefiniertes Feld</value>
|
<value>Name des benutzerdefinierten Feldes</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FieldTypeBoolean" xml:space="preserve">
|
<data name="FieldTypeBoolean" xml:space="preserve">
|
||||||
<value>Boolean</value>
|
<value>Boolean</value>
|
||||||
@@ -1252,14 +1252,14 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Beginnt mit</value>
|
<value>Beginnt mit</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="URIMatchDetection" xml:space="preserve">
|
<data name="URIMatchDetection" xml:space="preserve">
|
||||||
<value>Match-Erkennung</value>
|
<value>URI-Übereinstimmungserkennung</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MatchDetection" xml:space="preserve">
|
<data name="MatchDetection" xml:space="preserve">
|
||||||
<value>Match-Erkennung</value>
|
<value>Übereinstimmungserkennung</value>
|
||||||
<comment>URI match detection for auto-fill.</comment>
|
<comment>URI match detection for auto-fill.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="YesAndSave" xml:space="preserve">
|
<data name="YesAndSave" xml:space="preserve">
|
||||||
<value>Ja, und speichern</value>
|
<value>Ja und speichern</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillAndSave" xml:space="preserve">
|
<data name="AutofillAndSave" xml:space="preserve">
|
||||||
<value>Automatisch ausfüllen und speichern</value>
|
<value>Automatisch ausfüllen und speichern</value>
|
||||||
@@ -1289,7 +1289,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<comment>ex. Date this item was updated</comment>
|
<comment>ex. Date this item was updated</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillActivated" xml:space="preserve">
|
<data name="AutofillActivated" xml:space="preserve">
|
||||||
<value>AutoFill aktiviert!</value>
|
<value>Auto-Ausfüllen aktiviert!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MustLogInMainAppAutofill" xml:space="preserve">
|
<data name="MustLogInMainAppAutofill" xml:space="preserve">
|
||||||
<value>Du musst dich in der Bitwarden App einloggen, bevor du AutoFill nutzen kannst.</value>
|
<value>Du musst dich in der Bitwarden App einloggen, bevor du AutoFill nutzen kannst.</value>
|
||||||
@@ -1304,7 +1304,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Greife auf deinen Tressor direkt von deiner Tastatur aus zu um Passwörter schnell und automatisch auszufüllen.</value>
|
<value>Greife auf deinen Tressor direkt von deiner Tastatur aus zu um Passwörter schnell und automatisch auszufüllen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillTurnOn" xml:space="preserve">
|
<data name="AutofillTurnOn" xml:space="preserve">
|
||||||
<value>Um Autofill auf deinem Gerät zu aktivieren, befolge bitte diese Anweisungen:</value>
|
<value>Um das automatische Ausfüllen von Passwörtern auf deinem Gerät einzurichten, befolge bitte diese Anweisungen:</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillTurnOn1" xml:space="preserve">
|
<data name="AutofillTurnOn1" xml:space="preserve">
|
||||||
<value>1. Gehe in die iOS Einstellungen</value>
|
<value>1. Gehe in die iOS Einstellungen</value>
|
||||||
@@ -1322,7 +1322,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>5. Wähle "Bitwarden"</value>
|
<value>5. Wähle "Bitwarden"</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordAutofill" xml:space="preserve">
|
<data name="PasswordAutofill" xml:space="preserve">
|
||||||
<value>Passwort AutoFill</value>
|
<value>Passwort automatisch ausfüllen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillAlert2" xml:space="preserve">
|
<data name="BitwardenAutofillAlert2" xml:space="preserve">
|
||||||
<value>Die einfachste Möglichkeit, neue Zugangsdaten zu deinemTresor hinzuzufügen, ist die Bitwarden Passwort Auto-Ausfüllen Erweiterung. Erfahre mehr über die Bitwarden Passwort Auto-Ausfüllen Funktion, indem du zur "Einstellungen" wechselst.</value>
|
<value>Die einfachste Möglichkeit, neue Zugangsdaten zu deinemTresor hinzuzufügen, ist die Bitwarden Passwort Auto-Ausfüllen Erweiterung. Erfahre mehr über die Bitwarden Passwort Auto-Ausfüllen Funktion, indem du zur "Einstellungen" wechselst.</value>
|
||||||
@@ -1384,13 +1384,13 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Sammlung durchsuchen</value>
|
<value>Sammlung durchsuchen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SearchFileSends" xml:space="preserve">
|
<data name="SearchFileSends" xml:space="preserve">
|
||||||
<value>Versendete Dateien suchen</value>
|
<value>Datei-Sends durchsuchen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SearchTextSends" xml:space="preserve">
|
<data name="SearchTextSends" xml:space="preserve">
|
||||||
<value>Versendete Texte suchen</value>
|
<value>Text-Sends durchsuchen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SearchGroup" xml:space="preserve">
|
<data name="SearchGroup" xml:space="preserve">
|
||||||
<value>Suche {0}</value>
|
<value>{0} durchsuchen</value>
|
||||||
<comment>ex: Search Logins</comment>
|
<comment>ex: Search Logins</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Type" xml:space="preserve">
|
<data name="Type" xml:space="preserve">
|
||||||
@@ -1437,7 +1437,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Keine Organisationen vorhanden.</value>
|
<value>Keine Organisationen vorhanden.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MoveToOrgDesc" xml:space="preserve">
|
<data name="MoveToOrgDesc" xml:space="preserve">
|
||||||
<value>Wähle eine Organisation aus, in die du diesen Eintrag verschieben möchtest. Das Verschieben in eine Organisation überträgt das Eigentum an diese Organisation. Du bist nicht mehr der direkte Besitzer dieses Eintrags, sobald er verschoben wurde.</value>
|
<value>Wähle eine Organisation aus, in die du diesen Eintrag verschieben möchtest. Das Verschieben in eine Organisation überträgt das Eigentum an diese Organisation. Du bist nicht mehr der direkte Eigentümer dieses Eintrags, sobald er verschoben wurde.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NumberOfWords" xml:space="preserve">
|
<data name="NumberOfWords" xml:space="preserve">
|
||||||
<value>Anzahl der Wörter</value>
|
<value>Anzahl der Wörter</value>
|
||||||
@@ -1502,7 +1502,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Dein Tresor ist gesperrt. Gebe deinen PIN-Code ein um fortzufahren.</value>
|
<value>Dein Tresor ist gesperrt. Gebe deinen PIN-Code ein um fortzufahren.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultLockedIdentity" xml:space="preserve">
|
<data name="VaultLockedIdentity" xml:space="preserve">
|
||||||
<value>Dein Tresor ist gesperrt. Überprüfe deine Identität, um fortzufahren.</value>
|
<value>Dein Tresor ist gesperrt. Verifiziere deine Identität, um fortzufahren.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Dark" xml:space="preserve">
|
<data name="Dark" xml:space="preserve">
|
||||||
<value>Dunkel</value>
|
<value>Dunkel</value>
|
||||||
@@ -1536,7 +1536,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<comment>Clipboard is the operating system thing where you copy/paste data to on your device.</comment>
|
<comment>Clipboard is the operating system thing where you copy/paste data to on your device.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="DefaultUriMatchDetection" xml:space="preserve">
|
<data name="DefaultUriMatchDetection" xml:space="preserve">
|
||||||
<value>Standard-URI-Match-Erkennung</value>
|
<value>Standard URI-Übereinstimmungserkennung</value>
|
||||||
<comment>Default URI match detection for auto-fill.</comment>
|
<comment>Default URI match detection for auto-fill.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="DefaultUriMatchDetectionDescription" xml:space="preserve">
|
<data name="DefaultUriMatchDetectionDescription" xml:space="preserve">
|
||||||
@@ -1553,13 +1553,13 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Standard (System)</value>
|
<value>Standard (System)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DefaultDarkTheme" xml:space="preserve">
|
<data name="DefaultDarkTheme" xml:space="preserve">
|
||||||
<value>Dunkles Standard Design</value>
|
<value>Dunkles Standard-Design</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DefaultDarkThemeDescription" xml:space="preserve">
|
<data name="DefaultDarkThemeDescription" xml:space="preserve">
|
||||||
<value>Wähle das zu verwendende dunkle Design aus, das bei der Auswahl vom Standard (System) Design verwendet werden soll, während der Dunkelmodus deines Geräts aktiviert ist</value>
|
<value>Wähle das zu verwendende dunkle Design aus, das bei der Auswahl vom Standard-(System)-Design verwendet werden soll, während der Dark Mode deines Geräts aktiviert ist.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyNotes" xml:space="preserve">
|
<data name="CopyNotes" xml:space="preserve">
|
||||||
<value>Notizen kopieren</value>
|
<value>Notiz kopieren</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Exit" xml:space="preserve">
|
<data name="Exit" xml:space="preserve">
|
||||||
<value>Beenden</value>
|
<value>Beenden</value>
|
||||||
@@ -1589,16 +1589,16 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<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>
|
<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>
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Danach fragen Zugangsdaten hinzuzufügen</value>
|
<value>Nach dem Hinzufügen von Zugangsdaten fragen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AskToAddLoginDescription" xml:space="preserve">
|
<data name="AskToAddLoginDescription" xml:space="preserve">
|
||||||
<value>Wenn ein Eintrag nicht in deinem Tresor gefunden wurde, danach fragen.</value>
|
<value>Nach dem Hinzufügen eines Eintrags fragen, wenn dieser nicht in deinem Tresor gefunden wurde.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OnRestart" xml:space="preserve">
|
<data name="OnRestart" xml:space="preserve">
|
||||||
<value>Beim Neustart der App</value>
|
<value>Beim Neustart der App</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillServiceNotEnabled" xml:space="preserve">
|
<data name="AutofillServiceNotEnabled" xml:space="preserve">
|
||||||
<value>Automatisches Ausfüllen vereinfacht es, sicher auf deinen Bitwarden Tresor über andere Webseiten und Apps zuzugreifen. Es sieht aus, als ob du den automatischen Ausfülldienst für Bitwarden nicht aktiviert hast. Aktiviere automatisches Ausfüllen in der "Einstellungen" Ansicht.</value>
|
<value>Auto-Ausfüllen vereinfacht es, sicher auf deinen Bitwarden Tresor über andere Webseiten und Apps zuzugreifen. Es sieht aus, als ob du den Auto-Ausfüllen-Dienst für Bitwarden nicht eingerichtet hast. Richte Auto-Ausfüllen in den "Einstellungen" ein.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThemeAppliedOnRestart" xml:space="preserve">
|
<data name="ThemeAppliedOnRestart" xml:space="preserve">
|
||||||
<value>Deine Änderungen am Aussehen der App werden beim nächsten Neustart der App angewendet.</value>
|
<value>Deine Änderungen am Aussehen der App werden beim nächsten Neustart der App angewendet.</value>
|
||||||
@@ -1608,7 +1608,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<comment>ex. Uppercase the first character of a word.</comment>
|
<comment>ex. Uppercase the first character of a word.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="IncludeNumber" xml:space="preserve">
|
<data name="IncludeNumber" xml:space="preserve">
|
||||||
<value>Ziffer hinzufügen</value>
|
<value>Ziffern einschließen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Download" xml:space="preserve">
|
<data name="Download" xml:space="preserve">
|
||||||
<value>Herunterladen</value>
|
<value>Herunterladen</value>
|
||||||
@@ -1623,19 +1623,19 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Deine Sitzung ist abgelaufen.</value>
|
<value>Deine Sitzung ist abgelaufen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricsDirection" xml:space="preserve">
|
<data name="BiometricsDirection" xml:space="preserve">
|
||||||
<value>Biometrische Daten zur Verifizierung nutzen.</value>
|
<value>Biometrische Verifizierung</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Biometrics" xml:space="preserve">
|
<data name="Biometrics" xml:space="preserve">
|
||||||
<value>Biometrie</value>
|
<value>Biometrie</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UseBiometricsToUnlock" xml:space="preserve">
|
<data name="UseBiometricsToUnlock" xml:space="preserve">
|
||||||
<value>Biometrische Daten zum Entsperren verwenden</value>
|
<value>Biometrie zum Entsperren verwenden</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccessibilityOverlayPermissionAlert" xml:space="preserve">
|
<data name="AccessibilityOverlayPermissionAlert" xml:space="preserve">
|
||||||
<value>Bitwarden braucht Aufmerksamkeit - Siehe "Auto-Fill-Bedienungshilfe" in den Bitwarden-Einstellungen</value>
|
<value>Bitwarden braucht Aufmerksamkeit - Siehe "Bedienungshilfen zum automatischen Ausfüllen" in den Bitwarden-Einstellungen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillServiceOverlayPermission" xml:space="preserve">
|
<data name="BitwardenAutofillServiceOverlayPermission" xml:space="preserve">
|
||||||
<value>3. Gehe unter Android in den App-Einstellungen für Bitwarden zur Option "Über anderen Apps einblenden" (unter Erweitert) und tippe auf den Schalter, um die Overlay-Unterstützung zu aktivieren.</value>
|
<value>3. Gehe in den Android App-Einstellungen für Bitwarden zur Option "Über anderen Apps einblenden" (unter Erweitert) und tippe auf den Schalter, um die Overlay-Unterstützung zu aktivieren.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OverlayPermission" xml:space="preserve">
|
<data name="OverlayPermission" xml:space="preserve">
|
||||||
<value>Berechtigung</value>
|
<value>Berechtigung</value>
|
||||||
@@ -1659,13 +1659,13 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Gib das Masterpasswort ein, um deine Tresordaten zu exportieren.</value>
|
<value>Gib das Masterpasswort ein, um deine Tresordaten zu exportieren.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SendVerificationCodeToEmail" xml:space="preserve">
|
<data name="SendVerificationCodeToEmail" xml:space="preserve">
|
||||||
<value>Einen Bestätigungscode an deine E-Mail senden</value>
|
<value>Einen Verifizierungscode an deine E-Mail-Adresse senden</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CodeSent" xml:space="preserve">
|
<data name="CodeSent" xml:space="preserve">
|
||||||
<value>Code gesendet!</value>
|
<value>Code gesendet!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ConfirmYourIdentity" xml:space="preserve">
|
<data name="ConfirmYourIdentity" xml:space="preserve">
|
||||||
<value>Bestätige deine Identität, um fortzufahren.</value>
|
<value>Verifiziere deine Identität, um fortzufahren.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExportVaultWarning" xml:space="preserve">
|
<data name="ExportVaultWarning" xml:space="preserve">
|
||||||
<value>Dieser Export enthält deine Tresordaten in einem unverschlüsseltem Format. Du solltest sie nicht speichern oder über unsichere Kanäle (z. B. E-Mail) senden. Lösche sie sofort nach ihrer Verwendung.</value>
|
<value>Dieser Export enthält deine Tresordaten in einem unverschlüsseltem Format. Du solltest sie nicht speichern oder über unsichere Kanäle (z. B. E-Mail) senden. Lösche sie sofort nach ihrer Verwendung.</value>
|
||||||
@@ -1707,7 +1707,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Anhang erfolgreich gespeichert</value>
|
<value>Anhang erfolgreich gespeichert</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillTileAccessibilityRequired" xml:space="preserve">
|
<data name="AutofillTileAccessibilityRequired" xml:space="preserve">
|
||||||
<value>Bitte aktivieren Sie "Auto-Fill-Bedienungshilfe" in den Bitwarden-Einstellungen, um die Auto-Fill-Kachel zu verwenden.</value>
|
<value>Bitte aktiviere "Bedienungshilfen zum automatischen Ausfüllen" in den Bitwarden-Einstellungen, um die Auto-Ausfüllen-Kachel zu verwenden.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillTileUriNotFound" xml:space="preserve">
|
<data name="AutofillTileUriNotFound" xml:space="preserve">
|
||||||
<value>Keine Passwortfelder erkannt</value>
|
<value>Keine Passwortfelder erkannt</value>
|
||||||
@@ -1752,11 +1752,11 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Soll dieser Eintrag wirklich in den Papierkorb verschoben werden?</value>
|
<value>Soll dieser Eintrag wirklich in den Papierkorb verschoben werden?</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="BiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Biometrisches Entsperren ist deaktiviert, bis das Master-Passwort eingegeben wurde.</value>
|
<value>Das Entsperren über Biometrie ist für dieses Konto deaktiviert, bis das Master-Passwort verifiziert wurde.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Biometrisches Entsperren für automatisches Ausfüllen ist deaktiviert, bis das Master-Passwort eingegeben wurde.</value>
|
<value>Das Entsperren von Auto-Ausfüllen über Biometrie ist für dieses Konto deaktiviert, bis das Master-Passwort verifiziert wurde.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>Synchronisation beim Aktualisieren aktivieren</value>
|
<value>Synchronisation beim Aktualisieren aktivieren</value>
|
||||||
@@ -1765,10 +1765,10 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Tresor durch Runterziehen Geste synchronisieren.</value>
|
<value>Tresor durch Runterziehen Geste synchronisieren.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInSso" xml:space="preserve">
|
<data name="LogInSso" xml:space="preserve">
|
||||||
<value>Enterprise Single Sign-On</value>
|
<value>Enterprise Single-Sign-On</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInSsoSummary" xml:space="preserve">
|
<data name="LogInSsoSummary" xml:space="preserve">
|
||||||
<value>Schnell über den Single Sign-on deiner Organisation anmelden. Bitte gib deine Organisationskennung an, um zu beginnen.</value>
|
<value>Melde dich schnell über das Single Sign-on-Portal deiner Organisation an. Bitte gib die Organisationskennung ein, um zu beginnen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OrgIdentifier" xml:space="preserve">
|
<data name="OrgIdentifier" xml:space="preserve">
|
||||||
<value>Organisationskennung</value>
|
<value>Organisationskennung</value>
|
||||||
@@ -1777,7 +1777,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Anmeldung mit SSO derzeit nicht möglich</value>
|
<value>Anmeldung mit SSO derzeit nicht möglich</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SetMasterPassword" xml:space="preserve">
|
<data name="SetMasterPassword" xml:space="preserve">
|
||||||
<value>Masterpasswort festlegen</value>
|
<value>Master-Passwort festlegen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SetMasterPasswordSummary" xml:space="preserve">
|
<data name="SetMasterPasswordSummary" xml:space="preserve">
|
||||||
<value>Bitte lege ein Masterpasswort für den Schutz deines Tresors fest, um die Anmeldung über SSO abzuschließen.</value>
|
<value>Bitte lege ein Masterpasswort für den Schutz deines Tresors fest, um die Anmeldung über SSO abzuschließen.</value>
|
||||||
@@ -1825,10 +1825,10 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Datenschutzbestimmungen</value>
|
<value>Datenschutzbestimmungen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccessibilityDrawOverPermissionAlert" xml:space="preserve">
|
<data name="AccessibilityDrawOverPermissionAlert" xml:space="preserve">
|
||||||
<value>Bitwarden braucht Aufmerksamkeit - Aktiviere "Überschreiben" in dem "Auto-Ausfüllen-Dienst" in den Bitwarden-Einstellungen</value>
|
<value>Bitwarden braucht Aufmerksamkeit - Aktiviere "Überschreiben" im "Auto-Ausfüllen-Dienst" in den Bitwarden-Einstellungen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillServices" xml:space="preserve">
|
<data name="AutofillServices" xml:space="preserve">
|
||||||
<value>Auto-Ausfüllen Dienst</value>
|
<value>Auto-Ausfüllen-Dienst</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="InlineAutofill" xml:space="preserve">
|
<data name="InlineAutofill" xml:space="preserve">
|
||||||
<value>Inline Auto-Ausfüllen verwenden</value>
|
<value>Inline Auto-Ausfüllen verwenden</value>
|
||||||
@@ -1840,28 +1840,28 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Bedienungshilfen verwenden</value>
|
<value>Bedienungshilfen verwenden</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccessibilityDescription" xml:space="preserve">
|
<data name="AccessibilityDescription" xml:space="preserve">
|
||||||
<value>Verwende die Bitwarden Bedienungshilfe, um deine Zugangsdaten innerhalb von Apps und dem Web automatisch auszufüllen. Wenn aktiviert, werden wir ein Popup anzeigen, falls Login-Felder ausgewählt sind.</value>
|
<value>Verwende die Bitwarden Bedienungshilfe, um deine Zugangsdaten innerhalb von Apps und dem Web automatisch auszufüllen. Wenn aktiviert, werden wir ein Pop-up anzeigen, falls Anmeldefelder ausgewählt sind.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccessibilityDescription2" xml:space="preserve">
|
<data name="AccessibilityDescription2" xml:space="preserve">
|
||||||
<value>Verwende die Bitwarden Bedienungshilfe, um deine Zugangsdaten in Apps und im Web automatisch auszufüllen. (Benötigt das Überschreiben ebenfalls aktiviertes ist)</value>
|
<value>Verwende die Bitwarden Bedienungshilfe, um deine Zugangsdaten in Apps und im Web automatisch auszufüllen. (Benötigt das Überschreiben ebenfalls aktiviert ist)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccessibilityDescription3" xml:space="preserve">
|
<data name="AccessibilityDescription3" xml:space="preserve">
|
||||||
<value>Verwende die Bitwarden Bedienungshilfe, um die Auto-Ausfüllen Schnellaktionskachel zu verwenden und/oder ein Popup mit Überschreiben anzuzeigen (wenn aktiviert).</value>
|
<value>Verwende die Bitwarden Bedienungshilfe, um die Auto-Ausfüllen-Schnellaktionskachel zu verwenden und/oder ein Pop-up mit Überschreiben anzuzeigen (wenn aktiviert).</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccessibilityDescription4" xml:space="preserve">
|
<data name="AccessibilityDescription4" xml:space="preserve">
|
||||||
<value>Benötigt um die Auto-Ausfüllen Schnellaktionskachel zu verwenden oder um den Auto-Ausfüllen Service durch Überschreiben(falls aktiviert) zu ermöglichen.</value>
|
<value>Benötigt, um die Auto-Ausfüllen-Schnellaktionskachel zu verwenden oder um die Auto-Ausfüllen-Funktion durch Überschreiben (falls aktiviert) zu ermöglichen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DrawOver" xml:space="preserve">
|
<data name="DrawOver" xml:space="preserve">
|
||||||
<value>Überschreiben verwenden</value>
|
<value>Überschreiben verwenden</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DrawOverDescription" xml:space="preserve">
|
<data name="DrawOverDescription" xml:space="preserve">
|
||||||
<value>Falls aktiviert, erlaubt es der Bitwarden Bedienungshilfe ein Popup anzuzeigen, wenn Anmeldefelder ausgewählt sind.</value>
|
<value>Erlaubt es der Bitwarden Bedienungshilfe ein Pop-up anzuzeigen, wenn Anmeldefelder ausgewählt sind.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DrawOverDescription2" xml:space="preserve">
|
<data name="DrawOverDescription2" xml:space="preserve">
|
||||||
<value>Wenn aktiviert, wird die Bitwarden Bedienungshilfe, falls Anmeldefelder ausgewählt sind, ein Popup anzeigen, um bei der automatischen Ausfüllung deiner Zugangsdaten zu helfen.</value>
|
<value>Wenn aktiviert, wird die Bitwarden Bedienungshilfe ein Pop-up anzeigen, falls Anmeldefelder ausgewählt sind, um bei der automatischen Ausfüllung deiner Zugangsdaten zu helfen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DrawOverDescription3" xml:space="preserve">
|
<data name="DrawOverDescription3" xml:space="preserve">
|
||||||
<value>Wenn aktiviert, wird die Bedienungshilfe ein Popup anzeigen, um das automatische Ausfüllen in älteren Anwendungen zu ermöglichen, die das Android Auto-Ausfüllen Framework nicht unterstützen. </value>
|
<value>Wenn aktiviert, wird die Bedienungshilfe ein Pop-up anzeigen, um das automatische Ausfüllen in älteren Apps zu ermöglichen, die das Android Autofill Framework nicht unterstützen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PersonalOwnershipSubmitError" xml:space="preserve">
|
<data name="PersonalOwnershipSubmitError" xml:space="preserve">
|
||||||
<value>Aufgrund einer Unternehmensrichtlinie darfst du keine Einträge in deinem persönlichen Tresor speichern. Ändere die Eigentümer-Option in eine Organisation und wähle aus den verfügbaren Sammlungen.</value>
|
<value>Aufgrund einer Unternehmensrichtlinie darfst du keine Einträge in deinem persönlichen Tresor speichern. Ändere die Eigentümer-Option in eine Organisation und wähle aus den verfügbaren Sammlungen.</value>
|
||||||
@@ -1933,7 +1933,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Ablaufdatum</value>
|
<value>Ablaufdatum</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExpirationTime" xml:space="preserve">
|
<data name="ExpirationTime" xml:space="preserve">
|
||||||
<value>Ablaufzeit</value>
|
<value>Ablaufzeitpunkt</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExpirationDateInfo" xml:space="preserve">
|
<data name="ExpirationDateInfo" xml:space="preserve">
|
||||||
<value>Falls aktiviert, verfällt der Zugriff auf diesen Send zur angegebenen Datum und Uhrzeit.</value>
|
<value>Falls aktiviert, verfällt der Zugriff auf diesen Send zur angegebenen Datum und Uhrzeit.</value>
|
||||||
@@ -2009,7 +2009,7 @@ Das Scannen erfolgt automatisch.</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="AddSend" xml:space="preserve">
|
<data name="AddSend" xml:space="preserve">
|
||||||
<value>Send hinzufügen</value>
|
<value>Neues Send</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="AreYouSureDeleteSend" xml:space="preserve">
|
<data name="AreYouSureDeleteSend" xml:space="preserve">
|
||||||
@@ -2017,11 +2017,11 @@ Das Scannen erfolgt automatisch.</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="SendDeleted" xml:space="preserve">
|
<data name="SendDeleted" xml:space="preserve">
|
||||||
<value>Send wurde gelöscht</value>
|
<value>Send gelöscht</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="SendUpdated" xml:space="preserve">
|
<data name="SendUpdated" xml:space="preserve">
|
||||||
<value>Send aktualisiert</value>
|
<value>Send gespeichert</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="NewSendCreated" xml:space="preserve">
|
<data name="NewSendCreated" xml:space="preserve">
|
||||||
@@ -2070,7 +2070,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SendFileEmailVerificationRequired" xml:space="preserve">
|
<data name="SendFileEmailVerificationRequired" xml:space="preserve">
|
||||||
<value>Du musst deine E-Mail verifizieren, um Dateien mit Send zu verwenden. Du kannst deine E-Mail im Web-Tresor verifizieren.</value>
|
<value>Du musst deine E-Mail-Adresse verifizieren, um Dateien mit Send zu verwenden. Du kannst deine E-Mail-Adresse im Web-Tresor verifizieren.</value>
|
||||||
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordPrompt" xml:space="preserve">
|
<data name="PasswordPrompt" xml:space="preserve">
|
||||||
@@ -2080,7 +2080,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Master-Passwort bestätigen</value>
|
<value>Master-Passwort bestätigen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordConfirmationDesc" xml:space="preserve">
|
<data name="PasswordConfirmationDesc" xml:space="preserve">
|
||||||
<value>Diese Aktion ist geschützt. Um fortzufahren, gib bitte dein Master-Passwort erneut ein, um deine Identität zu bestätigen.</value>
|
<value>Diese Aktion ist geschützt. Um fortzufahren, gib bitte dein Master-Passwort erneut ein, um deine Identität zu verifizieren.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CaptchaRequired" xml:space="preserve">
|
<data name="CaptchaRequired" xml:space="preserve">
|
||||||
<value>Captcha erforderlich</value>
|
<value>Captcha erforderlich</value>
|
||||||
@@ -2095,7 +2095,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Master-Passwort aktualisieren</value>
|
<value>Master-Passwort aktualisieren</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UpdateMasterPasswordWarning" xml:space="preserve">
|
<data name="UpdateMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>Dein Master-Passwort wurde kürzlich von einem Administrator Deiner Organisation geändert. Um auf den Tresor zuzugreifen, musst Du Dein Master-Passwort jetzt aktualisieren. Wenn Du fortfährst, wirst Du aus der aktuellen Sitzung abgemeldet und wirst Dich erneut anmelden müssen. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben.</value>
|
<value>Dein Master-Passwort wurde kürzlich von einem Administrator deiner Organisation geändert. Um auf den Tresor zuzugreifen, musst du dein Master-Passwort jetzt aktualisieren. Wenn Du fortfährst, wirst du aus der aktuellen Sitzung abgemeldet und eine erneute Anmeldung ist erforderlich. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UpdatingPassword" xml:space="preserve">
|
<data name="UpdatingPassword" xml:space="preserve">
|
||||||
<value>Passwort wird aktualisiert</value>
|
<value>Passwort wird aktualisiert</value>
|
||||||
@@ -2122,13 +2122,13 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>FIDO2 WebAuthn</value>
|
<value>FIDO2 WebAuthn</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Fido2Instruction" xml:space="preserve">
|
<data name="Fido2Instruction" xml:space="preserve">
|
||||||
<value>Um fortzufahren, halte deinen FIDO2 WebAuthn kompatiblen Sicherheitsschlüssel bereit und folge dann den Anweisungen, nachdem du auf der nächsten Seite auf 'Authentifiziere WebAuthn' geklickt hast.</value>
|
<value>Um fortzufahren, halte deinen FIDO2 WebAuthn-kompatiblen Sicherheitsschlüssel bereit und folge dann den Anweisungen, nachdem du auf der nächsten Seite auf 'WebAuthn authentifizieren' geklickt hast.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Fido2Desc" xml:space="preserve">
|
<data name="Fido2Desc" xml:space="preserve">
|
||||||
<value>Authentifizierung mit FIDO2 WebAuthn, du kannst dich mit einem externen Sicherheitsschlüssel authentifizieren.</value>
|
<value>Authentifizierung mit FIDO2 WebAuthn. Du kannst dich mit einem externen Sicherheitsschlüssel authentifizieren.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Fido2AuthenticateWebAuthn" xml:space="preserve">
|
<data name="Fido2AuthenticateWebAuthn" xml:space="preserve">
|
||||||
<value>Authentifiziere WebAuthn</value>
|
<value>WebAuthn authentifizieren</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Fido2ReturnToApp" xml:space="preserve">
|
<data name="Fido2ReturnToApp" xml:space="preserve">
|
||||||
<value>Zurück zur App</value>
|
<value>Zurück zur App</value>
|
||||||
@@ -2137,15 +2137,21 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Bitte stelle sicher, dass dein Standardbrowser WebAuthn unterstützt und versuche es erneut.</value>
|
<value>Bitte stelle sicher, dass dein Standardbrowser WebAuthn unterstützt und versuche es erneut.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ResetPasswordAutoEnrollInviteWarning" xml:space="preserve">
|
<data name="ResetPasswordAutoEnrollInviteWarning" xml:space="preserve">
|
||||||
<value>Diese Organisation hat eine Unternehmensrichtlinie, die dich automatisch für die Passwort Zurücksetzung registriert. Die Registrierung wird es Administratoren der Organisation erlauben, dein Master-Passwort zu ändern.</value>
|
<value>Diese Organisation hat eine Unternehmensrichtlinie, die dich automatisch für die Passwortzurücksetzung registriert. Die Registrierung wird es Administratoren der Organisation erlauben, dein Master-Passwort zu ändern.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
||||||
<value>Deine Organisationsrichtlinien haben Auswirkungen auf dein Tresor-Timeout. Das maximal zulässige Tresor-Timeout beträgt {0} Stunde(n) und {1} Minute(n)</value>
|
<value>Deine Unternehmensrichtlinien haben das maximal zulässige Tresor-Timeout auf {0} Stunde(n) und {1} Minute(n) festgelegt.</value>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
|
||||||
|
<value>Deine Organisationsrichtlinien beeinflussen dein Tresor-Timeout. Das maximal zulässige Tresor-Timeout beträgt {0} Stunde(n) und {1} Minute(n). Deine Tresor-Timeout-Aktion ist auf {2} gesetzt.</value>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
|
<value>Deine Organisationsrichtlinien haben deine Tresor-Timeout-Aktion auf {0} gesetzt.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>Dein Tresor-Timeout überschreitet die von deinem Unternehmen festgelegten Beschränkungen.</value>
|
<value>Dein Tresor-Timeout überschreitet die von deinem Unternehmen festgelegten Beschränkungen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DisablePersonalVaultExportPolicyInEffect">
|
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
|
||||||
<value>Eine oder mehrere Unternehmensrichtlinien verhindern es, dass du deinen persönlichen Tresor exportieren kannst.</value>
|
<value>Eine oder mehrere Unternehmensrichtlinien verhindern es, dass du deinen persönlichen Tresor exportieren kannst.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAccount" xml:space="preserve">
|
<data name="AddAccount" xml:space="preserve">
|
||||||
@@ -2158,7 +2164,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Gesperrt</value>
|
<value>Gesperrt</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountLoggedOut" xml:space="preserve">
|
<data name="AccountLoggedOut" xml:space="preserve">
|
||||||
<value>Ausgeloggt</value>
|
<value>Abgemeldet</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountSwitchedAutomatically" xml:space="preserve">
|
<data name="AccountSwitchedAutomatically" xml:space="preserve">
|
||||||
<value>Zum nächsten verfügbaren Konto gewechselt</value>
|
<value>Zum nächsten verfügbaren Konto gewechselt</value>
|
||||||
@@ -2182,7 +2188,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Dein Konto und alle damit verbundenen Daten werden gelöscht und sind nicht wiederherstellbar. Bist du sicher, dass du fortfahren möchtest?</value>
|
<value>Dein Konto und alle damit verbundenen Daten werden gelöscht und sind nicht wiederherstellbar. Bist du sicher, dass du fortfahren möchtest?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DeletingYourAccount" xml:space="preserve">
|
<data name="DeletingYourAccount" xml:space="preserve">
|
||||||
<value>Löschen deines Kontos</value>
|
<value>Dein Konto wird gelöscht</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="YourAccountHasBeenPermanentlyDeleted" xml:space="preserve">
|
<data name="YourAccountHasBeenPermanentlyDeleted" xml:space="preserve">
|
||||||
<value>Dein Konto wurde unwiderruflich gelöscht</value>
|
<value>Dein Konto wurde unwiderruflich gelöscht</value>
|
||||||
@@ -2194,19 +2200,19 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Einmalpasswort anfordern</value>
|
<value>Einmalpasswort anfordern</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SendCode" xml:space="preserve">
|
<data name="SendCode" xml:space="preserve">
|
||||||
<value>Send Code</value>
|
<value>Code senden</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Sending" xml:space="preserve">
|
<data name="Sending" xml:space="preserve">
|
||||||
<value>Sende</value>
|
<value>Wird gesendet</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopySendLinkOnSave" xml:space="preserve">
|
<data name="CopySendLinkOnSave" xml:space="preserve">
|
||||||
<value>Send Link beim Speichern kopieren</value>
|
<value>Send-Link beim Speichern kopieren</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SendingCode" xml:space="preserve">
|
<data name="SendingCode" xml:space="preserve">
|
||||||
<value>Sende code</value>
|
<value>Code wird gesendet</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Verifying" xml:space="preserve">
|
<data name="Verifying" xml:space="preserve">
|
||||||
<value>Überprüfen</value>
|
<value>Wird verifiziert</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ResendCode" xml:space="preserve">
|
<data name="ResendCode" xml:space="preserve">
|
||||||
<value>Code erneut senden</value>
|
<value>Code erneut senden</value>
|
||||||
@@ -2218,7 +2224,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Beim Senden des Bestätigungscodes an deine E-Mail-Adresse ist ein Fehler aufgetreten. Bitte versuche es erneut</value>
|
<value>Beim Senden des Bestätigungscodes an deine E-Mail-Adresse ist ein Fehler aufgetreten. Bitte versuche es erneut</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnterTheVerificationCodeThatWasSentToYourEmail" xml:space="preserve">
|
<data name="EnterTheVerificationCodeThatWasSentToYourEmail" xml:space="preserve">
|
||||||
<value>Gib den Bestätigungscode ein, der an deine E-Mail-Adresse gesendet wurde</value>
|
<value>Gib den Verifizierungscode ein, der an deine E-Mail-Adresse gesendet wurde</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SubmitCrashLogs" xml:space="preserve">
|
<data name="SubmitCrashLogs" xml:space="preserve">
|
||||||
<value>Absturzprotokolle senden</value>
|
<value>Absturzprotokolle senden</value>
|
||||||
@@ -2227,10 +2233,10 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Hilf Bitwarden die Stabilität der App zu verbessern, indem du Absturzberichte sendest.</value>
|
<value>Hilf Bitwarden die Stabilität der App zu verbessern, indem du Absturzberichte sendest.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OptionsExpanded" xml:space="preserve">
|
<data name="OptionsExpanded" xml:space="preserve">
|
||||||
<value>Optionen sind ausgeklappt, tippen zum einklappen.</value>
|
<value>Optionen sind ausgeklappt, tippen zum Einklappen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OptionsCollapsed" xml:space="preserve">
|
<data name="OptionsCollapsed" xml:space="preserve">
|
||||||
<value>Optionen sind eingeklappt, tippe zum ausklappen.</value>
|
<value>Optionen sind eingeklappt, tippe zum Ausklappen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UppercaseAtoZ" xml:space="preserve">
|
<data name="UppercaseAtoZ" xml:space="preserve">
|
||||||
<value>Großbuchstaben (A bis Z)</value>
|
<value>Großbuchstaben (A bis Z)</value>
|
||||||
@@ -2245,7 +2251,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Sonderzeichen (!@#$%^&*)</value>
|
<value>Sonderzeichen (!@#$%^&*)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TapToGoBack" xml:space="preserve">
|
<data name="TapToGoBack" xml:space="preserve">
|
||||||
<value>Tippen, um zurück zu gehen</value>
|
<value>Tippen, um zurückzugehen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordIsVisibleTapToHide" xml:space="preserve">
|
<data name="PasswordIsVisibleTapToHide" xml:space="preserve">
|
||||||
<value>Passwort ist sichtbar, tippen um es auszublenden.</value>
|
<value>Passwort ist sichtbar, tippen um es auszublenden.</value>
|
||||||
@@ -2254,7 +2260,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Passwort ist nicht sichtbar, tippen um es einzublenden.</value>
|
<value>Passwort ist nicht sichtbar, tippen um es einzublenden.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FilterByVault" xml:space="preserve">
|
<data name="FilterByVault" xml:space="preserve">
|
||||||
<value>Objekte nach Tresor filtern</value>
|
<value>Einträge nach Tresor filtern</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AllVaults" xml:space="preserve">
|
<data name="AllVaults" xml:space="preserve">
|
||||||
<value>Alle Tresore</value>
|
<value>Alle Tresore</value>
|
||||||
@@ -2284,7 +2290,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>QR Code scannen</value>
|
<value>QR Code scannen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CannotScanQRCode" xml:space="preserve">
|
<data name="CannotScanQRCode" xml:space="preserve">
|
||||||
<value>QR Code kann nicht gescannt werden? </value>
|
<value>QR-Code kann nicht gescannt werden? </value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AuthenticatorKeyScanner" xml:space="preserve">
|
<data name="AuthenticatorKeyScanner" xml:space="preserve">
|
||||||
<value>Authentifizierungsschlüssel</value>
|
<value>Authentifizierungsschlüssel</value>
|
||||||
@@ -2305,7 +2311,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Wenn du deine Sperroptionen auf „Nie“ einstellst, bleibt dein Tresor für jeden zugänglich, der Zugriff auf dein Gerät hat. Wenn du diese Option verwendest, solltest du sicherstellen, dass du dein Gerät angemessen schützt.</value>
|
<value>Wenn du deine Sperroptionen auf „Nie“ einstellst, bleibt dein Tresor für jeden zugänglich, der Zugriff auf dein Gerät hat. Wenn du diese Option verwendest, solltest du sicherstellen, dass du dein Gerät angemessen schützt.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnvironmentPageUrlsError" xml:space="preserve">
|
<data name="EnvironmentPageUrlsError" xml:space="preserve">
|
||||||
<value>Eine oder mehrere der eingegebenen URLs sind ungültig. Bitte überprüfe sie und versuche erneut zu speichern.</value>
|
<value>Eine oder mehrere der eingegebenen URLs sind ungültig. Bitte überarbeite diese und versuche erneut zu speichern.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GenericErrorMessage" xml:space="preserve">
|
<data name="GenericErrorMessage" xml:space="preserve">
|
||||||
<value>Wir konnten deine Anfrage nicht bearbeiten. Bitte versuche es erneut oder kontaktiere uns.</value>
|
<value>Wir konnten deine Anfrage nicht bearbeiten. Bitte versuche es erneut oder kontaktiere uns.</value>
|
||||||
@@ -2323,7 +2329,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Versuchst du dich anzumelden?</value>
|
<value>Versuchst du dich anzumelden?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInAttemptByXOnY" xml:space="preserve">
|
<data name="LogInAttemptByXOnY" xml:space="preserve">
|
||||||
<value>Anmeldeversuch von {0} am {1}</value>
|
<value>Anmeldeversuch von {0} auf {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DeviceType" xml:space="preserve">
|
<data name="DeviceType" xml:space="preserve">
|
||||||
<value>Gerätetyp</value>
|
<value>Gerätetyp</value>
|
||||||
@@ -2338,22 +2344,22 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Nahe</value>
|
<value>Nahe</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ConfirmLogIn" xml:space="preserve">
|
<data name="ConfirmLogIn" xml:space="preserve">
|
||||||
<value>Anmeldung bestätigen</value>
|
<value>Anmeldung genehmigen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DenyLogIn" xml:space="preserve">
|
<data name="DenyLogIn" xml:space="preserve">
|
||||||
<value>Anmeldung verweigern</value>
|
<value>Anmeldung ablehnen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="JustNow" xml:space="preserve">
|
<data name="JustNow" xml:space="preserve">
|
||||||
<value>Gerade eben</value>
|
<value>Gerade eben</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="XMinutesAgo" xml:space="preserve">
|
<data name="XMinutesAgo" xml:space="preserve">
|
||||||
<value>vor {0} Minute(n)</value>
|
<value>vor {0} Minuten</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInAccepted" xml:space="preserve">
|
<data name="LogInAccepted" xml:space="preserve">
|
||||||
<value>Anmeldung bestätigt</value>
|
<value>Anmeldung genehmigt</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInDenied" xml:space="preserve">
|
<data name="LogInDenied" xml:space="preserve">
|
||||||
<value>Anmeldung verweigert</value>
|
<value>Anmeldung abgelehnt</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ApproveLoginRequests" xml:space="preserve">
|
<data name="ApproveLoginRequests" xml:space="preserve">
|
||||||
<value>Anmeldeanfragen genehmigen</value>
|
<value>Anmeldeanfragen genehmigen</value>
|
||||||
@@ -2368,7 +2374,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Push-Benachrichtigungen für neue Anmeldeanfragen erhalten</value>
|
<value>Push-Benachrichtigungen für neue Anmeldeanfragen erhalten</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoThanks" xml:space="preserve">
|
<data name="NoThanks" xml:space="preserve">
|
||||||
<value>Nein, danke</value>
|
<value>Nein danke</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ConfimLogInAttempForX" xml:space="preserve">
|
<data name="ConfimLogInAttempForX" xml:space="preserve">
|
||||||
<value>Anmeldeversuch für {0} bestätigen</value>
|
<value>Anmeldeversuch für {0} bestätigen</value>
|
||||||
@@ -2383,10 +2389,10 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Was möchtest du generieren?</value>
|
<value>Was möchtest du generieren?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UsernameType" xml:space="preserve">
|
<data name="UsernameType" xml:space="preserve">
|
||||||
<value>Benutzernamentyp</value>
|
<value>Benutzernamenstyp</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PlusAddressedEmail" xml:space="preserve">
|
<data name="PlusAddressedEmail" xml:space="preserve">
|
||||||
<value>Mit Plus adressierte E-Mail</value>
|
<value>Plus-adressierte E-Mail-Adresse</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CatchAllEmail" xml:space="preserve">
|
<data name="CatchAllEmail" xml:space="preserve">
|
||||||
<value>Catch-All E-Mail-Adresse</value>
|
<value>Catch-All E-Mail-Adresse</value>
|
||||||
@@ -2401,7 +2407,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>E-Mail (erforderlich)</value>
|
<value>E-Mail (erforderlich)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DomainNameRequiredParenthesis" xml:space="preserve">
|
<data name="DomainNameRequiredParenthesis" xml:space="preserve">
|
||||||
<value>Domain-Name (erforderlich)</value>
|
<value>Domainname (erforderlich)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="APIKeyRequiredParenthesis" xml:space="preserve">
|
<data name="APIKeyRequiredParenthesis" xml:space="preserve">
|
||||||
<value>API-Schlüssel (erforderlich)</value>
|
<value>API-Schlüssel (erforderlich)</value>
|
||||||
@@ -2430,13 +2436,13 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<comment>"Fastmail" is the product name and should not be translated.</comment>
|
<comment>"Fastmail" is the product name and should not be translated.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="APIAccessToken" xml:space="preserve">
|
<data name="APIAccessToken" xml:space="preserve">
|
||||||
<value>API-Zugangs-Token</value>
|
<value>API-Zugriffstoken</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AreYouSureYouWantToOverwriteTheCurrentUsername" xml:space="preserve">
|
<data name="AreYouSureYouWantToOverwriteTheCurrentUsername" xml:space="preserve">
|
||||||
<value>Bist Du sicher, dass Du den aktuellen Benutzernamen überschreiben möchtest?</value>
|
<value>Bist Du sicher, dass Du den aktuellen Benutzernamen überschreiben möchtest?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GenerateUsername" xml:space="preserve">
|
<data name="GenerateUsername" xml:space="preserve">
|
||||||
<value>Benutzernamen generieren</value>
|
<value>Benutzername generieren</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EmailType" xml:space="preserve">
|
<data name="EmailType" xml:space="preserve">
|
||||||
<value>E-Mail-Typ</value>
|
<value>E-Mail-Typ</value>
|
||||||
@@ -2466,7 +2472,7 @@ Das Scannen erfolgt automatisch.</value>
|
|||||||
<value>Bedienungshilfen Offenlegung</value>
|
<value>Bedienungshilfen Offenlegung</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccessibilityDisclosureText" xml:space="preserve">
|
<data name="AccessibilityDisclosureText" xml:space="preserve">
|
||||||
<value>Bitwarden verwendet die Bedienungshilfen, um nach Anmeldefeldern in Apps und Webseiten zu suchen und legt dann die entsprechenden Feld-IDs fest, um Benutzername und Passwort einzugeben, wenn eine Übereinstimmung mit der App oder der Seite gefunden wird. Wir speichern keine der Informationen, die uns der Dienst zur Verfügung stellt. Ebenso wenig versuchen wir beliebige Elemente auf dem Bildschirm außer der Texteingabe von Anmeldedaten zu kontrollieren.</value>
|
<value>Bitwarden verwendet die Bedienungshilfen, um nach Anmeldefeldern in Apps und auf Webseiten zu suchen und legt dann die entsprechenden Feld-IDs fest, um einen Benutzernamen und Passwort einzugeben, wenn eine Übereinstimmung mit der App oder der Seite gefunden wird. Wir speichern keine der Informationen, die uns der Dienst zur Verfügung stellt. Ebenso wenig versuchen wir beliebige Elemente auf dem Bildschirm außer der Texteingabe von Anmeldedaten zu kontrollieren.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Accept" xml:space="preserve">
|
<data name="Accept" xml:space="preserve">
|
||||||
<value>Akzeptieren</value>
|
<value>Akzeptieren</value>
|
||||||
@@ -2488,8 +2494,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>
|
||||||
@@ -2498,10 +2504,10 @@ Möchtest du zu diesem Konto wechseln?</value>
|
|||||||
<value>Mit Master-Passwort anmelden</value>
|
<value>Mit Master-Passwort anmelden</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInWithAnotherDevice" xml:space="preserve">
|
<data name="LogInWithAnotherDevice" xml:space="preserve">
|
||||||
<value>Mit einem anderen Gerät anmelden</value>
|
<value>Mit Gerät anmelden</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInInitiated" xml:space="preserve">
|
<data name="LogInInitiated" xml:space="preserve">
|
||||||
<value>Anmeldung initiiert</value>
|
<value>Anmeldung eingeleitet</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ANotificationHasBeenSentToYourDevice" xml:space="preserve">
|
<data name="ANotificationHasBeenSentToYourDevice" xml:space="preserve">
|
||||||
<value>Eine Benachrichtigung wurde an dein Gerät gesendet.</value>
|
<value>Eine Benachrichtigung wurde an dein Gerät gesendet.</value>
|
||||||
@@ -2516,7 +2522,7 @@ Möchtest du zu diesem Konto wechseln?</value>
|
|||||||
<value>Brauchst du eine andere Option?</value>
|
<value>Brauchst du eine andere Option?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ViewAllLoginOptions" xml:space="preserve">
|
<data name="ViewAllLoginOptions" xml:space="preserve">
|
||||||
<value>Alle Anmelde-Optionen anzeigen</value>
|
<value>Alle Anmeldeoptionen anzeigen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThisRequestIsNoLongerValid" xml:space="preserve">
|
<data name="ThisRequestIsNoLongerValid" xml:space="preserve">
|
||||||
<value>Diese Anfrage ist nicht mehr gültig</value>
|
<value>Diese Anfrage ist nicht mehr gültig</value>
|
||||||
@@ -2537,7 +2543,19 @@ Möchtest du zu diesem Konto wechseln?</value>
|
|||||||
<value>Keine ausstehenden Anfragen</value>
|
<value>Keine ausstehenden Anfragen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
||||||
<value>Kamerazugriff aktivieren, um den Scanner zu verwenden</value>
|
<value>Kamerazugriff gewähren, um den Scanner zu verwenden</value>
|
||||||
|
</data>
|
||||||
|
<data name="Language" xml:space="preserve">
|
||||||
|
<value>Sprache</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
|
<value>Die Sprache wurde auf {0} geändert. Bitte starte die App neu, um die Änderung zu sehen</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
|
||||||
|
<value>Sprachänderung erfordert einen App-Neustart</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
|
<value>Standard (System)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Wichtig</value>
|
<value>Wichtig</value>
|
||||||
@@ -2575,4 +2593,40 @@ Möchtest du zu diesem Konto wechseln?</value>
|
|||||||
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Schwaches Passwort erkannt und in einem Datendiebstahl gefunden. Verwende ein starkes und einzigartiges Passwort, um dein Konto zu schützen. Bist du sicher, dass du dieses Passwort verwenden möchtest?</value>
|
<value>Schwaches Passwort erkannt und in einem Datendiebstahl gefunden. Verwende ein starkes und einzigartiges Passwort, um dein Konto zu schützen. Bist du sicher, dass du dieses Passwort verwenden möchtest?</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
|
||||||
|
<value>SSO-Kennung der Organisation erforderlich.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
|
||||||
|
<value>Den Schlüssel zu einem bestehenden oder neuen Eintrag hinzufügen</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
|
||||||
|
<value>Es gibt keine Einträge in deinem Tresor, die mit "{0}" übereinstimmen</value>
|
||||||
|
</data>
|
||||||
|
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
|
||||||
|
<value>Nach einem Eintrag suchen oder einen neuen Eintrag hinzufügen</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
|
<value>Es gibt keine Einträge, die mit der Suche übereinstimmen</value>
|
||||||
|
</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">
|
||||||
|
<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 name="CurrentMasterPassword" xml:space="preserve">
|
||||||
|
<value>Aktuelles Master-Passwort</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -584,8 +584,8 @@
|
|||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>Η υπόδειξη κύριου κωδικού μπορεί να σας βοηθήσει να θυμηθείτε τον κωδικό σας αν τον ξεχάσετε.</value>
|
<value>Η υπόδειξη κύριου κωδικού μπορεί να σας βοηθήσει να θυμηθείτε τον κωδικό σας αν τον ξεχάσετε.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessage" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>Ο κύριος κωδικός πρέπει να έχει μήκος τουλάχιστον 8 χαρακτήρων.</value>
|
<value>Ο κύριος κωδικός πρέπει να έχει μήκος τουλάχιστον {0} χαρακτήρες.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>Ελάχιστα Αριθμητικά Ψηφία</value>
|
<value>Ελάχιστα Αριθμητικά Ψηφία</value>
|
||||||
@@ -1104,7 +1104,7 @@
|
|||||||
<value>Κα</value>
|
<value>Κα</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Mx" xml:space="preserve">
|
<data name="Mx" xml:space="preserve">
|
||||||
<value>Mx</value>
|
<value>Mx στα Ελληνικά</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="November" xml:space="preserve">
|
<data name="November" xml:space="preserve">
|
||||||
<value>Νοέμβριος</value>
|
<value>Νοέμβριος</value>
|
||||||
@@ -1752,11 +1752,11 @@
|
|||||||
<value>Θέλετε πραγματικά να στείλετε στον κάδο απορριμμάτων;</value>
|
<value>Θέλετε πραγματικά να στείλετε στον κάδο απορριμμάτων;</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="BiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Εντοπίστηκε βιομετρική αλλαγή, συνδεθείτε χρησιμοποιώντας τον κύριο κωδικό πρόσβασης για ενεργοποίηση ξανά.</value>
|
<value>Το βιομετρικό ξεκλείδωμα για αυτόν τον λογαριασμό είναι απενεργοποιημένο εν αναμονή της επαλήθευσης του κύριου κωδικού πρόσβασης.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Το βιομετρικό ξεκλείδωμα για αυτόματη συμπλήρωση απενεργοποιήθηκε εν αναμονή της επαλήθευσης του κύριου κωδικού πρόσβασης.</value>
|
<value>Το βιομετρικό ξεκλείδωμα αυτόματης συμπλήρωσης για αυτό το λογαριασμό είναι απενεργοποιημένο εν αναμονή της επαλήθευσης του κύριου κωδικού πρόσβασης.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>Ενεργοποίηση συγχρονισμού κατά την ανανέωση</value>
|
<value>Ενεργοποίηση συγχρονισμού κατά την ανανέωση</value>
|
||||||
@@ -2142,10 +2142,16 @@
|
|||||||
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
||||||
<value>Οι πολιτικές του οργανισμού σας επηρεάζουν το χρονικό όριο vault σας. Το μέγιστο επιτρεπόμενο Χρονικό όριο Vault είναι {0} ώρα(ες) και {1} λεπτό(ά)</value>
|
<value>Οι πολιτικές του οργανισμού σας επηρεάζουν το χρονικό όριο vault σας. Το μέγιστο επιτρεπόμενο Χρονικό όριο Vault είναι {0} ώρα(ες) και {1} λεπτό(ά)</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
|
||||||
|
<value>Οι πολιτικές του οργανισμού σας επηρεάζουν το χρονικό όριο του vault σας. Το μέγιστο επιτρεπόμενο χρονικό όριο vault είναι {0} ώρα(ες) και {1} λεπτό(ά). Το χρονικό όριο του vault σας έχει οριστεί σε {2}.</value>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
|
<value>Οι πολιτικές του οργανισμού σας έχουν ορίσει την ενέργεια χρονικού ορίου vault σε {0}.</value>
|
||||||
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>Το χρονικό όριο του vault σας υπερβαίνει τους περιορισμούς που έχει ορίσει ο οργανισμός σας.</value>
|
<value>Το χρονικό όριο του vault σας υπερβαίνει τους περιορισμούς που έχει ορίσει ο οργανισμός σας.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DisablePersonalVaultExportPolicyInEffect">
|
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
|
||||||
<value>Μία ή περισσότερες οργανωτικές πολιτικές αποτρέπουν την εξαγωγή του προσωπικού vault.</value>
|
<value>Μία ή περισσότερες οργανωτικές πολιτικές αποτρέπουν την εξαγωγή του προσωπικού vault.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAccount" xml:space="preserve">
|
<data name="AddAccount" xml:space="preserve">
|
||||||
@@ -2479,18 +2485,18 @@
|
|||||||
<value>Το αίτημα σύνδεσης έχει ήδη λήξει.</value>
|
<value>Το αίτημα σύνδεσης έχει ήδη λήξει.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoginAttemptFromXDoYouWantToSwitchToThisAccount" xml:space="preserve">
|
<data name="LoginAttemptFromXDoYouWantToSwitchToThisAccount" xml:space="preserve">
|
||||||
<value>Login attempt from:
|
<value>Προσπάθεια σύνδεσης από:
|
||||||
{0}
|
{0}
|
||||||
Do you want to switch to this account?</value>
|
Θέλετε να μεταβείτε σε αυτόν τον λογαριασμό;</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NewAroundHere" xml:space="preserve">
|
<data name="NewAroundHere" xml:space="preserve">
|
||||||
<value>New around here?</value>
|
<value>Είστε νέος/α εδώ;</value>
|
||||||
</data>
|
</data>
|
||||||
<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>Logging in as {0} on {1}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NotYou" xml:space="preserve">
|
<data name="NotYou" xml:space="preserve">
|
||||||
<value>Δεν είστε εσείς;</value>
|
<value>Δεν είστε εσείς;</value>
|
||||||
@@ -2508,49 +2514,61 @@ Do you want to switch to this account?</value>
|
|||||||
<value>Μια ειδοποίηση έχει σταλεί στη συσκευή σας.</value>
|
<value>Μια ειδοποίηση έχει σταλεί στη συσκευή σας.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PleaseMakeSureYourVaultIsUnlockedAndTheFingerprintPhraseMatchesOnTheOtherDevice" xml:space="preserve">
|
<data name="PleaseMakeSureYourVaultIsUnlockedAndTheFingerprintPhraseMatchesOnTheOtherDevice" xml:space="preserve">
|
||||||
<value>Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device.</value>
|
<value>Βεβαιωθείτε ότι το vault σας είναι ξεκλείδωτο και ότι η Φράση δακτυλικών αποτυπωμάτων ταιριάζει στην άλλη συσκευή.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ResendNotification" xml:space="preserve">
|
<data name="ResendNotification" xml:space="preserve">
|
||||||
<value>Resend notification</value>
|
<value>Επαναποστολή ειδοποίησης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NeedAnotherOption" xml:space="preserve">
|
<data name="NeedAnotherOption" xml:space="preserve">
|
||||||
<value>Need another option?</value>
|
<value>Προσθέστε μια άλλη επιλογή</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ViewAllLoginOptions" xml:space="preserve">
|
<data name="ViewAllLoginOptions" xml:space="preserve">
|
||||||
<value>View all log in options</value>
|
<value>Δείτε όλες τις επιλογές σύνδεσης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThisRequestIsNoLongerValid" xml:space="preserve">
|
<data name="ThisRequestIsNoLongerValid" xml:space="preserve">
|
||||||
<value>This request is no longer valid</value>
|
<value>Αυτό το αίτημα δεν είναι πλέον έγκυρο</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PendingLogInRequests" xml:space="preserve">
|
<data name="PendingLogInRequests" xml:space="preserve">
|
||||||
<value>Pending login requests</value>
|
<value>Εκκρεμούν αιτήματα σύνδεσης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DeclineAllRequests" xml:space="preserve">
|
<data name="DeclineAllRequests" xml:space="preserve">
|
||||||
<value>Απόρριψη όλων των αιτημάτων</value>
|
<value>Απόρριψη όλων των αιτημάτων</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AreYouSureYouWantToDeclineAllPendingLogInRequests" xml:space="preserve">
|
<data name="AreYouSureYouWantToDeclineAllPendingLogInRequests" xml:space="preserve">
|
||||||
<value>Are you sure you want to decline all pending login requests?</value>
|
<value>Είστε σίγουροι ότι θέλετε να απορρίψετε όλα τα εκκρεμή αιτήματα σύνδεσης;</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RequestsDeclined" xml:space="preserve">
|
<data name="RequestsDeclined" xml:space="preserve">
|
||||||
<value>Requests declined</value>
|
<value>Τα αιτήματα απορρίφθηκαν</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoPendingRequests" xml:space="preserve">
|
<data name="NoPendingRequests" xml:space="preserve">
|
||||||
<value>No pending requests</value>
|
<value>Δεν υπάρχουν εκκρεμή αιτήματα</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
||||||
<value>Enable camera permission to use the scanner</value>
|
<value>Ενεργοποιήστε την άδεια της κάμερας για χρήση του σαρωτή</value>
|
||||||
|
</data>
|
||||||
|
<data name="Language" xml:space="preserve">
|
||||||
|
<value>Γλώσσα</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
|
<value>Η γλώσσα έχει αλλάξει σε {0}. Παρακαλούμε επανεκκινήστε την εφαρμογή για να δείτε την αλλαγή</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
|
||||||
|
<value>Η αλλαγή γλώσσας απαιτεί επανεκκίνηση της εφαρμογής</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
|
<value>Προεπιλογή (σύστημα)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Σημαντικό</value>
|
<value>Σημαντικό</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>Ο κύριος κωδικός δεν μπορεί να ανακτηθεί αν τον ξεχάσετε! Απαιτούνται τουλάχιστον {0} χαρακτήρες.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakMasterPassword" xml:space="preserve">
|
<data name="WeakMasterPassword" xml:space="preserve">
|
||||||
<value>Αδύναμος Κύριος Κωδικός</value>
|
<value>Αδύναμος Κύριος Κωδικός</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakPasswordIdentifiedUseAStrongPasswordToProtectYourAccount" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedUseAStrongPasswordToProtectYourAccount" xml:space="preserve">
|
||||||
<value>Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?</value>
|
<value>Αδύναμος κωδικός. Χρησιμοποιήστε έναν ισχυρό κωδικό για την προστασία του λογαριασμού σας. Είστε βέβαιοι ότι θέλετε να χρησιμοποιήσετε έναν αδύναμο κωδικό πρόσβασης;</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Weak" xml:space="preserve">
|
<data name="Weak" xml:space="preserve">
|
||||||
<value>Αδύναμος</value>
|
<value>Αδύναμος</value>
|
||||||
@@ -2562,18 +2580,54 @@ Do you want to switch to this account?</value>
|
|||||||
<value>Ισχυρός</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>Ελέγξτε γνωστές παραβιάσεις δεδομένων για αυτόν τον κωδικό</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExposedMasterPassword" xml:space="preserve">
|
<data name="ExposedMasterPassword" xml:space="preserve">
|
||||||
<value>Εκτεθειμένος Κύριος Κωδικός Πρόσβασης</value>
|
<value>Εκτεθειμένος Κύριος Κωδικός Πρόσβασης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="PasswordFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?</value>
|
<value>Ο κωδικός έχει βρεθεί σε παραβίαση δεδομένων. Χρησιμοποιήστε έναν μοναδικό κωδικό για την προστασία του λογαριασμού σας. Είστε σίγουροι ότι θέλετε να χρησιμοποιήσετε έναν εκτεθειμένο κωδικό πρόσβασης;</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakAndExposedMasterPassword" xml:space="preserve">
|
<data name="WeakAndExposedMasterPassword" xml:space="preserve">
|
||||||
<value>Weak and Exposed Master Password</value>
|
<value>Αδύναμος και Εκτεθειμένος Κύριος Κωδικός</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?</value>
|
<value>Αδύναμος κωδικός που έχει εντοπιστεί σε παραβίαση δεδομένων. Χρησιμοποιήστε έναν ισχυρό και μοναδικό κωδικό για την προστασία του λογαριασμού σας. Είστε σίγουροι ότι θέλετε να χρησιμοποιήσετε αυτόν τον κωδικό;</value>
|
||||||
|
</data>
|
||||||
|
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
|
||||||
|
<value>Απαιτείται αναγνωριστικό οργανισμού SSO.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
|
||||||
|
<value>Προσθέστε το κλειδί σε ένα υπάρχον ή νέο στοιχείο</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
|
||||||
|
<value>Δεν υπάρχουν αντικείμενα στη κρύπτη σας που ταιριάζουν με "{0}"</value>
|
||||||
|
</data>
|
||||||
|
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
|
||||||
|
<value>Αναζητήστε ένα στοιχείο ή προσθέστε ένα νέο</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
|
<value>Δεν υπάρχουν στοιχεία που να ταιριάζουν με την αναζήτηση</value>
|
||||||
|
</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">
|
||||||
|
<value>Ο κύριος κωδικός πρόσβασής σας δεν πληροί μία ή περισσότερες πολιτικές του οργανισμού σας. Για να αποκτήσετε πρόσβαση στο Vault σας, πρέπει να ενημερώσετε τον κύριο κωδικό πρόσβασής σας τώρα. Η διαδικασία θα σας αποσυνδέσει από την τρέχουσα συνεδρία σας, απαιτώντας από εσάς να συνδεθείτε ξανά. Οι ενεργές συνεδρίες σε άλλες συσκευές ενδέχεται να συνεχίσουν να είναι ενεργές εώς και μία ώρα.</value>
|
||||||
|
</data>
|
||||||
|
<data name="CurrentMasterPassword" xml:space="preserve">
|
||||||
|
<value>Τρέχων κύριος κωδικός</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -583,8 +583,8 @@
|
|||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>A master password hint can help you remember your password if you forget it.</value>
|
<value>A master password hint can help you remember your password if you forget it.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordLengthValMessage" xml:space="preserve">
|
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
|
||||||
<value>Master password must be at least 8 characters long.</value>
|
<value>Master password must be at least {0} characters long.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>Minimum numbers</value>
|
<value>Minimum numbers</value>
|
||||||
@@ -1752,11 +1752,11 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Do you really want to send to the bin?</value>
|
<value>Do you really want to send to the bin?</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="BiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Biometric unlock disabled pending verification of master password.</value>
|
<value>Biometric unlock for this account is disabled pending verification of master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Biometric unlock for autofill disabled pending verification of master password.</value>
|
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
<data name="EnableSyncOnRefresh" xml:space="preserve">
|
||||||
<value>Allow sync on refresh</value>
|
<value>Allow sync on refresh</value>
|
||||||
@@ -2137,15 +2137,21 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Please make sure your default browser supports WebAuthn and try again.</value>
|
<value>Please make sure your default browser supports WebAuthn and try again.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ResetPasswordAutoEnrollInviteWarning" xml:space="preserve">
|
<data name="ResetPasswordAutoEnrollInviteWarning" xml:space="preserve">
|
||||||
<value>This organisation has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organisation administrators to change your master password.</value>
|
<value>This organisation has an enterprise policy that will automatically enrol you in password reset. Enrolment will allow organisation administrators to change your master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
|
||||||
<value>Your organisation policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s)</value>
|
<value>Your organisation policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s)</value>
|
||||||
</data>
|
</data>
|
||||||
|
<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>
|
||||||
|
</data>
|
||||||
|
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
|
||||||
|
<value>Your organization policies have set your vault timeout action to {0}.</value>
|
||||||
|
</data>
|
||||||
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
<data name="VaultTimeoutToLarge" xml:space="preserve">
|
||||||
<value>Your vault timeout exceeds the restrictions set by your organisation.</value>
|
<value>Your vault timeout exceeds the restrictions set by your organisation.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DisablePersonalVaultExportPolicyInEffect">
|
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
|
||||||
<value>One or more organisation policies prevents your from exporting your individual vault.</value>
|
<value>One or more organisation policies prevents your from exporting your individual vault.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAccount" xml:space="preserve">
|
<data name="AddAccount" xml:space="preserve">
|
||||||
@@ -2489,8 +2495,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>
|
||||||
@@ -2540,6 +2546,18 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
|
||||||
<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">
|
||||||
|
<value>Language</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeXDescription" xml:space="preserve">
|
||||||
|
<value>The language has been changed to {0}. Please restart the app to see the change</value>
|
||||||
|
</data>
|
||||||
|
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
|
||||||
|
<value>Language change requires app restart</value>
|
||||||
|
</data>
|
||||||
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
|
<value>Default (System)</value>
|
||||||
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Important</value>
|
<value>Important</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -2576,4 +2594,40 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
|
||||||
<value>Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?</value>
|
<value>Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
|
||||||
|
<value>Organisation SSO identifier required.</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
|
||||||
|
<value>Add the key to an existing or new item</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
|
||||||
|
<value>There are no items in your vault that match "{0}"</value>
|
||||||
|
</data>
|
||||||
|
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
|
||||||
|
<value>Search for an item or add a new item</value>
|
||||||
|
</data>
|
||||||
|
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
|
||||||
|
<value>There are no items that match the search</value>
|
||||||
|
</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">
|
||||||
|
<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 name="CurrentMasterPassword" xml:space="preserve">
|
||||||
|
<value>Current master password</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||