1
0
mirror of https://github.com/bitwarden/mobile synced 2025-12-10 21:33:36 +00:00

Compare commits

..

22 Commits

Author SHA1 Message Date
Jake Fink
3053eaa036 [PM-1379] add DeviceTrustCryptoService with establish trust logic (#2535)
* [PM-1379] add DeviceCryptoService with establish trust logic

* PM-1379 update api location and other minor refactors

* pm-1379 fix encoding

* update trusted device keys api call to Put

* [PM-1379] rename DeviceCryptoService to DeviceTrustCryptoService
- refactors to prevent side effects

* [PM-1379] rearrange methods in DeviceTrustCryptoService

* [PM-1379] rearrange methods in abstraction

* [PM-1379] deconstruct tuples

* [PM-1379] remove extra tasks
2023-07-05 16:13:20 -04:00
github-actions[bot]
1d541e5b8e Autosync the updated translations (#2595)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-06-30 07:06:12 +00:00
ifernandezdiaz
175b9936b6 [PM-2798] Fixing Toolbar locators in FolderAddEditPage (#2592)
* Fixing Toolbar locators

* Adding Matt's suggestions
2023-06-29 15:50:01 -03:00
ifernandezdiaz
72e67bd6f2 [PM-2691] Adding AutomationIDs for Vault Page sections (#2580)
* Adding IDs for Vault Page sections

* Removing extra spaces

* Adding Matt's comments

* Fixing Filters Id bug

* Adding Fede's suggestions

* Fixing Settings Ids issues

* Fixing AutomationIds issues with RecyclerViews + implementing AutomationId helper class

* Adding Fede's suggestion

* Adding latest Fede's suggestions
2023-06-29 15:37:08 -03:00
ifernandezdiaz
216c6abcf6 [PM-2737] Adding AutomationIDs for Send page elements (#2583)
* Adding AutomationIDs for Send page elements

* Fixing some spaces

* Adding Matt's suggestion

* Adding Fede's suggestion

* Removing unnecesarry breaks
2023-06-28 14:07:03 -04:00
Federico Maccaroni
1014563c75 [PM-192] Refactor forwarded email providers (#2579)
* PM-192 Refactor Forwarded email providers to use better patterns and code reuse.

* PM-192 fix format
2023-06-27 18:49:38 -03:00
ifernandezdiaz
3506269811 [PM-2688] Adding IDs for Options and Folders pages (#2585)
* Adding IDs for Options and Folders pages

* Fixing extra spaces
2023-06-26 10:31:57 -03:00
ifernandezdiaz
31487a31bb [PM-2748] Refactoring locator strategy for Cipher Details page (#2586)
* Refactoring locator strategy for Cipher Details page

* Fixing extra spaces
2023-06-26 10:30:13 -03:00
ifernandezdiaz
1407aa5655 [PM-2678] Adding IDs for Settings Page elements (#2584)
* Adding IDS for Settings elements

* Adding IDS for Settings elements
2023-06-23 13:31:24 -03:00
github-actions[bot]
16f59e2698 Autosync the updated translations (#2582)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-06-23 05:40:37 +00:00
ifernandezdiaz
d876b54f45 Adding IDs for AttachmentPage elements (#2577) 2023-06-20 17:49:26 -03:00
ifernandezdiaz
6644e3b449 [PM-2545] Adding Automation IDs for CipherDetailsPage elements (#2576)
* Adding IDs to CipherDetailsPage

* Fixing extra spaces

* Fixing extra space
2023-06-20 16:26:43 -03:00
ifernandezdiaz
8d98d1d5bd [PM-2612] Adding AutomationIDs for LoginPasswordlessPage elements (#2574)
* Adding AutomationIDs for LoginPasswordlessPag elements

* Adding AutomationIDs for LoginPasswordlessRequest page elements

* Fixing missing space
2023-06-20 15:12:15 -03:00
ifernandezdiaz
3e9711f8f2 [PM-2611] Adding IDs for Cipher/Send search results (#2575)
* Adding IDs for Cipher/Send search results

* Adding missing spaces
2023-06-20 11:28:54 -03:00
github-actions[bot]
3af37f01d3 Autosync the updated translations (#2570)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-06-19 09:05:12 +00:00
ifernandezdiaz
43d2d386b1 [PM-2645] Adding IDs for Account Switching elements (#2572)
* Adding IDs for Account Switching elements

* Fixing Active/Inactive vault icon IDs
2023-06-16 16:20:09 -03:00
ifernandezdiaz
bc5c11b47f Adding AutomationIDs on Generator page elements (#2569)
* Adding AutomationIDs on Generator pages

* Adding missing spaces
2023-06-15 16:11:55 -03:00
ifernandezdiaz
52843b4181 [PM-2544] Adding AutomationIDs for CipherAddEditViewPage elements (#2564)
* Adding AutomationIDs for Add/Edit Items page

* Adding IDs to CustomFields

* Adding Matt's suggestions

* Adding newest suggestions
2023-06-14 09:34:38 -03:00
Federico Maccaroni
98705e443f PM-2575 Fixed extension freeze when using the return button on the keyboard when unlocking the extension. Also added way to prevent multiple executions of checking the password and logging exceptions. (#2568) 2023-06-13 22:38:08 +02:00
mpbw2
1332ef7b43 Enhancement to login field detection for Android autofill (#2561) 2023-06-13 13:54:28 -04:00
mpbw2
04e30c2146 Update F-Droid listing author name (#2501)
Update F-Droid listing author name to `Bitwarden Inc`
2023-06-13 18:46:41 +02:00
Opeyemi
f604da13a1 add more comment to missing actions (#2567) 2023-06-13 15:57:02 +01:00
141 changed files with 2305 additions and 1311 deletions

View File

@@ -793,7 +793,7 @@ jobs:
done done
- name: Upload Sources - name: Upload Sources
uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9 uses: crowdin/github-action@965d501f160af7b1f88aed4c29154b0caf1e94b9 # v1.9.0
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}

View File

@@ -30,7 +30,7 @@ jobs:
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@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9 uses: crowdin/github-action@965d501f160af7b1f88aed4c29154b0caf1e94b9 # v1.9.0
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}

View File

@@ -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@a3c219da6b8fa73f6ba62b68ff09c469b3a1c024 # v2.2.2 uses: yogevbd/enforce-label-action@a3c219da6b8fa73f6ba62b68ff09c469b3a1c024 # 2.2.2
with: with:
BANNED_LABELS: "hold,needs-qa" BANNED_LABELS: "hold,needs-qa"
BANNED_LABELS_DESCRIPTION: "PRs with the hold or needs-qa labels cannot be merged" BANNED_LABELS_DESCRIPTION: "PRs with the hold or needs-qa labels cannot be merged"

View File

@@ -68,7 +68,7 @@ jobs:
- name: Download all artifacts - name: Download all artifacts
if: ${{ github.event.inputs.release_type != 'Dry Run' }} if: ${{ github.event.inputs.release_type != 'Dry Run' }}
uses: dawidd6/action-download-artifact@575b1e4167df67acf7e692af784566618b23c71e # v2.17.10 uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0
with: with:
workflow: build.yml workflow: build.yml
workflow_conclusion: success workflow_conclusion: success
@@ -76,7 +76,7 @@ jobs:
- name: Dry Run - Download all artifacts - name: Dry Run - Download all artifacts
if: ${{ github.event.inputs.release_type == 'Dry Run' }} if: ${{ github.event.inputs.release_type == 'Dry Run' }}
uses: dawidd6/action-download-artifact@575b1e4167df67acf7e692af784566618b23c71e # v2.17.10 uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0
with: with:
workflow: build.yml workflow: build.yml
workflow_conclusion: success workflow_conclusion: success
@@ -130,7 +130,7 @@ jobs:
- name: Download F-Droid .apk artifact - name: Download F-Droid .apk artifact
if: ${{ github.event.inputs.release_type != 'Dry Run' }} if: ${{ github.event.inputs.release_type != 'Dry Run' }}
uses: dawidd6/action-download-artifact@575b1e4167df67acf7e692af784566618b23c71e # v2.17.10 uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0
with: with:
workflow: build.yml workflow: build.yml
workflow_conclusion: success workflow_conclusion: success
@@ -139,7 +139,7 @@ jobs:
- name: Dry Run - Download F-Droid .apk artifact - name: Dry Run - Download F-Droid .apk artifact
if: ${{ github.event.inputs.release_type == 'Dry Run' }} if: ${{ github.event.inputs.release_type == 'Dry Run' }}
uses: dawidd6/action-download-artifact@575b1e4167df67acf7e692af784566618b23c71e # v2.17.10 uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0
with: with:
workflow: build.yml workflow: build.yml
workflow_conclusion: success workflow_conclusion: success

View File

@@ -159,6 +159,7 @@
<Compile Include="Constants.cs" /> <Compile Include="Constants.cs" />
<Compile Include="Effects\RemoveFontPaddingEffect.cs" /> <Compile Include="Effects\RemoveFontPaddingEffect.cs" />
<Compile Include="Services\WatchDeviceService.cs" /> <Compile Include="Services\WatchDeviceService.cs" />
<Compile Include="Renderers\CustomLabelRenderer.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<AndroidAsset Include="Assets\bwi-font.ttf" /> <AndroidAsset Include="Assets\bwi-font.ttf" />

View File

@@ -12,7 +12,7 @@ namespace Bit.Droid.Autofill
private List<Field> _passwordFields = null; private List<Field> _passwordFields = null;
private List<Field> _usernameFields = null; private List<Field> _usernameFields = null;
private HashSet<string> _ignoreSearchTerms = new HashSet<string> { "search", "find", "recipient", "edit" }; private HashSet<string> _ignoreSearchTerms = new HashSet<string> { "search", "find", "recipient", "edit" };
private HashSet<string> _usernameTerms = new HashSet<string> { "email", "phone", "username"}; private HashSet<string> _usernameTerms = new HashSet<string> { "email", "phone", "username" };
private HashSet<string> _passwordTerms = new HashSet<string> { "password", "pswd" }; private HashSet<string> _passwordTerms = new HashSet<string> { "password", "pswd" };
public List<AutofillId> AutofillIds { get; private set; } = new List<AutofillId>(); public List<AutofillId> AutofillIds { get; private set; } = new List<AutofillId>();
@@ -54,15 +54,14 @@ namespace Bit.Droid.Autofill
if (HintToFieldsMap.ContainsKey(View.AutofillHintPassword)) if (HintToFieldsMap.ContainsKey(View.AutofillHintPassword))
{ {
_passwordFields.AddRange(HintToFieldsMap[View.AutofillHintPassword]); _passwordFields.AddRange(HintToFieldsMap[View.AutofillHintPassword]);
return _passwordFields;
} }
} }
else
_passwordFields = Fields.Where(f => FieldIsPassword(f)).ToList();
if (!_passwordFields.Any())
{ {
_passwordFields = Fields.Where(f => FieldIsPassword(f)).ToList(); _passwordFields = Fields.Where(f => FieldHasPasswordTerms(f)).ToList();
if (!_passwordFields.Any())
{
_passwordFields = Fields.Where(f => FieldHasPasswordTerms(f)).ToList();
}
} }
return _passwordFields; return _passwordFields;
} }
@@ -87,24 +86,26 @@ namespace Bit.Droid.Autofill
{ {
_usernameFields.AddRange(HintToFieldsMap[View.AutofillHintUsername]); _usernameFields.AddRange(HintToFieldsMap[View.AutofillHintUsername]);
} }
if (_usernameFields.Any())
{
return _usernameFields;
}
} }
else
{
foreach (var passwordField in PasswordFields)
{
var usernameField = Fields.TakeWhile(f => f.AutofillId != passwordField.AutofillId)
.LastOrDefault();
if (usernameField != null)
{
_usernameFields.Add(usernameField);
}
}
if (!_usernameFields.Any()) foreach (var passwordField in PasswordFields)
{
var usernameField = Fields.TakeWhile(f => f.AutofillId != passwordField.AutofillId)
.LastOrDefault();
if (usernameField != null)
{ {
_usernameFields = Fields.Where(f => FieldIsUsername(f)).ToList(); _usernameFields.Add(usernameField);
} }
} }
if (!_usernameFields.Any())
{
_usernameFields = Fields.Where(f => FieldIsUsername(f)).ToList();
}
return _usernameFields; return _usernameFields;
} }
} }

View File

@@ -0,0 +1,31 @@
using System;
using Bit.App.Controls;
using System.ComponentModel;
using Xamarin.Forms.Platform.Android;
using Android.Content;
using Xamarin.Forms;
using Bit.Droid.Renderers;
[assembly: ExportRenderer(typeof(CustomLabel), typeof(CustomLabelRenderer))]
namespace Bit.Droid.Renderers
{
public class CustomLabelRenderer : LabelRenderer
{
public CustomLabelRenderer(Context context)
: base(context)
{ }
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
var label = sender as CustomLabel;
switch (e.PropertyName)
{
case nameof(CustomLabel.AutomationId):
Control.ContentDescription = label.AutomationId;
break;
}
base.OnElementPropertyChanged(sender, e);
}
}
}

View File

@@ -145,6 +145,7 @@
<Folder Include="Controls\DateTime\" /> <Folder Include="Controls\DateTime\" />
<Folder Include="Controls\IconLabelButton\" /> <Folder Include="Controls\IconLabelButton\" />
<Folder Include="Controls\PasswordStrengthProgressBar\" /> <Folder Include="Controls\PasswordStrengthProgressBar\" />
<Folder Include="Utilities\Automation\" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -440,5 +441,6 @@
<None Remove="MessagePack" /> <None Remove="MessagePack" />
<None Remove="MessagePack.MSBuild.Tasks" /> <None Remove="MessagePack.MSBuild.Tasks" />
<None Remove="Controls\PasswordStrengthProgressBar\" /> <None Remove="Controls\PasswordStrengthProgressBar\" />
<None Remove="Utilities\Automation\" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -30,13 +30,15 @@
BackgroundColor="{DynamicResource BackgroundColor}" BackgroundColor="{DynamicResource BackgroundColor}"
VerticalOptions="Start" VerticalOptions="Start"
RowHeight="{Binding AccountListRowHeight, Source={x:Reference _mainOverlay}}" RowHeight="{Binding AccountListRowHeight, Source={x:Reference _mainOverlay}}"
effects:ScrollViewContentInsetAdjustmentBehaviorEffect.ContentInsetAdjustmentBehavior="Never"> effects:ScrollViewContentInsetAdjustmentBehaviorEffect.ContentInsetAdjustmentBehavior="Never"
AutomationId="AccountListView">
<ListView.ItemTemplate> <ListView.ItemTemplate>
<DataTemplate x:DataType="view:AccountView"> <DataTemplate x:DataType="view:AccountView">
<controls:AccountViewCell <controls:AccountViewCell
Account="{Binding .}" Account="{Binding .}"
SelectAccountCommand="{Binding SelectAccountCommand, Source={x:Reference _mainOverlay}}" SelectAccountCommand="{Binding SelectAccountCommand, Source={x:Reference _mainOverlay}}"
LongPressAccountCommand="{Binding LongPressAccountCommand, Source={x:Reference _mainOverlay}}" LongPressAccountCommand="{Binding LongPressAccountCommand, Source={x:Reference _mainOverlay}}"
AutomationId="AccountViewCell"
/> />
</DataTemplate> </DataTemplate>
</ListView.ItemTemplate> </ListView.ItemTemplate>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ViewCell xmlns="http://xamarin.com/schemas/2014/forms" <ViewCell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:xct="http://xamarin.com/schemas/2020/toolkit" xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
@@ -60,20 +60,23 @@
Text="{Binding AccountView.Email}" Text="{Binding AccountView.Email}"
IsVisible="{Binding IsActive}" IsVisible="{Binding IsActive}"
StyleClass="accountlist-title, accountlist-title-platform" StyleClass="accountlist-title, accountlist-title-platform"
LineBreakMode="TailTruncation" /> LineBreakMode="TailTruncation"
AutomationId="AccountEmailLabel" />
<Label <Label
Grid.Row="0" Grid.Row="0"
Text="{Binding AccountView.Email}" Text="{Binding AccountView.Email}"
IsVisible="{Binding IsActive, Converter={StaticResource inverseBool}}" IsVisible="{Binding IsActive, Converter={StaticResource inverseBool}}"
StyleClass="accountlist-title, accountlist-title-platform" StyleClass="accountlist-title, accountlist-title-platform"
TextColor="{DynamicResource MutedColor}" TextColor="{DynamicResource MutedColor}"
LineBreakMode="TailTruncation" /> LineBreakMode="TailTruncation"
AutomationId="AccountEmailLabel" />
<Label <Label
Grid.Row="1" Grid.Row="1"
IsVisible="{Binding ShowHostname}" IsVisible="{Binding ShowHostname}"
Text="{Binding AccountView.Hostname}" Text="{Binding AccountView.Hostname}"
StyleClass="accountlist-sub, accountlist-sub-platform" StyleClass="accountlist-sub, accountlist-sub-platform"
LineBreakMode="TailTruncation" /> LineBreakMode="TailTruncation"
AutomationId="AccountHostUrlLabel" />
<Label <Label
Grid.Row="2" Grid.Row="2"
Text="{u:I18n AccountUnlocked}" Text="{u:I18n AccountUnlocked}"
@@ -81,7 +84,8 @@
StyleClass="accountlist-sub, accountlist-sub-platform" StyleClass="accountlist-sub, accountlist-sub-platform"
FontAttributes="Italic" FontAttributes="Italic"
TextTransform="Lowercase" TextTransform="Lowercase"
LineBreakMode="TailTruncation" /> LineBreakMode="TailTruncation"
AutomationId="AccountStatusLabel" />
<Label <Label
Grid.Row="2" Grid.Row="2"
Text="{u:I18n AccountLocked}" Text="{u:I18n AccountLocked}"
@@ -89,7 +93,8 @@
StyleClass="accountlist-sub, accountlist-sub-platform" StyleClass="accountlist-sub, accountlist-sub-platform"
FontAttributes="Italic" FontAttributes="Italic"
TextTransform="Lowercase" TextTransform="Lowercase"
LineBreakMode="TailTruncation" /> LineBreakMode="TailTruncation"
AutomationId="AccountStatusLabel" />
<Label <Label
Grid.Row="2" Grid.Row="2"
Text="{u:I18n AccountLoggedOut}" Text="{u:I18n AccountLoggedOut}"
@@ -97,7 +102,8 @@
StyleClass="accountlist-sub, accountlist-sub-platform" StyleClass="accountlist-sub, accountlist-sub-platform"
FontAttributes="Italic" FontAttributes="Italic"
TextTransform="Lowercase" TextTransform="Lowercase"
LineBreakMode="TailTruncation" /> LineBreakMode="TailTruncation"
AutomationId="AccountStatusLabel" />
</Grid> </Grid>
<controls:IconLabel <controls:IconLabel
@@ -107,7 +113,8 @@
Margin="12,0" Margin="12,0"
HorizontalOptions="Center" HorizontalOptions="Center"
VerticalOptions="Center" VerticalOptions="Center"
StyleClass="list-icon, list-icon-platform" /> StyleClass="list-icon, list-icon-platform"
AutomationId="InactiveVaultIcon" />
<controls:IconLabel <controls:IconLabel
Grid.Column="2" Grid.Column="2"
Text="{Binding AuthStatusIconActive}" Text="{Binding AuthStatusIconActive}"
@@ -116,7 +123,8 @@
HorizontalOptions="Center" HorizontalOptions="Center"
VerticalOptions="Center" VerticalOptions="Center"
StyleClass="list-icon, list-icon-platform" StyleClass="list-icon, list-icon-platform"
TextColor="{DynamicResource TextColor}"/> TextColor="{DynamicResource TextColor}"
AutomationId="ActiveVaultIcon" />
</Grid> </Grid>
<Grid <Grid
@@ -147,7 +155,8 @@
StyleClass="accountlist-title, accountlist-title-platform" StyleClass="accountlist-title, accountlist-title-platform"
LineBreakMode="TailTruncation" LineBreakMode="TailTruncation"
VerticalOptions="Center" VerticalOptions="Center"
Grid.Column="1" /> Grid.Column="1"
AutomationId="AddAccountButton" />
</Grid> </Grid>
</Grid> </Grid>
</ViewCell> </ViewCell>

View File

@@ -9,7 +9,8 @@
StyleClass="list-row, list-row-platform" StyleClass="list-row, list-row-platform"
RowSpacing="0" RowSpacing="0"
ColumnSpacing="0" ColumnSpacing="0"
x:DataType="controls:CipherViewCellViewModel"> x:DataType="controls:CipherViewCellViewModel"
AutomationId="CipherCell">
<Grid.Resources> <Grid.Resources>
<u:IconGlyphConverter x:Key="iconGlyphConverter"/> <u:IconGlyphConverter x:Key="iconGlyphConverter"/>
@@ -36,7 +37,8 @@
IsVisible="{Binding ShowIconImage, Converter={StaticResource inverseBool}}" IsVisible="{Binding ShowIconImage, Converter={StaticResource inverseBool}}"
Text="{Binding Cipher, Converter={StaticResource iconGlyphConverter}}" Text="{Binding Cipher, Converter={StaticResource iconGlyphConverter}}"
ShouldUpdateFontSizeDynamicallyForAccesibility="True" ShouldUpdateFontSizeDynamicallyForAccesibility="True"
AutomationProperties.IsInAccessibleTree="False" /> AutomationProperties.IsInAccessibleTree="False"
AutomationId="CipherTypeIcon" />
<ff:CachedImage <ff:CachedImage
x:Name="_iconImage" x:Name="_iconImage"
@@ -52,7 +54,8 @@
Aspect="AspectFit" Aspect="AspectFit"
IsVisible="{Binding ShowIconImage}" IsVisible="{Binding ShowIconImage}"
Source="{Binding IconImageSource, Mode=OneTime}" Source="{Binding IconImageSource, Mode=OneTime}"
AutomationProperties.IsInAccessibleTree="False" /> AutomationProperties.IsInAccessibleTree="False"
AutomationId="CipherWebsiteIcon" />
<Grid RowSpacing="0" ColumnSpacing="0" Grid.Row="0" Grid.Column="1" VerticalOptions="Center" Padding="0, 7"> <Grid RowSpacing="0" ColumnSpacing="0" Grid.Row="0" Grid.Column="1" VerticalOptions="Center" Padding="0, 7">
<Grid.RowDefinitions> <Grid.RowDefinitions>
@@ -71,7 +74,8 @@
Grid.Column="0" Grid.Column="0"
Grid.Row="0" Grid.Row="0"
StyleClass="list-title, list-title-platform" StyleClass="list-title, list-title-platform"
Text="{Binding Cipher.Name}" /> Text="{Binding Cipher.Name}"
AutomationId="CipherNameLabel" />
<Label <Label
LineBreakMode="TailTruncation" LineBreakMode="TailTruncation"
Grid.Column="0" Grid.Column="0"
@@ -80,7 +84,8 @@
StyleClass="list-subtitle, list-subtitle-platform" StyleClass="list-subtitle, list-subtitle-platform"
Text="{Binding Cipher.SubTitle}" Text="{Binding Cipher.SubTitle}"
IsVisible="{Binding Source={RelativeSource Self}, Path=Text, IsVisible="{Binding Source={RelativeSource Self}, Path=Text,
Converter={StaticResource stringHasValueConverter}}"/> Converter={StaticResource stringHasValueConverter}}"
AutomationId="CipherSubTitleLabel" />
<controls:IconLabel <controls:IconLabel
Grid.Column="1" Grid.Column="1"
Grid.Row="0" Grid.Row="0"
@@ -91,7 +96,8 @@
Text="{Binding Source={x:Static core:BitwardenIcons.Collection}}" Text="{Binding Source={x:Static core:BitwardenIcons.Collection}}"
IsVisible="{Binding Cipher.Shared, Mode=OneTime}" IsVisible="{Binding Cipher.Shared, Mode=OneTime}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Shared}" /> AutomationProperties.Name="{u:I18n Shared}"
AutomationId="CipherInCollectionIcon" />
<controls:IconLabel <controls:IconLabel
Grid.Column="2" Grid.Column="2"
Grid.Row="0" Grid.Row="0"
@@ -102,7 +108,8 @@
Text="{Binding Source={x:Static core:BitwardenIcons.Paperclip}}" Text="{Binding Source={x:Static core:BitwardenIcons.Paperclip}}"
IsVisible="{Binding Cipher.HasAttachments, Mode=OneTime}" IsVisible="{Binding Cipher.HasAttachments, Mode=OneTime}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Attachments}" /> AutomationProperties.Name="{u:I18n Attachments}"
AutomationId="CipherWithAttachmentsIcon" />
</Grid> </Grid>
<controls:MiButton <controls:MiButton
@@ -114,6 +121,7 @@
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
HorizontalOptions="EndAndExpand" HorizontalOptions="EndAndExpand"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Options}" /> AutomationProperties.Name="{u:I18n Options}"
AutomationId="CipherOptionsButton" />
</controls:ExtendedGrid> </controls:ExtendedGrid>

View File

@@ -0,0 +1,13 @@
using System;
using Xamarin.Forms;
namespace Bit.App.Controls
{
public class CustomLabel : Label
{
public CustomLabel()
{
}
}
}

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<controls:ExtendedGrid xmlns="http://xamarin.com/schemas/2014/forms" <controls:ExtendedGrid xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Bit.App.Controls.SendViewCell" x:Class="Bit.App.Controls.SendViewCell"
@@ -54,14 +54,16 @@
Grid.Column="0" Grid.Column="0"
Grid.Row="0" Grid.Row="0"
StyleClass="list-title, list-title-platform" StyleClass="list-title, list-title-platform"
Text="{Binding Send.Name}" /> Text="{Binding Send.Name}"
AutomationId="SendNameLabel" />
<Label <Label
LineBreakMode="TailTruncation" LineBreakMode="TailTruncation"
Grid.Column="0" Grid.Column="0"
Grid.Row="1" Grid.Row="1"
Grid.ColumnSpan="6" Grid.ColumnSpan="6"
StyleClass="list-subtitle, list-subtitle-platform" StyleClass="list-subtitle, list-subtitle-platform"
Text="{Binding Send.DisplayDate}" /> Text="{Binding Send.DisplayDate}"
AutomationId="SendDateLabel" />
<controls:IconLabel <controls:IconLabel
Grid.Column="1" Grid.Column="1"
Grid.Row="0" Grid.Row="0"
@@ -72,7 +74,8 @@
Text="{Binding Source={x:Static core:BitwardenIcons.ExclamationTriangle}}" Text="{Binding Source={x:Static core:BitwardenIcons.ExclamationTriangle}}"
IsVisible="{Binding Send.Disabled, Mode=OneTime}" IsVisible="{Binding Send.Disabled, Mode=OneTime}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Disabled}" /> AutomationProperties.Name="{u:I18n Disabled}"
AutomationId="DisabledSendLabel" />
<controls:IconLabel <controls:IconLabel
Grid.Column="2" Grid.Column="2"
Grid.Row="0" Grid.Row="0"
@@ -83,7 +86,8 @@
Text="{Binding Source={x:Static core:BitwardenIcons.Key}}" Text="{Binding Source={x:Static core:BitwardenIcons.Key}}"
IsVisible="{Binding Send.HasPassword, Mode=OneTime}" IsVisible="{Binding Send.HasPassword, Mode=OneTime}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Password}" /> AutomationProperties.Name="{u:I18n Password}"
AutomationId="PasswordProtectedSendLabel" />
<controls:IconLabel <controls:IconLabel
Grid.Column="3" Grid.Column="3"
Grid.Row="0" Grid.Row="0"
@@ -94,7 +98,8 @@
Text="{Binding Source={x:Static core:BitwardenIcons.Ban}}" Text="{Binding Source={x:Static core:BitwardenIcons.Ban}}"
IsVisible="{Binding Send.MaxAccessCountReached, Mode=OneTime}" IsVisible="{Binding Send.MaxAccessCountReached, Mode=OneTime}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n MaxAccessCountReached}" /> AutomationProperties.Name="{u:I18n MaxAccessCountReached}"
AutomationId="SendMaxAccessCountReachedLabel" />
<controls:IconLabel <controls:IconLabel
Grid.Column="4" Grid.Column="4"
Grid.Row="0" Grid.Row="0"
@@ -105,7 +110,8 @@
Text="{Binding Source={x:Static core:BitwardenIcons.Clock}}" Text="{Binding Source={x:Static core:BitwardenIcons.Clock}}"
IsVisible="{Binding Send.Expired, Mode=OneTime}" IsVisible="{Binding Send.Expired, Mode=OneTime}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Expired}" /> AutomationProperties.Name="{u:I18n Expired}"
AutomationId="ExpiredSendLabel" />
<controls:IconLabel <controls:IconLabel
Grid.Column="5" Grid.Column="5"
Grid.Row="0" Grid.Row="0"
@@ -116,7 +122,8 @@
Text="{Binding Source={x:Static core:BitwardenIcons.Trash}}" Text="{Binding Source={x:Static core:BitwardenIcons.Trash}}"
IsVisible="{Binding Send.PendingDelete, Mode=OneTime}" IsVisible="{Binding Send.PendingDelete, Mode=OneTime}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n PendingDelete}" /> AutomationProperties.Name="{u:I18n PendingDelete}"
AutomationId="SendWithPendingDeletionLabel" />
</Grid> </Grid>
<controls:MiButton <controls:MiButton
@@ -129,6 +136,7 @@
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
HorizontalOptions="EndAndExpand" HorizontalOptions="EndAndExpand"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Options}" /> AutomationProperties.Name="{u:I18n Options}"
AutomationId="SendOptionsButton" />
</controls:ExtendedGrid> </controls:ExtendedGrid>

View File

@@ -33,7 +33,8 @@
StyleClass="box-label" StyleClass="box-label"
Grid.Row="0" Grid.Row="0"
Grid.Column="0" Grid.Column="0"
IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" /> IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}"
AutomationId="BooleanCustomFieldNameLabel" />
<Label <Label
Text="{Binding Field.Name, Mode=OneWay}" Text="{Binding Field.Name, Mode=OneWay}"
IsVisible="{Binding IsEditing}" IsVisible="{Binding IsEditing}"
@@ -49,13 +50,15 @@
Grid.Row="1" Grid.Row="1"
Grid.Column="0" Grid.Column="0"
Margin="0, 5, 0, 0" Margin="0, 5, 0, 0"
IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" /> IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}"
AutomationId="BooleanCustomFieldValueLabel" />
<Switch <Switch
IsToggled="{Binding BooleanValue}" IsToggled="{Binding BooleanValue}"
IsVisible="{Binding IsEditing}" IsVisible="{Binding IsEditing}"
Grid.Row="0" Grid.Row="0"
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" /> Grid.RowSpan="2"
AutomationId="BooleanCustomFieldValueToggle" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Cog}}" Text="{Binding Source={x:Static core:BitwardenIcons.Cog}}"

View File

@@ -31,7 +31,8 @@
Text="{Binding Field.Name, Mode=OneWay}" Text="{Binding Field.Name, Mode=OneWay}"
StyleClass="box-label" StyleClass="box-label"
Grid.Row="0" Grid.Row="0"
Grid.Column="0" /> Grid.Column="0"
AutomationId="HiddenCustomFieldNameLabel" />
<StackLayout <StackLayout
Grid.Row="1" Grid.Row="1"
Grid.Column="0" Grid.Column="0"
@@ -39,7 +40,8 @@
<controls:MonoLabel <controls:MonoLabel
Text="{Binding ValueText, Mode=OneWay}" Text="{Binding ValueText, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
IsVisible="{Binding ShowHiddenValue}" /> IsVisible="{Binding ShowHiddenValue}"
AutomationId="HiddenCustomFieldValueLabel" />
<controls:MonoLabel <controls:MonoLabel
Text="{Binding Field.MaskedValue, Mode=OneWay}" Text="{Binding Field.MaskedValue, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
@@ -56,7 +58,8 @@
IsSpellCheckEnabled="False" IsSpellCheckEnabled="False"
IsTextPredictionEnabled="False" IsTextPredictionEnabled="False"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{Binding Field.Name}"> AutomationProperties.Name="{Binding Field.Name}"
AutomationId="HiddenCustomFieldValueEntry">
<Entry.Keyboard> <Entry.Keyboard>
<Keyboard x:FactoryMethod="Create"> <Keyboard x:FactoryMethod="Create">
<x:Arguments> <x:Arguments>
@@ -74,7 +77,8 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ToggleVisibility}" /> AutomationProperties.Name="{u:I18n ToggleVisibility}"
AutomationId="HiddenCustomFieldShowValueButton" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}" Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"

View File

@@ -29,13 +29,15 @@
Text="{Binding Field.Name, Mode=OneWay}" Text="{Binding Field.Name, Mode=OneWay}"
StyleClass="box-label" StyleClass="box-label"
Grid.Row="0" Grid.Row="0"
Grid.Column="0" /> Grid.Column="0"
AutomationId="LinkedCustomFieldNameLabel" />
<controls:IconLabel <controls:IconLabel
Text="{Binding ValueText, Mode=OneWay}" Text="{Binding ValueText, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
Grid.Row="1" Grid.Row="1"
Grid.Column="0" Grid.Column="0"
IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" /> IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}"
AutomationId="LinkedCustomFieldValueLabel" />
<StackLayout <StackLayout
StyleClass="box-row, box-row-input" StyleClass="box-row, box-row-input"
IsVisible="{Binding IsEditing}"> IsVisible="{Binding IsEditing}">
@@ -44,7 +46,8 @@
ItemsSource="{Binding LinkedFieldOptions, Mode=OneTime}" ItemsSource="{Binding LinkedFieldOptions, Mode=OneTime}"
SelectedIndex="{Binding LinkedFieldOptionSelectedIndex}" SelectedIndex="{Binding LinkedFieldOptionSelectedIndex}"
ItemDisplayBinding="{Binding Key}" ItemDisplayBinding="{Binding Key}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="LinkedCustomFieldValuePicker" />
</StackLayout> </StackLayout>
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
@@ -55,7 +58,8 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Options}" /> AutomationProperties.Name="{u:I18n Options}"
AutomationId="LinkedCustomFieldOptionsButton" />
</Grid> </Grid>
<BoxView StyleClass="box-row-separator" IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" /> <BoxView StyleClass="box-row-separator" IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" />
</StackLayout> </StackLayout>

View File

@@ -29,13 +29,15 @@
Text="{Binding Field.Name, Mode=OneWay}" Text="{Binding Field.Name, Mode=OneWay}"
StyleClass="box-label" StyleClass="box-label"
Grid.Row="0" Grid.Row="0"
Grid.Column="0" /> Grid.Column="0"
AutomationId="TextCustomFieldNameLabel" />
<Label <Label
Text="{Binding ValueText, Mode=OneWay}" Text="{Binding ValueText, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
Grid.Row="1" Grid.Row="1"
Grid.Column="0" Grid.Column="0"
IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" /> IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}"
AutomationId="TextCustomFieldValueLabel" />
<Entry <Entry
Text="{Binding Field.Value}" Text="{Binding Field.Value}"
StyleClass="box-value" StyleClass="box-value"
@@ -43,7 +45,8 @@
Grid.Column="0" Grid.Column="0"
IsVisible="{Binding IsEditing}" IsVisible="{Binding IsEditing}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{Binding Field.Name}" /> AutomationProperties.Name="{Binding Field.Name}"
AutomationId="TextCustomFieldValueEntry" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}" Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
@@ -53,7 +56,8 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Copy}" /> AutomationProperties.Name="{u:I18n Copy}"
AutomationId="TextCustomFieldCopyValue" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Cog}}" Text="{Binding Source={x:Static core:BitwardenIcons.Cog}}"
@@ -63,7 +67,8 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Options}" /> AutomationProperties.Name="{u:I18n Options}"
AutomationId="TextCustomFieldOptionsButton" />
</Grid> </Grid>
<BoxView StyleClass="box-row-separator" IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" /> <BoxView StyleClass="box-row-separator" IsVisible="{Binding IsEditing, Mode=OneWay, Converter={StaticResource inverseBool}}" />
</StackLayout> </StackLayout>

