1
0
mirror of https://github.com/bitwarden/mobile.git synced 2025-01-02 18:07:56 +01:00

More localized resource strings applied. Implemented more options actions on valut list page. Added delete confirmation.

This commit is contained in:
Kyle Spearrin 2016-05-07 13:42:09 -04:00
parent 27e8474dae
commit aeb04d0178
12 changed files with 487 additions and 65 deletions

View File

@ -14,12 +14,16 @@ namespace Bit.App.Models.View
FolderId = folderId; FolderId = folderId;
Name = site.Name?.Decrypt(); Name = site.Name?.Decrypt();
Username = site.Username?.Decrypt(); Username = site.Username?.Decrypt();
Password = site.Password?.Decrypt();
Uri = site.Uri?.Decrypt();
} }
public string Id { get; set; } public string Id { get; set; }
public string FolderId { get; set; } public string FolderId { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string Username { get; set; } public string Username { get; set; }
public string Password { get; set; }
public string Uri { get; set; }
} }
public class Folder : ObservableCollection<Site> public class Folder : ObservableCollection<Site>

View File

@ -1,4 +1,5 @@
using Xamarin.Forms; using Bit.App.Resources;
using Xamarin.Forms;
namespace Bit.App.Pages namespace Bit.App.Pages
{ {
@ -9,7 +10,7 @@ namespace Bit.App.Pages
{ {
BarBackgroundColor = Color.FromHex("3c8dbc"); BarBackgroundColor = Color.FromHex("3c8dbc");
BarTextColor = Color.FromHex("ffffff"); BarTextColor = Color.FromHex("ffffff");
Title = "Login"; Title = AppResources.LogInNoun;
} }
} }
} }

View File

