diff --git a/src/App/Pages/Lock/LockPasswordPage.cs b/src/App/Pages/Lock/LockPasswordPage.cs index 88cc3c051..cf4061f55 100644 --- a/src/App/Pages/Lock/LockPasswordPage.cs +++ b/src/App/Pages/Lock/LockPasswordPage.cs @@ -115,7 +115,8 @@ namespace Bit.App.Pages { if(string.IsNullOrWhiteSpace(PasswordCell.Entry.Text)) { - await DisplayAlert(AppResources.AnErrorHasOccurred, string.Format(AppResources.ValidationFieldRequired, AppResources.MasterPassword), AppResources.Ok); + await DisplayAlert(AppResources.AnErrorHasOccurred, string.Format(AppResources.ValidationFieldRequired, + AppResources.MasterPassword), AppResources.Ok); return; } diff --git a/src/App/Resources/AppResources.Designer.cs b/src/App/Resources/AppResources.Designer.cs index 5ba3badb8..5213d2107 100644 --- a/src/App/Resources/AppResources.Designer.cs +++ b/src/App/Resources/AppResources.Designer.cs @@ -304,6 +304,33 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to Copied!. + /// + public static string Copied { + get { + return ResourceManager.GetString("Copied", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copied password!. + /// + public static string CopiedPassword { + get { + return ResourceManager.GetString("CopiedPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copied username!. + /// + public static string CopiedUsername { + get { + return ResourceManager.GetString("CopiedUsername", resourceCulture); + } + } + /// /// Looks up a localized string similar to Copy. /// @@ -556,6 +583,24 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to Your logins are now easily accessable from Safari, Chrome, and other supported apps.. + /// + public static string ExtensionSetup { + get { + return ResourceManager.GetString("ExtensionSetup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to In Safari and Chrome, find bitwarden using the share icon (hint: scroll to the right on the bottom row of the share menu).. + /// + public static string ExtensionSetup2 { + get { + return ResourceManager.GetString("ExtensionSetup2", resourceCulture); + } + } + /// /// Looks up a localized string similar to Tap the bitwarden icon in the menu to launch the extension.. /// @@ -1033,6 +1078,15 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to You must log into the main bitwarden app before you can use the extension.. + /// + public static string MustLogInMainApp { + get { + return ResourceManager.GetString("MustLogInMainApp", resourceCulture); + } + } + /// /// Looks up a localized string similar to My Vault. /// @@ -1096,6 +1150,15 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to There are no sites in your vault for this website. Tap to add one.. + /// + public static string NoSitesTap { + get { + return ResourceManager.GetString("NoSitesTap", resourceCulture); + } + } + /// /// Looks up a localized string similar to Notes. /// @@ -1105,6 +1168,15 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to This site does not have a username or password configured.. + /// + public static string NoUsernamePasswordConfigured { + get { + return ResourceManager.GetString("NoUsernamePasswordConfigured", resourceCulture); + } + } + /// /// Looks up a localized string similar to Ok. /// @@ -1123,6 +1195,15 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to Option defaults are set from the main bitwarden app's password generator tool.. + /// + public static string OptionDefaults { + get { + return ResourceManager.GetString("OptionDefaults", resourceCulture); + } + } + /// /// Looks up a localized string similar to Options. /// diff --git a/src/App/Resources/AppResources.resx b/src/App/Resources/AppResources.resx index 8e0c5ef27..cdfc8600a 100644 --- a/src/App/Resources/AppResources.resx +++ b/src/App/Resources/AppResources.resx @@ -448,6 +448,15 @@ Continue + + Copied! + + + Copied password! + + + Copied username! + Create Account @@ -492,6 +501,12 @@ See Supported Apps + + Your logins are now easily accessable from Safari, Chrome, and other supported apps. + + + In Safari and Chrome, find bitwarden using the share icon (hint: scroll to the right on the bottom row of the share menu). + Tap the bitwarden icon in the menu to launch the extension. @@ -582,6 +597,9 @@ More Settings + + You must log into the main bitwarden app before you can use the extension. + Never @@ -594,10 +612,19 @@ There are no sites in your vault. + + There are no sites in your vault for this website. Tap to add one. + + + This site does not have a username or password configured. + Ok, got it! Confirmation, like "Ok, I understand it" + + Option defaults are set from the main bitwarden app's password generator tool. + Options diff --git a/src/iOS.Extension/LoadingViewController.cs b/src/iOS.Extension/LoadingViewController.cs index 4fd236c3d..71bdbb12e 100644 --- a/src/iOS.Extension/LoadingViewController.cs +++ b/src/iOS.Extension/LoadingViewController.cs @@ -90,8 +90,7 @@ namespace Bit.iOS.Extension var authService = Resolver.Resolve(); if(!authService.IsAuthenticated) { - var alert = Dialogs.CreateAlert(null, - "You must log into the main bitwarden app before you can use the extension.", AppResources.Ok, (a) => + var alert = Dialogs.CreateAlert(null, AppResources.MustLogInMainApp, AppResources.Ok, (a) => { CompleteRequest(null); }); diff --git a/src/iOS.Extension/LockFingerprintViewController.cs b/src/iOS.Extension/LockFingerprintViewController.cs index 678e30cc3..bf9010407 100644 --- a/src/iOS.Extension/LockFingerprintViewController.cs +++ b/src/iOS.Extension/LockFingerprintViewController.cs @@ -7,6 +7,7 @@ using Plugin.Fingerprint.Abstractions; using System.Threading.Tasks; using Bit.App; using Bit.iOS.Core.Controllers; +using Bit.App.Resources; namespace Bit.iOS.Extension { @@ -67,7 +68,7 @@ namespace Bit.iOS.Extension public async Task CheckFingerprintAsync() { - var result = await _fingerprint.AuthenticateAsync("Use your fingerprint to verify."); + var result = await _fingerprint.AuthenticateAsync(AppResources.FingerprintDirection); if(result.Authenticated) { _settings.AddOrUpdateValue(Constants.Locked, false); diff --git a/src/iOS.Extension/LockPasswordViewController.cs b/src/iOS.Extension/LockPasswordViewController.cs index ae646bcef..287054e72 100644 --- a/src/iOS.Extension/LockPasswordViewController.cs +++ b/src/iOS.Extension/LockPasswordViewController.cs @@ -94,7 +94,7 @@ namespace Bit.iOS.Extension // TODO: keep track of invalid attempts and logout? var alert = Dialogs.CreateAlert(AppResources.AnErrorHasOccurred, - string.Format(null, "Invalid Master Password. Try again."), AppResources.Ok, (a) => + string.Format(null, AppResources.InvalidMasterPassword), AppResources.Ok, (a) => { MasterPasswordCell.TextField.Text = string.Empty; diff --git a/src/iOS.Extension/LockPinViewController.cs b/src/iOS.Extension/LockPinViewController.cs index 219875f12..a3f99c786 100644 --- a/src/iOS.Extension/LockPinViewController.cs +++ b/src/iOS.Extension/LockPinViewController.cs @@ -73,7 +73,7 @@ namespace Bit.iOS.Extension { // TODO: keep track of invalid attempts and logout? - var alert = Dialogs.CreateAlert(null, "Invalid PIN. Try again.", AppResources.Ok, (a) => + var alert = Dialogs.CreateAlert(null, AppResources.InvalidPIN, AppResources.Ok, (a) => { PinTextField.Text = string.Empty; SetLabelText(); diff --git a/src/iOS.Extension/PasswordGeneratorViewController.cs b/src/iOS.Extension/PasswordGeneratorViewController.cs index 29599b76e..477e747e6 100644 --- a/src/iOS.Extension/PasswordGeneratorViewController.cs +++ b/src/iOS.Extension/PasswordGeneratorViewController.cs @@ -11,6 +11,7 @@ using CoreGraphics; using Bit.App; using Bit.iOS.Core.Utilities; using Bit.iOS.Core.Controllers; +using Bit.App.Resources; namespace Bit.iOS.Extension { @@ -30,9 +31,9 @@ namespace Bit.iOS.Extension public SwitchTableViewCell LowercaseCell { get; set; } = new SwitchTableViewCell("a-z"); public SwitchTableViewCell NumbersCell { get; set; } = new SwitchTableViewCell("0-9"); public SwitchTableViewCell SpecialCell { get; set; } = new SwitchTableViewCell("!@#$%^&*"); - public StepperTableViewCell MinNumbersCell { get; set; } = new StepperTableViewCell("Minimum Numbers", 1, 0, 5, 1); - public StepperTableViewCell MinSpecialCell { get; set; } = new StepperTableViewCell("Minimum Special", 1, 0, 5, 1); - public SliderTableViewCell LengthCell { get; set; } = new SliderTableViewCell("Length", 10, 5, 64); + public StepperTableViewCell MinNumbersCell { get; set; } = new StepperTableViewCell(AppResources.MinNumbers, 1, 0, 5, 1); + public StepperTableViewCell MinSpecialCell { get; set; } = new StepperTableViewCell(AppResources.MinSpecial, 1, 0, 5, 1); + public SliderTableViewCell LengthCell { get; set; } = new SliderTableViewCell(AppResources.Length, 10, 5, 64); public override void ViewWillAppear(bool animated) { @@ -202,11 +203,11 @@ namespace Bit.iOS.Extension cell.TextLabel.TextColor = new UIColor(red: 0.24f, green: 0.55f, blue: 0.74f, alpha: 1.0f); if(indexPath.Row == 0) { - cell.TextLabel.Text = "Regenerate Password"; + cell.TextLabel.Text = AppResources.RegeneratePassword; } else if(indexPath.Row == 1) { - cell.TextLabel.Text = "Copy Password"; + cell.TextLabel.Text = AppResources.CopyPassword; } return cell; } @@ -290,7 +291,7 @@ namespace Bit.iOS.Extension { if(section == 1) { - return "Options"; + return AppResources.Options; } return null; @@ -300,7 +301,7 @@ namespace Bit.iOS.Extension { if(section == 1) { - return "Option defaults are set from the main bitwarden app's password generator tool."; + return AppResources.OptionDefaults; } return null; @@ -320,7 +321,7 @@ namespace Bit.iOS.Extension _controller._googleAnalyticsService.TrackExtensionEvent("CopiedGeneratedPassword"); UIPasteboard clipboard = UIPasteboard.General; clipboard.String = _controller.PasswordLabel.Text; - var alert = Dialogs.CreateMessageAlert("Copied!"); + var alert = Dialogs.CreateMessageAlert(AppResources.Copied); _controller.PresentViewController(alert, true, () => { _controller.DismissViewController(true, null); diff --git a/src/iOS.Extension/SetupViewController.cs b/src/iOS.Extension/SetupViewController.cs index 6d1bc7a32..c61a0c919 100644 --- a/src/iOS.Extension/SetupViewController.cs +++ b/src/iOS.Extension/SetupViewController.cs @@ -3,6 +3,7 @@ using Bit.iOS.Extension.Models; using UIKit; using Plugin.Settings.Abstractions; using Bit.iOS.Core.Controllers; +using Bit.App.Resources; namespace Bit.iOS.Extension { @@ -25,9 +26,9 @@ namespace Bit.iOS.Extension { View.BackgroundColor = new UIColor(red: 0.94f, green: 0.94f, blue: 0.96f, alpha: 1.0f); var descriptor = UIFontDescriptor.PreferredBody; - DescriptionLabel.Text = @"Your logins are now easily accessable from Safari, Chrome, and other supported apps. + DescriptionLabel.Text = $@"{AppResources.ExtensionSetup} -In Safari and Chrome, find bitwarden using the share icon (hint: scroll to the right on the bottom row of the share menu)."; +{AppResources.ExtensionSetup2}"; DescriptionLabel.Font = UIFont.FromDescriptor(descriptor, descriptor.PointSize); DescriptionLabel.TextColor = new UIColor(red: 0.47f, green: 0.47f, blue: 0.47f, alpha: 1.0f); ActivatedLabel.Font = UIFont.FromDescriptor(descriptor, descriptor.PointSize * 1.3f); diff --git a/src/iOS.Extension/SiteAddViewController.cs b/src/iOS.Extension/SiteAddViewController.cs index 952e525ce..0a57ed46d 100644 --- a/src/iOS.Extension/SiteAddViewController.cs +++ b/src/iOS.Extension/SiteAddViewController.cs @@ -36,7 +36,7 @@ namespace Bit.iOS.Extension public FormEntryTableViewCell UsernameCell { get; set; } = new FormEntryTableViewCell(AppResources.Username); public FormEntryTableViewCell PasswordCell { get; set; } = new FormEntryTableViewCell(AppResources.Password); public UITableViewCell GeneratePasswordCell { get; set; } = new UITableViewCell(UITableViewCellStyle.Subtitle, "GeneratePasswordCell"); - public SwitchTableViewCell FavoriteCell { get; set; } = new SwitchTableViewCell("Favorite"); + public SwitchTableViewCell FavoriteCell { get; set; } = new SwitchTableViewCell(AppResources.Favorite); public FormEntryTableViewCell NotesCell { get; set; } = new FormEntryTableViewCell(useTextView: true, height: 90); public PickerTableViewCell FolderCell { get; set; } = new PickerTableViewCell(AppResources.Folder); @@ -91,7 +91,7 @@ namespace Bit.iOS.Extension return true; }; - GeneratePasswordCell.TextLabel.Text = "Generate Password"; + GeneratePasswordCell.TextLabel.Text = AppResources.GeneratePassword; GeneratePasswordCell.Accessory = UITableViewCellAccessory.DisclosureIndicator; _folders = _folderService.GetAllAsync().GetAwaiter().GetResult(); @@ -160,7 +160,7 @@ namespace Bit.iOS.Extension }; var saveTask = _siteService.SaveAsync(site); - var loadingAlert = Dialogs.CreateLoadingAlert("Saving..."); + var loadingAlert = Dialogs.CreateLoadingAlert(AppResources.Saving); PresentViewController(loadingAlert, true, null); await saveTask; @@ -299,11 +299,11 @@ namespace Bit.iOS.Extension { if(section == 0) { - return "Site Information"; + return AppResources.SiteInformation; } else if(section == 2) { - return "Notes"; + return AppResources.Notes; } return null; diff --git a/src/iOS.Extension/SiteListViewController.cs b/src/iOS.Extension/SiteListViewController.cs index 920b94068..1e866ffd4 100644 --- a/src/iOS.Extension/SiteListViewController.cs +++ b/src/iOS.Extension/SiteListViewController.cs @@ -13,6 +13,7 @@ using System.Threading.Tasks; using Bit.iOS.Core; using MobileCoreServices; using Bit.iOS.Core.Controllers; +using Bit.App.Resources; namespace Bit.iOS.Extension { @@ -36,7 +37,7 @@ namespace Bit.iOS.Extension base.ViewDidLoad(); if(!CanAutoFill()) { - CancelBarButton.Title = "Close"; + CancelBarButton.Title = AppResources.Close; } TableView.RowHeight = UITableView.AutomaticDimension; @@ -132,7 +133,7 @@ namespace Bit.iOS.Extension if(_tableItems.Count() == 0) { var noDataCell = new UITableViewCell(UITableViewCellStyle.Default, "NoDataCell"); - noDataCell.TextLabel.Text = "There are no sites in your vault for this website. Tap to add one."; + noDataCell.TextLabel.Text = AppResources.NoSitesTap; noDataCell.TextLabel.TextAlignment = UITextAlignment.Center; noDataCell.TextLabel.LineBreakMode = UILineBreakMode.WordWrap; noDataCell.TextLabel.Lines = 0; @@ -190,11 +191,11 @@ namespace Bit.iOS.Extension var sheet = Dialogs.CreateActionSheet(item.Name, _controller); if(!string.IsNullOrWhiteSpace(item.Username)) { - sheet.AddAction(UIAlertAction.Create("Copy Username", UIAlertActionStyle.Default, a => + sheet.AddAction(UIAlertAction.Create(AppResources.CopyUsername, UIAlertActionStyle.Default, a => { UIPasteboard clipboard = UIPasteboard.General; clipboard.String = item.Username; - var alert = Dialogs.CreateMessageAlert("Copied username!"); + var alert = Dialogs.CreateMessageAlert(AppResources.CopyUsername); _controller.PresentViewController(alert, true, () => { _controller.DismissViewController(true, null); @@ -204,11 +205,11 @@ namespace Bit.iOS.Extension if(!string.IsNullOrWhiteSpace(item.Password)) { - sheet.AddAction(UIAlertAction.Create("Copy Password", UIAlertActionStyle.Default, a => + sheet.AddAction(UIAlertAction.Create(AppResources.CopyPassword, UIAlertActionStyle.Default, a => { UIPasteboard clipboard = UIPasteboard.General; clipboard.String = item.Password; - var alert = Dialogs.CreateMessageAlert("Copied password!"); + var alert = Dialogs.CreateMessageAlert(AppResources.CopiedPassword); _controller.PresentViewController(alert, true, () => { _controller.DismissViewController(true, null); @@ -216,12 +217,12 @@ namespace Bit.iOS.Extension })); } - sheet.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Cancel, null)); + sheet.AddAction(UIAlertAction.Create(AppResources.Cancel, UIAlertActionStyle.Cancel, null)); _controller.PresentViewController(sheet, true, null); } else { - var alert = Dialogs.CreateAlert(null, "This site does not have a username or password configured.", "Ok"); + var alert = Dialogs.CreateAlert(null, AppResources.NoUsernamePasswordConfigured, AppResources.Ok); _controller.PresentViewController(alert, true, null); } }