View File

@@ -95,14 +95,6 @@
<Label <Label
Text="{u:I18n CustomEnvironmentFooter}" Text="{u:I18n CustomEnvironmentFooter}"
StyleClass="box-footer-label" /> StyleClass="box-footer-label" />
<StackLayout StyleClass="box-row">
<Button Text="{u:I18n LoadFromFile}"
StyleClass="btn-primary"
Command="{Binding LoadFromFileCommand}" />
<Button Text="{u:I18n Clear}"
StyleClass="btn-secondary"
Command="{Binding ClearCommand}" />
</StackLayout>
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
</ScrollView> </ScrollView>

View File

@@ -1,15 +1,11 @@
using System; using System;
using System.IO;
using System.Threading.Tasks; 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.Models.Data;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Newtonsoft.Json;
using Xamarin.CommunityToolkit.ObjectModel; using Xamarin.CommunityToolkit.ObjectModel;
using Xamarin.Essentials;
using Xamarin.Forms;
namespace Bit.App.Pages namespace Bit.App.Pages
{ {
@@ -31,13 +27,9 @@ namespace Bit.App.Pages
IconsUrl = _environmentService.IconsUrl; IconsUrl = _environmentService.IconsUrl;
NotificationsUrls = _environmentService.NotificationsUrl; NotificationsUrls = _environmentService.NotificationsUrl;
SubmitCommand = new AsyncCommand(SubmitAsync, onException: ex => OnSubmitException(ex), allowsMultipleExecutions: false); SubmitCommand = new AsyncCommand(SubmitAsync, onException: ex => OnSubmitException(ex), allowsMultipleExecutions: false);
LoadFromFileCommand = new AsyncCommand(LoadEnvironmentsFromFile, onException: ex => OnSubmitException(ex), allowsMultipleExecutions: false);
ClearCommand = new Command(ClearAllUrls);
} }
public ICommand SubmitCommand { get; } public ICommand SubmitCommand { get; }
public ICommand LoadFromFileCommand { get; }
public ICommand ClearCommand { get; }
public string BaseUrl { get; set; } public string BaseUrl { get; set; }
public string ApiUrl { get; set; } public string ApiUrl { get; set; }
public string IdentityUrl { get; set; } public string IdentityUrl { get; set; }
@@ -95,75 +87,5 @@ namespace Bit.App.Pages
_logger.Value.Exception(ex); _logger.Value.Exception(ex);
Page.DisplayAlert(AppResources.AnErrorHasOccurred, AppResources.GenericErrorMessage, AppResources.Ok); Page.DisplayAlert(AppResources.AnErrorHasOccurred, AppResources.GenericErrorMessage, AppResources.Ok);
} }
private async Task LoadEnvironmentsFromFile()
{
try
{
string jsonString;
var result = await FilePicker.PickAsync(new PickOptions
{
PickerTitle = "This a test to pick files"
});
if (result != null)
{
if (result.FileName.EndsWith("json", StringComparison.OrdinalIgnoreCase) ||
result.FileName.EndsWith("txt", StringComparison.OrdinalIgnoreCase))
{
var stream = await result.OpenReadAsync();
using (var reader = new System.IO.StreamReader(stream))
{
jsonString = reader.ReadToEnd();
}
var envUrls = JsonConvert.DeserializeObject<EnvironmentsData>(jsonString);
BaseUrl = envUrls.Base;
ApiUrl = envUrls.Api;
IdentityUrl = envUrls.Identity;
WebVaultUrl = envUrls.Vault;
IconsUrl = envUrls.Icons;
NotificationsUrls = envUrls.Notifications;
NotifyUrlsChanged();
}
}
}
catch (Exception ex)
{
HandleException(ex);
}
}
private void ClearAllUrls()
{
BaseUrl = string.Empty;
ApiUrl = string.Empty;
IdentityUrl = string.Empty;
WebVaultUrl = string.Empty;
IconsUrl = string.Empty;
NotificationsUrls = string.Empty;
NotifyUrlsChanged();
}
private void NotifyUrlsChanged() {
TriggerPropertyChanged(nameof(BaseUrl), new[]
{
nameof(ApiUrl),
nameof(IdentityUrl),
nameof(WebVaultUrl),
nameof(IconsUrl),
nameof(NotificationsUrls)
});
}
}
public class EnvironmentsData
{
public string Base { get; set; }
public string Admin { get; set; }
public string Api { get; set; }
public string Identity { get; set; }
public string Icons { get; set; }
public string Notifications { get; set; }
public string Sso { get; set; }
public string Vault { get; set; }
} }
} }

View File

@@ -23,7 +23,8 @@
Priority="-1" Priority="-1"
UseOriginalImage="True" UseOriginalImage="True"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Account}" /> AutomationProperties.Name="{u:I18n Account}"
AutomationId="AccountIconButton" />
<ToolbarItem 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"/>
</ContentPage.ToolbarItems> </ContentPage.ToolbarItems>

View File

@@ -24,7 +24,8 @@
Priority="-1" Priority="-1"
UseOriginalImage="True" UseOriginalImage="True"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Account}" /> AutomationProperties.Name="{u:I18n Account}"
AutomationId="AccountIconButton" />
</ContentPage.ToolbarItems> </ContentPage.ToolbarItems>
<ContentPage.Resources> <ContentPage.Resources>
@@ -72,7 +73,7 @@
Grid.Column="0" Grid.Column="0"
ReturnType="Go" ReturnType="Go"
ReturnCommand="{Binding SubmitCommand}" ReturnCommand="{Binding SubmitCommand}"
AutomationId="PinEntry"/> AutomationId="PinEntry" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowPasswordIcon}" Text="{Binding ShowPasswordIcon}"
@@ -83,7 +84,7 @@
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ToggleVisibility}" AutomationProperties.Name="{u:I18n ToggleVisibility}"
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}" AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
AutomationId="PinVisibilityToggle"/> AutomationId="PinVisibilityToggle" />
</Grid> </Grid>
<Grid <Grid
x:Name="_passwordGrid" x:Name="_passwordGrid"
@@ -114,7 +115,7 @@
Grid.Column="0" Grid.Column="0"
ReturnType="Go" ReturnType="Go"
ReturnCommand="{Binding SubmitCommand}" ReturnCommand="{Binding SubmitCommand}"
AutomationId="MasterPasswordEntry"/> AutomationId="MasterPasswordEntry" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowPasswordIcon}" Text="{Binding ShowPasswordIcon}"
@@ -153,7 +154,7 @@
Text="{u:I18n Unlock}" Text="{u:I18n Unlock}"
StyleClass="btn-primary" StyleClass="btn-primary"
Clicked="Unlock_Clicked" Clicked="Unlock_Clicked"
AutomationId="UnlockVaultButton"/> AutomationId="UnlockVaultButton" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
</ScrollView> </ScrollView>

View File

@@ -24,7 +24,8 @@
Priority="-1" Priority="-1"
UseOriginalImage="True" UseOriginalImage="True"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Account}" /> AutomationProperties.Name="{u:I18n Account}"
AutomationId="AccountIconButton" />
</ContentPage.ToolbarItems> </ContentPage.ToolbarItems>
<ContentPage.Resources> <ContentPage.Resources>
@@ -34,7 +35,7 @@
x:Name="_moreItem" x:Key="moreItem" x:Name="_moreItem" x:Key="moreItem"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Options}" AutomationProperties.Name="{u:I18n Options}"
AutomationId="OptionsButton"/> AutomationId="OptionsButton" />
<ToolbarItem Text="{u:I18n GetPasswordHint}" <ToolbarItem Text="{u:I18n GetPasswordHint}"
x:Key="getPasswordHint" x:Key="getPasswordHint"
x:Name="_getPasswordHint" x:Name="_getPasswordHint"

View File

@@ -32,7 +32,8 @@
<Label <Label
Text="{Binding LogInAttemptByLabel}" Text="{Binding LogInAttemptByLabel}"
FontSize="Small" FontSize="Small"
Margin="0,0,0,24"/> Margin="0,0,0,24"
AutomationId="LogInAttemptByLabel" />
<Label <Label
Text="{u:I18n FingerprintPhrase}" Text="{u:I18n FingerprintPhrase}"
FontSize="Small" FontSize="Small"
@@ -41,7 +42,8 @@
FormattedText="{Binding LoginRequest.FingerprintPhrase}" FormattedText="{Binding LoginRequest.FingerprintPhrase}"
FontSize="Medium" FontSize="Medium"
TextColor="{DynamicResource FingerprintPhrase}" TextColor="{DynamicResource FingerprintPhrase}"
Margin="0,0,0,27"/> Margin="0,0,0,27"
AutomationId="FingerprintValueLabel" />
<Label <Label
Text="{u:I18n DeviceType}" Text="{u:I18n DeviceType}"
FontSize="Small" FontSize="Small"
@@ -49,7 +51,8 @@
<Label <Label
Text="{Binding LoginRequest.DeviceType}" Text="{Binding LoginRequest.DeviceType}"
FontSize="Small" FontSize="Small"
Margin="0,0,0,21"/> Margin="0,0,0,21"
AutomationId="DeviceTypeValueLabel" />
<Label <Label
Text="{u:I18n IpAddress}" Text="{u:I18n IpAddress}"
IsVisible="{Binding ShowIpAddress}" IsVisible="{Binding ShowIpAddress}"
@@ -59,7 +62,8 @@
Text="{Binding LoginRequest.IpAddress}" Text="{Binding LoginRequest.IpAddress}"
IsVisible="{Binding ShowIpAddress}" IsVisible="{Binding ShowIpAddress}"
FontSize="Small" FontSize="Small"
Margin="0,0,0,21"/> Margin="0,0,0,21"
AutomationId="IpAddressValueLabel" />
<Label <Label
Text="{u:I18n Time}" Text="{u:I18n Time}"
FontSize="Small" FontSize="Small"
@@ -67,7 +71,8 @@
<Label <Label
Text="{Binding TimeOfRequestText}" Text="{Binding TimeOfRequestText}"
FontSize="Small" FontSize="Small"
Margin="0,0,0,57"/> Margin="0,0,0,57"
AutomationId="TimeOfRequestValueLabel" />
</StackLayout> </StackLayout>
</ScrollView> </ScrollView>
@@ -75,11 +80,13 @@
Text="{u:I18n ConfirmLogIn}" Text="{u:I18n ConfirmLogIn}"
Command="{Binding AcceptRequestCommand}" Command="{Binding AcceptRequestCommand}"
Margin="0,0,0,17" Margin="0,0,0,17"
StyleClass="btn-primary"/> StyleClass="btn-primary"
AutomationId="ConfirmLoginButton" />
<Button <Button
Text="{u:I18n DenyLogIn}" Text="{u:I18n DenyLogIn}"
Command="{Binding RejectRequestCommand}" Command="{Binding RejectRequestCommand}"
StyleClass="btn-secundary"/> StyleClass="btn-secundary"
AutomationId="DenyLoginButton" />
</StackLayout> </StackLayout>
</pages:BaseContentPage> </pages:BaseContentPage>

View File

@@ -24,7 +24,8 @@
Text="{u:I18n LogInInitiated}" Text="{u:I18n LogInInitiated}"
FontSize="Title" FontSize="Title"
FontAttributes="Bold" FontAttributes="Bold"
Margin="0,14,0,21"/> Margin="0,14,0,21"
AutomationId="LogInInitiatedLabel" />
<Label <Label
Text="{u:I18n ANotificationHasBeenSentToYourDevice}" Text="{u:I18n ANotificationHasBeenSentToYourDevice}"
FontSize="Small" FontSize="Small"
@@ -40,13 +41,15 @@
<controls:MonoLabel <controls:MonoLabel
FormattedText="{Binding FingerprintPhrase}" FormattedText="{Binding FingerprintPhrase}"
FontSize="Medium" FontSize="Medium"
TextColor="{DynamicResource FingerprintPhrase}"/> TextColor="{DynamicResource FingerprintPhrase}"
AutomationId="FingerprintPhraseValue" />
<Label <Label
Text="{u:I18n ResendNotification}" Text="{u:I18n ResendNotification}"
StyleClass="text-md" StyleClass="text-md"
HorizontalOptions="Start" HorizontalOptions="Start"
Margin="0,40,0,0" Margin="0,40,0,0"
TextColor="{DynamicResource HyperlinkColor}"> TextColor="{DynamicResource HyperlinkColor}"
AutomationId="ResendNotificationButton">
<Label.GestureRecognizers> <Label.GestureRecognizers>
<TapGestureRecognizer Command="{Binding CreatePasswordlessLoginCommand}" /> <TapGestureRecognizer Command="{Binding CreatePasswordlessLoginCommand}" />
</Label.GestureRecognizers> </Label.GestureRecognizers>
@@ -64,7 +67,8 @@
VerticalTextAlignment="End" VerticalTextAlignment="End"
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
Margin="5, 0" Margin="5, 0"
TextColor="{DynamicResource HyperlinkColor}"> TextColor="{DynamicResource HyperlinkColor}"
AutomationId="ViewAllLoginOptionsButton">
<Label.GestureRecognizers> <Label.GestureRecognizers>
<TapGestureRecognizer Command="{Binding CloseCommand}" /> <TapGestureRecognizer Command="{Binding CloseCommand}" />
</Label.GestureRecognizers> </Label.GestureRecognizers>

View File

@@ -27,7 +27,8 @@
Clicked="Clear_Clicked" Clicked="Clear_Clicked"
Order="Secondary" Order="Secondary"
x:Name="_clearItem" x:Name="_clearItem"
x:Key="clearItem" /> x:Key="clearItem"
AutomationId="ClearPasswordList" />
<ToolbarItem Icon="more_vert.png" <ToolbarItem Icon="more_vert.png"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Options}" AutomationProperties.Name="{u:I18n Options}"
@@ -43,7 +44,8 @@
Margin="20, 0" Margin="20, 0"
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand"
HorizontalTextAlignment="Center"></Label> HorizontalTextAlignment="Center"
AutomationId="NoPasswordsDisplayedLabel"></Label>
<controls:ExtendedCollectionView <controls:ExtendedCollectionView
IsVisible="{Binding ShowNoData, Converter={StaticResource inverseBool}}" IsVisible="{Binding ShowNoData, Converter={StaticResource inverseBool}}"
ItemsSource="{Binding History}" ItemsSource="{Binding History}"
@@ -56,7 +58,8 @@
StyleClass="list-row, list-row-platform" StyleClass="list-row, list-row-platform"
Padding="10" Padding="10"
RowSpacing="0" RowSpacing="0"
ColumnSpacing="10"> ColumnSpacing="10"
AutomationId="GeneratedPasswordRow">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
@@ -71,12 +74,14 @@
Grid.Column="0" Grid.Column="0"
Grid.Row="0" Grid.Row="0"
StyleClass="list-title, list-title-platform, text-html" StyleClass="list-title, list-title-platform, text-html"
Text="{Binding Password, Mode=OneWay, Converter={StaticResource coloredPassword}}" /> Text="{Binding Password, Mode=OneWay, Converter={StaticResource coloredPassword}}"
AutomationId="GeneratedPasswordValue" />
<Label LineBreakMode="TailTruncation" <Label LineBreakMode="TailTruncation"
Grid.Column="0" Grid.Column="0"
Grid.Row="1" Grid.Row="1"
StyleClass="list-subtitle, list-subtitle-platform" StyleClass="list-subtitle, list-subtitle-platform"
Text="{Binding Date, Mode=OneWay, Converter={StaticResource dateTime}}" /> Text="{Binding Date, Mode=OneWay, Converter={StaticResource dateTime}}"
AutomationId="GeneratedPasswordDateLabel" />
<controls:IconButton <controls:IconButton
StyleClass="list-row-button, list-row-button-platform" StyleClass="list-row-button, list-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Paste}}" Text="{Binding Source={x:Static core:BitwardenIcons.Paste}}"
@@ -86,7 +91,8 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CopyPassword}" /> AutomationProperties.Name="{u:I18n CopyPassword}"
AutomationId="CopyPasswordValueButton" />
</Grid> </Grid>
</DataTemplate> </DataTemplate>
</CollectionView.ItemTemplate> </CollectionView.ItemTemplate>

View File

@@ -71,7 +71,8 @@
<Label <Label
Text="{u:I18n PasswordGeneratorPolicyInEffect}" Text="{u:I18n PasswordGeneratorPolicyInEffect}"
StyleClass="text-muted, text-sm, text-bold" StyleClass="text-muted, text-sm, text-bold"
HorizontalTextAlignment="Center" /> HorizontalTextAlignment="Center"
AutomationId="PasswordGeneratorPolicyInEffectLabel" />
</Frame> </Frame>
</Grid> </Grid>
<Grid IsVisible="{Binding IsUsername, Converter={StaticResource inverseBool}}" <Grid IsVisible="{Binding IsUsername, Converter={StaticResource inverseBool}}"
@@ -82,21 +83,24 @@
x:Name="lblPassword" x:Name="lblPassword"
StyleClass="text-lg, text-html" StyleClass="text-lg, text-html"
Text="{Binding ColoredPassword, Mode=OneWay}" Text="{Binding ColoredPassword, Mode=OneWay}"
Margin="0, 20" /> Margin="0, 20"
AutomationId="GeneratedPasswordLabel" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}" Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
Command="{Binding CopyCommand}" Command="{Binding CopyCommand}"
Grid.Column="1" Grid.Column="1"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CopyPassword}" /> AutomationProperties.Name="{u:I18n CopyPassword}"
AutomationId="CopyValueButton" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}" Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}"
Command="{Binding RegenerateCommand}" Command="{Binding RegenerateCommand}"
Grid.Column="2" Grid.Column="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n GeneratePassword}" /> AutomationProperties.Name="{u:I18n GeneratePassword}"
AutomationId="RegenerateValueButton" />
</Grid> </Grid>
<Grid IsVisible="{Binding IsUsername}" <Grid IsVisible="{Binding IsUsername}"
StyleClass="box-row" StyleClass="box-row"
@@ -107,21 +111,24 @@
StyleClass="text-lg, text-html" StyleClass="text-lg, text-html"
Text="{Binding ColoredUsername, Mode=OneWay}" Text="{Binding ColoredUsername, Mode=OneWay}"
Margin="0, 20" Margin="0, 20"
HorizontalOptions="Start" /> HorizontalOptions="Start"
AutomationId="GeneratedPasswordLabel" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}" Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
Command="{Binding CopyCommand}" Command="{Binding CopyCommand}"
Grid.Column="1" Grid.Column="1"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CopyUsername}" /> AutomationProperties.Name="{u:I18n CopyUsername}"
AutomationId="CopyValueButton" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}" Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}"
Command="{Binding RegenerateUsernameCommand}" Command="{Binding RegenerateUsernameCommand}"
Grid.Column="2" Grid.Column="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n GenerateUsername}" /> AutomationProperties.Name="{u:I18n GenerateUsername}"
AutomationId="RegenerateValueButton" />
</Grid> </Grid>
<BoxView StyleClass="box-row-separator"/> <BoxView StyleClass="box-row-separator"/>
<StackLayout StyleClass="box" <StackLayout StyleClass="box"
@@ -135,7 +142,8 @@
ItemsSource="{Binding GeneratorTypeOptions, Mode=OneTime}" ItemsSource="{Binding GeneratorTypeOptions, Mode=OneTime}"
SelectedItem="{Binding GeneratorTypeSelected}" SelectedItem="{Binding GeneratorTypeSelected}"
ItemDisplayBinding="{Binding ., Converter={StaticResource localizableEnum}}" ItemDisplayBinding="{Binding ., Converter={StaticResource localizableEnum}}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="GeneratorTypePicker" />
</StackLayout> </StackLayout>
<Label Text="{u:I18n Options, Header=True}" <Label Text="{u:I18n Options, Header=True}"
StyleClass="box-header, box-header-platform" StyleClass="box-header, box-header-platform"
@@ -161,7 +169,8 @@
ItemsSource="{Binding UsernameTypeOptions, Mode=OneTime}" ItemsSource="{Binding UsernameTypeOptions, Mode=OneTime}"
SelectedItem="{Binding UsernameTypeSelected}" SelectedItem="{Binding UsernameTypeSelected}"
ItemDisplayBinding="{Binding ., Converter={StaticResource localizableEnum}}" ItemDisplayBinding="{Binding ., Converter={StaticResource localizableEnum}}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="UsernameTypePicker" />
<Label <Label
StyleClass="box-footer-label" StyleClass="box-footer-label"
Text="{Binding UsernameTypeDescriptionLabel}" /> Text="{Binding UsernameTypeDescriptionLabel}" />
@@ -172,7 +181,8 @@
StyleClass="box-label" /> StyleClass="box-label" />
<Entry x:Name="_plusAddressedEmailEntry" <Entry x:Name="_plusAddressedEmailEntry"
Text="{Binding PlusAddressedEmail}" Text="{Binding PlusAddressedEmail}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="PlusAddressedEmailEntry" />
<Label IsVisible="{Binding ShowUsernameEmailType}" <Label IsVisible="{Binding ShowUsernameEmailType}"
Text="{u:I18n EmailType}" Text="{u:I18n EmailType}"
StyleClass="box-label" StyleClass="box-label"
@@ -203,7 +213,8 @@
<Entry <Entry
x:Name="_catchAllEmailDomainNameEntry" x:Name="_catchAllEmailDomainNameEntry"
Text="{Binding CatchAllEmailDomain}" Text="{Binding CatchAllEmailDomain}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="CatchAllEmailDomainEntry" />
<Label IsVisible="{Binding ShowUsernameEmailType}" <Label IsVisible="{Binding ShowUsernameEmailType}"
Text="{u:I18n EmailType}" Text="{u:I18n EmailType}"
StyleClass="box-label" StyleClass="box-label"
@@ -236,26 +247,27 @@
ItemsSource="{Binding ForwardedEmailServiceTypeOptions, Mode=OneTime}" ItemsSource="{Binding ForwardedEmailServiceTypeOptions, Mode=OneTime}"
SelectedItem="{Binding ForwardedEmailServiceSelected}" SelectedItem="{Binding ForwardedEmailServiceSelected}"
ItemDisplayBinding="{Binding ., Converter={StaticResource localizableEnum}}" ItemDisplayBinding="{Binding ., Converter={StaticResource localizableEnum}}"
StyleClass="box-value" /> StyleClass="box-value"
<!--ANONADDY OPTIONS--> AutomationId="ServiceTypePicker" />
<Grid IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.AnonAddy}}" <Grid
Grid.RowDefinitions="Auto,*" Grid.RowDefinitions="Auto,*"
Grid.ColumnDefinitions="*,Auto"> Grid.ColumnDefinitions="*,Auto">
<Label <Label
Margin="0,10,0,0" Margin="0,10,0,0"
Text="{u:I18n APIAccessToken}" Text="{Binding ForwardedEmailApiSecretLabel}"
StyleClass="box-label"/> StyleClass="box-label"/>
<Entry <Entry
x:Name="_anonAddyApiAccessTokenEntry" Text="{Binding ForwardedEmailApiSecret}"
Text="{Binding AnonAddyApiAccessToken}" IsPassword="{Binding ShowForwardedEmailApiSecret, Converter={StaticResource inverseBool}}"
IsPassword="{Binding ShowAnonAddyApiAccessToken, Converter={StaticResource inverseBool}}" Grid.Row="1"
Grid.Row="1"/> AutomationId="ForwardedEmailApiSecretEntry" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowAnonAddyApiAccessToken, Converter={StaticResource inverseBool, iconGlyphConverter}, ConverterParameter={x:Static u:BooleanGlyphType.Eye}}" Text="{Binding ShowForwardedEmailApiSecret, Converter={StaticResource inverseBool, iconGlyphConverter}, ConverterParameter={x:Static u:BooleanGlyphType.Eye}}"
Command="{Binding ToggleForwardedEmailHiddenValueCommand}" Command="{Binding ToggleForwardedEmailHiddenValueCommand}"
Grid.Row="1" Grid.Row="1"
Grid.Column="1"/> Grid.Column="1"
AutomationId="ShowForwardedEmailApiSecretButton" />
</Grid> </Grid>
<Label IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.AnonAddy}}" <Label IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.AnonAddy}}"
Text="{u:I18n DomainNameRequiredParenthesis}" Text="{u:I18n DomainNameRequiredParenthesis}"
@@ -264,91 +276,8 @@
<Entry IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.AnonAddy}}" <Entry IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.AnonAddy}}"
x:Name="_anonAddyDomainNameEntry" x:Name="_anonAddyDomainNameEntry"
Text="{Binding AnonAddyDomainName}" Text="{Binding AnonAddyDomainName}"
StyleClass="box-value"/> StyleClass="box-value"
<!--FIREFOX RELAY OPTIONS--> AutomationId="AnonAddyDomainNameEntry" />
<Grid StyleClass="box-row, box-row-input"
IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.FirefoxRelay}}"
Grid.RowDefinitions="Auto,*"
Grid.ColumnDefinitions="*,Auto">
<Label
Text="{u:I18n APIAccessToken}"
StyleClass="box-label"/>
<Entry
x:Name="_firefoxRelayApiAccessTokenEntry"
Text="{Binding FirefoxRelayApiAccessToken}"
StyleClass="box-value"
Grid.Row="1"
IsPassword="{Binding ShowFirefoxRelayApiAccessToken, Converter={StaticResource inverseBool}}"/>
<controls:IconButton
StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowFirefoxRelayApiAccessToken, Converter={StaticResource inverseBool, iconGlyphConverter}, ConverterParameter={x:Static u:BooleanGlyphType.Eye}}"
Command="{Binding ToggleForwardedEmailHiddenValueCommand}"
Grid.Row="1"
Grid.Column="1"/>
</Grid>
<!--SIMPLELOGIN OPTIONS-->
<Grid StyleClass="box-row, box-row-input"
IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.SimpleLogin}}"
Grid.RowDefinitions="Auto,*"
Grid.ColumnDefinitions="*,Auto">
<Label
Text="{u:I18n APIKeyRequiredParenthesis}"
StyleClass="box-label"/>
<Entry
x:Name="_simpleLoginApiKeyEntry"
Text="{Binding SimpleLoginApiKey}"
StyleClass="box-value"
Grid.Row="1"
IsPassword="{Binding ShowSimpleLoginApiKey, Converter={StaticResource inverseBool}}"/>
<controls:IconButton
StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowSimpleLoginApiKey, Converter={StaticResource inverseBool, iconGlyphConverter}, ConverterParameter={x:Static u:BooleanGlyphType.Eye}}"
Command="{Binding ToggleForwardedEmailHiddenValueCommand}"
Grid.Row="1"
Grid.Column="1"/>
</Grid>
<!--DUCKDUCKGO OPTIONS-->
<Grid StyleClass="box-row, box-row-input"
IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.DuckDuckGo}}"
Grid.RowDefinitions="Auto,*"
Grid.ColumnDefinitions="*,Auto">
<Label
Text="{u:I18n APIKeyRequiredParenthesis}"
StyleClass="box-label"/>
<Entry
x:Name="_duckDuckGoApiAccessTokenEntry"
Text="{Binding DuckDuckGoApiKey}"
StyleClass="box-value"
Grid.Row="1"
IsPassword="{Binding ShowDuckDuckGoApiKey, Converter={StaticResource inverseBool}}"/>
<controls:IconButton
StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowDuckDuckGoApiKey, Converter={StaticResource inverseBool, iconGlyphConverter}, ConverterParameter={x:Static u:BooleanGlyphType.Eye}}"
Command="{Binding ToggleForwardedEmailHiddenValueCommand}"
Grid.Row="1"
Grid.Column="1"/>
</Grid>
<!--FASTMAIL OPTIONS-->
<Grid StyleClass="box-row, box-row-input"
IsVisible="{Binding ForwardedEmailServiceSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:ForwardedEmailServiceType.Fastmail}}"
Grid.RowDefinitions="Auto,*"
Grid.ColumnDefinitions="*,Auto">
<Label
Text="{u:I18n APIKeyRequiredParenthesis}"
StyleClass="box-label"/>
<Entry
x:Name="_fastmailApiAccessTokenEntry"
Text="{Binding FastmailApiKey}"
StyleClass="box-value"
Grid.Row="1"
IsPassword="{Binding ShowFastmailApiKey, Converter={StaticResource inverseBool}}"/>
<controls:IconButton
StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowFastmailApiKey, Converter={StaticResource iconGlyphConverter}, ConverterParameter={x:Static u:BooleanGlyphType.Eye}}"
Command="{Binding ToggleForwardedEmailHiddenValueCommand}"
Grid.Row="1"
Grid.Column="1"/>
</Grid>
</StackLayout> </StackLayout>
<!--RANDOM WORD OPTIONS--> <!--RANDOM WORD OPTIONS-->
<Grid IsVisible="{Binding UsernameTypeSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:UsernameType.RandomWord}}"> <Grid IsVisible="{Binding UsernameTypeSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:UsernameType.RandomWord}}">
@@ -359,7 +288,8 @@
<Switch <Switch
IsToggled="{Binding CapitalizeRandomWordUsername}" IsToggled="{Binding CapitalizeRandomWordUsername}"
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" /> HorizontalOptions="End"
AutomationId="CapitalizeRandomWordUsernameToggle" />
</Grid> </Grid>
<BoxView IsVisible="{Binding UsernameTypeSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:UsernameType.RandomWord}}" <BoxView IsVisible="{Binding UsernameTypeSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:UsernameType.RandomWord}}"
StyleClass="box-row-separator" /> StyleClass="box-row-separator" />
@@ -371,7 +301,8 @@
<Switch <Switch
IsToggled="{Binding IncludeNumberRandomWordUsername}" IsToggled="{Binding IncludeNumberRandomWordUsername}"
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" /> HorizontalOptions="End"
AutomationId="IncludeNumberRandomWordUsernameToggle" />
</Grid> </Grid>
<BoxView IsVisible="{Binding UsernameTypeSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:UsernameType.RandomWord}}" <BoxView IsVisible="{Binding UsernameTypeSelected, Converter={StaticResource enumToBool}, ConverterParameter={x:Static enums:UsernameType.RandomWord}}"
StyleClass="box-row-separator" /> StyleClass="box-row-separator" />
@@ -386,7 +317,8 @@
x:Name="_passwordTypePicker" x:Name="_passwordTypePicker"
ItemsSource="{Binding PasswordTypeOptions, Mode=OneTime}" ItemsSource="{Binding PasswordTypeOptions, Mode=OneTime}"
SelectedIndex="{Binding PasswordTypeSelectedIndex}" SelectedIndex="{Binding PasswordTypeSelectedIndex}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="PasswordTypePicker" />
</StackLayout> </StackLayout>
<StackLayout Spacing="0" <StackLayout Spacing="0"
Padding="0" Padding="0"
@@ -403,12 +335,14 @@
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
HorizontalTextAlignment="End" HorizontalTextAlignment="End"
VerticalOptions="FillAndExpand" VerticalOptions="FillAndExpand"
VerticalTextAlignment="Center" /> VerticalTextAlignment="Center"
AutomationId="NumberOfWordsLabel" />
<controls:ExtendedStepper <controls:ExtendedStepper
Value="{Binding NumWords}" Value="{Binding NumWords}"
Maximum="20" Maximum="20"
Minimum="3" Minimum="3"
Increment="1" /> Increment="1"
AutomationId="NumberOfWordsStepper" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
@@ -419,7 +353,8 @@
Text="{Binding WordSeparator}" Text="{Binding WordSeparator}"
IsSpellCheckEnabled="False" IsSpellCheckEnabled="False"
IsTextPredictionEnabled="False" IsTextPredictionEnabled="False"
StyleClass="box-value"> StyleClass="box-value"
AutomationId="WordSeparatorEntry">
<Entry.Effects> <Entry.Effects>
<effects:NoEmojiKeyboardEffect /> <effects:NoEmojiKeyboardEffect />
</Entry.Effects> </Entry.Effects>
@@ -435,7 +370,8 @@
IsEnabled="{Binding EnforcedPolicyOptions.Capitalize, IsEnabled="{Binding EnforcedPolicyOptions.Capitalize,
Converter={StaticResource inverseBool}}" Converter={StaticResource inverseBool}}"
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" /> HorizontalOptions="End"
AutomationId="CapitalizePassphraseToggle" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
<StackLayout StyleClass="box-row, box-row-switch"> <StackLayout StyleClass="box-row, box-row-switch">
@@ -448,7 +384,8 @@
IsEnabled="{Binding EnforcedPolicyOptions.IncludeNumber, IsEnabled="{Binding EnforcedPolicyOptions.IncludeNumber,
Converter={StaticResource inverseBool}}" Converter={StaticResource inverseBool}}"
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" /> HorizontalOptions="End"
AutomationId="IncludeNumbersToggle" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
<StackLayout Spacing="0" Padding="0" IsVisible="{Binding IsPassword}"> <StackLayout Spacing="0" Padding="0" IsVisible="{Binding IsPassword}">
@@ -462,7 +399,8 @@
StyleClass="box-sub-label" StyleClass="box-sub-label"
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
HorizontalTextAlignment="End" HorizontalTextAlignment="End"
WidthRequest="50" /> WidthRequest="50"
AutomationId="PasswordLengthLabel" />
<controls:ExtendedSlider <controls:ExtendedSlider
DragCompleted="LengthSlider_DragCompleted" DragCompleted="LengthSlider_DragCompleted"
Value="{Binding Length}" Value="{Binding Length}"
@@ -471,7 +409,8 @@
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
Maximum="128" Maximum="128"
Minimum="5" /> Minimum="5"
AutomationId="PasswordLengthSlider" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
<StackLayout StyleClass="box-row, box-row-switch"> <StackLayout StyleClass="box-row, box-row-switch">
@@ -488,7 +427,8 @@
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" HorizontalOptions="End"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n UppercaseAtoZ}"/> AutomationProperties.Name="{u:I18n UppercaseAtoZ}"
AutomationId="UppercaseAtoZToggle" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
<StackLayout StyleClass="box-row, box-row-switch"> <StackLayout StyleClass="box-row, box-row-switch">
@@ -505,7 +445,8 @@
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" HorizontalOptions="End"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n LowercaseAtoZ}"/> AutomationProperties.Name="{u:I18n LowercaseAtoZ}"
AutomationId="LowercaseAtoZToggle" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
<StackLayout StyleClass="box-row, box-row-switch"> <StackLayout StyleClass="box-row, box-row-switch">
@@ -522,7 +463,8 @@
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" HorizontalOptions="End"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n NumbersZeroToNine}"/> AutomationProperties.Name="{u:I18n NumbersZeroToNine}"
AutomationId="NumbersZeroToNineToggle" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
<StackLayout StyleClass="box-row, box-row-switch"> <StackLayout StyleClass="box-row, box-row-switch">
@@ -539,7 +481,8 @@
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" HorizontalOptions="End"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n SpecialCharacters}"/> AutomationProperties.Name="{u:I18n SpecialCharacters}"
AutomationId="SpecialCharactersToggle" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
<StackLayout StyleClass="box-row, box-row-stepper"> <StackLayout StyleClass="box-row, box-row-stepper">
@@ -554,12 +497,14 @@
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
HorizontalTextAlignment="End" HorizontalTextAlignment="End"
VerticalOptions="FillAndExpand" VerticalOptions="FillAndExpand"
VerticalTextAlignment="Center" /> VerticalTextAlignment="Center"
AutomationId="MinNumberValueLabel" />
<controls:ExtendedStepper <controls:ExtendedStepper
Value="{Binding MinNumber}" Value="{Binding MinNumber}"
Maximum="5" Maximum="5"
Minimum="0" Minimum="0"
Increment="1" /> Increment="1"
AutomationId="MinNumberStepper" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
<StackLayout StyleClass="box-row, box-row-stepper"> <StackLayout StyleClass="box-row, box-row-stepper">
@@ -574,12 +519,14 @@
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
HorizontalTextAlignment="End" HorizontalTextAlignment="End"
VerticalOptions="FillAndExpand" VerticalOptions="FillAndExpand"
VerticalTextAlignment="Center" /> VerticalTextAlignment="Center"
AutomationId="MinSpecialValueLabel" />
<controls:ExtendedStepper <controls:ExtendedStepper
Value="{Binding MinSpecial}" Value="{Binding MinSpecial}"
Maximum="5" Maximum="5"
Minimum="0" Minimum="0"
Increment="1" /> Increment="1"
AutomationId="MinSpecialStepper" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
<StackLayout StyleClass="box-row, box-row-switch"> <StackLayout StyleClass="box-row, box-row-switch">
@@ -590,7 +537,8 @@
<Switch <Switch
IsToggled="{Binding AvoidAmbiguousChars}" IsToggled="{Binding AvoidAmbiguousChars}"
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" /> HorizontalOptions="End"
AutomationId="AvoidAmbiguousCharsToggle" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
</StackLayout> </StackLayout>