@ -6,6 +6,7 @@ using System.Text;
using Bit.App.Abstractions; using Bit.App.Abstractions;
using Bit.App.Behaviors; using Bit.App.Behaviors;
using Bit.App.Models.Api; using Bit.App.Models.Api;
using Bit.App.Resources;
using Xamarin.Forms; using Xamarin.Forms;
using XLabs.Ioc; using XLabs.Ioc;
@ -21,7 +22,7 @@ namespace Bit.App.Pages
var emailEntry = new Entry var emailEntry = new Entry
{ {
Keyboard = Keyboard.Email, Keyboard = Keyboard.Email,
Placeholder = "Email Address" Placeholder = AppResources.EmailAddress
}; };
emailEntry.Behaviors.Add(new RequiredValidationBehavior()); emailEntry.Behaviors.Add(new RequiredValidationBehavior());
@ -30,25 +31,25 @@ namespace Bit.App.Pages
var masterPasswordEntry = new Entry var masterPasswordEntry = new Entry
{ {
IsPassword = true, IsPassword = true,
Placeholder = "Master Password" Placeholder = AppResources.MasterPassword
}; };
masterPasswordEntry.Behaviors.Add(new RequiredValidationBehavior()); masterPasswordEntry.Behaviors.Add(new RequiredValidationBehavior());
var loginButton = new Button var loginButton = new Button
{ {
Text = "Log In", Text = AppResources.LogIn,
Command = new Command(async () => Command = new Command(async () =>
{ {
if(string.IsNullOrWhiteSpace(emailEntry.Text)) if(string.IsNullOrWhiteSpace(emailEntry.Text))
{ {
await DisplayAlert("An error has occurred", "The Email Address field is required.", "Ok"); await DisplayAlert(AppResources.AnErrorHasOccurred, string.Format(AppResources.ValidationFieldRequired, AppResources.EmailAddress), AppResources.Ok);
return; return;
} }
if(string.IsNullOrWhiteSpace(masterPasswordEntry.Text)) if(string.IsNullOrWhiteSpace(masterPasswordEntry.Text))
{ {
await DisplayAlert("An error has occurred", "The Master Password field is required.", "Ok"); await DisplayAlert(AppResources.AnErrorHasOccurred, string.Format(AppResources.ValidationFieldRequired, AppResources.MasterPassword), AppResources.Ok);
return; return;
} }
@ -63,7 +64,7 @@ namespace Bit.App.Pages
var response = await authService.TokenPostAsync(request); var response = await authService.TokenPostAsync(request);
if(!response.Succeeded) if(!response.Succeeded)
{ {
await DisplayAlert("An error occurred", response.Errors.First().Message, "Ok"); await DisplayAlert(AppResources.AnErrorHasOccurred, response.Errors.First().Message, AppResources.Ok);
return; return;
} }
@ -83,7 +84,7 @@ namespace Bit.App.Pages
stackLayout.Children.Add(masterPasswordEntry); stackLayout.Children.Add(masterPasswordEntry);
stackLayout.Children.Add(loginButton); stackLayout.Children.Add(loginButton);
Title = "Log In"; Title = AppResources.LogIn;
Content = stackLayout; Content = stackLayout;
NavigationPage.SetHasNavigationBar(this, false); NavigationPage.SetHasNavigationBar(this, false);
} }

View File

@ -1,4 +1,5 @@
using System; using System;
using Bit.App.Resources;
using Xamarin.Forms; using Xamarin.Forms;
namespace Bit.App.Pages namespace Bit.App.Pages
@ -14,10 +15,10 @@ namespace Bit.App.Pages
vaultNavigation.BarBackgroundColor = settingsNavigation.BarBackgroundColor = Color.FromHex("3c8dbc"); vaultNavigation.BarBackgroundColor = settingsNavigation.BarBackgroundColor = Color.FromHex("3c8dbc");
vaultNavigation.BarTextColor = settingsNavigation.BarTextColor = Color.FromHex("ffffff"); vaultNavigation.BarTextColor = settingsNavigation.BarTextColor = Color.FromHex("ffffff");
vaultNavigation.Title = "My Vault"; vaultNavigation.Title = AppResources.MyVault;
vaultNavigation.Icon = "fa-lock"; vaultNavigation.Icon = "fa-lock";
settingsNavigation.Title = "Settings"; settingsNavigation.Title = AppResources.Settings;
settingsNavigation.Icon = "fa-cogs"; settingsNavigation.Icon = "fa-cogs";
Children.Add(vaultNavigation); Children.Add(vaultNavigation);

View File

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Bit.App.Abstractions; using Bit.App.Abstractions;
using Bit.App.Resources;
using Xamarin.Forms; using Xamarin.Forms;
using XLabs.Ioc; using XLabs.Ioc;
@ -16,7 +17,7 @@ namespace Bit.App.Pages
var logoutButton = new Button var logoutButton = new Button
{ {
Text = "Log Out", Text = AppResources.LogOut,
Command = new Command(() => Command = new Command(() =>
{ {
authService.LogOut(); authService.LogOut();
@ -27,7 +28,7 @@ namespace Bit.App.Pages
var stackLayout = new StackLayout { }; var stackLayout = new StackLayout { };
stackLayout.Children.Add(logoutButton); stackLayout.Children.Add(logoutButton);
Title = "Settings"; Title = AppResources.Settings;
Content = stackLayout; Content = stackLayout;
} }
} }

View File

@ -2,6 +2,7 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Acr.UserDialogs; using Acr.UserDialogs;
using Bit.App.Abstractions; using Bit.App.Abstractions;
using Bit.App.Resources;
using Plugin.Connectivity.Abstractions; using Plugin.Connectivity.Abstractions;
using Xamarin.Forms; using Xamarin.Forms;
using XLabs.Ioc; using XLabs.Ioc;
@ -67,7 +68,7 @@ namespace Bit.App.Pages
public void AlertNoConnection() public void AlertNoConnection()
{ {
DisplayAlert("No internet connection", "Adding a new folder required an internet connection. Please connect to the internet before continuing.", "Ok"); DisplayAlert(AppResources.InternetConnectionRequiredTitle, AppResources.InternetConnectionRequiredMessage, AppResources.Ok);
} }
} }
} }

View File

@ -7,6 +7,7 @@ using System.Threading.Tasks;
using Acr.UserDialogs; using Acr.UserDialogs;
using Bit.App.Abstractions; using Bit.App.Abstractions;
using Bit.App.Models; using Bit.App.Models;
using Bit.App.Resources;
using Plugin.Connectivity.Abstractions; using Plugin.Connectivity.Abstractions;
using Xamarin.Forms; using Xamarin.Forms;
using XLabs.Ioc; using XLabs.Ioc;
@ -25,7 +26,7 @@ namespace Bit.App.Pages
var nameEntry = new Entry(); var nameEntry = new Entry();
var stackLayout = new StackLayout(); var stackLayout = new StackLayout();
stackLayout.Children.Add(new Label { Text = "Name" }); stackLayout.Children.Add(new Label { Text = AppResources.Name });
stackLayout.Children.Add(nameEntry); stackLayout.Children.Add(nameEntry);
var scrollView = new ScrollView var scrollView = new ScrollView
@ -34,7 +35,7 @@ namespace Bit.App.Pages
Orientation = ScrollOrientation.Vertical Orientation = ScrollOrientation.Vertical
}; };
var saveToolBarItem = new ToolbarItem("Save", null, async () => var saveToolBarItem = new ToolbarItem(AppResources.Save, null, async () =>
{ {
if(!connectivity.IsConnected) if(!connectivity.IsConnected)
{ {
@ -44,7 +45,7 @@ namespace Bit.App.Pages
if(string.IsNullOrWhiteSpace(nameEntry.Text)) if(string.IsNullOrWhiteSpace(nameEntry.Text))
{ {
await DisplayAlert("An error has occurred", "The Name field is required.", "Ok"); await DisplayAlert(AppResources.AnErrorHasOccurred, string.Format(AppResources.ValidationFieldRequired, AppResources.Name), AppResources.Ok);
return; return;
} }
@ -74,7 +75,7 @@ namespace Bit.App.Pages
public void AlertNoConnection() public void AlertNoConnection()
{ {
DisplayAlert("No internet connection", "Adding a new folder required an internet connection. Please connect to the internet before continuing.", "Ok"); DisplayAlert(AppResources.InternetConnectionRequiredTitle, AppResources.InternetConnectionRequiredMessage, AppResources.Ok);
} }
} }
} }

View File

@ -6,6 +6,7 @@ using System.Text;
using Acr.UserDialogs; using Acr.UserDialogs;
using Bit.App.Abstractions; using Bit.App.Abstractions;
using Bit.App.Models; using Bit.App.Models;
using Bit.App.Resources;
using Plugin.Connectivity.Abstractions; using Plugin.Connectivity.Abstractions;
using Xamarin.Forms; using Xamarin.Forms;
using XLabs.Ioc; using XLabs.Ioc;
@ -27,7 +28,7 @@ namespace Bit.App.Pages
var uriEntry = new Entry { Keyboard = Keyboard.Url }; var uriEntry = new Entry { Keyboard = Keyboard.Url };
var nameEntry = new Entry(); var nameEntry = new Entry();
var folderPicker = new Picker { Title = "Folder" }; var folderPicker = new Picker { Title = "Folder" };
folderPicker.Items.Add("(none)"); folderPicker.Items.Add(AppResources.FolderNone);
folderPicker.SelectedIndex = 0; folderPicker.SelectedIndex = 0;
foreach(var folder in folders) foreach(var folder in folders)
{ {
@ -38,17 +39,17 @@ namespace Bit.App.Pages
var notesEditor = new Editor(); var notesEditor = new Editor();
var stackLayout = new StackLayout(); var stackLayout = new StackLayout();
stackLayout.Children.Add(new Label { Text = "URI" }); stackLayout.Children.Add(new Label { Text = AppResources.URI });
stackLayout.Children.Add(uriEntry); stackLayout.Children.Add(uriEntry);
stackLayout.Children.Add(new Label { Text = "Name" }); stackLayout.Children.Add(new Label { Text = AppResources.Name });
stackLayout.Children.Add(nameEntry); stackLayout.Children.Add(nameEntry);
stackLayout.Children.Add(new Label { Text = "Folder" }); stackLayout.Children.Add(new Label { Text = AppResources.Folder });
stackLayout.Children.Add(folderPicker); stackLayout.Children.Add(folderPicker);
stackLayout.Children.Add(new Label { Text = "Username" }); stackLayout.Children.Add(new Label { Text = AppResources.Username });
stackLayout.Children.Add(usernameEntry); stackLayout.Children.Add(usernameEntry);
stackLayout.Children.Add(new Label { Text = "Password" }); stackLayout.Children.Add(new Label { Text = AppResources.Password });
stackLayout.Children.Add(passwordEntry); stackLayout.Children.Add(passwordEntry);
stackLayout.Children.Add(new Label { Text = "Notes" }); stackLayout.Children.Add(new Label { Text = AppResources.Notes });
stackLayout.Children.Add(notesEditor); stackLayout.Children.Add(notesEditor);
var scrollView = new ScrollView var scrollView = new ScrollView
@ -57,7 +58,7 @@ namespace Bit.App.Pages
Orientation = ScrollOrientation.Vertical Orientation = ScrollOrientation.Vertical
}; };
var saveToolBarItem = new ToolbarItem("Save", null, async () => var saveToolBarItem = new ToolbarItem(AppResources.Save, null, async () =>
{ {
if(!connectivity.IsConnected) if(!connectivity.IsConnected)
{ {
@ -67,13 +68,13 @@ namespace Bit.App.Pages
if(string.IsNullOrWhiteSpace(uriEntry.Text)) if(string.IsNullOrWhiteSpace(uriEntry.Text))
{ {
await DisplayAlert("An error has occurred", "The Uri field is required.", "Ok"); await DisplayAlert(AppResources.AnErrorHasOccurred, string.Format(AppResources.ValidationFieldRequired, AppResources.URI), AppResources.Ok);
return; return;
} }
if(string.IsNullOrWhiteSpace(nameEntry.Text)) if(string.IsNullOrWhiteSpace(nameEntry.Text))
{ {
await DisplayAlert("An error has occurred", "The Name field is required.", "Ok"); await DisplayAlert(AppResources.AnErrorHasOccurred, string.Format(AppResources.ValidationFieldRequired, AppResources.Name), AppResources.Ok);
return; return;
} }
@ -100,7 +101,7 @@ namespace Bit.App.Pages
userDialogs.SuccessToast(nameEntry.Text, "New site created."); userDialogs.SuccessToast(nameEntry.Text, "New site created.");
}, ToolbarItemOrder.Default, 0); }, ToolbarItemOrder.Default, 0);
Title = "Add Site"; Title = AppResources.AddSite;
Content = scrollView; Content = scrollView;
ToolbarItems.Add(saveToolBarItem); ToolbarItems.Add(saveToolBarItem);
@ -112,7 +113,7 @@ namespace Bit.App.Pages
public void AlertNoConnection() public void AlertNoConnection()
{ {
DisplayAlert("No internet connection", "Adding a new folder required an internet connection. Please connect to the internet before continuing.", "Ok"); DisplayAlert(AppResources.InternetConnectionRequiredTitle, AppResources.InternetConnectionRequiredMessage, AppResources.Ok);
} }
} }
} }

