Compare commits

..
102 changed files with 2992 additions and 10096 deletions

No files matched your search

+2 -2
View File
@@ -13,8 +13,8 @@ jobs:
- name: Build client
working-directory: ./FluentTerminal.Client
run: |
yarn
yarn build
npm install
npm run build
- name: Setup MSBuild.exe
uses: warrenbuckley/Setup-MSBuild@v1
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<TargetFramework>netcoreapp2.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
@@ -12,12 +12,12 @@
<ItemGroup>
<PackageReference Include="AutoFixture" Version="4.11.0" />
<PackageReference Include="FluentAssertions" Version="5.10.3" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
<PackageReference Include="Moq" Version="4.14.4" />
<PackageReference Include="FluentAssertions" Version="5.10.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
<PackageReference Include="Moq" Version="4.13.1" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.2">
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
@@ -1,23 +0,0 @@
using System;
namespace FluentTerminal.App.Services.Exceptions
{
public class ReadTextFileException : Exception
{
public ReadTextFileException() : base()
{
}
public ReadTextFileException(string message) : base(message)
{
}
public ReadTextFileException(string message, Exception innerException) : base(message, innerException)
{
}
protected ReadTextFileException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context)
{
}
}
}
@@ -7,10 +7,10 @@
<ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="MvvmLightLibsStd10" Version="5.4.1.1" />
<PackageReference Include="MvvmLightLibs" Version="5.4.1.1" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="PListNet" Version="3.2.0" />
<PackageReference Include="RestSharp" Version="106.11.4" />
<PackageReference Include="PListNet" Version="3.0.0" />
<PackageReference Include="RestSharp" Version="106.10.1" />
<PackageReference Include="Serilog.Sinks.Async" Version="1.4.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
<PackageReference Include="System.Runtime.InteropServices.WindowsRuntime" Version="4.3.0" />
@@ -0,0 +1,12 @@
using FluentTerminal.Models.Enums;
namespace FluentTerminal.App.Services
{
// This validator is needed because accelerator key has to be member of VirtualKey enum.
public interface IAcceleratorKeyValidator
{
bool Valid(int key);
bool Valid(ExtendedVirtualKey key);
}
}
@@ -35,8 +35,6 @@ namespace FluentTerminal.App.Services
Task SaveTextFileAsync(string path, string content);
Task<string> ReadTextFileAsync(string path);
Task<string> GetSshConfigDirAsync();
Task<string[]> GetFilesFromSshConfigDirAsync();
@@ -1,4 +1,5 @@
using FluentTerminal.Models;
using FluentTerminal.App.Services.Utilities;
using FluentTerminal.Models;
using FluentTerminal.Models.Enums;
using System;
using System.Collections.Generic;
@@ -114,18 +115,6 @@ namespace FluentTerminal.App.Services.Implementation
}
};
case Command.ReconnectTab:
return new List<KeyBinding>
{
new KeyBinding
{
Command = nameof(Command.ReconnectTab),
Ctrl = true,
Alt = true,
Key = (int)ExtendedVirtualKey.R
}
};
case Command.NewTab:
return new List<KeyBinding>
{
@@ -230,7 +219,8 @@ namespace FluentTerminal.App.Services.Implementation
Command = nameof(Command.ShowSettings),
Ctrl = true,
Shift = true,
Key = (int)ExtendedVirtualKey.Comma
// I've had to replace ExtendedVirtualKey.Comma because it isn't a member of VirtualKey enum, thus cannot be shown in menu.
Key = (int)ExtendedVirtualKey.S
}
};
@@ -322,36 +312,7 @@ namespace FluentTerminal.App.Services.Implementation
Key = (int)ExtendedVirtualKey.L
}
};
case Command.IncreaseFontSize:
return new List<KeyBinding>
{
new KeyBinding
{
Command = nameof(Command.IncreaseFontSize),
Ctrl = true,
Key = (int)ExtendedVirtualKey.Plus
}
};
case Command.DecreaseFontSize:
return new List<KeyBinding>
{
new KeyBinding
{
Command = nameof(Command.DecreaseFontSize),
Ctrl = true,
Key = (int)ExtendedVirtualKey.Minus
}
};
case Command.ResetFontSize:
return new List<KeyBinding>
{
new KeyBinding
{
Command = nameof(Command.ResetFontSize),
Ctrl = true,
Key = (int)ExtendedVirtualKey.Number0
}
};
default:
throw new InvalidOperationException($"Default keybindings for Command '{command}' are missing");
}
@@ -369,7 +330,7 @@ namespace FluentTerminal.App.Services.Implementation
new TabTheme
{
Id = 0,
Name = "TabTheme.None",
Name = I18N.Translate("TabTheme.None"),
BackgroundOpacity = double.NaN,
BackgroundPointerOverOpacity = double.NaN,
BackgroundPressedOpacity = double.NaN,
@@ -380,37 +341,37 @@ namespace FluentTerminal.App.Services.Implementation
new TabTheme
{
Id = 1,
Name = "TabTheme.Red",
Name = I18N.Translate("TabTheme.Red"),
Color = "#E81123"
},
new TabTheme
{
Id = 2,
Name = "TabTheme.Green",
Name = I18N.Translate("TabTheme.Green"),
Color = "#10893E"
},
new TabTheme
{
Id = 3,
Name = "TabTheme.Blue",
Name = I18N.Translate("TabTheme.Blue"),
Color = "#0078D7"
},
new TabTheme
{
Id = 4,
Name = "TabTheme.Purple",
Name = I18N.Translate("TabTheme.Purple"),
Color = "#881798"
},
new TabTheme
{
Id = 5,
Name = "TabTheme.Orange",
Name = I18N.Translate("TabTheme.Orange"),
Color = "#FF8C00"
},
new TabTheme
{
Id = 6,
Name = "TabTheme.Teal",
Name = I18N.Translate("TabTheme.Teal"),
Color = "#00B7C3"
}
};
@@ -63,8 +63,7 @@ namespace FluentTerminal.App.Services.Implementation
TerminalOptions = GetTerminalOptions(),
Themes = new List<TerminalTheme>(),
Profiles = new List<ShellProfile>(),
SshProfiles = new List<SshProfile>(),
DefaultSettings = GetDefaultSettings(),
SshProfiles = new List<SshProfile>()
};
foreach (var theme in GetThemes().Where(x => !x.PreInstalled))
@@ -72,7 +71,7 @@ namespace FluentTerminal.App.Services.Implementation
config.Themes.Add(theme);
}
foreach (var profile in GetShellProfiles())
foreach (var profile in GetShellProfiles().Where(x => !x.PreInstalled))
{
config.Profiles.Add(profile);
}
@@ -85,15 +84,6 @@ namespace FluentTerminal.App.Services.Implementation
return JsonConvert.SerializeObject(config, PreserveDictionaryKeyCaseContractResolver.SerializerSettings);
}
private Dictionary<string, string> GetDefaultSettings()
{
return new Dictionary<string, string>
{
[DefaultShellProfileKey] = GetDefaultShellProfileId().ToString(),
[CurrentThemeKey] = GetCurrentThemeId().ToString(),
};
}
public void ImportSettings(string serializedSettings)
{
var config = new
@@ -103,8 +93,7 @@ namespace FluentTerminal.App.Services.Implementation
Themes = new List<TerminalTheme>(),
Profiles = new List<ShellProfile>(),
SshProfiles = new List<SshProfile>(),
TerminalOptions = GetTerminalOptions(),
DefaultSettings = new Dictionary<string, string>(),
TerminalOptions = GetTerminalOptions()
};
JsonConvert.PopulateObject(serializedSettings, config);
@@ -128,18 +117,21 @@ namespace FluentTerminal.App.Services.Implementation
SaveTheme(theme, existingTheme != null);
}
foreach (var profile in config.Profiles)
// Can't create pre-installed profiles
foreach (var profile in config.Profiles.Where(x => !x.PreInstalled))
{
var existingProfile = GetShellProfile(profile.Id);
var isNew = existingProfile == default;
var isNew = existingProfile.EqualTo(default);
// You can only edit certain parts of preinstalled profiles
if (!isNew && existingProfile.PreInstalled)
{
// those cannot be edited
profile.Name = existingProfile.Name;
profile.Location = existingProfile.Location;
SaveShellProfile(profile, false);
existingProfile.WorkingDirectory = profile.WorkingDirectory;
existingProfile.Arguments = profile.Arguments;
existingProfile.TabThemeId = profile.TabThemeId;
existingProfile.TerminalThemeId = profile.TerminalThemeId;
existingProfile.KeyBindings = profile.KeyBindings;
SaveShellProfile(profile, isNew);
continue;
}
SaveShellProfile(profile, isNew);
@@ -148,22 +140,12 @@ namespace FluentTerminal.App.Services.Implementation
foreach (var profile in config.SshProfiles)
{
var existingProfile = GetSshProfile(profile.Id);
var isNew = existingProfile == default;
var isNew = existingProfile.EqualTo(default(SshProfile));
SaveSshProfile(profile, isNew);
}
SaveTerminalOptions(config.TerminalOptions);
if (config.DefaultSettings.ContainsKey(DefaultShellProfileKey))
{
SaveDefaultShellProfileId(new Guid(config.DefaultSettings[DefaultShellProfileKey]));
}
if (config.DefaultSettings.ContainsKey(CurrentThemeKey))
{
SaveCurrentThemeId(new Guid(config.DefaultSettings[CurrentThemeKey]));
}
}
public void DeleteShellProfile(Guid id)
@@ -84,18 +84,6 @@ namespace FluentTerminal.App.Services.Implementation
}
}
public async Task<string> ReadTextFileAsync(string path)
{
var response = await GetResponseAsync<StringValueResponse>(new ReadTextFileRequest { Path = path }).ConfigureAwait(false);
if (!response.Success)
{
throw new ReadTextFileException(string.IsNullOrWhiteSpace(response.Error) ? "Failed to read the file." : response.Error);
}
return response.Value;
}
public async Task<string> GetSshConfigDirAsync()
{
if (!string.IsNullOrEmpty(_sshConfigDir))
-10
View File
@@ -24,12 +24,6 @@ namespace FluentTerminal.App.Services
_requireShellProcessStart = !terminalId.HasValue;
}
public void Reconnect()
{
_exited = false;
_trayProcessCommunicationService.TerminalExited += OnTerminalExited;
}
private void OnTerminalExited(object sender, TerminalExitStatus status)
{
if (status.TerminalId != Id)
@@ -77,8 +71,6 @@ namespace FluentTerminal.App.Services
public byte Id { get; }
public ShellProfile Profile { get; private set; }
/// <summary>
/// To be called by either view or viewmodel
/// </summary>
@@ -145,8 +137,6 @@ namespace FluentTerminal.App.Services
/// </summary>
public async Task<TerminalResponse> StartShellProcessAsync(ShellProfile shellProfile, TerminalSize size, SessionType sessionType, string termState)
{
Profile = shellProfile;
if (!_requireShellProcessStart && !string.IsNullOrEmpty(termState))
{
OutputReceived?.Invoke(this, Encoding.UTF8.GetBytes(termState));
@@ -5,7 +5,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MvvmLightLibsStd10" Version="5.4.1.1" />
<PackageReference Include="MvvmLightLibs" Version="5.4.1.1" />
</ItemGroup>
<ItemGroup>
@@ -6,12 +6,10 @@ namespace FluentTerminal.App.ViewModels
{
public interface ITerminalView : IDisposable
{
Task ChangeFontSize(int fontSize);
Task ChangeThemeAsync(TerminalTheme theme);
Task ChangeKeyBindingsAsync();
Task ChangeOptionsAsync(TerminalOptions options);
Task InitializeAsync(TerminalViewModel viewModel);
Task ReconnectAsync();
void DisposalPrepare();
Task FindNextAsync(SearchRequest request);
Task FindPreviousAsync(SearchRequest request);
+19 -13
View File
@@ -28,6 +28,7 @@ namespace FluentTerminal.App.ViewModels
private readonly ISettingsService _settingsService;
private readonly ITrayProcessCommunicationService _trayProcessCommunicationService;
private readonly ICommandHistoryService _commandHistoryService;
private readonly IAcceleratorKeyValidator _acceleratorKeyValidator;
private ApplicationSettings _applicationSettings;
private bool _useAcrylicBackground;
private double _backgroundOpacity;
@@ -37,7 +38,7 @@ namespace FluentTerminal.App.ViewModels
private IDictionary<string, ICollection<KeyBinding>> _keyBindings;
public MainViewModel(ISettingsService settingsService, ITrayProcessCommunicationService trayProcessCommunicationService, IDialogService dialogService, IKeyboardCommandService keyboardCommandService,
IApplicationView applicationView, IClipboardService clipboardService, ICommandHistoryService commandHistoryService)
IApplicationView applicationView, IClipboardService clipboardService, ICommandHistoryService commandHistoryService, IAcceleratorKeyValidator acceleratorKeyValidator)
{
MessengerInstance.Register<ApplicationSettingsChangedMessage>(this, OnApplicationSettingsChanged);
MessengerInstance.Register<ShellProfileAddedMessage>(this, OnShellProfileAdded);
@@ -56,6 +57,7 @@ namespace FluentTerminal.App.ViewModels
_clipboardService = clipboardService;
_keyboardCommandService = keyboardCommandService;
_commandHistoryService = commandHistoryService;
_acceleratorKeyValidator = acceleratorKeyValidator;
_keyboardCommandService.RegisterCommandHandler(nameof(Command.NewTab), async () => await AddDefaultProfileAsync(NewTerminalLocation.Tab));
_keyboardCommandService.RegisterCommandHandler(nameof(Command.NewWindow), async () => await AddDefaultProfileAsync(NewTerminalLocation.Window));
@@ -69,18 +71,11 @@ namespace FluentTerminal.App.ViewModels
_keyboardCommandService.RegisterCommandHandler(nameof(Command.ChangeTabTitle), async () => await SelectedTerminal.EditTitleAsync());
_keyboardCommandService.RegisterCommandHandler(nameof(Command.CloseTab), CloseCurrentTab);
_keyboardCommandService.RegisterCommandHandler(nameof(Command.DuplicateTab), async () => await AddTabAsync(SelectedTerminal.ShellProfile.Clone()));
_keyboardCommandService.RegisterCommandHandler(nameof(Command.ReconnectTab), async () => { if (SelectedTerminal.ReconnectTabCommand.CanExecute()) await SelectedTerminal.ReconnectTabAsync(); });
// empty command handlers for copy and paste so that the main window does not execute these when copy keyboard shortcut is used in a popup search panel
// in such a case an exception would be thrown if no handlers are available so these empty ones mitigate that. Also there is no need for these on the main window anyway
// so leaving them empty is fine.
_keyboardCommandService.RegisterCommandHandler(nameof(Command.Paste), () => { });
_keyboardCommandService.RegisterCommandHandler(nameof(Command.Copy), () => { });
// Add all of the commands for switching to a tab of a given ID, if there's one open there
for (int i = 0; i < 9; i++)
{
var switchCmd = Command.SwitchToTerm1 + i;
var switchCmd = Command.SwitchToTerm1 + i;
int tabNumber = i;
// ReSharper disable once InconsistentNaming
void handler() => SelectTabNumber(tabNumber);
@@ -681,7 +676,8 @@ namespace FluentTerminal.App.ViewModels
icon: Mdl2Icon.Settings());
if (_keyBindings.TryGetValue(nameof(Command.ShowSettings), out var keyBindings) &&
keyBindings.FirstOrDefault() is KeyBinding settingsKeyBinding)
keyBindings.FirstOrDefault() is KeyBinding settingsKeyBinding &&
_acceleratorKeyValidator.Valid(settingsKeyBinding.Key))
{
LoadKeyBindingsFromModel(settingsItem, settingsKeyBinding);
}
@@ -723,7 +719,8 @@ namespace FluentTerminal.App.ViewModels
var defaultProfileCommand = tab ? nameof(Command.NewTab) : nameof(Command.NewWindow);
if (_keyBindings.TryGetValue(defaultProfileCommand, out var kbs) &&
kbs.FirstOrDefault() is KeyBinding tabKeyBindings)
kbs.FirstOrDefault() is KeyBinding tabKeyBindings &&
_acceleratorKeyValidator.Valid(tabKeyBindings.Key))
{
LoadKeyBindingsFromModel(defaultProfileItem, tabKeyBindings);
}
@@ -745,7 +742,8 @@ namespace FluentTerminal.App.ViewModels
var command = tab ? nameof(Command.NewSshTab) : nameof(Command.NewSshWindow);
if (_keyBindings.TryGetValue(command, out var keyBindings) &&
keyBindings.FirstOrDefault() is KeyBinding remoteTabKeyBinding)
keyBindings.FirstOrDefault() is KeyBinding remoteTabKeyBinding &&
_acceleratorKeyValidator.Valid(remoteTabKeyBinding.Key))
{
LoadKeyBindingsFromModel(remoteConnectItem, remoteTabKeyBinding);
}
@@ -766,7 +764,8 @@ namespace FluentTerminal.App.ViewModels
command = tab ? nameof(Command.NewCustomCommandTab) : nameof(Command.NewCustomCommandWindow);
if (_keyBindings.TryGetValue(command, out keyBindings) &&
keyBindings.FirstOrDefault() is KeyBinding quickTabKeyBinding)
keyBindings.FirstOrDefault() is KeyBinding quickTabKeyBinding &&
_acceleratorKeyValidator.Valid(quickTabKeyBinding.Key))
{
LoadKeyBindingsFromModel(quickLaunchItem, quickTabKeyBinding);
}
@@ -795,6 +794,13 @@ namespace FluentTerminal.App.ViewModels
private void LoadKeyBindingsFromModel(MenuItemViewModel menuItemViewModel, KeyBinding keyBinding)
{
if (!_acceleratorKeyValidator.Valid(keyBinding.Key))
{
menuItemViewModel.KeyBinding = null;
return;
}
if (menuItemViewModel.KeyBinding == null)
{
menuItemViewModel.KeyBinding = new MenuItemKeyBindingViewModel(keyBinding);
@@ -1,15 +1,12 @@
using FluentTerminal.App.Services.Utilities;
using FluentTerminal.Models;
using FluentTerminal.Models.Enums;
using FluentTerminal.Models;
using GalaSoft.MvvmLight;
using System;
using System.Collections.Generic;
using Windows.System;
namespace FluentTerminal.App.ViewModels.Menu
{
public class MenuItemKeyBindingViewModel : ViewModelBase
{
#region Properties
private int _key;
public int Key
@@ -83,21 +80,9 @@ namespace FluentTerminal.App.ViewModels.Menu
}
}
public bool IsExtendedVirtualKey => !Enum.IsDefined(typeof(VirtualKey), Key);
#endregion Properties
public string GetOverrideText()
{
var segments = new List<string>();
if (Ctrl) segments.Add("Ctrl");
if (Alt) segments.Add("Alt");
if (Windows) segments.Add("Windows");
if (Shift) segments.Add("Shift");
segments.Add(EnumHelper.GetEnumDescription((ExtendedVirtualKey)Key));
return string.Join("+", segments);
}
#region Constructors
public MenuItemKeyBindingViewModel(int key = 0, bool ctrl = false, bool alt = false, bool shift = false,
bool windows = false)
@@ -116,7 +101,9 @@ namespace FluentTerminal.App.ViewModels.Menu
{
}
#endregion Constructors
#region Methods
private void SetKeyModifiers()
{
@@ -155,5 +142,6 @@ namespace FluentTerminal.App.ViewModels.Menu
return _key == other._key && _keyModifiers == other._keyModifiers;
}
#endregion Methods
}
}
@@ -111,7 +111,13 @@ namespace FluentTerminal.App.ViewModels.Profiles
if (theme == null)
{
return;
// How to handle attempt to setting null theme?
// 1) Throw an exception:
//throw new ArgumentNullException();
// 2) Ignore the attempt:
//return;
// 3) Use default theme (probably the best):
theme = TerminalThemes.First();
}
else if (!TerminalThemes.Contains(theme))
{
@@ -199,8 +199,8 @@ namespace FluentTerminal.App.ViewModels.Profiles
}
return _sshPort == SshProfile.DefaultSshPort
? $"-i \"{_identityFile}\""
: $"-p {_sshPort:#####} -i \"{_identityFile}\"";
? $"-i '{_identityFile}'"
: $"-p {_sshPort:#####} -i '{_identityFile}'";
}
protected override void LoadFromProfile(ShellProfile profile)
@@ -46,7 +46,6 @@ namespace FluentTerminal.App.ViewModels
public string XtermBufferState { get; set; }
public byte TerminalId { get; set; }
public ShellProfile ShellProfile { get; set; }
public int FontSize { get; set; }
}
public async Task<string> SerializeAsync()
@@ -65,8 +64,7 @@ namespace FluentTerminal.App.ViewModels
SearchWithRegex = SearchWithRegex,
XtermBufferState = await SerializeXtermStateAsync().ConfigureAwait(false),
TerminalId = Terminal.Id,
ShellProfile = ShellProfile,
FontSize = FontSize
ShellProfile = ShellProfile
};
return JsonConvert.SerializeObject(state);
@@ -90,7 +88,7 @@ namespace FluentTerminal.App.ViewModels
XtermBufferState = state.XtermBufferState;
_terminalId = state.TerminalId;
ShellProfile = state.ShellProfile;
FontSize = state.FontSize;
TabTheme.IsSelected = true;
}
}
@@ -118,8 +116,6 @@ namespace FluentTerminal.App.ViewModels
private string _hoveredUri;
private MenuViewModel _contextMenu;
private MenuViewModel _tabContextMenu;
private readonly TabThemeViewModel _transparentTabThemeViewModel;
private int _fontSize;
public TerminalViewModel(ISettingsService settingsService, ITrayProcessCommunicationService trayProcessCommunicationService, IDialogService dialogService,
IKeyboardCommandService keyboardCommandService, ApplicationSettings applicationSettings, ShellProfile shellProfile,
@@ -155,14 +151,11 @@ namespace FluentTerminal.App.ViewModels
CloseSearchPanelCommand = new RelayCommand(CloseSearchPanel, CanExecuteCommand);
EditTitleCommand = new AsyncCommand(EditTitleAsync, CanExecuteCommand);
DuplicateTabCommand = new RelayCommand(DuplicateTab, CanExecuteCommand);
ReconnectTabCommand = new AsyncCommand(ReconnectTabAsync, () => CanExecuteCommand() && HasExitedWithError);
CopyCommand = new AsyncCommand(Copy, () => HasSelection);
PasteCommand = new AsyncCommand(Paste);
CopyLinkCommand = new AsyncCommand(() => CopyTextAsync(HoveredUri), () => !string.IsNullOrWhiteSpace(HoveredUri));
ShowSearchPanelCommand = new RelayCommand(() => ShowSearchPanel = true, () => !ShowSearchPanel);
FontSize = _terminalOptions.FontSize;
if (!string.IsNullOrEmpty(terminalState))
{
Restore(terminalState);
@@ -173,8 +166,6 @@ namespace FluentTerminal.App.ViewModels
defaultTabTheme.IsSelected = true;
}
_transparentTabThemeViewModel = TabThemes.FirstOrDefault(t => t.Theme.Id == 0);
Terminal = new Terminal(TrayProcessCommunicationService, _terminalId);
Terminal.KeyboardCommandReceived += Terminal_KeyboardCommandReceived;
Terminal.OutputReceived += Terminal_OutputReceived;
@@ -221,19 +212,18 @@ namespace FluentTerminal.App.ViewModels
public event EventHandler CloseRightTabsRequested;
public event EventHandler CloseOtherTabsRequested;
public event EventHandler DuplicateTabRequested;
public event EventHandler<int> FontSizeChanged;
public ApplicationSettings ApplicationSettings { get; private set; }
public IApplicationView ApplicationView { get; }
public TabThemeViewModel BackgroundTabTheme
public TabTheme BackgroundTabTheme
{
// The effective background theme depends on whether it is selected (use the theme), or if it is inactive
// (if we're set to underline inactive tabs, use the null theme).
get => IsSelected || (!IsSelected && ApplicationSettings.InactiveTabColorMode == InactiveTabColorMode.Background) ?
TabTheme :
_transparentTabThemeViewModel;
_tabTheme?.Theme :
SettingsService.GetTabThemes().FirstOrDefault(t => t.Color == null);
}
public IClipboardService ClipboardService { get; }
@@ -260,8 +250,6 @@ namespace FluentTerminal.App.ViewModels
public RelayCommand DuplicateTabCommand { get; }
public AsyncCommand ReconnectTabCommand { get; }
public ICommand CopyLinkCommand { get; private set; }
public ICommand CopyCommand { get; private set; }
@@ -348,7 +336,6 @@ namespace FluentTerminal.App.ViewModels
{
HasNewOutput = false;
}
ReconnectTabCommand.RaiseCanExecuteChanged();
}
}
@@ -386,8 +373,6 @@ namespace FluentTerminal.App.ViewModels
set => Set(ref _showSearchPanel, value);
}
public bool SearchHasFocus { get; set; }
public TabThemeViewModel TabTheme
{
get => _tabTheme;
@@ -396,9 +381,6 @@ namespace FluentTerminal.App.ViewModels
Set(ref _tabTheme, value);
RaisePropertyChanged(nameof(IsUnderlined));
RaisePropertyChanged(nameof(BackgroundTabTheme));
// necessary to update this constantly so that duplicated tabs will also carry over the color
ShellProfile.TabThemeId = value.Theme.Id;
}
}
@@ -443,7 +425,6 @@ namespace FluentTerminal.App.ViewModels
}
Set(ref _tabTitle, title);
ShellProfile.Name = title;
}
}
@@ -459,15 +440,6 @@ namespace FluentTerminal.App.ViewModels
}
}
public int FontSize
{
get => _fontSize;
set
{
_fontSize = value > 0 ? value : 1;
}
}
public ITrayProcessCommunicationService TrayProcessCommunicationService { get; }
public Task CloseAsync()
@@ -570,12 +542,6 @@ namespace FluentTerminal.App.ViewModels
DuplicateTabRequested?.Invoke(this, EventArgs.Empty);
}
public async Task ReconnectTabAsync()
{
HasExitedWithError = false;
await TerminalView?.ReconnectAsync();
}
private void OnApplicationSettingsChanged(ApplicationSettingsChangedMessage message)
{
ApplicationSettings = message.ApplicationSettings;
@@ -684,28 +650,6 @@ namespace FluentTerminal.App.ViewModels
}).ConfigureAwait(false);
return;
}
case nameof(Command.IncreaseFontSize):
{
FontSize++;
FontSizeChanged?.Invoke(this, FontSize);
return;
}
case nameof(Command.DecreaseFontSize):
{
if (FontSize > 2)
{
FontSize--;
FontSizeChanged?.Invoke(this, FontSize);
}
return;
}
case nameof(Command.ResetFontSize):
{
FontSize = _terminalOptions.FontSize;
FontSizeChanged?.Invoke(this, FontSize);
return;
}
default:
{
await ApplicationView.ExecuteOnUiThreadAsync(() => _keyboardCommandService.SendCommand(e))
@@ -735,7 +679,6 @@ namespace FluentTerminal.App.ViewModels
private void Terminal_TitleChanged(object sender, string e)
{
if (e == Terminal.Profile.Location) return;
ApplicationView.ExecuteOnUiThreadAsync(() => ShellTitle = e);
}
@@ -763,15 +706,10 @@ namespace FluentTerminal.App.ViewModels
private async Task Paste()
{
// prevent from pasting something into the terminal window when the actual command is executed
// while being in the search box
if (!SearchHasFocus)
var content = await ClipboardService.GetTextAsync().ConfigureAwait(false);
if (content != null)
{
var content = await ClipboardService.GetTextAsync().ConfigureAwait(false);
if (content != null)
{
TerminalView.Paste(content);
}
TerminalView.Paste(content);
}
}
@@ -829,7 +767,7 @@ namespace FluentTerminal.App.ViewModels
{
//todo localise name
var icon = tabTheme.Theme.Id == 0 ? Mdl2Icon.PaginationDotOutline10() : Mdl2Icon.PaginationDotSolid10(tabTheme.Theme.Color);
return new RadioMenuItemViewModel(I18N.Translate($"{tabTheme.Theme.Name}"), $"{Terminal.Id}_tabTheme", tabTheme, bindingPath: nameof(TabThemeViewModel.IsSelected) , icon: icon);
return new RadioMenuItemViewModel(I18N.Translate($"TabTheme.{tabTheme.Theme.Name}"), $"{Terminal.Id}_tabTheme", tabTheme, bindingPath: nameof(TabThemeViewModel.IsSelected) , icon: icon);
}
var tabColor = new ExpandableMenuItemViewModel(I18N.Translate("Color.Text"));
+1 -14
View File
@@ -9,24 +9,11 @@ namespace FluentTerminal.App.Actions
public object Execute(object sender, object parameter)
{
var control = TargetObject ?? sender as Control;
if (control != null)
{
if (!control.IsLoaded)
control.Loaded += Control_Loaded;
else
control.Focus(FocusState.Programmatic);
}
control?.Focus(FocusState.Programmatic);
return null;
}
private void Control_Loaded(object sender, RoutedEventArgs e)
{
Control control = sender as Control;
control.Focus(FocusState.Programmatic);
control.Loaded -= Control_Loaded; // won't be needed anymore. Remove reference just in case
}
public Control TargetObject
{
get { return (Control)GetValue(TargetObjectProperty); }
+149 -193
View File
@@ -47,7 +47,6 @@ namespace FluentTerminal.App
private readonly ISettingsService _settingsService;
private readonly ITrayProcessCommunicationService _trayProcessCommunicationService;
private readonly IDialogService _dialogService;
private readonly INotificationService _notificationService;
private bool _alreadyLaunched;
private bool _isLaunching;
private ApplicationSettings _applicationSettings;
@@ -111,13 +110,13 @@ namespace FluentTerminal.App
builder.RegisterType<StartupTaskService>().As<IStartupTaskService>().SingleInstance();
builder.RegisterType<ApplicationLanguageService>().As<IApplicationLanguageService>().SingleInstance();
builder.RegisterType<ShellProfileMigrationService>().As<IShellProfileMigrationService>().SingleInstance();
builder.RegisterType<AcceleratorKeyValidator>().As<IAcceleratorKeyValidator>().SingleInstance();
_container = builder.Build();
Messenger.Default.Register<ApplicationSettingsChangedMessage>(this, OnApplicationSettingsChanged);
_settingsService = _container.Resolve<ISettingsService>();
_notificationService = _container.Resolve<INotificationService>();
var shellProfileMigrationService = _container.Resolve<IShellProfileMigrationService>();
foreach (var profile in _settingsService.GetShellProfiles())
@@ -187,189 +186,7 @@ namespace FluentTerminal.App
protected override async void OnActivated(IActivatedEventArgs args)
{
await OnLaunchOrActivate(args);
base.OnActivated(args);
}
private async Task ParseCommandLineArgumentsAsync(object verb, CommandLineActivatedEventArgs commandLineActivated)
{
using var deferral = commandLineActivated.Operation.GetDeferral();
if (verb is SettingsVerb settingsVerb)
{
if (string.IsNullOrWhiteSpace(settingsVerb.Import) && !settingsVerb.Export)
{
await ShowSettingsAsync();
}
else if (settingsVerb.Export)
{
var settings = _settingsService.ExportSettings();
var path = Path.Combine(commandLineActivated.Operation.CurrentDirectoryPath, "config.json");
try
{
await StartSystemTray().ConfigureAwait(false);
await _trayProcessCommunicationService.SaveTextFileAsync(path, settings).ConfigureAwait(false);
_notificationService.ShowNotification("Export settings", $"Settings were exported to {path}.");
}
catch (Exception e)
{
_notificationService.ShowNotification("Export settings", $"Failed with error: {e.Message}");
commandLineActivated.Operation.ExitCode = 1;
}
if (!_isLaunching && !_alreadyLaunched)
{
Exit();
}
}
else if (!string.IsNullOrWhiteSpace(settingsVerb.Import))
{
var path = Path.Combine(commandLineActivated.Operation.CurrentDirectoryPath, settingsVerb.Import.Replace(".\\", string.Empty));
try
{
await StartSystemTray().ConfigureAwait(false);
var content = await _trayProcessCommunicationService.ReadTextFileAsync(path).ConfigureAwait(false);
_settingsService.ImportSettings(content);
_notificationService.ShowNotification("Import settings", $"Successfully imported settings from {path}.");
}
catch (Exception e)
{
_notificationService.ShowNotification("Import settings", $"Failed with error: {e.Message}");
commandLineActivated.Operation.ExitCode = 1;
}
if (!_isLaunching && !_alreadyLaunched)
{
Exit();
}
}
}
else if (verb is NewVerb newVerb)
{
var profile = default(ShellProfile);
if (!string.IsNullOrWhiteSpace(newVerb.Profile))
{
profile = _settingsService.GetShellProfiles().FirstOrDefault(x => x.Name.Equals(newVerb.Profile, StringComparison.CurrentCultureIgnoreCase));
}
if (profile == null)
{
profile = _settingsService.GetDefaultShellProfile();
}
if (!string.IsNullOrWhiteSpace(newVerb.Directory) && newVerb.Directory != ".")
{
profile.WorkingDirectory = newVerb.Directory;
}
else
{
profile.WorkingDirectory = commandLineActivated.Operation.CurrentDirectoryPath;
}
var location = newVerb.Target == Target.Default ? _applicationSettings.NewTerminalLocation
: newVerb.Target == Target.Tab ? NewTerminalLocation.Tab
: NewTerminalLocation.Window;
await CreateTerminalAsync(profile, location);
}
else if (verb is RunVerb runVerb)
{
var profile = new ShellProfile
{
Id = Guid.Empty,
Location = null,
Arguments = runVerb.Command,
WorkingDirectory = runVerb.Directory
};
if (runVerb.SmartBuffer.HasValue)
{
profile.UseBuffer = runVerb.SmartBuffer.Value;
}
if (!string.IsNullOrWhiteSpace(runVerb.Theme))
{
var theme = _settingsService.GetThemes().FirstOrDefault(x => x.Name.Equals(runVerb.Theme, StringComparison.CurrentCultureIgnoreCase));
if (theme != null)
{
profile.TerminalThemeId = theme.Id;
}
}
if (string.IsNullOrWhiteSpace(profile.WorkingDirectory))
{
profile.WorkingDirectory = commandLineActivated.Operation.CurrentDirectoryPath;
}
var location = runVerb.Target == Target.Default ? _applicationSettings.NewTerminalLocation
: runVerb.Target == Target.Tab ? NewTerminalLocation.Tab
: NewTerminalLocation.Window;
await CreateTerminalAsync(profile, location);
}
}
private Task ShowOrCreateWindowAsync(ActivationViewSwitcher viewSwitcher)
{
var viewModel = _mainViewModels.Find(o => o.ApplicationView.Id == _activeWindowId) ??
_mainViewModels.LastOrDefault();
return viewModel == null
? CreateTerminalAsync(_settingsService.GetDefaultShellProfile(), NewTerminalLocation.Tab, viewSwitcher)
: ShowAsStandaloneAsync(viewModel, viewSwitcher);
}
protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
await OnLaunchOrActivate(args);
}
public async Task OnLaunchOrActivate(IActivatedEventArgs args)
{
if (args is LaunchActivatedEventArgs launchActivated)
{
if (_isLaunching)
{
return;
}
_isLaunching = true;
if (!_alreadyLaunched)
{
await InitializeLoggerAsync();
// ReSharper disable once AssignmentIsFullyDiscarded
_ = JumpListHelper.UpdateAsync(_settingsService);
var viewModel = _container.Resolve<MainViewModel>();
if (launchActivated.Arguments.StartsWith(JumpListHelper.ShellProfileFlag))
{
await viewModel.AddProfileByGuidAsync(Guid.Parse(launchActivated.Arguments.Replace(JumpListHelper.ShellProfileFlag, string.Empty)));
}
else
{
await viewModel.AddDefaultProfileAsync(NewTerminalLocation.Tab);
}
await CreateMainViewAsync(typeof(MainPage), viewModel, true);
Window.Current.Activate();
}
else if (launchActivated.Arguments.StartsWith(JumpListHelper.ShellProfileFlag))
{
var location = _applicationSettings.NewTerminalLocation;
var profile = _settingsService.GetShellProfile(Guid.Parse(launchActivated.Arguments.Replace(JumpListHelper.ShellProfileFlag, string.Empty)));
await CreateTerminalAsync(profile, location, launchActivated.ViewSwitcher);
}
else
{
var viewModel = await CreateNewTerminalWindowAsync();
await viewModel.AddDefaultProfileAsync(NewTerminalLocation.Tab);
await ShowAsStandaloneAsync(viewModel, launchActivated.ViewSwitcher);
}
_isLaunching = false;
}
else if (args is ProtocolActivatedEventArgs protocolActivated)
if (args is ProtocolActivatedEventArgs protocolActivated)
{
if (protocolActivated.Uri == new Uri("ftcmd://fluent.terminal?focus"))
{
@@ -445,7 +262,7 @@ namespace FluentTerminal.App
var error = await vm.AcceptChangesAsync(true);
var profile = (SshProfile)vm.Model;
var profile = (SshProfile) vm.Model;
if (!string.IsNullOrEmpty(error))
{
@@ -530,7 +347,8 @@ namespace FluentTerminal.App
return;
}
else if (args is CommandLineActivatedEventArgs commandLineActivated)
if (args is CommandLineActivatedEventArgs commandLineActivated)
{
var arguments = commandLineActivated.Operation.Arguments;
if (string.IsNullOrWhiteSpace(arguments))
@@ -540,10 +358,153 @@ namespace FluentTerminal.App
_commandLineParser
.ParseArguments(SplitArguments(arguments), typeof(NewVerb), typeof(RunVerb), typeof(SettingsVerb))
.WithParsed(async verb => await ParseCommandLineArgumentsAsync(verb, commandLineActivated));
.WithParsed(async verb => await CliRunAsync(verb, commandLineActivated));
}
}
private async Task CliRunAsync(object verb, CommandLineActivatedEventArgs commandLineActivated)
{
if (verb is SettingsVerb settingsVerb)
{
if (!settingsVerb.Import && !settingsVerb.Export)
{
await ShowSettingsAsync();
}
else if (settingsVerb.Export)
{
var exportFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("config.json", CreationCollisionOption.OpenIfExists);
var settings = _settingsService.ExportSettings();
await FileIO.WriteTextAsync(exportFile, settings);
await new MessageDialog($"{I18N.Translate("SettingsExported")} {exportFile.Path}").ShowAsync();
}
else if (settingsVerb.Import)
{
var file = await ApplicationData.Current.LocalFolder.GetFileAsync("config.json");
var content = await FileIO.ReadTextAsync(file);
_settingsService.ImportSettings(content);
await new MessageDialog($"{I18N.Translate("SettingsImported")} {file.Path}").ShowAsync();
}
}
else if (verb is NewVerb newVerb)
{
var profile = default(ShellProfile);
if (!string.IsNullOrWhiteSpace(newVerb.Profile))
{
profile = _settingsService.GetShellProfiles().FirstOrDefault(x => x.Name.Equals(newVerb.Profile, StringComparison.CurrentCultureIgnoreCase));
}
if (profile == null)
{
profile = _settingsService.GetDefaultShellProfile();
}
if (!string.IsNullOrWhiteSpace(newVerb.Directory) && newVerb.Directory != ".")
{
profile.WorkingDirectory = newVerb.Directory;
}
else
{
profile.WorkingDirectory = commandLineActivated.Operation.CurrentDirectoryPath;
}
var location = newVerb.Target == Target.Default ? _applicationSettings.NewTerminalLocation
: newVerb.Target == Target.Tab ? NewTerminalLocation.Tab
: NewTerminalLocation.Window;
await CreateTerminalAsync(profile, location);
}
else if (verb is RunVerb runVerb)
{
var profile = new ShellProfile
{
Id = Guid.Empty,
Location = null,
Arguments = runVerb.Command,
WorkingDirectory = runVerb.Directory
};
if (!string.IsNullOrEmpty(runVerb.Buffer) && bool.TryParse(runVerb.Buffer, out var useBuffer))
{
profile.UseBuffer = useBuffer;
}
if (!string.IsNullOrWhiteSpace(runVerb.Theme))
{
var theme = _settingsService.GetThemes().FirstOrDefault(x => x.Name.Equals(runVerb.Theme, StringComparison.CurrentCultureIgnoreCase));
if (theme != null)
{
profile.TerminalThemeId = theme.Id;
}
}
if (string.IsNullOrWhiteSpace(profile.WorkingDirectory))
{
profile.WorkingDirectory = commandLineActivated.Operation.CurrentDirectoryPath;
}
var location = runVerb.Target == Target.Default ? _applicationSettings.NewTerminalLocation
: runVerb.Target == Target.Tab ? NewTerminalLocation.Tab
: NewTerminalLocation.Window;
await CreateTerminalAsync(profile, location);
}
}
private Task ShowOrCreateWindowAsync(ActivationViewSwitcher viewSwitcher)
{
var viewModel = _mainViewModels.Find(o => o.ApplicationView.Id == _activeWindowId) ??
_mainViewModels.LastOrDefault();
return viewModel == null
? CreateTerminalAsync(_settingsService.GetDefaultShellProfile(), NewTerminalLocation.Tab, viewSwitcher)
: ShowAsStandaloneAsync(viewModel, viewSwitcher);
}
protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
if (_isLaunching)
{
return;
}
_isLaunching = true;
if (!_alreadyLaunched)
{
await InitializeLoggerAsync();
// ReSharper disable once AssignmentIsFullyDiscarded
_ = JumpListHelper.UpdateAsync(_settingsService);
var viewModel = _container.Resolve<MainViewModel>();
if (args.Arguments.StartsWith(JumpListHelper.ShellProfileFlag))
{
await viewModel.AddProfileByGuidAsync(Guid.Parse(args.Arguments.Replace(JumpListHelper.ShellProfileFlag, string.Empty)));
}
else
{
await viewModel.AddDefaultProfileAsync(NewTerminalLocation.Tab);
}
await CreateMainViewAsync(typeof(MainPage), viewModel, true);
Window.Current.Activate();
}
else if (args.Arguments.StartsWith(JumpListHelper.ShellProfileFlag))
{
var location = _applicationSettings.NewTerminalLocation;
var profile = _settingsService.GetShellProfile(Guid.Parse(args.Arguments.Replace(JumpListHelper.ShellProfileFlag, string.Empty)));
await CreateTerminalAsync(profile, location, args.ViewSwitcher);
}
else
{
var viewModel = await CreateNewTerminalWindowAsync();
await viewModel.AddDefaultProfileAsync(NewTerminalLocation.Tab);
await ShowAsStandaloneAsync(viewModel, args.ViewSwitcher);
}
_isLaunching = false;
}
private static async Task InitializeLoggerAsync()
{
var logDirectory = await ApplicationData.Current.LocalCacheFolder.CreateFolderAsync("Logs", CreationCollisionOption.OpenIfExists);
@@ -798,11 +759,6 @@ namespace FluentTerminal.App
private Task StartSystemTray()
{
if (_trayReady.Task.IsCompleted)
{
return Task.CompletedTask;
}
var launch = FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync("AppLaunchedParameterGroup").AsTask();
return Task.WhenAll(launch, _trayReady.Task).ContinueWith(
@@ -14,8 +14,8 @@ namespace FluentTerminal.App.CommandLineArguments
[Option("theme")]
public string Theme { get; set; }
[Option("smart-buffer")]
public bool? SmartBuffer { get; set; }
[Option("buffer")]
public string Buffer { get; set; }
[Option("target")]
public Target Target { get; set; }
@@ -6,8 +6,8 @@ namespace FluentTerminal.App.CommandLineArguments
public class SettingsVerb
{
[Option('i', "import",
HelpText = "Import settings from specified file.")]
public string Import { get; set; }
HelpText = "Import settings.")]
public bool Import { get; set; }
[Option('e', "export",
HelpText = "Export settings.")]
@@ -20,10 +20,6 @@ namespace FluentTerminal.App.Converters
{
return Translate($"{enumType}.{enumValue}");
}
else if (value is string stringValue)
{
return Translate(stringValue);
}
else if (parameter is string resource)
{
return Translate(resource);
@@ -7,7 +7,6 @@ using Windows.UI.Xaml.Input;
using FluentTerminal.App.ViewModels.Menu;
using FluentTerminal.App.Views;
using Microsoft.UI.Xaml.Controls;
using Windows.Foundation.Metadata;
// ReSharper disable LocalizableElement
@@ -91,22 +90,12 @@ namespace FluentTerminal.App.Converters
if (viewModel.KeyBinding != null)
{
if (viewModel.KeyBinding.IsExtendedVirtualKey)
item.KeyboardAccelerators?.Add(new KeyboardAccelerator
{
if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 6))
{
item.KeyboardAcceleratorTextOverride = viewModel.KeyBinding.GetOverrideText();
}
}
else
{
item.KeyboardAccelerators?.Add(new KeyboardAccelerator
{
Key = (VirtualKey)viewModel.KeyBinding.Key,
Modifiers = (VirtualKeyModifiers)viewModel.KeyBinding.KeyModifiers,
IsEnabled = true
});
}
Key = (VirtualKey) viewModel.KeyBinding.Key,
Modifiers = (VirtualKeyModifiers) viewModel.KeyBinding.KeyModifiers,
IsEnabled = true
});
}
return item;
@@ -16,6 +16,8 @@ namespace FluentTerminal.App.Dialogs
// ReSharper disable once RedundantExtendsListEntry
public sealed partial class CreateKeyBindingDialog : ContentDialog, ICreateKeyBindingDialog, INotifyPropertyChanged
{
private readonly IAcceleratorKeyValidator _acceleratorKeyValidator;
private bool _ctrl;
private bool _shift;
private bool _alt;
@@ -51,12 +53,17 @@ namespace FluentTerminal.App.Dialogs
get => _key;
set
{
Set(ref _key, value);
// We're ignoring invalid keys.
if (_acceleratorKeyValidator.Valid(value))
{
Set(ref _key, value);
}
}
}
public CreateKeyBindingDialog()
public CreateKeyBindingDialog(IAcceleratorKeyValidator acceleratorKeyValidator)
{
_acceleratorKeyValidator = acceleratorKeyValidator;
InitializeComponent();
ResetCommand = new RelayCommand(Reset);
PreviewKeyDown += RegisterKeyBindingDialog_PreviewKeyDown;
@@ -79,6 +79,7 @@
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<!-- Row -->
@@ -123,6 +124,16 @@
Margin="0,8,0,0"
Content="{x:Bind Converter={StaticResource I18NConverter}, ConverterParameter=UseConPty}"
IsChecked="{x:Bind ViewModel.UseConPty, Mode=TwoWay}" />
<!-- Row -->
<CheckBox
Grid.Row="3"
Grid.Column="0"
Grid.ColumnSpan="2"
Margin="0,8,0,0"
Content="{x:Bind Converter={StaticResource I18NConverter}, ConverterParameter=UseBuffer}"
IsChecked="{x:Bind ViewModel.UseBuffer, Mode=TwoWay}" />
</Grid>
</controls:Expander>
@@ -233,13 +233,9 @@ namespace FluentTerminal.App.Dialogs
else
{
await new MessageDialog(error, I18N.Translate("InvalidInput")).ShowAsync();
SetupFocus(); // needed to apply focus back to the textbox instead of the terminal in the background.
}
}
return;
case VirtualKey.Escape:
Hide();
return;
}
}
@@ -129,6 +129,7 @@
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<!-- Row -->
@@ -208,6 +209,16 @@
Margin="0,8,0,0"
Content="{x:Bind Converter={StaticResource I18NConverter}, ConverterParameter=UseConPty}"
IsChecked="{x:Bind ViewModel.UseConPty, Mode=TwoWay}" />
<!-- Row -->
<CheckBox
Grid.Row="4"
Grid.Column="0"
Grid.ColumnSpan="4"
Margin="0,8,0,0"
Content="{x:Bind Converter={StaticResource I18NConverter}, ConverterParameter=UseBuffer}"
IsChecked="{x:Bind ViewModel.UseBuffer, Mode=TwoWay}" />
</Grid>
</controls:Expander>
+12 -39
View File
@@ -9,7 +9,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>FluentTerminal.App</RootNamespace>
<AssemblyName>FluentTerminal.App</AssemblyName>
<DefaultLanguage>en-US</DefaultLanguage>
<DefaultLanguage>en</DefaultLanguage>
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
<TargetPlatformVersion Condition=" '$(TargetPlatformVersion)' == '' ">10.0.18362.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.16299.0</TargetPlatformMinVersion>
@@ -17,7 +17,6 @@
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WindowsXamlEnableOverview>true</WindowsXamlEnableOverview>
<AppxBundlePlatforms>x64</AppxBundlePlatforms>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
@@ -134,6 +133,7 @@
<Compile Include="Dialogs\AboutDialog.xaml.cs">
<DependentUpon>AboutDialog.xaml</DependentUpon>
</Compile>
<Compile Include="Services\AcceleratorKeyValidator.cs" />
<Compile Include="Services\CommandHistoryService.cs" />
<Compile Include="Utilities\DelayedAction.cs" />
<Compile Include="Utilities\DispatcherExtensions.cs" />
@@ -237,14 +237,12 @@
<Content Include="Client\index.html" />
<Content Include="Client\style.css" />
<Content Include="Client\xterm.css" />
<PRIResource Include="Strings\eo\Resources.resw" />
<PRIResource Include="Strings\ru\Resources.resw" />
<PRIResource Include="Strings\fr\Resources.resw" />
<PRIResource Include="Strings\es\Resources.resw" />
<PRIResource Include="Strings\de\Resources.resw" />
<PRIResource Include="Strings\ug-Arab\Resources.resw" />
<PRIResource Include="Strings\zh-Hant\Resources.resw" />
<PRIResource Include="Strings\en-US\Resources.resw" />
<PRIResource Include="Strings\en\Resources.resw" />
</ItemGroup>
<ItemGroup>
<Content Include="Properties\Default.rd.xml" />
@@ -353,22 +351,22 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Autofac">
<Version>5.2.0</Version>
<Version>5.1.2</Version>
</PackageReference>
<PackageReference Include="CommandLineParser">
<Version>2.8.0</Version>
<Version>2.7.82</Version>
</PackageReference>
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.2.10</Version>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.UI">
<Version>6.1.0</Version>
<Version>6.0.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.Toolkit.Uwp.UI.Controls">
<Version>6.1.0</Version>
<Version>6.0.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.UI.Xaml">
<Version>2.4.2</Version>
<Version>2.3.200213001</Version>
</PackageReference>
<PackageReference Include="Microsoft.Xaml.Behaviors.Uwp.Managed">
<Version>2.0.1</Version>
@@ -376,17 +374,8 @@
<PackageReference Include="Newtonsoft.Json">
<Version>12.0.3</Version>
</PackageReference>
<PackageReference Include="System.IO.FileSystem.Primitives">
<Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Runtime.Handles">
<Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Text.Encoding.Extensions">
<Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="Win2D.uwp">
<Version>1.25.0</Version>
<Version>1.24.0</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
@@ -427,6 +416,9 @@
<ItemGroup>
<PRIResource Include="Strings\he\Resources.resw" />
</ItemGroup>
<ItemGroup>
<PRIResource Include="Strings\az\Resources.resw" />
</ItemGroup>
<ItemGroup>
<PRIResource Include="Strings\ja\Resources.resw" />
</ItemGroup>
@@ -445,25 +437,6 @@
<ItemGroup>
<PRIResource Include="Strings\zh-Hans\Resources.resw" />
</ItemGroup>
<ItemGroup>
<PRIResource Include="Strings\fa\Resources.resw" />
</ItemGroup>
<ItemGroup>
<PRIResource Include="Strings\hu\Resources.resw" />
</ItemGroup>
<ItemGroup>
<PRIResource Include="Strings\tr\Resources.resw" />
</ItemGroup>
<ItemGroup>
<PRIResource Include="Strings\hr\Resources.resw" />
</ItemGroup>
<ItemGroup>
<PRIResource Include="Strings\sl\Resources.resw" />
</ItemGroup>
<ItemGroup>
<PRIResource Include="Strings\az-Latn\Resources.resw" />
</ItemGroup>
<ItemGroup />
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion>
</PropertyGroup>
@@ -1,5 +1,4 @@
using System.Resources;
using System.Reflection;
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
@@ -26,5 +25,4 @@ using System.Runtime.InteropServices;
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: ComVisible(false)]
[assembly: NeutralResourcesLanguage("en-US")]
[assembly: ComVisible(false)]
@@ -0,0 +1,13 @@
using System;
using Windows.System;
using FluentTerminal.Models.Enums;
namespace FluentTerminal.App.Services
{
public class AcceleratorKeyValidator : IAcceleratorKeyValidator
{
public bool Valid(int key) => Enum.IsDefined(typeof(VirtualKey), key);
public bool Valid(ExtendedVirtualKey key) => Valid((int) key);
}
}
@@ -12,17 +12,13 @@ namespace FluentTerminal.App.Services
[""] = "System default",
["ar"] = "العربية",
["ar-IQ"] = "اللهجة العراقية",
["az-Latn"] = "azərbaycan dili",
["az"] = "azərbaycan dili",
["de"] = "Deutsch",
["en"] = "English",
["eo"] = "Esperanto",
["es"] = "Español",
["fa"] = "فارسی",
["fr"] = "Français",
["he"] = "עברית",
["hi"] = "हिन्दुस्तानी",
["hr"] = "Hrvatski",
["hu"] = "magyar",
["id"] = "Bahasa Indonesia",
["it"] = "Italiano",
["ja"] = "日本語",
@@ -32,12 +28,9 @@ namespace FluentTerminal.App.Services
["pt-BR"] = "Português-Brasil",
["ro"] = "Română",
["ru"] = "Pусский",
["sl"] = "Slovenščina",
["tr"] = "Türkçe",
["ug-Arab"] = "ئۇيغۇر تىلى",
["uk"] = "Українська",
["zh-Hans"] = "简体中文",
["zh-Hant"] = "繁體中文"
["zh-Hans"] = "繁體中文",
["zh-Hant"] = "简体中文"
};
public IEnumerable<string> Languages => _languages.Values;
@@ -1044,21 +1044,6 @@
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Use smart buffer</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Restart</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Session disconnected.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
+1 -16
View File
@@ -1087,21 +1087,6 @@ Type &quot;أخرج من منفذ الأوامر &quot; then type the name in th
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Use smart buffer</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Restart</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Session disconnected.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
@@ -1044,21 +1044,6 @@
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Use smart buffer</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Restart</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Session disconnected.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
+1 -16
View File
@@ -1077,21 +1077,6 @@ Fuzzy</comment>
<value>Auswahl kopieren oder Einfügen</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Smart Buffer verwenden</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Neu starten</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Sitzung wurde getrennt.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Schriftgröße vergrößern</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Schriftgröße verkleinern</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Schriftgröße zurücksetzen</value>
<value>Use buffer</value>
</data>
</root>
@@ -1109,21 +1109,6 @@ Fuzzy</comment>
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Use smart buffer</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Restart</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Session disconnected.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
File diff suppressed because it is too large. Load diff
+79 -94
View File
@@ -542,7 +542,7 @@ Fuzzy</comment>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="ConfirmCloseTab" xml:space="preserve">
<value>¿Estás seguro que quieres cerrar la pestaña &quot;{0}&quot;?</value>
<value>Are you sure you want to close &quot;{0}&quot; tab?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmCloseWindow" xml:space="preserve">
@@ -831,255 +831,240 @@ Fuzzy</comment>
<value>¿Quieres eliminar este perfil?</value>
</data>
<data name="Command.NewSshWindow" xml:space="preserve">
<value>Nueva ventana SSH</value>
<value>New SSH window</value>
</data>
<data name="Setting_SShProfiles.Content" xml:space="preserve">
<value>Perfiles SSH</value>
<value>SSH Profiles</value>
</data>
<data name="SshInfoDialog_TabColor.Text" xml:space="preserve">
<value>Color de pestaña:</value>
<value>Tab color:</value>
</data>
<data name="UseConPty" xml:space="preserve">
<value>Usar ConPty</value>
<value>Use ConPty</value>
</data>
<data name="Username.Header" xml:space="preserve">
<value>Nombre de usuario</value>
<value>Username</value>
</data>
<data name="MoshPortFrom.Header" xml:space="preserve">
<value>Puerto desde</value>
<value>From port</value>
</data>
<data name="MoshPortTo.Header" xml:space="preserve">
<value>a puerto</value>
<value>to port</value>
</data>
<data name="MoshPortRange.Text" xml:space="preserve">
<value>Rango de puertos Mosh</value>
<value>Mosh port range</value>
</data>
<data name="Authenticate" xml:space="preserve">
<value>Autenticar</value>
<value>Authenticate</value>
</data>
<data name="SettingsExported" xml:space="preserve">
<value>Opciones exportadas a archivo</value>
<value>Settings were exported to file</value>
</data>
<data name="SettingsImported" xml:space="preserve">
<value>Opciones importadas desde archivo</value>
<value>Settings were imported from file</value>
</data>
<data name="SshConnectionInfoValidationResult.IdentityFileDoesNotExist" xml:space="preserve">
<value>No existe el archivo de identidad</value>
<value>Identify file does not exist</value>
</data>
<data name="AutoFallbackToWindowsUsername.Header" xml:space="preserve">
<value>Usar nombre de Windows al abrir urls SSH que no especifican uno</value>
<value>Use Windows username when opening SSH URLs that don&apos;t specify one</value>
</data>
<data name="UseMoshByDefault.Header" xml:space="preserve">
<value>Mosh para conexiones SSH por defecto</value>
<value>Default to Mosh for SSH connections</value>
</data>
<data name="RTrimCopiedLines.Header" xml:space="preserve">
<value>Recortar a la derecha las líneas copiadas</value>
<value>Right trim copied lines</value>
</data>
<data name="QuickSshDefault.Header" xml:space="preserve">
<value>Usar SSH rápido por defecto</value>
<value>Use quick SSH by default</value>
</data>
<data name="InvalidCommand" xml:space="preserve">
<value>Comando inválido.</value>
<value>Invalid command.</value>
</data>
<data name="LocationCantBeEmpty" xml:space="preserve">
<value>La ubicación no puede estar vacía.</value>
<value>Location cannot be empty.</value>
</data>
<data name="MuteTerminalBeeps.Header" xml:space="preserve">
<value>Silenciar sonidos de terminal</value>
<value>Mute terminal beeps</value>
</data>
<data name="CommandTextBox.PlaceholderText" xml:space="preserve">
<value>Introduce un comando (p.e. &apos;ssh username@host&apos;)</value>
<value>Enter a command (e.g. &apos;ssh username@host&apos;)</value>
</data>
<data name="CommandLine.Header" xml:space="preserve">
<value>Comando</value>
<value>Command</value>
</data>
<data name="UnsupportedCommand" xml:space="preserve">
<value>Comando no soportado:</value>
<value>Unsupported command:</value>
</data>
<data name="CommandArgumentsMandatory" xml:space="preserve">
<value>Faltan argumentos del comando.</value>
<value>Command arguments are missing.</value>
</data>
<data name="QuickCommandDialog.Title" xml:space="preserve">
<value>Lanzamiento rápido</value>
<value>Quick Launch</value>
</data>
<data name="Command.NewCustomCommandTab" xml:space="preserve">
<value>Nueva pestaña de inicio rápido</value>
<value>New quick launch tab</value>
</data>
<data name="Command.NewCustomCommandWindow" xml:space="preserve">
<value>Lanzar nueva ventana rápida</value>
<value>New quick launch window</value>
</data>
<data name="NewQuickTab.Text" xml:space="preserve">
<value>Nueva pestaña rápida</value>
<value>New quick tab</value>
</data>
<data name="FileNotFound" xml:space="preserve">
<value>Archivo no encontrado:</value>
<value>File not found:</value>
</data>
<data name="InvalidLink" xml:space="preserve">
<value>Enlace inválido.</value>
<value>Invalid link.</value>
</data>
<data name="DropTabHere" xml:space="preserve">
<value>Suelta la pestaña aquí</value>
<value>Drop tab here</value>
</data>
<data name="CloseLeft.Text" xml:space="preserve">
<value>Cerrar pestañas a la izquierda</value>
<value>Close tabs to the left</value>
</data>
<data name="CloseOther.Text" xml:space="preserve">
<value>Cerrar el resto de pestañas</value>
<value>Close other tabs</value>
</data>
<data name="CloseRight.Text" xml:space="preserve">
<value>Cerrar pestañas a la derecha</value>
<value>Close tabs to the right</value>
</data>
<data name="Command.DuplicateTab" xml:space="preserve">
<value>Duplicar pestaña</value>
<value>Duplicate tab</value>
</data>
<data name="Duplicate.Text" xml:space="preserve">
<value>Duplicar</value>
<value>Duplicate</value>
</data>
<data name="DuplicateEnvironmentVariable" xml:space="preserve">
<value>No puedes asignar dos variables de entorno con el mismo nombre.</value>
<value>Cannot define two environment variables with the same name.</value>
</data>
<data name="EmptyEnvironmentVariableName" xml:space="preserve">
<value>No puedes definir una variable de entorno sin nombre.</value>
<value>Cannot define an environment variable without a name.</value>
</data>
<data name="EnvironmentVariables.Text" xml:space="preserve">
<value>Variables de entorno</value>
<value>Environment variables</value>
</data>
<data name="CloseSearchPanel.ToolTipService.ToolTip" xml:space="preserve">
<value>Cerrar panel de búsqueda</value>
<value>Close search panel</value>
</data>
<data name="FindNext.ToolTipService.ToolTip" xml:space="preserve">
<value>Buscar siguiente</value>
<value>Find next</value>
</data>
<data name="FindPrevious.ToolTipService.ToolTip" xml:space="preserve">
<value>Buscar anterior</value>
<value>Find previous</value>
</data>
<data name="SearchTextBox.PlaceholderText" xml:space="preserve">
<value>Ingrese el término de búsqueda</value>
<value>Enter search term</value>
</data>
<data name="Search.Text" xml:space="preserve">
<value>Buscar</value>
<value>Search</value>
</data>
<data name="PrintableOutputOnly.Content" xml:space="preserve">
<value>Solamente salida imprimible</value>
<value>Printable output only</value>
</data>
<data name="EnableLogging.Header" xml:space="preserve">
<value>Registar salida para debugeo</value>
<value>Log output for debugging</value>
</data>
<data name="WordSeparator.Header" xml:space="preserve">
<value>Caracteres separadores de palabras</value>
<value>Word separator characters</value>
</data>
<data name="Recent.Text" xml:space="preserve">
<value>Reciente</value>
<value>Recent</value>
</data>
<data name="NewTab_Description" xml:space="preserve">
<value>Abre el perfil predeterminado en una nueva pestaña.</value>
<value>Opens default profile in a new tab.</value>
</data>
<data name="NewSshTab_Description" xml:space="preserve">
<value>Abre una nueva sesión SSH o Mosh en una nueva pestaña.</value>
<value>Opens a new SSH or Mosh session in a new tab.</value>
</data>
<data name="NewQuickTab_Description" xml:space="preserve">
<value>Abre el cuadro de diálogo &quot;Inicio rápido&quot; e inicia la sesión en una pestaña nueva.</value>
<value>Opens &quot;Quick Launch&quot; dialog and starts session in a new tab.</value>
</data>
<data name="Settings_Description" xml:space="preserve">
<value>Abrir ventana de opciones.</value>
<value>Opens settings window.</value>
</data>
<data name="About_Description" xml:space="preserve">
<value>Información básica sobre la app.</value>
<value>Basic info about the app.</value>
</data>
<data name="Recent_Description" xml:space="preserve">
<value>Sesiones abiertas recientemente.</value>
<value>Recently opened sessions.</value>
</data>
<data name="MenuItem_DefaultProfile_Description" xml:space="preserve">
<value>Inicia una nueva sesión de terminal basada en el perfil predeterminado.</value>
<value>Starts new terminal session based on the default profile.</value>
</data>
<data name="MenuItem_Remote_Text" xml:space="preserve">
<value>Conexión remota...</value>
<value>Remote Connect...</value>
</data>
<data name="MenuItem_Remote_Description" xml:space="preserve">
<value>Abre un cuadro de diálogo para iniciar una nueva sesión de terminal SSH o Mosh.</value>
<value>Opens a dialog for launching a new SSH or Mosh terminal session.</value>
</data>
<data name="MenuItem_QuickLaunch_Text" xml:space="preserve">
<value>Comida rápida...</value>
<value>Quick Launch...</value>
</data>
<data name="MenuItem_QuickLaunch_Description" xml:space="preserve">
<value>Abre un cuadro de diálogo &quot;Inicio rápido&quot; para iniciar una nueva sesión de terminal.</value>
<value>Opens a &quot;Quick Launch&quot; dialog for starting a new terminal session.</value>
</data>
<data name="MenuItem_NewWindow_Text" xml:space="preserve">
<value>Nueva ventana</value>
<value>New Window</value>
</data>
<data name="MenuItem_NewTab_Text" xml:space="preserve">
<value>Nueva pestaña</value>
<value>New Tab</value>
</data>
<data name="MenuItem_NewTab_Description" xml:space="preserve">
<value>Inicia una sesión en una nueva pestaña.</value>
<value>Launches a session in a new tab.</value>
</data>
<data name="MenuItem_NewWindow_Description" xml:space="preserve">
<value>Lanzar nueva sesión en una nueva ventana.</value>
<value>Launches a session in a new window.</value>
</data>
<data name="AppMenuType.Text" xml:space="preserve">
<value>Tipo de menú de la aplicación</value>
<value>Application menu type</value>
</data>
<data name="AppMenuType_Flat.Content" xml:space="preserve">
<value>Plano, honrando la configuración &quot;Abrir nuevos terminales como&quot;</value>
<value>Flat, honoring &quot;Open new terminals as&quot; setting</value>
</data>
<data name="AppMenuType_Cascading.Content" xml:space="preserve">
<value>&quot;Nueva pestaña&quot; / &quot;Nueva ventana&quot; en cascada</value>
<value>&quot;New Tab&quot; / &quot;New Window&quot; cascading</value>
</data>
<data name="Quit.Text" xml:space="preserve">
<value>Salir</value>
<value>Quit</value>
</data>
<data name="Quit.Description" xml:space="preserve">
<value>Salir de Fluent Terminal</value>
<value>Quit Fluent Terminal</value>
</data>
<data name="EnabledByPolicy" xml:space="preserve">
<value>Habilitado por la política.</value>
<value>Enabled by policy.</value>
</data>
<data name="BackgroundImage.Content" xml:space="preserve">
<value>Imagen de fondo</value>
<value>Background image</value>
</data>
<data name="AcrylicBackground.Header" xml:space="preserve">
<value>Usar fondo acrílico</value>
<value>Use acrylic background</value>
</data>
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
<value>¿Estás seguro de querer borrar esta imagen de fondo?</value>
<value>Are you sure you want to delete this background image?</value>
</data>
<data name="Colors.Text" xml:space="preserve">
<value>Colores</value>
<value>Colors</value>
</data>
<data name="BrightColors.Text" xml:space="preserve">
<value>Colores brillantes</value>
<value>Bright colors</value>
</data>
<data name="CopyLink" xml:space="preserve">
<value>Copiar enlace</value>
<value>Copy link</value>
</data>
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
<value>Regex</value>
</data>
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
<value>Toda la palabra</value>
<value>Whole word</value>
</data>
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
<value>Distingue mayúsculas y minúsculas</value>
<value>Case sensitive</value>
</data>
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
<value>Copiar selección o pegar</value>
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Usar búfer inteligente</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Reiniciar sesión</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Sesión finalizada.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
File diff suppressed because it is too large. Load diff
+98 -114
View File
@@ -123,7 +123,7 @@
Fuzzy</comment>
</data>
<data name="Background.Content" xml:space="preserve">
<value>Arrière-plan</value>
<value>Fond</value>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="TabTheme.Blue" xml:space="preserve">
@@ -177,11 +177,11 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="IndicatorOutput.Header" xml:space="preserve">
<value>Afficher l&apos;indicateur de nouvelle sortie sur les onglets inactifs</value>
<value>Afficher l&apos;indicateur de nouvelle sortie sur les onglets en arrière-plan</value>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="NeedRelaunch.Text" xml:space="preserve">
<value>Relancez l&apos;application pour appliquer ce réglage</value>
<value>Redémarrage de l&apos;application requis pour appliquer le réglage</value>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="NewTab.Text" xml:space="preserve">
@@ -202,7 +202,7 @@ Fuzzy</comment>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="OpenNewTerminalAs.Text" xml:space="preserve">
<value>Ouvrir les nouveaux terminaux en tant que</value>
<value>Ouvrir de nouveaux terminaux en tant que</value>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="TabTheme.Orange" xml:space="preserve">
@@ -246,7 +246,7 @@ Fuzzy</comment>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="TabsPostion.Text" xml:space="preserve">
<value>Disposition des onglets</value>
<value>Afficher les onglets sur</value>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="TabTheme.Teal" xml:space="preserve">
@@ -255,11 +255,11 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="TP_Bottom.Content" xml:space="preserve">
<value>En bas</value>
<value>Bas</value>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="TP_Top.Content" xml:space="preserve">
<value>En haut</value>
<value>Haut</value>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="Underline.Content" xml:space="preserve">
@@ -267,11 +267,11 @@ Fuzzy</comment>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="UnderlineTab.Header" xml:space="preserve">
<value>Souligner l&apos;onglet actif</value>
<value>Souligner l&apos;onglet sélectionné</value>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="Setting_About.Content" xml:space="preserve">
<value>À propos</value>
<value>A propos</value>
<comment>SettingsPage.xaml</comment>
</data>
<data name="Setting_General.Content" xml:space="preserve">
@@ -287,7 +287,7 @@ Fuzzy</comment>
<comment>SettingsPage.xaml</comment>
</data>
<data name="Setting_Profiles.Content" xml:space="preserve">
<value>Profils</value>
<value>Profiles</value>
<comment>SettingsPage.xaml</comment>
</data>
<data name="Setting_Terminal.Content" xml:space="preserve">
@@ -308,15 +308,15 @@ Fuzzy</comment>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="BackgroundOpacity.Header" xml:space="preserve">
<value>Opacité de l&apos;arrière-plan</value>
<value>Opacité du fond</value>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="BlinkingCursor.Header" xml:space="preserve">
<value>Curseur clignotant</value>
<value>Clignotement du curseur</value>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="BoldText.Header" xml:space="preserve">
<value>Texte gras</value>
<value>Texte en gras</value>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="CancelAppBarButton.Label" xml:space="preserve">
@@ -324,7 +324,7 @@ Fuzzy</comment>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="CheckingUpdates.Text" xml:space="preserve">
<value>Vérification des mises à jour...</value>
<value>Vérification des mises à jour ...</value>
<comment>About.xaml</comment>
</data>
<data name="CheckUpdates.Label" xml:space="preserve">
@@ -332,7 +332,7 @@ Fuzzy</comment>
<comment>About.xaml</comment>
</data>
<data name="ClickColorEdit.Text" xml:space="preserve">
<value>Cliquez sur une couleur pour l&apos;éditer</value>
<value>Cliquez sur une couleur pour éditer</value>
<comment>ThemeSettings.xaml</comment>
</data>
<data name="CloneAppBarButton.Label" xml:space="preserve">
@@ -348,11 +348,11 @@ Fuzzy</comment>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="CopyOnSelect.Header" xml:space="preserve">
<value>Copie automatique</value>
<value>Copier sur sélectionner</value>
<comment>MouseSettings.xaml</comment>
</data>
<data name="CreateProfile.Text" xml:space="preserve">
<value>Créer un profil</value>
<value>Créer un nouveau</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="CurrentVersion.Text" xml:space="preserve">
@@ -385,7 +385,7 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="EditAppBarButton.Label" xml:space="preserve">
<value>Éditer</value>
<value>Editer</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="ExportAppBarButton.Label" xml:space="preserve">
@@ -393,7 +393,7 @@ Fuzzy</comment>
<comment>ThemeSettings.xaml</comment>
</data>
<data name="FontFamily.Header" xml:space="preserve">
<value>Famille de police</value>
<value>Famille de polices</value>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="FontSize.Header" xml:space="preserve">
@@ -421,15 +421,15 @@ Fuzzy</comment>
<comment>About.xaml</comment>
</data>
<data name="LineEndingMode.Header" xml:space="preserve">
<value>Conversion de fin de ligne</value>
<value>Mode de traduction de fin de ligne</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="LineEndingModeOnPaste.Text" xml:space="preserve">
<value>Conversion de fin des lignes collées:</value>
<value>Mode de traduction de fin de ligne sur coller:</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="MiddleButtonAction.Text" xml:space="preserve">
<value>Action du bouton central</value>
<value>Action du bouton du milieu</value>
<comment>MouseSettings.xaml</comment>
</data>
<data name="Mouse.Text" xml:space="preserve">
@@ -450,11 +450,11 @@ Fuzzy</comment>
<comment>MouseSettings.xaml</comment>
</data>
<data name="NewTheme.Text" xml:space="preserve">
<value>Créer un thème</value>
<value>Créer un nouveau</value>
<comment>ThemeSettings.xaml</comment>
</data>
<data name="Padding.Header" xml:space="preserve">
<value>Bords</value>
<value>Padding</value>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="ProfileName.Header" xml:space="preserve">
@@ -462,7 +462,7 @@ Fuzzy</comment>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="Profiles.Text" xml:space="preserve">
<value>Profils</value>
<value>Profiles</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="ProfileTheme.Header" xml:space="preserve">
@@ -478,7 +478,7 @@ Fuzzy</comment>
<comment>MouseSettings.xaml</comment>
</data>
<data name="SaveAppBarButton.Label" xml:space="preserve">
<value>Sauvegarder</value>
<value>Sauvgarder</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="ScrollbackLimit.Header" xml:space="preserve">
@@ -486,15 +486,15 @@ Fuzzy</comment>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="ScrollBarAuto.Content" xml:space="preserve">
<value>Masquer automatiquement</value>
<value>Masquage automatique</value>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="ScrollBarHidden.Content" xml:space="preserve">
<value>Masquée</value>
<value>Masqué</value>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="ScrollbarStyle.Text" xml:space="preserve">
<value>Barre de défilement</value>
<value>Style de barre de défilement</value>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="ScrollBarVisible.Content" xml:space="preserve">
@@ -502,7 +502,7 @@ Fuzzy</comment>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="SetActiveAppBarButton.Label" xml:space="preserve">
<value>Définir comme actif</value>
<value>Définir actif</value>
<comment>ThemeSettings.xaml</comment>
</data>
<data name="SetDefaultAppBarButton.Label" xml:space="preserve">
@@ -510,11 +510,11 @@ Fuzzy</comment>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="ShellLocation.Header" xml:space="preserve">
<value>Emplacement de l&apos;exécutable du shell</value>
<value>Emplacement exécutable du shell</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="TabColor.Header" xml:space="preserve">
<value>Couleur de l&apos;onglet</value>
<value>Couleur d&apos;onglet</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="Terminal.Text" xml:space="preserve">
@@ -549,51 +549,51 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="WorkingDir.Header" xml:space="preserve">
<value>Dossier de départ</value>
<value>Directeur de travail</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="ConfirmCloseTab" xml:space="preserve">
<value>Êtes-vous sûr(e) de vouloir fermer &quot;{0}&quot; onglets ?</value>
<value>Êtes-vous sûr de vouloir fermer &quot;{0}&quot; onglets?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmCloseWindow" xml:space="preserve">
<value>Voulez-vous fermer cette fenêtre ?</value>
<value>Are you sure you want to close this window?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmDeleteKeybindings" xml:space="preserve">
<value>Voulez-vous supprimer ce raccourci ?</value>
<value>Are you sure you want to delete this keybinding?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmDeleteTheme" xml:space="preserve">
<value>Voulez-vous supprimer ce thème ?</value>
<value>Êtes-vous sûr de vouloir supprimer ce thème?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmDiscardChanges" xml:space="preserve">
<value>Voulez-vous annuler toutes les modifications ?</value>
<value>Êtes-vous sûr de vouloir annuler toutes les modifications?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmRestoreGeneralSettings" xml:space="preserve">
<value>Voulez-vous restaurer les paramètres généraux ?</value>
<value>Êtes-vous sûr de vouloir restaurer les paramètres généraux?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmRestoreKeybindings" xml:space="preserve">
<value>Voulez-vous restaurer les raccourcis clavier par défaut ?</value>
<value>Êtes-vous sûr de vouloir restaurer les raccourcis clavier par défaut?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmRestoreMouseSettings" xml:space="preserve">
<value>Voulez-vous restaurer les paramètres de la souris ?</value>
<value>Êtes-vous sûr de vouloir restaurer les paramètres de la souris?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmRestoreProfile" xml:space="preserve">
<value>Voulez-vous restaurer ce profil ?</value>
<value>Êtes-vous sûr de vouloir restaurer ce profil?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmRestoreTerminalOptions" xml:space="preserve">
<value>Voulez-vous restaurer les options du terminal par défaut ?</value>
<value>Êtes-vous sûr de vouloir restaurer les options du terminal par défaut?</value>
<comment>ViewModel</comment>
</data>
<data name="DisabledByPolicy" xml:space="preserve">
<value>Désactivé par Stratégie de Goupe.</value>
<value>Désactivé par politique.</value>
<comment>ViewModel</comment>
</data>
<data name="DisabledByUser" xml:space="preserve">
@@ -601,7 +601,7 @@ Fuzzy</comment>
<comment>ViewModel</comment>
</data>
<data name="EditTitleString" xml:space="preserve">
<value>Éditer le titre</value>
<value>Editer le titre</value>
<comment>ViewModel</comment>
</data>
<data name="Error" xml:space="preserve">
@@ -613,7 +613,7 @@ Fuzzy</comment>
<comment>ViewModel</comment>
</data>
<data name="ImportThemeFailed" xml:space="preserve">
<value>L&apos;importation du thème a échoué</value>
<value>L&apos;importation du thème a échouer</value>
<comment>ViewModel</comment>
</data>
<data name="NoSuitableParserFound" xml:space="preserve">
@@ -628,7 +628,7 @@ Fuzzy</comment>
<value>Annuler</value>
</data>
<data name="KeybindingDialogTitle.Text" xml:space="preserve">
<value>Entrez votre raccourci maintenant</value>
<value>Entrez votre raccourcis maintenant</value>
</data>
<data name="OK" xml:space="preserve">
<value>OK</value>
@@ -638,7 +638,7 @@ Fuzzy</comment>
<comment>Fuzzy</comment>
</data>
<data name="TextCopied" xml:space="preserve">
<value>Texte copié</value>
<value>Texte copier</value>
<comment>ViewModel</comment>
</data>
<data name="AddAppBarButton.Label" xml:space="preserve">
@@ -670,7 +670,7 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="KeyBindingsViewEdit.Content" xml:space="preserve">
<value>Éditer</value>
<value>Editer</value>
<comment>KeyBindingsView.xaml</comment>
</data>
<data name="Command.NewTab" xml:space="preserve">
@@ -699,12 +699,12 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="Command.Search" xml:space="preserve">
<value>Recherche</value>
<value>Chercher</value>
<comment>Command
Fuzzy</comment>
</data>
<data name="Command.SelectAll" xml:space="preserve">
<value>Sélectionner tout</value>
<value>Selectionner tout</value>
<comment>Command
Fuzzy</comment>
</data>
@@ -759,12 +759,12 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="Command.ToggleFullScreen" xml:space="preserve">
<value>Plein écran</value>
<value>Basculer en plein écran</value>
<comment>Command
Fuzzy</comment>
</data>
<data name="Command.ToggleWindow" xml:space="preserve">
<value>Afficher/Masquer la fenêtre</value>
<value>Basculer la fenêtre</value>
<comment>Command
Fuzzy</comment>
</data>
@@ -773,11 +773,11 @@ Fuzzy</comment>
<comment>Fuzzy</comment>
</data>
<data name="Command.NewSshTab" xml:space="preserve">
<value>Nouvel onglet SSH</value>
<value>Nouvel SSH onglet</value>
<comment>Fuzzy</comment>
</data>
<data name="SshInfoDialog.Title" xml:space="preserve">
<value>Informations SSH</value>
<value>SSH Informations</value>
</data>
<data name="UserTextBox.PlaceholderText" xml:space="preserve">
<value>utilisateur</value>
@@ -797,7 +797,7 @@ Fuzzy</comment>
<value>Naviguer</value>
</data>
<data name="UseMoshCheckBox.Content" xml:space="preserve">
<value>Utiliser Mosh</value>
<value>Utilisez Mosh</value>
</data>
<data name="AdvancedExpander.Header" xml:space="preserve">
<value>Avancé</value>
@@ -825,7 +825,7 @@ Fuzzy</comment>
<comment>Fuzzy</comment>
</data>
<data name="SshConnectionInfoValidationResult.UsernameEmpty" xml:space="preserve">
<value>Le nom d&apos;utilisateur ne peut être vide.</value>
<value>Le nom d&apos;utilisateur ne peut pas être vide.</value>
</data>
<data name="SshConnectionInfoValidationResult.HostEmpty" xml:space="preserve">
<value>L&apos;hôte ne peut être vide.</value>
@@ -849,7 +849,7 @@ Fuzzy</comment>
<value>Non</value>
</data>
<data name="Language.Header" xml:space="preserve">
<value>Langage</value>
<value>Language</value>
</data>
<data name="None.Text" xml:space="preserve">
<value>Aucun</value>
@@ -861,7 +861,7 @@ Fuzzy</comment>
<value>Sortie avec erreur</value>
</data>
<data name="ConfirmDeleteProfile" xml:space="preserve">
<value>Voulez-vous supprimer ce profil ?</value>
<value>Êtes-vous sûr de vouloir supprimer ce profil?</value>
</data>
<data name="Command.NewSshWindow" xml:space="preserve">
<value>Nouvelle fenêtre SSH</value>
@@ -875,7 +875,7 @@ Fuzzy</comment>
<comment>Fuzzy</comment>
</data>
<data name="UseConPty" xml:space="preserve">
<value>Utiliser ConPty</value>
<value>Utilisez ConPty</value>
<comment>Fuzzy</comment>
</data>
<data name="Username.Header" xml:space="preserve">
@@ -887,7 +887,7 @@ Fuzzy</comment>
<comment>Fuzzy</comment>
</data>
<data name="MoshPortTo.Header" xml:space="preserve">
<value>au port</value>
<value>au portt</value>
<comment>Fuzzy</comment>
</data>
<data name="MoshPortRange.Text" xml:space="preserve">
@@ -906,28 +906,28 @@ Fuzzy</comment>
<value>Le fichier d&apos;identification n&apos;existe pas</value>
</data>
<data name="AutoFallbackToWindowsUsername.Header" xml:space="preserve">
<value>Utiliser le nom d&apos;utilisateur Windows pour les connexions SSH qui n&apos;en spécifient aucun</value>
<value>Utilisez le nom d&apos;utilisateur Windows lors de l&apos;ouverture d&apos;URL SSH qui don&apos;t spécifier un</value>
</data>
<data name="UseMoshByDefault.Header" xml:space="preserve">
<value>Mosh par défaut pour les connexions SSH</value>
</data>
<data name="RTrimCopiedLines.Header" xml:space="preserve">
<value>Rogner les lignes copiées</value>
<value>Couper les lignes copiées</value>
</data>
<data name="QuickSshDefault.Header" xml:space="preserve">
<value>Utiliser SSH rapide par défaut</value>
</data>
<data name="InvalidCommand" xml:space="preserve">
<value>Commande invalide.</value>
<value>Commande non valide.</value>
</data>
<data name="LocationCantBeEmpty" xml:space="preserve">
<value>L&apos;emplacement ne peut pas être vide.</value>
</data>
<data name="MuteTerminalBeeps.Header" xml:space="preserve">
<value>Désactiver les bips du terminal</value>
<value>Mutter les bips du terminal</value>
</data>
<data name="CommandTextBox.PlaceholderText" xml:space="preserve">
<value>Entrez une commande (ex: &apos;ssh username@host&apos;)</value>
<value>Entrez une commande (e.g. &apos;ssh username@host&apos;)</value>
</data>
<data name="CommandLine.Header" xml:space="preserve">
<value>Commande</value>
@@ -936,17 +936,17 @@ Fuzzy</comment>
<value>Commande non supportée:</value>
</data>
<data name="CommandArgumentsMandatory" xml:space="preserve">
<value>Les arguments de la commande sont manquants.</value>
<value>Les arguments de commande sont manquants.</value>
</data>
<data name="QuickCommandDialog.Title" xml:space="preserve">
<value>Lancement rapide</value>
<value>Démarrage rapide</value>
<comment>Fuzzy</comment>
</data>
<data name="Command.NewCustomCommandTab" xml:space="preserve">
<value>Lancement rapide (onglet)</value>
<value>Nouvel onglet de lancement rapide</value>
</data>
<data name="Command.NewCustomCommandWindow" xml:space="preserve">
<value>Lancement rapide (fenêtre)</value>
<value>Nouvelle fenêtre de lancement rapide</value>
</data>
<data name="NewQuickTab.Text" xml:space="preserve">
<value>Nouvel onglet rapide</value>
@@ -958,7 +958,7 @@ Fuzzy</comment>
<value>Lien invalide.</value>
</data>
<data name="DropTabHere" xml:space="preserve">
<value>Déposez l&apos;onglet ici</value>
<value>Drop tab here</value>
</data>
<data name="CloseLeft.Text" xml:space="preserve">
<value>Fermer les onglets à gauche</value>
@@ -970,7 +970,7 @@ Fuzzy</comment>
<value>Fermer les onglets à droite</value>
</data>
<data name="Command.DuplicateTab" xml:space="preserve">
<value>Dupliquer l&apos;onglet</value>
<value>Onglet dupliquer</value>
<comment>Fuzzy</comment>
</data>
<data name="Duplicate.Text" xml:space="preserve">
@@ -989,16 +989,16 @@ Fuzzy</comment>
<value>Fermer le panneau de recherche</value>
</data>
<data name="FindNext.ToolTipService.ToolTip" xml:space="preserve">
<value>Résultat suivant</value>
<value>Trouver le suivant</value>
</data>
<data name="FindPrevious.ToolTipService.ToolTip" xml:space="preserve">
<value>Résultat précédent</value>
<value>Trouver le précédent</value>
</data>
<data name="SearchTextBox.PlaceholderText" xml:space="preserve">
<value>Entrez le terme de recherche</value>
</data>
<data name="Search.Text" xml:space="preserve">
<value>Recherche</value>
<value>Chercher</value>
</data>
<data name="PrintableOutputOnly.Content" xml:space="preserve">
<value>Sortie imprimable seulement</value>
@@ -1010,80 +1010,79 @@ Fuzzy</comment>
<value>Caractères séparateurs de mots</value>
</data>
<data name="Recent.Text" xml:space="preserve">
<value>Récents</value>
<value>Récent</value>
</data>
<data name="NewTab_Description" xml:space="preserve">
<value>Ouvre le profil par défaut dans un nouvel onglet.</value>
<value>Ouvrir le profile par défaut dans un nouvel onglet.</value>
</data>
<data name="NewSshTab_Description" xml:space="preserve">
<value>Ouvre une session SSH ou Mosh dans un nouvel onglet.</value>
<value>Ouvrir une session SSH ou Msh dans un nouvel onglet.</value>
</data>
<data name="NewQuickTab_Description" xml:space="preserve">
<value>Ouvre le dialogue &quot;Lancement rapide&quot; et démarre une session dans un nouvel onglet.</value>
<value>Ouvrir le dialogue &quot;Lancement rapide&quot; et commencer une session dans un nouvel onglet.</value>
</data>
<data name="Settings_Description" xml:space="preserve">
<value>Ouvre les paramètres.</value>
<value>Ouvrir les paramètres.</value>
</data>
<data name="About_Description" xml:space="preserve">
<value>Informations sur l&apos;application.</value>
</data>
<data name="Recent_Description" xml:space="preserve">
<value>Sessions récentes.</value>
<value>Session récentes.</value>
</data>
<data name="MenuItem_DefaultProfile_Description" xml:space="preserve">
<value>Démarre une nouvelle session de terminal du profil par défaut.</value>
<value>Commencer une nouvelle session du profil par défaut.</value>
</data>
<data name="MenuItem_Remote_Text" xml:space="preserve">
<value>Connexion à distance...</value>
<value>Connexion distante...</value>
</data>
<data name="MenuItem_Remote_Description" xml:space="preserve">
<value>Ouvre un dialogue permettant de lancer une nouvelle session SSH ou Mosh.</value>
<value>Ouvrir un dialogue pour une nouvelle session SSH ou Mosh.</value>
</data>
<data name="MenuItem_QuickLaunch_Text" xml:space="preserve">
<value>Lancement rapide...</value>
</data>
<data name="MenuItem_QuickLaunch_Description" xml:space="preserve">
<value>Ouvrir un dialogue &quot;Lancement rapide&quot; pour une nouvelle session de terminal.</value>
<value>Ouvrir un dialogue &quot;Lancement rapide&quot; pour un nouvelle session.</value>
</data>
<data name="MenuItem_NewWindow_Text" xml:space="preserve">
<value>Nouvelle fenêtre</value>
<value>Nouvelle fenêtre.</value>
</data>
<data name="MenuItem_NewTab_Text" xml:space="preserve">
<value>Nouvel onglet</value>
<comment>@William Why adding dots everywhere? These are not sentences</comment>
<value>Nouvel onglet.</value>
</data>
<data name="MenuItem_NewTab_Description" xml:space="preserve">
<value>Lance une session dans un nouvel onglet.</value>
<value>Lancer une session dans un nouvel onglet.</value>
</data>
<data name="MenuItem_NewWindow_Description" xml:space="preserve">
<value>Lance une session dans une nouvelle fenêtre.</value>
<value>Lancer une session dans une nouvelle fenêtre.</value>
</data>
<data name="AppMenuType.Text" xml:space="preserve">
<value>Style du menu d&apos;application</value>
<value>Application menu type</value>
</data>
<data name="AppMenuType_Flat.Content" xml:space="preserve">
<value>Plat, honorant le paramètre &quot;Ouvrir les nouveaux terminaux en tant que&quot;</value>
<value>Flat, honoring &quot;Open new terminals as&quot; setting</value>
</data>
<data name="AppMenuType_Cascading.Content" xml:space="preserve">
<value>&quot;Nouvel onglet&quot; / &quot;Nouvelle fenêtre&quot; en cascade.</value>
</data>
<data name="Quit.Text" xml:space="preserve">
<value>Quitter</value>
<value>Quitter.</value>
</data>
<data name="Quit.Description" xml:space="preserve">
<value>Quitter Fluent Terminal</value>
</data>
<data name="EnabledByPolicy" xml:space="preserve">
<value>Autorisé par Stratégie de Goupe.</value>
<value>Autorisé par la politique.</value>
</data>
<data name="BackgroundImage.Content" xml:space="preserve">
<value>Image d&apos;arrière-plan</value>
<value>Image de fond</value>
</data>
<data name="AcrylicBackground.Header" xml:space="preserve">
<value>Arrière-plan transparent</value>
<value>Utilise un fond acrylique.</value>
</data>
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
<value>Voulez-vous supprimer cet arrière-plan ?</value>
<value>Êtes vous sûr de vouloir supprimer cette image de fond ?</value>
</data>
<data name="Colors.Text" xml:space="preserve">
<value>Couleurs</value>
@@ -1101,27 +1100,12 @@ Fuzzy</comment>
<value>Mot entier</value>
</data>
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
<value>Sensible à la casse</value>
<value>Sensible à la casse.</value>
</data>
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
<value>Copier la sélection ou coller</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Utiliser le buffer intelligent</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Redémarrer</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Session déconnectée.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
+1 -16
View File
@@ -1053,21 +1053,6 @@ Fuzzy</comment>
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Use smart buffer</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Restart</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Session disconnected.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
+1 -16
View File
@@ -1044,21 +1044,6 @@
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Use smart buffer</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Restart</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Session disconnected.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+1 -16
View File
@@ -1044,21 +1044,6 @@
<value>Salin yang terpilih atau tempel</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Use smart buffer</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Restart</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Session disconnected.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
+29 -41
View File
@@ -255,7 +255,8 @@
</data>
<data name="UnderlineTab.Header" xml:space="preserve">
<value>Sottolinea la scheda attiva</value>
<comment>GeneralSettings.xaml</comment>
<comment>GeneralSettings.xaml
Fuzzy</comment>
</data>
<data name="Setting_About.Content" xml:space="preserve">
<value>Informazioni su</value>
@@ -577,7 +578,8 @@ Fuzzy</comment>
</data>
<data name="DisabledByPolicy" xml:space="preserve">
<value>Disattivato da policy</value>
<comment>ViewModel</comment>
<comment>ViewModel
Fuzzy</comment>
</data>
<data name="DisabledByUser" xml:space="preserve">
<value>Disattivato dall&apos;utente. Riattiva Fluent Terminal nella scheda Avvio del Task Manager</value>
@@ -861,6 +863,7 @@ Fuzzy</comment>
</data>
<data name="QuickSshDefault.Header" xml:space="preserve">
<value>Usa Quick SSH come impostazione predefinita</value>
<comment>Fuzzy</comment>
</data>
<data name="InvalidCommand" xml:space="preserve">
<value>Comando non valido</value>
@@ -966,7 +969,7 @@ Fuzzy</comment>
<value>Apre una sessione SSH o Mosh in una nuova scheda</value>
</data>
<data name="NewQuickTab_Description" xml:space="preserve">
<value>Apre la schermata di &quot;Avvio rapido&quot; e avvia la sessione in una nuova scheda</value>
<value>Opens &quot;Quick Launch&quot; dialog and starts session in a new tab.</value>
</data>
<data name="Settings_Description" xml:space="preserve">
<value>Apre la finestra impostazioni</value>
@@ -978,96 +981,81 @@ Fuzzy</comment>
<value>Sessioni aperte di recente</value>
</data>
<data name="MenuItem_DefaultProfile_Description" xml:space="preserve">
<value>Avvia una nuova sessione di terminale con il profilo predefinito</value>
<value>Starts new terminal session based on the default profile.</value>
</data>
<data name="MenuItem_Remote_Text" xml:space="preserve">
<value>Connessione remota...</value>
</data>
<data name="MenuItem_Remote_Description" xml:space="preserve">
<value>Apre una schermata per la creazione di una sessione SSH o Mosh</value>
<value>Opens a dialog for launching a new SSH or Mosh terminal session.</value>
</data>
<data name="MenuItem_QuickLaunch_Text" xml:space="preserve">
<value>Avvio rapido...</value>
</data>
<data name="MenuItem_QuickLaunch_Description" xml:space="preserve">
<value>Apre la schermata di &quot;Avvio rapido&quot; per una nuova sessione di terminale</value>
<value>Opens a &quot;Quick Launch&quot; dialog for starting a new terminal session.</value>
</data>
<data name="MenuItem_NewWindow_Text" xml:space="preserve">
<value>Nuova finestra</value>
<value>New Window</value>
</data>
<data name="MenuItem_NewTab_Text" xml:space="preserve">
<value>Nuova scheda</value>
<value>New Tab</value>
</data>
<data name="MenuItem_NewTab_Description" xml:space="preserve">
<value>Avvia la sessione in una nuova scheda</value>
<value>Launches a session in a new tab.</value>
</data>
<data name="MenuItem_NewWindow_Description" xml:space="preserve">
<value>Avvia la sessione in una nuova finestra</value>
<value>Launches a session in a new window.</value>
</data>
<data name="AppMenuType.Text" xml:space="preserve">
<value>Formato menu applicazione</value>
<value>Application menu type</value>
</data>
<data name="AppMenuType_Flat.Content" xml:space="preserve">
<value>Lineare, le azioni seguiranno l&apos;impostazione &quot;Apri i nuovi terminali come&quot;</value>
<value>Flat, honoring &quot;Open new terminals as&quot; setting</value>
</data>
<data name="AppMenuType_Cascading.Content" xml:space="preserve">
<value>Menù a cascata &quot;Nuova Scheda&quot; / &quot;Nuova finestra&quot;</value>
<value>&quot;New Tab&quot; / &quot;New Window&quot; cascading</value>
</data>
<data name="Quit.Text" xml:space="preserve">
<value>Chiudi</value>
<value>Quit</value>
</data>
<data name="Quit.Description" xml:space="preserve">
<value>Chiudi Fluent Terminal</value>
<value>Quit Fluent Terminal</value>
</data>
<data name="EnabledByPolicy" xml:space="preserve">
<value>Attivato da policy</value>
<value>Enabled by policy.</value>
</data>
<data name="BackgroundImage.Content" xml:space="preserve">
<value>Immagine di sfondo</value>
<value>Background image</value>
</data>
<data name="AcrylicBackground.Header" xml:space="preserve">
<value>Usa la sfumatura acrilica per lo sfondo</value>
<value>Use acrylic background</value>
</data>
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
<value>Vuoi davvero eliminare questa immagine di sfondo?</value>
<value>Are you sure you want to delete this background image?</value>
</data>
<data name="Colors.Text" xml:space="preserve">
<value>Colori</value>
<value>Colors</value>
</data>
<data name="BrightColors.Text" xml:space="preserve">
<value>Colori brillanti</value>
<value>Bright colors</value>
</data>
<data name="CopyLink" xml:space="preserve">
<value>Copia link</value>
<value>Copy link</value>
</data>
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
<value>Regex</value>
</data>
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
<value>Parola intera</value>
<value>Whole word</value>
</data>
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
<value>Sensibile a maiuscole/minuscole</value>
<value>Case sensitive</value>
</data>
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
<value>Copia selezione o incolla</value>
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Usa smart buffer</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Riavvia</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Sessione terminata.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
+11 -26
View File
@@ -1014,51 +1014,36 @@
<value>ポリシーによる許可</value>
</data>
<data name="BackgroundImage.Content" xml:space="preserve">
<value>背景画像</value>
<value>Background image</value>
</data>
<data name="AcrylicBackground.Header" xml:space="preserve">
<value>透過背景</value>
<value>Use acrylic background</value>
</data>
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
<value>この背景画像を削除してもよろしいですか?</value>
<value>Are you sure you want to delete this background image?</value>
</data>
<data name="Colors.Text" xml:space="preserve">
<value>色</value>
<value>Colors</value>
</data>
<data name="BrightColors.Text" xml:space="preserve">
<value>明色</value>
<value>Bright colors</value>
</data>
<data name="CopyLink" xml:space="preserve">
<value>リンクをコピー</value>
<value>Copy link</value>
</data>
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
<value>正規表現</value>
<value>Regex</value>
</data>
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
<value>単語単位</value>
<value>Whole word</value>
</data>
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
<value>大/小文字</value>
<value>Case sensitive</value>
</data>
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
<value>選択部分のコピーあるいは貼り付け</value>
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>スマートバッファを使用</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>再起動</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>セッションが切断されました</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
+1 -16
View File
@@ -1053,21 +1053,6 @@ Fuzzy</comment>
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Use smart buffer</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Restart</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Session disconnected.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
+94 -109
View File
@@ -137,7 +137,7 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="ConfirmWindowClosing.Header" xml:space="preserve">
<value>Vraag voor het sluiten van alle vensters</value>
<value>Vraag voor het sluiten van alle window&apos;s</value>
<comment>GeneralSettings.xaml
Fuzzy</comment>
</data>
@@ -151,7 +151,7 @@ Fuzzy</comment>
<comment>TabBar.xaml</comment>
</data>
<data name="ColorInactiveTabs.Text" xml:space="preserve">
<value>Kleuren in interactieve tab&apos;s</value>
<value>Kleuren in interactive tab&apos;s</value>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="Command.Copy" xml:space="preserve">
@@ -160,11 +160,11 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="CustomTitle.Header" xml:space="preserve">
<value>Toon de tab naam in de titelbalk</value>
<value>Laat de tab zijn title zien in de title balk</value>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="EditTitle.Text" xml:space="preserve">
<value>Verander Titel</value>
<value>Verander Title</value>
<comment>TabBar.xaml</comment>
</data>
<data name="General.Text" xml:space="preserve">
@@ -181,7 +181,7 @@ Fuzzy</comment>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="NeedRelaunch.Text" xml:space="preserve">
<value>herstart is nodig om de instellingen toe te passen</value>
<value>herstart is nodig om de settings toe te passen</value>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="NewTab.Text" xml:space="preserve">
@@ -198,7 +198,7 @@ Fuzzy</comment>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="ONTA_Windows.Content" xml:space="preserve">
<value>Vensters</value>
<value>Window&apos;s</value>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="OpenNewTerminalAs.Text" xml:space="preserve">
@@ -234,7 +234,7 @@ Fuzzy</comment>
<comment>GeneralSettings.xaml</comment>
</data>
<data name="Setting" xml:space="preserve">
<value>Instelling</value>
<value>Instellingen</value>
<comment>SettingsPage.xaml.cs</comment>
</data>
<data name="Settings.Text" xml:space="preserve">
@@ -397,15 +397,15 @@ Fuzzy</comment>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="FontSize.Header" xml:space="preserve">
<value>Letter grootte</value>
<value>Letter grote</value>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="ImportTheme.Text" xml:space="preserve">
<value>Importeren</value>
<value>Importerne</value>
<comment>ThemeSettings.xaml</comment>
</data>
<data name="KeyboardShortcut.Header" xml:space="preserve">
<value>Sneltoets</value>
<value>Keyboard shortcut</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="KeyboardShortcut1.Text" xml:space="preserve">
@@ -429,7 +429,7 @@ Fuzzy</comment>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="MiddleButtonAction.Text" xml:space="preserve">
<value>Midden muisklik</value>
<value>Middle muisklik</value>
<comment>MouseSettings.xaml</comment>
</data>
<data name="Mouse.Text" xml:space="preserve">
@@ -454,7 +454,7 @@ Fuzzy</comment>
<comment>ThemeSettings.xaml</comment>
</data>
<data name="Padding.Header" xml:space="preserve">
<value>Vulling</value>
<value>Padding</value>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="ProfileName.Header" xml:space="preserve">
@@ -466,7 +466,7 @@ Fuzzy</comment>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="ProfileTheme.Header" xml:space="preserve">
<value>Thema</value>
<value>Theme</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="ReleaseNotes.Text" xml:space="preserve">
@@ -482,7 +482,7 @@ Fuzzy</comment>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="ScrollbackLimit.Header" xml:space="preserve">
<value>Terug scrollen limiet</value>
<value>Terug scrollen liemiet</value>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="ScrollBarAuto.Content" xml:space="preserve">
@@ -494,7 +494,7 @@ Fuzzy</comment>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="ScrollbarStyle.Text" xml:space="preserve">
<value>Scrollbar stijl</value>
<value>Scrollbar style</value>
<comment>TerminalSettings.xaml</comment>
</data>
<data name="ScrollBarVisible.Content" xml:space="preserve">
@@ -549,60 +549,60 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="WorkingDir.Header" xml:space="preserve">
<value>Werkmap</value>
<value>Working directory</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="ConfirmCloseTab" xml:space="preserve">
<value>Weet je zeker dat je tab &quot;{0}&quot; wilt sluiten?</value>
<value>Weet je het zeker dat je tab &quot;{0}&quot; wil sluiten?</value>
<comment>ViewModel
Fuzzy</comment>
</data>
<data name="ConfirmCloseWindow" xml:space="preserve">
<value>Weet je zeker dat je dit venster wilt sluiten?</value>
<value>Weet je zeker dat je deze window wil sluiten?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmDeleteKeybindings" xml:space="preserve">
<value>Weet je zeker dat je deze sneltoets wilt verwijderen?</value>
<value>Weet je zeker dat je deze keybinding wil verwijderen?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmDeleteTheme" xml:space="preserve">
<value>Weet je zeker dat je dit thema wilt verwijderen?</value>
<value>Weet je zeker dat je deze thema wil verwijderen?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmDiscardChanges" xml:space="preserve">
<value>Weet je zeker dat je alle wijzigingen wilt negeren?</value>
<value>Weet je zeker dat je alle wijzigingen wil negeeren?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmRestoreGeneralSettings" xml:space="preserve">
<value>Weet je zeker dat je de algemene instellingen wilt terug zetten naar de standaard instellingen?</value>
<value>Weet je zeker dat je de algemene instellingen wil terug zetten naar de standaard instellingen?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmRestoreKeybindings" xml:space="preserve">
<value>Weet je zeker dat je de keybindings wilt terug zetten naar de standaard instellingen?</value>
<value>Weet je zeker dat je de keybindings will terug zetten naar de standaard instellingen?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmRestoreMouseSettings" xml:space="preserve">
<value>Weet je zeker dat je de muis instellingen wilt terug zetten naar de standaard instellingen?</value>
<value>Weet je zeker dat je de muis instellingen will terug zetten naar de standaard instellingen?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmRestoreProfile" xml:space="preserve">
<value>Weet je zeker dat je dit profiel wilt herstellen?</value>
<value>Weet je zeker dat je dit profiel wil herstellen?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmRestoreTerminalOptions" xml:space="preserve">
<value>Weet je zeker dat je de standaard terminal instellingen wilt herstellen?</value>
<value>Weet je zeker dat je wil terug gaan naar de standaard terminal instellingen?</value>
<comment>ViewModel</comment>
</data>
<data name="DisabledByPolicy" xml:space="preserve">
<value>Uitgeschakeld door beleid.</value>
<value>Uitgeschakeld door policy.</value>
<comment>ViewModel</comment>
</data>
<data name="DisabledByUser" xml:space="preserve">
<value>Uitgezet door gebruiker. Activeer deze opnieuw in de automatisch starten tab in Taak Beheer.</value>
<value>Uit gezet door gebruiker. Activeer het opnieuw in de automaties starten tab in Taak Beheer.</value>
<comment>ViewModel</comment>
</data>
<data name="EditTitleString" xml:space="preserve">
<value>Verander Titel</value>
<value>Verander Title</value>
<comment>ViewModel</comment>
</data>
<data name="Error" xml:space="preserve">
@@ -610,11 +610,11 @@ Fuzzy</comment>
<comment>ViewModel</comment>
</data>
<data name="ErrorString1" xml:space="preserve">
<value>De actie kan niet worden voltooid door de volgende fout:</value>
<value>De actie kan niet worden voltooid door de volgende error:</value>
<comment>ViewModel</comment>
</data>
<data name="ImportThemeFailed" xml:space="preserve">
<value>Inporteren van thema mislukt</value>
<value>Inporteren van theme mislukt</value>
<comment>ViewModel</comment>
</data>
<data name="NoSuitableParserFound" xml:space="preserve">
@@ -629,10 +629,10 @@ Fuzzy</comment>
<value>Annuleren</value>
</data>
<data name="KeybindingDialogTitle.Text" xml:space="preserve">
<value>Voer de sneltoets nu in</value>
<value>Voer de keybinding nu in</value>
</data>
<data name="OK" xml:space="preserve">
<value>Oké</value>
<value>Oke</value>
</data>
<data name="ResetBtn.Content" xml:space="preserve">
<value>Reset</value>
@@ -647,7 +647,7 @@ Fuzzy</comment>
<comment>KeyBindingSettings.xaml</comment>
</data>
<data name="Command.ChangeTabTitle" xml:space="preserve">
<value>Verander tab titel</value>
<value>Verander tab title</value>
<comment>Command
Fuzzy</comment>
</data>
@@ -662,7 +662,7 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="Keybindings.Text" xml:space="preserve">
<value>Sneltoetsen</value>
<value>Keybindings</value>
<comment>KeyBindingSettings.xaml</comment>
</data>
<data name="Delete.Content" xml:space="preserve">
@@ -680,7 +680,7 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="Command.NewWindow" xml:space="preserve">
<value>Nieuw venster</value>
<value>Nieuwe window</value>
<comment>Command
Fuzzy</comment>
</data>
@@ -710,7 +710,7 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="Command.ShowSettings" xml:space="preserve">
<value>Laat instellingen zien</value>
<value>Laat settings zien</value>
<comment>Command
Fuzzy</comment>
</data>
@@ -760,17 +760,17 @@ Fuzzy</comment>
Fuzzy</comment>
</data>
<data name="Command.ToggleFullScreen" xml:space="preserve">
<value>Schakel naar volledig scherm</value>
<value>Schakel naar Fullscreen</value>
<comment>Command
Fuzzy</comment>
</data>
<data name="Command.ToggleWindow" xml:space="preserve">
<value>Schakel naar venster</value>
<value>Schakel naar window</value>
<comment>Command
Fuzzy</comment>
</data>
<data name="NewSshTab.Text" xml:space="preserve">
<value>Nieuwe externe tab</value>
<value>Nieuwe remote tab</value>
<comment>Fuzzy</comment>
</data>
<data name="Command.NewSshTab" xml:space="preserve">
@@ -788,7 +788,7 @@ Fuzzy</comment>
<value>host</value>
</data>
<data name="PortTextBox.PlaceholderText" xml:space="preserve">
<value>poort</value>
<value>port</value>
</data>
<data name="IdentityFileTextBox.PlaceholderText" xml:space="preserve">
<value>Identiteit bestand pad</value>
@@ -801,20 +801,20 @@ Fuzzy</comment>
<value>Gebruik Mosh</value>
</data>
<data name="AdvancedExpander.Header" xml:space="preserve">
<value>Geavanceerd</value>
<value>Advanced</value>
</data>
<data name="MoshPorts.Text" xml:space="preserve">
<value>Mosh poorten:</value>
</data>
<data name="SaveShortcutButton.Content" xml:space="preserve">
<value>Sneltoets opslaan</value>
<value>Shortcut opslaan</value>
<comment>Fuzzy</comment>
</data>
<data name="NeedsToRestart.Text" xml:space="preserve">
<value>De applicatie moet herstarten om deze veranderingen in werking te stellen.</value>
</data>
<data name="InvalidInput" xml:space="preserve">
<value>Ongeldige Invoer</value>
<value>Ongeldige Input</value>
<comment>Fuzzy</comment>
</data>
<data name="PortCannotBeZero" xml:space="preserve">
@@ -822,7 +822,7 @@ Fuzzy</comment>
<comment>Fuzzy</comment>
</data>
<data name="UserAndHostMandatory" xml:space="preserve">
<value>Gebruiker en host zijn verplichte velden.</value>
<value>Gebruiker en host azijn verplichte velden.</value>
<comment>Fuzzy</comment>
</data>
<data name="SshConnectionInfoValidationResult.UsernameEmpty" xml:space="preserve">
@@ -833,7 +833,7 @@ Fuzzy</comment>
<comment>Fuzzy</comment>
</data>
<data name="SshConnectionInfoValidationResult.SshPortZeroOrNegative" xml:space="preserve">
<value>SSH poort moet groter dan nul zijn.</value>
<value>SSH port moet meer dan nul zijn.</value>
<comment>Fuzzy</comment>
</data>
<data name="SshConnectionInfoValidationResult.MoshPortZeroOrNegative" xml:space="preserve">
@@ -856,16 +856,16 @@ Fuzzy</comment>
<value>Geen</value>
</data>
<data name="NewOutput.ToolTipService.ToolTip" xml:space="preserve">
<value>Nieuwe uitvoer</value>
<value>Nieuwe output</value>
</data>
<data name="ExitedWithError.ToolTipService.ToolTip" xml:space="preserve">
<value>Gestopt met een fout</value>
</data>
<data name="ConfirmDeleteProfile" xml:space="preserve">
<value>Weet je zeker dat je dit profiel wilt verwijderen?</value>
<value>Weet je zeker dat je deze profiel wil verwijderen?</value>
</data>
<data name="Command.NewSshWindow" xml:space="preserve">
<value>Nieuw SSH venster</value>
<value>Nieuwe SSH window</value>
</data>
<data name="Setting_SShProfiles.Content" xml:space="preserve">
<value>SSH-profielen</value>
@@ -901,10 +901,10 @@ Fuzzy</comment>
<value>Instellingen zijn geëxporteerd naar bestand</value>
</data>
<data name="SettingsImported" xml:space="preserve">
<value>Instellingen zijn geïmporteerd van bestand</value>
<value>Instellingen zijn geimporteerd van bestand</value>
</data>
<data name="SshConnectionInfoValidationResult.IdentityFileDoesNotExist" xml:space="preserve">
<value>Identiteit bestaat niet, Identiteit bestand bestaat niet</value>
<value>Identitijt bestaat niet, Identitijt bestand bestaat niet</value>
</data>
<data name="AutoFallbackToWindowsUsername.Header" xml:space="preserve">
<value>Gebruik Windows gebruikersnaam bij het openen van SSH URLs die geen gebruikersnaam hebben</value>
@@ -922,7 +922,7 @@ Fuzzy</comment>
<value>Ongeldig command.</value>
</data>
<data name="LocationCantBeEmpty" xml:space="preserve">
<value>Locatie kan niet leeg zijn.</value>
<value>Locaatsie kan niet leeg zijn.</value>
</data>
<data name="MuteTerminalBeeps.Header" xml:space="preserve">
<value>Demp terminal geluiden</value>
@@ -931,7 +931,7 @@ Fuzzy</comment>
<value>Voer een commando (b.v. &apos;ssh gebruikersnaam@host&apos;)</value>
</data>
<data name="CommandLine.Header" xml:space="preserve">
<value>Commando</value>
<value>Command</value>
</data>
<data name="UnsupportedCommand" xml:space="preserve">
<value>Niet ondersteund commando:</value>
@@ -947,7 +947,7 @@ Fuzzy</comment>
<value>Nieuwe snel uitvoeren tab</value>
</data>
<data name="Command.NewCustomCommandWindow" xml:space="preserve">
<value>Nieuw snel uitvoeren venster</value>
<value>Nieuw snelle uitvoeren window</value>
</data>
<data name="NewQuickTab.Text" xml:space="preserve">
<value>Snel nieuwe tab</value>
@@ -959,7 +959,7 @@ Fuzzy</comment>
<value>Ongeldige link.</value>
</data>
<data name="DropTabHere" xml:space="preserve">
<value>Plaats tab hier</value>
<value>Drop tab here</value>
</data>
<data name="CloseLeft.Text" xml:space="preserve">
<value>Sluit alle tabs naar links</value>
@@ -977,16 +977,16 @@ Fuzzy</comment>
<value>Duplicaat</value>
</data>
<data name="DuplicateEnvironmentVariable" xml:space="preserve">
<value>Kan niet 2 omgeving variabelen met dezelfde naam hebben.</value>
<value>Kan niet 2 envourment variables met dezelfde naam hebben.</value>
</data>
<data name="EmptyEnvironmentVariableName" xml:space="preserve">
<value>Kan geen omgeving variabele aanmaken zonder een naam.</value>
<value>Kan geen envourment variable aanmaken zonder een naam.</value>
</data>
<data name="EnvironmentVariables.Text" xml:space="preserve">
<value>Omgeving variabelen</value>
<value>Environment variables</value>
</data>
<data name="CloseSearchPanel.ToolTipService.ToolTip" xml:space="preserve">
<value>Sluit zoekbalk</value>
<value>Sluit zoek balk</value>
</data>
<data name="FindNext.ToolTipService.ToolTip" xml:space="preserve">
<value>Find volgende</value>
@@ -995,17 +995,17 @@ Fuzzy</comment>
<value>Find vorige</value>
</data>
<data name="SearchTextBox.PlaceholderText" xml:space="preserve">
<value>Voer zoekterm in</value>
<value>Enter zoek term</value>
</data>
<data name="Search.Text" xml:space="preserve">
<value>Zoeken</value>
<value>Zoekken</value>
</data>
<data name="PrintableOutputOnly.Content" xml:space="preserve">
<value>Print alleen uitvoer</value>
<value>Print output alleen</value>
<comment>Fuzzy</comment>
</data>
<data name="EnableLogging.Header" xml:space="preserve">
<value>Log uitvoer voor debugging</value>
<value>Log output voor debugging</value>
</data>
<data name="WordSeparator.Header" xml:space="preserve">
<value>Woord scheidingstekens</value>
@@ -1015,114 +1015,99 @@ Fuzzy</comment>
<value>Recent</value>
</data>
<data name="NewTab_Description" xml:space="preserve">
<value>Opent standaard profiel in een nieuw tab</value>
<value>Opens default profile in a new tab.</value>
</data>
<data name="NewSshTab_Description" xml:space="preserve">
<value>Opens a new SSH or Mosh session in a new tab.</value>
</data>
<data name="NewQuickTab_Description" xml:space="preserve">
<value>Opent &quot;Snel Laden&quot; dialoog en start een sessie in een nieuwe tab</value>
<value>Opens &quot;Quick Launch&quot; dialog and starts session in a new tab.</value>
</data>
<data name="Settings_Description" xml:space="preserve">
<value>Opent het instellingen venster</value>
<value>Opens settings window.</value>
</data>
<data name="About_Description" xml:space="preserve">
<value>Basisinformatie over de applicatie.</value>
<value>Basic info about the app.</value>
</data>
<data name="Recent_Description" xml:space="preserve">
<value>Recentelijk geopende sessies.</value>
<value>Recently opened sessions.</value>
</data>
<data name="MenuItem_DefaultProfile_Description" xml:space="preserve">
<value>Start een nieuwe Terminal sessie, gebaseerd op het standaard profiel.</value>
<value>Starts new terminal session based on the default profile.</value>
</data>
<data name="MenuItem_Remote_Text" xml:space="preserve">
<value>Extern verbinden...</value>
<value>Remote Connect...</value>
</data>
<data name="MenuItem_Remote_Description" xml:space="preserve">
<value>Opent een dialoog voor het starten van een nieuwe SSH of Mosh Terminal sessie.</value>
<value>Opens a dialog for launching a new SSH or Mosh terminal session.</value>
</data>
<data name="MenuItem_QuickLaunch_Text" xml:space="preserve">
<value>Snel Laden...</value>
<value>Quick Launch...</value>
</data>
<data name="MenuItem_QuickLaunch_Description" xml:space="preserve">
<value>Opent een &quot;Snel Laden&quot; dialoog om een nieuwe Terminal sessie te starten.</value>
<value>Opens a &quot;Quick Launch&quot; dialog for starting a new terminal session.</value>
</data>
<data name="MenuItem_NewWindow_Text" xml:space="preserve">
<value>Nieuw Venster</value>
<value>New Window</value>
</data>
<data name="MenuItem_NewTab_Text" xml:space="preserve">
<value>Nieuwe Tab</value>
<value>New Tab</value>
</data>
<data name="MenuItem_NewTab_Description" xml:space="preserve">
<value>Start een sessie in een nieuw tab</value>
<value>Launches a session in a new tab.</value>
</data>
<data name="MenuItem_NewWindow_Description" xml:space="preserve">
<value>Start een sessie in een nieuw venster.</value>
<value>Launches a session in a new window.</value>
</data>
<data name="AppMenuType.Text" xml:space="preserve">
<value>Applicatie menu type</value>
<value>Application menu type</value>
</data>
<data name="AppMenuType_Flat.Content" xml:space="preserve">
<value>Plat, naar de &quot;Open nieuwe terminals als&quot; instelling</value>
<value>Flat, honoring &quot;Open new terminals as&quot; setting</value>
</data>
<data name="AppMenuType_Cascading.Content" xml:space="preserve">
<value>&quot;Nieuw Tab&quot; / &quot;Nieuw Venster&quot; trapsgewijs</value>
<value>&quot;New Tab&quot; / &quot;New Window&quot; cascading</value>
</data>
<data name="Quit.Text" xml:space="preserve">
<value>Stop</value>
<value>Quit</value>
</data>
<data name="Quit.Description" xml:space="preserve">
<value>Stop Fluent Terminal</value>
<value>Quit Fluent Terminal</value>
</data>
<data name="EnabledByPolicy" xml:space="preserve">
<value>Aangezet doot beleid.</value>
<value>Enabled by policy.</value>
</data>
<data name="BackgroundImage.Content" xml:space="preserve">
<value>Achtergrond afbeelding</value>
<value>Background image</value>
</data>
<data name="AcrylicBackground.Header" xml:space="preserve">
<value>Gebruik een acryl achtergrond</value>
<value>Use acrylic background</value>
</data>
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
<value>Weet je zeker dat je deze achtergrond wilt verwijderen?</value>
<value>Are you sure you want to delete this background image?</value>
</data>
<data name="Colors.Text" xml:space="preserve">
<value>Kleuren</value>
<value>Colors</value>
</data>
<data name="BrightColors.Text" xml:space="preserve">
<value>Felle kleuren</value>
<value>Bright colors</value>
</data>
<data name="CopyLink" xml:space="preserve">
<value>Kopieer link</value>
<value>Copy link</value>
</data>
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
<value>Regex</value>
</data>
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
<value>Heel woord</value>
<value>Whole word</value>
</data>
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
<value>Hoofdlettergevoelig</value>
<value>Case sensitive</value>
</data>
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
<value>Kopieer selectie of plak</value>
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Gebruik slimme buffer</value>
<value>Use buffer</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Herstart</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Sessie verbroken.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Verhoog lettertype grootte</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Verlaag lettertype grootte</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Herstel lettertype grootte</value>
</data>
</root>
</root>
+37 -51
View File
@@ -154,8 +154,9 @@
<comment>XtermTerminalView.xaml.cs</comment>
</data>
<data name="CustomTitle.Header" xml:space="preserve">
<value>Pokaż niestandardowe tytuły kart także w pasku tytułu</value>
<comment>GeneralSettings.xaml</comment>
<value>Pokaż</value>
<comment>GeneralSettings.xaml
Fuzzy</comment>
</data>
<data name="EditTitle.Text" xml:space="preserve">
<value>Zmień tytuł</value>
@@ -771,13 +772,13 @@
<value>Port nie może być 0</value>
</data>
<data name="UserAndHostMandatory" xml:space="preserve">
<value>Użytkownik i adres hosta są niezbędne</value>
<value>Użytkownik i IP są niezbędne</value>
</data>
<data name="SshConnectionInfoValidationResult.UsernameEmpty" xml:space="preserve">
<value>Nazwa użytkownika nie może być pusta</value>
</data>
<data name="SshConnectionInfoValidationResult.HostEmpty" xml:space="preserve">
<value>Adres hosta nie może być pusty</value>
<value>IP nie może być puste</value>
</data>
<data name="SshConnectionInfoValidationResult.SshPortZeroOrNegative" xml:space="preserve">
<value>Port SSH musi być większy od 0</value>
@@ -948,117 +949,102 @@
<value>Znaki seperujące słowa</value>
</data>
<data name="Recent.Text" xml:space="preserve">
<value>Ostatnie</value>
<value>Recent</value>
</data>
<data name="NewTab_Description" xml:space="preserve">
<value>Otwórz domyślny profil w nowej karcie.</value>
<value>Opens default profile in a new tab.</value>
</data>
<data name="NewSshTab_Description" xml:space="preserve">
<value>Otwórz nową sesję SSH lub Mosh w nowej karcie.</value>
<value>Opens a new SSH or Mosh session in a new tab.</value>
</data>
<data name="NewQuickTab_Description" xml:space="preserve">
<value>Otwiera okno dialogowe &quot;Szybkie uruchomienie&quot; i rozpoczyna sesję w nowej karcie.</value>
<value>Opens &quot;Quick Launch&quot; dialog and starts session in a new tab.</value>
</data>
<data name="Settings_Description" xml:space="preserve">
<value>Otwórz okno ustawień.</value>
<value>Opens settings window.</value>
</data>
<data name="About_Description" xml:space="preserve">
<value>Podstawowe informacje o aplikacji.</value>
<value>Basic info about the app.</value>
</data>
<data name="Recent_Description" xml:space="preserve">
<value>Niedawno otwarte sesje.</value>
<value>Recently opened sessions.</value>
</data>
<data name="MenuItem_DefaultProfile_Description" xml:space="preserve">
<value>Rozpoczyna nowa sesję terminala bazującą na domyślnym profilu.</value>
<value>Starts new terminal session based on the default profile.</value>
</data>
<data name="MenuItem_Remote_Text" xml:space="preserve">
<value>Połącz zdalnie...</value>
<value>Remote Connect...</value>
</data>
<data name="MenuItem_Remote_Description" xml:space="preserve">
<value>Otwiera okno dialogowe do rozpoczynania nowej sesji terminala SSH lub Mosh.</value>
<value>Opens a dialog for launching a new SSH or Mosh terminal session.</value>
</data>
<data name="MenuItem_QuickLaunch_Text" xml:space="preserve">
<value>Szybkie uruchomienie...</value>
<value>Quick Launch...</value>
</data>
<data name="MenuItem_QuickLaunch_Description" xml:space="preserve">
<value>Otwiera okno dialogowe &quot;Szybkie uruchomienie&quot; aby rozpocząć nową sesje terminala.</value>
<value>Opens a &quot;Quick Launch&quot; dialog for starting a new terminal session.</value>
</data>
<data name="MenuItem_NewWindow_Text" xml:space="preserve">
<value>Nowe okno</value>
<value>New Window</value>
</data>
<data name="MenuItem_NewTab_Text" xml:space="preserve">
<value>Nowa Karta</value>
<value>New Tab</value>
</data>
<data name="MenuItem_NewTab_Description" xml:space="preserve">
<value>Otwiera sesję w nowej karcie.</value>
<value>Launches a session in a new tab.</value>
</data>
<data name="MenuItem_NewWindow_Description" xml:space="preserve">
<value>Otwiera sesję w nowym oknie.</value>
<value>Launches a session in a new window.</value>
</data>
<data name="AppMenuType.Text" xml:space="preserve">
<value>Typ menu aplikacji</value>
<value>Application menu type</value>
</data>
<data name="AppMenuType_Flat.Content" xml:space="preserve">
<value>Płaskie, przestrzegające ustawienia &quot;Otwórz nowe terminale jako&quot;.</value>
<value>Flat, honoring &quot;Open new terminals as&quot; setting</value>
</data>
<data name="AppMenuType_Cascading.Content" xml:space="preserve">
<value>&quot;Nowa karta&quot; / &quot;Nowe okno&quot; kaskadowo</value>
<value>&quot;New Tab&quot; / &quot;New Window&quot; cascading</value>
</data>
<data name="Quit.Text" xml:space="preserve">
<value>Zakończ</value>
<value>Quit</value>
</data>
<data name="Quit.Description" xml:space="preserve">
<value>Wyjdź z Fluent Terminal</value>
<value>Quit Fluent Terminal</value>
</data>
<data name="EnabledByPolicy" xml:space="preserve">
<value>Włączone przez polityke.</value>
<value>Enabled by policy.</value>
</data>
<data name="BackgroundImage.Content" xml:space="preserve">
<value>Obraz tła</value>
<value>Background image</value>
</data>
<data name="AcrylicBackground.Header" xml:space="preserve">
<value>Użyj akrylowego tła</value>
<value>Use acrylic background</value>
</data>
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
<value>Czy na pewno chcesz usunąć ten obraz tła?</value>
<value>Are you sure you want to delete this background image?</value>
</data>
<data name="Colors.Text" xml:space="preserve">
<value>Kolory</value>
<value>Colors</value>
</data>
<data name="BrightColors.Text" xml:space="preserve">
<value>Jasne kolory</value>
<value>Bright colors</value>
</data>
<data name="CopyLink" xml:space="preserve">
<value>Skopiuj łącze</value>
<value>Copy link</value>
</data>
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
<value>Regex</value>
</data>
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
<value>Całe słowo</value>
<value>Whole word</value>
</data>
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
<value>Uwzględnij wielkość liter</value>
<value>Case sensitive</value>
</data>
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
<value>Skopiuj zaznaczenie lub wklej</value>
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Użyj inteligentnego buforowania</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Uruchom ponownie</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Sesja rozłączona</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Zwiększ rozmiar czcionki</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Zmniejsz rozmiar czcionki</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Zresetuj rozmiar czcionki</value>
<value>Use buffer</value>
</data>
</root>
+13 -27
View File
@@ -230,8 +230,9 @@
<comment>MainPage.xaml</comment>
</data>
<data name="SystemTray.Header" xml:space="preserve">
<value>Exibir na bandeja do sistema</value>
<comment>GeneralSettings.xaml</comment>
<value>Exibir em segundo plano</value>
<comment>GeneralSettings.xaml
Fuzzy</comment>
</data>
<data name="TabsPostion.Text" xml:space="preserve">
<value>Exibir abas em</value>
@@ -1014,51 +1015,36 @@
<value>Habilitado pela política</value>
</data>
<data name="BackgroundImage.Content" xml:space="preserve">
<value>Imagem de fundo</value>
<value>Background image</value>
</data>
<data name="AcrylicBackground.Header" xml:space="preserve">
<value>Usar fundo acrílico</value>
<value>Use acrylic background</value>
</data>
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
<value>Tem certeza que deseja remover esta imagem de fundo?</value>
<value>Are you sure you want to delete this background image?</value>
</data>
<data name="Colors.Text" xml:space="preserve">
<value>Cores</value>
<value>Colors</value>
</data>
<data name="BrightColors.Text" xml:space="preserve">
<value>Cores claras</value>
<value>Bright colors</value>
</data>
<data name="CopyLink" xml:space="preserve">
<value>Copiar link</value>
<value>Copy link</value>
</data>
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
<value>Regex</value>
</data>
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
<value>Toda a palavra</value>
<value>Whole word</value>
</data>
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
<value>Sensível à maiúsculas</value>
<value>Case sensitive</value>
</data>
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
<value>Copiar seleção ou colar</value>
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Usar buffer inteligente</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Reiniciar</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Sessão desconectada</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
+10 -25
View File
@@ -1014,51 +1014,36 @@
<value>Activat de politică.</value>
</data>
<data name="BackgroundImage.Content" xml:space="preserve">
<value>Imagine de fundal</value>
<value>Background image</value>
</data>
<data name="AcrylicBackground.Header" xml:space="preserve">
<value>Folosiți fundal acrilic</value>
<value>Use acrylic background</value>
</data>
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
<value>Sigur doriți să ștergeți această imagine de fundal?</value>
<value>Are you sure you want to delete this background image?</value>
</data>
<data name="Colors.Text" xml:space="preserve">
<value>Culori</value>
<value>Colors</value>
</data>
<data name="BrightColors.Text" xml:space="preserve">
<value>Culori deschise</value>
<value>Bright colors</value>
</data>
<data name="CopyLink" xml:space="preserve">
<value>Copiere link</value>
<value>Copy link</value>
</data>
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
<value>Regex</value>
</data>
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
<value>Întregul cuvânt</value>
<value>Whole word</value>
</data>
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
<value>Potrivire litere</value>
<value>Case sensitive</value>
</data>
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
<value>Copiați selecția sau lipiți</value>
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Folosiți tampon inteligent</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Repornire</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Sesiunea a fost deconectată.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
+12 -27
View File
@@ -182,7 +182,7 @@
<comment>MainPage.xaml</comment>
</data>
<data name="TabTheme.None" xml:space="preserve">
<value>Нет</value>
<value>Ничего</value>
<comment>TabBar.xaml</comment>
</data>
<data name="ONTA_Tabs.Content" xml:space="preserve">
@@ -362,7 +362,7 @@
<comment>TerminalSettings.xaml</comment>
</data>
<data name="DeleteAppBarButton.Label" xml:space="preserve">
<value>Удалить</value>
<value>Удали</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="LineEndingStyle.DoNotModify" xml:space="preserve">
@@ -442,7 +442,7 @@
<comment>TerminalSettings.xaml</comment>
</data>
<data name="ProfileName.Header" xml:space="preserve">
<value>Название</value>
<value>Назване</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="Profiles.Text" xml:space="preserve">
@@ -542,11 +542,11 @@
<comment>ViewModel</comment>
</data>
<data name="ConfirmDeleteKeybindings" xml:space="preserve">
<value>Вы действительно хотите удалить эту горячую клавишу?</value>
<value>Вы действительно хотите удалить горячую клавишу?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmDeleteTheme" xml:space="preserve">
<value>Вы действительно хотите удалить эту тему?</value>
<value>Вы действительно хотите удалить тему?</value>
<comment>ViewModel</comment>
</data>
<data name="ConfirmDiscardChanges" xml:space="preserve">
@@ -771,7 +771,7 @@
<value>Порт не может быть 0.</value>
</data>
<data name="UserAndHostMandatory" xml:space="preserve">
<value>Пользователь и хост обязательные поля.</value>
<value>Пользователь и хост обязательные поля</value>
</data>
<data name="SshConnectionInfoValidationResult.UsernameEmpty" xml:space="preserve">
<value>Пользователь не может быть пустым.</value>
@@ -786,7 +786,7 @@
<value>Порт Mosh не может быть равен нулю.</value>
</data>
<data name="SshConnectionInfoValidationResult.MoshPortRangeInvalid" xml:space="preserve">
<value>Диапазон Mosh портов недействителен.</value>
<value>Диапозон портов Mosh недействителен.</value>
</data>
<data name="Yes.Text" xml:space="preserve">
<value>Да</value>
@@ -825,19 +825,19 @@
<value>Пользователь</value>
</data>
<data name="MoshPortFrom.Header" xml:space="preserve">
<value>От порта</value>
<value>C порта</value>
</data>
<data name="MoshPortTo.Header" xml:space="preserve">
<value>До порта</value>
</data>
<data name="MoshPortRange.Text" xml:space="preserve">
<value>Диапазон Mosh портов</value>
<value>Диапозон Mosh портов</value>
</data>
<data name="Authenticate" xml:space="preserve">
<value>Аутентификация</value>
</data>
<data name="SettingsExported" xml:space="preserve">
<value>Настройки экспортированы в файл</value>
<value>Настройки сохранены в файл</value>
</data>
<data name="SettingsImported" xml:space="preserve">
<value>Настройки импортированы из файла</value>
@@ -1021,7 +1021,7 @@
<value>Использовать акриловый фон</value>
</data>
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
<value>Вы действительно хотите удалить это фоновое изображение?</value>
<value>Удалить это фоновое изображение?</value>
</data>
<data name="Colors.Text" xml:space="preserve">
<value>Цвета</value>
@@ -1045,21 +1045,6 @@
<value>Скопировать выделение или вставить</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Использовать буфер</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Перезапустить</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Соединение разорвано.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+1 -16
View File
@@ -1044,21 +1044,6 @@
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>Use smart buffer</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>Restart</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>Session disconnected.</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
@@ -386,7 +386,7 @@ Fuzzy</comment>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="LineEndingStyle.DoNotModify" xml:space="preserve">
<value>不改变结束行</value>
<value>不改变</value>
<comment>ShellProfileSettings.xaml</comment>
</data>
<data name="EditAppBarButton.Label" xml:space="preserve">
@@ -968,117 +968,102 @@ Fuzzy</comment>
<value>单词分隔符</value>
</data>
<data name="Recent.Text" xml:space="preserve">
<value>最近</value>
<value>Recent</value>
</data>
<data name="NewTab_Description" xml:space="preserve">
<value>在新标签打开默认配置。</value>
<value>Opens default profile in a new tab.</value>
</data>
<data name="NewSshTab_Description" xml:space="preserve">
<value>从新标签页打开SSH或Mosh会话</value>
<value>Opens a new SSH or Mosh session in a new tab.</value>
</data>
<data name="NewQuickTab_Description" xml:space="preserve">
<value>打开“快速启动”对话框并在新标签中开启会话。</value>
<value>Opens &quot;Quick Launch&quot; dialog and starts session in a new tab.</value>
</data>
<data name="Settings_Description" xml:space="preserve">
<value>打开设置页面</value>
<value>Opens settings window.</value>
</data>
<data name="About_Description" xml:space="preserve">
<value>关于</value>
<value>Basic info about the app.</value>
</data>
<data name="Recent_Description" xml:space="preserve">
<value>最近打开的会话</value>
<value>Recently opened sessions.</value>
</data>
<data name="MenuItem_DefaultProfile_Description" xml:space="preserve">
<value>基于默认配置开启新的终端会话。</value>
<value>Starts new terminal session based on the default profile.</value>
</data>
<data name="MenuItem_Remote_Text" xml:space="preserve">
<value>远程连接</value>
<value>Remote Connect...</value>
</data>
<data name="MenuItem_Remote_Description" xml:space="preserve">
<value>打开对话框开启新的 SSH 或 Mosh 终端会话。</value>
<value>Opens a dialog for launching a new SSH or Mosh terminal session.</value>
</data>
<data name="MenuItem_QuickLaunch_Text" xml:space="preserve">
<value>快捷启动</value>
<value>Quick Launch...</value>
</data>
<data name="MenuItem_QuickLaunch_Description" xml:space="preserve">
<value>打开“快速启动”对话框并开启终端会话。</value>
<value>Opens a &quot;Quick Launch&quot; dialog for starting a new terminal session.</value>
</data>
<data name="MenuItem_NewWindow_Text" xml:space="preserve">
<value>新建窗口</value>
<value>New Window</value>
</data>
<data name="MenuItem_NewTab_Text" xml:space="preserve">
<value>新建标签页</value>
<value>New Tab</value>
</data>
<data name="MenuItem_NewTab_Description" xml:space="preserve">
<value>从新标签页启动会话</value>
<value>Launches a session in a new tab.</value>
</data>
<data name="MenuItem_NewWindow_Description" xml:space="preserve">
<value>从新窗口启动会话</value>
<value>Launches a session in a new window.</value>
</data>
<data name="AppMenuType.Text" xml:space="preserve">
<value>应用菜单类型</value>
<value>Application menu type</value>
</data>
<data name="AppMenuType_Flat.Content" xml:space="preserve">
<value>扁平,荣耀的“打开新的终端”设置</value>
<value>Flat, honoring &quot;Open new terminals as&quot; setting</value>
</data>
<data name="AppMenuType_Cascading.Content" xml:space="preserve">
<value>“新标签”/“新窗口”级联菜单</value>
<value>&quot;New Tab&quot; / &quot;New Window&quot; cascading</value>
</data>
<data name="Quit.Text" xml:space="preserve">
<value>退出</value>
<value>Quit</value>
</data>
<data name="Quit.Description" xml:space="preserve">
<value>退出关于</value>
<value>Quit Fluent Terminal</value>
</data>
<data name="EnabledByPolicy" xml:space="preserve">
<value>根据策略启用。</value>
<value>Enabled by policy.</value>
</data>
<data name="BackgroundImage.Content" xml:space="preserve">
<value>背景图片</value>
<value>Background image</value>
</data>
<data name="AcrylicBackground.Header" xml:space="preserve">
<value>使用亚克力背景</value>
<value>Use acrylic background</value>
</data>
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
<value>你确定你想要删除这个背景图片吗?</value>
<value>Are you sure you want to delete this background image?</value>
</data>
<data name="Colors.Text" xml:space="preserve">
<value>颜色</value>
<value>Colors</value>
</data>
<data name="BrightColors.Text" xml:space="preserve">
<value>亮色</value>
<value>Bright colors</value>
</data>
<data name="CopyLink" xml:space="preserve">
<value>复制链接</value>
<value>Copy link</value>
</data>
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
<value>正则表达式</value>
<value>Regex</value>
</data>
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
<value>全字匹配</value>
<value>Whole word</value>
</data>
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
<value>大小写敏感</value>
<value>Case sensitive</value>
</data>
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
<value>复制或者粘贴选中的文本</value>
<value>Copy selection or paste</value>
</data>
<data name="UseBuffer" xml:space="preserve">
<value>使用智能缓冲</value>
</data>
<data name="RestartSession.Content" xml:space="preserve">
<value>重启</value>
</data>
<data name="SessionDisconnected.Text" xml:space="preserve">
<value>会话已断开</value>
</data>
<data name="Command.IncreaseFontSize" xml:space="preserve">
<value>Increase font size</value>
</data>
<data name="Command.DecreaseFontSize" xml:space="preserve">
<value>Decrease font size</value>
</data>
<data name="Command.ResetFontSize" xml:space="preserve">
<value>Reset font size</value>
<value>Use buffer</value>
</data>
</root>
File diff suppressed because it is too large. Load diff
@@ -249,6 +249,13 @@
IsEnabled="{x:Bind InEditMode, Mode=OneWay}"
IsOn="{x:Bind ProfileVm.UseConPty, Mode=TwoWay}" />
<ToggleSwitch
x:Uid="UseBuffer"
Margin="{StaticResource ItemMargin}"
Header="{x:Bind Converter={StaticResource I18NConverter}, ConverterParameter=UseBuffer}"
IsEnabled="{x:Bind InEditMode, Mode=OneWay}"
IsOn="{x:Bind ProfileVm.UseBuffer, Mode=TwoWay}" />
<StackPanel Margin="{StaticResource ItemMargin}">
<TextBlock
x:Uid="EnvironmentVariables"
@@ -276,11 +283,11 @@
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{x:Bind Name, Mode=OneWay}" />
<controls:HeaderedContentControl
<controls:HeaderedTextBlock
x:Uid="ShellLocation"
Margin="{StaticResource ItemMargin}"
Header="Shell executable location"
Content="{x:Bind ProfileVm.Location, Mode=OneWay}" />
Text="{x:Bind ProfileVm.Location, Mode=OneWay}" />
<controls:HeaderedContentControl
x:Uid="WorkingDir"
@@ -343,6 +350,18 @@
FontWeight="Light" />
</controls:HeaderedContentControl>
<controls:HeaderedContentControl
Margin="{StaticResource ItemMargin}"
HorizontalContentAlignment="Stretch"
Header="{x:Bind Converter={StaticResource I18NConverter}, ConverterParameter=UseBuffer}">
<ContentControl
Margin="0,6,0,0"
Content="{x:Bind ProfileVm.UseBuffer, Mode=OneWay}"
ContentTemplateSelector="{StaticResource UseConPtyTemplateSelector}"
FontSize="18"
FontWeight="Light" />
</controls:HeaderedContentControl>
<controls:HeaderedContentControl
Margin="{StaticResource ItemMargin}"
HorizontalContentAlignment="Stretch"
@@ -291,6 +291,12 @@
IsEnabled="{x:Bind InEditMode, Mode=OneWay}"
IsOn="{x:Bind ProfileVm.UseConPty, Mode=TwoWay}" />
<ToggleSwitch
Margin="{StaticResource ItemMargin}"
Header="{x:Bind Converter={StaticResource I18NConverter}, ConverterParameter=UseBuffer}"
IsEnabled="{x:Bind InEditMode, Mode=OneWay}"
IsOn="{x:Bind ProfileVm.UseBuffer, Mode=TwoWay}" />
<StackPanel Margin="{StaticResource ItemMargin}">
<TextBlock
x:Uid="EnvironmentVariables"
@@ -462,6 +468,19 @@
FontWeight="Light" />
</controls:HeaderedContentControl>
<controls:HeaderedContentControl
Margin="{StaticResource ItemMargin}"
HorizontalContentAlignment="Stretch"
DataContext="{Binding ProfileVm}"
Header="{x:Bind Converter={StaticResource I18NConverter}, ConverterParameter=UseBuffer}">
<ContentControl
Margin="0,6,0,0"
Content="{Binding UseBuffer, Mode=OneWay}"
ContentTemplateSelector="{StaticResource UseConPtyTemplateSelector}"
FontSize="18"
FontWeight="Light" />
</controls:HeaderedContentControl>
<controls:HeaderedContentControl
Margin="{StaticResource ItemMargin}"
HorizontalContentAlignment="Stretch"
+3 -3
View File
@@ -88,7 +88,7 @@
RelativePanel.AlignRightWithPanel="True"
Visibility="{x:Bind IsUnderlined, Mode=OneWay, Converter={StaticResource TrueToVisibleConverter}}" />
<Grid
x:Name="HasExitedWithErrorGrid"
x:Name="HasExitedWithError"
Height="32"
Margin="6,0,0,0"
RelativePanel.AlignLeftWithPanel="True"
@@ -105,7 +105,7 @@
<TextBlock
Margin="12,8,6,0"
RelativePanel.LeftOf="CloseButton"
RelativePanel.RightOf="HasExitedWithErrorGrid"
RelativePanel.RightOf="HasExitedWithError"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{x:Bind TabTitle, Mode=OneWay, Converter={StaticResource TextMiddleEllipsisConverter}}"
TextWrapping="NoWrap" />
@@ -118,7 +118,7 @@
HorizontalAlignment="Center"
Command="{x:Bind CloseCommand}"
Style="{StaticResource TitleBarButtonStyle}"
ToolTipService.ToolTip="{x:Bind Converter={StaticResource I18NConverter}, ConverterParameter=Close}"
ToolTipService.ToolTip="Close"
Visibility="{x:Bind ShowCloseButton, Mode=OneWay, Converter={StaticResource TrueToVisibleConverter}}">
<Viewbox Width="12" Height="12">
<SymbolIcon Symbol="Cancel" />
+15 -15
View File
@@ -1,19 +1,19 @@
<ResourceDictionary
x:Class="FluentTerminal.App.Views.TemplateSelectors"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="using:FluentTerminal.App.Views"
xmlns:models="using:FluentTerminal.Models"
xmlns:settings="using:FluentTerminal.App.ViewModels.Settings"
xmlns:views="using:FluentTerminal.App.Views">
xmlns:settings="using:FluentTerminal.App.ViewModels.Settings">
<views:TabThemeTemplateSelector x:Key="TabThemeTemplateSelector">
<views:TabThemeTemplateSelector.DefaultTemplate>
<DataTemplate x:DataType="models:TabTheme">
<StackPanel Orientation="Horizontal">
<FontIcon
Margin="0,0,6,0"
FontFamily="{StaticResource SymbolThemeFontFamily}"
Glyph="&#xF126;" />
<TextBlock Text="{x:Bind Name, Mode=OneTime, Converter={StaticResource I18NConverter}}" />
Margin="0,0,6,0"
FontFamily="{StaticResource SymbolThemeFontFamily}"
Glyph="&#xF126;" />
<TextBlock Text="{x:Bind Name, Mode=OneWay}" />
</StackPanel>
</DataTemplate>
</views:TabThemeTemplateSelector.DefaultTemplate>
@@ -21,11 +21,11 @@
<DataTemplate x:DataType="models:TabTheme">
<StackPanel Orientation="Horizontal">
<FontIcon
Margin="0,0,6,0"
FontFamily="{StaticResource SymbolThemeFontFamily}"
Foreground="{x:Bind Color}"
Glyph="&#xF127;" />
<TextBlock Text="{x:Bind Name, Mode=OneTime, Converter={StaticResource I18NConverter}}" />
Margin="0,0,6,0"
FontFamily="{StaticResource SymbolThemeFontFamily}"
Foreground="{x:Bind Color}"
Glyph="&#xF127;" />
<TextBlock Text="{x:Bind Name, Mode=OneWay}" />
</StackPanel>
</DataTemplate>
</views:TabThemeTemplateSelector.ColoredTemplate>
@@ -51,9 +51,9 @@
<views:TerminalKeybindTemplateSelector.KeyBindingsTemplate>
<DataTemplate x:DataType="settings:KeyBindingsViewModel">
<views:KeyBindingsView
Margin="0,6,0,0"
ShowCommandName="False"
ViewModel="{x:Bind}" />
Margin="0,6,0,0"
ShowCommandName="False"
ViewModel="{x:Bind}" />
</DataTemplate>
</views:TerminalKeybindTemplateSelector.KeyBindingsTemplate>
</views:TerminalKeybindTemplateSelector>
+2 -33
View File
@@ -35,7 +35,7 @@
Width="16"
Height="16"
Margin="6,0,0,0">
<SymbolIcon Symbol="Find" />
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="&#xF78B;" />
</Viewbox>
<TextBox
Name="SearchTextBox"
@@ -47,9 +47,7 @@
IsTabStop="True"
KeyUp="OnSearchTextBoxKeyUp"
PlaceholderText="Enter search term"
Text="{x:Bind ViewModel.SearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
GotFocus="SearchTextBox_GotFocus"
LostFocus="SearchTextBox_LostFocus">
Text="{x:Bind ViewModel.SearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<Interactivity:Interaction.Behaviors>
<Core:DataTriggerBehavior Binding="{x:Bind ViewModel.ShowSearchPanel, Mode=OneWay}" Value="true">
<actions:FocusAction />
@@ -126,34 +124,5 @@
</Button>
</StackPanel>
</controls:DropShadowPanel>
<controls:DropShadowPanel
Margin="12"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
ShadowOpacity="0.5"
Visibility="{x:Bind ViewModel.HasExitedWithError, Mode=OneWay, Converter={StaticResource TrueToVisibleConverter}}"
Color="Black">
<StackPanel
Padding="6"
CornerRadius="4"
Orientation="Horizontal">
<StackPanel.Background>
<SolidColorBrush Color="{ThemeResource SystemAccentColor}" />
</StackPanel.Background>
<TextBlock
x:Uid="SessionDisconnected"
Margin="6,0,24,0"
VerticalAlignment="Center"
Text="Session disconnected" />
<Button
x:Uid="RestartSession"
Margin="0,0,6,0"
Command="{x:Bind ViewModel.ReconnectTabCommand, Mode=OneWay}"
Content="Restart"
IsEnabled="{x:Bind ViewModel.HasExitedWithError, Mode=OneWay}" />
<Button Command="{x:Bind ViewModel.CloseCommand, Mode=OneWay}" Content="{x:Bind Converter={StaticResource I18NConverter}, ConverterParameter=Close}" />
</StackPanel>
</controls:DropShadowPanel>
</Grid>
</UserControl>
+2 -18
View File
@@ -28,7 +28,6 @@ namespace FluentTerminal.App.Views
ViewModel.ThemeChanged += OnThemeChanged;
ViewModel.FindNextRequested += OnFindNextRequested;
ViewModel.FindPreviousRequested += OnFindPreviousRequested;
ViewModel.FontSizeChanged += OnFontSizeChanged;
InitializeComponent();
_terminalView = new XtermTerminalView();
TerminalContainer.Children.Add((UIElement)_terminalView);
@@ -55,7 +54,6 @@ namespace FluentTerminal.App.Views
ViewModel.ThemeChanged -= OnThemeChanged;
ViewModel.FindNextRequested -= OnFindNextRequested;
ViewModel.FindPreviousRequested -= OnFindPreviousRequested;
ViewModel.FontSizeChanged -= OnFontSizeChanged;
ViewModel = null;
}
@@ -109,14 +107,10 @@ namespace FluentTerminal.App.Views
await _terminalView.ChangeThemeAsync(e);
SetGridBackgroundTheme(e);
}
private async void OnFontSizeChanged(object sender, int e)
{
await _terminalView.ChangeFontSize(e);
}
private void SetGridBackgroundTheme(TerminalTheme terminalTheme)
{
var color = terminalTheme.Colors.Background;
var imageFile = terminalTheme.BackgroundImage;
Brush backgroundBrush;
@@ -138,15 +132,5 @@ namespace FluentTerminal.App.Views
TerminalContainer.Background = backgroundBrush;
}
private void SearchTextBox_GotFocus(object sender, RoutedEventArgs e)
{
ViewModel.SearchHasFocus = true;
}
private void SearchTextBox_LostFocus(object sender, RoutedEventArgs e)
{
ViewModel.SearchHasFocus = false;
}
}
}
@@ -118,7 +118,6 @@ namespace FluentTerminal.App.Views
public event EventHandler<object> OnOutput;
public event EventHandler<string> OnPaste;
public event EventHandler<string> OnSessionRestart;
public XtermTerminalView()
{
@@ -180,16 +179,6 @@ namespace FluentTerminal.App.Views
return ExecuteScriptAsync($"changeTheme('{serialized}')");
}
public Task ChangeFontSize(int fontSize)
{
if (_terminalClosed)
{
return Task.CompletedTask;
}
return ExecuteScriptAsync($"setFontSize({fontSize})");
}
public Task<string> SerializeXtermStateAsync()
{
if (_terminalClosed)
@@ -235,31 +224,7 @@ namespace FluentTerminal.App.Views
return Task.CompletedTask;
}
private const string OpenSSH = "OpenSSH";
public async Task ReconnectAsync()
{
if (ViewModel.ShellProfile.Location.Contains(OpenSSH))
{
OnSessionRestart?.Invoke(this, OpenSSH);
await Task.Delay(500).ConfigureAwait(false);
Terminal_OutputReceived(this, System.Text.Encoding.UTF8.GetBytes("\n\x1b[2EReconnecting current session...\n\x1b[E"));
}
else
{
// Fill full screen with new output to not allow erasing of available output on start of new shell
Terminal_OutputReceived(this, System.Text.Encoding.UTF8.GetBytes(new String('\n', _requestedSize.Rows + 1)));
}
if (true == await StartShellProcessAsync(_requestedSize).ConfigureAwait(false))
{
ViewModel.Terminal.Reconnect();
}
}
public async Task InitializeAsync(TerminalViewModel viewModel)
{
ViewModel = viewModel;
@@ -290,6 +255,12 @@ namespace FluentTerminal.App.Views
// Waiting for IxtermEventListener.OnInitialized() call to happen
await _tcsConnected.Task;
var sessionType =
ViewModel.ShellProfile.UseConPty &&
ViewModel.ApplicationView.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 7)
? SessionType.ConPty
: SessionType.WinPty;
lock (_resizeLock)
{
// Check to see if some resizing has happened meanwhile
@@ -303,8 +274,14 @@ namespace FluentTerminal.App.Views
}
}
if (false == await StartShellProcessAsync(size).ConfigureAwait(false))
var response = await ViewModel.Terminal.StartShellProcessAsync(ViewModel.ShellProfile, size, sessionType, ViewModel.XtermBufferState).ConfigureAwait(false);
if (!response.Success)
{
await Dispatcher.ExecuteAsync(async () =>
await ViewModel.DialogService.ShowMessageDialogAsync("Error", response.Error, DialogButton.OK))
.ConfigureAwait(false);
ViewModel.Terminal.ReportLauchFailed();
return;
}
@@ -585,25 +562,5 @@ namespace FluentTerminal.App.Views
}
public void Paste(string text) => OnPaste?.Invoke(this, text);
private async Task<bool> StartShellProcessAsync(TerminalSize size)
{
var sessionType = ViewModel.ShellProfile.UseConPty &&
ViewModel.ApplicationView.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 7)
? SessionType.ConPty
: SessionType.WinPty;
var response = await ViewModel.Terminal.StartShellProcessAsync(ViewModel.ShellProfile, size, sessionType, ViewModel.XtermBufferState).ConfigureAwait(false);
if (!response.Success)
{
await Dispatcher.ExecuteAsync(async () =>
await ViewModel.DialogService.ShowMessageDialogAsync("Error", response.Error, DialogButton.OK))
.ConfigureAwait(false);
ViewModel.Terminal.ReportLauchFailed();
return false;
}
return true;
}
}
}
+1196 -757
View File
File diff suppressed because it is too large. Load diff
+10 -10
View File
@@ -10,17 +10,17 @@
"author": "FS Apps",
"license": "GPL-3.0",
"devDependencies": {
"ts-loader": "^7.0.5",
"typescript": "^3.9.5",
"webpack": "^4.43.0",
"webpack-cli": "^3.3.12"
"ts-loader": "^6.0.2",
"typescript": "^3.5.1",
"webpack": "^4.29.6",
"webpack-cli": "^3.2.3"
},
"dependencies": {
"xterm": "^4.8.1",
"xterm-addon-fit": "^0.4.0",
"xterm-addon-search": "^0.7.0",
"xterm-addon-serialize": "^0.3.0",
"xterm-addon-unicode11": "^0.2.0",
"xterm-addon-web-links": "^0.4.0"
"xterm": "^4.4.0",
"xterm-addon-fit": "^0.3.0",
"xterm-addon-search": "^0.5.0",
"xterm-addon-serialize": "^0.1.2",
"xterm-addon-unicode11": "^0.1.1",
"xterm-addon-web-links": "^0.2.1"
}
}
+3 -58
View File
@@ -19,7 +19,6 @@ interface ExtendedWindow extends Window {
findNext(content: string, caseSensitive: boolean, wholeWord: boolean, regex: boolean): void;
findPrevious(content: string, caseSensitive: boolean, wholeWord: boolean, regex: boolean): void;
serializeTerminal() : void;
setFontSize(fontSize: number): void;
}
declare var window: ExtendedWindow;
@@ -30,8 +29,6 @@ let searchAddon: SearchAddon;
let serializeAddon: SerializeAddon;
let webLinksAddon: WebLinksAddon;
let unicode11Addon: Unicode11Addon;
let altGrPressed = false;
let filterOutOpenSSHOutput = false;
const terminalContainer = document.getElementById('terminal-container');
@@ -45,13 +42,6 @@ function DecodeSpecialChars(data: string) {
return replaceAll("&bsol;", "\\", data);
}
window.setFontSize = (fontSize: number) => {
if (fontSize > 0) {
term.setOption('fontSize', fontSize);
fitAddon.fit();
}
}
window.serializeTerminal = () => {
let serialized = serializeAddon.serialize();
return serialized;
@@ -111,46 +101,7 @@ window.createTerminal = (options, theme, keyBindings) => {
window.term = term;
function stringToUint8Array(param: string) {
var str = unescape(encodeURIComponent(param));
var charList = str.split('');
var output = [];
for (var i = 0; i < charList.length; i++) {
output.push(charList[i].charCodeAt(0));
}
return new Uint8Array(output);
}
function uint8ArrayToString(param: Uint8Array) {
var encodedString = String.fromCharCode.apply(null, param);
return decodeURIComponent(escape(encodedString));
}
window.terminalBridge.onsessionrestart = ((param: string) => {
if (filterOutOpenSSHOutput == false) {
filterOutOpenSSHOutput = true;
}
});
window.terminalBridge.onoutput = (data => {
if (filterOutOpenSSHOutput == true) {
var str = uint8ArrayToString(data);
var sessionStarted = str.search(/(\x1b\[H\x1b\[\?25h)|(\x1b\[2;1H\x1b\]0;OpenSSH SSH client)/u);
if (sessionStarted != -1) {
filterOutOpenSSHOutput = false;
}
// Filter out new line characters following by cursor movement CSIs X and C
str = replaceAll(/\n\x1b\[\d*X\x1b\[\d*C/u, "", str);
// Filter out J (clear screen) CSIs and H (set cursor position) CSIs
str = replaceAll(/\x1b\[\d*J/u, "", str);
// Filter out H (set cursor position) CSIs
str = replaceAll(/\x1b\[\d*;?\d*H/u, "", str);
data = stringToUint8Array(str);
}
term.writeUtf8(data);
});
@@ -184,7 +135,7 @@ window.createTerminal = (options, theme, keyBindings) => {
setPadding(options.padding);
let resizeTimeout: number;
let resizeTimeout: any;
window.onresize = function () {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(() => fitAddon.fit(), 500);
@@ -214,16 +165,9 @@ window.createTerminal = (options, theme, keyBindings) => {
});
term.attachCustomKeyEventHandler(function (e) {
if (e.altKey && e.type === "keydown" && e.location === 2) {
altGrPressed = true;
} else if (e.altKey && e.type === "keyup" && e.key === "Control") {
altGrPressed = false
}
if (e.type != "keydown" || altGrPressed) {
if (e.type != "keydown") {
return true;
}
for (var i = 0; i < window.keyBindings.length; i++) {
var keyBinding = window.keyBindings[i];
if (keyBinding.ctrl == e.ctrlKey
@@ -245,6 +189,7 @@ window.createTerminal = (options, theme, keyBindings) => {
return false;
}
e.preventDefault();
window.terminalBridge.invokeCommand(keyBinding.command);
}
+1 -5
View File
@@ -30,10 +30,6 @@
SwitchToTerm7,
SwitchToTerm8,
SwitchToTerm9,
DuplicateTab,
ReconnectTab,
IncreaseFontSize,
DecreaseFontSize,
ResetFontSize
DuplicateTab
}
}
+1 -2
View File
@@ -20,7 +20,6 @@
GetCommandPathRequest = 15,
PauseTerminalOutputRequest = 16,
PauseTerminalOutputResponse = 17,
QuitApplicationRequest = 18,
ReadTextFileRequest = 19
QuitApplicationRequest = 18
}
}
@@ -1,9 +0,0 @@
namespace FluentTerminal.Models.Requests
{
public class ReadTextFileRequest : IMessage
{
public byte Identifier => (byte)MessageIdentifiers.ReadTextFileRequest;
public string Path { get; set; }
}
}
@@ -1,7 +1,11 @@
namespace FluentTerminal.Models.Responses
{
public class CommonResponse : TerminalResponse
public class CommonResponse : IMessage
{
public override byte Identifier => (byte) MessageIdentifiers.CommonResponse;
public virtual byte Identifier => (byte) MessageIdentifiers.CommonResponse;
public bool Success { get; set; }
public string Error { get; set; }
}
}
@@ -1,8 +1,8 @@
namespace FluentTerminal.Models.Responses
{
public class CreateTerminalResponse : TerminalResponse
public class CreateTerminalResponse : TerminalResponse, IMessage
{
public override byte Identifier => (byte) MessageIdentifiers.CreateTerminalResponse;
public byte Identifier => (byte) MessageIdentifiers.CreateTerminalResponse;
public string Name { get; set; }
}
@@ -1,7 +1,7 @@
namespace FluentTerminal.Models.Responses
{
public class PauseTerminalOutputResponse : TerminalResponse
public class PauseTerminalOutputResponse : TerminalResponse, IMessage
{
public override byte Identifier => (byte) MessageIdentifiers.PauseTerminalOutputResponse;
public byte Identifier => (byte) MessageIdentifiers.PauseTerminalOutputResponse;
}
}
@@ -1,8 +1,11 @@
namespace FluentTerminal.Models.Responses
using System;
using System.Collections.Generic;
using System.Text;
namespace FluentTerminal.Models.Responses
{
public abstract class TerminalResponse : IMessage
public class TerminalResponse
{
public abstract byte Identifier { get; }
public bool Success { get; set; }
public string Error { get; set; }
}
+1 -3
View File
@@ -1,6 +1,4 @@
using System.ComponentModel;
namespace FluentTerminal.Models
namespace FluentTerminal.Models
{
public class TabTheme
{
@@ -71,43 +71,43 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<AppxBundle>Always</AppxBundle>
<DefaultLanguage>en-US</DefaultLanguage>
<DefaultLanguage>en</DefaultLanguage>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
<AppxBundle>Always</AppxBundle>
<DefaultLanguage>en-US</DefaultLanguage>
<DefaultLanguage>en</DefaultLanguage>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<AppxBundle>Always</AppxBundle>
<DefaultLanguage>en-US</DefaultLanguage>
<DefaultLanguage>en</DefaultLanguage>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<AppxBundle>Always</AppxBundle>
<DefaultLanguage>en-US</DefaultLanguage>
<DefaultLanguage>en</DefaultLanguage>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<AppxBundle>Always</AppxBundle>
<DefaultLanguage>en-US</DefaultLanguage>
<DefaultLanguage>en</DefaultLanguage>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
<AppxBundle>Always</AppxBundle>
<DefaultLanguage>en-US</DefaultLanguage>
<DefaultLanguage>en</DefaultLanguage>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<AppxBundle>Always</AppxBundle>
<DefaultLanguage>en-US</DefaultLanguage>
<DefaultLanguage>en</DefaultLanguage>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
<AppxBundle>Always</AppxBundle>
<DefaultLanguage>en-US</DefaultLanguage>
<DefaultLanguage>en</DefaultLanguage>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
<AppxBundle>Always</AppxBundle>
<DefaultLanguage>en-US</DefaultLanguage>
<DefaultLanguage>en</DefaultLanguage>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
<AppxBundle>Always</AppxBundle>
<DefaultLanguage>en-US</DefaultLanguage>
<DefaultLanguage>en</DefaultLanguage>
</PropertyGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
+1 -1
View File
@@ -8,7 +8,7 @@
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
IgnorableNamespaces="uap rescap desktop">
<Identity Name="53621FSApps.FluentTerminal" Publisher="CN=BDC72197-B634-438A-B863-16DCB7D90C85" Version="0.7.2.0" />
<Identity Name="53621FSApps.FluentTerminal" Publisher="CN=BDC72197-B634-438A-B863-16DCB7D90C85" Version="0.6.1.0" />
<Properties>
<DisplayName>Fluent Terminal</DisplayName>
+1 -1
View File
@@ -1,3 +1,3 @@
<default>
<qualifier name="Language" value="ar;ar-IQ;az-Latn;de;en-US;eo;es;fa;fr;he;hi;hr;hu;id;it;ja;ko;nl;pl;pt-BR;ro;ru;sl;tr;ug-Arab;uk;zh-Hans;zh-Hant" />
<qualifier name="Language" value="ar;ar-IQ;az;de;en;es;fr;he;hi;id;it;ja;ko;nl;pl;pt-BR;ro;ru;uk;zh-Hans;zh-Hant" />
</default>
@@ -24,6 +24,5 @@ namespace FluentTerminal.RuntimeComponent.Interfaces
event EventHandler<object> OnOutput;
event EventHandler<string> OnPaste;
event EventHandler<string> OnSessionRestart;
}
}
@@ -17,7 +17,6 @@ namespace FluentTerminal.RuntimeComponent.WebAllowedObjects
_terminalEventListener = terminalEventListener;
_terminalEventListener.OnOutput += OnOutput;
_terminalEventListener.OnPaste += OnPaste;
_terminalEventListener.OnSessionRestart += OnSessionRestart;
}
private void OnPaste(object sender, string e)
@@ -30,14 +29,8 @@ namespace FluentTerminal.RuntimeComponent.WebAllowedObjects
Task.Factory.StartNew(() => Output?.Invoke(this, e));
}
private void OnSessionRestart(object sender, string e)
{
Task.Factory.StartNew(() => SessionRestart?.Invoke(this, e));
}
public event EventHandler<object> Output;
public event EventHandler<string> Paste;
public event EventHandler<string> SessionRestart;
public void InputReceived(string message)
{
@@ -53,9 +53,6 @@ namespace FluentTerminal.SystemTray
{
while (true)
{
// Allow CPU to jump between TerminalSessions' ReadingLoop Tasks
await Task.Delay(1).ConfigureAwait(false);
bool paused;
lock (_lock)
@@ -95,7 +95,7 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Store|x64'">
<OutputPath>bin\x64\Store\</OutputPath>
<DefineConstants>TRACE;X64;STORE</DefineConstants>
<DefineConstants>TRACE;X64</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
@@ -203,7 +203,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Autofac">
<Version>5.2.0</Version>
<Version>5.1.2</Version>
</PackageReference>
<PackageReference Include="GlobalHotKey">
<Version>1.1.0</Version>
@@ -134,9 +134,6 @@ namespace FluentTerminal.SystemTray.Services
case MessageIdentifiers.QuitApplicationRequest:
HandleQuitApplicationRequest();
return;
case MessageIdentifiers.ReadTextFileRequest:
await HandleReadTextFileRequestAsync(args).ConfigureAwait(false);
return;
default:
Logger.Instance.Error("Received unknown message type: {messageType}", messageType);
return;
@@ -217,31 +214,6 @@ namespace FluentTerminal.SystemTray.Services
deferral.Complete();
}
private async Task HandleReadTextFileRequestAsync(AppServiceRequestReceivedEventArgs args)
{
var deferreal = args.GetDeferral();
var deferral = args.GetDeferral();
var messageContent = (string)args.Request.Message[MessageKeys.Content];
var request = JsonConvert.DeserializeObject<ReadTextFileRequest>(messageContent);
var response = new StringValueResponse();
try
{
var content = Utilities.ReadFile(request.Path);
response.Success = true;
response.Value = content;
}
catch (Exception e)
{
response.Success = false;
response.Error = e.Message;
}
await args.Request.SendResponseAsync(CreateMessage(response));
deferral.Complete();
}
private async Task HandleGetSshConfigFolderRequestAsync(AppServiceRequestReceivedEventArgs args)
{
var deferral = args.GetDeferral();
@@ -34,7 +34,7 @@ namespace FluentTerminal.SystemTray.Services.ConPty
public void Start(CreateTerminalRequest request, TerminalsManager terminalsManager)
{
_enableBuffer = false; // request.Profile.UseBuffer;
_enableBuffer = request.Profile.UseBuffer;
_reader?.Dispose();
_reader = null;
@@ -91,11 +91,6 @@ namespace FluentTerminal.SystemTray.Services.ConPty
_reader?.SetPaused(value);
}
~ConPtySession()
{
Dispose(false);
}
#region IDisposable Support
private bool _disposed;
@@ -118,7 +113,6 @@ namespace FluentTerminal.SystemTray.Services.ConPty
public void Dispose()
{
_terminal.Exited -= _terminal_Exited;
_terminal.OutputReady -= _terminal_OutputReady;
Dispose(true);
}
@@ -42,19 +42,10 @@ namespace FluentTerminal.SystemTray.Services.ConPty
ResizePseudoConsole(Handle, new COORD { X = (short)width, Y = (short)height });
}
private bool alreadyDisposed = false;
public void Dispose()
{
if (alreadyDisposed)
{
return;
}
ClosePseudoConsole(Handle);
GC.SuppressFinalize(this);
alreadyDisposed = true;
}
}
}
@@ -175,12 +175,9 @@ namespace FluentTerminal.SystemTray.Services.ConPty
if (disposeManaged)
{
ConsoleOutStream.Dispose();
// Dispose pseudo console before _consoleInputWriter to avoid
// hanging on call of ClosePseudoConsole
_pseudoConsole?.Dispose();
_consoleInputWriter?.Dispose();
_process?.Dispose();
_pseudoConsole?.Dispose();
_outputPipe?.Dispose();
_inputPipe?.Dispose();
}
@@ -22,7 +22,7 @@ namespace FluentTerminal.SystemTray.Services.WinPty
public void Start(CreateTerminalRequest request, TerminalsManager terminalsManager)
{
_enableBuffer = false; // request.Profile.UseBuffer;
_enableBuffer = request.Profile.UseBuffer;
Id = request.Id;
_terminalsManager = terminalsManager;
@@ -39,7 +39,6 @@ namespace FluentTerminal.SystemTray
private void Exit(object sender, EventArgs e)
{
_notifyIcon.Dispose(); // cleans up the tray icon
Application.Exit();
}
-5
View File
@@ -536,11 +536,6 @@ namespace FluentTerminal.SystemTray
}
}
internal static string ReadFile(string path)
{
return File.ReadAllText(path);
}
private static bool? MuteProcess(int id, bool mute, bool force = false)
{
bool? isAudioSessionMuted = VolumeControl.GetAudioSessionMute(id);
+643
View File
@@ -0,0 +1,643 @@
#
# Install.ps1 is a PowerShell script designed to sideload the Fluent Terminal
# app. To run this script from Explorer, right-click on its icon and choose
# "Run with PowerShell".
#
# It is heavily based on the Add-AppxDevPackage.ps1 script generated by
# Visual Studio. Visual Studio supplies this script in the folder generated
# with its "Prepare Package" command. The same folder will also contain the
# app package (a .appx file), the signing certificate (a .cer file), and a
# "Dependencies" subfolder containing all the framework packages used by the
# app.
#
# This script simplifies installing these packages by automating the
# following functions:
# 1. Find the app package and signing certificate in the script directory
# 2. Prompt the user to enable sideloading apps and to install the
# certificate if necessary
# 3. Find dependency packages that are applicable to the operating system's
# CPU architecture
# 4. Install the package along with all applicable dependencies
#
# All command line parameters are reserved for use internally by the script.
# Users should launch this script from Explorer.
#
# .Link
# http://go.microsoft.com/fwlink/?LinkId=243053
param(
[switch]$Force = $false,
[switch]$ForceContextMenu = $false,
[switch]$GetDeveloperLicense = $false,
[string]$CertificatePath = $null
)
$ErrorActionPreference = "Stop"
# UI Strings
class UiStrings
{
static [string] $PromptYesString = "&Yes"
static [string] $PromptNoString = "&No"
static [string] $BundleFound = "Found bundle: {0}"
static [string] $PackageFound = "Found package: {0}"
static [string] $CertificateFound = "Found certificate: {0}"
static [string] $DependenciesFound = "Found dependency package(s):"
static [string] $GettingDeveloperLicense = "Please select `"Sideload apps`" or `"Developer mode`" in the following window."
static [string] $InstallingCertificate = "Installing certificate..."
static [string] $InstallingPackage = "`nInstalling app..."
static [string] $AcquireLicenseSuccessful = "Sideloading was successfully enabled."
static [string] $InstallCertificateSuccessful = "The certificate was successfully installed."
static [string] $PromptContextMenuInstall = "Fluent Terminal can be integrated into the Windows Explorer context menu, allowing you to quickly open the terminal to a directory.`n`nDo you want to enable this integration?`n`n"
static [string] $Success = "`nSuccess: Your app was successfully installed."
static [string] $WarningInstallCert = "`nYou are about to install a digital certificate to your computer's Trusted People certificate store. Doing so carries serious security risk and should only be done if you trust the originator of this digital certificate.`n`nWhen you are done using this app, you should manually remove the associated digital certificate. Instructions for doing so can be found here: http://go.microsoft.com/fwlink/?LinkId=243053`n`nAre you sure you wish to continue?`n`n"
static [string] $ElevateActions = "`nBefore installing this app, you need to do the following:"
static [string] $ElevateActionDevLicense = "`t- Enable sideloading apps"
static [string] $ElevateActionCertificate = "`t- Install the signing certificate"
static [string] $ElevateActionsContinue = "Administrator credentials are required to continue. Please accept the UAC prompt and provide your administrator password if asked."
static [string] $ErrorForceElevate = "You must provide administrator credentials to proceed. Please run this script without the -Force parameter or from an elevated PowerShell window."
static [string] $ErrorForceDeveloperLicense = "Enabling sideloading requires user interaction. Please rerun the script without the -Force parameter."
static [string] $ErrorLaunchAdminFailed = "Error: Could not start a new process as administrator."
static [string] $ErrorNoScriptPath = "Error: You must launch this script from a file."
static [string] $ErrorNoPackageFound = "Error: No package or bundle found in the script directory. Please make sure the package or bundle you want to install is placed in the same directory as this script."
static [string] $ErrorManyPackagesFound = "Error: More than one package or bundle found in the script directory. Please make sure only the package or bundle you want to install is placed in the same directory as this script."
static [string] $ErrorPackageUnsigned = "Error: The package or bundle is not digitally signed or its signature is corrupted."
static [string] $ErrorNoCertificateFound = "Error: No certificate found in the script directory. Please make sure the certificate used to sign the package or bundle you are installing is placed in the same directory as this script."
static [string] $ErrorManyCertificatesFound = "Error: More than one certificate found in the script directory. Please make sure only the certificate used to sign the package or bundle you are installing is placed in the same directory as this script."
static [string] $ErrorBadCertificate = "Error: The file `"{0}`" is not a valid digital certificate. CertUtil returned with error code {1}."
static [string] $ErrorExpiredCertificate = "Error: The developer certificate `"{0}`" has expired. One possible cause is the system clock isn't set to the correct date and time. If the system settings are correct, contact the app owner to re-create a package or bundle with a valid certificate."
static [string] $ErrorCertificateMismatch = "Error: The certificate does not match the one used to sign the package or bundle."
static [string] $ErrorCertIsCA = "Error: The certificate can't be a certificate authority."
static [string] $ErrorBannedKeyUsage = "Error: The certificate can't have the following key usage: {0}. Key usage must be unspecified or equal to `"DigitalSignature`"."
static [string] $ErrorBannedEKU = "Error: The certificate can't have the following extended key usage: {0}. Only the Code Signing and Lifetime Signing EKUs are allowed."
static [string] $ErrorNoBasicConstraints = "Error: The certificate is missing the basic constraints extension."
static [string] $ErrorNoCodeSigningEku = "Error: The certificate is missing the extended key usage for Code Signing."
static [string] $ErrorInstallCertificateCancelled = "Error: Installation of the certificate was cancelled."
static [string] $ErrorCertUtilInstallFailed = "Error: Could not install the certificate. CertUtil returned with error code {0}."
static [string] $ErrorGetDeveloperLicenseFailed = "Error: Sideloading is not enabled."
static [string] $ErrorInstallCertificateFailed = "Error: Could not install the certificate. Status: {0}. For more information, see http://go.microsoft.com/fwlink/?LinkID=252740."
static [string] $ErrorAddPackageFailed = "Error: Could not install the app."
static [string] $ErrorAddPackageFailedWithCert = "Error: Could not install the app. To ensure security, please consider uninstalling the signing certificate until you can install the app. Instructions for doing so can be found here:`nhttp://go.microsoft.com/fwlink/?LinkId=243053}"
}
$ScriptPath = $null
try
{
$ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path
$ScriptDir = Split-Path -Parent $ScriptPath
}
catch {}
if (!$ScriptPath)
{
PrintMessageAndExit ([UiStrings]::ErrorNoScriptPath) $ErrorCodes.NoScriptPath
}
$ErrorCodes = Data {
ConvertFrom-StringData @'
Success = 0
NoScriptPath = 1
NoPackageFound = 2
ManyPackagesFound = 3
NoCertificateFound = 4
ManyCertificatesFound = 5
BadCertificate = 6
PackageUnsigned = 7
CertificateMismatch = 8
ForceElevate = 9
LaunchAdminFailed = 10
GetDeveloperLicenseFailed = 11
InstallCertificateFailed = 12
AddPackageFailed = 13
ForceDeveloperLicense = 14
CertUtilInstallFailed = 17
CertIsCA = 18
BannedEKU = 19
NoBasicConstraints = 20
NoCodeSigningEku = 21
InstallCertificateCancelled = 22
BannedKeyUsage = 23
ExpiredCertificate = 24
'@
}
function PrintMessageAndExit($ErrorMessage, $ReturnCode)
{
Write-Host $ErrorMessage
if (!$Force)
{
Pause
}
exit $ReturnCode
}
#
# Warns the user about installing certificates, and presents a Yes/No prompt
# to confirm the action. The default is set to No.
#
function ConfirmCertificateInstall
{
$Answer = $host.UI.PromptForChoice(
"",
([UiStrings]::WarningInstallCert),
[System.Management.Automation.Host.ChoiceDescription[]]@(([UiStrings]::PromptYesString), ([UiStrings]::PromptNoString)),
1)
return $Answer -eq 0
}
#
# Asks the user whether they want to install context menu integration for Fluent Terminal,
# and presents a Yes/No prompt to confirm the action. The default is set to No.
#
function ConfirmContextMenuInstall
{
$Answer = $host.UI.PromptForChoice(
"",
([UiStrings]::PromptContextMenuInstall),
[System.Management.Automation.Host.ChoiceDescription[]]@(([UiStrings]::PromptYesString), ([UiStrings]::PromptNoString)),
1)
return $Answer -eq 0
}
#
# Validates whether a file is a valid certificate using CertUtil.
# This needs to be done before calling Get-PfxCertificate on the file, otherwise
# the user will get a cryptic "Password: " prompt for invalid certs.
#
function ValidateCertificateFormat($FilePath)
{
# certutil -verify prints a lot of text that we don't need, so it's redirected to $null here
certutil.exe -verify $FilePath > $null
if ($LastExitCode -lt 0)
{
PrintMessageAndExit (([UiStrings]::ErrorBadCertificate) -f $FilePath, $LastExitCode) $ErrorCodes.BadCertificate
}
# Check if certificate is expired
$cert = Get-PfxCertificate $FilePath
if (($cert.NotBefore -gt (Get-Date)) -or ($cert.NotAfter -lt (Get-Date)))
{
PrintMessageAndExit (([UiStrings]::ErrorExpiredCertificate) -f $FilePath) $ErrorCodes.ExpiredCertificate
}
}
#
# Verify that the developer certificate meets the following restrictions:
# - The certificate must contain a Basic Constraints extension, and its
# Certificate Authority (CA) property must be false.
# - The certificate's Key Usage extension must be either absent, or set to
# only DigitalSignature.
# - The certificate must contain an Extended Key Usage (EKU) extension with
# Code Signing usage.
# - The certificate must NOT contain any other EKU except Code Signing and
# Lifetime Signing.
#
# These restrictions are enforced to decrease security risks that arise from
# trusting digital certificates.
#
function CheckCertificateRestrictions
{
Set-Variable -Name BasicConstraintsExtensionOid -Value "2.5.29.19" -Option Constant
Set-Variable -Name KeyUsageExtensionOid -Value "2.5.29.15" -Option Constant
Set-Variable -Name EkuExtensionOid -Value "2.5.29.37" -Option Constant
Set-Variable -Name CodeSigningEkuOid -Value "1.3.6.1.5.5.7.3.3" -Option Constant
Set-Variable -Name LifetimeSigningEkuOid -Value "1.3.6.1.4.1.311.10.3.13" -Option Constant
$CertificateExtensions = (Get-PfxCertificate $CertificatePath).Extensions
$HasBasicConstraints = $false
$HasCodeSigningEku = $false
foreach ($Extension in $CertificateExtensions)
{
# Certificate must contain the Basic Constraints extension
if ($Extension.oid.value -eq $BasicConstraintsExtensionOid)
{
# CA property must be false
if ($Extension.CertificateAuthority)
{
PrintMessageAndExit ([UiStrings]::ErrorCertIsCA) $ErrorCodes.CertIsCA
}
$HasBasicConstraints = $true
}
# If key usage is present, it must be set to digital signature
elseif ($Extension.oid.value -eq $KeyUsageExtensionOid)
{
if ($Extension.KeyUsages -ne "DigitalSignature")
{
PrintMessageAndExit (([UiStrings]::ErrorBannedKeyUsage) -f $Extension.KeyUsages) $ErrorCodes.BannedKeyUsage
}
}
elseif ($Extension.oid.value -eq $EkuExtensionOid)
{
# Certificate must contain the Code Signing EKU
$EKUs = $Extension.EnhancedKeyUsages.Value
if ($EKUs -contains $CodeSigningEkuOid)
{
$HasCodeSigningEKU = $True
}
# EKUs other than code signing and lifetime signing are not allowed
foreach ($EKU in $EKUs)
{
if ($EKU -ne $CodeSigningEkuOid -and $EKU -ne $LifetimeSigningEkuOid)
{
PrintMessageAndExit (([UiStrings]::ErrorBannedEKU) -f $EKU) $ErrorCodes.BannedEKU
}
}
}
}
if (!$HasBasicConstraints)
{
PrintMessageAndExit ([UiStrings]::ErrorNoBasicConstraints) $ErrorCodes.NoBasicConstraints
}
if (!$HasCodeSigningEKU)
{
PrintMessageAndExit ([UiStrings]::ErrorNoCodeSigningEku) $ErrorCodes.NoCodeSigningEku
}
}
#
# Performs operations that require administrative privileges:
# - Prompt the user to obtain a developer license
# - Install the developer certificate (if -Force is not specified, also prompts the user to confirm)
#
function DoElevatedOperations
{
if ($GetDeveloperLicense)
{
if ($Force)
{
PrintMessageAndExit ([UiStrings]::ErrorForceDeveloperLicense) $ErrorCodes.ForceDeveloperLicense
}
Write-Host ([UiStrings]::GettingDeveloperLicense)
Pause
try
{
Show-WindowsDeveloperLicenseRegistration
Pause
}
catch
{
$Error[0] # Dump details about the last error
PrintMessageAndExit ([UiStrings]::ErrorGetDeveloperLicenseFailed) $ErrorCodes.GetDeveloperLicenseFailed
}
}
if ($CertificatePath)
{
Write-Host ([UiStrings]::InstallingCertificate)
# Make sure certificate format is valid and usage constraints are followed
ValidateCertificateFormat $CertificatePath
CheckCertificateRestrictions
# If -Force is not specified, warn the user and get consent
if ($Force -or (ConfirmCertificateInstall))
{
# Add cert to store
certutil.exe -addstore TrustedPeople $CertificatePath
if ($LastExitCode -lt 0)
{
PrintMessageAndExit (([UiStrings]::ErrorCertUtilInstallFailed) -f $LastExitCode) $ErrorCodes.CertUtilInstallFailed
}
}
else
{
PrintMessageAndExit ([UiStrings]::ErrorInstallCertificateCancelled) $ErrorCodes.InstallCertificateCancelled
}
}
}
#
# Checks whether the machine has app sideloading enabled.
#
function CheckIfNeedToEnableSideloading
{
$RegistryPath = "hklm:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock"
$ValueName = "AllowAllTrustedApps"
$Result = $true
if (Test-Path $RegistryPath)
{
$SideloadingEnabledProperty = (Get-ItemProperty -Path $RegistryPath -Name $ValueName -ErrorAction SilentlyContinue)
if ($null -ne $SideloadingEnabledProperty -and $SideloadingEnabledProperty.$ValueName -eq 1)
{
$Result = $false
}
}
return $Result
}
#
# Launches an elevated process running the current script to perform tasks
# that require administrative privileges. This function waits until the
# elevated process terminates, and checks whether those tasks were successful.
#
function LaunchElevated
{
# Set up command line arguments to the elevated process
$RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '"'
if ($Force)
{
$RelaunchArgs += ' -Force'
}
if ($NeedDeveloperLicense)
{
$RelaunchArgs += ' -GetDeveloperLicense'
}
if ($NeedInstallCertificate)
{
$RelaunchArgs += ' -CertificatePath "' + $DeveloperCertificatePath.FullName + '"'
}
# Launch the process and wait for it to finish
try
{
$AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru
}
catch
{
$Error[0] # Dump details about the last error
PrintMessageAndExit ([UiStrings]::ErrorLaunchAdminFailed) $ErrorCodes.LaunchAdminFailed
}
while (!($AdminProcess.HasExited))
{
Start-Sleep -Seconds 2
}
# Check if all elevated operations were successful
if ($NeedDeveloperLicense)
{
if (CheckIfNeedToEnableSideloading)
{
PrintMessageAndExit ([UiStrings]::ErrorGetDeveloperLicenseFailed) $ErrorCodes.GetDeveloperLicenseFailed
}
else
{
Write-Host ([UiStrings]::AcquireLicenseSuccessful)
}
}
if ($NeedInstallCertificate)
{
$Signature = Get-AuthenticodeSignature $DeveloperPackagePath -Verbose
if ($Signature.Status -ne "Valid")
{
PrintMessageAndExit (([UiStrings]::ErrorInstallCertificateFailed) -f $Signature.Status) $ErrorCodes.InstallCertificateFailed
}
else
{
Write-Host ([UiStrings]::InstallCertificateSuccessful)
}
}
}
#
# Finds all applicable dependency packages according to OS architecture, and
# installs the developer package with its dependencies. The expected layout
# of dependencies is:
#
# <current dir>
# \Dependencies
# <Architecture neutral dependencies>.appx
# \x86
# <x86 dependencies>.appx
# \x64
# <x64 dependencies>.appx
# \arm
# <arm dependencies>.appx
#
function InstallPackageWithDependencies
{
$DependencyPackagesDir = (Join-Path $ScriptDir "Dependencies")
$DependencyPackages = @()
if (Test-Path $DependencyPackagesDir)
{
# Get architecture-neutral dependencies
$DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "*.appx") | Where-Object { $_.Mode -NotMatch "d" }
# Get architecture-specific dependencies
if (($Env:Processor_Architecture -eq "x86" -or $Env:Processor_Architecture -eq "amd64") -and (Test-Path (Join-Path $DependencyPackagesDir "x86")))
{
$DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "x86\*.appx") | Where-Object { $_.Mode -NotMatch "d" }
}
if (($Env:Processor_Architecture -eq "amd64") -and (Test-Path (Join-Path $DependencyPackagesDir "x64")))
{
$DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "x64\*.appx") | Where-Object { $_.Mode -NotMatch "d" }
}
if (($Env:Processor_Architecture -eq "arm") -and (Test-Path (Join-Path $DependencyPackagesDir "arm")))
{
$DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "arm\*.appx") | Where-Object { $_.Mode -NotMatch "d" }
}
}
Write-Host ([UiStrings]::InstallingPackage)
$AddPackageSucceeded = $False
try
{
if ($DependencyPackages.FullName.Count -gt 0)
{
Write-Host ([UiStrings]::DependenciesFound)
$DependencyPackages.FullName
Add-AppxPackage -Path $DeveloperPackagePath.FullName -DependencyPath $DependencyPackages.FullName -ForceApplicationShutdown -ForceUpdateFromAnyVersion
}
else
{
Add-AppxPackage -Path $DeveloperPackagePath.FullName -ForceApplicationShutdown -ForceUpdateFromAnyVersion
}
$AddPackageSucceeded = $?
}
catch
{
$Error[0] # Dump details about the last error
}
if (!$AddPackageSucceeded)
{
if ($NeedInstallCertificate)
{
PrintMessageAndExit ([UiStrings]::ErrorAddPackageFailedWithCert) $ErrorCodes.AddPackageFailed
}
else
{
PrintMessageAndExit ([UiStrings]::ErrorAddPackageFailed) $ErrorCodes.AddPackageFailed
}
}
}
#
# Adds a regkey with the specified value, creating any missing keys as needed.
#
function ForceAddRegKeyValue($RegistryPath, $Name, $Type, $Value)
{
if (!(Test-Path $RegistryPath))
{
New-Item -Path $RegistryPath -Force | Out-Null
}
New-ItemProperty -Path $RegistryPath -Name $Name -PropertyType $Type -Value $Value -Force | Out-Null
}
#
# Adds the needed regkeys to enable Explorer context menu integration.
#
function InstallContextMenuIntegration
{
ForceAddRegKeyValue `
-RegistryPath "hkcu:\Software\Classes\Directory\shell\Open Fluent Terminal here\command"`
-Name "(Default)"`
-Type "ExpandString"`
-Value "`"%LOCALAPPDATA%\Microsoft\WindowsApps\flute.exe`" new `"%1`""
ForceAddRegKeyValue `
-RegistryPath "hkcu:\Software\Classes\Directory\Background\shell\Open Fluent Terminal here\command"`
-Name "(Default)"`
-Type "ExpandString"`
-Value "`"%LOCALAPPDATA%\Microsoft\WindowsApps\flute.exe`" new `"%V`""
ForceAddRegKeyValue `
-RegistryPath "hkcu:\Software\Classes\Directory\LibraryFolder\shell\Open Fluent Terminal here\command"`
-Name "(Default)"`
-Type "ExpandString"`
-Value "`"%LOCALAPPDATA%\Microsoft\WindowsApps\flute.exe`" new `"%V`""
}
#
# Main script logic when the user launches the script without parameters.
#
function DoStandardOperations
{
# List all .appxbundle files in the script directory
$BundlePath = Get-ChildItem (Join-Path $ScriptDir "*.appxbundle") | Where-Object { $_.Mode -NotMatch "d" }
$BundleCount = ($BundlePath | Measure-Object).Count
# There must be exactly one bundle
if ($BundleCount -lt 1)
{
PrintMessageAndExit ([UiStrings]::ErrorNoPackageFound) $ErrorCodes.NoPackageFound
}
elseif ($BundleCount -gt 1)
{
PrintMessageAndExit ([UiStrings]::ErrorManyPackagesFound) $ErrorCodes.ManyPackagesFound
}
# First attempt to install a bundle.
if ($BundleCount -eq 1)
{
$DeveloperPackagePath = $BundlePath
Write-Host (([UiStrings]::BundleFound) -f $DeveloperPackagePath.FullName)
}
# The package must be signed
$PackageSignature = Get-AuthenticodeSignature $DeveloperPackagePath
$PackageCertificate = $PackageSignature.SignerCertificate
if (!$PackageCertificate)
{
PrintMessageAndExit ([UiStrings]::ErrorPackageUnsigned) $ErrorCodes.PackageUnsigned
}
# Test if the package signature is trusted. If not, the corresponding certificate
# needs to be present in the current directory and needs to be installed.
$NeedInstallCertificate = ($PackageSignature.Status -ne "Valid")
if ($NeedInstallCertificate)
{
# List all .cer files in the script directory
$DeveloperCertificatePath = Get-ChildItem (Join-Path $ScriptDir "*.cer") | Where-Object { $_.Mode -NotMatch "d" }
$DeveloperCertificateCount = ($DeveloperCertificatePath | Measure-Object).Count
# There must be exactly 1 certificate
if ($DeveloperCertificateCount -lt 1)
{
PrintMessageAndExit ([UiStrings]::ErrorNoCertificateFound) $ErrorCodes.NoCertificateFound
}
elseif ($DeveloperCertificateCount -gt 1)
{
PrintMessageAndExit ([UiStrings]::ErrorManyCertificatesFound) $ErrorCodes.ManyCertificatesFound
}
Write-Host (([UiStrings]::CertificateFound) -f $DeveloperCertificatePath.FullName)
# The .cer file must have the format of a valid certificate
ValidateCertificateFormat $DeveloperCertificatePath
# The package signature must match the certificate file
if ($PackageCertificate -ne (Get-PfxCertificate $DeveloperCertificatePath))
{
PrintMessageAndExit ([UiStrings]::ErrorCertificateMismatch) $ErrorCodes.CertificateMismatch
}
}
$NeedDeveloperLicense = CheckIfNeedToEnableSideloading
# Relaunch the script elevated with the necessary parameters if needed
if ($NeedDeveloperLicense -or $NeedInstallCertificate)
{
Write-Host ([UiStrings]::ElevateActions)
if ($NeedDeveloperLicense)
{
Write-Host ([UiStrings]::ElevateActionDevLicense)
}
if ($NeedInstallCertificate)
{
Write-Host ([UiStrings]::ElevateActionCertificate)
}
$IsAlreadyElevated = ([Security.Principal.WindowsIdentity]::GetCurrent().Groups.Value -contains "S-1-5-32-544")
if ($IsAlreadyElevated)
{
if ($Force -and $NeedDeveloperLicense)
{
PrintMessageAndExit ([UiStrings]::ErrorForceDeveloperLicense) $ErrorCodes.ForceDeveloperLicense
}
if ($Force -and $NeedInstallCertificate)
{
Write-Warning ([UiStrings]::WarningInstallCert)
}
}
else
{
if ($Force)
{
PrintMessageAndExit ([UiStrings]::ErrorForceElevate) $ErrorCodes.ForceElevate
}
else
{
Write-Host ([UiStrings]::ElevateActionsContinue)
Pause
}
}
LaunchElevated
}
InstallPackageWithDependencies
if ($ForceContextMenu -or (ConfirmContextMenuInstall))
{
InstallContextMenuIntegration
}
}
#
# Main script entry point
#
if ($GetDeveloperLicense -or $CertificatePath)
{
DoElevatedOperations
}
else
{
DoStandardOperations
PrintMessageAndExit ([UiStrings]::Success) $ErrorCodes.Success
}
+38 -25
View File
@@ -12,9 +12,6 @@
A Terminal Emulator based on UWP and web technologies.
<a href='//www.microsoft.com/store/apps/9p2krlmfxf9t?cid=storebadge&ocid=badge'><img src='store-badge.png' alt='Get it from Microsoft' width="284px" height="104px" /></a>
## Features
- Terminal for PowerShell, CMD, WSL or custom shells
@@ -31,49 +28,48 @@ A Terminal Emulator based on UWP and web technologies.
## Screenshots
![Terminal window](Screenshots/terminal.png)
![Settings window](Screenshots/settings.png)
![Terminal window](Screenshots/terminal.jpg)
![Settings window](Screenshots/settings.jpg)
## Languages
- Arabic
- Arabic (Iraq)
- Azerbaijani
- Chinese (Simplified)
- Chinese (Traditional)
- Dutch
- English
- French
- German
- Hebrew
- Spanish
- French
- Simplified Chinese
- Hindi
- Indonesian
- Italian
- Japanese
- Korean
- Dutch
- Polish
- Portuguese (Brazilian)
- Romanian
- Russian
- Spanish
- Ukrainian
- Russians
- Hebrew
Sign up to [POEditor](https://poeditor.com/join/project/TfKNIt826z) to help with existing translations or add a new language
## Up Next
- ~~Launch shell profile with a custom defined keybinding~~
- Copy & Paste options
- Improved tabs
- Split screen support
## How to install (as an end-user)
### Prerequisite
- You need to update to Fall Creators Update or later.
### Microsoft Store
- Search for Fluent Terminal in the Microsoft Store App or click [here](https://www.microsoft.com/store/apps/9p2krlmfxf9t)
### Chocolatey package manager installation
- Install [Chocolatey](https://chocolatey.org/)
- From an elevated/admin shell, execute `choco install fluent-terminal`
### Scoop package manager installation
- [Enable sideloading apps](https://www.windowscentral.com/how-enable-windows-10-sideload-apps-outside-store)
- Alternatively, [enable developer mode](https://docs.microsoft.com/en-US/windows/uwp/get-started/enable-your-device-for-development) if you plan to do UWP app development. **For most users that do not intend to do UWP app development, developer mode will not be necessary.**
- Install Scoop
- Install 7zip and git (to add buckets): `scoop install 7zip git`
- From an elevated/admin shell, execute
@@ -82,10 +78,27 @@ Sign up to [POEditor](https://poeditor.com/join/project/TfKNIt826z) to help with
scoop install fluent-terminal-np
```
### Manual
### Bundled install script
- Download and extract the latest [release](https://github.com/felixse/FluentTerminal/releases).
- Double click the *.appxbundle file.
- If not already present, download [`Install.ps1`](Install.ps1) to the extracted directory.
- Right-click on `Install.ps1`, and choose "Run with Powershell".
- The installer script will walk you through the rest of the process.
### Manual install
- Download the latest [release](https://github.com/felixse/FluentTerminal/releases)
- [Enable sideloading apps](https://www.windowscentral.com/how-enable-windows-10-sideload-apps-outside-store)
- Alternatively, [enable developer mode](https://docs.microsoft.com/en-US/windows/uwp/get-started/enable-your-device-for-development) if you plan to do UWP app development. **For most users that do not intend to do UWP app development, developer mode will not be necessary.**
- Install the *.cer file into `Local Machine` -> `Trusted Root Certification Authorities`
- This will require administrator elevation. If you installed the certificate and did not have to elevate, you likely installed it into an incorrect certificate store.
![Right-Click then choose Install Certificate](Screenshots/right-click_install-certificate.png)
![Install Certificate into Local Machine](Screenshots/install-certificate_local-machine.png)
- double click the *.appxbundle
- **Optional:** Install Context menu integration from [here](https://github.com/felixse/FluentTerminal/tree/master/Explorer%20Context%20Menu%20Integration)
## How to set up a development environment
Please refer to [this Wiki page](https://github.com/felixse/FluentTerminal/wiki/How-to-set-up-a-development-environment)
Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Loaded 100 of 102 files, more files were not shown because too many files have changed in this diff. Show more