View File

@@ -8,6 +8,7 @@ using Bit.App.Utilities;
using Bit.Core; using Bit.Core;
using Bit.Core.Abstractions; using Bit.Core.Abstractions;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Exceptions;
using Bit.Core.Models.Domain; using Bit.Core.Models.Domain;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Xamarin.CommunityToolkit.ObjectModel; using Xamarin.CommunityToolkit.ObjectModel;
@@ -23,7 +24,7 @@ namespace Bit.App.Pages
private readonly IUsernameGenerationService _usernameGenerationService; private readonly IUsernameGenerationService _usernameGenerationService;
private readonly ITokenService _tokenService; private readonly ITokenService _tokenService;
private readonly IDeviceActionService _deviceActionService; private readonly IDeviceActionService _deviceActionService;
readonly LazyResolve<ILogger> _logger = new LazyResolve<ILogger>("logger"); readonly LazyResolve<ILogger> _logger = new LazyResolve<ILogger>();
private PasswordGenerationOptions _options; private PasswordGenerationOptions _options;
private UsernameGenerationOptions _usernameOptions; private UsernameGenerationOptions _usernameOptions;
@@ -49,11 +50,7 @@ namespace Bit.App.Pages
private bool _doneIniting; private bool _doneIniting;
private bool _showTypePicker; private bool _showTypePicker;
private string _emailWebsite; private string _emailWebsite;
private bool _showFirefoxRelayApiAccessToken; private bool _showForwardedEmailApiSecret;
private bool _showAnonAddyApiAccessToken;
private bool _showSimpleLoginApiKey;
private bool _showDuckDuckGoApiKey;
private bool _showFastmailApiKey;
private bool _editMode; private bool _editMode;
public GeneratorPageViewModel() public GeneratorPageViewModel()
@@ -96,7 +93,7 @@ namespace Bit.App.Pages
UsernameTypePromptHelpCommand = new Command(UsernameTypePromptHelp); UsernameTypePromptHelpCommand = new Command(UsernameTypePromptHelp);
RegenerateCommand = new AsyncCommand(RegenerateAsync, onException: ex => OnSubmitException(ex), allowsMultipleExecutions: false); RegenerateCommand = new AsyncCommand(RegenerateAsync, onException: ex => OnSubmitException(ex), allowsMultipleExecutions: false);
RegenerateUsernameCommand = new AsyncCommand(RegenerateUsernameAsync, onException: ex => OnSubmitException(ex), allowsMultipleExecutions: false); RegenerateUsernameCommand = new AsyncCommand(RegenerateUsernameAsync, onException: ex => OnSubmitException(ex), allowsMultipleExecutions: false);
ToggleForwardedEmailHiddenValueCommand = new AsyncCommand(ToggleForwardedEmailHiddenValueAsync, onException: ex => _logger.Value.Exception(ex), allowsMultipleExecutions: false); ToggleForwardedEmailHiddenValueCommand = new Command(() => ShowForwardedEmailApiSecret = !ShowForwardedEmailApiSecret);
CopyCommand = new AsyncCommand(CopyAsync, onException: ex => _logger.Value.Exception(ex), allowsMultipleExecutions: false); CopyCommand = new AsyncCommand(CopyAsync, onException: ex => _logger.Value.Exception(ex), allowsMultipleExecutions: false);
CloseCommand = new AsyncCommand(CloseAsync, onException: ex => _logger.Value.Exception(ex), allowsMultipleExecutions: false); CloseCommand = new AsyncCommand(CloseAsync, onException: ex => _logger.Value.Exception(ex), allowsMultipleExecutions: false);
} }
@@ -415,7 +412,6 @@ namespace Bit.App.Pages
public string UsernameTypeDescriptionLabel => GetUsernameTypeLabelDescription(UsernameTypeSelected); public string UsernameTypeDescriptionLabel => GetUsernameTypeLabelDescription(UsernameTypeSelected);
public ForwardedEmailServiceType ForwardedEmailServiceSelected public ForwardedEmailServiceType ForwardedEmailServiceSelected
{ {
get => _usernameOptions.ServiceType; get => _usernameOptions.ServiceType;
@@ -425,7 +421,11 @@ namespace Bit.App.Pages
{ {
_usernameOptions.ServiceType = value; _usernameOptions.ServiceType = value;
Username = Constants.DefaultUsernameGenerated; Username = Constants.DefaultUsernameGenerated;
TriggerPropertyChanged(nameof(ForwardedEmailServiceSelected)); TriggerPropertyChanged(nameof(ForwardedEmailServiceSelected), new string[]
{
nameof(ForwardedEmailApiSecret),
nameof(ForwardedEmailApiSecretLabel)
});
SaveUsernameOptionsAsync(false).FireAndForget(); SaveUsernameOptionsAsync(false).FireAndForget();
} }
} }
@@ -445,27 +445,104 @@ namespace Bit.App.Pages
} }
} }
public string AnonAddyApiAccessToken public string ForwardedEmailApiSecret
{ {
get => _usernameOptions.AnonAddyApiAccessToken; get
{
switch (ForwardedEmailServiceSelected)
{
case ForwardedEmailServiceType.AnonAddy:
return _usernameOptions.AnonAddyApiAccessToken;
case ForwardedEmailServiceType.DuckDuckGo:
return _usernameOptions.DuckDuckGoApiKey;
case ForwardedEmailServiceType.Fastmail:
return _usernameOptions.FastMailApiKey;
case ForwardedEmailServiceType.FirefoxRelay:
return _usernameOptions.FirefoxRelayApiAccessToken;
case ForwardedEmailServiceType.SimpleLogin:
return _usernameOptions.SimpleLoginApiKey;
default:
return null;
}
}
set set
{ {
if (_usernameOptions.AnonAddyApiAccessToken != value) bool changed = false;
switch (ForwardedEmailServiceSelected)
{ {
_usernameOptions.AnonAddyApiAccessToken = value; case ForwardedEmailServiceType.AnonAddy:
TriggerPropertyChanged(nameof(AnonAddyApiAccessToken)); if (_usernameOptions.AnonAddyApiAccessToken != value)
{
_usernameOptions.AnonAddyApiAccessToken = value;
changed = true;
}
break;
case ForwardedEmailServiceType.DuckDuckGo:
if (_usernameOptions.DuckDuckGoApiKey != value)
{
_usernameOptions.DuckDuckGoApiKey = value;
changed = true;
}
break;
case ForwardedEmailServiceType.Fastmail:
if (_usernameOptions.FastMailApiKey != value)
{
_usernameOptions.FastMailApiKey = value;
changed = true;
}
break;
case ForwardedEmailServiceType.FirefoxRelay:
if (_usernameOptions.FirefoxRelayApiAccessToken != value)
{
_usernameOptions.FirefoxRelayApiAccessToken = value;
changed = true;
}
break;
case ForwardedEmailServiceType.SimpleLogin:
if (_usernameOptions.SimpleLoginApiKey != value)
{
_usernameOptions.SimpleLoginApiKey = value;
changed = true;
}
break;
default:
break;
}
if (changed)
{
TriggerPropertyChanged(nameof(ForwardedEmailApiSecret));
SaveUsernameOptionsAsync(false).FireAndForget(); SaveUsernameOptionsAsync(false).FireAndForget();
} }
} }
} }
public bool ShowAnonAddyApiAccessToken public string ForwardedEmailApiSecretLabel
{ {
get get
{ {
return _showAnonAddyApiAccessToken; switch (ForwardedEmailServiceSelected)
{
case ForwardedEmailServiceType.AnonAddy:
case ForwardedEmailServiceType.FirefoxRelay:
return AppResources.APIAccessToken;
case ForwardedEmailServiceType.DuckDuckGo:
case ForwardedEmailServiceType.Fastmail:
case ForwardedEmailServiceType.SimpleLogin:
return AppResources.APIKeyRequiredParenthesis;
default:
return null;
}
} }
set => SetProperty(ref _showAnonAddyApiAccessToken, value); }
public bool ShowForwardedEmailApiSecret
{
get
{
return _showForwardedEmailApiSecret;
}
set => SetProperty(ref _showForwardedEmailApiSecret, value);
} }
public string AnonAddyDomainName public string AnonAddyDomainName
@@ -482,99 +559,6 @@ namespace Bit.App.Pages
} }
} }
public string FirefoxRelayApiAccessToken
{
get => _usernameOptions.FirefoxRelayApiAccessToken;
set
{
if (_usernameOptions.FirefoxRelayApiAccessToken != value)
{
_usernameOptions.FirefoxRelayApiAccessToken = value;
TriggerPropertyChanged(nameof(FirefoxRelayApiAccessToken));
SaveUsernameOptionsAsync(false).FireAndForget();
}
}
}
public bool ShowFirefoxRelayApiAccessToken
{
get
{
return _showFirefoxRelayApiAccessToken;
}
set => SetProperty(ref _showFirefoxRelayApiAccessToken, value);
}
public string SimpleLoginApiKey
{
get => _usernameOptions.SimpleLoginApiKey;
set
{
if (_usernameOptions.SimpleLoginApiKey != value)
{
_usernameOptions.SimpleLoginApiKey = value;
TriggerPropertyChanged(nameof(SimpleLoginApiKey));
SaveUsernameOptionsAsync(false).FireAndForget();
}
}
}
public bool ShowSimpleLoginApiKey
{
get
{
return _showSimpleLoginApiKey;
}
set => SetProperty(ref _showSimpleLoginApiKey, value);
}
public string DuckDuckGoApiKey
{
get => _usernameOptions.DuckDuckGoApiKey;
set
{
if (_usernameOptions.DuckDuckGoApiKey != value)
{
_usernameOptions.DuckDuckGoApiKey = value;
TriggerPropertyChanged(nameof(DuckDuckGoApiKey));
SaveUsernameOptionsAsync(false).FireAndForget();
}
}
}
public bool ShowDuckDuckGoApiKey
{
get
{
return _showDuckDuckGoApiKey;
}
set => SetProperty(ref _showDuckDuckGoApiKey, value);
}
public string FastmailApiKey
{
get => _usernameOptions.FastMailApiKey;
set
{
if (_usernameOptions.FastMailApiKey != value)
{
_usernameOptions.FastMailApiKey = value;
TriggerPropertyChanged(nameof(FastmailApiKey));
SaveUsernameOptionsAsync(false).FireAndForget();
}
}
}
public bool ShowFastmailApiKey
{
get
{
return _showFastmailApiKey;
}
set => SetProperty(ref _showFastmailApiKey, value);
}
public bool CapitalizeRandomWordUsername public bool CapitalizeRandomWordUsername
{ {
get => _usernameOptions.CapitalizeRandomWordUsername; get => _usernameOptions.CapitalizeRandomWordUsername;
@@ -807,12 +791,9 @@ namespace Bit.App.Pages
TriggerPropertyChanged(nameof(PlusAddressedEmailTypeSelected)); TriggerPropertyChanged(nameof(PlusAddressedEmailTypeSelected));
TriggerPropertyChanged(nameof(IncludeNumberRandomWordUsername)); TriggerPropertyChanged(nameof(IncludeNumberRandomWordUsername));
TriggerPropertyChanged(nameof(CapitalizeRandomWordUsername)); TriggerPropertyChanged(nameof(CapitalizeRandomWordUsername));
TriggerPropertyChanged(nameof(SimpleLoginApiKey)); TriggerPropertyChanged(nameof(ForwardedEmailApiSecret));
TriggerPropertyChanged(nameof(FirefoxRelayApiAccessToken)); TriggerPropertyChanged(nameof(ForwardedEmailApiSecretLabel));
TriggerPropertyChanged(nameof(AnonAddyDomainName)); TriggerPropertyChanged(nameof(AnonAddyDomainName));
TriggerPropertyChanged(nameof(AnonAddyApiAccessToken));
TriggerPropertyChanged(nameof(DuckDuckGoApiKey));
TriggerPropertyChanged(nameof(FastmailApiKey));
TriggerPropertyChanged(nameof(CatchAllEmailDomain)); TriggerPropertyChanged(nameof(CatchAllEmailDomain));
TriggerPropertyChanged(nameof(ForwardedEmailServiceSelected)); TriggerPropertyChanged(nameof(ForwardedEmailServiceSelected));
TriggerPropertyChanged(nameof(UsernameTypeSelected)); TriggerPropertyChanged(nameof(UsernameTypeSelected));
@@ -845,15 +826,23 @@ namespace Bit.App.Pages
{ {
_logger.Value.Exception(ex); _logger.Value.Exception(ex);
string message = AppResources.GenericErrorMessage;
if (IsUsername && UsernameTypeSelected == UsernameType.ForwardedEmailAlias) if (IsUsername && UsernameTypeSelected == UsernameType.ForwardedEmailAlias)
{ {
await Device.InvokeOnMainThreadAsync(() => Page.DisplayAlert( if (ex is ForwardedEmailInvalidSecretException)
AppResources.AnErrorHasOccurred, string.Format(AppResources.UnknownXErrorMessage, ForwardedEmailServiceSelected), AppResources.Ok)); {
} message = ForwardedEmailServiceSelected == ForwardedEmailServiceType.AnonAddy || ForwardedEmailServiceSelected == ForwardedEmailServiceType.FirefoxRelay
else ? AppResources.InvalidAPIToken
{ : AppResources.InvalidAPIKey;
await Device.InvokeOnMainThreadAsync(() => Page.DisplayAlert(AppResources.AnErrorHasOccurred, AppResources.GenericErrorMessage, AppResources.Ok)); }
else
{
message = string.Format(AppResources.UnknownXErrorMessage, ForwardedEmailServiceSelected);
}
} }
await Device.InvokeOnMainThreadAsync(() => Page.DisplayAlert(AppResources.AnErrorHasOccurred, message, AppResources.Ok));
} }
private string GetUsernameTypeLabelDescription(UsernameType value) private string GetUsernameTypeLabelDescription(UsernameType value)
@@ -870,27 +859,5 @@ namespace Bit.App.Pages
return string.Empty; return string.Empty;
} }
} }
private async Task ToggleForwardedEmailHiddenValueAsync()
{
switch (ForwardedEmailServiceSelected)
{
case ForwardedEmailServiceType.AnonAddy:
ShowAnonAddyApiAccessToken = !ShowAnonAddyApiAccessToken;
break;
case ForwardedEmailServiceType.FirefoxRelay:
ShowFirefoxRelayApiAccessToken = !ShowFirefoxRelayApiAccessToken;
break;
case ForwardedEmailServiceType.SimpleLogin:
ShowSimpleLoginApiKey = !ShowSimpleLoginApiKey;
break;
case ForwardedEmailServiceType.DuckDuckGo:
ShowDuckDuckGoApiKey = !ShowDuckDuckGoApiKey;
break;
case ForwardedEmailServiceType.Fastmail:
ShowFastmailApiKey = !ShowFastmailApiKey;
break;
}
}
} }
} }

View File

@@ -71,7 +71,8 @@
<Label <Label
Text="{u:I18n SendDisabledWarning}" Text="{u:I18n SendDisabledWarning}"
StyleClass="text-muted, text-sm, text-bold" StyleClass="text-muted, text-sm, text-bold"
HorizontalTextAlignment="Center" /> HorizontalTextAlignment="Center"
AutomationId="SendDisabledWarningMessageLabel" />
</Frame> </Frame>
<Frame <Frame
IsVisible="{Binding SendOptionsPolicyInEffect}" IsVisible="{Binding SendOptionsPolicyInEffect}"
@@ -83,7 +84,8 @@
<Label <Label
Text="{u:I18n SendOptionsPolicyInEffect}" Text="{u:I18n SendOptionsPolicyInEffect}"
StyleClass="text-muted, text-sm, text-bold" StyleClass="text-muted, text-sm, text-bold"
HorizontalTextAlignment="Center" /> HorizontalTextAlignment="Center"
AutomationId="SendOptionsPolicyInEffectLabel" />
</Frame> </Frame>
<StackLayout StyleClass="box-row"> <StackLayout StyleClass="box-row">
<Label <Label
@@ -93,7 +95,8 @@
x:Name="_nameEntry" x:Name="_nameEntry"
Text="{Binding Send.Name}" Text="{Binding Send.Name}"
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="SendNameEntry" />
<Label <Label
Text="{u:I18n NameInfo}" Text="{u:I18n NameInfo}"
StyleClass="box-footer-label" StyleClass="box-footer-label"
@@ -123,6 +126,7 @@
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n File}" AutomationProperties.Name="{u:I18n File}"
AutomationProperties.HelpText="{Binding FileTypeAccessibilityLabel}" AutomationProperties.HelpText="{Binding FileTypeAccessibilityLabel}"
AutomationId="SendFileButton"
Grid.Column="0"> Grid.Column="0">
</Button> </Button>
<Button <Button
@@ -135,6 +139,7 @@
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Text}" AutomationProperties.Name="{u:I18n Text}"
AutomationProperties.HelpText="{Binding TextTypeAccessibilityLabel}" AutomationProperties.HelpText="{Binding TextTypeAccessibilityLabel}"
AutomationId="SendTextButton"
Grid.Column="1"> Grid.Column="1">
</Button> </Button>
</Grid> </Grid>
@@ -152,12 +157,14 @@
Text="{Binding Send.File.FileName, Mode=OneWay}" Text="{Binding Send.File.FileName, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
VerticalTextAlignment="Center" VerticalTextAlignment="Center"
HorizontalOptions="StartAndExpand" /> HorizontalOptions="StartAndExpand"
AutomationId="SendFileNameLabel" />
<Label <Label
Text="{Binding Send.File.SizeName, Mode=OneWay}" Text="{Binding Send.File.SizeName, Mode=OneWay}"
StyleClass="box-sub-label" StyleClass="box-sub-label"
HorizontalTextAlignment="End" HorizontalTextAlignment="End"
VerticalTextAlignment="Center" /> VerticalTextAlignment="Center"
AutomationId="SendFileSizeLabel" />
</StackLayout> </StackLayout>
<StackLayout <StackLayout
IsVisible="{Binding EditMode, Converter={StaticResource inverseBool}}" IsVisible="{Binding EditMode, Converter={StaticResource inverseBool}}"
@@ -168,20 +175,23 @@
LineBreakMode="CharacterWrap" LineBreakMode="CharacterWrap"
StyleClass="text-sm, text-muted" StyleClass="text-sm, text-muted"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
HorizontalTextAlignment="Center" /> HorizontalTextAlignment="Center"
AutomationId="SendNoFileChosenLabel" />
<Label <Label
IsVisible="{Binding FileName, Converter={StaticResource notNull}}" IsVisible="{Binding FileName, Converter={StaticResource notNull}}"
Text="{Binding FileName}" Text="{Binding FileName}"
LineBreakMode="CharacterWrap" LineBreakMode="CharacterWrap"
StyleClass="text-sm, text-muted" StyleClass="text-sm, text-muted"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
HorizontalTextAlignment="Center" /> HorizontalTextAlignment="Center"
AutomationId="SendCurrentFileNameLabel" />
<Button <Button
Text="{u:I18n ChooseFile}" Text="{u:I18n ChooseFile}"
IsVisible="{Binding IsAddFromShare, Converter={StaticResource inverseBool}}" IsVisible="{Binding IsAddFromShare, Converter={StaticResource inverseBool}}"
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
StyleClass="box-button-row" StyleClass="box-button-row"
Clicked="ChooseFile_Clicked" /> Clicked="ChooseFile_Clicked"
AutomationId="SendChooseFileButton" />
<Label <Label
Margin="0, 5, 0, 0" Margin="0, 5, 0, 0"
Text="{u:I18n MaxFileSize}" Text="{u:I18n MaxFileSize}"
@@ -207,7 +217,8 @@
Text="{Binding Send.Text.Text}" Text="{Binding Send.Text.Text}"
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
StyleClass="box-value" StyleClass="box-value"
Margin="{Binding EditorMargins}" Margin="{Binding EditorMargins}"
AutomationId="SendTextContentEntry"
effects:ScrollEnabledEffect.IsScrollEnabled="false" > effects:ScrollEnabledEffect.IsScrollEnabled="false" >
<Editor.Behaviors> <Editor.Behaviors>
<behaviors:EditorPreventAutoBottomScrollingOnFocusedBehavior ParentScrollView="{x:Reference _scrollView}" /> <behaviors:EditorPreventAutoBottomScrollingOnFocusedBehavior ParentScrollView="{x:Reference _scrollView}" />
@@ -235,7 +246,8 @@
IsToggled="{Binding Send.Text.Hidden}" IsToggled="{Binding Send.Text.Hidden}"
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
HorizontalOptions="End" HorizontalOptions="End"
Margin="10,0,0,0" /> Margin="10,0,0,0"
AutomationId="SendHideTextByDefaultToggle" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
<StackLayout <StackLayout
@@ -249,7 +261,8 @@
IsToggled="{Binding ShareOnSave}" IsToggled="{Binding ShareOnSave}"
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
HorizontalOptions="End" HorizontalOptions="End"
Margin="10,0,0,0" /> Margin="10,0,0,0"
AutomationId="SendShareSendAfterSaveToggle" />
</StackLayout> </StackLayout>
<StackLayout <StackLayout
Orientation="Horizontal" Orientation="Horizontal"
@@ -263,21 +276,24 @@
StyleClass="box-row-button" StyleClass="box-row-button"
TextColor="{DynamicResource PrimaryColor}" TextColor="{DynamicResource PrimaryColor}"
Margin="0" Margin="0"
AutomationProperties.IsInAccessibleTree="False"/> AutomationProperties.IsInAccessibleTree="False"
AutomationId="SendShowHideOptionsButton" />
<controls:IconButton <controls:IconButton
x:Name="_btnOptionsUp" x:Name="_btnOptionsUp"
Text="{Binding Source={x:Static core:BitwardenIcons.ChevronUp}}" Text="{Binding Source={x:Static core:BitwardenIcons.ChevronUp}}"
StyleClass="box-row-button" StyleClass="box-row-button"
TextColor="{DynamicResource PrimaryColor}" TextColor="{DynamicResource PrimaryColor}"
IsVisible="{Binding ShowOptions}" IsVisible="{Binding ShowOptions}"
AutomationProperties.IsInAccessibleTree="False"/> AutomationProperties.IsInAccessibleTree="False"
AutomationId="SendOptionsDisplayed" />
<controls:IconButton <controls:IconButton
x:Name="_btnOptionsDown" x:Name="_btnOptionsDown"
Text="{Binding Source={x:Static core:BitwardenIcons.AngleDown}}" Text="{Binding Source={x:Static core:BitwardenIcons.AngleDown}}"
StyleClass="box-row-button" StyleClass="box-row-button"
TextColor="{DynamicResource PrimaryColor}" TextColor="{DynamicResource PrimaryColor}"
IsVisible="{Binding ShowOptions, Converter={StaticResource inverseBool}}" IsVisible="{Binding ShowOptions, Converter={StaticResource inverseBool}}"
AutomationProperties.IsInAccessibleTree="False"/> AutomationProperties.IsInAccessibleTree="False"
AutomationId="SendOptionsHidden" />
</StackLayout> </StackLayout>
<StackLayout IsVisible="{Binding ShowOptions}"> <StackLayout IsVisible="{Binding ShowOptions}">
<StackLayout <StackLayout
@@ -294,7 +310,8 @@
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n DeletionTime}" /> AutomationProperties.Name="{u:I18n DeletionTime}"
AutomationId="SendDeletionOptionsPicker" />
<Grid <Grid
IsVisible="{Binding ShowDeletionCustomPickers}" IsVisible="{Binding ShowDeletionCustomPickers}"
Margin="0,5,0,0"> Margin="0,5,0,0">
@@ -308,14 +325,16 @@
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n DeletionDate}" AutomationProperties.Name="{u:I18n DeletionDate}"
Grid.Column="0" /> Grid.Column="0"
AutomationId="SendCustomDeletionDatePicker" />
<controls:ExtendedTimePicker <controls:ExtendedTimePicker
NullableTime="{Binding DeletionDateTimeViewModel.Time, Mode=TwoWay}" NullableTime="{Binding DeletionDateTimeViewModel.Time, Mode=TwoWay}"
Format="t" Format="t"
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n DeletionTime}" AutomationProperties.Name="{u:I18n DeletionTime}"
Grid.Column="1" /> Grid.Column="1"
AutomationId="SendCustomDeletionTimePicker" />
</Grid> </Grid>
<Label <Label
Text="{u:I18n DeletionDateInfo}" Text="{u:I18n DeletionDateInfo}"
@@ -334,7 +353,8 @@
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ExpirationTime}" /> AutomationProperties.Name="{u:I18n ExpirationTime}"
AutomationId="SendExpirationOptionsPicker" />
<Grid <Grid
IsVisible="{Binding ShowExpirationCustomPickers}" IsVisible="{Binding ShowExpirationCustomPickers}"
Margin="0,5,0,0"> Margin="0,5,0,0">
@@ -349,7 +369,8 @@
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ExpirationDate}" AutomationProperties.Name="{u:I18n ExpirationDate}"
Grid.Column="0" /> Grid.Column="0"
AutomationId="SendCustomExpirationDatePicker" />
<controls:ExtendedTimePicker <controls:ExtendedTimePicker
NullableTime="{Binding ExpirationDateTimeViewModel.Time, Mode=TwoWay}" NullableTime="{Binding ExpirationDateTimeViewModel.Time, Mode=TwoWay}"
PlaceHolder="--:-- --" PlaceHolder="--:-- --"
@@ -357,7 +378,8 @@
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ExpirationTime}" AutomationProperties.Name="{u:I18n ExpirationTime}"
Grid.Column="1" /> Grid.Column="1"
AutomationId="SendCustomExpirationTimePicker" />
</Grid> </Grid>
<StackLayout <StackLayout
Orientation="Horizontal" Orientation="Horizontal"
@@ -374,7 +396,8 @@
FontSize="{Binding SegmentedButtonFontSize}" FontSize="{Binding SegmentedButtonFontSize}"
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
StyleClass="box-row-button" StyleClass="box-row-button"
Clicked="ClearExpirationDate_Clicked" /> Clicked="ClearExpirationDate_Clicked"
AutomationId="SendClearExpirationDateButton" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
<StackLayout <StackLayout
@@ -393,13 +416,15 @@
Keyboard="Numeric" Keyboard="Numeric"
MaxLength="9" MaxLength="9"
TextChanged="OnMaxAccessCountTextChanged" TextChanged="OnMaxAccessCountTextChanged"
HorizontalOptions="FillAndExpand" /> HorizontalOptions="FillAndExpand"
AutomationId="SendMaxAccessCountEntry" />
<controls:ExtendedStepper <controls:ExtendedStepper
x:Name="_maxAccessCountStepper" x:Name="_maxAccessCountStepper"
Value="{Binding MaxAccessCount}" Value="{Binding MaxAccessCount}"
Maximum="999999999" Maximum="999999999"
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
Margin="10,0,0,0" /> Margin="10,0,0,0"
AutomationId="SendMaxAccessCountStepper" />
</StackLayout> </StackLayout>
<Label <Label
Text="{u:I18n MaximumAccessCountInfo}" Text="{u:I18n MaximumAccessCountInfo}"
@@ -419,7 +444,8 @@
<Label <Label
Text="{Binding Send.AccessCount, Mode=OneWay}" Text="{Binding Send.AccessCount, Mode=OneWay}"
StyleClass="box-label" StyleClass="box-label"
VerticalTextAlignment="Center" /> VerticalTextAlignment="Center"
AutomationId="SendCurrentAccessCountLabel" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
<StackLayout <StackLayout
@@ -436,7 +462,8 @@
StyleClass="box-value" StyleClass="box-value"
IsSpellCheckEnabled="False" IsSpellCheckEnabled="False"
IsTextPredictionEnabled="False" IsTextPredictionEnabled="False"
HorizontalOptions="FillAndExpand" /> HorizontalOptions="FillAndExpand"
AutomationId="SendNewPasswordEntry" />
<controls:IconButton <controls:IconButton
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
@@ -445,7 +472,8 @@
Margin="10,0,0,0" Margin="10,0,0,0"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ToggleVisibility}" AutomationProperties.Name="{u:I18n ToggleVisibility}"
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}" /> AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
AutomationId="SendShowHidePasswordButton" />
</StackLayout> </StackLayout>
<Label <Label
Text="{u:I18n PasswordInfo}" Text="{u:I18n PasswordInfo}"
@@ -464,7 +492,8 @@
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
StyleClass="box-value" StyleClass="box-value"
Margin="{Binding EditorMargins}" Margin="{Binding EditorMargins}"
effects:ScrollEnabledEffect.IsScrollEnabled="false" > effects:ScrollEnabledEffect.IsScrollEnabled="false"
AutomationId="SendNotesEntry">
<Editor.Behaviors> <Editor.Behaviors>
<behaviors:EditorPreventAutoBottomScrollingOnFocusedBehavior ParentScrollView="{x:Reference _scrollView}" /> <behaviors:EditorPreventAutoBottomScrollingOnFocusedBehavior ParentScrollView="{x:Reference _scrollView}" />
</Editor.Behaviors> </Editor.Behaviors>
@@ -492,7 +521,8 @@
IsToggled="{Binding Send.HideEmail}" IsToggled="{Binding Send.HideEmail}"
IsEnabled="{Binding DisableHideEmailControl, Converter={StaticResource inverseBool}}" IsEnabled="{Binding DisableHideEmailControl, Converter={StaticResource inverseBool}}"
HorizontalOptions="End" HorizontalOptions="End"
Margin="10,0,0,0" /> Margin="10,0,0,0"
AutomationId="SendHideEmailSwitch" />
</StackLayout> </StackLayout>
<StackLayout <StackLayout
StyleClass="box-row, box-row-switch" StyleClass="box-row, box-row-switch"
@@ -506,7 +536,8 @@
IsToggled="{Binding Send.Disabled}" IsToggled="{Binding Send.Disabled}"
IsEnabled="{Binding SendEnabled}" IsEnabled="{Binding SendEnabled}"
HorizontalOptions="End" HorizontalOptions="End"
Margin="10,0,0,0" /> Margin="10,0,0,0"
AutomationId="SendDeactivateSwitch" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>