View File

@ -16,12 +16,14 @@ namespace Bit.App.Pages
private readonly IFolderService _folderService; private readonly IFolderService _folderService;
private readonly ISiteService _siteService; private readonly ISiteService _siteService;
private readonly IUserDialogs _userDialogs; private readonly IUserDialogs _userDialogs;
private readonly IClipboardService _clipboardService;
public VaultListPage() public VaultListPage()
{ {
_folderService = Resolver.Resolve<IFolderService>(); _folderService = Resolver.Resolve<IFolderService>();
_siteService = Resolver.Resolve<ISiteService>(); _siteService = Resolver.Resolve<ISiteService>();
_userDialogs = Resolver.Resolve<IUserDialogs>(); _userDialogs = Resolver.Resolve<IUserDialogs>();
_clipboardService = Resolver.Resolve<IClipboardService>();
Init(); Init();
} }
@ -76,22 +78,44 @@ namespace Bit.App.Pages
{ {
var mi = sender as MenuItem; var mi = sender as MenuItem;
var site = mi.CommandParameter as VaultView.Site; var site = mi.CommandParameter as VaultView.Site;
var selection = await DisplayActionSheet("More Options", "Cancel", null, "View", "Edit", "Copy Password", "Copy Username", "Go To Website"); var selection = await DisplayActionSheet(AppResources.MoreOptions, AppResources.Cancel, null,
AppResources.View, AppResources.Edit, AppResources.CopyPassword, AppResources.CopyUsername, AppResources.GoToWebsite);
switch(selection) if(selection == AppResources.View)
{ {
case "View": await Navigation.PushAsync(new VaultViewSitePage(site.Id));
case "Edit":
case "Copy Password":
case "Copy Username":
case "Go To Website":
default:
break;
} }
else if(selection == AppResources.Edit)
{
// TODO: navigate to edit page
}
else if(selection == AppResources.CopyPassword)
{
Copy(site.Password, AppResources.Password);
}
else if(selection == AppResources.CopyUsername)
{
Copy(site.Username, AppResources.Username);
}
else if(selection == AppResources.GoToWebsite)
{
Device.OpenUri(new Uri(site.Uri));
}
}
private void Copy(string copyText, string alertLabel)
{
_clipboardService.CopyToClipboard(copyText);
_userDialogs.SuccessToast(string.Format(AppResources.ValueHasBeenCopied, alertLabel));
} }
private async void DeleteClickedAsync(object sender, EventArgs e) private async void DeleteClickedAsync(object sender, EventArgs e)
{ {
if(!await _userDialogs.ConfirmAsync(AppResources.DoYouReallyWantToDelete, null, AppResources.Yes, AppResources.No))
{
return;
}
var mi = sender as MenuItem; var mi = sender as MenuItem;
var site = mi.CommandParameter as VaultView.Site; var site = mi.CommandParameter as VaultView.Site;
var deleteCall = await _siteService.DeleteAsync(site.Id); var deleteCall = await _siteService.DeleteAsync(site.Id);
@ -101,11 +125,11 @@ namespace Bit.App.Pages
var folder = Folders.Single(f => f.Id == site.FolderId); var folder = Folders.Single(f => f.Id == site.FolderId);
var siteIndex = folder.Select((s, i) => new { s, i }).First(s => s.s.Id == site.Id).i; var siteIndex = folder.Select((s, i) => new { s, i }).First(s => s.s.Id == site.Id).i;
folder.RemoveAt(siteIndex); folder.RemoveAt(siteIndex);
_userDialogs.SuccessToast("Site deleted."); _userDialogs.SuccessToast(AppResources.SiteDeleted);
} }
else if(deleteCall.Errors.Count() > 0) else if(deleteCall.Errors.Count() > 0)
{ {
await DisplayAlert("An error has occurred", deleteCall.Errors.First().Message, "Ok"); await DisplayAlert(AppResources.AnErrorHasOccurred, deleteCall.Errors.First().Message, AppResources.Ok);
} }
} }
@ -116,7 +140,7 @@ namespace Bit.App.Pages
public AddSiteToolBarItem(VaultListPage page) public AddSiteToolBarItem(VaultListPage page)
{ {
_page = page; _page = page;
Text = "Add"; Text = AppResources.Add;
Icon = "fa-plus"; Icon = "fa-plus";
Clicked += ClickedItem; Clicked += ClickedItem;
} }
@ -131,11 +155,11 @@ namespace Bit.App.Pages
{ {
public VaultListViewCell(VaultListPage page) public VaultListViewCell(VaultListPage page)
{ {
var moreAction = new MenuItem { Text = "More" }; var moreAction = new MenuItem { Text = AppResources.More };
moreAction.SetBinding(MenuItem.CommandParameterProperty, new Binding(".")); moreAction.SetBinding(MenuItem.CommandParameterProperty, new Binding("."));
moreAction.Clicked += page.MoreClickedAsync; moreAction.Clicked += page.MoreClickedAsync;
var deleteAction = new MenuItem { Text = "Delete", IsDestructive = true }; var deleteAction = new MenuItem { Text = AppResources.Delete, IsDestructive = true };
deleteAction.SetBinding(MenuItem.CommandParameterProperty, new Binding(".")); deleteAction.SetBinding(MenuItem.CommandParameterProperty, new Binding("."));
deleteAction.Clicked += page.DeleteClickedAsync; deleteAction.Clicked += page.DeleteClickedAsync;

View File

@ -5,6 +5,7 @@ using System.Reflection.Emit;
using System.Text; using System.Text;
using Acr.UserDialogs; using Acr.UserDialogs;
using Bit.App.Abstractions; using Bit.App.Abstractions;
using Bit.App.Resources;
using Xamarin.Forms; using Xamarin.Forms;
using XLabs.Ioc; using XLabs.Ioc;
@ -49,10 +50,10 @@ namespace Bit.App.Pages
usernameRow.Children.Add(usernameLabel); usernameRow.Children.Add(usernameLabel);
usernameRow.Children.Add(new Button usernameRow.Children.Add(new Button
{ {
Text = "Copy", Text = AppResources.Copy,
HorizontalOptions = LayoutOptions.End, HorizontalOptions = LayoutOptions.End,
VerticalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center,
Command = new Command(() => Copy(usernameLabel.Text, "Username")) Command = new Command(() => Copy(usernameLabel.Text, AppResources.Username))
}); });
var passwordRow = new StackLayout { Orientation = StackOrientation.Horizontal }; var passwordRow = new StackLayout { Orientation = StackOrientation.Horizontal };
@ -67,7 +68,7 @@ namespace Bit.App.Pages
passwordRow.Children.Add(passwordLabel); passwordRow.Children.Add(passwordLabel);
var togglePasswordButton = new Button var togglePasswordButton = new Button
{ {
Text = "Show", Text = AppResources.Show,
HorizontalOptions = LayoutOptions.End, HorizontalOptions = LayoutOptions.End,
VerticalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center,
Command = new Command((self) => TogglePassword(self as Button, passwordLabel, password)) Command = new Command((self) => TogglePassword(self as Button, passwordLabel, password))
@ -76,10 +77,10 @@ namespace Bit.App.Pages
passwordRow.Children.Add(togglePasswordButton); passwordRow.Children.Add(togglePasswordButton);
passwordRow.Children.Add(new Button passwordRow.Children.Add(new Button
{ {
Text = "Copy", Text = AppResources.Copy,
HorizontalOptions = LayoutOptions.End, HorizontalOptions = LayoutOptions.End,
VerticalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center,
Command = new Command(() => Copy(password, "Password")) Command = new Command(() => Copy(password, AppResources.Password))
}); });
var uriRow = new StackLayout { Orientation = StackOrientation.Horizontal }; var uriRow = new StackLayout { Orientation = StackOrientation.Horizontal };
@ -93,22 +94,22 @@ namespace Bit.App.Pages
}); });
uriRow.Children.Add(new Button uriRow.Children.Add(new Button
{ {
Text = "Launch", Text = AppResources.Launch,
HorizontalOptions = LayoutOptions.End, HorizontalOptions = LayoutOptions.End,
VerticalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center,
Command = new Command(() => Device.OpenUri(new Uri(uri))) Command = new Command(() => Device.OpenUri(new Uri(uri)))
}); });
var stackLayout = new StackLayout(); var stackLayout = new StackLayout();
stackLayout.Children.Add(new Label { Text = "Username" }); stackLayout.Children.Add(new Label { Text = AppResources.Username });
stackLayout.Children.Add(usernameRow); stackLayout.Children.Add(usernameRow);
stackLayout.Children.Add(new Label { Text = "Password" }); stackLayout.Children.Add(new Label { Text = AppResources.Password });
stackLayout.Children.Add(passwordRow); stackLayout.Children.Add(passwordRow);
stackLayout.Children.Add(new Label { Text = "Website" }); stackLayout.Children.Add(new Label { Text = AppResources.Website });
stackLayout.Children.Add(uriRow); stackLayout.Children.Add(uriRow);
if(site.Notes != null) if(site.Notes != null)
{ {
stackLayout.Children.Add(new Label { Text = "Notes" }); stackLayout.Children.Add(new Label { Text = AppResources.Notes });
stackLayout.Children.Add(new Label { Text = site.Notes.Decrypt() }); stackLayout.Children.Add(new Label { Text = site.Notes.Decrypt() });
} }
@ -118,28 +119,28 @@ namespace Bit.App.Pages
Orientation = ScrollOrientation.Vertical Orientation = ScrollOrientation.Vertical
}; };
Title = site.Name?.Decrypt() ?? "No Name"; Title = site.Name?.Decrypt() ?? AppResources.SiteNoName;
Content = scrollView; Content = scrollView;
} }
public void TogglePassword(Button toggleButton, Label passwordLabel, string password) private void TogglePassword(Button toggleButton, Label passwordLabel, string password)
{ {
if(toggleButton.Text == "Show") if(toggleButton.Text == AppResources.Show)
{ {
toggleButton.Text = "Hide"; toggleButton.Text = AppResources.Hide;
passwordLabel.Text = password; passwordLabel.Text = password;
} }
else else
{ {
toggleButton.Text = "Show"; toggleButton.Text = AppResources.Show;
passwordLabel.Text = new string('●', password.Length); passwordLabel.Text = new string('●', password.Length);
} }
} }
public void Copy(string copyText, string alertLabel) private void Copy(string copyText, string alertLabel)
{ {
_clipboardService.CopyToClipboard(copyText); _clipboardService.CopyToClipboard(copyText);
_userDialogs.SuccessToast($"{alertLabel} has been copied."); _userDialogs.SuccessToast(string.Format(AppResources.ValueHasBeenCopied, alertLabel));
} }
private class EditSiteToolBarItem : ToolbarItem private class EditSiteToolBarItem : ToolbarItem
@ -151,7 +152,7 @@ namespace Bit.App.Pages
{ {
_page = page; _page = page;
_siteId = siteId; _siteId = siteId;
Text = "Edit"; Text = AppResources.Edit;
Clicked += ClickedItem; Clicked += ClickedItem;
} }

View File

@ -61,6 +61,15 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Add.
/// </summary>
internal static string Add {
get {
return ResourceManager.GetString("Add", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Add Site. /// Looks up a localized string similar to Add Site.
/// </summary> /// </summary>
@ -70,6 +79,78 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to An error has occurred..
/// </summary>
internal static string AnErrorHasOccurred {
get {
return ResourceManager.GetString("AnErrorHasOccurred", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Cancel.
/// </summary>
internal static string Cancel {
get {
return ResourceManager.GetString("Cancel", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Copy.
/// </summary>
internal static string Copy {
get {
return ResourceManager.GetString("Copy", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Copy Password.
/// </summary>
internal static string CopyPassword {
get {
return ResourceManager.GetString("CopyPassword", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Copy Username.
/// </summary>
internal static string CopyUsername {
get {
return ResourceManager.GetString("CopyUsername", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Delete.
/// </summary>
internal static string Delete {
get {
return ResourceManager.GetString("Delete", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Do you really want to delete? This cannot be undone..
/// </summary>
internal static string DoYouReallyWantToDelete {
get {
return ResourceManager.GetString("DoYouReallyWantToDelete", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Edit.
/// </summary>
internal static string Edit {
get {
return ResourceManager.GetString("Edit", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Email. /// Looks up a localized string similar to Email.
/// </summary> /// </summary>
@ -79,6 +160,15 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Email Address.
/// </summary>
internal static string EmailAddress {
get {
return ResourceManager.GetString("EmailAddress", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Folder. /// Looks up a localized string similar to Folder.
/// </summary> /// </summary>
@ -97,6 +187,51 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Go To Website.
/// </summary>
internal static string GoToWebsite {
get {
return ResourceManager.GetString("GoToWebsite", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Hide.
/// </summary>
internal static string Hide {
get {
return ResourceManager.GetString("Hide", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Please connect to the internet before continuing..
/// </summary>
internal static string InternetConnectionRequiredMessage {
get {
return ResourceManager.GetString("InternetConnectionRequiredMessage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Internet Connection Required.
/// </summary>
internal static string InternetConnectionRequiredTitle {
get {
return ResourceManager.GetString("InternetConnectionRequiredTitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Launch.
/// </summary>
internal static string Launch {
get {
return ResourceManager.GetString("Launch", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Log In. /// Looks up a localized string similar to Log In.
/// </summary> /// </summary>
@ -106,6 +241,15 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Login.
/// </summary>
internal static string LogInNoun {
get {
return ResourceManager.GetString("LogInNoun", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Log Out. /// Looks up a localized string similar to Log Out.
/// </summary> /// </summary>
@ -124,6 +268,24 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to More.
/// </summary>
internal static string More {
get {
return ResourceManager.GetString("More", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to More Options.
/// </summary>
internal static string MoreOptions {
get {
return ResourceManager.GetString("MoreOptions", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to My Vault. /// Looks up a localized string similar to My Vault.
/// </summary> /// </summary>
@ -133,6 +295,24 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Name.
/// </summary>
internal static string Name {
get {
return ResourceManager.GetString("Name", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to No.
/// </summary>
internal static string No {
get {
return ResourceManager.GetString("No", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Notes. /// Looks up a localized string similar to Notes.
/// </summary> /// </summary>
@ -142,6 +322,15 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Ok.
/// </summary>
internal static string Ok {
get {
return ResourceManager.GetString("Ok", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Password. /// Looks up a localized string similar to Password.
/// </summary> /// </summary>
@ -151,6 +340,15 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Save.
/// </summary>
internal static string Save {
get {
return ResourceManager.GetString("Save", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Settings. /// Looks up a localized string similar to Settings.
/// </summary> /// </summary>
@ -160,6 +358,33 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Show.
/// </summary>
internal static string Show {
get {
return ResourceManager.GetString("Show", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Site has been deleted..
/// </summary>
internal static string SiteDeleted {
get {
return ResourceManager.GetString("SiteDeleted", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to No Name.
/// </summary>
internal static string SiteNoName {
get {
return ResourceManager.GetString("SiteNoName", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Sync. /// Looks up a localized string similar to Sync.
/// </summary> /// </summary>
@ -186,5 +411,50 @@ namespace Bit.App.Resources {
return ResourceManager.GetString("Username", resourceCulture); return ResourceManager.GetString("Username", resourceCulture);
} }
} }
/// <summary>
/// Looks up a localized string similar to The {0} field is required..
/// </summary>
internal static string ValidationFieldRequired {
get {
return ResourceManager.GetString("ValidationFieldRequired", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} has been copied..
/// </summary>
internal static string ValueHasBeenCopied {
get {
return ResourceManager.GetString("ValueHasBeenCopied", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to View.
/// </summary>
internal static string View {
get {
return ResourceManager.GetString("View", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Website.
/// </summary>
internal static string Website {
get {
return ResourceManager.GetString("Website", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Yes.
/// </summary>
internal static string Yes {
get {
return ResourceManager.GetString("Yes", resourceCulture);
}
}
} }
} }

View File

@ -117,13 +117,52 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="Add" xml:space="preserve">
<value>Add</value>
<comment>Add/create a new entity (verb).</comment>
</data>
<data name="AddSite" xml:space="preserve"> <data name="AddSite" xml:space="preserve">
<value>Add Site</value> <value>Add Site</value>
<comment>The title for the add site page.</comment> <comment>The title for the add site page.</comment>
</data> </data>
<data name="AnErrorHasOccurred" xml:space="preserve">
<value>An error has occurred.</value>
<comment>Alert title when something goes wrong.</comment>
</data>
<data name="Cancel" xml:space="preserve">
<value>Cancel</value>
<comment>Cancel an operation.</comment>
</data>
<data name="Copy" xml:space="preserve">
<value>Copy</value>
<comment>Copy some value to your clipboard.</comment>
</data>
<data name="CopyPassword" xml:space="preserve">
<value>Copy Password</value>
<comment>The button text that allows a user to copy the site's password to their clipboard.</comment>
</data>
<data name="CopyUsername" xml:space="preserve">
<value>Copy Username</value>
<comment>The button text that allows a user to copy the site's username to their clipboard.</comment>
</data>
<data name="Delete" xml:space="preserve">
<value>Delete</value>
<comment>Delete an entity (verb).</comment>
</data>
<data name="DoYouReallyWantToDelete" xml:space="preserve">
<value>Do you really want to delete? This cannot be undone.</value>
<comment>Confirmation alert message when deleteing something.</comment>
</data>
<data name="Edit" xml:space="preserve">
<value>Edit</value>
</data>
<data name="Email" xml:space="preserve"> <data name="Email" xml:space="preserve">
<value>Email</value> <value>Email</value>
<comment>Label for an email address.</comment> <comment>Short label for an email address.</comment>
</data>
<data name="EmailAddress" xml:space="preserve">
<value>Email Address</value>
<comment>Full label for a email address.</comment>
</data> </data>
<data name="Folder" xml:space="preserve"> <data name="Folder" xml:space="preserve">
<value>Folder</value> <value>Folder</value>
@ -133,34 +172,93 @@
<value>(none)</value> <value>(none)</value>
<comment>Sites that have no folder specified go in this special "catch-all" folder.</comment> <comment>Sites that have no folder specified go in this special "catch-all" folder.</comment>
</data> </data>
<data name="GoToWebsite" xml:space="preserve">
<value>Go To Website</value>
<comment>The button text that allows user to launch the website to their web browser.</comment>
</data>
<data name="Hide" xml:space="preserve">
<value>Hide</value>
<comment>Hide a secret value that is currently shown (password).</comment>
</data>
<data name="InternetConnectionRequiredMessage" xml:space="preserve">
<value>Please connect to the internet before continuing.</value>
<comment>Description message for the alert when internet connection is required to continue.</comment>
</data>
<data name="InternetConnectionRequiredTitle" xml:space="preserve">
<value>Internet Connection Required</value>
<comment>Title for the alert when internet connection is required to continue.</comment>
</data>
<data name="Launch" xml:space="preserve">
<value>Launch</value>
<comment>The button text that allows user to launch the website to their web browser.</comment>
</data>
<data name="LogIn" xml:space="preserve"> <data name="LogIn" xml:space="preserve">
<value>Log In</value> <value>Log In</value>
<comment>The login button text.</comment> <comment>The login button text (verb).</comment>
</data>
<data name="LogInNoun" xml:space="preserve">
<value>Login</value>
<comment>Title for login page. (noun)</comment>
</data> </data>
<data name="LogOut" xml:space="preserve"> <data name="LogOut" xml:space="preserve">
<value>Log Out</value> <value>Log Out</value>
<comment>The log out button text.</comment> <comment>The log out button text (verb).</comment>
</data> </data>
<data name="MasterPassword" xml:space="preserve"> <data name="MasterPassword" xml:space="preserve">
<value>Master Password</value> <value>Master Password</value>
<comment>Label for a master password.</comment> <comment>Label for a master password.</comment>
</data> </data>
<data name="More" xml:space="preserve">
<value>More</value>
<comment>Text to define that there are more options things to see.</comment>
</data>
<data name="MoreOptions" xml:space="preserve">
<value>More Options</value>
<comment>The text title that defines more options for a site.</comment>
</data>
<data name="MyVault" xml:space="preserve"> <data name="MyVault" xml:space="preserve">
<value>My Vault</value> <value>My Vault</value>
<comment>The title for the vault page.</comment> <comment>The title for the vault page.</comment>
</data> </data>
<data name="Name" xml:space="preserve">
<value>Name</value>
<comment>Label for an entity name.</comment>
</data>
<data name="No" xml:space="preserve">
<value>No</value>
</data>
<data name="Notes" xml:space="preserve"> <data name="Notes" xml:space="preserve">
<value>Notes</value> <value>Notes</value>
<comment>Label for notes.</comment> <comment>Label for notes.</comment>
</data> </data>
<data name="Ok" xml:space="preserve">
<value>Ok</value>
<comment>Acknowledgement.</comment>
</data>
<data name="Password" xml:space="preserve"> <data name="Password" xml:space="preserve">
<value>Password</value> <value>Password</value>
<comment>Label for a password.</comment> <comment>Label for a password.</comment>
</data> </data>
<data name="Save" xml:space="preserve">
<value>Save</value>
<comment>Button text for a save operation (verb).</comment>
</data>
<data name="Settings" xml:space="preserve"> <data name="Settings" xml:space="preserve">
<value>Settings</value> <value>Settings</value>
<comment>The title for the settings page.</comment> <comment>The title for the settings page.</comment>
</data> </data>
<data name="Show" xml:space="preserve">
<value>Show</value>
<comment>Reveal a hidden value (password).</comment>
</data>
<data name="SiteDeleted" xml:space="preserve">
<value>Site has been deleted.</value>
<comment>Confirmation message after successfully deleting a site.</comment>
</data>
<data name="SiteNoName" xml:space="preserve">
<value>No Name</value>
<comment>Title text to display when there is no name given for a site.</comment>
</data>
<data name="Sync" xml:space="preserve"> <data name="Sync" xml:space="preserve">
<value>Sync</value> <value>Sync</value>
<comment>The title for the sync page.</comment> <comment>The title for the sync page.</comment>
@ -173,4 +271,22 @@
<value>Username</value> <value>Username</value>
<comment>Label for a username.</comment> <comment>Label for a username.</comment>
</data> </data>
<data name="ValidationFieldRequired" xml:space="preserve">
<value>The {0} field is required.</value>
<comment>Validation message for when a form field is left blank and is required to be entered.</comment>
</data>
<data name="ValueHasBeenCopied" xml:space="preserve">
<value>{0} has been copied.</value>
<comment>Confirmation message after suceessfully copying a value to the clipboard.</comment>
</data>
<data name="View" xml:space="preserve">
<value>View</value>
</data>
<data name="Website" xml:space="preserve">
<value>Website</value>
<comment>Label for a website.</comment>
</data>
<data name="Yes" xml:space="preserve">
<value>Yes</value>
</data>
</root> </root>