View File

@@ -25,7 +25,8 @@
Priority="-2" Priority="-2"
UseOriginalImage="True" UseOriginalImage="True"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Account}" /> AutomationProperties.Name="{u:I18n Account}"
AutomationId="AccountIconButton" />
<ToolbarItem Text="{u:I18n Cancel}" Clicked="Close_Clicked" Order="Primary" Priority="-1" x:Name="_closeItem" /> <ToolbarItem Text="{u:I18n Cancel}" Clicked="Close_Clicked" Order="Primary" Priority="-1" x:Name="_closeItem" />
<ToolbarItem Text="{u:I18n Save}" Clicked="Save_Clicked" Order="Primary" x:Name="_saveItem"/> <ToolbarItem Text="{u:I18n Save}" Clicked="Save_Clicked" Order="Primary" x:Name="_saveItem"/>
</ContentPage.ToolbarItems> </ContentPage.ToolbarItems>

View File

@@ -44,13 +44,15 @@
<controls:SendViewCell <controls:SendViewCell
Send="{Binding Send}" Send="{Binding Send}"
ButtonCommand="{Binding BindingContext.SendOptionsCommand, Source={x:Reference _page}}" ButtonCommand="{Binding BindingContext.SendOptionsCommand, Source={x:Reference _page}}"
ShowOptions="{Binding BindingContext.SendEnabled, Source={x:Reference _page}}" /> ShowOptions="{Binding BindingContext.SendEnabled, Source={x:Reference _page}}"
AutomationId="SendCell" />
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="sendGroupTemplate" <DataTemplate x:Key="sendGroupTemplate"
x:DataType="pages:SendGroupingsPageListItem"> x:DataType="pages:SendGroupingsPageListItem">
<controls:ExtendedStackLayout Orientation="Horizontal" <controls:ExtendedStackLayout Orientation="Horizontal"
StyleClass="list-row, list-row-platform"> StyleClass="list-row, list-row-platform"
AutomationId="{Binding AutomationId}">
<controls:IconLabel Text="{Binding Icon, Mode=OneWay}" <controls:IconLabel Text="{Binding Icon, Mode=OneWay}"
HorizontalOptions="Start" HorizontalOptions="Start"
VerticalOptions="Center" VerticalOptions="Center"
@@ -64,12 +66,14 @@
LineBreakMode="TailTruncation" LineBreakMode="TailTruncation"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
StyleClass="list-title" /> StyleClass="list-title"
AutomationId="SendFilterNameLabel" />
<Label Text="{Binding ItemCount, Mode=OneWay}" <Label Text="{Binding ItemCount, Mode=OneWay}"
HorizontalOptions="End" HorizontalOptions="End"
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
HorizontalTextAlignment="End" HorizontalTextAlignment="End"
StyleClass="list-sub" /> StyleClass="list-sub"
AutomationId="SendFilterCountLabel" />
</controls:ExtendedStackLayout> </controls:ExtendedStackLayout>
</DataTemplate> </DataTemplate>

View File

@@ -66,5 +66,27 @@ namespace Bit.App.Pages
return _icon; return _icon;
} }
} }
public string AutomationId
{
get
{
if (_name != null)
{
return "SendItem";
}
if (Type != null)
{
switch (Type.Value)
{
case SendType.Text:
return "SendTextFilter";
case SendType.File:
return "SendFileFilter";
}
}
return null;
}
}
} }
} }

View File

@@ -59,7 +59,8 @@
Margin="20, 0" Margin="20, 0"
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand"
HorizontalTextAlignment="Center" /> HorizontalTextAlignment="Center"
AutomationId="NoSendDisplayedLabel" />
<controls:ExtendedCollectionView <controls:ExtendedCollectionView
IsVisible="{Binding ShowList}" IsVisible="{Binding ShowList}"
ItemsSource="{Binding Sends}" ItemsSource="{Binding Sends}"
@@ -67,13 +68,15 @@
SelectionMode="Single" SelectionMode="Single"
SelectionChanged="RowSelected" SelectionChanged="RowSelected"
StyleClass="list, list-platform" StyleClass="list, list-platform"
ExtraDataForLogging="Sends Page"> ExtraDataForLogging="Sends Page"
AutomationId="SendCellList">
<CollectionView.ItemTemplate> <CollectionView.ItemTemplate>
<DataTemplate x:DataType="views:SendView"> <DataTemplate x:DataType="views:SendView">
<controls:SendViewCell <controls:SendViewCell
Send="{Binding .}" Send="{Binding .}"
ButtonCommand="{Binding BindingContext.SendOptionsCommand, Source={x:Reference _page}}" ButtonCommand="{Binding BindingContext.SendOptionsCommand, Source={x:Reference _page}}"
ShowOptions="{Binding BindingContext.SendEnabled, Source={x:Reference _page}}" /> ShowOptions="{Binding BindingContext.SendEnabled, Source={x:Reference _page}}"
AutomationId="SendCell" />
</DataTemplate> </DataTemplate>
</CollectionView.ItemTemplate> </CollectionView.ItemTemplate>
</controls:ExtendedCollectionView> </controls:ExtendedCollectionView>

View File

@@ -13,8 +13,13 @@
</ContentPage.BindingContext> </ContentPage.BindingContext>
<ContentPage.ToolbarItems> <ContentPage.ToolbarItems>
<ToolbarItem Text="{u:I18n Cancel}" Clicked="Close_Clicked" Order="Primary" Priority="-1" /> <ToolbarItem Text="{u:I18n Cancel}"
<ToolbarItem Text="{u:I18n Save}" Clicked="Save_Clicked" Order="Primary" /> Clicked="Close_Clicked"
Order="Primary"
Priority="-1" />
<ToolbarItem Text="{u:I18n Save}"
Clicked="Save_Clicked"
Order="Primary" />
<ToolbarItem Text="{u:I18n Delete}" <ToolbarItem Text="{u:I18n Delete}"
Clicked="Delete_Clicked" Clicked="Delete_Clicked"
Order="Secondary" Order="Secondary"
@@ -43,7 +48,8 @@
StyleClass="box-value" StyleClass="box-value"
x:Name="_nameEntry" x:Name="_nameEntry"
ReturnType="Go" ReturnType="Go"
ReturnCommand="{Binding SubmitCommand}" /> ReturnCommand="{Binding SubmitCommand}"
AutomationId="FolderNameEntry" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>

View File

@@ -31,7 +31,8 @@
Margin="20, 0" Margin="20, 0"
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand"
HorizontalTextAlignment="Center"></Label> HorizontalTextAlignment="Center"
AutomationId="NoFoldersLabel"></Label>
<controls:ExtendedCollectionView <controls:ExtendedCollectionView
IsVisible="{Binding ShowNoData, Converter={StaticResource inverseBool}}" IsVisible="{Binding ShowNoData, Converter={StaticResource inverseBool}}"
ItemsSource="{Binding Folders}" ItemsSource="{Binding Folders}"
@@ -44,10 +45,12 @@
<DataTemplate x:DataType="views:FolderView"> <DataTemplate x:DataType="views:FolderView">
<controls:ExtendedStackLayout <controls:ExtendedStackLayout
StyleClass="list-row, list-row-platform" StyleClass="list-row, list-row-platform"
Padding="10"> Padding="10"
AutomationId="FolderCell">
<Label LineBreakMode="TailTruncation" <Label LineBreakMode="TailTruncation"
StyleClass="list-title, list-title-platform" StyleClass="list-title, list-title-platform"
Text="{Binding Name, Mode=OneWay}" /> Text="{Binding Name, Mode=OneWay}"
AutomationId="FolderName" />
</controls:ExtendedStackLayout> </controls:ExtendedStackLayout>
</DataTemplate> </DataTemplate>
</CollectionView.ItemTemplate> </CollectionView.ItemTemplate>

View File

@@ -27,7 +27,8 @@
x:Name="_themePicker" x:Name="_themePicker"
ItemsSource="{Binding ThemeOptions, Mode=OneTime}" ItemsSource="{Binding ThemeOptions, Mode=OneTime}"
SelectedIndex="{Binding ThemeSelectedIndex}" SelectedIndex="{Binding ThemeSelectedIndex}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ThemeSelectorPicker" />
</StackLayout> </StackLayout>
<Label <Label
StyleClass="box-footer-label" StyleClass="box-footer-label"
@@ -44,7 +45,8 @@
x:Name="_autoDarkThemePicker" x:Name="_autoDarkThemePicker"
ItemsSource="{Binding AutoDarkThemeOptions, Mode=OneTime}" ItemsSource="{Binding AutoDarkThemeOptions, Mode=OneTime}"
SelectedIndex="{Binding AutoDarkThemeSelectedIndex}" SelectedIndex="{Binding AutoDarkThemeSelectedIndex}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="DefaultDarkThemePicker" />
</StackLayout> </StackLayout>
<Label <Label
StyleClass="box-footer-label" StyleClass="box-footer-label"
@@ -59,7 +61,8 @@
x:Name="_uriMatchPicker" x:Name="_uriMatchPicker"
ItemsSource="{Binding UriMatchOptions, Mode=OneTime}" ItemsSource="{Binding UriMatchOptions, Mode=OneTime}"
SelectedIndex="{Binding UriMatchSelectedIndex}" SelectedIndex="{Binding UriMatchSelectedIndex}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="DefaultUriMatchDetectionPicker" />
</StackLayout> </StackLayout>
<Label <Label
Text="{u:I18n DefaultUriMatchDetectionDescription}" Text="{u:I18n DefaultUriMatchDetectionDescription}"
@@ -74,7 +77,8 @@
x:Name="_clearClipboardPicker" x:Name="_clearClipboardPicker"
ItemsSource="{Binding ClearClipboardOptions, Mode=OneTime}" ItemsSource="{Binding ClearClipboardOptions, Mode=OneTime}"
SelectedIndex="{Binding ClearClipboardSelectedIndex}" SelectedIndex="{Binding ClearClipboardSelectedIndex}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ClearClipboardPicker" />
</StackLayout> </StackLayout>
<Label <Label
Text="{u:I18n ClearClipboardDescription}" Text="{u:I18n ClearClipboardDescription}"
@@ -90,7 +94,8 @@
ItemsSource="{Binding LocalesOptions, Mode=OneTime}" ItemsSource="{Binding LocalesOptions, Mode=OneTime}"
SelectedItem="{Binding SelectedLocale}" SelectedItem="{Binding SelectedLocale}"
ItemDisplayBinding="{Binding Value}" ItemDisplayBinding="{Binding Value}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="LanguagePicker" />
</StackLayout> </StackLayout>
<Label <Label
Text="{u:I18n LanguageChangeRequiresAppRestart}" Text="{u:I18n LanguageChangeRequiresAppRestart}"
@@ -105,7 +110,8 @@
<Switch <Switch
IsToggled="{Binding AutoTotpCopy}" IsToggled="{Binding AutoTotpCopy}"
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" /> HorizontalOptions="End"
AutomationId="CopyTotpAutomaticallyToggle" />
</StackLayout> </StackLayout>
<Label <Label
Text="{u:I18n CopyTotpAutomaticallyDescription}" Text="{u:I18n CopyTotpAutomaticallyDescription}"
@@ -120,7 +126,8 @@
<Switch <Switch
IsToggled="{Binding Favicon}" IsToggled="{Binding Favicon}"
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" /> HorizontalOptions="End"
AutomationId="ShowWebsiteIconsToggle" />
</StackLayout> </StackLayout>
<Label <Label
Text="{u:I18n ShowWebsiteIconsDescription}" Text="{u:I18n ShowWebsiteIconsDescription}"

View File

@@ -32,19 +32,21 @@
StyleClass="text-muted, text-sm, text-bold" StyleClass="text-muted, text-sm, text-bold"
HorizontalTextAlignment="Center" /> HorizontalTextAlignment="Center" />
</Frame> </Frame>
<Label IsVisible="{Binding UseFrame, Converter={StaticResource inverseBool}}" <controls:CustomLabel IsVisible="{Binding UseFrame, Converter={StaticResource inverseBool}}"
Text="{Binding Name, Mode=OneWay}" Text="{Binding Name, Mode=OneWay}"
LineBreakMode="{Binding LineBreakMode}" LineBreakMode="{Binding LineBreakMode}"
HorizontalOptions="StartAndExpand" HorizontalOptions="StartAndExpand"
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
StyleClass="list-title"/> StyleClass="list-title"
<Label Text="{Binding SubLabel, Mode=OneWay}" AutomationId="{Binding AutomationIdSettingName}" />
<controls:CustomLabel Text="{Binding SubLabel, Mode=OneWay}"
IsVisible="{Binding ShowSubLabel}" IsVisible="{Binding ShowSubLabel}"
HorizontalOptions="End" HorizontalOptions="End"
HorizontalTextAlignment="End" HorizontalTextAlignment="End"
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
TextColor="{Binding SubLabelColor}" TextColor="{Binding SubLabelColor}"
StyleClass="list-sub" /> StyleClass="list-sub"
AutomationId="{Binding AutomationIdSettingStatus}" />
</controls:ExtendedStackLayout> </controls:ExtendedStackLayout>
</DataTemplate> </DataTemplate>
<DataTemplate <DataTemplate
@@ -57,7 +59,8 @@
Padding="10" Padding="10"
HasShadow="False" HasShadow="False"
BackgroundColor="Transparent" BackgroundColor="Transparent"
BorderColor="{DynamicResource PrimaryColor}"> BorderColor="{DynamicResource PrimaryColor}"
AutomationId="SettingActivePolicyTextLabel">
<Label <Label
Text="{Binding Name, Mode=OneWay}" Text="{Binding Name, Mode=OneWay}"
StyleClass="text-muted, text-sm, text-bold" StyleClass="text-muted, text-sm, text-bold"
@@ -75,7 +78,8 @@
VerticalOptions="Center" VerticalOptions="Center"
FontSize="Small" FontSize="Small"
TextColor="{Binding SubLabelColor}" TextColor="{Binding SubLabelColor}"
StyleClass="list-sub" Margin="-5"/> StyleClass="list-sub" Margin="-5"
AutomationId="SettingCustomVaultTimeoutPicker" />
<controls:ExtendedStackLayout.GestureRecognizers> <controls:ExtendedStackLayout.GestureRecognizers>
<TapGestureRecognizer Tapped="ActivateTimePicker"/> <TapGestureRecognizer Tapped="ActivateTimePicker"/>
</controls:ExtendedStackLayout.GestureRecognizers> </controls:ExtendedStackLayout.GestureRecognizers>

View File

@@ -1,7 +1,9 @@
using System; using System;
using System.Globalization;
using System.Threading.Tasks; using System.Threading.Tasks;
using Bit.App.Resources; using Bit.App.Resources;
using Bit.App.Utilities; using Bit.App.Utilities;
using Bit.App.Utilities.Automation;
using Xamarin.Forms; using Xamarin.Forms;
namespace Bit.App.Pages namespace Bit.App.Pages
@@ -22,5 +24,29 @@ namespace Bit.App.Pages
public Color SubLabelColor => SubLabelTextEnabled ? public Color SubLabelColor => SubLabelTextEnabled ?
ThemeManager.GetResourceColor("SuccessColor") : ThemeManager.GetResourceColor("SuccessColor") :
ThemeManager.GetResourceColor("MutedColor"); ThemeManager.GetResourceColor("MutedColor");
public string AutomationIdSettingName
{
get
{
return AutomationIdsHelper.AddSuffixFor(
UseFrame ? "EnabledPolicy"
: AutomationIdsHelper.ToEnglishTitleCase(Name)
, SuffixType.Cell);
}
}
public string AutomationIdSettingStatus
{
get
{
if (UseFrame)
{
return null;
}
return AutomationIdsHelper.AddSuffixFor(AutomationIdsHelper.ToEnglishTitleCase(Name), SuffixType.SettingValue);
}
}
} }
} }

View File

@@ -33,23 +33,25 @@
<StackLayout StyleClass="box"> <StackLayout StyleClass="box">
<StackLayout StyleClass="box-row" Padding="10, 20" <StackLayout StyleClass="box-row" Padding="10, 20"
IsVisible="{Binding HasAttachments, Converter={StaticResource inverseBool}}"> IsVisible="{Binding HasAttachments, Converter={StaticResource inverseBool}}">
<Label Text="{u:I18n NoAttachments}" HorizontalTextAlignment="Center" /> <Label Text="{u:I18n NoAttachments}" HorizontalTextAlignment="Center" AutomationId="NoAttachmentsLabel" />
</StackLayout> </StackLayout>
<controls:RepeaterView ItemsSource="{Binding Attachments}" IsVisible="{Binding HasAttachments}"> <controls:RepeaterView ItemsSource="{Binding Attachments}" IsVisible="{Binding HasAttachments}" AutomationId="AttachmentsList">
<controls:RepeaterView.ItemTemplate> <controls:RepeaterView.ItemTemplate>
<DataTemplate x:DataType="views:AttachmentView"> <DataTemplate x:DataType="views:AttachmentView">
<StackLayout Spacing="0" Padding="0"> <StackLayout Spacing="0" Padding="0">
<StackLayout Orientation="Horizontal" StyleClass="box-row" Spacing="10"> <StackLayout Orientation="Horizontal" StyleClass="box-row" Spacing="10" AutomationId="AttachmentRow">
<Label <Label
Text="{Binding FileName, Mode=OneWay}" Text="{Binding FileName, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
VerticalTextAlignment="Center" VerticalTextAlignment="Center"
HorizontalOptions="StartAndExpand" /> HorizontalOptions="StartAndExpand"
AutomationId="AttachmentFileNameLabel" />
<Label <Label
Text="{Binding SizeName, Mode=OneWay}" Text="{Binding SizeName, Mode=OneWay}"
StyleClass="box-sub-label" StyleClass="box-sub-label"
HorizontalTextAlignment="End" HorizontalTextAlignment="End"
VerticalTextAlignment="Center" /> VerticalTextAlignment="Center"
AutomationId="AttachmentFileSizeLabel" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Trash}}" Text="{Binding Source={x:Static core:BitwardenIcons.Trash}}"
@@ -57,7 +59,8 @@
CommandParameter="{Binding .}" CommandParameter="{Binding .}"
VerticalOptions="Center" VerticalOptions="Center"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Delete}" /> AutomationProperties.Name="{u:I18n Delete}"
AutomationId="AttachmentDeleteButton" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
</StackLayout> </StackLayout>
@@ -77,17 +80,20 @@
LineBreakMode="CharacterWrap" LineBreakMode="CharacterWrap"
StyleClass="text-sm, text-muted" StyleClass="text-sm, text-muted"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
HorizontalTextAlignment="Center" /> HorizontalTextAlignment="Center"
AutomationId="NoFileChosenLabel" />
<Label <Label
IsVisible="{Binding FileName, Converter={StaticResource notNull}}" IsVisible="{Binding FileName, Converter={StaticResource notNull}}"
Text="{Binding FileName}" Text="{Binding FileName}"
LineBreakMode="CharacterWrap" LineBreakMode="CharacterWrap"
StyleClass="text-sm, text-muted" StyleClass="text-sm, text-muted"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
HorizontalTextAlignment="Center" /> HorizontalTextAlignment="Center"
AutomationId="NewAttachmentNameLabel" />
</StackLayout> </StackLayout>
<Button Text="{u:I18n ChooseFile}" StyleClass="box-button-row" <Button Text="{u:I18n ChooseFile}" StyleClass="box-button-row"
Clicked="ChooseFile_Clicked"></Button> Clicked="ChooseFile_Clicked"
AutomationId="ChooseFileButton"></Button>
<Label <Label
Margin="0, 10, 0, 0" Margin="0, 10, 0, 0"
Text="{u:I18n MaxFileSize}" Text="{u:I18n MaxFileSize}"

View File

@@ -57,16 +57,16 @@
x:Key="deleteItem" /> x:Key="deleteItem" />
<DataTemplate x:Key="TextCustomFieldDataTemplate"> <DataTemplate x:Key="TextCustomFieldDataTemplate">
<il:TextCustomFieldItemLayout /> <il:TextCustomFieldItemLayout AutomationId="TextCustomFieldItem" />
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="BooleanCustomFieldDataTemplate"> <DataTemplate x:Key="BooleanCustomFieldDataTemplate">
<il:BooleanCustomFieldItemLayout /> <il:BooleanCustomFieldItemLayout AutomationId="BooleanCustomFieldItem" />
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="HiddenCustomFieldDataTemplate"> <DataTemplate x:Key="HiddenCustomFieldDataTemplate">
<il:HiddenCustomFieldItemLayout /> <il:HiddenCustomFieldItemLayout AutomationId="HiddenCustomFieldItem" />
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="LinkedCustomFieldDataTemplate"> <DataTemplate x:Key="LinkedCustomFieldDataTemplate">
<il:LinkedCustomFieldItemLayout /> <il:LinkedCustomFieldItemLayout AutomationId="LinkedCustomFieldItem" />
</DataTemplate> </DataTemplate>
<dts:CustomFieldItemTemplateSelector x:Key="CustomFieldItemTemplateSelector" <dts:CustomFieldItemTemplateSelector x:Key="CustomFieldItemTemplateSelector"
@@ -100,7 +100,8 @@
<Label <Label
Text="{u:I18n PersonalOwnershipPolicyInEffect}" Text="{u:I18n PersonalOwnershipPolicyInEffect}"
StyleClass="text-muted, text-sm, text-bold" StyleClass="text-muted, text-sm, text-bold"
HorizontalTextAlignment="Center" /> HorizontalTextAlignment="Center"
AutomationId="PersonalOwnershipPolicyLabel"/>
</Frame> </Frame>
</Grid> </Grid>
<StackLayout StyleClass="box-row-header"> <StackLayout StyleClass="box-row-header">
@@ -116,7 +117,8 @@
x:Name="_typePicker" x:Name="_typePicker"
ItemsSource="{Binding TypeOptions, Mode=OneTime}" ItemsSource="{Binding TypeOptions, Mode=OneTime}"
SelectedIndex="{Binding TypeSelectedIndex}" SelectedIndex="{Binding TypeSelectedIndex}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemTypePicker" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -127,7 +129,8 @@
Text="{Binding Cipher.Name}" Text="{Binding Cipher.Name}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Name}" /> AutomationProperties.Name="{u:I18n Name}"
AutomationId="ItemNameEntry" />
</StackLayout> </StackLayout>
<StackLayout IsVisible="{Binding IsLogin}" Spacing="0" Padding="0"> <StackLayout IsVisible="{Binding IsLogin}" Spacing="0" Padding="0">
<Grid StyleClass="box-row, box-row-input" <Grid StyleClass="box-row, box-row-input"
@@ -142,7 +145,8 @@
StyleClass="box-value" StyleClass="box-value"
Grid.Row="1" Grid.Row="1"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Username}"/> AutomationProperties.Name="{u:I18n Username}"
AutomationId="LoginUsernameEntry" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}" Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}"
@@ -150,7 +154,8 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n GenerateUsername}" /> AutomationProperties.Name="{u:I18n GenerateUsername}"
AutomationId="GenerateUsernameButton" />
</Grid> </Grid>
<Grid StyleClass="box-row, box-row-input"> <Grid StyleClass="box-row, box-row-input">
<Grid.RowDefinitions> <Grid.RowDefinitions>
@@ -180,7 +185,8 @@
IsTextPredictionEnabled="False" IsTextPredictionEnabled="False"
IsEnabled="{Binding Cipher.ViewPassword}" IsEnabled="{Binding Cipher.ViewPassword}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Password}"/> AutomationProperties.Name="{u:I18n Password}"
AutomationId="LoginPasswordEntry" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.CheckCircle}}" Text="{Binding Source={x:Static core:BitwardenIcons.CheckCircle}}"
@@ -190,7 +196,8 @@
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CheckPassword}" AutomationProperties.Name="{u:I18n CheckPassword}"
IsVisible="{Binding Cipher.ViewPassword}" /> IsVisible="{Binding Cipher.ViewPassword}"
AutomationId="CheckPasswordButton" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowPasswordIcon}" Text="{Binding ShowPasswordIcon}"
@@ -201,7 +208,8 @@
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ToggleVisibility}" AutomationProperties.Name="{u:I18n ToggleVisibility}"
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}" AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
IsVisible="{Binding Cipher.ViewPassword}" /> IsVisible="{Binding Cipher.ViewPassword}"
AutomationId="ViewPasswordButton" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}" Text="{Binding Source={x:Static core:BitwardenIcons.Generate}}"
@@ -211,7 +219,8 @@
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n GeneratePassword}" AutomationProperties.Name="{u:I18n GeneratePassword}"
IsVisible="{Binding Cipher.ViewPassword}" /> IsVisible="{Binding Cipher.ViewPassword}"
AutomationId="RegeneratePasswordButton" />
</Grid> </Grid>
<Grid StyleClass="box-row, box-row-input"> <Grid StyleClass="box-row, box-row-input">
@@ -247,7 +256,8 @@
Padding="0,15" Padding="0,15"
HorizontalOptions="Center" HorizontalOptions="Center"
VerticalOptions="FillAndExpand" VerticalOptions="FillAndExpand"
VerticalTextAlignment="Center" /> VerticalTextAlignment="Center"
AutomationId="SetupTotpButton" />
</Frame> </Frame>
<controls:MonoEntry <controls:MonoEntry
x:Name="_loginTotpEntry" x:Name="_loginTotpEntry"
@@ -262,7 +272,8 @@
Grid.Column="0" Grid.Column="0"
Grid.ColumnSpan="{Binding TotpColumnSpan}" Grid.ColumnSpan="{Binding TotpColumnSpan}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n AuthenticatorKey}" /> AutomationProperties.Name="{u:I18n AuthenticatorKey}"
AutomationId="LoginTotpEntry" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}" Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
@@ -272,7 +283,8 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CopyTotp}" /> AutomationProperties.Name="{u:I18n CopyTotp}"
AutomationId="CopyTotpValueButton" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Camera}}" Text="{Binding Source={x:Static core:BitwardenIcons.Camera}}"
@@ -282,7 +294,8 @@
Grid.RowSpan="2" Grid.RowSpan="2"
IsVisible="{Binding HasTotpValue}" IsVisible="{Binding HasTotpValue}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ScanQrTitle}" /> AutomationProperties.Name="{u:I18n ScanQrTitle}"
/>
</Grid> </Grid>
</StackLayout> </StackLayout>
<StackLayout IsVisible="{Binding IsCard}" Spacing="0" Padding="0"> <StackLayout IsVisible="{Binding IsCard}" Spacing="0" Padding="0">
@@ -293,7 +306,8 @@
<Entry <Entry
x:Name="_cardholderNameEntry" x:Name="_cardholderNameEntry"
Text="{Binding Cipher.Card.CardholderName}" Text="{Binding Cipher.Card.CardholderName}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="CardholderNameEntry" />
</StackLayout> </StackLayout>
<Grid StyleClass="box-row, box-row-input"> <Grid StyleClass="box-row, box-row-input">
<Grid.RowDefinitions> <Grid.RowDefinitions>
@@ -319,7 +333,8 @@
IsSpellCheckEnabled="False" IsSpellCheckEnabled="False"
IsTextPredictionEnabled="False" IsTextPredictionEnabled="False"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Number}" /> AutomationProperties.Name="{u:I18n Number}"
AutomationId="CardNumberEntry" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowCardNumberIcon}" Text="{Binding ShowCardNumberIcon}"
@@ -328,7 +343,8 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ToggleVisibility}" /> AutomationProperties.Name="{u:I18n ToggleVisibility}"
AutomationId="ShowCardNumberButton" />
</Grid> </Grid>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -338,7 +354,8 @@
x:Name="_cardBrandPicker" x:Name="_cardBrandPicker"
ItemsSource="{Binding CardBrandOptions, Mode=OneTime}" ItemsSource="{Binding CardBrandOptions, Mode=OneTime}"
SelectedIndex="{Binding CardBrandSelectedIndex}" SelectedIndex="{Binding CardBrandSelectedIndex}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="CardBrandPicker" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -348,7 +365,8 @@
x:Name="_cardExpMonthPicker" x:Name="_cardExpMonthPicker"
ItemsSource="{Binding CardExpMonthOptions, Mode=OneTime}" ItemsSource="{Binding CardExpMonthOptions, Mode=OneTime}"
SelectedIndex="{Binding CardExpMonthSelectedIndex}" SelectedIndex="{Binding CardExpMonthSelectedIndex}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="CardExpirationMonthPicker" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -360,7 +378,8 @@
StyleClass="box-value" StyleClass="box-value"
Keyboard="Numeric" Keyboard="Numeric"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ExpirationYear}" /> AutomationProperties.Name="{u:I18n ExpirationYear}"
AutomationId="CardExpirationYearEntry" />
</StackLayout> </StackLayout>
<Grid StyleClass="box-row, box-row-input"> <Grid StyleClass="box-row, box-row-input">
<Grid.RowDefinitions> <Grid.RowDefinitions>
@@ -387,7 +406,8 @@
IsSpellCheckEnabled="False" IsSpellCheckEnabled="False"
IsTextPredictionEnabled="False" IsTextPredictionEnabled="False"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n SecurityCode}" /> AutomationProperties.Name="{u:I18n SecurityCode}"
AutomationId="CardSecurityCodeEntry" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowCardCodeIcon}" Text="{Binding ShowCardCodeIcon}"
@@ -396,7 +416,8 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ToggleVisibility}" /> AutomationProperties.Name="{u:I18n ToggleVisibility}"
AutomationId="CardShowSecurityCodeButton" />
</Grid> </Grid>
</StackLayout> </StackLayout>
<StackLayout IsVisible="{Binding IsIdentity}" Spacing="0" Padding="0"> <StackLayout IsVisible="{Binding IsIdentity}" Spacing="0" Padding="0">
@@ -408,7 +429,8 @@
x:Name="_identityTitlePicker" x:Name="_identityTitlePicker"
ItemsSource="{Binding IdentityTitleOptions, Mode=OneTime}" ItemsSource="{Binding IdentityTitleOptions, Mode=OneTime}"
SelectedIndex="{Binding IdentityTitleSelectedIndex}" SelectedIndex="{Binding IdentityTitleSelectedIndex}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="IdentityTitlePicker" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -419,7 +441,8 @@
Text="{Binding Cipher.Identity.FirstName}" Text="{Binding Cipher.Identity.FirstName}"
StyleClass="box-value,capitalize-word-input" StyleClass="box-value,capitalize-word-input"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n FirstName}"/> AutomationProperties.Name="{u:I18n FirstName}"
AutomationId="IdentityFirstNameEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -430,7 +453,8 @@
Text="{Binding Cipher.Identity.MiddleName}" Text="{Binding Cipher.Identity.MiddleName}"
StyleClass="box-value,capitalize-word-input" StyleClass="box-value,capitalize-word-input"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n MiddleName}" /> AutomationProperties.Name="{u:I18n MiddleName}"
AutomationId="IdentityMiddleNameEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -441,7 +465,8 @@
Text="{Binding Cipher.Identity.LastName}" Text="{Binding Cipher.Identity.LastName}"
StyleClass="box-value,capitalize-word-input" StyleClass="box-value,capitalize-word-input"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n LastName}" /> AutomationProperties.Name="{u:I18n LastName}"
AutomationId="IdentityLastNameEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -452,7 +477,8 @@
Text="{Binding Cipher.Identity.Username}" Text="{Binding Cipher.Identity.Username}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Username}" /> AutomationProperties.Name="{u:I18n Username}"
AutomationId="IdentityUsernameEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -463,7 +489,8 @@
Text="{Binding Cipher.Identity.Company}" Text="{Binding Cipher.Identity.Company}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Company}"/> AutomationProperties.Name="{u:I18n Company}"
AutomationId="IdentityCompanyEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -474,7 +501,8 @@
Text="{Binding Cipher.Identity.SSN}" Text="{Binding Cipher.Identity.SSN}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n SSN}"/> AutomationProperties.Name="{u:I18n SSN}"
AutomationId="IdentitySsnEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -485,7 +513,8 @@
Text="{Binding Cipher.Identity.PassportNumber}" Text="{Binding Cipher.Identity.PassportNumber}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n PassportNumber}"/> AutomationProperties.Name="{u:I18n PassportNumber}"
AutomationId="IdentityPassportNumberEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -496,7 +525,8 @@
Text="{Binding Cipher.Identity.LicenseNumber}" Text="{Binding Cipher.Identity.LicenseNumber}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n LicenseNumber}" /> AutomationProperties.Name="{u:I18n LicenseNumber}"
AutomationId="IdentityLicenseNumberEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -508,7 +538,8 @@
Text="{Binding Cipher.Identity.Email}" Text="{Binding Cipher.Identity.Email}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Email}"/> AutomationProperties.Name="{u:I18n Email}"
AutomationId="IdentityEmailEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -520,7 +551,8 @@
Keyboard="Telephone" Keyboard="Telephone"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Phone}" /> AutomationProperties.Name="{u:I18n Phone}"
AutomationId="IdentityPhoneEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -531,7 +563,8 @@
Text="{Binding Cipher.Identity.Address1}" Text="{Binding Cipher.Identity.Address1}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Address1}"/> AutomationProperties.Name="{u:I18n Address1}"
AutomationId="IdentityAddressOneEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -542,7 +575,8 @@
Text="{Binding Cipher.Identity.Address2}" Text="{Binding Cipher.Identity.Address2}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Address2}" /> AutomationProperties.Name="{u:I18n Address2}"
AutomationId="IdentityAddressTwoEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -553,7 +587,8 @@
Text="{Binding Cipher.Identity.Address3}" Text="{Binding Cipher.Identity.Address3}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Address3}" /> AutomationProperties.Name="{u:I18n Address3}"
AutomationId="IdentityAddressThreeEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -564,7 +599,8 @@
Text="{Binding Cipher.Identity.City}" Text="{Binding Cipher.Identity.City}"
StyleClass="box-value,capitalize-sentence-input" StyleClass="box-value,capitalize-sentence-input"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CityTown}" /> AutomationProperties.Name="{u:I18n CityTown}"
AutomationId="IdentityCityEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -575,7 +611,8 @@
Text="{Binding Cipher.Identity.State}" Text="{Binding Cipher.Identity.State}"
StyleClass="box-value,capitalize-sentence-input" StyleClass="box-value,capitalize-sentence-input"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n StateProvince}" /> AutomationProperties.Name="{u:I18n StateProvince}"
AutomationId="IdentityStateEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -586,7 +623,8 @@
Text="{Binding Cipher.Identity.PostalCode}" Text="{Binding Cipher.Identity.PostalCode}"
StyleClass="box-value" StyleClass="box-value"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ZipPostalCode}" /> AutomationProperties.Name="{u:I18n ZipPostalCode}"
AutomationId="IdentityPostalCodeEntry" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-input"> <StackLayout StyleClass="box-row, box-row-input">
<Label <Label
@@ -597,7 +635,8 @@
Text="{Binding Cipher.Identity.Country}" Text="{Binding Cipher.Identity.Country}"
StyleClass="box-value,capitalize-sentence-input" StyleClass="box-value,capitalize-sentence-input"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Country}" /> AutomationProperties.Name="{u:I18n Country}"
AutomationId="IdentityCountryEntry" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
@@ -609,7 +648,7 @@
<controls:RepeaterView ItemsSource="{Binding Uris}"> <controls:RepeaterView ItemsSource="{Binding Uris}">
<controls:RepeaterView.ItemTemplate> <controls:RepeaterView.ItemTemplate>
<DataTemplate x:DataType="views:LoginUriView"> <DataTemplate x:DataType="views:LoginUriView">
<Grid StyleClass="box-row, box-row-input"> <Grid StyleClass="box-row, box-row-input" AutomationId="UriListGrid" >
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
@@ -630,7 +669,8 @@
Grid.Row="1" Grid.Row="1"
Grid.Column="0" Grid.Column="0"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n URI}" /> AutomationProperties.Name="{u:I18n URI}"
AutomationId="LoginUriEntry" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Cog}}" Text="{Binding Source={x:Static core:BitwardenIcons.Cog}}"
@@ -640,13 +680,15 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Options}" /> AutomationProperties.Name="{u:I18n Options}"
AutomationId="LoginUriOptionsButton" />
</Grid> </Grid>
</DataTemplate> </DataTemplate>
</controls:RepeaterView.ItemTemplate> </controls:RepeaterView.ItemTemplate>
</controls:RepeaterView> </controls:RepeaterView>
<Button Text="{u:I18n NewUri}" StyleClass="box-button-row" <Button Text="{u:I18n NewUri}" StyleClass="box-button-row"
Clicked="NewUri_Clicked"></Button> Clicked="NewUri_Clicked"
AutomationId="LoginAddNewUriButton"></Button>
</StackLayout> </StackLayout>
<StackLayout StyleClass="box"> <StackLayout StyleClass="box">
<StackLayout StyleClass="box-row-header"> <StackLayout StyleClass="box-row-header">
@@ -661,7 +703,8 @@
x:Name="_folderPicker" x:Name="_folderPicker"
ItemsSource="{Binding FolderOptions, Mode=OneTime}" ItemsSource="{Binding FolderOptions, Mode=OneTime}"
SelectedIndex="{Binding FolderSelectedIndex}" SelectedIndex="{Binding FolderSelectedIndex}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="FolderPicker" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-switch"> <StackLayout StyleClass="box-row, box-row-switch">
<Label <Label
@@ -671,7 +714,8 @@
<Switch <Switch
IsToggled="{Binding Cipher.Favorite}" IsToggled="{Binding Cipher.Favorite}"
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" /> HorizontalOptions="End"
AutomationId="ItemFavoriteToggle" />
</StackLayout> </StackLayout>
<StackLayout x:Name="_passwordPrompt" StyleClass="box-row, box-row-switch"> <StackLayout x:Name="_passwordPrompt" StyleClass="box-row, box-row-switch">
<Label <Label
@@ -689,7 +733,8 @@
IsToggled="{Binding PasswordPrompt}" IsToggled="{Binding PasswordPrompt}"
Toggled="PasswordPrompt_Toggled" Toggled="PasswordPrompt_Toggled"
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End" /> HorizontalOptions="End"
AutomationId="MasterPasswordRepromptToggle" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
</StackLayout> </StackLayout>
@@ -706,7 +751,8 @@
effects:ScrollEnabledEffect.IsScrollEnabled="false" effects:ScrollEnabledEffect.IsScrollEnabled="false"
Text="{Binding Cipher.Notes}" Text="{Binding Cipher.Notes}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Notes}" > AutomationProperties.Name="{u:I18n Notes}"
AutomationId="ItemNotesEntry">
<Editor.Behaviors> <Editor.Behaviors>
<behaviors:EditorPreventAutoBottomScrollingOnFocusedBehavior ParentScrollView="{x:Reference _scrollView}" /> <behaviors:EditorPreventAutoBottomScrollingOnFocusedBehavior ParentScrollView="{x:Reference _scrollView}" />
</Editor.Behaviors> </Editor.Behaviors>
@@ -725,9 +771,11 @@
<StackLayout <StackLayout
Spacing="0" Spacing="0"
BindableLayout.ItemsSource="{Binding Fields}" BindableLayout.ItemsSource="{Binding Fields}"
BindableLayout.ItemTemplateSelector="{StaticResource CustomFieldItemTemplateSelector}" /> BindableLayout.ItemTemplateSelector="{StaticResource CustomFieldItemTemplateSelector}"
AutomationId="CustomFieldsList" />
<Button Text="{u:I18n NewCustomField}" StyleClass="box-button-row" <Button Text="{u:I18n NewCustomField}" StyleClass="box-button-row"
Clicked="NewField_Clicked"></Button> Clicked="NewField_Clicked"
AutomationId="NewCustomFieldButton"></Button>
</StackLayout> </StackLayout>
<StackLayout StyleClass="box" IsVisible="{Binding ShowOwnershipOptions}"> <StackLayout StyleClass="box" IsVisible="{Binding ShowOwnershipOptions}">
<StackLayout StyleClass="box-row-header"> <StackLayout StyleClass="box-row-header">
@@ -742,7 +790,8 @@
x:Name="_ownershipPicker" x:Name="_ownershipPicker"
ItemsSource="{Binding OwnershipOptions, Mode=OneTime}" ItemsSource="{Binding OwnershipOptions, Mode=OneTime}"
SelectedIndex="{Binding OwnershipSelectedIndex}" SelectedIndex="{Binding OwnershipSelectedIndex}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemOwnershipPicker" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
<StackLayout StyleClass="box" IsVisible="{Binding ShowCollections}"> <StackLayout StyleClass="box" IsVisible="{Binding ShowCollections}">
@@ -753,7 +802,8 @@
<StackLayout Spacing="0" Padding="0" <StackLayout Spacing="0" Padding="0"
IsVisible="{Binding HasCollections, Converter={StaticResource inverseBool}}"> IsVisible="{Binding HasCollections, Converter={StaticResource inverseBool}}">
<StackLayout StyleClass="box-row, box-row-switch"> <StackLayout StyleClass="box-row, box-row-switch">
<Label Text="{u:I18n NoCollectionsToList}" /> <Label Text="{u:I18n NoCollectionsToList}"
AutomationId="NoCollectionsToListLabel" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
</StackLayout> </StackLayout>
@@ -763,15 +813,17 @@
<controls:RepeaterView.ItemTemplate> <controls:RepeaterView.ItemTemplate>
<DataTemplate x:DataType="pages:CollectionViewModel"> <DataTemplate x:DataType="pages:CollectionViewModel">
<StackLayout Spacing="0" Padding="0"> <StackLayout Spacing="0" Padding="0">
<StackLayout StyleClass="box-row, box-row-switch"> <StackLayout StyleClass="box-row, box-row-switch" AutomationId="CollectionItemCell">
<Label <Label
Text="{Binding Collection.Name}" Text="{Binding Collection.Name}"
StyleClass="box-label-regular" StyleClass="box-label-regular"
HorizontalOptions="StartAndExpand" /> HorizontalOptions="StartAndExpand"
AutomationId="CollectionItemNameLabel" />
<Switch <Switch
IsToggled="{Binding Checked}" IsToggled="{Binding Checked}"
StyleClass="box-value" StyleClass="box-value"
HorizontalOptions="End"/> HorizontalOptions="End"
AutomationId="CollectionItemSwitch" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
</StackLayout> </StackLayout>
@@ -781,5 +833,4 @@
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
</ScrollView> </ScrollView>
</pages:BaseContentPage> </pages:BaseContentPage>

View File

@@ -49,16 +49,16 @@
x:Name="_cloneItem" x:Key="cloneItem" /> x:Name="_cloneItem" x:Key="cloneItem" />
<DataTemplate x:Key="TextCustomFieldDataTemplate"> <DataTemplate x:Key="TextCustomFieldDataTemplate">
<il:TextCustomFieldItemLayout /> <il:TextCustomFieldItemLayout AutomationId="TextCustomFieldItem" />
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="BooleanCustomFieldDataTemplate"> <DataTemplate x:Key="BooleanCustomFieldDataTemplate">
<il:BooleanCustomFieldItemLayout /> <il:BooleanCustomFieldItemLayout AutomationId="BooleanCustomFieldItem" />
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="HiddenCustomFieldDataTemplate"> <DataTemplate x:Key="HiddenCustomFieldDataTemplate">
<il:HiddenCustomFieldItemLayout /> <il:HiddenCustomFieldItemLayout AutomationId="HiddenCustomFieldItem" />
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="LinkedCustomFieldDataTemplate"> <DataTemplate x:Key="LinkedCustomFieldDataTemplate">
<il:LinkedCustomFieldItemLayout /> <il:LinkedCustomFieldItemLayout AutomationId="LinkedCustomFieldItem" />
</DataTemplate> </DataTemplate>
<dts:CustomFieldItemTemplateSelector x:Key="CustomFieldItemTemplateSelector" <dts:CustomFieldItemTemplateSelector x:Key="CustomFieldItemTemplateSelector"
@@ -69,23 +69,26 @@
<ScrollView x:Key="scrollView" x:Name="_scrollView"> <ScrollView x:Key="scrollView" x:Name="_scrollView">
<StackLayout Spacing="20" x:Name="_mainLayout"> <StackLayout Spacing="20" x:Name="_mainLayout">
<StackLayout StyleClass="box"> <StackLayout StyleClass="box" AutomationId="ItemInformationSection">
<StackLayout StyleClass="box-row-header"> <StackLayout StyleClass="box-row-header">
<Label Text="{u:I18n ItemInformation, Header=True}" <Label Text="{u:I18n ItemInformation, Header=True}"
StyleClass="box-header, box-header-platform" /> StyleClass="box-header, box-header-platform" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row"> <StackLayout StyleClass="box-row" AutomationId="ItemRow">
<Label <Label
Text="{u:I18n Name}" Text="{u:I18n Name}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Name, Mode=OneWay}" Text="{Binding Cipher.Name, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemValue" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
<StackLayout IsVisible="{Binding IsLogin}" Spacing="0" Padding="0"> <StackLayout IsVisible="{Binding IsLogin}" Spacing="0" Padding="0">
<Grid StyleClass="box-row" <Grid StyleClass="box-row"
IsVisible="{Binding Cipher.Login.Username, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Login.Username, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
@@ -98,12 +101,14 @@
Text="{u:I18n Username}" Text="{u:I18n Username}"
StyleClass="box-label" StyleClass="box-label"
Grid.Row="0" Grid.Row="0"
Grid.Column="0" /> Grid.Column="0"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Login.Username, Mode=OneWay}" Text="{Binding Cipher.Login.Username, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
Grid.Row="1" Grid.Row="1"
Grid.Column="0" /> Grid.Column="0"
AutomationId="ItemValue" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}" Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
@@ -113,12 +118,14 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CopyUsername}" /> AutomationProperties.Name="{u:I18n CopyUsername}"
AutomationId="CopyValueButton" />
</Grid> </Grid>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Login.Username, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Login.Username, Converter={StaticResource stringHasValue}}" />
<Grid StyleClass="box-row" <Grid StyleClass="box-row"
IsVisible="{Binding Cipher.Login.Password, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Login.Password, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
@@ -133,20 +140,23 @@
Text="{u:I18n Password}" Text="{u:I18n Password}"
StyleClass="box-label" StyleClass="box-label"
Grid.Row="0" Grid.Row="0"
Grid.Column="0" /> Grid.Column="0"
AutomationId="ItemName" />
<controls:MonoLabel <controls:MonoLabel
Text="{Binding Cipher.Login.MaskedPassword, Mode=OneWay}" Text="{Binding Cipher.Login.MaskedPassword, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
Grid.Row="1" Grid.Row="1"
Grid.Column="0" Grid.Column="0"
IsVisible="{Binding ShowPassword, Converter={StaticResource inverseBool}}" /> IsVisible="{Binding ShowPassword, Converter={StaticResource inverseBool}}"
AutomationId="ItemValue" />
<controls:MonoLabel <controls:MonoLabel
Text="{Binding ColoredPassword, Mode=OneWay}" Text="{Binding ColoredPassword, Mode=OneWay}"
StyleClass="box-value, text-html" StyleClass="box-value, text-html"
Grid.Row="1" Grid.Row="1"
Grid.Column="0" Grid.Column="0"
LineBreakMode="CharacterWrap" LineBreakMode="CharacterWrap"
IsVisible="{Binding ShowPassword}" /> IsVisible="{Binding ShowPassword}"
AutomationId="ItemValue" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.CheckCircle}}" Text="{Binding Source={x:Static core:BitwardenIcons.CheckCircle}}"
@@ -156,7 +166,8 @@
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CheckPassword}" AutomationProperties.Name="{u:I18n CheckPassword}"
IsVisible="{Binding Cipher.ViewPassword}" /> IsVisible="{Binding Cipher.ViewPassword}"
AutomationId="CheckPasswordButton" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowPasswordIcon}" Text="{Binding ShowPasswordIcon}"
@@ -167,7 +178,8 @@
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ToggleVisibility}" AutomationProperties.Name="{u:I18n ToggleVisibility}"
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}" AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
IsVisible="{Binding Cipher.ViewPassword}" /> IsVisible="{Binding Cipher.ViewPassword}"
AutomationId="ViewValueButton" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}" Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
@@ -178,11 +190,14 @@
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CopyPassword}" AutomationProperties.Name="{u:I18n CopyPassword}"
IsVisible="{Binding Cipher.ViewPassword}" /> IsVisible="{Binding Cipher.ViewPassword}"
AutomationId="CopyValueButton" />
</Grid> </Grid>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Login.Password, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Login.Password, Converter={StaticResource stringHasValue}}" />
<Grid StyleClass="box-row" IsVisible="{Binding ShowTotp}"> <Grid StyleClass="box-row"
IsVisible="{Binding ShowTotp}"
AutomationId="ItemRow">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
@@ -197,7 +212,8 @@
Text="{u:I18n VerificationCodeTotp}" Text="{u:I18n VerificationCodeTotp}"
StyleClass="box-label" StyleClass="box-label"
Grid.Row="0" Grid.Row="0"
Grid.Column="0" /> Grid.Column="0"
AutomationId="ItemName" />
<controls:MonoLabel <controls:MonoLabel
Text="{Binding TotpCodeFormatted, Mode=OneWay}" Text="{Binding TotpCodeFormatted, Mode=OneWay}"
IsVisible="{Binding ShowUpgradePremiumTotpText, Converter={StaticResource inverseBool}}" IsVisible="{Binding ShowUpgradePremiumTotpText, Converter={StaticResource inverseBool}}"
@@ -205,14 +221,16 @@
Grid.Row="1" Grid.Row="1"
Grid.Column="0" Grid.Column="0"
VerticalTextAlignment="Start" VerticalTextAlignment="Start"
VerticalOptions="Start" /> VerticalOptions="Start"
AutomationId="ItemValue" />
<controls:CircularProgressbarView <controls:CircularProgressbarView
Progress="{Binding TotpProgress}" Progress="{Binding TotpProgress}"
Grid.Row="0" Grid.Row="0"
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand" /> VerticalOptions="FillAndExpand"
AutomationId="LoginTotpProgressBar" />
<Label <Label
Text="{Binding TotpSec, Mode=OneWay}" Text="{Binding TotpSec, Mode=OneWay}"
Style="{DynamicResource textTotp}" Style="{DynamicResource textTotp}"
@@ -234,7 +252,8 @@
Grid.Column="2" Grid.Column="2"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CopyTotp}" /> AutomationProperties.Name="{u:I18n CopyTotp}"
AutomationId="CopyValueButton" />
<Label <Label
Text="{u:I18n PremiumSubscriptionRequired}" Text="{u:I18n PremiumSubscriptionRequired}"
StyleClass="box-footer-label" StyleClass="box-footer-label"
@@ -242,24 +261,29 @@
Margin="0,5,0,2" Margin="0,5,0,2"
Grid.Column="0" Grid.Column="0"
Grid.Row="1" Grid.Row="1"
HorizontalOptions="FillAndExpand" /> HorizontalOptions="FillAndExpand"
AutomationId="ShowUpgradePremiumTotpLabel" />
</Grid> </Grid>
<BoxView StyleClass="box-row-separator" IsVisible="{Binding ShowTotp}" /> <BoxView StyleClass="box-row-separator" IsVisible="{Binding ShowTotp}" />
</StackLayout> </StackLayout>
<StackLayout IsVisible="{Binding IsCard}" Spacing="0" Padding="0"> <StackLayout IsVisible="{Binding IsCard}" Spacing="0" Padding="0">
<StackLayout StyleClass="box-row" <StackLayout StyleClass="box-row"
IsVisible="{Binding Cipher.Card.CardholderName, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Card.CardholderName, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Label <Label
Text="{u:I18n CardholderName}" Text="{u:I18n CardholderName}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Card.CardholderName, Mode=OneWay}" Text="{Binding Cipher.Card.CardholderName, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemValue" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Card.CardholderName, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Card.CardholderName, Converter={StaticResource stringHasValue}}" />
<Grid StyleClass="box-row" <Grid StyleClass="box-row"
IsVisible="{Binding Cipher.Card.Number, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Card.Number, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
@@ -273,19 +297,22 @@
Text="{u:I18n Number}" Text="{u:I18n Number}"
StyleClass="box-label" StyleClass="box-label"
Grid.Row="0" Grid.Row="0"
Grid.Column="0" /> Grid.Column="0"
AutomationId="ItemName" />
<controls:MonoLabel <controls:MonoLabel
Text="{Binding Cipher.Card.MaskedNumber, Mode=OneWay}" Text="{Binding Cipher.Card.MaskedNumber, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
Grid.Row="1" Grid.Row="1"
Grid.Column="0" Grid.Column="0"
IsVisible="{Binding ShowCardNumber, Converter={StaticResource inverseBool}}" /> IsVisible="{Binding ShowCardNumber, Converter={StaticResource inverseBool}}"
AutomationId="ItemValue" />
<controls:MonoLabel <controls:MonoLabel
Text="{Binding Cipher.Card.Number, Mode=OneWay}" Text="{Binding Cipher.Card.Number, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
Grid.Row="1" Grid.Row="1"
Grid.Column="0" Grid.Column="0"
IsVisible="{Binding ShowCardNumber}" /> IsVisible="{Binding ShowCardNumber}"
AutomationId="ItemValue" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowCardNumberIcon}" Text="{Binding ShowCardNumberIcon}"
@@ -294,7 +321,8 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ToggleVisibility}" /> AutomationProperties.Name="{u:I18n ToggleVisibility}"
AutomationId="ShowValueButton" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}" Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
@@ -304,34 +332,42 @@
Grid.Column="2" Grid.Column="2"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CopyNumber}" /> AutomationProperties.Name="{u:I18n CopyNumber}"
AutomationId="CopyValueButton" />
</Grid> </Grid>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Card.Number, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Card.Number, Converter={StaticResource stringHasValue}}" />
<StackLayout StyleClass="box-row" <StackLayout StyleClass="box-row"
IsVisible="{Binding Cipher.Card.Brand, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Card.Brand, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Label <Label
Text="{u:I18n Brand}" Text="{u:I18n Brand}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Card.Brand, Mode=OneWay}" Text="{Binding Cipher.Card.Brand, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemValue" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Card.Brand, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Card.Brand, Converter={StaticResource stringHasValue}}" />
<StackLayout StyleClass="box-row" <StackLayout StyleClass="box-row"
IsVisible="{Binding Cipher.Card.Expiration, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Card.Expiration, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Label <Label
Text="{u:I18n Expiration}" Text="{u:I18n Expiration}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Card.Expiration, Mode=OneWay}" Text="{Binding Cipher.Card.Expiration, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemValue" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Card.Expiration, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Card.Expiration, Converter={StaticResource stringHasValue}}" />
<Grid StyleClass="box-row" <Grid StyleClass="box-row"
IsVisible="{Binding Cipher.Card.Code, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Card.Code, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
@@ -345,19 +381,22 @@
Text="{u:I18n SecurityCode}" Text="{u:I18n SecurityCode}"
StyleClass="box-label" StyleClass="box-label"
Grid.Row="0" Grid.Row="0"
Grid.Column="0" /> Grid.Column="0"
AutomationId="ItemName" />
<controls:MonoLabel <controls:MonoLabel
Text="{Binding Cipher.Card.MaskedCode, Mode=OneWay}" Text="{Binding Cipher.Card.MaskedCode, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
Grid.Row="1" Grid.Row="1"
Grid.Column="0" Grid.Column="0"
IsVisible="{Binding ShowCardCode, Converter={StaticResource inverseBool}}" /> IsVisible="{Binding ShowCardCode, Converter={StaticResource inverseBool}}"
AutomationId="ItemValue" />
<controls:MonoLabel <controls:MonoLabel
Text="{Binding Cipher.Card.Code, Mode=OneWay}" Text="{Binding Cipher.Card.Code, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
Grid.Row="1" Grid.Row="1"
Grid.Column="0" Grid.Column="0"
IsVisible="{Binding ShowCardCode}" /> IsVisible="{Binding ShowCardCode}"
AutomationId="ItemValue" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowCardCodeIcon}" Text="{Binding ShowCardCodeIcon}"
@@ -366,7 +405,8 @@
Grid.Column="1" Grid.Column="1"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ToggleVisibility}" /> AutomationProperties.Name="{u:I18n ToggleVisibility}"
AutomationId="ShowValueButton" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}" Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
@@ -376,124 +416,156 @@
Grid.Column="2" Grid.Column="2"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CopySecurityCode}" /> AutomationProperties.Name="{u:I18n CopySecurityCode}"
AutomationId="CopyValueButton" />
</Grid> </Grid>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Card.Code, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Card.Code, Converter={StaticResource stringHasValue}}" />
</StackLayout> </StackLayout>
<StackLayout IsVisible="{Binding IsIdentity}" Spacing="0" Padding="0"> <StackLayout IsVisible="{Binding IsIdentity}" Spacing="0" Padding="0">
<StackLayout StyleClass="box-row" <StackLayout StyleClass="box-row"
IsVisible="{Binding Cipher.Identity.FullName, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Identity.FullName, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Label <Label
Text="{u:I18n IdentityName}" Text="{u:I18n IdentityName}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Identity.FullName, Mode=OneWay}" Text="{Binding Cipher.Identity.FullName, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemValue" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Identity.FullName, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Identity.FullName, Converter={StaticResource stringHasValue}}" />
<StackLayout StyleClass="box-row" <StackLayout StyleClass="box-row"
IsVisible="{Binding Cipher.Identity.Username, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Identity.Username, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Label <Label
Text="{u:I18n Username}" Text="{u:I18n Username}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Identity.Username, Mode=OneWay}" Text="{Binding Cipher.Identity.Username, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemValue" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Identity.Username, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Identity.Username, Converter={StaticResource stringHasValue}}" />
<StackLayout StyleClass="box-row" <StackLayout StyleClass="box-row"
IsVisible="{Binding Cipher.Identity.Company, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Identity.Company, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Label <Label
Text="{u:I18n Company}" Text="{u:I18n Company}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Identity.Company, Mode=OneWay}" Text="{Binding Cipher.Identity.Company, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemValue" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Identity.Company, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Identity.Company, Converter={StaticResource stringHasValue}}" />
<StackLayout StyleClass="box-row" <StackLayout StyleClass="box-row"
IsVisible="{Binding Cipher.Identity.SSN, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Identity.SSN, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Label <Label
Text="{u:I18n SSN}" Text="{u:I18n SSN}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Identity.SSN, Mode=OneWay}" Text="{Binding Cipher.Identity.SSN, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemValue" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Identity.SSN, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Identity.SSN, Converter={StaticResource stringHasValue}}" />
<StackLayout StyleClass="box-row" <StackLayout StyleClass="box-row"
IsVisible="{Binding Cipher.Identity.PassportNumber, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Identity.PassportNumber, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Label <Label
Text="{u:I18n PassportNumber}" Text="{u:I18n PassportNumber}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Identity.PassportNumber, Mode=OneWay}" Text="{Binding Cipher.Identity.PassportNumber, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemValue" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Identity.PassportNumber, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Identity.PassportNumber, Converter={StaticResource stringHasValue}}" />
<StackLayout StyleClass="box-row" <StackLayout StyleClass="box-row"
IsVisible="{Binding Cipher.Identity.LicenseNumber, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Identity.LicenseNumber, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Label <Label
Text="{u:I18n LicenseNumber}" Text="{u:I18n LicenseNumber}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Identity.LicenseNumber, Mode=OneWay}" Text="{Binding Cipher.Identity.LicenseNumber, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemValue" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Identity.LicenseNumber, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Identity.LicenseNumber, Converter={StaticResource stringHasValue}}" />
<StackLayout StyleClass="box-row" <StackLayout StyleClass="box-row"
IsVisible="{Binding Cipher.Identity.Email, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Identity.Email, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow">
<Label <Label
Text="{u:I18n Email}" Text="{u:I18n Email}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Identity.Email, Mode=OneWay}" Text="{Binding Cipher.Identity.Email, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemValue" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Identity.Email, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Identity.Email, Converter={StaticResource stringHasValue}}" />
<StackLayout StyleClass="box-row" <StackLayout StyleClass="box-row"
IsVisible="{Binding Cipher.Identity.Phone, Converter={StaticResource stringHasValue}}"> IsVisible="{Binding Cipher.Identity.Phone, Converter={StaticResource stringHasValue}}"
AutomationId="ItemRow" >
<Label <Label
Text="{u:I18n Phone}" Text="{u:I18n Phone}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Identity.Phone, Mode=OneWay}" Text="{Binding Cipher.Identity.Phone, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="ItemValue" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" <BoxView StyleClass="box-row-separator"
IsVisible="{Binding Cipher.Identity.Phone, Converter={StaticResource stringHasValue}}" /> IsVisible="{Binding Cipher.Identity.Phone, Converter={StaticResource stringHasValue}}" />
<StackLayout StyleClass="box-row" IsVisible="{Binding ShowIdentityAddress}"> <StackLayout StyleClass="box-row" IsVisible="{Binding ShowIdentityAddress}"
AutomationId="ItemRow">
<Label <Label
Text="{u:I18n Address}" Text="{u:I18n Address}"
StyleClass="box-label" /> StyleClass="box-label"
AutomationId="ItemName" />
<Label <Label
Text="{Binding Cipher.Identity.Address1, Mode=OneWay}" Text="{Binding Cipher.Identity.Address1, Mode=OneWay}"
IsVisible="{Binding Cipher.Identity.Address1, Converter={StaticResource stringHasValue}}" IsVisible="{Binding Cipher.Identity.Address1, Converter={StaticResource stringHasValue}}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="IdentityAddressOneLabel" />
<Label <Label
Text="{Binding Cipher.Identity.Address2, Mode=OneWay}" Text="{Binding Cipher.Identity.Address2, Mode=OneWay}"
IsVisible="{Binding Cipher.Identity.Address2, Converter={StaticResource stringHasValue}}" IsVisible="{Binding Cipher.Identity.Address2, Converter={StaticResource stringHasValue}}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="IdentityAddressTwoLabel" />
<Label <Label
Text="{Binding Cipher.Identity.Address3, Mode=OneWay}" Text="{Binding Cipher.Identity.Address3, Mode=OneWay}"
IsVisible="{Binding Cipher.Identity.Address3, Converter={StaticResource stringHasValue}}" IsVisible="{Binding Cipher.Identity.Address3, Converter={StaticResource stringHasValue}}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="IdentityAddressThreeLabel" />
<Label <Label
Text="{Binding Cipher.Identity.FullAddressPart2, Mode=OneWay}" Text="{Binding Cipher.Identity.FullAddressPart2, Mode=OneWay}"
IsVisible="{Binding Cipher.Identity.FullAddressPart2, Converter={StaticResource stringHasValue}}" IsVisible="{Binding Cipher.Identity.FullAddressPart2, Converter={StaticResource stringHasValue}}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="IdentityFullAddressPartTwoLabel" />
<Label <Label
Text="{Binding Cipher.Identity.Country, Mode=OneWay}" Text="{Binding Cipher.Identity.Country, Mode=OneWay}"
IsVisible="{Binding Cipher.Identity.Country, Converter={StaticResource stringHasValue}}" IsVisible="{Binding Cipher.Identity.Country, Converter={StaticResource stringHasValue}}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="IdentityCountryLabel" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" IsVisible="{Binding ShowIdentityAddress}" /> <BoxView StyleClass="box-row-separator" IsVisible="{Binding ShowIdentityAddress}" />
</StackLayout> </StackLayout>
@@ -503,11 +575,11 @@
<Label Text="{u:I18n URIs, Header=True}" <Label Text="{u:I18n URIs, Header=True}"
StyleClass="box-header, box-header-platform" /> StyleClass="box-header, box-header-platform" />
</StackLayout> </StackLayout>
<controls:RepeaterView ItemsSource="{Binding Cipher.Login.Uris}"> <controls:RepeaterView ItemsSource="{Binding Cipher.Login.Uris}" AutomationId="CipherUriContainer">
<controls:RepeaterView.ItemTemplate> <controls:RepeaterView.ItemTemplate>
<DataTemplate x:DataType="views:LoginUriView"> <DataTemplate x:DataType="views:LoginUriView">
<StackLayout Spacing="0" Padding="0"> <StackLayout Spacing="0" Padding="0">
<Grid StyleClass="box-row"> <Grid StyleClass="box-row" AutomationId="UriRow">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
@@ -533,7 +605,8 @@
Text="{Binding HostOrUri, Mode=OneWay}" Text="{Binding HostOrUri, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
Grid.Row="1" Grid.Row="1"
Grid.Column="0" /> Grid.Column="0"
AutomationId="UriValue" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.ShareSquare}}" Text="{Binding Source={x:Static core:BitwardenIcons.ShareSquare}}"
@@ -544,7 +617,8 @@
Grid.RowSpan="2" Grid.RowSpan="2"
IsVisible="{Binding CanLaunch, Mode=OneWay}" IsVisible="{Binding CanLaunch, Mode=OneWay}"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Launch}" /> AutomationProperties.Name="{u:I18n Launch}"
AutomationId="LaunchUriButton" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}" Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
@@ -554,7 +628,8 @@
Grid.Column="2" Grid.Column="2"
Grid.RowSpan="2" Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Copy}" /> AutomationProperties.Name="{u:I18n Copy}"
AutomationId="CopyUriButton" />
</Grid> </Grid>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
</StackLayout> </StackLayout>
@@ -568,14 +643,15 @@
<Label Text="{u:I18n Notes, Header=True}" <Label Text="{u:I18n Notes, Header=True}"
StyleClass="box-header, box-header-platform" /> StyleClass="box-header, box-header-platform" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row"> <StackLayout StyleClass="box-row" AutomationId="NotesRow">
<controls:SelectableLabel <controls:SelectableLabel
Text="{Binding Cipher.Notes, Mode=OneWay}" Text="{Binding Cipher.Notes, Mode=OneWay}"
StyleClass="box-value" /> StyleClass="box-value"
AutomationId="CipherNotesLabel" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box" IsVisible="{Binding Cipher.HasFields}"> <StackLayout StyleClass="box" IsVisible="{Binding Cipher.HasFields}" AutomationId="CustomFieldsContainer">
<StackLayout StyleClass="box-row-header"> <StackLayout StyleClass="box-row-header">
<Label Text="{u:I18n CustomFields, Header=True}" <Label Text="{u:I18n CustomFields, Header=True}"
StyleClass="box-header, box-header-platform" /> StyleClass="box-header, box-header-platform" />
@@ -590,21 +666,23 @@
<Label Text="{u:I18n Attachments, Header=True}" <Label Text="{u:I18n Attachments, Header=True}"
StyleClass="box-header, box-header-platform" /> StyleClass="box-header, box-header-platform" />
</StackLayout> </StackLayout>
<controls:RepeaterView ItemsSource="{Binding Cipher.Attachments}"> <controls:RepeaterView ItemsSource="{Binding Cipher.Attachments}" AutomationId="CipherAttachmentsContainer">
<controls:RepeaterView.ItemTemplate> <controls:RepeaterView.ItemTemplate>
<DataTemplate x:DataType="views:AttachmentView"> <DataTemplate x:DataType="views:AttachmentView">
<StackLayout Spacing="0" Padding="0"> <StackLayout Spacing="0" Padding="0">
<StackLayout Orientation="Horizontal" StyleClass="box-row" Spacing="10"> <StackLayout Orientation="Horizontal" StyleClass="box-row" Spacing="10" AutomationId="CipherAttachment">
<Label <Label
Text="{Binding FileName, Mode=OneWay}" Text="{Binding FileName, Mode=OneWay}"
StyleClass="box-value" StyleClass="box-value"
VerticalTextAlignment="Center" VerticalTextAlignment="Center"
HorizontalOptions="StartAndExpand" /> HorizontalOptions="StartAndExpand"
AutomationId="CipherAttachmentFileNameLabel" />
<Label <Label
Text="{Binding SizeName, Mode=OneWay}" Text="{Binding SizeName, Mode=OneWay}"
StyleClass="box-sub-label" StyleClass="box-sub-label"
HorizontalTextAlignment="End" HorizontalTextAlignment="End"
VerticalTextAlignment="Center" /> VerticalTextAlignment="Center"
AutomationId="CipherAttachmentFileSizeLabel" />
<controls:IconButton <controls:IconButton
StyleClass="box-row-button, box-row-button-platform" StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Download}}" Text="{Binding Source={x:Static core:BitwardenIcons.Download}}"
@@ -612,7 +690,8 @@
CommandParameter="{Binding .}" CommandParameter="{Binding .}"
VerticalOptions="Center" VerticalOptions="Center"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Download}" /> AutomationProperties.Name="{u:I18n Download}"
AutomationId="CipherAttachmentDownloadButton" />
</StackLayout> </StackLayout>
<BoxView StyleClass="box-row-separator" /> <BoxView StyleClass="box-row-separator" />
</StackLayout> </StackLayout>
@@ -622,17 +701,20 @@
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-bottom"> <StackLayout StyleClass="box-bottom">
<Label FormattedText="{Binding UpdatedText}" <Label FormattedText="{Binding UpdatedText}"
StyleClass="box-footer-label" /> StyleClass="box-footer-label"
AutomationId="CipherUpdatedDateLabel" />
<Label FormattedText="{Binding PasswordUpdatedText}" <Label FormattedText="{Binding PasswordUpdatedText}"
StyleClass="box-footer-label" StyleClass="box-footer-label"
IsVisible="{Binding Cipher.PasswordRevisionDisplayDate, Converter={StaticResource notNull}}"> IsVisible="{Binding Cipher.PasswordRevisionDisplayDate, Converter={StaticResource notNull}}"
AutomationId="CipherUpdatedPasswordDateLabel">
<Label.GestureRecognizers> <Label.GestureRecognizers>
<TapGestureRecognizer Tapped="PasswordHistory_Tapped" /> <TapGestureRecognizer Tapped="PasswordHistory_Tapped" />
</Label.GestureRecognizers> </Label.GestureRecognizers>
</Label> </Label>
<Label FormattedText="{Binding PasswordHistoryText}" <Label FormattedText="{Binding PasswordHistoryText}"
StyleClass="box-footer-label" StyleClass="box-footer-label"
IsVisible="{Binding Cipher.HasPasswordHistory}"> IsVisible="{Binding Cipher.HasPasswordHistory}"
AutomationId="CipherPasswordHistoryLabel">
<Label.GestureRecognizers> <Label.GestureRecognizers>
<TapGestureRecognizer Tapped="PasswordHistory_Tapped" /> <TapGestureRecognizer Tapped="PasswordHistory_Tapped" />
</Label.GestureRecognizers> </Label.GestureRecognizers>
@@ -662,6 +744,7 @@
AbsoluteLayout.LayoutBounds="1, 1, AutoSize, AutoSize" AbsoluteLayout.LayoutBounds="1, 1, AutoSize, AutoSize"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n EditItem}" AutomationProperties.Name="{u:I18n EditItem}"
AutomationId="CipherEditButton"
IsVisible="{Binding CanEdit}"> IsVisible="{Binding CanEdit}">
<Button.Effects> <Button.Effects>
<effects:FabShadowEffect /> <effects:FabShadowEffect />

View File

@@ -19,7 +19,8 @@
Priority="-1" Priority="-1"
UseOriginalImage="True" UseOriginalImage="True"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Account}" /> AutomationProperties.Name="{u:I18n Account}"
AutomationId="AccountIconButton" />
<ToolbarItem IconImageSource="search.png" Clicked="Search_Clicked" <ToolbarItem IconImageSource="search.png" Clicked="Search_Clicked"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Search}" /> AutomationProperties.Name="{u:I18n Search}" />

View File

@@ -41,7 +41,8 @@
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
TextChanged="SearchBar_TextChanged" TextChanged="SearchBar_TextChanged"
SearchButtonPressed="SearchBar_SearchButtonPressed" SearchButtonPressed="SearchBar_SearchButtonPressed"
Placeholder="{Binding PageTitle}" /> Placeholder="{Binding PageTitle}"
AutomationId="SearchBar" />
</StackLayout> </StackLayout>
<BoxView StyleClass="list-section-separator-bottom, list-section-separator-bottom-platform" <BoxView StyleClass="list-section-separator-bottom, list-section-separator-bottom-platform"
x:Name="_separator" x:Key="separator" /> x:Name="_separator" x:Key="separator" />
@@ -91,7 +92,8 @@
Source="empty_items_state" /> Source="empty_items_state" />
<Label <Label
Text="{u:I18n ThereAreNoItemsThatMatchTheSearch}" Text="{u:I18n ThereAreNoItemsThatMatchTheSearch}"
HorizontalTextAlignment="Center" /> HorizontalTextAlignment="Center"
AutomationId="NoSearchResultsLabel" />
<Button <Button
Text="{u:I18n AddAnItem}" Text="{u:I18n AddAnItem}"
Command="{Binding AddCipherCommand}" Command="{Binding AddCipherCommand}"
@@ -104,7 +106,8 @@
SelectionMode="Single" SelectionMode="Single"
SelectionChanged="RowSelected" SelectionChanged="RowSelected"
StyleClass="list, list-platform" StyleClass="list, list-platform"
ExtraDataForLogging="Ciphers Page"> ExtraDataForLogging="Ciphers Page"
AutomationId="CipherList">
<CollectionView.ItemTemplate> <CollectionView.ItemTemplate>
<DataTemplate x:DataType="views:CipherView"> <DataTemplate x:DataType="views:CipherView">
<controls:CipherViewCell <controls:CipherViewCell

View File

@@ -25,7 +25,8 @@
Priority="-1" Priority="-1"
UseOriginalImage="True" UseOriginalImage="True"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Account}" /> AutomationProperties.Name="{u:I18n Account}"
AutomationId="AccountIconButton" />
<ToolbarItem Icon="search.png" Clicked="Search_Clicked" <ToolbarItem Icon="search.png" Clicked="Search_Clicked"
AutomationProperties.IsInAccessibleTree="True" AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Search}" /> AutomationProperties.Name="{u:I18n Search}" />
@@ -59,13 +60,14 @@
<controls:AuthenticatorViewCell <controls:AuthenticatorViewCell
Cipher="{Binding Cipher}" Cipher="{Binding Cipher}"
WebsiteIconsEnabled="{Binding BindingContext.WebsiteIconsEnabled, Source={x:Reference _page}}" WebsiteIconsEnabled="{Binding BindingContext.WebsiteIconsEnabled, Source={x:Reference _page}}"
TotpSec="{Binding TotpSec}"/> TotpSec="{Binding TotpSec}" />
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="groupTemplate" <DataTemplate x:Key="groupTemplate"
x:DataType="pages:GroupingsPageListItem"> x:DataType="pages:GroupingsPageListItem">
<controls:ExtendedStackLayout Orientation="Horizontal" <controls:ExtendedStackLayout Orientation="Horizontal"
StyleClass="list-row, list-row-platform"> StyleClass="list-row, list-row-platform"
AutomationId="{Binding AutomationId}">
<controls:IconLabel Text="{Binding Icon, Mode=OneWay}" <controls:IconLabel Text="{Binding Icon, Mode=OneWay}"
HorizontalOptions="Start" HorizontalOptions="Start"
VerticalOptions="Center" VerticalOptions="Center"
@@ -79,12 +81,14 @@
LineBreakMode="TailTruncation" LineBreakMode="TailTruncation"
HorizontalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
StyleClass="list-title"/> StyleClass="list-title"
AutomationId="ItemNameLabel" />
<Label Text="{Binding ItemCount, Mode=OneWay}" <Label Text="{Binding ItemCount, Mode=OneWay}"
HorizontalOptions="End" HorizontalOptions="End"
VerticalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"
HorizontalTextAlignment="End" HorizontalTextAlignment="End"
StyleClass="list-sub"/> StyleClass="list-sub"
AutomationId="ItemCountLabel" />
</controls:ExtendedStackLayout> </controls:ExtendedStackLayout>
</DataTemplate> </DataTemplate>
@@ -95,7 +99,8 @@
Spacing="0" Spacing="0"
Padding="0" Padding="0"
VerticalOptions="FillAndExpand" VerticalOptions="FillAndExpand"
StyleClass="list-row-header-container, list-row-header-container-platform"> StyleClass="list-row-header-container, list-row-header-container-platform"
AutomationId="{Binding AutomationId}">
<BoxView <BoxView
StyleClass="list-section-separator-top, list-section-separator-top-platform" /> StyleClass="list-section-separator-top, list-section-separator-top-platform" />
<StackLayout StyleClass="list-row-header, list-row-header-platform"> <StackLayout StyleClass="list-row-header, list-row-header-platform">
@@ -104,7 +109,8 @@
StyleClass="list-header, list-header-platform" /> StyleClass="list-header, list-header-platform" />
<Label <Label
Text="{Binding ItemCount}" Text="{Binding ItemCount}"
StyleClass="list-header-sub" /> StyleClass="list-header-sub"
AutomationId="SectionItemCount" />
</StackLayout> </StackLayout>
<BoxView StyleClass="list-section-separator-bottom, list-section-separator-bottom-platform" /> <BoxView StyleClass="list-section-separator-bottom, list-section-separator-bottom-platform" />
</StackLayout> </StackLayout>
@@ -147,7 +153,8 @@
IsVisible="{Binding ShowNoData}"> IsVisible="{Binding ShowNoData}">
<Label <Label
Text="{Binding NoDataText}" Text="{Binding NoDataText}"
HorizontalTextAlignment="Center"></Label> HorizontalTextAlignment="Center"
AutomationId="NoDataDisplayed"></Label>
<Button <Button
Text="{u:I18n AddAnItem}" Text="{u:I18n AddAnItem}"
Clicked="AddButton_Clicked" Clicked="AddButton_Clicked"

View File

@@ -1,4 +1,6 @@
namespace Bit.App.Pages using Bit.App.Utilities.Automation;
namespace Bit.App.Pages
{ {
public class GroupingsPageHeaderListItem : IGroupingsPageListItem public class GroupingsPageHeaderListItem : IGroupingsPageListItem
{ {
@@ -10,5 +12,12 @@
public string Title { get; } public string Title { get; }
public string ItemCount { get; set; } public string ItemCount { get; set; }
public string AutomationId
{
get
{
return AutomationIdsHelper.AddSuffixFor(AutomationIdsHelper.ToEnglishTitleCase(Title), SuffixType.Header);
}
}
} }
} }

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Bit.App.Utilities.Automation;
namespace Bit.App.Pages namespace Bit.App.Pages
{ {
@@ -32,5 +33,6 @@ namespace Bit.App.Pages
public string Name { get; set; } public string Name { get; set; }
public string NameShort => string.IsNullOrWhiteSpace(Name) || Name.Length == 0 ? "-" : Name[0].ToString(); public string NameShort => string.IsNullOrWhiteSpace(Name) || Name.Length == 0 ? "-" : Name[0].ToString();
public string ItemCount { get; set; } public string ItemCount { get; set; }
public string AutomationId => AutomationIdsHelper.AddSuffixFor(NameShort, SuffixType.ListGroup);
} }
} }

View File

@@ -1,4 +1,5 @@
using Bit.App.Resources; using Bit.App.Resources;
using Bit.App.Utilities.Automation;
using Bit.Core; using Bit.Core;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Models.View; using Bit.Core.Models.View;
@@ -115,5 +116,38 @@ namespace Bit.App.Pages
return _icon; return _icon;
} }
} }
public string AutomationId
{
get
{
if (Type != null)
{
return AutomationIdsHelper.AddSuffixFor(System.Enum.GetName(typeof(CipherType), Type.Value), SuffixType.Filter);
}
if (IsTrash)
{
return AutomationIdsHelper.AddSuffixFor("Trash", SuffixType.Filter);
}
if (Folder != null)
{
return AutomationIdsHelper.AddSuffixFor("Folder", SuffixType.Filter);
}
if (Collection != null)
{
return AutomationIdsHelper.AddSuffixFor("Collection", SuffixType.Filter);
}
if (IsTotpCode)
{
return AutomationIdsHelper.AddSuffixFor("TOTP", SuffixType.ListItem);
}
return null;
}
}
} }
} }

View File

@@ -3262,6 +3262,24 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Invalid API key.
/// </summary>
public static string InvalidAPIKey {
get {
return ResourceManager.GetString("InvalidAPIKey", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Invalid API token.
/// </summary>
public static string InvalidAPIToken {
get {
return ResourceManager.GetString("InvalidAPIToken", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Invalid email address.. /// Looks up a localized string similar to Invalid email address..
/// </summary> /// </summary>
@@ -3541,15 +3559,6 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Load from file.
/// </summary>
public static string LoadFromFile {
get {
return ResourceManager.GetString("LoadFromFile", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Loading. /// Looks up a localized string similar to Loading.
/// </summary> /// </summary>
@@ -6444,7 +6453,7 @@ namespace Bit.App.Resources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve. /// Looks up a localized string similar to Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve..
/// </summary> /// </summary>
public static string UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve { public static string UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve {
get { get {

View File

@@ -2634,6 +2634,12 @@ Wil u na die rekening omskakel?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2633,6 +2633,12 @@ Bu hesaba keçmək istəyirsiniz?</value>
<value>Ana parolu təkrar soruş köməyi</value> <value>Ana parolu təkrar soruş köməyi</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Yetərsiz yaddaşa görə kilid açma uğursuz ola bilər. Həll etmək üçün KDF yaddaş tənzimləmələrinizi azaldın</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Yararsız API açarı</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Yararsız API tokeni</value>
</data> </data>
</root> </root>

View File

@@ -2636,4 +2636,10 @@
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Па прычыне недахопу памяці можа адбыцца збой разблакіроўкі. Паменшыце налады памяці KDF, каб вырашыць гэту праблему</value> <value>Па прычыне недахопу памяці можа адбыцца збой разблакіроўкі. Паменшыце налады памяці KDF, каб вырашыць гэту праблему</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Памылковы ключ API</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Памылковы токен API</value>
</data>
</root> </root>

View File

@@ -2636,4 +2636,10 @@ select Add TOTP to store the key safely</value>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Отключването може да бъде неуспешно заради недостатъчно памет. Намалете настройките на паметта за KDF, за да разрешите проблема.</value> <value>Отключването може да бъде неуспешно заради недостатъчно памет. Намалете настройките на паметта за KDF, за да разрешите проблема.</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Неправилен ключ за ППИ</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Неправилен идентификатор за ППИ</value>
</data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2633,6 +2633,12 @@ Skeniranje će biti izvršeno automatski.</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2636,4 +2636,10 @@ Voleu canviar a aquest compte?</value>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>El desbloqueig pot fallar a causa de memòria insuficient. Disminueix la configuració de memòria KDF per resoldre-ho</value> <value>El desbloqueig pot fallar a causa de memòria insuficient. Disminueix la configuració de memòria KDF per resoldre-ho</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Clau API no vàlida</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Token API no vàlid</value>
</data>
</root> </root>

View File

@@ -2635,4 +2635,10 @@ Chcete se přepnout na tento účet?</value>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Odemknutí může selhat z důvodu nedostatku paměti. Pro vyřešení snižte nastavení paměti KDF.</value> <value>Odemknutí může selhat z důvodu nedostatku paměti. Pro vyřešení snižte nastavení paměti KDF.</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Neplatný klíč API</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Neplatný token API</value>
</data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2636,4 +2636,10 @@ Vil du skifte til denne konto?</value>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Oplåsning kan fejle grundet utilstrækkelig hukommelse. Reducér KDF-hukommelsesindstillinger for at afhjælpe</value> <value>Oplåsning kan fejle grundet utilstrækkelig hukommelse. Reducér KDF-hukommelsesindstillinger for at afhjælpe</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Ugyldig API-nøgle</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Ugyldigt API-token</value>
</data>
</root> </root>

View File

@@ -2635,4 +2635,10 @@ Möchtest du zu diesem Konto wechseln?</value>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Das Entsperren kann aufgrund von unzureichendem Arbeitsspeicher fehlschlagen. Verringere deine KDF-Speichereinstellungen, um das Problem zu beheben.</value> <value>Das Entsperren kann aufgrund von unzureichendem Arbeitsspeicher fehlschlagen. Verringere deine KDF-Speichereinstellungen, um das Problem zu beheben.</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Ungültiger API-Schlüssel</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Ungültiger API-Token</value>
</data>
</root> </root>

View File

@@ -2610,16 +2610,16 @@
<value>Δεν υπάρχουν στοιχεία που να ταιριάζουν με την αναζήτηση</value> <value>Δεν υπάρχουν στοιχεία που να ταιριάζουν με την αναζήτηση</value>
</data> </data>
<data name="US" xml:space="preserve"> <data name="US" xml:space="preserve">
<value>US</value> <value>ΗΠΑ</value>
</data> </data>
<data name="EU" xml:space="preserve"> <data name="EU" xml:space="preserve">
<value>EU</value> <value>ΕΕ</value>
</data> </data>
<data name="SelfHosted" xml:space="preserve"> <data name="SelfHosted" xml:space="preserve">
<value>Self-hosted</value> <value>Αυτο-φιλοξενούμενο</value>
</data> </data>
<data name="DataRegion" xml:space="preserve"> <data name="DataRegion" xml:space="preserve">
<value>Data region</value> <value>Περιοχή δεδομένων</value>
</data> </data>
<data name="Region" xml:space="preserve"> <data name="Region" xml:space="preserve">
<value>Περιοχή</value> <value>Περιοχή</value>
@@ -2634,6 +2634,12 @@
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2634,6 +2634,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2648,6 +2648,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -775,10 +775,10 @@
<value>Activado</value> <value>Activado</value>
</data> </data>
<data name="Off" xml:space="preserve"> <data name="Off" xml:space="preserve">
<value>Apagado</value> <value>No</value>
</data> </data>
<data name="On" xml:space="preserve"> <data name="On" xml:space="preserve">
<value>Activado</value> <value></value>
</data> </data>
<data name="Status" xml:space="preserve"> <data name="Status" xml:space="preserve">
<value>Estado</value> <value>Estado</value>
@@ -2632,9 +2632,15 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
<value>Contraseña maestra actual</value> <value>Contraseña maestra actual</value>
</data> </data>
<data name="MasterPasswordRePromptHelp" xml:space="preserve"> <data name="MasterPasswordRePromptHelp" xml:space="preserve">
<value>Master password re-prompt help</value> <value>Ayuda de volver a pedir contraseña maestra</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>El desbloqueo puede fallar por falta de memoria. Disminuye los ajustes de memoria KDF para resolver</value> <value>El desbloqueo puede fallar por falta de memoria. Disminuye los ajustes de memoria KDF para resolver</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Clave API no válida</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Token de API no válido</value>
</data>
</root> </root>

View File

@@ -2496,7 +2496,7 @@ Soovid selle konto peale lülituda?</value>
<value>Tuleta ülemparooli vihjega meelde</value> <value>Tuleta ülemparooli vihjega meelde</value>
</data> </data>
<data name="LoggingInAsXOnY" xml:space="preserve"> <data name="LoggingInAsXOnY" xml:space="preserve">
<value>Logging in as {0} on {1}</value> <value>Sisselogimas kui {0} lehel {1}</value>
</data> </data>
<data name="NotYou" xml:space="preserve"> <data name="NotYou" xml:space="preserve">
<value>Pole sina?</value> <value>Pole sina?</value>
@@ -2610,19 +2610,19 @@ Soovid selle konto peale lülituda?</value>
<value>Otsingusõnale ei vasta kirjeid</value> <value>Otsingusõnale ei vasta kirjeid</value>
</data> </data>
<data name="US" xml:space="preserve"> <data name="US" xml:space="preserve">
<value>US</value> <value>USA</value>
</data> </data>
<data name="EU" xml:space="preserve"> <data name="EU" xml:space="preserve">
<value>EU</value> <value>EL</value>
</data> </data>
<data name="SelfHosted" xml:space="preserve"> <data name="SelfHosted" xml:space="preserve">
<value>Self-hosted</value> <value>Enda majutatud</value>
</data> </data>
<data name="DataRegion" xml:space="preserve"> <data name="DataRegion" xml:space="preserve">
<value>Data region</value> <value>Andmete salvestamise piirkond</value>
</data> </data>
<data name="Region" xml:space="preserve"> <data name="Region" xml:space="preserve">
<value>Region</value> <value>Piirkond</value>
</data> </data>
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve"> <data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
<value>Sinu ülemparool ei vasta ühele või rohkemale organisatsiooni poolt seatud poliitikale. Hoidlale ligipääsemiseks pead oma ülemaprooli uuendama. Jätkamisel logitakse sind praegusest sessioonist välja, mistõttu pead uuesti sisse logima. Teistes seadmetes olevad aktiivsed sessioonid aeguvad umbes ühe tunni jooksul.</value> <value>Sinu ülemparool ei vasta ühele või rohkemale organisatsiooni poolt seatud poliitikale. Hoidlale ligipääsemiseks pead oma ülemaprooli uuendama. Jätkamisel logitakse sind praegusest sessioonist välja, mistõttu pead uuesti sisse logima. Teistes seadmetes olevad aktiivsed sessioonid aeguvad umbes ühe tunni jooksul.</value>
@@ -2634,6 +2634,12 @@ Soovid selle konto peale lülituda?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Vigane API võti</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Vigane API token</value>
</data> </data>
</root> </root>

View File

@@ -2633,6 +2633,12 @@ Kontu honetara aldatu nahi duzu?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2497,7 +2497,7 @@
<value>دریافت یادآور کلمه عبور اصلی</value> <value>دریافت یادآور کلمه عبور اصلی</value>
</data> </data>
<data name="LoggingInAsXOnY" xml:space="preserve"> <data name="LoggingInAsXOnY" xml:space="preserve">
<value>Logging in as {0} on {1}</value> <value>درحال وارد شدن به عنوان {0} در {1}</value>
</data> </data>
<data name="NotYou" xml:space="preserve"> <data name="NotYou" xml:space="preserve">
<value>شما نیستید؟</value> <value>شما نیستید؟</value>
@@ -2611,19 +2611,19 @@
<value>هیچ موردی وجود ندارد که با جستجو مطابقت داشته باشد</value> <value>هیچ موردی وجود ندارد که با جستجو مطابقت داشته باشد</value>
</data> </data>
<data name="US" xml:space="preserve"> <data name="US" xml:space="preserve">
<value>US</value> <value>امریکا</value>
</data> </data>
<data name="EU" xml:space="preserve"> <data name="EU" xml:space="preserve">
<value>EU</value> <value>اروپا</value>
</data> </data>
<data name="SelfHosted" xml:space="preserve"> <data name="SelfHosted" xml:space="preserve">
<value>Self-hosted</value> <value>خود میزبان</value>
</data> </data>
<data name="DataRegion" xml:space="preserve"> <data name="DataRegion" xml:space="preserve">
<value>Data region</value> <value>منطقه داده</value>
</data> </data>
<data name="Region" xml:space="preserve"> <data name="Region" xml:space="preserve">
<value>Region</value> <value>منطقه</value>
</data> </data>
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve"> <data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
<value>کلمه عبور اصلی شما با یک یا چند سیاست سازمان‌تان مطابقت ندارد. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روز کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند.</value> <value>کلمه عبور اصلی شما با یک یا چند سیاست سازمان‌تان مطابقت ندارد. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روز کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند.</value>
@@ -2632,9 +2632,15 @@
<value>کلمه عبور اصلی فعلی</value> <value>کلمه عبور اصلی فعلی</value>
</data> </data>
<data name="MasterPasswordRePromptHelp" xml:space="preserve"> <data name="MasterPasswordRePromptHelp" xml:space="preserve">
<value>Master password re-prompt help</value> <value>راهنمای درخواست مجدد کلمه عبور اصلی</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>باز کردن قفل ممکن است به دلیل حافظه ناکافی انجام شود. تنظیمات حافظه KDF خود را کاهش دهید تا حل شود.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -937,7 +937,7 @@ Koodi luetaan automaattisesti.</value>
<value>Tiedosto</value> <value>Tiedosto</value>
</data> </data>
<data name="NoFileChosen" xml:space="preserve"> <data name="NoFileChosen" xml:space="preserve">
<value>Ei valittua tiedostoa</value> <value>Tiedostoa ei ole valittu.</value>
</data> </data>
<data name="NoAttachments" xml:space="preserve"> <data name="NoAttachments" xml:space="preserve">
<value>Ei liitteitä.</value> <value>Ei liitteitä.</value>
@@ -1762,7 +1762,7 @@ Koodi luetaan automaattisesti.</value>
<value>Synkronoi holvi päivityksen yhteydessä</value> <value>Synkronoi holvi päivityksen yhteydessä</value>
</data> </data>
<data name="EnableSyncOnRefreshDescription" xml:space="preserve"> <data name="EnableSyncOnRefreshDescription" xml:space="preserve">
<value>Synkronoidaan holvi alasveto-eleellä.</value> <value>Holvi synkronoidaan myös alasveto-eleellä suoritettavan päivityksen yhteydessä.</value>
</data> </data>
<data name="LogInSso" xml:space="preserve"> <data name="LogInSso" xml:space="preserve">
<value>Yrityksen kertakirjautuminen (SSO)</value> <value>Yrityksen kertakirjautuminen (SSO)</value>
@@ -2367,7 +2367,7 @@ turvallisesti valitsemalla "Lisää TOTP"</value>
<value>Hyväksy kirjautumispyyntöjä</value> <value>Hyväksy kirjautumispyyntöjä</value>
</data> </data>
<data name="UseThisDeviceToApproveLoginRequestsMadeFromOtherDevices" xml:space="preserve"> <data name="UseThisDeviceToApproveLoginRequestsMadeFromOtherDevices" xml:space="preserve">
<value>Hyväksy muiden laitteiden kirjautumispyynnöt tältä laitteelta.</value> <value>Hyväksy laitteiden kirjautumispyyntöjä tältä laitteelta</value>
</data> </data>
<data name="AllowNotifications" xml:space="preserve"> <data name="AllowNotifications" xml:space="preserve">
<value>Salli ilmoitukset</value> <value>Salli ilmoitukset</value>
@@ -2542,7 +2542,7 @@ Haluatko vaihtaa tähän tiliin?</value>
<value>Pyynnöt hylättiin</value> <value>Pyynnöt hylättiin</value>
</data> </data>
<data name="NoPendingRequests" xml:space="preserve"> <data name="NoPendingRequests" xml:space="preserve">
<value>Ei odottavia pyyntöjä</value> <value>Odottavia pyyntöjä ei ole</value>
</data> </data>
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve"> <data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
<value>Myönnä kameran käyttöoikeus skannerin käyttämiseksi</value> <value>Myönnä kameran käyttöoikeus skannerin käyttämiseksi</value>
@@ -2554,7 +2554,7 @@ Haluatko vaihtaa tähän tiliin?</value>
<value>Kieleksi vaihdettiin {0}. Käynnistä sovellus uudelleen nähdäksesi muutoksen.</value> <value>Kieleksi vaihdettiin {0}. Käynnistä sovellus uudelleen nähdäksesi muutoksen.</value>
</data> </data>
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve"> <data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
<value>Kielen vaihto edellyttää sovelluksen uudelleenkäynnistyksen</value> <value>Kielen vaihto vaatii sovelluksen uudelleenkäynnistyksen.</value>
</data> </data>
<data name="DefaultSystem" xml:space="preserve"> <data name="DefaultSystem" xml:space="preserve">
<value>Oletus (järjestelmä)</value> <value>Oletus (järjestelmä)</value>
@@ -2635,6 +2635,12 @@ Haluatko vaihtaa tähän tiliin?</value>
<value>Pääsalasanan uudelleenkyselyn ohje</value> <value>Pääsalasanan uudelleenkyselyn ohje</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Lukituksen avaus voi epäonnistua riittämättömän keskusmuistin vuoksi. Tämän välttämiseksi voit madaltaa KDF-muistiasetuksiasi.</value> <value>Lukituksen avaus voi epäonnistua riittämättömän keskusmuistin vuoksi. Korjaa madaltamalla KDF-muistiasetuksiasi.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Virheellinen API-avain</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Virheellinen API-tunniste</value>
</data> </data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Gusto mo bang pumunta sa account na ito?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2637,4 +2637,10 @@ Voulez-vous basculer vers ce compte ?</value>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Le déverrouillage peut échouer en raison d'une mémoire insuffisante. Diminuez les paramètres de mémoire KDF pour y remédier</value> <value>Le déverrouillage peut échouer en raison d'une mémoire insuffisante. Diminuez les paramètres de mémoire KDF pour y remédier</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Clé API invalide</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Jeton API invalide</value>
</data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2637,6 +2637,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2632,6 +2632,12 @@
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2635,4 +2635,10 @@ Szeretnénk átváltani erre a fiókra?</value>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>A feloldás meghiúsulhat, mert nincs elegendő memória. A megoldáshoz csökkentsül a KDF memóriabeállításait.</value> <value>A feloldás meghiúsulhat, mert nincs elegendő memória. A megoldáshoz csökkentsül a KDF memóriabeállításait.</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Érvénytelen API kulcs</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Érvénytelen API vezérjel</value>
</data>
</root> </root>

View File

@@ -2634,6 +2634,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2613,7 +2613,7 @@ Vuoi passare a questo account?</value>
<value>US</value> <value>US</value>
</data> </data>
<data name="EU" xml:space="preserve"> <data name="EU" xml:space="preserve">
<value>UE</value> <value>EU</value>
</data> </data>
<data name="SelfHosted" xml:space="preserve"> <data name="SelfHosted" xml:space="preserve">
<value>Self-hosted</value> <value>Self-hosted</value>
@@ -2631,9 +2631,15 @@ Vuoi passare a questo account?</value>
<value>Password principale corrente</value> <value>Password principale corrente</value>
</data> </data>
<data name="MasterPasswordRePromptHelp" xml:space="preserve"> <data name="MasterPasswordRePromptHelp" xml:space="preserve">
<value>Auto per chiedere la password principale di nuovo</value> <value>Aiuto per chiedere la password principale di nuovo</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Lo sblocco potrebbe fallire a causa di memoria insufficiente. Riduci le impostazioni della memoria KDF per risolvere il problema</value> <value>Lo sblocco potrebbe fallire a causa di memoria insufficiente. Riduci le impostazioni della memoria KDF per risolvere il problema</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Chiave API non valida</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Token API non valido</value>
</data>
</root> </root>

View File

@@ -2636,4 +2636,10 @@
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>メモリ不足のためロック解除に失敗することがあります。KDF のメモリ設定を減らして解決してください</value> <value>メモリ不足のためロック解除に失敗することがあります。KDF のメモリ設定を減らして解決してください</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>無効な API キー</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>無効な API トークン</value>
</data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2634,6 +2634,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Ar norite pereiti prie šios paskyros?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2636,4 +2636,10 @@ Vai pārslēgties uz šo kontu?</value>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Atslēgšana var neizdoties nepietiekamas atmiņas dēļ. Lai to novērstu, jāsamazina KDF atmiņas iestatījmi</value> <value>Atslēgšana var neizdoties nepietiekamas atmiņas dēļ. Lai to novērstu, jāsamazina KDF atmiņas iestatījmi</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Nederīga API atslēga</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Nederīga API pilnvara</value>
</data>
</root> </root>

View File

@@ -2634,6 +2634,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Vil du bytte til denne kontoen?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2636,4 +2636,10 @@ Wilt u naar dit account wisselen?</value>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Ontgrendelen kan mislukken als er onvoldoende geheugen is. Verminder je KDF-geheugeninstellingen om dit op te lossen</value> <value>Ontgrendelen kan mislukken als er onvoldoende geheugen is. Verminder je KDF-geheugeninstellingen om dit op te lossen</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data>
</root> </root>

View File

@@ -176,10 +176,10 @@
<comment>Confirmation alert message when deleteing something.</comment> <comment>Confirmation alert message when deleteing something.</comment>
</data> </data>
<data name="Edit" xml:space="preserve"> <data name="Edit" xml:space="preserve">
<value>Rei</value> <value>Rediger</value>
</data> </data>
<data name="EditFolder" xml:space="preserve"> <data name="EditFolder" xml:space="preserve">
<value>Rei mappa</value> <value>Rediger mappe</value>
</data> </data>
<data name="Email" xml:space="preserve"> <data name="Email" xml:space="preserve">
<value>E-post</value> <value>E-post</value>
@@ -468,7 +468,7 @@
<comment>Message shown when interacting with the server</comment> <comment>Message shown when interacting with the server</comment>
</data> </data>
<data name="EditItem" xml:space="preserve"> <data name="EditItem" xml:space="preserve">
<value>Rei oppføring</value> <value>Rediger oppføringa</value>
</data> </data>
<data name="EnableAutomaticSyncing" xml:space="preserve"> <data name="EnableAutomaticSyncing" xml:space="preserve">
<value>Slå på sjølvverkande synkronisering</value> <value>Slå på sjølvverkande synkronisering</value>
@@ -1235,10 +1235,10 @@ Skanning skjer automatisk.</value>
<value>Grunndomene</value> <value>Grunndomene</value>
</data> </data>
<data name="Default" xml:space="preserve"> <data name="Default" xml:space="preserve">
<value>Default</value> <value>Standard</value>
</data> </data>
<data name="Exact" xml:space="preserve"> <data name="Exact" xml:space="preserve">
<value>Exact</value> <value>Nøyaktig</value>
</data> </data>
<data name="Host" xml:space="preserve"> <data name="Host" xml:space="preserve">
<value>Host</value> <value>Host</value>
@@ -1249,7 +1249,7 @@ Skanning skjer automatisk.</value>
<comment>A programming term, also known as 'RegEx'.</comment> <comment>A programming term, also known as 'RegEx'.</comment>
</data> </data>
<data name="StartsWith" xml:space="preserve"> <data name="StartsWith" xml:space="preserve">
<value>Starts with</value> <value>Startar med</value>
</data> </data>
<data name="URIMatchDetection" xml:space="preserve"> <data name="URIMatchDetection" xml:space="preserve">
<value>URI match detection</value> <value>URI match detection</value>
@@ -1272,7 +1272,7 @@ Skanning skjer automatisk.</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>Prøv igjen</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>
@@ -1281,7 +1281,7 @@ Skanning skjer automatisk.</value>
<value>The accessibility service may be helpful to use when apps do not support the standard auto-fill service.</value> <value>The accessibility service may be helpful to use when apps do not support the standard auto-fill service.</value>
</data> </data>
<data name="DatePasswordUpdated" xml:space="preserve"> <data name="DatePasswordUpdated" xml:space="preserve">
<value>Password updated</value> <value>Passordet er oppdatert</value>
<comment>ex. Date this password was updated</comment> <comment>ex. Date this password was updated</comment>
</data> </data>
<data name="DateUpdated" xml:space="preserve"> <data name="DateUpdated" xml:space="preserve">
@@ -1289,13 +1289,13 @@ Skanning skjer automatisk.</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 activated!</value> <value>Autoutfylling aktivert!</value>
</data> </data>
<data name="MustLogInMainAppAutofill" xml:space="preserve"> <data name="MustLogInMainAppAutofill" xml:space="preserve">
<value>You must log into the main Bitwarden app before you can use AutoFill.</value> <value>Du må logge deg inn på Bitwarden-hovudappen før du kan bruke autoutfylling.</value>
</data> </data>
<data name="AutofillSetup" xml:space="preserve"> <data name="AutofillSetup" xml:space="preserve">
<value>Your logins are now easily accessible right from your keyboard while logging into apps and websites.</value> <value>Innloggingane dine er no lett tilgjengelege frå tastaturet når du loggar deg inn på appar og nettstadar.</value>
</data> </data>
<data name="AutofillSetup2" xml:space="preserve"> <data name="AutofillSetup2" xml:space="preserve">
<value>We recommend disabling any other AutoFill apps under Settings if you do not plan to use them.</value> <value>We recommend disabling any other AutoFill apps under Settings if you do not plan to use them.</value>
@@ -2006,7 +2006,7 @@ Skanning skjer automatisk.</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="EditSend" xml:space="preserve"> <data name="EditSend" xml:space="preserve">
<value>Rei Send</value> <value>Rediger 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="AddSend" xml:space="preserve"> <data name="AddSend" xml:space="preserve">
@@ -2635,6 +2635,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Kunne ikkje låse opp på grunn av utilstrekkeleg minnekapasitet. Reduser KDF-minne-innstillingane for å løyse dette</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2636,4 +2636,10 @@ Czy chcesz przełączyć się na to konto?</value>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Odblokowanie może się nie powieść z powodu niewystarczającej ilości pamięci. Zmniejsz ustawienia pamięci KDF, aby to rozwiązać</value> <value>Odblokowanie może się nie powieść z powodu niewystarczającej ilości pamięci. Zmniejsz ustawienia pamięci KDF, aby to rozwiązać</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Nieprawidłowy klucz API</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Nieprawidłowy token API.</value>
</data>
</root> </root>

View File

@@ -2632,9 +2632,15 @@ Você deseja mudar para esta conta?</value>
<value>Senha mestra atual</value> <value>Senha mestra atual</value>
</data> </data>
<data name="MasterPasswordRePromptHelp" xml:space="preserve"> <data name="MasterPasswordRePromptHelp" xml:space="preserve">
<value>Master password re-prompt help</value> <value>Ajuda com Nova solicitação de senha mestra</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>O desbloqueio pode falhar devido à memória insuficiente. Diminua suas configurações de memória KDF para resolver.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Chave da API inválida</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Token de API inválido</value>
</data> </data>
</root> </root>

View File

@@ -172,7 +172,7 @@
<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>Pretende mesmo eliminar? Isto não pode ser desfeito.</value> <value>Pretende mesmo eliminar? Isto não pode ser anulado.</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">
@@ -419,7 +419,7 @@
<value>Extensão da aplicação</value> <value>Extensão da aplicação</value>
</data> </data>
<data name="AutofillAccessibilityDescription" xml:space="preserve"> <data name="AutofillAccessibilityDescription" xml:space="preserve">
<value>Utilize o serviço de acessibilidade do Bitwarden para preencher automaticamente as suas credenciais em todas as aplicações e na web.</value> <value>Utilize o serviço de acessibilidade do Bitwarden para preencher automaticamente as suas credenciais em todas as aplicações e na Web.</value>
</data> </data>
<data name="AutofillService" xml:space="preserve"> <data name="AutofillService" xml:space="preserve">
<value>Serviço de preenchimento automático</value> <value>Serviço de preenchimento automático</value>
@@ -523,7 +523,7 @@
<value>Importar itens</value> <value>Importar itens</value>
</data> </data>
<data name="ImportItemsConfirmation" xml:space="preserve"> <data name="ImportItemsConfirmation" xml:space="preserve">
<value>Pode importar itens em massa do cofre da web bitwarden.com. Deseja visitar o site agora?</value> <value>Pode importar itens em massa do cofre do site bitwarden.com. Deseja visitar o site agora?</value>
</data> </data>
<data name="ImportItemsDescription" xml:space="preserve"> <data name="ImportItemsDescription" xml:space="preserve">
<value>Importe rapidamente e em massa os seus itens de outras aplicações de gestão de palavras-passe.</value> <value>Importe rapidamente e em massa os seus itens de outras aplicações de gestão de palavras-passe.</value>
@@ -553,10 +553,10 @@
<value>Imediatamente</value> <value>Imediatamente</value>
</data> </data>
<data name="VaultTimeout" xml:space="preserve"> <data name="VaultTimeout" xml:space="preserve">
<value>Expiração do cofre</value> <value>Tempo limite do cofre</value>
</data> </data>
<data name="VaultTimeoutAction" xml:space="preserve"> <data name="VaultTimeoutAction" xml:space="preserve">
<value>Ação de expiração do cofre</value> <value>Ação de tempo limite do cofre</value>
</data> </data>
<data name="VaultTimeoutLogOutConfirmation" xml:space="preserve"> <data name="VaultTimeoutLogOutConfirmation" xml:space="preserve">
<value>Ao terminar sessão removerá todo o acesso ao seu cofre e requer autenticação online após o período de tempo limite. Tem a certeza de que pretende utilizar esta definição?</value> <value>Ao terminar sessão removerá todo o acesso ao seu cofre e requer autenticação online após o período de tempo limite. Tem a certeza de que pretende utilizar esta definição?</value>
@@ -727,7 +727,7 @@
<value>Ver item</value> <value>Ver item</value>
</data> </data>
<data name="WebVault" xml:space="preserve"> <data name="WebVault" xml:space="preserve">
<value>Cofre web Bitwarden</value> <value>Cofre Web Bitwarden</value>
</data> </data>
<data name="Lost2FAApp" xml:space="preserve"> <data name="Lost2FAApp" xml:space="preserve">
<value>Perdeu a aplicação de autenticação?</value> <value>Perdeu a aplicação de autenticação?</value>
@@ -838,7 +838,7 @@
<comment>For 2FA</comment> <comment>For 2FA</comment>
</data> </data>
<data name="RememberMe" xml:space="preserve"> <data name="RememberMe" xml:space="preserve">
<value>Memorizar-me</value> <value>Memorizar</value>
<comment>Remember my two-step login</comment> <comment>Remember my two-step login</comment>
</data> </data>
<data name="SendVerificationCodeAgain" xml:space="preserve"> <data name="SendVerificationCodeAgain" xml:space="preserve">
@@ -919,7 +919,7 @@ A leitura será efetuada automaticamente.</value>
<value>Se uma credencial tiver uma chave de autenticação, copie o código de verificação TOTP para a sua área de transferência quando preencher automaticamente o início de sessão.</value> <value>Se uma credencial tiver uma chave de autenticação, copie o código de verificação TOTP para a sua área de transferência quando preencher automaticamente o início de sessão.</value>
</data> </data>
<data name="CopyTotpAutomatically" xml:space="preserve"> <data name="CopyTotpAutomatically" xml:space="preserve">
<value>Copy TOTP automatically</value> <value>Copiar TOTP automaticamente</value>
</data> </data>
<data name="PremiumRequired" xml:space="preserve"> <data name="PremiumRequired" xml:space="preserve">
<value>É necessária uma subscrição Premium para utilizar esta funcionalidade.</value> <value>É necessária uma subscrição Premium para utilizar esta funcionalidade.</value>
@@ -987,7 +987,7 @@ A leitura será efetuada automaticamente.</value>
<value>URL do servidor</value> <value>URL do servidor</value>
</data> </data>
<data name="WebVaultUrl" xml:space="preserve"> <data name="WebVaultUrl" xml:space="preserve">
<value>URL do servidor do cofre web</value> <value>URL do servidor do cofre Web</value>
</data> </data>
<data name="BitwardenAutofillServiceNotificationContentOld" xml:space="preserve"> <data name="BitwardenAutofillServiceNotificationContentOld" xml:space="preserve">
<value>Toque nesta notificação para ver itens do seu cofre.</value> <value>Toque nesta notificação para ver itens do seu cofre.</value>
@@ -1101,10 +1101,10 @@ A leitura será efetuada automaticamente.</value>
<value>Sra.</value> <value>Sra.</value>
</data> </data>
<data name="Ms" xml:space="preserve"> <data name="Ms" xml:space="preserve">
<value>Sra.</value> <value>Menina</value>
</data> </data>
<data name="Mx" xml:space="preserve"> <data name="Mx" xml:space="preserve">
<value>Mx</value> <value>Neutro</value>
</data> </data>
<data name="November" xml:space="preserve"> <data name="November" xml:space="preserve">
<value>Novembro</value> <value>Novembro</value>
@@ -1140,10 +1140,10 @@ A leitura será efetuada automaticamente.</value>
<value>Expiração</value> <value>Expiração</value>
</data> </data>
<data name="ShowWebsiteIcons" xml:space="preserve"> <data name="ShowWebsiteIcons" xml:space="preserve">
<value>Show website icons</value> <value>Mostrar ícones do site</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>Mostrar uma imagem reconhecível junto a cada credencial.</value>
</data> </data>
<data name="IconsUrl" xml:space="preserve"> <data name="IconsUrl" xml:space="preserve">
<value>URL do servidor de ícones</value> <value>URL do servidor de ícones</value>
@@ -1210,7 +1210,7 @@ A leitura será efetuada automaticamente.</value>
<value>Ocultado</value> <value>Ocultado</value>
</data> </data>
<data name="FieldTypeLinked" xml:space="preserve"> <data name="FieldTypeLinked" xml:space="preserve">
<value>Linked</value> <value>Associado</value>
</data> </data>
<data name="FieldTypeText" xml:space="preserve"> <data name="FieldTypeText" xml:space="preserve">
<value>Texto</value> <value>Texto</value>
@@ -1235,13 +1235,13 @@ A leitura será efetuada automaticamente.</value>
<value>Domínio base</value> <value>Domínio base</value>
</data> </data>
<data name="Default" xml:space="preserve"> <data name="Default" xml:space="preserve">
<value>Predefinição</value> <value>Predefinido</value>
</data> </data>
<data name="Exact" xml:space="preserve"> <data name="Exact" xml:space="preserve">
<value>Exato</value> <value>Exato</value>
</data> </data>
<data name="Host" xml:space="preserve"> <data name="Host" xml:space="preserve">
<value>Servidor</value> <value>Domínio</value>
<comment>A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'.</comment> <comment>A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'.</comment>
</data> </data>
<data name="RegEx" xml:space="preserve"> <data name="RegEx" xml:space="preserve">
@@ -1384,10 +1384,10 @@ A leitura será efetuada automaticamente.</value>
<value>Procurar na coleção</value> <value>Procurar na coleção</value>
</data> </data>
<data name="SearchFileSends" xml:space="preserve"> <data name="SearchFileSends" xml:space="preserve">
<value>Search file Sends</value> <value>Procurar Sends de ficheiros</value>
</data> </data>
<data name="SearchTextSends" xml:space="preserve"> <data name="SearchTextSends" xml:space="preserve">
<value>Search text Sends</value> <value>Procurar Sends de texto</value>
</data> </data>
<data name="SearchGroup" xml:space="preserve"> <data name="SearchGroup" xml:space="preserve">
<value>Procurar {0}</value> <value>Procurar {0}</value>
@@ -1415,7 +1415,7 @@ A leitura será efetuada automaticamente.</value>
<value>Não existem coleções para listar.</value> <value>Não existem coleções para listar.</value>
</data> </data>
<data name="MovedItemToOrg" xml:space="preserve"> <data name="MovedItemToOrg" xml:space="preserve">
<value>{0} moved to {1}.</value> <value>{0} movido para {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">
@@ -1431,7 +1431,7 @@ A leitura será efetuada automaticamente.</value>
<value>Partilhar item</value> <value>Partilhar item</value>
</data> </data>
<data name="MoveToOrganization" xml:space="preserve"> <data name="MoveToOrganization" xml:space="preserve">
<value>Move to Organization</value> <value>Mover para organização</value>
</data> </data>
<data name="NoOrgsToList" xml:space="preserve"> <data name="NoOrgsToList" xml:space="preserve">
<value>Nenhuma organização para listar.</value> <value>Nenhuma organização para listar.</value>
@@ -1464,7 +1464,7 @@ A leitura será efetuada automaticamente.</value>
<comment>A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing.</comment> <comment>A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing.</comment>
</data> </data>
<data name="YourAccountsFingerprint" xml:space="preserve"> <data name="YourAccountsFingerprint" xml:space="preserve">
<value>Frase da impressão digital da sua conta</value> <value>Frase de impressão digital da sua conta</value>
<comment>A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing.</comment> <comment>A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing.</comment>
</data> </data>
<data name="LearnOrgConfirmation" xml:space="preserve"> <data name="LearnOrgConfirmation" xml:space="preserve">
@@ -1502,7 +1502,7 @@ A leitura será efetuada automaticamente.</value>
<value>O seu cofre está bloqueado. Verifique o seu código PIN para continuar.</value> <value>O seu cofre está bloqueado. Verifique o seu código PIN para continuar.</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>O seu cofre está bloqueado. Verifique a sua identidade para continuar.</value>
</data> </data>
<data name="Dark" xml:space="preserve"> <data name="Dark" xml:space="preserve">
<value>Escuro</value> <value>Escuro</value>
@@ -1556,7 +1556,7 @@ A leitura será efetuada automaticamente.</value>
<value>Tema escuro predefinido</value> <value>Tema escuro predefinido</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>Escolha o tema escuro a utilizar quando o tema Predefinido (Sistema) do seu dispositivo estiver no modo escuro.</value>
</data> </data>
<data name="CopyNotes" xml:space="preserve"> <data name="CopyNotes" xml:space="preserve">
<value>Copiar nota</value> <value>Copiar nota</value>
@@ -1589,10 +1589,10 @@ A leitura será efetuada automaticamente.</value>
<value>O preenchimento automático não será oferecido para URIs bloqueados. Separe vários URIs com uma vírgula. Por exemplo: "https://twitter.com, androidapp://com.twitter.android".</value> <value>O preenchimento automático não será oferecido para URIs bloqueados. Separe vários URIs com uma vírgula. Por exemplo: "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>Pedir para adicionar credencial</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>Pedir para adicionar um item se não o encontrar no seu cofre.</value>
</data> </data>
<data name="OnRestart" xml:space="preserve"> <data name="OnRestart" xml:space="preserve">
<value>Quando reiniciar a aplicação</value> <value>Quando reiniciar a aplicação</value>
@@ -1665,13 +1665,13 @@ A leitura será efetuada automaticamente.</value>
<value>Código enviado!</value> <value>Código enviado!</value>
</data> </data>
<data name="ConfirmYourIdentity" xml:space="preserve"> <data name="ConfirmYourIdentity" xml:space="preserve">
<value>Confirm your identity to continue.</value> <value>Confirme a sua identidade para continuar.</value>
</data> </data>
<data name="ExportVaultWarning" xml:space="preserve"> <data name="ExportVaultWarning" xml:space="preserve">
<value>Esta exportação contém os dados do seu cofre num formato não encriptado. Não deve armazenar ou enviar o ficheiro exportado através de canais não seguros (como o e-mail). Elimine-o imediatamente após terminar a sua utilização.</value> <value>Esta exportação contém os dados do seu cofre num formato não encriptado. Não deve armazenar ou enviar o ficheiro exportado através de canais não seguros (como o e-mail). Elimine-o imediatamente após terminar a sua utilização.</value>
</data> </data>
<data name="EncExportKeyWarning" xml:space="preserve"> <data name="EncExportKeyWarning" xml:space="preserve">
<value>Esta exportação encripta os seus dados utilizando a chave de encriptação da sua conta. Se alguma vez mudar a chave de encriptação da sua conta, deve exportar novamente, uma vez que não conseguirá desencriptar este ficheiro de exportação.</value> <value>Esta exportação encripta os seus dados utilizando a chave de encriptação da sua conta. Se alguma vez regenerar a chave de encriptação da sua conta, deve exportar novamente, uma vez que não conseguirá desencriptar este ficheiro de exportação.</value>
</data> </data>
<data name="EncExportAccountWarning" xml:space="preserve"> <data name="EncExportAccountWarning" xml:space="preserve">
<value>As chaves de encriptação da conta são únicas para cada conta de utilizador Bitwarden, pelo que não é possível importar uma exportação encriptada para uma conta diferente.</value> <value>As chaves de encriptação da conta são únicas para cada conta de utilizador Bitwarden, pelo que não é possível importar uma exportação encriptada para uma conta diferente.</value>
@@ -1684,7 +1684,7 @@ A leitura será efetuada automaticamente.</value>
<value>Aviso</value> <value>Aviso</value>
</data> </data>
<data name="ExportVaultFailure" xml:space="preserve"> <data name="ExportVaultFailure" xml:space="preserve">
<value>Ocorreu um problema ao exportar o seu cofre. Se o problema persistir, terá de exportar a partir do cofre web.</value> <value>Ocorreu um problema ao exportar o seu cofre. Se o problema persistir, terá de exportar a partir do cofre Web.</value>
</data> </data>
<data name="ExportVaultSuccess" xml:space="preserve"> <data name="ExportVaultSuccess" xml:space="preserve">
<value>Cofre exportado com sucesso</value> <value>Cofre exportado com sucesso</value>
@@ -1701,7 +1701,7 @@ A leitura será efetuada automaticamente.</value>
<comment>Button text for an open operation (verb).</comment> <comment>Button text for an open operation (verb).</comment>
</data> </data>
<data name="UnableToSaveAttachment" xml:space="preserve"> <data name="UnableToSaveAttachment" xml:space="preserve">
<value>Houve um problema ao guardar este anexo. Se o problema persistir, poderá guardá-lo através do cofre web.</value> <value>Houve um problema ao guardar este anexo. Se o problema persistir, poderá guardá-lo através do cofre Web.</value>
</data> </data>
<data name="SaveAttachmentSuccess" xml:space="preserve"> <data name="SaveAttachmentSuccess" xml:space="preserve">
<value>Anexo guardado com sucesso</value> <value>Anexo guardado com sucesso</value>
@@ -1741,7 +1741,7 @@ A leitura será efetuada automaticamente.</value>
<comment>(action prompt) Label for the search text field when viewing the trash folder</comment> <comment>(action prompt) Label for the search text field when viewing the trash folder</comment>
</data> </data>
<data name="DoYouReallyWantToPermanentlyDeleteCipher" xml:space="preserve"> <data name="DoYouReallyWantToPermanentlyDeleteCipher" xml:space="preserve">
<value>Pretende mesmo eliminar permanentemente? Isto não pode ser desfeito.</value> <value>Pretende mesmo eliminar permanentemente? Isto não pode ser anulado.</value>
<comment>Confirmation alert message when permanently deleteing a cipher.</comment> <comment>Confirmation alert message when permanently deleteing a cipher.</comment>
</data> </data>
<data name="DoYouReallyWantToRestoreCipher" xml:space="preserve"> <data name="DoYouReallyWantToRestoreCipher" xml:space="preserve">
@@ -1753,10 +1753,10 @@ A leitura será efetuada automaticamente.</value>
<comment>Confirmation alert message when soft-deleting a cipher.</comment> <comment>Confirmation alert message when soft-deleting a cipher.</comment>
</data> </data>
<data name="AccountBiometricInvalidated" xml:space="preserve"> <data name="AccountBiometricInvalidated" xml:space="preserve">
<value>Biometric unlock for this account is disabled pending verification of master password.</value> <value>O desbloqueio biométrico desta conta está desativado enquanto se aguarda a verificação da palavra-passe mestra.</value>
</data> </data>
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve"> <data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</value> <value>O desbloqueio biométrico do preenchimento automático desta conta está desativado enquanto se aguarda a verificação da palavra-passe mestra.</value>
</data> </data>
<data name="EnableSyncOnRefresh" xml:space="preserve"> <data name="EnableSyncOnRefresh" xml:space="preserve">
<value>Permitir a sincronização ao atualizar</value> <value>Permitir a sincronização ao atualizar</value>
@@ -1825,7 +1825,7 @@ A leitura será efetuada automaticamente.</value>
<value>Política de privacidade</value> <value>Política de privacidade</value>
</data> </data>
<data name="AccessibilityDrawOverPermissionAlert" xml:space="preserve"> <data name="AccessibilityDrawOverPermissionAlert" xml:space="preserve">
<value>Bitwarden needs attention - Turn on "Draw-Over" in "Auto-fill Services" from Bitwarden Settings</value> <value>O Bitwarden precisa de atenção - Ative "Aparecer sobre outras" em "Serviços de preenchimento automático" nas definições do Bitwarden</value>
</data> </data>
<data name="AutofillServices" xml:space="preserve"> <data name="AutofillServices" xml:space="preserve">
<value>Serviços de preenchimento automático</value> <value>Serviços de preenchimento automático</value>
@@ -1834,47 +1834,47 @@ A leitura será efetuada automaticamente.</value>
<value>Utilizar o preenchimento automático em linha</value> <value>Utilizar o preenchimento automático em linha</value>
</data> </data>
<data name="InlineAutofillDescription" xml:space="preserve"> <data name="InlineAutofillDescription" xml:space="preserve">
<value>Use inline autofill if your selected IME (keyboard) supports it. If your configuration is not supported (or this option is turned off), the default Autofill overlay will be used.</value> <value>Utilize o preenchimento automático em linha se o IME (teclado) selecionado o suportar. Se a sua configuração não for suportada (ou se esta opção estiver desativada), será utilizada a sobreposição de preenchimento automático predefinida.</value>
</data> </data>
<data name="Accessibility" xml:space="preserve"> <data name="Accessibility" xml:space="preserve">
<value>Utilizar a acessibilidade</value> <value>Utilizar a acessibilidade</value>
</data> </data>
<data name="AccessibilityDescription" xml:space="preserve"> <data name="AccessibilityDescription" xml:space="preserve">
<value>Utilize o Serviço de acessibilidade do Bitwarden para preencher automaticamente as suas credenciais em aplicações e na web. Quando configurado, exibiremos um pop-up quando os campos de início de sessão forem selecionados.</value> <value>Utilize o Serviço de acessibilidade do Bitwarden para preencher automaticamente as suas credenciais em aplicações e na Web. Quando configurado, exibiremos um pop-up quando os campos de início de sessão forem selecionados.</value>
</data> </data>
<data name="AccessibilityDescription2" xml:space="preserve"> <data name="AccessibilityDescription2" xml:space="preserve">
<value>Use the Bitwarden Accessibility Service to auto-fill your logins across apps and the web. (Requires Draw-Over to be turned on as well)</value> <value>Utilize o Serviço de acessibilidade do Bitwarden para preencher automaticamente as suas credenciais em aplicações e na Web. (Requer que a definição Aparecer sobre outras também esteja ativada)</value>
</data> </data>
<data name="AccessibilityDescription3" xml:space="preserve"> <data name="AccessibilityDescription3" xml:space="preserve">
<value>Use the Bitwarden Accessibility Service to use the Autofill Quick-Action Tile, and/or show a popup using Draw-Over (if turned on).</value> <value>Utilize o Serviço de acessibilidade do Bitwarden para utilizar o botão de preenchimento automático do Painel instantâneo e/ou mostrar um pop-up utilizando a definição Aparecer sobre outras (se estiver ativada).</value>
</data> </data>
<data name="AccessibilityDescription4" xml:space="preserve"> <data name="AccessibilityDescription4" xml:space="preserve">
<value>Required to use the Autofill Quick-Action Tile, or to augment the Autofill Service by using Draw-Over (if turned on).</value> <value>Necessário para utilizar o botão de preenchimento automático do Painel instantâneo, ou para aumentar o serviço de preenchimento automático utilizando a definição Aparecer sobre outras (se estiver ativada).</value>
</data> </data>
<data name="DrawOver" xml:space="preserve"> <data name="DrawOver" xml:space="preserve">
<value>Use draw-over</value> <value>Utilizar definição Aparecer sobre outras</value>
</data> </data>
<data name="DrawOverDescription" xml:space="preserve"> <data name="DrawOverDescription" xml:space="preserve">
<value>Allows the Bitwarden Accessibility Service to display a popup when login fields are selected.</value> <value>Permite que o Serviço de acessibilidade do Bitwarden apresente um pop-up quando os campos de início de sessão são selecionados.</value>
</data> </data>
<data name="DrawOverDescription2" xml:space="preserve"> <data name="DrawOverDescription2" xml:space="preserve">
<value>Se estiver ativado, o Serviço de acessibilidade do Bitwarden apresentará um pop-up quando os campos de início de sessão forem selecionados para ajudar no preenchimento automático das suas credenciais.</value> <value>Se estiver ativado, o Serviço de acessibilidade do Bitwarden apresentará um pop-up quando os campos de início de sessão forem selecionados para ajudar no preenchimento automático das suas credenciais.</value>
</data> </data>
<data name="DrawOverDescription3" xml:space="preserve"> <data name="DrawOverDescription3" xml:space="preserve">
<value>If turned on, accessibility will show a popup to augment the Autofill Service for older apps that don't support the Android Autofill Framework.</value> <value>Se estiver ativada, a acessibilidade mostrará um pop-up para aumentar o serviço de preenchimento automático para aplicações mais antigas que não suportam a Framework de preenchimento automático do Android.</value>
</data> </data>
<data name="PersonalOwnershipSubmitError" xml:space="preserve"> <data name="PersonalOwnershipSubmitError" xml:space="preserve">
<value>Due to an enterprise policy, you are restricted from saving items to your individual vault. Change the ownership option to an organization and choose from available collections.</value> <value>Devido a uma política empresarial, está impedido de guardar itens no seu cofre pessoal. Altere a opção Propriedade para uma organização e escolha entre as coleções disponíveis.</value>
</data> </data>
<data name="PersonalOwnershipPolicyInEffect" xml:space="preserve"> <data name="PersonalOwnershipPolicyInEffect" xml:space="preserve">
<value>An organization policy is affecting your ownership options.</value> <value>Uma política da organização está a afetar as suas opções de propriedade.</value>
</data> </data>
<data name="Send" xml:space="preserve"> <data name="Send" xml:space="preserve">
<value>Send</value> <value>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="AllSends" xml:space="preserve"> <data name="AllSends" xml:space="preserve">
<value>All Sends</value> <value>Todos os Sends</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="Sends" xml:space="preserve"> <data name="Sends" xml:space="preserve">
@@ -1882,142 +1882,142 @@ A leitura será efetuada automaticamente.</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="NameInfo" xml:space="preserve"> <data name="NameInfo" xml:space="preserve">
<value>A friendly name to describe this Send.</value> <value>Um nome simpático para descrever este 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="Text" xml:space="preserve"> <data name="Text" xml:space="preserve">
<value>Text</value> <value>Texto</value>
</data> </data>
<data name="TypeText" xml:space="preserve"> <data name="TypeText" xml:space="preserve">
<value>Text</value> <value>Texto</value>
</data> </data>
<data name="TypeTextInfo" xml:space="preserve"> <data name="TypeTextInfo" xml:space="preserve">
<value>The text you want to send.</value> <value>O texto que deseja enviar.</value>
</data> </data>
<data name="HideTextByDefault" xml:space="preserve"> <data name="HideTextByDefault" xml:space="preserve">
<value>When accessing the Send, hide the text by default</value> <value>Ao aceder ao Send, ocultar o texto por defeito</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>Ficheiro</value>
</data> </data>
<data name="TypeFileInfo" xml:space="preserve"> <data name="TypeFileInfo" xml:space="preserve">
<value>The file you want to send.</value> <value>O ficheiro que deseja enviar.</value>
</data> </data>
<data name="FileTypeIsSelected" xml:space="preserve"> <data name="FileTypeIsSelected" xml:space="preserve">
<value>File type is selected.</value> <value>O tipo de ficheiro está selecionado.</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>O tipo de ficheiro não está selecionado, toque para selecionar.</value>
</data> </data>
<data name="TextTypeIsSelected" xml:space="preserve"> <data name="TextTypeIsSelected" xml:space="preserve">
<value>Text type is selected.</value> <value>O tipo de texto está selecionado.</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>O tipo de texto não está selecionado, toque para selecionar.</value>
</data> </data>
<data name="DeletionDate" xml:space="preserve"> <data name="DeletionDate" xml:space="preserve">
<value>Data de eliminação</value> <value>Data de eliminação</value>
</data> </data>
<data name="DeletionTime" xml:space="preserve"> <data name="DeletionTime" xml:space="preserve">
<value>Deletion time</value> <value>Hora da eliminação</value>
</data> </data>
<data name="DeletionDateInfo" xml:space="preserve"> <data name="DeletionDateInfo" xml:space="preserve">
<value>O Send será permanentemente eliminado na data e hora especificadas.</value> <value>O Send será permanentemente eliminado na data e hora especificadas.</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="PendingDelete" xml:space="preserve"> <data name="PendingDelete" xml:space="preserve">
<value>Pending deletion</value> <value>Eliminação pendente</value>
</data> </data>
<data name="ExpirationDate" xml:space="preserve"> <data name="ExpirationDate" xml:space="preserve">
<value>Expiration date</value> <value>Data de validade</value>
</data> </data>
<data name="ExpirationTime" xml:space="preserve"> <data name="ExpirationTime" xml:space="preserve">
<value>Expiration time</value> <value>Hora de validade</value>
</data> </data>
<data name="ExpirationDateInfo" xml:space="preserve"> <data name="ExpirationDateInfo" xml:space="preserve">
<value>If set, access to this Send will expire on the specified date and time.</value> <value>Se definido, o acesso a este Send expirará na data e hora especificadas.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment> <comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data> </data>
<data name="Expired" xml:space="preserve"> <data name="Expired" xml:space="preserve">
<value>Expired</value> <value>Expirado</value>
</data> </data>
<data name="MaximumAccessCount" xml:space="preserve"> <data name="MaximumAccessCount" xml:space="preserve">
<value>Maximum access count</value> <value>Número máximo de acessos</value>
</data> </data>
<data name="MaximumAccessCountInfo" xml:space="preserve"> <data name="MaximumAccessCountInfo" xml:space="preserve">
<value>If set, users will no longer be able to access this Send once the maximum access count is reached.</value> <value>Se definido, os utilizadores deixarão de poder aceder a este Send quando a contagem máxima de acessos for atingida.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment> <comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data> </data>
<data name="MaximumAccessCountReached" xml:space="preserve"> <data name="MaximumAccessCountReached" xml:space="preserve">
<value>Max access count reached</value> <value>Número máximo de acessos atingido</value>
</data> </data>
<data name="CurrentAccessCount" xml:space="preserve"> <data name="CurrentAccessCount" xml:space="preserve">
<value>Current access count</value> <value>Número de acessos atual</value>
</data> </data>
<data name="NewPassword" xml:space="preserve"> <data name="NewPassword" xml:space="preserve">
<value>New password</value> <value>Nova palavra-passe</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>Opcionalmente, exigir uma palavra-passe para os utilizadores acederem a este 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="RemovePassword" xml:space="preserve"> <data name="RemovePassword" xml:space="preserve">
<value>Remove password</value> <value>Remover palavra-passe</value>
</data> </data>
<data name="AreYouSureRemoveSendPassword" xml:space="preserve"> <data name="AreYouSureRemoveSendPassword" xml:space="preserve">
<value>Are you sure you want to remove the password?</value> <value>Tem a certeza de que pretende remover a palavras-passe?</value>
</data> </data>
<data name="RemovingSendPassword" xml:space="preserve"> <data name="RemovingSendPassword" xml:space="preserve">
<value>Removing password</value> <value>A remover palavra-passe</value>
</data> </data>
<data name="SendPasswordRemoved" xml:space="preserve"> <data name="SendPasswordRemoved" xml:space="preserve">
<value>Password has been removed.</value> <value>A palavra-passe foi removida.</value>
</data> </data>
<data name="NotesInfo" xml:space="preserve"> <data name="NotesInfo" xml:space="preserve">
<value>Private notes about this Send.</value> <value>Notas privadas sobre este 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="DisableSend" xml:space="preserve"> <data name="DisableSend" xml:space="preserve">
<value>Deactivate this Send so that no one can access it</value> <value>Desative este Send para que ninguém possa aceder ao mesmo</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="NoSends" xml:space="preserve"> <data name="NoSends" xml:space="preserve">
<value>There are no Sends in your account.</value> <value>Não existem Sends na sua conta.</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="AddASend" xml:space="preserve"> <data name="AddASend" xml:space="preserve">
<value>Add a Send</value> <value>Adicionar um 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="CopyLink" xml:space="preserve"> <data name="CopyLink" xml:space="preserve">
<value>Copy link</value> <value>Copiar link</value>
</data> </data>
<data name="ShareLink" xml:space="preserve"> <data name="ShareLink" xml:space="preserve">
<value>Share link</value> <value>Partilhar link</value>
</data> </data>
<data name="SendLink" xml:space="preserve"> <data name="SendLink" xml:space="preserve">
<value>Send link</value> <value>Link do 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="SearchSends" xml:space="preserve"> <data name="SearchSends" xml:space="preserve">
<value>Search Sends</value> <value>Procurar Sends</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="EditSend" xml:space="preserve"> <data name="EditSend" xml:space="preserve">
<value>Edit Send</value> <value>Editar 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="AddSend" xml:space="preserve"> <data name="AddSend" xml:space="preserve">
<value>New Send</value> <value>Novo 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">
<value>Are you sure you want to delete this Send?</value> <value>Tem a certeza de que pretende eliminar este 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="SendDeleted" xml:space="preserve"> <data name="SendDeleted" xml:space="preserve">
<value>Send deleted</value> <value>Send eliminado</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">
@@ -2025,7 +2025,7 @@ A leitura será efetuada automaticamente.</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">
<value>Send created</value> <value>Send criado</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">
@@ -2047,46 +2047,46 @@ A leitura será efetuada automaticamente.</value>
<value>Personalizado</value> <value>Personalizado</value>
</data> </data>
<data name="ShareOnSave" xml:space="preserve"> <data name="ShareOnSave" xml:space="preserve">
<value>Share this Send upon save</value> <value>Partilhar este Send após guardar</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="SendDisabledWarning" xml:space="preserve"> <data name="SendDisabledWarning" xml:space="preserve">
<value>Due to an enterprise policy, you are only able to delete an existing Send.</value> <value>Devido a uma política da empresa, só é possível eliminar um Send existente.</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="AboutSend" xml:space="preserve"> <data name="AboutSend" xml:space="preserve">
<value>About Send</value> <value>Sobre o 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="HideEmail" xml:space="preserve"> <data name="HideEmail" xml:space="preserve">
<value>Hide my email address from recipients</value> <value>Ocultar o meu endereço de e-mail dos destinatários</value>
</data> </data>
<data name="SendOptionsPolicyInEffect" xml:space="preserve"> <data name="SendOptionsPolicyInEffect" xml:space="preserve">
<value>Uma ou mais políticas da organização estão a afetar as suas opções do Send.</value> <value>Uma ou mais políticas da organização estão a afetar as suas opções do 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="SendFilePremiumRequired" xml:space="preserve"> <data name="SendFilePremiumRequired" xml:space="preserve">
<value>Free accounts are restricted to sharing text only. A premium membership is required to use files with Send.</value> <value>As contas gratuitas estão limitadas apenas à partilha de texto. É necessária uma subscrição Premium para utilizar ficheiros com o 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="SendFileEmailVerificationRequired" xml:space="preserve"> <data name="SendFileEmailVerificationRequired" xml:space="preserve">
<value>You must verify your email to use files with Send. You can verify your email in the web vault.</value> <value>Tem de verificar o seu e-mail para utilizar ficheiros com o Send. Pode verificar o seu e-mail no cofre Web.</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">
<value>Master password re-prompt</value> <value>Pedir novamente a palavra-passe mestra</value>
</data> </data>
<data name="PasswordConfirmation" xml:space="preserve"> <data name="PasswordConfirmation" xml:space="preserve">
<value>Master password confirmation</value> <value>Confirmação da palavra-passe mestra</value>
</data> </data>
<data name="PasswordConfirmationDesc" xml:space="preserve"> <data name="PasswordConfirmationDesc" xml:space="preserve">
<value>This action is protected, to continue please re-enter your master password to verify your identity.</value> <value>Esta ação está protegida. Para continuar, por favor, reintroduza a sua palavra-passe mestra para verificar a sua identidade.</value>
</data> </data>
<data name="CaptchaRequired" xml:space="preserve"> <data name="CaptchaRequired" xml:space="preserve">
<value>Captcha required</value> <value>Captcha necessário</value>
</data> </data>
<data name="CaptchaFailed" xml:space="preserve"> <data name="CaptchaFailed" xml:space="preserve">
<value>Captcha failed. Please try again.</value> <value>Falha no Captcha. Por favor, tente novamente.</value>
</data> </data>
<data name="UpdatedMasterPassword" xml:space="preserve"> <data name="UpdatedMasterPassword" xml:space="preserve">
<value>Palavra-passe mestra atualizada</value> <value>Palavra-passe mestra atualizada</value>
@@ -2098,58 +2098,58 @@ A leitura será efetuada automaticamente.</value>
<value>A sua palavra-passe mestra foi recentemente alterada por um administrador da sua organização. Para aceder ao cofre, tem de atualizar a sua palavra-passe mestra agora. Ao prosseguir, terminará a sua sessão atual e terá de iniciar sessão novamente. As sessões ativas noutros dispositivos poderão continuar ativas até uma hora.</value> <value>A sua palavra-passe mestra foi recentemente alterada por um administrador da sua organização. Para aceder ao cofre, tem de atualizar a sua palavra-passe mestra agora. Ao prosseguir, terminará a sua sessão atual e terá de iniciar sessão novamente. As sessões ativas noutros dispositivos poderão continuar ativas até uma hora.</value>
</data> </data>
<data name="UpdatingPassword" xml:space="preserve"> <data name="UpdatingPassword" xml:space="preserve">
<value>Updating password</value> <value>A atualizar palavra-passe</value>
</data> </data>
<data name="UpdatePasswordError" xml:space="preserve"> <data name="UpdatePasswordError" xml:space="preserve">
<value>Currently unable to update password</value> <value>Atualmente não é possível atualizar a palavra-passe</value>
</data> </data>
<data name="RemoveMasterPassword" xml:space="preserve"> <data name="RemoveMasterPassword" xml:space="preserve">
<value>Remove master password</value> <value>Remover palavra-passe mestra</value>
</data> </data>
<data name="RemoveMasterPasswordWarning" xml:space="preserve"> <data name="RemoveMasterPasswordWarning" xml:space="preserve">
<value>{0} is using SSO with customer-managed encryption. Continuing will remove your master password from your account and require SSO to login.</value> <value>{0} está a utilizar SSO com encriptação gerida pelo cliente. Se continuar removerá a sua palavra-passe mestra da sua conta e será exigido SSO para iniciar sessão.</value>
</data> </data>
<data name="RemoveMasterPasswordWarning2" xml:space="preserve"> <data name="RemoveMasterPasswordWarning2" xml:space="preserve">
<value>If you do not want to remove your master password, you may leave this organization.</value> <value>Se não pretender remover a sua palavra-passe mestra, pode deixar esta organização.</value>
</data> </data>
<data name="LeaveOrganization" xml:space="preserve"> <data name="LeaveOrganization" xml:space="preserve">
<value>Leave organization</value> <value>Deixar a organização</value>
</data> </data>
<data name="LeaveOrganizationName" xml:space="preserve"> <data name="LeaveOrganizationName" xml:space="preserve">
<value>Leave {0}?</value> <value>Deixar {0}?</value>
</data> </data>
<data name="Fido2Title" xml:space="preserve"> <data name="Fido2Title" xml:space="preserve">
<value>FIDO2 WebAuthn</value> <value>FIDO2 WebAuthn</value>
</data> </data>
<data name="Fido2Instruction" xml:space="preserve"> <data name="Fido2Instruction" xml:space="preserve">
<value>To continue, have your FIDO2 WebAuthn compatible security key ready, then follow the instructions after clicking 'Authenticate WebAuthn' on the next screen.</value> <value>Para continuar, tenha a sua chave de segurança compatível com o FIDO2 WebAuthn pronta e siga as instruções depois de clicar em "Autenticar WebAuthn" no ecrã seguinte.</value>
</data> </data>
<data name="Fido2Desc" xml:space="preserve"> <data name="Fido2Desc" xml:space="preserve">
<value>Authentication using FIDO2 WebAuthn, you can authenticate using an external security key.</value> <value>Autenticação utilizando FIDO2 WebAuthn, pode autenticar utilizando uma chave de segurança externa.</value>
</data> </data>
<data name="Fido2AuthenticateWebAuthn" xml:space="preserve"> <data name="Fido2AuthenticateWebAuthn" xml:space="preserve">
<value>Authenticate WebAuthn</value> <value>Autenticar WebAuthn</value>
</data> </data>
<data name="Fido2ReturnToApp" xml:space="preserve"> <data name="Fido2ReturnToApp" xml:space="preserve">
<value>Return to app</value> <value>Voltar à aplicação</value>
</data> </data>
<data name="Fido2CheckBrowser" xml:space="preserve"> <data name="Fido2CheckBrowser" xml:space="preserve">
<value>Please make sure your default browser supports WebAuthn and try again.</value> <value>Por favor, certifique-se de que o seu navegador predefinido suporta o WebAuthn e tente novamente.</value>
</data> </data>
<data name="ResetPasswordAutoEnrollInviteWarning" xml:space="preserve"> <data name="ResetPasswordAutoEnrollInviteWarning" xml:space="preserve">
<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>Esta organização tem uma política empresarial que o inscreverá automaticamente na redefinição de palavra-passe. A inscrição permitirá que os administradores da organização alterem a sua palavra-passe mestra.</value>
</data> </data>
<data name="VaultTimeoutPolicyInEffect" xml:space="preserve"> <data name="VaultTimeoutPolicyInEffect" xml:space="preserve">
<value>Your organization policies have set your maximum allowed vault timeout to {0} hour(s) and {1} minute(s).</value> <value>As políticas da sua organização definiram o tempo limite máximo permitido do cofre de {0} hora(s) e {1} minuto(s).</value>
</data> </data>
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve"> <data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
<value>Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). Your vault timeout action is set to {2}.</value> <value>As políticas da sua organização estão a afetar o tempo limite do cofre. O tempo limite máximo permitido do cofre é de {0} hora(s) e {1} minuto(s). A sua ação de tempo limite do cofre está definida para {2}.</value>
</data> </data>
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve"> <data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
<value>Your organization policies have set your vault timeout action to {0}.</value> <value>As políticas da sua organização definiram a ação de tempo limite do cofre para {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>O tempo limite do seu cofre excede as restrições definidas pela sua organização.</value>
</data> </data>
<data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve"> <data name="DisablePersonalVaultExportPolicyInEffect" xml:space="preserve">
<value>Uma ou mais políticas da organização impedem-no de exportar o seu cofre pessoal.</value> <value>Uma ou mais políticas da organização impedem-no de exportar o seu cofre pessoal.</value>
@@ -2179,34 +2179,34 @@ A leitura será efetuada automaticamente.</value>
<value>Conta removida com sucesso</value> <value>Conta removida com sucesso</value>
</data> </data>
<data name="DeleteAccount" xml:space="preserve"> <data name="DeleteAccount" xml:space="preserve">
<value>Delete account</value> <value>Eliminar conta</value>
</data> </data>
<data name="DeletingYourAccountIsPermanent" xml:space="preserve"> <data name="DeletingYourAccountIsPermanent" xml:space="preserve">
<value>Deleting your account is permanent</value> <value>A eliminação da sua conta é permanente</value>
</data> </data>
<data name="DeleteAccountExplanation" xml:space="preserve"> <data name="DeleteAccountExplanation" xml:space="preserve">
<value>Your account and all vault data will be erased and unrecoverable. Are you sure you want to continue?</value> <value>A sua conta e todos os dados do cofre serão apagados e irrecuperáveis. Tem a certeza de que quer continuar?</value>
</data> </data>
<data name="DeletingYourAccount" xml:space="preserve"> <data name="DeletingYourAccount" xml:space="preserve">
<value>Deleting your account</value> <value>A eliminar a sua conta</value>
</data> </data>
<data name="YourAccountHasBeenPermanentlyDeleted" xml:space="preserve"> <data name="YourAccountHasBeenPermanentlyDeleted" xml:space="preserve">
<value>Your account has been permanently deleted</value> <value>A sua conta foi permanentemente eliminada</value>
</data> </data>
<data name="InvalidVerificationCode" xml:space="preserve"> <data name="InvalidVerificationCode" xml:space="preserve">
<value>Invalid verification code</value> <value>Código de verificação inválido</value>
</data> </data>
<data name="RequestOTP" xml:space="preserve"> <data name="RequestOTP" xml:space="preserve">
<value>Pedir palavra-passe única</value> <value>Pedir palavra-passe única</value>
</data> </data>
<data name="SendCode" xml:space="preserve"> <data name="SendCode" xml:space="preserve">
<value>Send code</value> <value>Enviar código</value>
</data> </data>
<data name="Sending" xml:space="preserve"> <data name="Sending" xml:space="preserve">
<value>Sending</value> <value>A enviar</value>
</data> </data>
<data name="CopySendLinkOnSave" xml:space="preserve"> <data name="CopySendLinkOnSave" xml:space="preserve">
<value>Copy Send link on save</value> <value>Copiar link do Send ao guardar</value>
</data> </data>
<data name="SendingCode" xml:space="preserve"> <data name="SendingCode" xml:space="preserve">
<value>A enviar código</value> <value>A enviar código</value>
@@ -2227,10 +2227,10 @@ A leitura será efetuada automaticamente.</value>
<value>Introduza o código de verificação que foi enviado para o seu e-mail</value> <value>Introduza o código de verificação que foi enviado para o seu e-mail</value>
</data> </data>
<data name="SubmitCrashLogs" xml:space="preserve"> <data name="SubmitCrashLogs" xml:space="preserve">
<value>Submit crash logs</value> <value>Submeter registo de falhas</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>Ajude o Bitwarden a melhorar a estabilidade da aplicação ao enviar relatórios de falhas.</value>
</data> </data>
<data name="OptionsExpanded" xml:space="preserve"> <data name="OptionsExpanded" xml:space="preserve">
<value>Options are expanded, tap to collapse.</value> <value>Options are expanded, tap to collapse.</value>
@@ -2248,10 +2248,10 @@ A leitura será efetuada automaticamente.</value>
<value>Números (0-9)</value> <value>Números (0-9)</value>
</data> </data>
<data name="SpecialCharacters" xml:space="preserve"> <data name="SpecialCharacters" xml:space="preserve">
<value>Special characters (!@#$%^&amp;*)</value> <value>Caracteres especiais (!@#$%^&amp;*)</value>
</data> </data>
<data name="TapToGoBack" xml:space="preserve"> <data name="TapToGoBack" xml:space="preserve">
<value>Tap to go back</value> <value>Toque para voltar atrás</value>
</data> </data>
<data name="PasswordIsVisibleTapToHide" xml:space="preserve"> <data name="PasswordIsVisibleTapToHide" xml:space="preserve">
<value>A palavra-passe está visível, toque para a ocultar.</value> <value>A palavra-passe está visível, toque para a ocultar.</value>
@@ -2278,53 +2278,52 @@ A leitura será efetuada automaticamente.</value>
<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>Códigos de verificação</value>
</data> </data>
<data name="PremiumSubscriptionRequired" xml:space="preserve"> <data name="PremiumSubscriptionRequired" xml:space="preserve">
<value>É necessária uma subscrição Premium</value> <value>É necessária uma subscrição Premium</value>
</data> </data>
<data name="CannotAddAuthenticatorKey" xml:space="preserve"> <data name="CannotAddAuthenticatorKey" xml:space="preserve">
<value>Cannot add authenticator key? </value> <value>Não é possível adicionar uma chave de autenticação? </value>
</data> </data>
<data name="ScanQRCode" xml:space="preserve"> <data name="ScanQRCode" xml:space="preserve">
<value>Scan QR Code</value> <value>Ler código QR</value>
</data> </data>
<data name="CannotScanQRCode" xml:space="preserve"> <data name="CannotScanQRCode" xml:space="preserve">
<value>Cannot scan QR Code? </value> <value>Não consegue ler o código QR? </value>
</data> </data>
<data name="AuthenticatorKeyScanner" xml:space="preserve"> <data name="AuthenticatorKeyScanner" xml:space="preserve">
<value>Authenticator key</value> <value>Chave de autenticação</value>
</data> </data>
<data name="EnterKeyManually" xml:space="preserve"> <data name="EnterKeyManually" xml:space="preserve">
<value>Enter key manually</value> <value>Introduzir chave manualmente</value>
</data> </data>
<data name="AddTotp" xml:space="preserve"> <data name="AddTotp" xml:space="preserve">
<value>Add TOTP</value> <value>Adicionar TOTP</value>
</data> </data>
<data name="SetupTotp" xml:space="preserve"> <data name="SetupTotp" xml:space="preserve">
<value>Set up TOTP</value> <value>Configurar TOTP</value>
</data> </data>
<data name="OnceTheKeyIsSuccessfullyEntered" xml:space="preserve"> <data name="OnceTheKeyIsSuccessfullyEntered" xml:space="preserve">
<value>Once the key is successfully entered, <value>Assim que a chave for introduzida com sucesso, selecione Adicionar TOTP para guardar a chave em seguranç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>Ao definir as suas opções de bloqueio para "Nunca" mantém o seu cofre disponível para qualquer pessoa que tenha acesso ao seu dispositivo. Se utilizar esta opção, deve assegurar-se de que mantém o seu dispositivo devidamente protegido.</value> <value>Ao definir as suas opções de bloqueio para "Nunca" mantém o seu cofre disponível para qualquer pessoa que tenha acesso ao seu dispositivo. Se utilizar esta opção, deve assegurar-se de que mantém o seu dispositivo devidamente protegido.</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>Um ou mais URLs introduzidos são inválidos. Por favor, reveja-o e tente guardar novamente.</value>
</data> </data>
<data name="GenericErrorMessage" xml:space="preserve"> <data name="GenericErrorMessage" xml:space="preserve">
<value>We were unable to process your request. Please try again or contact us.</value> <value>Não foi possível processar o seu pedido. Por favor, tente novamente ou contacte-nos.</value>
</data> </data>
<data name="AllowScreenCapture" xml:space="preserve"> <data name="AllowScreenCapture" xml:space="preserve">
<value>Allow screen capture</value> <value>Permitir a captura de ecrã</value>
</data> </data>
<data name="AreYouSureYouWantToEnableScreenCapture" xml:space="preserve"> <data name="AreYouSureYouWantToEnableScreenCapture" xml:space="preserve">
<value>Are you sure you want to turn on screen capture?</value> <value>Tem a certeza de que pretende ativar a captura de ecrã?</value>
</data> </data>
<data name="LogInRequested" xml:space="preserve"> <data name="LogInRequested" xml:space="preserve">
<value>Início de sessão necessário</value> <value>Início de sessão pedido</value>
</data> </data>
<data name="AreYouTryingToLogIn" xml:space="preserve"> <data name="AreYouTryingToLogIn" xml:space="preserve">
<value>Está a tentar iniciar sessão?</value> <value>Está a tentar iniciar sessão?</value>
@@ -2384,7 +2383,7 @@ select Add TOTP to store the key safely</value>
<value>Todas as notificações</value> <value>Todas as notificações</value>
</data> </data>
<data name="PasswordType" xml:space="preserve"> <data name="PasswordType" xml:space="preserve">
<value>Password type</value> <value>Tipo de palavra-passe</value>
</data> </data>
<data name="WhatWouldYouLikeToGenerate" xml:space="preserve"> <data name="WhatWouldYouLikeToGenerate" xml:space="preserve">
<value>O que é que gostaria de gerar?</value> <value>O que é que gostaria de gerar?</value>
@@ -2399,22 +2398,22 @@ select Add TOTP to store the key safely</value>
<value>Catch-all email</value> <value>Catch-all email</value>
</data> </data>
<data name="ForwardedEmailAlias" xml:space="preserve"> <data name="ForwardedEmailAlias" xml:space="preserve">
<value>Forwarded email alias</value> <value>Alias de e-mail reencaminhado</value>
</data> </data>
<data name="RandomWord" xml:space="preserve"> <data name="RandomWord" xml:space="preserve">
<value>Random word</value> <value>Palavra aleatória</value>
</data> </data>
<data name="EmailRequiredParenthesis" xml:space="preserve"> <data name="EmailRequiredParenthesis" xml:space="preserve">
<value>Email (required)</value> <value>E-mail (necessário)</value>
</data> </data>
<data name="DomainNameRequiredParenthesis" xml:space="preserve"> <data name="DomainNameRequiredParenthesis" xml:space="preserve">
<value>Domain name (required)</value> <value>Nome do domínio (necessário)</value>
</data> </data>
<data name="APIKeyRequiredParenthesis" xml:space="preserve"> <data name="APIKeyRequiredParenthesis" xml:space="preserve">
<value>API key (required)</value> <value>Chave da API (necessário)</value>
</data> </data>
<data name="Service" xml:space="preserve"> <data name="Service" xml:space="preserve">
<value>Service</value> <value>Serviço</value>
</data> </data>
<data name="AnonAddy" xml:space="preserve"> <data name="AnonAddy" xml:space="preserve">
<value>AnonAddy</value> <value>AnonAddy</value>
@@ -2437,7 +2436,7 @@ select Add TOTP to store the key safely</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 access token</value> <value>Token de acesso à API</value>
</data> </data>
<data name="AreYouSureYouWantToOverwriteTheCurrentUsername" xml:space="preserve"> <data name="AreYouSureYouWantToOverwriteTheCurrentUsername" xml:space="preserve">
<value>Tem a certeza de que pretende substituir o nome de utilizador atual?</value> <value>Tem a certeza de que pretende substituir o nome de utilizador atual?</value>
@@ -2446,13 +2445,13 @@ select Add TOTP to store the key safely</value>
<value>Gerar nome de utilizador</value> <value>Gerar nome de utilizador</value>
</data> </data>
<data name="EmailType" xml:space="preserve"> <data name="EmailType" xml:space="preserve">
<value>Email Type</value> <value>Tipo de e-mail</value>
</data> </data>
<data name="WebsiteRequired" xml:space="preserve"> <data name="WebsiteRequired" xml:space="preserve">
<value>Website (required)</value> <value>Site (necessário)</value>
</data> </data>
<data name="UnknownXErrorMessage" xml:space="preserve"> <data name="UnknownXErrorMessage" xml:space="preserve">
<value>Unknown {0} error occurred.</value> <value>Ocorreu um erro desconhecido ({0}).</value>
</data> </data>
<data name="PlusAddressedEmailDescription" xml:space="preserve"> <data name="PlusAddressedEmailDescription" xml:space="preserve">
<value>Use your email provider's subaddress capabilities</value> <value>Use your email provider's subaddress capabilities</value>
@@ -2461,13 +2460,13 @@ select Add TOTP to store the key safely</value>
<value>Use your domain's configured catch-all inbox.</value> <value>Use your domain's configured catch-all inbox.</value>
</data> </data>
<data name="ForwardedEmailDescription" xml:space="preserve"> <data name="ForwardedEmailDescription" xml:space="preserve">
<value>Generate an email alias with an external forwarding service.</value> <value>Gerar um alias de e-mail com um serviço de reencaminhamento externo.</value>
</data> </data>
<data name="Random" xml:space="preserve"> <data name="Random" xml:space="preserve">
<value>Random</value> <value>Aleatório</value>
</data> </data>
<data name="ConnectToWatch" xml:space="preserve"> <data name="ConnectToWatch" xml:space="preserve">
<value>Conectar ao Relógio</value> <value>Ligar ao relógio</value>
</data> </data>
<data name="AccessibilityServiceDisclosure" xml:space="preserve"> <data name="AccessibilityServiceDisclosure" xml:space="preserve">
<value>Divulgação do serviço de acessibilidade</value> <value>Divulgação do serviço de acessibilidade</value>
@@ -2508,40 +2507,40 @@ Deseja mudar para esta conta?</value>
<value>Iniciar sessão com o dispositivo</value> <value>Iniciar sessão com o dispositivo</value>
</data> </data>
<data name="LogInInitiated" xml:space="preserve"> <data name="LogInInitiated" xml:space="preserve">
<value>Log in initiated</value> <value>A preparar o início de sessão</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>Foi enviada uma notificação para o seu dispositivo.</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>Por favor, certifique-se de que o cofre está desbloqueado e que a frase de impressão digital corresponde à do outro dispositivo.</value>
</data> </data>
<data name="ResendNotification" xml:space="preserve"> <data name="ResendNotification" xml:space="preserve">
<value>Resend notification</value> <value>Reenviar notificação</value>
</data> </data>
<data name="NeedAnotherOption" xml:space="preserve"> <data name="NeedAnotherOption" xml:space="preserve">
<value>Need another option?</value> <value>Precisa de outra opção?</value>
</data> </data>
<data name="ViewAllLoginOptions" xml:space="preserve"> <data name="ViewAllLoginOptions" xml:space="preserve">
<value>View all log in options</value> <value>Ver todas as opções de início de sessão</value>
</data> </data>
<data name="ThisRequestIsNoLongerValid" xml:space="preserve"> <data name="ThisRequestIsNoLongerValid" xml:space="preserve">
<value>Este pedido já não é válido</value> <value>Este pedido já não é válido</value>
</data> </data>
<data name="PendingLogInRequests" xml:space="preserve"> <data name="PendingLogInRequests" xml:space="preserve">
<value>Pending login requests</value> <value>Pedidos de início de sessão pendentes</value>
</data> </data>
<data name="DeclineAllRequests" xml:space="preserve"> <data name="DeclineAllRequests" xml:space="preserve">
<value>Decline all requests</value> <value>Recusar todos os pedidos</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>Tem a certeza de que pretende recusar todos os pedidos de início de sessão pendentes?</value>
</data> </data>
<data name="RequestsDeclined" xml:space="preserve"> <data name="RequestsDeclined" xml:space="preserve">
<value>Requests declined</value> <value>Pedidos recusados</value>
</data> </data>
<data name="NoPendingRequests" xml:space="preserve"> <data name="NoPendingRequests" xml:space="preserve">
<value>No pending requests</value> <value>Sem pedidos pendentes</value>
</data> </data>
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve"> <data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
<value>Ative a permissão da câmara para utilizar o digitalizador</value> <value>Ative a permissão da câmara para utilizar o digitalizador</value>
@@ -2559,55 +2558,55 @@ Deseja mudar para esta conta?</value>
<value>Predefinido (Sistema)</value> <value>Predefinido (Sistema)</value>
</data> </data>
<data name="Important" xml:space="preserve"> <data name="Important" xml:space="preserve">
<value>Important</value> <value>Importante</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>A sua palavra-passe mestra não pode ser recuperada se a esquecer! {0} caracteres no mínimo.</value>
</data> </data>
<data name="WeakMasterPassword" xml:space="preserve"> <data name="WeakMasterPassword" xml:space="preserve">
<value>Weak Master Password</value> <value>Palavra-passe mestra fraca</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>Foi identificada uma palavra-passe fraca. Utilize uma palavra-passe forte para proteger a sua conta. Tem a certeza de que pretende utilizar uma palavra-passe fraca?</value>
</data> </data>
<data name="Weak" xml:space="preserve"> <data name="Weak" xml:space="preserve">
<value>Weak</value> <value>Fraca</value>
</data> </data>
<data name="Good" xml:space="preserve"> <data name="Good" xml:space="preserve">
<value>Good</value> <value>Boa</value>
</data> </data>
<data name="Strong" xml:space="preserve"> <data name="Strong" xml:space="preserve">
<value>Strong</value> <value>Forte</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>Verificar violações de dados conhecidas para esta palavra-passe</value>
</data> </data>
<data name="ExposedMasterPassword" xml:space="preserve"> <data name="ExposedMasterPassword" xml:space="preserve">
<value>Exposed Master Password</value> <value>Palavra-passe mestra exposta</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>Palavra-passe encontrada numa violação de dados. Utilize uma palavra-passe única para proteger a sua conta. Tem a certeza de que pretende utilizar uma palavra-passe exposta?</value>
</data> </data>
<data name="WeakAndExposedMasterPassword" xml:space="preserve"> <data name="WeakAndExposedMasterPassword" xml:space="preserve">
<value>Weak and Exposed Master Password</value> <value>Palavra-passe mestra fraca e exposta</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>Palavra-passe fraca identificada e encontrada numa violação de dados. Utilize uma palavra-passe forte e única para proteger a sua conta. Tem a certeza de que pretende utilizar esta palavra-passe?</value>
</data> </data>
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve"> <data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
<value>Organization SSO identifier required.</value> <value>É necessário o identificador de SSO da organização.</value>
</data> </data>
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve"> <data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
<value>Add the key to an existing or new item</value> <value>Adicionar a chave a um item existente ou novo</value>
</data> </data>
<data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve"> <data name="ThereAreNoItemsInYourVaultThatMatchX" xml:space="preserve">
<value>There are no items in your vault that match "{0}"</value> <value>Não existem itens no seu cofre que correspondam a "{0}"</value>
</data> </data>
<data name="SearchForAnItemOrAddANewItem" xml:space="preserve"> <data name="SearchForAnItemOrAddANewItem" xml:space="preserve">
<value>Search for an item or add a new item</value> <value>Procurar um item ou adicionar um novo</value>
</data> </data>
<data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve"> <data name="ThereAreNoItemsThatMatchTheSearch" xml:space="preserve">
<value>There are no items that match the search</value> <value>Não existem itens que correspondam à pesquisa</value>
</data> </data>
<data name="US" xml:space="preserve"> <data name="US" xml:space="preserve">
<value>EUA</value> <value>EUA</value>
@@ -2628,12 +2627,18 @@ Deseja mudar para esta conta?</value>
<value>A sua palavra-passe mestra não cumpre uma ou mais políticas da sua organização. Para aceder ao cofre, tem de atualizar a sua palavra-passe mestra agora. Ao prosseguir, terminará a sua sessão atual e terá de iniciar sessão novamente. As sessões ativas noutros dispositivos poderão continuar ativas até uma hora.</value> <value>A sua palavra-passe mestra não cumpre uma ou mais políticas da sua organização. Para aceder ao cofre, tem de atualizar a sua palavra-passe mestra agora. Ao prosseguir, terminará a sua sessão atual e terá de iniciar sessão novamente. As sessões ativas noutros dispositivos poderão continuar ativas até uma hora.</value>
</data> </data>
<data name="CurrentMasterPassword" xml:space="preserve"> <data name="CurrentMasterPassword" xml:space="preserve">
<value>Current master password</value> <value>Palavra-passe mestra atual</value>
</data> </data>
<data name="MasterPasswordRePromptHelp" xml:space="preserve"> <data name="MasterPasswordRePromptHelp" xml:space="preserve">
<value>Master password re-prompt help</value> <value>Ajuda para pedir novamente a palavra-passe mestra</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>O desbloqueio pode falhar devido a memória insuficiente. Diminua as definições de memória do KDF para resolver o problema</value> <value>O desbloqueio pode falhar devido a memória insuficiente. Diminua as definições de memória do KDF para resolver o problema.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Chave da API inválida</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Token da API inválido</value>
</data> </data>
</root> </root>

View File

@@ -2635,9 +2635,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data> </data>
<data name="LoadFromFile" xml:space="preserve"> <data name="InvalidAPIKey" xml:space="preserve">
<value>Load from file</value> <value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2634,6 +2634,12 @@ Doriți să comutați la acest cont?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2634,6 +2634,12 @@
<value>Помощь с повторным запросом мастер-пароля</value> <value>Помощь с повторным запросом мастер-пароля</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Разблокировка может завершиться ошибкой из-за нехватки памяти. Уменьшите настройки памяти KDF для решения этой проблемы</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Некорректный ключ API</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Некорректный токен API</value>
</data> </data>
</root> </root>

View File

@@ -2635,6 +2635,12 @@ Do you want to switch to this account?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2636,4 +2636,10 @@ Chcete prepnúť na toto konto?</value>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Odomknutie môže zlyhať z dôvodu nedostatku pamäte. Znížte nastavenia pamäte KDF, aby ste vyriešili problém</value> <value>Odomknutie môže zlyhať z dôvodu nedostatku pamäte. Znížte nastavenia pamäte KDF, aby ste vyriešili problém</value>
</data> </data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Neplatný kľúč API</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Neplatný token API</value>
</data>
</root> </root>

View File

@@ -2634,6 +2634,12 @@ Do you want to switch to this account?</value>
<value>Pomoč o ponovnem zahtevku za glavno geslo</value> <value>Pomoč o ponovnem zahtevku za glavno geslo</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2633,9 +2633,15 @@
<value>Тренутна главна лозинка</value> <value>Тренутна главна лозинка</value>
</data> </data>
<data name="MasterPasswordRePromptHelp" xml:space="preserve"> <data name="MasterPasswordRePromptHelp" xml:space="preserve">
<value>Master password re-prompt help</value> <value>Помоћ поновно тражење главне лозинке</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Откључавање можда неће успети због недовољне меморије. Умањите подешавање KDF меморије за решење</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
</data> </data>
</root> </root>

View File

@@ -2498,7 +2498,7 @@ Vill du byta till detta konto?</value>
<value>Hämta huvudlösenordsledtråd</value> <value>Hämta huvudlösenordsledtråd</value>
</data> </data>
<data name="LoggingInAsXOnY" xml:space="preserve"> <data name="LoggingInAsXOnY" xml:space="preserve">
<value>Logging in as {0} on {1}</value> <value>Loggar in som {0} {1}</value>
</data> </data>
<data name="NotYou" xml:space="preserve"> <data name="NotYou" xml:space="preserve">
<value>Är det inte du?</value> <value>Är det inte du?</value>
@@ -2636,6 +2636,12 @@ Vill du byta till detta konto?</value>
<value>Master password re-prompt help</value> <value>Master password re-prompt help</value>
</data> </data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve"> <data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve</value> <value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Ogiltig API-nyckel</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Ogiltig API-token</value>
</data> </data>
</root> </root>

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