Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
68208ff0ec | ||
|
|
2d7d1810a9 | ||
|
|
cbc90cc94c | ||
|
|
0d48fac129 | ||
|
|
099f7c701d | ||
|
|
2057c6d189 | ||
|
|
56ed197b02 | ||
|
|
5642e755af | ||
|
|
981eb9b362 | ||
|
|
dd6917e1f7 | ||
|
|
e9769a776d | ||
|
|
1068ca98e8 | ||
|
|
c2c93878c7 | ||
|
|
cded0ad97a | ||
|
|
fb299121a3 | ||
|
|
cce7b6e0f1 | ||
|
|
c169dd496b | ||
|
|
70d117cb64 | ||
|
|
39e8f2ba7a | ||
|
|
0a8c186a98 | ||
|
|
ea23b37947 | ||
|
|
ea50883d1c | ||
|
|
1c08a6d486 | ||
|
|
9f75007e21 | ||
|
|
38e1c4f68f | ||
|
|
57cfa6e99a | ||
|
|
1e7831c9a5 | ||
|
|
16730d2810 | ||
|
|
4ca061baa9 | ||
|
|
b753dcbf4d | ||
|
|
7dc2c85d62 | ||
|
|
5e76cf9967 | ||
|
|
8999ded059 | ||
|
|
6d83e357d6 | ||
|
|
05c385342c | ||
|
|
0dc1a1cd5d | ||
|
|
e1fc980779 | ||
|
|
ccd8c1eaa4 | ||
|
|
ad1a933207 | ||
|
|
8d7c57d6fe | ||
|
|
8d039f59ef | ||
|
|
cb8d3cabc7 | ||
|
|
579def4f63 | ||
|
|
5d54d448b0 | ||
|
|
dec492e39a | ||
|
|
20540937fe | ||
|
|
3dd29d7bb7 | ||
|
|
90ac2b0c7c | ||
|
|
e459255b23 | ||
|
|
9165716899 | ||
|
|
49cf63c6b8 | ||
|
|
d0b5f99e28 | ||
|
|
e1b28d2f83 |
No files matched your search
@@ -13,8 +13,8 @@ jobs:
|
||||
- name: Build client
|
||||
working-directory: ./FluentTerminal.Client
|
||||
run: |
|
||||
npm install
|
||||
npm run build
|
||||
yarn
|
||||
yarn build
|
||||
|
||||
- name: Setup MSBuild.exe
|
||||
uses: warrenbuckley/Setup-MSBuild@v1
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.0</TargetFramework>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
@@ -12,12 +12,12 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AutoFixture" Version="4.11.0" />
|
||||
<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="FluentAssertions" Version="5.10.3" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
|
||||
<PackageReference Include="Moq" Version="4.14.4" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||
<PackageReference Include="xunit" Version="2.4.1" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1">
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.2">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
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="MvvmLightLibs" Version="5.4.1.1" />
|
||||
<PackageReference Include="MvvmLightLibsStd10" Version="5.4.1.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||
<PackageReference Include="PListNet" Version="3.0.0" />
|
||||
<PackageReference Include="RestSharp" Version="106.10.1" />
|
||||
<PackageReference Include="PListNet" Version="3.2.0" />
|
||||
<PackageReference Include="RestSharp" Version="106.11.4" />
|
||||
<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" />
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
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,6 +35,8 @@ namespace FluentTerminal.App.Services
|
||||
|
||||
Task SaveTextFileAsync(string path, string content);
|
||||
|
||||
Task<string> ReadTextFileAsync(string path);
|
||||
|
||||
Task<string> GetSshConfigDirAsync();
|
||||
|
||||
Task<string[]> GetFilesFromSshConfigDirAsync();
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using FluentTerminal.App.Services.Utilities;
|
||||
using FluentTerminal.Models;
|
||||
using FluentTerminal.Models;
|
||||
using FluentTerminal.Models.Enums;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -115,6 +114,18 @@ 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>
|
||||
{
|
||||
@@ -219,8 +230,7 @@ namespace FluentTerminal.App.Services.Implementation
|
||||
Command = nameof(Command.ShowSettings),
|
||||
Ctrl = true,
|
||||
Shift = true,
|
||||
// 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
|
||||
Key = (int)ExtendedVirtualKey.Comma
|
||||
}
|
||||
};
|
||||
|
||||
@@ -312,7 +322,36 @@ 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");
|
||||
}
|
||||
@@ -330,7 +369,7 @@ namespace FluentTerminal.App.Services.Implementation
|
||||
new TabTheme
|
||||
{
|
||||
Id = 0,
|
||||
Name = I18N.Translate("TabTheme.None"),
|
||||
Name = "TabTheme.None",
|
||||
BackgroundOpacity = double.NaN,
|
||||
BackgroundPointerOverOpacity = double.NaN,
|
||||
BackgroundPressedOpacity = double.NaN,
|
||||
@@ -341,37 +380,37 @@ namespace FluentTerminal.App.Services.Implementation
|
||||
new TabTheme
|
||||
{
|
||||
Id = 1,
|
||||
Name = I18N.Translate("TabTheme.Red"),
|
||||
Name = "TabTheme.Red",
|
||||
Color = "#E81123"
|
||||
},
|
||||
new TabTheme
|
||||
{
|
||||
Id = 2,
|
||||
Name = I18N.Translate("TabTheme.Green"),
|
||||
Name = "TabTheme.Green",
|
||||
Color = "#10893E"
|
||||
},
|
||||
new TabTheme
|
||||
{
|
||||
Id = 3,
|
||||
Name = I18N.Translate("TabTheme.Blue"),
|
||||
Name = "TabTheme.Blue",
|
||||
Color = "#0078D7"
|
||||
},
|
||||
new TabTheme
|
||||
{
|
||||
Id = 4,
|
||||
Name = I18N.Translate("TabTheme.Purple"),
|
||||
Name = "TabTheme.Purple",
|
||||
Color = "#881798"
|
||||
},
|
||||
new TabTheme
|
||||
{
|
||||
Id = 5,
|
||||
Name = I18N.Translate("TabTheme.Orange"),
|
||||
Name = "TabTheme.Orange",
|
||||
Color = "#FF8C00"
|
||||
},
|
||||
new TabTheme
|
||||
{
|
||||
Id = 6,
|
||||
Name = I18N.Translate("TabTheme.Teal"),
|
||||
Name = "TabTheme.Teal",
|
||||
Color = "#00B7C3"
|
||||
}
|
||||
};
|
||||
|
||||
@@ -63,7 +63,8 @@ namespace FluentTerminal.App.Services.Implementation
|
||||
TerminalOptions = GetTerminalOptions(),
|
||||
Themes = new List<TerminalTheme>(),
|
||||
Profiles = new List<ShellProfile>(),
|
||||
SshProfiles = new List<SshProfile>()
|
||||
SshProfiles = new List<SshProfile>(),
|
||||
DefaultSettings = GetDefaultSettings(),
|
||||
};
|
||||
|
||||
foreach (var theme in GetThemes().Where(x => !x.PreInstalled))
|
||||
@@ -71,7 +72,7 @@ namespace FluentTerminal.App.Services.Implementation
|
||||
config.Themes.Add(theme);
|
||||
}
|
||||
|
||||
foreach (var profile in GetShellProfiles().Where(x => !x.PreInstalled))
|
||||
foreach (var profile in GetShellProfiles())
|
||||
{
|
||||
config.Profiles.Add(profile);
|
||||
}
|
||||
@@ -84,6 +85,15 @@ 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
|
||||
@@ -93,7 +103,8 @@ namespace FluentTerminal.App.Services.Implementation
|
||||
Themes = new List<TerminalTheme>(),
|
||||
Profiles = new List<ShellProfile>(),
|
||||
SshProfiles = new List<SshProfile>(),
|
||||
TerminalOptions = GetTerminalOptions()
|
||||
TerminalOptions = GetTerminalOptions(),
|
||||
DefaultSettings = new Dictionary<string, string>(),
|
||||
};
|
||||
|
||||
JsonConvert.PopulateObject(serializedSettings, config);
|
||||
@@ -117,21 +128,18 @@ namespace FluentTerminal.App.Services.Implementation
|
||||
SaveTheme(theme, existingTheme != null);
|
||||
}
|
||||
|
||||
// Can't create pre-installed profiles
|
||||
foreach (var profile in config.Profiles.Where(x => !x.PreInstalled))
|
||||
foreach (var profile in config.Profiles)
|
||||
{
|
||||
var existingProfile = GetShellProfile(profile.Id);
|
||||
var isNew = existingProfile.EqualTo(default);
|
||||
var isNew = existingProfile == default;
|
||||
|
||||
// You can only edit certain parts of preinstalled profiles
|
||||
if (!isNew && existingProfile.PreInstalled)
|
||||
{
|
||||
existingProfile.WorkingDirectory = profile.WorkingDirectory;
|
||||
existingProfile.Arguments = profile.Arguments;
|
||||
existingProfile.TabThemeId = profile.TabThemeId;
|
||||
existingProfile.TerminalThemeId = profile.TerminalThemeId;
|
||||
existingProfile.KeyBindings = profile.KeyBindings;
|
||||
SaveShellProfile(profile, isNew);
|
||||
// those cannot be edited
|
||||
profile.Name = existingProfile.Name;
|
||||
profile.Location = existingProfile.Location;
|
||||
|
||||
SaveShellProfile(profile, false);
|
||||
continue;
|
||||
}
|
||||
SaveShellProfile(profile, isNew);
|
||||
@@ -140,12 +148,22 @@ namespace FluentTerminal.App.Services.Implementation
|
||||
foreach (var profile in config.SshProfiles)
|
||||
{
|
||||
var existingProfile = GetSshProfile(profile.Id);
|
||||
var isNew = existingProfile.EqualTo(default(SshProfile));
|
||||
var isNew = existingProfile == default;
|
||||
|
||||
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,6 +84,18 @@ 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))
|
||||
|
||||
@@ -24,6 +24,12 @@ 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)
|
||||
@@ -71,6 +77,8 @@ namespace FluentTerminal.App.Services
|
||||
|
||||
public byte Id { get; }
|
||||
|
||||
public ShellProfile Profile { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// To be called by either view or viewmodel
|
||||
/// </summary>
|
||||
@@ -137,6 +145,8 @@ 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="MvvmLightLibs" Version="5.4.1.1" />
|
||||
<PackageReference Include="MvvmLightLibsStd10" Version="5.4.1.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -6,10 +6,12 @@ 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);
|
||||
|
||||
@@ -28,7 +28,6 @@ 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;
|
||||
@@ -38,7 +37,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, IAcceleratorKeyValidator acceleratorKeyValidator)
|
||||
IApplicationView applicationView, IClipboardService clipboardService, ICommandHistoryService commandHistoryService)
|
||||
{
|
||||
MessengerInstance.Register<ApplicationSettingsChangedMessage>(this, OnApplicationSettingsChanged);
|
||||
MessengerInstance.Register<ShellProfileAddedMessage>(this, OnShellProfileAdded);
|
||||
@@ -57,7 +56,6 @@ 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));
|
||||
@@ -71,11 +69,18 @@ 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);
|
||||
@@ -676,8 +681,7 @@ namespace FluentTerminal.App.ViewModels
|
||||
icon: Mdl2Icon.Settings());
|
||||
|
||||
if (_keyBindings.TryGetValue(nameof(Command.ShowSettings), out var keyBindings) &&
|
||||
keyBindings.FirstOrDefault() is KeyBinding settingsKeyBinding &&
|
||||
_acceleratorKeyValidator.Valid(settingsKeyBinding.Key))
|
||||
keyBindings.FirstOrDefault() is KeyBinding settingsKeyBinding)
|
||||
{
|
||||
LoadKeyBindingsFromModel(settingsItem, settingsKeyBinding);
|
||||
}
|
||||
@@ -719,8 +723,7 @@ 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 &&
|
||||
_acceleratorKeyValidator.Valid(tabKeyBindings.Key))
|
||||
kbs.FirstOrDefault() is KeyBinding tabKeyBindings)
|
||||
{
|
||||
LoadKeyBindingsFromModel(defaultProfileItem, tabKeyBindings);
|
||||
}
|
||||
@@ -742,8 +745,7 @@ 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 &&
|
||||
_acceleratorKeyValidator.Valid(remoteTabKeyBinding.Key))
|
||||
keyBindings.FirstOrDefault() is KeyBinding remoteTabKeyBinding)
|
||||
{
|
||||
LoadKeyBindingsFromModel(remoteConnectItem, remoteTabKeyBinding);
|
||||
}
|
||||
@@ -764,8 +766,7 @@ namespace FluentTerminal.App.ViewModels
|
||||
command = tab ? nameof(Command.NewCustomCommandTab) : nameof(Command.NewCustomCommandWindow);
|
||||
|
||||
if (_keyBindings.TryGetValue(command, out keyBindings) &&
|
||||
keyBindings.FirstOrDefault() is KeyBinding quickTabKeyBinding &&
|
||||
_acceleratorKeyValidator.Valid(quickTabKeyBinding.Key))
|
||||
keyBindings.FirstOrDefault() is KeyBinding quickTabKeyBinding)
|
||||
{
|
||||
LoadKeyBindingsFromModel(quickLaunchItem, quickTabKeyBinding);
|
||||
}
|
||||
@@ -794,13 +795,6 @@ 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,12 +1,15 @@
|
||||
using FluentTerminal.Models;
|
||||
using FluentTerminal.App.Services.Utilities;
|
||||
using FluentTerminal.Models;
|
||||
using FluentTerminal.Models.Enums;
|
||||
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
|
||||
@@ -80,9 +83,21 @@ namespace FluentTerminal.App.ViewModels.Menu
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Properties
|
||||
public bool IsExtendedVirtualKey => !Enum.IsDefined(typeof(VirtualKey), Key);
|
||||
|
||||
#region Constructors
|
||||
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);
|
||||
}
|
||||
|
||||
public MenuItemKeyBindingViewModel(int key = 0, bool ctrl = false, bool alt = false, bool shift = false,
|
||||
bool windows = false)
|
||||
@@ -101,9 +116,7 @@ namespace FluentTerminal.App.ViewModels.Menu
|
||||
{
|
||||
}
|
||||
|
||||
#endregion Constructors
|
||||
|
||||
#region Methods
|
||||
|
||||
private void SetKeyModifiers()
|
||||
{
|
||||
@@ -142,6 +155,5 @@ namespace FluentTerminal.App.ViewModels.Menu
|
||||
return _key == other._key && _keyModifiers == other._keyModifiers;
|
||||
}
|
||||
|
||||
#endregion Methods
|
||||
}
|
||||
}
|
||||
@@ -111,13 +111,7 @@ namespace FluentTerminal.App.ViewModels.Profiles
|
||||
|
||||
if (theme == null)
|
||||
{
|
||||
// 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();
|
||||
return;
|
||||
}
|
||||
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,6 +46,7 @@ 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()
|
||||
@@ -64,7 +65,8 @@ namespace FluentTerminal.App.ViewModels
|
||||
SearchWithRegex = SearchWithRegex,
|
||||
XtermBufferState = await SerializeXtermStateAsync().ConfigureAwait(false),
|
||||
TerminalId = Terminal.Id,
|
||||
ShellProfile = ShellProfile
|
||||
ShellProfile = ShellProfile,
|
||||
FontSize = FontSize
|
||||
};
|
||||
|
||||
return JsonConvert.SerializeObject(state);
|
||||
@@ -88,7 +90,7 @@ namespace FluentTerminal.App.ViewModels
|
||||
XtermBufferState = state.XtermBufferState;
|
||||
_terminalId = state.TerminalId;
|
||||
ShellProfile = state.ShellProfile;
|
||||
|
||||
FontSize = state.FontSize;
|
||||
TabTheme.IsSelected = true;
|
||||
}
|
||||
}
|
||||
@@ -116,6 +118,8 @@ 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,
|
||||
@@ -151,11 +155,14 @@ 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);
|
||||
@@ -166,6 +173,8 @@ 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;
|
||||
@@ -212,18 +221,19 @@ 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 TabTheme BackgroundTabTheme
|
||||
public TabThemeViewModel 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?.Theme :
|
||||
SettingsService.GetTabThemes().FirstOrDefault(t => t.Color == null);
|
||||
TabTheme :
|
||||
_transparentTabThemeViewModel;
|
||||
}
|
||||
|
||||
public IClipboardService ClipboardService { get; }
|
||||
@@ -250,6 +260,8 @@ namespace FluentTerminal.App.ViewModels
|
||||
|
||||
public RelayCommand DuplicateTabCommand { get; }
|
||||
|
||||
public AsyncCommand ReconnectTabCommand { get; }
|
||||
|
||||
public ICommand CopyLinkCommand { get; private set; }
|
||||
|
||||
public ICommand CopyCommand { get; private set; }
|
||||
@@ -336,6 +348,7 @@ namespace FluentTerminal.App.ViewModels
|
||||
{
|
||||
HasNewOutput = false;
|
||||
}
|
||||
ReconnectTabCommand.RaiseCanExecuteChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -373,6 +386,8 @@ namespace FluentTerminal.App.ViewModels
|
||||
set => Set(ref _showSearchPanel, value);
|
||||
}
|
||||
|
||||
public bool SearchHasFocus { get; set; }
|
||||
|
||||
public TabThemeViewModel TabTheme
|
||||
{
|
||||
get => _tabTheme;
|
||||
@@ -381,6 +396,9 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -425,6 +443,7 @@ namespace FluentTerminal.App.ViewModels
|
||||
}
|
||||
|
||||
Set(ref _tabTitle, title);
|
||||
ShellProfile.Name = title;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -440,6 +459,15 @@ namespace FluentTerminal.App.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public int FontSize
|
||||
{
|
||||
get => _fontSize;
|
||||
set
|
||||
{
|
||||
_fontSize = value > 0 ? value : 1;
|
||||
}
|
||||
}
|
||||
|
||||
public ITrayProcessCommunicationService TrayProcessCommunicationService { get; }
|
||||
|
||||
public Task CloseAsync()
|
||||
@@ -542,6 +570,12 @@ 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;
|
||||
@@ -650,6 +684,28 @@ 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))
|
||||
@@ -679,6 +735,7 @@ namespace FluentTerminal.App.ViewModels
|
||||
|
||||
private void Terminal_TitleChanged(object sender, string e)
|
||||
{
|
||||
if (e == Terminal.Profile.Location) return;
|
||||
ApplicationView.ExecuteOnUiThreadAsync(() => ShellTitle = e);
|
||||
}
|
||||
|
||||
@@ -706,10 +763,15 @@ namespace FluentTerminal.App.ViewModels
|
||||
|
||||
private async Task Paste()
|
||||
{
|
||||
var content = await ClipboardService.GetTextAsync().ConfigureAwait(false);
|
||||
if (content != null)
|
||||
// prevent from pasting something into the terminal window when the actual command is executed
|
||||
// while being in the search box
|
||||
if (!SearchHasFocus)
|
||||
{
|
||||
TerminalView.Paste(content);
|
||||
var content = await ClipboardService.GetTextAsync().ConfigureAwait(false);
|
||||
if (content != null)
|
||||
{
|
||||
TerminalView.Paste(content);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -767,7 +829,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.{tabTheme.Theme.Name}"), $"{Terminal.Id}_tabTheme", tabTheme, bindingPath: nameof(TabThemeViewModel.IsSelected) , icon: icon);
|
||||
return new RadioMenuItemViewModel(I18N.Translate($"{tabTheme.Theme.Name}"), $"{Terminal.Id}_tabTheme", tabTheme, bindingPath: nameof(TabThemeViewModel.IsSelected) , icon: icon);
|
||||
}
|
||||
|
||||
var tabColor = new ExpandableMenuItemViewModel(I18N.Translate("Color.Text"));
|
||||
|
||||
@@ -9,11 +9,24 @@ namespace FluentTerminal.App.Actions
|
||||
public object Execute(object sender, object parameter)
|
||||
{
|
||||
var control = TargetObject ?? sender as Control;
|
||||
control?.Focus(FocusState.Programmatic);
|
||||
if (control != null)
|
||||
{
|
||||
if (!control.IsLoaded)
|
||||
control.Loaded += Control_Loaded;
|
||||
else
|
||||
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); }
|
||||
|
||||
@@ -47,6 +47,7 @@ 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;
|
||||
@@ -110,13 +111,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())
|
||||
@@ -186,7 +187,189 @@ namespace FluentTerminal.App
|
||||
|
||||
protected override async void OnActivated(IActivatedEventArgs args)
|
||||
{
|
||||
if (args is ProtocolActivatedEventArgs protocolActivated)
|
||||
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 (protocolActivated.Uri == new Uri("ftcmd://fluent.terminal?focus"))
|
||||
{
|
||||
@@ -262,7 +445,7 @@ namespace FluentTerminal.App
|
||||
|
||||
var error = await vm.AcceptChangesAsync(true);
|
||||
|
||||
var profile = (SshProfile) vm.Model;
|
||||
var profile = (SshProfile)vm.Model;
|
||||
|
||||
if (!string.IsNullOrEmpty(error))
|
||||
{
|
||||
@@ -347,8 +530,7 @@ namespace FluentTerminal.App
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (args is CommandLineActivatedEventArgs commandLineActivated)
|
||||
else if (args is CommandLineActivatedEventArgs commandLineActivated)
|
||||
{
|
||||
var arguments = commandLineActivated.Operation.Arguments;
|
||||
if (string.IsNullOrWhiteSpace(arguments))
|
||||
@@ -358,153 +540,10 @@ namespace FluentTerminal.App
|
||||
|
||||
_commandLineParser
|
||||
.ParseArguments(SplitArguments(arguments), typeof(NewVerb), typeof(RunVerb), typeof(SettingsVerb))
|
||||
.WithParsed(async verb => await CliRunAsync(verb, commandLineActivated));
|
||||
.WithParsed(async verb => await ParseCommandLineArgumentsAsync(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);
|
||||
@@ -759,6 +798,11 @@ 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("buffer")]
|
||||
public string Buffer { get; set; }
|
||||
[Option("smart-buffer")]
|
||||
public bool? SmartBuffer { 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.")]
|
||||
public bool Import { get; set; }
|
||||
HelpText = "Import settings from specified file.")]
|
||||
public string Import { get; set; }
|
||||
|
||||
[Option('e', "export",
|
||||
HelpText = "Export settings.")]
|
||||
|
||||
@@ -20,6 +20,10 @@ 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,6 +7,7 @@ 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
|
||||
|
||||
@@ -90,12 +91,22 @@ namespace FluentTerminal.App.Converters
|
||||
|
||||
if (viewModel.KeyBinding != null)
|
||||
{
|
||||
item.KeyboardAccelerators?.Add(new KeyboardAccelerator
|
||||
if (viewModel.KeyBinding.IsExtendedVirtualKey)
|
||||
{
|
||||
Key = (VirtualKey) viewModel.KeyBinding.Key,
|
||||
Modifiers = (VirtualKeyModifiers) viewModel.KeyBinding.KeyModifiers,
|
||||
IsEnabled = true
|
||||
});
|
||||
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
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return item;
|
||||
|
||||
@@ -16,8 +16,6 @@ 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;
|
||||
@@ -53,17 +51,12 @@ namespace FluentTerminal.App.Dialogs
|
||||
get => _key;
|
||||
set
|
||||
{
|
||||
// We're ignoring invalid keys.
|
||||
if (_acceleratorKeyValidator.Valid(value))
|
||||
{
|
||||
Set(ref _key, value);
|
||||
}
|
||||
Set(ref _key, value);
|
||||
}
|
||||
}
|
||||
|
||||
public CreateKeyBindingDialog(IAcceleratorKeyValidator acceleratorKeyValidator)
|
||||
public CreateKeyBindingDialog()
|
||||
{
|
||||
_acceleratorKeyValidator = acceleratorKeyValidator;
|
||||
InitializeComponent();
|
||||
ResetCommand = new RelayCommand(Reset);
|
||||
PreviewKeyDown += RegisterKeyBindingDialog_PreviewKeyDown;
|
||||
|
||||
@@ -79,7 +79,6 @@
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Row -->
|
||||
@@ -124,16 +123,6 @@
|
||||
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,9 +233,13 @@ 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,7 +129,6 @@
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Row -->
|
||||
@@ -209,16 +208,6 @@
|
||||
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>
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>FluentTerminal.App</RootNamespace>
|
||||
<AssemblyName>FluentTerminal.App</AssemblyName>
|
||||
<DefaultLanguage>en</DefaultLanguage>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
|
||||
<TargetPlatformVersion Condition=" '$(TargetPlatformVersion)' == '' ">10.0.18362.0</TargetPlatformVersion>
|
||||
<TargetPlatformMinVersion>10.0.16299.0</TargetPlatformMinVersion>
|
||||
@@ -17,6 +17,7 @@
|
||||
<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>
|
||||
@@ -133,7 +134,6 @@
|
||||
<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,12 +237,14 @@
|
||||
<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\Resources.resw" />
|
||||
<PRIResource Include="Strings\en-US\Resources.resw" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Properties\Default.rd.xml" />
|
||||
@@ -351,22 +353,22 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Autofac">
|
||||
<Version>5.1.2</Version>
|
||||
<Version>5.2.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="CommandLineParser">
|
||||
<Version>2.7.82</Version>
|
||||
<Version>2.8.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
|
||||
<Version>6.2.10</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.Toolkit.Uwp.UI">
|
||||
<Version>6.0.0</Version>
|
||||
<Version>6.1.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.Toolkit.Uwp.UI.Controls">
|
||||
<Version>6.0.0</Version>
|
||||
<Version>6.1.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.UI.Xaml">
|
||||
<Version>2.3.200213001</Version>
|
||||
<Version>2.4.2</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.Xaml.Behaviors.Uwp.Managed">
|
||||
<Version>2.0.1</Version>
|
||||
@@ -374,8 +376,17 @@
|
||||
<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.24.0</Version>
|
||||
<Version>1.25.0</Version>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@@ -416,9 +427,6 @@
|
||||
<ItemGroup>
|
||||
<PRIResource Include="Strings\he\Resources.resw" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PRIResource Include="Strings\az\Resources.resw" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PRIResource Include="Strings\ja\Resources.resw" />
|
||||
</ItemGroup>
|
||||
@@ -437,6 +445,25 @@
|
||||
<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)' < '14.0' ">
|
||||
<VisualStudioVersion>14.0</VisualStudioVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Reflection;
|
||||
using System.Resources;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
@@ -25,4 +26,5 @@ using System.Runtime.InteropServices;
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
[assembly: ComVisible(false)]
|
||||
[assembly: ComVisible(false)]
|
||||
[assembly: NeutralResourcesLanguage("en-US")]
|
||||
@@ -1,13 +0,0 @@
|
||||
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,13 +12,17 @@ namespace FluentTerminal.App.Services
|
||||
[""] = "System default",
|
||||
["ar"] = "العربية",
|
||||
["ar-IQ"] = "اللهجة العراقية",
|
||||
["az"] = "azərbaycan dili",
|
||||
["az-Latn"] = "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"] = "日本語",
|
||||
@@ -28,9 +32,12 @@ 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,6 +1044,21 @@
|
||||
<value>Copy selection or paste</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1087,6 +1087,21 @@ Type "أخرج من منفذ الأوامر " then type the name in th
|
||||
<value>Copy selection or paste</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1044,6 +1044,21 @@
|
||||
<value>Copy selection or paste</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1077,6 +1077,21 @@ Fuzzy</comment>
|
||||
<value>Auswahl kopieren oder Einfügen</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1109,6 +1109,21 @@ Fuzzy</comment>
|
||||
<value>Copy selection or paste</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -542,7 +542,7 @@ Fuzzy</comment>
|
||||
<comment>ShellProfileSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="ConfirmCloseTab" xml:space="preserve">
|
||||
<value>Are you sure you want to close "{0}" tab?</value>
|
||||
<value>¿Estás seguro que quieres cerrar la pestaña "{0}"?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmCloseWindow" xml:space="preserve">
|
||||
@@ -831,240 +831,255 @@ Fuzzy</comment>
|
||||
<value>¿Quieres eliminar este perfil?</value>
|
||||
</data>
|
||||
<data name="Command.NewSshWindow" xml:space="preserve">
|
||||
<value>New SSH window</value>
|
||||
<value>Nueva ventana SSH</value>
|
||||
</data>
|
||||
<data name="Setting_SShProfiles.Content" xml:space="preserve">
|
||||
<value>SSH Profiles</value>
|
||||
<value>Perfiles SSH</value>
|
||||
</data>
|
||||
<data name="SshInfoDialog_TabColor.Text" xml:space="preserve">
|
||||
<value>Tab color:</value>
|
||||
<value>Color de pestaña:</value>
|
||||
</data>
|
||||
<data name="UseConPty" xml:space="preserve">
|
||||
<value>Use ConPty</value>
|
||||
<value>Usar ConPty</value>
|
||||
</data>
|
||||
<data name="Username.Header" xml:space="preserve">
|
||||
<value>Username</value>
|
||||
<value>Nombre de usuario</value>
|
||||
</data>
|
||||
<data name="MoshPortFrom.Header" xml:space="preserve">
|
||||
<value>From port</value>
|
||||
<value>Puerto desde</value>
|
||||
</data>
|
||||
<data name="MoshPortTo.Header" xml:space="preserve">
|
||||
<value>to port</value>
|
||||
<value>a puerto</value>
|
||||
</data>
|
||||
<data name="MoshPortRange.Text" xml:space="preserve">
|
||||
<value>Mosh port range</value>
|
||||
<value>Rango de puertos Mosh</value>
|
||||
</data>
|
||||
<data name="Authenticate" xml:space="preserve">
|
||||
<value>Authenticate</value>
|
||||
<value>Autenticar</value>
|
||||
</data>
|
||||
<data name="SettingsExported" xml:space="preserve">
|
||||
<value>Settings were exported to file</value>
|
||||
<value>Opciones exportadas a archivo</value>
|
||||
</data>
|
||||
<data name="SettingsImported" xml:space="preserve">
|
||||
<value>Settings were imported from file</value>
|
||||
<value>Opciones importadas desde archivo</value>
|
||||
</data>
|
||||
<data name="SshConnectionInfoValidationResult.IdentityFileDoesNotExist" xml:space="preserve">
|
||||
<value>Identify file does not exist</value>
|
||||
<value>No existe el archivo de identidad</value>
|
||||
</data>
|
||||
<data name="AutoFallbackToWindowsUsername.Header" xml:space="preserve">
|
||||
<value>Use Windows username when opening SSH URLs that don't specify one</value>
|
||||
<value>Usar nombre de Windows al abrir urls SSH que no especifican uno</value>
|
||||
</data>
|
||||
<data name="UseMoshByDefault.Header" xml:space="preserve">
|
||||
<value>Default to Mosh for SSH connections</value>
|
||||
<value>Mosh para conexiones SSH por defecto</value>
|
||||
</data>
|
||||
<data name="RTrimCopiedLines.Header" xml:space="preserve">
|
||||
<value>Right trim copied lines</value>
|
||||
<value>Recortar a la derecha las líneas copiadas</value>
|
||||
</data>
|
||||
<data name="QuickSshDefault.Header" xml:space="preserve">
|
||||
<value>Use quick SSH by default</value>
|
||||
<value>Usar SSH rápido por defecto</value>
|
||||
</data>
|
||||
<data name="InvalidCommand" xml:space="preserve">
|
||||
<value>Invalid command.</value>
|
||||
<value>Comando inválido.</value>
|
||||
</data>
|
||||
<data name="LocationCantBeEmpty" xml:space="preserve">
|
||||
<value>Location cannot be empty.</value>
|
||||
<value>La ubicación no puede estar vacía.</value>
|
||||
</data>
|
||||
<data name="MuteTerminalBeeps.Header" xml:space="preserve">
|
||||
<value>Mute terminal beeps</value>
|
||||
<value>Silenciar sonidos de terminal</value>
|
||||
</data>
|
||||
<data name="CommandTextBox.PlaceholderText" xml:space="preserve">
|
||||
<value>Enter a command (e.g. 'ssh username@host')</value>
|
||||
<value>Introduce un comando (p.e. 'ssh username@host')</value>
|
||||
</data>
|
||||
<data name="CommandLine.Header" xml:space="preserve">
|
||||
<value>Command</value>
|
||||
<value>Comando</value>
|
||||
</data>
|
||||
<data name="UnsupportedCommand" xml:space="preserve">
|
||||
<value>Unsupported command:</value>
|
||||
<value>Comando no soportado:</value>
|
||||
</data>
|
||||
<data name="CommandArgumentsMandatory" xml:space="preserve">
|
||||
<value>Command arguments are missing.</value>
|
||||
<value>Faltan argumentos del comando.</value>
|
||||
</data>
|
||||
<data name="QuickCommandDialog.Title" xml:space="preserve">
|
||||
<value>Quick Launch</value>
|
||||
<value>Lanzamiento rápido</value>
|
||||
</data>
|
||||
<data name="Command.NewCustomCommandTab" xml:space="preserve">
|
||||
<value>New quick launch tab</value>
|
||||
<value>Nueva pestaña de inicio rápido</value>
|
||||
</data>
|
||||
<data name="Command.NewCustomCommandWindow" xml:space="preserve">
|
||||
<value>New quick launch window</value>
|
||||
<value>Lanzar nueva ventana rápida</value>
|
||||
</data>
|
||||
<data name="NewQuickTab.Text" xml:space="preserve">
|
||||
<value>New quick tab</value>
|
||||
<value>Nueva pestaña rápida</value>
|
||||
</data>
|
||||
<data name="FileNotFound" xml:space="preserve">
|
||||
<value>File not found:</value>
|
||||
<value>Archivo no encontrado:</value>
|
||||
</data>
|
||||
<data name="InvalidLink" xml:space="preserve">
|
||||
<value>Invalid link.</value>
|
||||
<value>Enlace inválido.</value>
|
||||
</data>
|
||||
<data name="DropTabHere" xml:space="preserve">
|
||||
<value>Drop tab here</value>
|
||||
<value>Suelta la pestaña aquí</value>
|
||||
</data>
|
||||
<data name="CloseLeft.Text" xml:space="preserve">
|
||||
<value>Close tabs to the left</value>
|
||||
<value>Cerrar pestañas a la izquierda</value>
|
||||
</data>
|
||||
<data name="CloseOther.Text" xml:space="preserve">
|
||||
<value>Close other tabs</value>
|
||||
<value>Cerrar el resto de pestañas</value>
|
||||
</data>
|
||||
<data name="CloseRight.Text" xml:space="preserve">
|
||||
<value>Close tabs to the right</value>
|
||||
<value>Cerrar pestañas a la derecha</value>
|
||||
</data>
|
||||
<data name="Command.DuplicateTab" xml:space="preserve">
|
||||
<value>Duplicate tab</value>
|
||||
<value>Duplicar pestaña</value>
|
||||
</data>
|
||||
<data name="Duplicate.Text" xml:space="preserve">
|
||||
<value>Duplicate</value>
|
||||
<value>Duplicar</value>
|
||||
</data>
|
||||
<data name="DuplicateEnvironmentVariable" xml:space="preserve">
|
||||
<value>Cannot define two environment variables with the same name.</value>
|
||||
<value>No puedes asignar dos variables de entorno con el mismo nombre.</value>
|
||||
</data>
|
||||
<data name="EmptyEnvironmentVariableName" xml:space="preserve">
|
||||
<value>Cannot define an environment variable without a name.</value>
|
||||
<value>No puedes definir una variable de entorno sin nombre.</value>
|
||||
</data>
|
||||
<data name="EnvironmentVariables.Text" xml:space="preserve">
|
||||
<value>Environment variables</value>
|
||||
<value>Variables de entorno</value>
|
||||
</data>
|
||||
<data name="CloseSearchPanel.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Close search panel</value>
|
||||
<value>Cerrar panel de búsqueda</value>
|
||||
</data>
|
||||
<data name="FindNext.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Find next</value>
|
||||
<value>Buscar siguiente</value>
|
||||
</data>
|
||||
<data name="FindPrevious.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Find previous</value>
|
||||
<value>Buscar anterior</value>
|
||||
</data>
|
||||
<data name="SearchTextBox.PlaceholderText" xml:space="preserve">
|
||||
<value>Enter search term</value>
|
||||
<value>Ingrese el término de búsqueda</value>
|
||||
</data>
|
||||
<data name="Search.Text" xml:space="preserve">
|
||||
<value>Search</value>
|
||||
<value>Buscar</value>
|
||||
</data>
|
||||
<data name="PrintableOutputOnly.Content" xml:space="preserve">
|
||||
<value>Printable output only</value>
|
||||
<value>Solamente salida imprimible</value>
|
||||
</data>
|
||||
<data name="EnableLogging.Header" xml:space="preserve">
|
||||
<value>Log output for debugging</value>
|
||||
<value>Registar salida para debugeo</value>
|
||||
</data>
|
||||
<data name="WordSeparator.Header" xml:space="preserve">
|
||||
<value>Word separator characters</value>
|
||||
<value>Caracteres separadores de palabras</value>
|
||||
</data>
|
||||
<data name="Recent.Text" xml:space="preserve">
|
||||
<value>Recent</value>
|
||||
<value>Reciente</value>
|
||||
</data>
|
||||
<data name="NewTab_Description" xml:space="preserve">
|
||||
<value>Opens default profile in a new tab.</value>
|
||||
<value>Abre el perfil predeterminado en una nueva pestaña.</value>
|
||||
</data>
|
||||
<data name="NewSshTab_Description" xml:space="preserve">
|
||||
<value>Opens a new SSH or Mosh session in a new tab.</value>
|
||||
<value>Abre una nueva sesión SSH o Mosh en una nueva pestaña.</value>
|
||||
</data>
|
||||
<data name="NewQuickTab_Description" xml:space="preserve">
|
||||
<value>Opens "Quick Launch" dialog and starts session in a new tab.</value>
|
||||
<value>Abre el cuadro de diálogo "Inicio rápido" e inicia la sesión en una pestaña nueva.</value>
|
||||
</data>
|
||||
<data name="Settings_Description" xml:space="preserve">
|
||||
<value>Opens settings window.</value>
|
||||
<value>Abrir ventana de opciones.</value>
|
||||
</data>
|
||||
<data name="About_Description" xml:space="preserve">
|
||||
<value>Basic info about the app.</value>
|
||||
<value>Información básica sobre la app.</value>
|
||||
</data>
|
||||
<data name="Recent_Description" xml:space="preserve">
|
||||
<value>Recently opened sessions.</value>
|
||||
<value>Sesiones abiertas recientemente.</value>
|
||||
</data>
|
||||
<data name="MenuItem_DefaultProfile_Description" xml:space="preserve">
|
||||
<value>Starts new terminal session based on the default profile.</value>
|
||||
<value>Inicia una nueva sesión de terminal basada en el perfil predeterminado.</value>
|
||||
</data>
|
||||
<data name="MenuItem_Remote_Text" xml:space="preserve">
|
||||
<value>Remote Connect...</value>
|
||||
<value>Conexión remota...</value>
|
||||
</data>
|
||||
<data name="MenuItem_Remote_Description" xml:space="preserve">
|
||||
<value>Opens a dialog for launching a new SSH or Mosh terminal session.</value>
|
||||
<value>Abre un cuadro de diálogo para iniciar una nueva sesión de terminal SSH o Mosh.</value>
|
||||
</data>
|
||||
<data name="MenuItem_QuickLaunch_Text" xml:space="preserve">
|
||||
<value>Quick Launch...</value>
|
||||
<value>Comida rápida...</value>
|
||||
</data>
|
||||
<data name="MenuItem_QuickLaunch_Description" xml:space="preserve">
|
||||
<value>Opens a "Quick Launch" dialog for starting a new terminal session.</value>
|
||||
<value>Abre un cuadro de diálogo "Inicio rápido" para iniciar una nueva sesión de terminal.</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewWindow_Text" xml:space="preserve">
|
||||
<value>New Window</value>
|
||||
<value>Nueva ventana</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewTab_Text" xml:space="preserve">
|
||||
<value>New Tab</value>
|
||||
<value>Nueva pestaña</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewTab_Description" xml:space="preserve">
|
||||
<value>Launches a session in a new tab.</value>
|
||||
<value>Inicia una sesión en una nueva pestaña.</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewWindow_Description" xml:space="preserve">
|
||||
<value>Launches a session in a new window.</value>
|
||||
<value>Lanzar nueva sesión en una nueva ventana.</value>
|
||||
</data>
|
||||
<data name="AppMenuType.Text" xml:space="preserve">
|
||||
<value>Application menu type</value>
|
||||
<value>Tipo de menú de la aplicación</value>
|
||||
</data>
|
||||
<data name="AppMenuType_Flat.Content" xml:space="preserve">
|
||||
<value>Flat, honoring "Open new terminals as" setting</value>
|
||||
<value>Plano, honrando la configuración "Abrir nuevos terminales como"</value>
|
||||
</data>
|
||||
<data name="AppMenuType_Cascading.Content" xml:space="preserve">
|
||||
<value>"New Tab" / "New Window" cascading</value>
|
||||
<value>"Nueva pestaña" / "Nueva ventana" en cascada</value>
|
||||
</data>
|
||||
<data name="Quit.Text" xml:space="preserve">
|
||||
<value>Quit</value>
|
||||
<value>Salir</value>
|
||||
</data>
|
||||
<data name="Quit.Description" xml:space="preserve">
|
||||
<value>Quit Fluent Terminal</value>
|
||||
<value>Salir de Fluent Terminal</value>
|
||||
</data>
|
||||
<data name="EnabledByPolicy" xml:space="preserve">
|
||||
<value>Enabled by policy.</value>
|
||||
<value>Habilitado por la política.</value>
|
||||
</data>
|
||||
<data name="BackgroundImage.Content" xml:space="preserve">
|
||||
<value>Background image</value>
|
||||
<value>Imagen de fondo</value>
|
||||
</data>
|
||||
<data name="AcrylicBackground.Header" xml:space="preserve">
|
||||
<value>Use acrylic background</value>
|
||||
<value>Usar fondo acrílico</value>
|
||||
</data>
|
||||
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this background image?</value>
|
||||
<value>¿Estás seguro de querer borrar esta imagen de fondo?</value>
|
||||
</data>
|
||||
<data name="Colors.Text" xml:space="preserve">
|
||||
<value>Colors</value>
|
||||
<value>Colores</value>
|
||||
</data>
|
||||
<data name="BrightColors.Text" xml:space="preserve">
|
||||
<value>Bright colors</value>
|
||||
<value>Colores brillantes</value>
|
||||
</data>
|
||||
<data name="CopyLink" xml:space="preserve">
|
||||
<value>Copy link</value>
|
||||
<value>Copiar enlace</value>
|
||||
</data>
|
||||
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Regex</value>
|
||||
</data>
|
||||
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Whole word</value>
|
||||
<value>Toda la palabra</value>
|
||||
</data>
|
||||
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Case sensitive</value>
|
||||
<value>Distingue mayúsculas y minúsculas</value>
|
||||
</data>
|
||||
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
|
||||
<value>Copy selection or paste</value>
|
||||
<value>Copiar selección o pegar</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -123,7 +123,7 @@
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
<data name="Background.Content" xml:space="preserve">
|
||||
<value>Fond</value>
|
||||
<value>Arrière-plan</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'indicateur de nouvelle sortie sur les onglets en arrière-plan</value>
|
||||
<value>Afficher l'indicateur de nouvelle sortie sur les onglets inactifs</value>
|
||||
<comment>GeneralSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="NeedRelaunch.Text" xml:space="preserve">
|
||||
<value>Redémarrage de l'application requis pour appliquer le réglage</value>
|
||||
<value>Relancez l'application pour appliquer ce 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 de nouveaux terminaux en tant que</value>
|
||||
<value>Ouvrir les 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>Afficher les onglets sur</value>
|
||||
<value>Disposition des onglets</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>Bas</value>
|
||||
<value>En bas</value>
|
||||
<comment>GeneralSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="TP_Top.Content" xml:space="preserve">
|
||||
<value>Haut</value>
|
||||
<value>En 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'onglet sélectionné</value>
|
||||
<value>Souligner l'onglet actif</value>
|
||||
<comment>GeneralSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="Setting_About.Content" xml:space="preserve">
|
||||
<value>A propos</value>
|
||||
<value>À 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>Profiles</value>
|
||||
<value>Profils</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é du fond</value>
|
||||
<value>Opacité de l'arrière-plan</value>
|
||||
<comment>TerminalSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="BlinkingCursor.Header" xml:space="preserve">
|
||||
<value>Clignotement du curseur</value>
|
||||
<value>Curseur clignotant</value>
|
||||
<comment>TerminalSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="BoldText.Header" xml:space="preserve">
|
||||
<value>Texte en gras</value>
|
||||
<value>Texte 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 éditer</value>
|
||||
<value>Cliquez sur une couleur pour l'é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>Copier sur sélectionner</value>
|
||||
<value>Copie automatique</value>
|
||||
<comment>MouseSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="CreateProfile.Text" xml:space="preserve">
|
||||
<value>Créer un nouveau</value>
|
||||
<value>Créer un profil</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>Editer</value>
|
||||
<value>Éditer</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 polices</value>
|
||||
<value>Famille de police</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>Mode de traduction de fin de ligne</value>
|
||||
<value>Conversion de fin de ligne</value>
|
||||
<comment>ShellProfileSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="LineEndingModeOnPaste.Text" xml:space="preserve">
|
||||
<value>Mode de traduction de fin de ligne sur coller:</value>
|
||||
<value>Conversion de fin des lignes collées:</value>
|
||||
<comment>ShellProfileSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="MiddleButtonAction.Text" xml:space="preserve">
|
||||
<value>Action du bouton du milieu</value>
|
||||
<value>Action du bouton central</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 nouveau</value>
|
||||
<value>Créer un thème</value>
|
||||
<comment>ThemeSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="Padding.Header" xml:space="preserve">
|
||||
<value>Padding</value>
|
||||
<value>Bords</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>Profiles</value>
|
||||
<value>Profils</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>Sauvgarder</value>
|
||||
<value>Sauvegarder</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>Masquage automatique</value>
|
||||
<value>Masquer automatiquement</value>
|
||||
<comment>TerminalSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="ScrollBarHidden.Content" xml:space="preserve">
|
||||
<value>Masqué</value>
|
||||
<value>Masquée</value>
|
||||
<comment>TerminalSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="ScrollbarStyle.Text" xml:space="preserve">
|
||||
<value>Style de barre de défilement</value>
|
||||
<value>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 actif</value>
|
||||
<value>Définir comme 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 exécutable du shell</value>
|
||||
<value>Emplacement de l'exécutable du shell</value>
|
||||
<comment>ShellProfileSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="TabColor.Header" xml:space="preserve">
|
||||
<value>Couleur d'onglet</value>
|
||||
<value>Couleur de l'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>Directeur de travail</value>
|
||||
<value>Dossier de départ</value>
|
||||
<comment>ShellProfileSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="ConfirmCloseTab" xml:space="preserve">
|
||||
<value>Êtes-vous sûr de vouloir fermer "{0}" onglets?</value>
|
||||
<value>Êtes-vous sûr(e) de vouloir fermer "{0}" onglets ?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmCloseWindow" xml:space="preserve">
|
||||
<value>Are you sure you want to close this window?</value>
|
||||
<value>Voulez-vous fermer cette fenêtre ?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmDeleteKeybindings" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this keybinding?</value>
|
||||
<value>Voulez-vous supprimer ce raccourci ?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmDeleteTheme" xml:space="preserve">
|
||||
<value>Êtes-vous sûr de vouloir supprimer ce thème?</value>
|
||||
<value>Voulez-vous supprimer ce thème ?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmDiscardChanges" xml:space="preserve">
|
||||
<value>Êtes-vous sûr de vouloir annuler toutes les modifications?</value>
|
||||
<value>Voulez-vous annuler toutes les modifications ?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmRestoreGeneralSettings" xml:space="preserve">
|
||||
<value>Êtes-vous sûr de vouloir restaurer les paramètres généraux?</value>
|
||||
<value>Voulez-vous restaurer les paramètres généraux ?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmRestoreKeybindings" xml:space="preserve">
|
||||
<value>Êtes-vous sûr de vouloir restaurer les raccourcis clavier par défaut?</value>
|
||||
<value>Voulez-vous restaurer les raccourcis clavier par défaut ?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmRestoreMouseSettings" xml:space="preserve">
|
||||
<value>Êtes-vous sûr de vouloir restaurer les paramètres de la souris?</value>
|
||||
<value>Voulez-vous restaurer les paramètres de la souris ?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmRestoreProfile" xml:space="preserve">
|
||||
<value>Êtes-vous sûr de vouloir restaurer ce profil?</value>
|
||||
<value>Voulez-vous restaurer ce profil ?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmRestoreTerminalOptions" xml:space="preserve">
|
||||
<value>Êtes-vous sûr de vouloir restaurer les options du terminal par défaut?</value>
|
||||
<value>Voulez-vous restaurer les options du terminal par défaut ?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="DisabledByPolicy" xml:space="preserve">
|
||||
<value>Désactivé par politique.</value>
|
||||
<value>Désactivé par Stratégie de Goupe.</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>Editer le titre</value>
|
||||
<value>Éditer 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'importation du thème a échouer</value>
|
||||
<value>L'importation du thème a échoué</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 raccourcis maintenant</value>
|
||||
<value>Entrez votre raccourci 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 copier</value>
|
||||
<value>Texte copié</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>Editer</value>
|
||||
<value>Éditer</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>Chercher</value>
|
||||
<value>Recherche</value>
|
||||
<comment>Command
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
<data name="Command.SelectAll" xml:space="preserve">
|
||||
<value>Selectionner tout</value>
|
||||
<value>Sélectionner tout</value>
|
||||
<comment>Command
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
@@ -759,12 +759,12 @@ Fuzzy</comment>
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
<data name="Command.ToggleFullScreen" xml:space="preserve">
|
||||
<value>Basculer en plein écran</value>
|
||||
<value>Plein écran</value>
|
||||
<comment>Command
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
<data name="Command.ToggleWindow" xml:space="preserve">
|
||||
<value>Basculer la fenêtre</value>
|
||||
<value>Afficher/Masquer 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 SSH onglet</value>
|
||||
<value>Nouvel onglet SSH</value>
|
||||
<comment>Fuzzy</comment>
|
||||
</data>
|
||||
<data name="SshInfoDialog.Title" xml:space="preserve">
|
||||
<value>SSH Informations</value>
|
||||
<value>Informations SSH</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>Utilisez Mosh</value>
|
||||
<value>Utiliser 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'utilisateur ne peut pas être vide.</value>
|
||||
<value>Le nom d'utilisateur ne peut être vide.</value>
|
||||
</data>
|
||||
<data name="SshConnectionInfoValidationResult.HostEmpty" xml:space="preserve">
|
||||
<value>L'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>Language</value>
|
||||
<value>Langage</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>Êtes-vous sûr de vouloir supprimer ce profil?</value>
|
||||
<value>Voulez-vous 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>Utilisez ConPty</value>
|
||||
<value>Utiliser 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 portt</value>
|
||||
<value>au port</value>
|
||||
<comment>Fuzzy</comment>
|
||||
</data>
|
||||
<data name="MoshPortRange.Text" xml:space="preserve">
|
||||
@@ -906,28 +906,28 @@ Fuzzy</comment>
|
||||
<value>Le fichier d'identification n'existe pas</value>
|
||||
</data>
|
||||
<data name="AutoFallbackToWindowsUsername.Header" xml:space="preserve">
|
||||
<value>Utilisez le nom d'utilisateur Windows lors de l'ouverture d'URL SSH qui don't spécifier un</value>
|
||||
<value>Utiliser le nom d'utilisateur Windows pour les connexions SSH qui n'en spécifient aucun</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>Couper les lignes copiées</value>
|
||||
<value>Rogner 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 non valide.</value>
|
||||
<value>Commande invalide.</value>
|
||||
</data>
|
||||
<data name="LocationCantBeEmpty" xml:space="preserve">
|
||||
<value>L'emplacement ne peut pas être vide.</value>
|
||||
</data>
|
||||
<data name="MuteTerminalBeeps.Header" xml:space="preserve">
|
||||
<value>Mutter les bips du terminal</value>
|
||||
<value>Désactiver les bips du terminal</value>
|
||||
</data>
|
||||
<data name="CommandTextBox.PlaceholderText" xml:space="preserve">
|
||||
<value>Entrez une commande (e.g. 'ssh username@host')</value>
|
||||
<value>Entrez une commande (ex: 'ssh username@host')</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 commande sont manquants.</value>
|
||||
<value>Les arguments de la commande sont manquants.</value>
|
||||
</data>
|
||||
<data name="QuickCommandDialog.Title" xml:space="preserve">
|
||||
<value>Démarrage rapide</value>
|
||||
<value>Lancement rapide</value>
|
||||
<comment>Fuzzy</comment>
|
||||
</data>
|
||||
<data name="Command.NewCustomCommandTab" xml:space="preserve">
|
||||
<value>Nouvel onglet de lancement rapide</value>
|
||||
<value>Lancement rapide (onglet)</value>
|
||||
</data>
|
||||
<data name="Command.NewCustomCommandWindow" xml:space="preserve">
|
||||
<value>Nouvelle fenêtre de lancement rapide</value>
|
||||
<value>Lancement rapide (fenêtre)</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>Drop tab here</value>
|
||||
<value>Déposez l'onglet ici</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>Onglet dupliquer</value>
|
||||
<value>Dupliquer l'onglet</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>Trouver le suivant</value>
|
||||
<value>Résultat suivant</value>
|
||||
</data>
|
||||
<data name="FindPrevious.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Trouver le précédent</value>
|
||||
<value>Résultat 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>Chercher</value>
|
||||
<value>Recherche</value>
|
||||
</data>
|
||||
<data name="PrintableOutputOnly.Content" xml:space="preserve">
|
||||
<value>Sortie imprimable seulement</value>
|
||||
@@ -1010,79 +1010,80 @@ Fuzzy</comment>
|
||||
<value>Caractères séparateurs de mots</value>
|
||||
</data>
|
||||
<data name="Recent.Text" xml:space="preserve">
|
||||
<value>Récent</value>
|
||||
<value>Récents</value>
|
||||
</data>
|
||||
<data name="NewTab_Description" xml:space="preserve">
|
||||
<value>Ouvrir le profile par défaut dans un nouvel onglet.</value>
|
||||
<value>Ouvre le profil par défaut dans un nouvel onglet.</value>
|
||||
</data>
|
||||
<data name="NewSshTab_Description" xml:space="preserve">
|
||||
<value>Ouvrir une session SSH ou Msh dans un nouvel onglet.</value>
|
||||
<value>Ouvre une session SSH ou Mosh dans un nouvel onglet.</value>
|
||||
</data>
|
||||
<data name="NewQuickTab_Description" xml:space="preserve">
|
||||
<value>Ouvrir le dialogue "Lancement rapide" et commencer une session dans un nouvel onglet.</value>
|
||||
<value>Ouvre le dialogue "Lancement rapide" et démarre une session dans un nouvel onglet.</value>
|
||||
</data>
|
||||
<data name="Settings_Description" xml:space="preserve">
|
||||
<value>Ouvrir les paramètres.</value>
|
||||
<value>Ouvre les paramètres.</value>
|
||||
</data>
|
||||
<data name="About_Description" xml:space="preserve">
|
||||
<value>Informations sur l'application.</value>
|
||||
</data>
|
||||
<data name="Recent_Description" xml:space="preserve">
|
||||
<value>Session récentes.</value>
|
||||
<value>Sessions récentes.</value>
|
||||
</data>
|
||||
<data name="MenuItem_DefaultProfile_Description" xml:space="preserve">
|
||||
<value>Commencer une nouvelle session du profil par défaut.</value>
|
||||
<value>Démarre une nouvelle session de terminal du profil par défaut.</value>
|
||||
</data>
|
||||
<data name="MenuItem_Remote_Text" xml:space="preserve">
|
||||
<value>Connexion distante...</value>
|
||||
<value>Connexion à distance...</value>
|
||||
</data>
|
||||
<data name="MenuItem_Remote_Description" xml:space="preserve">
|
||||
<value>Ouvrir un dialogue pour une nouvelle session SSH ou Mosh.</value>
|
||||
<value>Ouvre un dialogue permettant de lancer 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 "Lancement rapide" pour un nouvelle session.</value>
|
||||
<value>Ouvrir un dialogue "Lancement rapide" pour une nouvelle session de terminal.</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>
|
||||
<value>Nouvel onglet</value>
|
||||
<comment>@William Why adding dots everywhere? These are not sentences</comment>
|
||||
</data>
|
||||
<data name="MenuItem_NewTab_Description" xml:space="preserve">
|
||||
<value>Lancer une session dans un nouvel onglet.</value>
|
||||
<value>Lance une session dans un nouvel onglet.</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewWindow_Description" xml:space="preserve">
|
||||
<value>Lancer une session dans une nouvelle fenêtre.</value>
|
||||
<value>Lance une session dans une nouvelle fenêtre.</value>
|
||||
</data>
|
||||
<data name="AppMenuType.Text" xml:space="preserve">
|
||||
<value>Application menu type</value>
|
||||
<value>Style du menu d'application</value>
|
||||
</data>
|
||||
<data name="AppMenuType_Flat.Content" xml:space="preserve">
|
||||
<value>Flat, honoring "Open new terminals as" setting</value>
|
||||
<value>Plat, honorant le paramètre "Ouvrir les nouveaux terminaux en tant que"</value>
|
||||
</data>
|
||||
<data name="AppMenuType_Cascading.Content" xml:space="preserve">
|
||||
<value>"Nouvel onglet" / "Nouvelle fenêtre" 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 la politique.</value>
|
||||
<value>Autorisé par Stratégie de Goupe.</value>
|
||||
</data>
|
||||
<data name="BackgroundImage.Content" xml:space="preserve">
|
||||
<value>Image de fond</value>
|
||||
<value>Image d'arrière-plan</value>
|
||||
</data>
|
||||
<data name="AcrylicBackground.Header" xml:space="preserve">
|
||||
<value>Utilise un fond acrylique.</value>
|
||||
<value>Arrière-plan transparent</value>
|
||||
</data>
|
||||
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
|
||||
<value>Êtes vous sûr de vouloir supprimer cette image de fond ?</value>
|
||||
<value>Voulez-vous supprimer cet arrière-plan ?</value>
|
||||
</data>
|
||||
<data name="Colors.Text" xml:space="preserve">
|
||||
<value>Couleurs</value>
|
||||
@@ -1100,12 +1101,27 @@ 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>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1053,6 +1053,21 @@ Fuzzy</comment>
|
||||
<value>Copy selection or paste</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1044,6 +1044,21 @@
|
||||
<value>Copy selection or paste</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1044,6 +1044,21 @@
|
||||
<value>Salin yang terpilih atau tempel</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -255,8 +255,7 @@
|
||||
</data>
|
||||
<data name="UnderlineTab.Header" xml:space="preserve">
|
||||
<value>Sottolinea la scheda attiva</value>
|
||||
<comment>GeneralSettings.xaml
|
||||
Fuzzy</comment>
|
||||
<comment>GeneralSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="Setting_About.Content" xml:space="preserve">
|
||||
<value>Informazioni su</value>
|
||||
@@ -578,8 +577,7 @@ Fuzzy</comment>
|
||||
</data>
|
||||
<data name="DisabledByPolicy" xml:space="preserve">
|
||||
<value>Disattivato da policy</value>
|
||||
<comment>ViewModel
|
||||
Fuzzy</comment>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="DisabledByUser" xml:space="preserve">
|
||||
<value>Disattivato dall'utente. Riattiva Fluent Terminal nella scheda Avvio del Task Manager</value>
|
||||
@@ -863,7 +861,6 @@ 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>
|
||||
@@ -969,7 +966,7 @@ Fuzzy</comment>
|
||||
<value>Apre una sessione SSH o Mosh in una nuova scheda</value>
|
||||
</data>
|
||||
<data name="NewQuickTab_Description" xml:space="preserve">
|
||||
<value>Opens "Quick Launch" dialog and starts session in a new tab.</value>
|
||||
<value>Apre la schermata di "Avvio rapido" e avvia la sessione in una nuova scheda</value>
|
||||
</data>
|
||||
<data name="Settings_Description" xml:space="preserve">
|
||||
<value>Apre la finestra impostazioni</value>
|
||||
@@ -981,81 +978,96 @@ Fuzzy</comment>
|
||||
<value>Sessioni aperte di recente</value>
|
||||
</data>
|
||||
<data name="MenuItem_DefaultProfile_Description" xml:space="preserve">
|
||||
<value>Starts new terminal session based on the default profile.</value>
|
||||
<value>Avvia una nuova sessione di terminale con il profilo predefinito</value>
|
||||
</data>
|
||||
<data name="MenuItem_Remote_Text" xml:space="preserve">
|
||||
<value>Connessione remota...</value>
|
||||
</data>
|
||||
<data name="MenuItem_Remote_Description" xml:space="preserve">
|
||||
<value>Opens a dialog for launching a new SSH or Mosh terminal session.</value>
|
||||
<value>Apre una schermata per la creazione di una sessione SSH o Mosh</value>
|
||||
</data>
|
||||
<data name="MenuItem_QuickLaunch_Text" xml:space="preserve">
|
||||
<value>Avvio rapido...</value>
|
||||
</data>
|
||||
<data name="MenuItem_QuickLaunch_Description" xml:space="preserve">
|
||||
<value>Opens a "Quick Launch" dialog for starting a new terminal session.</value>
|
||||
<value>Apre la schermata di "Avvio rapido" per una nuova sessione di terminale</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewWindow_Text" xml:space="preserve">
|
||||
<value>New Window</value>
|
||||
<value>Nuova finestra</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewTab_Text" xml:space="preserve">
|
||||
<value>New Tab</value>
|
||||
<value>Nuova scheda</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewTab_Description" xml:space="preserve">
|
||||
<value>Launches a session in a new tab.</value>
|
||||
<value>Avvia la sessione in una nuova scheda</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewWindow_Description" xml:space="preserve">
|
||||
<value>Launches a session in a new window.</value>
|
||||
<value>Avvia la sessione in una nuova finestra</value>
|
||||
</data>
|
||||
<data name="AppMenuType.Text" xml:space="preserve">
|
||||
<value>Application menu type</value>
|
||||
<value>Formato menu applicazione</value>
|
||||
</data>
|
||||
<data name="AppMenuType_Flat.Content" xml:space="preserve">
|
||||
<value>Flat, honoring "Open new terminals as" setting</value>
|
||||
<value>Lineare, le azioni seguiranno l'impostazione "Apri i nuovi terminali come"</value>
|
||||
</data>
|
||||
<data name="AppMenuType_Cascading.Content" xml:space="preserve">
|
||||
<value>"New Tab" / "New Window" cascading</value>
|
||||
<value>Menù a cascata "Nuova Scheda" / "Nuova finestra"</value>
|
||||
</data>
|
||||
<data name="Quit.Text" xml:space="preserve">
|
||||
<value>Quit</value>
|
||||
<value>Chiudi</value>
|
||||
</data>
|
||||
<data name="Quit.Description" xml:space="preserve">
|
||||
<value>Quit Fluent Terminal</value>
|
||||
<value>Chiudi Fluent Terminal</value>
|
||||
</data>
|
||||
<data name="EnabledByPolicy" xml:space="preserve">
|
||||
<value>Enabled by policy.</value>
|
||||
<value>Attivato da policy</value>
|
||||
</data>
|
||||
<data name="BackgroundImage.Content" xml:space="preserve">
|
||||
<value>Background image</value>
|
||||
<value>Immagine di sfondo</value>
|
||||
</data>
|
||||
<data name="AcrylicBackground.Header" xml:space="preserve">
|
||||
<value>Use acrylic background</value>
|
||||
<value>Usa la sfumatura acrilica per lo sfondo</value>
|
||||
</data>
|
||||
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this background image?</value>
|
||||
<value>Vuoi davvero eliminare questa immagine di sfondo?</value>
|
||||
</data>
|
||||
<data name="Colors.Text" xml:space="preserve">
|
||||
<value>Colors</value>
|
||||
<value>Colori</value>
|
||||
</data>
|
||||
<data name="BrightColors.Text" xml:space="preserve">
|
||||
<value>Bright colors</value>
|
||||
<value>Colori brillanti</value>
|
||||
</data>
|
||||
<data name="CopyLink" xml:space="preserve">
|
||||
<value>Copy link</value>
|
||||
<value>Copia link</value>
|
||||
</data>
|
||||
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Regex</value>
|
||||
</data>
|
||||
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Whole word</value>
|
||||
<value>Parola intera</value>
|
||||
</data>
|
||||
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Case sensitive</value>
|
||||
<value>Sensibile a maiuscole/minuscole</value>
|
||||
</data>
|
||||
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
|
||||
<value>Copy selection or paste</value>
|
||||
<value>Copia selezione o incolla</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1014,36 +1014,51 @@
|
||||
<value>ポリシーによる許可</value>
|
||||
</data>
|
||||
<data name="BackgroundImage.Content" xml:space="preserve">
|
||||
<value>Background image</value>
|
||||
<value>背景画像</value>
|
||||
</data>
|
||||
<data name="AcrylicBackground.Header" xml:space="preserve">
|
||||
<value>Use acrylic background</value>
|
||||
<value>透過背景</value>
|
||||
</data>
|
||||
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this background image?</value>
|
||||
<value>この背景画像を削除してもよろしいですか?</value>
|
||||
</data>
|
||||
<data name="Colors.Text" xml:space="preserve">
|
||||
<value>Colors</value>
|
||||
<value>色</value>
|
||||
</data>
|
||||
<data name="BrightColors.Text" xml:space="preserve">
|
||||
<value>Bright colors</value>
|
||||
<value>明色</value>
|
||||
</data>
|
||||
<data name="CopyLink" xml:space="preserve">
|
||||
<value>Copy link</value>
|
||||
<value>リンクをコピー</value>
|
||||
</data>
|
||||
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Regex</value>
|
||||
<value>正規表現</value>
|
||||
</data>
|
||||
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Whole word</value>
|
||||
<value>単語単位</value>
|
||||
</data>
|
||||
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Case sensitive</value>
|
||||
<value>大/小文字</value>
|
||||
</data>
|
||||
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
|
||||
<value>Copy selection or paste</value>
|
||||
<value>選択部分のコピーあるいは貼り付け</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1053,6 +1053,21 @@ Fuzzy</comment>
|
||||
<value>Copy selection or paste</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -137,7 +137,7 @@ Fuzzy</comment>
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
<data name="ConfirmWindowClosing.Header" xml:space="preserve">
|
||||
<value>Vraag voor het sluiten van alle window's</value>
|
||||
<value>Vraag voor het sluiten van alle vensters</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 interactive tab's</value>
|
||||
<value>Kleuren in interactieve tab'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>Laat de tab zijn title zien in de title balk</value>
|
||||
<value>Toon de tab naam in de titelbalk</value>
|
||||
<comment>GeneralSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="EditTitle.Text" xml:space="preserve">
|
||||
<value>Verander Title</value>
|
||||
<value>Verander Titel</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 settings toe te passen</value>
|
||||
<value>herstart is nodig om de instellingen 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>Window's</value>
|
||||
<value>Vensters</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>Instellingen</value>
|
||||
<value>Instelling</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 grote</value>
|
||||
<value>Letter grootte</value>
|
||||
<comment>TerminalSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="ImportTheme.Text" xml:space="preserve">
|
||||
<value>Importerne</value>
|
||||
<value>Importeren</value>
|
||||
<comment>ThemeSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="KeyboardShortcut.Header" xml:space="preserve">
|
||||
<value>Keyboard shortcut</value>
|
||||
<value>Sneltoets</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>Middle muisklik</value>
|
||||
<value>Midden 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>Padding</value>
|
||||
<value>Vulling</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>Theme</value>
|
||||
<value>Thema</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 liemiet</value>
|
||||
<value>Terug scrollen limiet</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 style</value>
|
||||
<value>Scrollbar stijl</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>Working directory</value>
|
||||
<value>Werkmap</value>
|
||||
<comment>ShellProfileSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="ConfirmCloseTab" xml:space="preserve">
|
||||
<value>Weet je het zeker dat je tab "{0}" wil sluiten?</value>
|
||||
<value>Weet je zeker dat je tab "{0}" wilt sluiten?</value>
|
||||
<comment>ViewModel
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
<data name="ConfirmCloseWindow" xml:space="preserve">
|
||||
<value>Weet je zeker dat je deze window wil sluiten?</value>
|
||||
<value>Weet je zeker dat je dit venster wilt sluiten?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmDeleteKeybindings" xml:space="preserve">
|
||||
<value>Weet je zeker dat je deze keybinding wil verwijderen?</value>
|
||||
<value>Weet je zeker dat je deze sneltoets wilt verwijderen?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmDeleteTheme" xml:space="preserve">
|
||||
<value>Weet je zeker dat je deze thema wil verwijderen?</value>
|
||||
<value>Weet je zeker dat je dit thema wilt verwijderen?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmDiscardChanges" xml:space="preserve">
|
||||
<value>Weet je zeker dat je alle wijzigingen wil negeeren?</value>
|
||||
<value>Weet je zeker dat je alle wijzigingen wilt negeren?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmRestoreGeneralSettings" xml:space="preserve">
|
||||
<value>Weet je zeker dat je de algemene instellingen wil terug zetten naar de standaard instellingen?</value>
|
||||
<value>Weet je zeker dat je de algemene instellingen wilt 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 will terug zetten naar de standaard instellingen?</value>
|
||||
<value>Weet je zeker dat je de keybindings wilt 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 will terug zetten naar de standaard instellingen?</value>
|
||||
<value>Weet je zeker dat je de muis instellingen wilt 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 wil herstellen?</value>
|
||||
<value>Weet je zeker dat je dit profiel wilt herstellen?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ConfirmRestoreTerminalOptions" xml:space="preserve">
|
||||
<value>Weet je zeker dat je wil terug gaan naar de standaard terminal instellingen?</value>
|
||||
<value>Weet je zeker dat je de standaard terminal instellingen wilt herstellen?</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="DisabledByPolicy" xml:space="preserve">
|
||||
<value>Uitgeschakeld door policy.</value>
|
||||
<value>Uitgeschakeld door beleid.</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="DisabledByUser" xml:space="preserve">
|
||||
<value>Uit gezet door gebruiker. Activeer het opnieuw in de automaties starten tab in Taak Beheer.</value>
|
||||
<value>Uitgezet door gebruiker. Activeer deze opnieuw in de automatisch starten tab in Taak Beheer.</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="EditTitleString" xml:space="preserve">
|
||||
<value>Verander Title</value>
|
||||
<value>Verander Titel</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 error:</value>
|
||||
<value>De actie kan niet worden voltooid door de volgende fout:</value>
|
||||
<comment>ViewModel</comment>
|
||||
</data>
|
||||
<data name="ImportThemeFailed" xml:space="preserve">
|
||||
<value>Inporteren van theme mislukt</value>
|
||||
<value>Inporteren van thema 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 keybinding nu in</value>
|
||||
<value>Voer de sneltoets nu in</value>
|
||||
</data>
|
||||
<data name="OK" xml:space="preserve">
|
||||
<value>Oke</value>
|
||||
<value>Oké</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 title</value>
|
||||
<value>Verander tab titel</value>
|
||||
<comment>Command
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
@@ -662,7 +662,7 @@ Fuzzy</comment>
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
<data name="Keybindings.Text" xml:space="preserve">
|
||||
<value>Keybindings</value>
|
||||
<value>Sneltoetsen</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>Nieuwe window</value>
|
||||
<value>Nieuw venster</value>
|
||||
<comment>Command
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
@@ -710,7 +710,7 @@ Fuzzy</comment>
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
<data name="Command.ShowSettings" xml:space="preserve">
|
||||
<value>Laat settings zien</value>
|
||||
<value>Laat instellingen 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 Fullscreen</value>
|
||||
<value>Schakel naar volledig scherm</value>
|
||||
<comment>Command
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
<data name="Command.ToggleWindow" xml:space="preserve">
|
||||
<value>Schakel naar window</value>
|
||||
<value>Schakel naar venster</value>
|
||||
<comment>Command
|
||||
Fuzzy</comment>
|
||||
</data>
|
||||
<data name="NewSshTab.Text" xml:space="preserve">
|
||||
<value>Nieuwe remote tab</value>
|
||||
<value>Nieuwe externe 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>port</value>
|
||||
<value>poort</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>Advanced</value>
|
||||
<value>Geavanceerd</value>
|
||||
</data>
|
||||
<data name="MoshPorts.Text" xml:space="preserve">
|
||||
<value>Mosh poorten:</value>
|
||||
</data>
|
||||
<data name="SaveShortcutButton.Content" xml:space="preserve">
|
||||
<value>Shortcut opslaan</value>
|
||||
<value>Sneltoets 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 Input</value>
|
||||
<value>Ongeldige Invoer</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 azijn verplichte velden.</value>
|
||||
<value>Gebruiker en host zijn 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 port moet meer dan nul zijn.</value>
|
||||
<value>SSH poort moet groter 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 output</value>
|
||||
<value>Nieuwe uitvoer</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 deze profiel wil verwijderen?</value>
|
||||
<value>Weet je zeker dat je dit profiel wilt verwijderen?</value>
|
||||
</data>
|
||||
<data name="Command.NewSshWindow" xml:space="preserve">
|
||||
<value>Nieuwe SSH window</value>
|
||||
<value>Nieuw SSH venster</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 geimporteerd van bestand</value>
|
||||
<value>Instellingen zijn geïmporteerd van bestand</value>
|
||||
</data>
|
||||
<data name="SshConnectionInfoValidationResult.IdentityFileDoesNotExist" xml:space="preserve">
|
||||
<value>Identitijt bestaat niet, Identitijt bestand bestaat niet</value>
|
||||
<value>Identiteit bestaat niet, Identiteit 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>Locaatsie kan niet leeg zijn.</value>
|
||||
<value>Locatie 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. 'ssh gebruikersnaam@host')</value>
|
||||
</data>
|
||||
<data name="CommandLine.Header" xml:space="preserve">
|
||||
<value>Command</value>
|
||||
<value>Commando</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 snelle uitvoeren window</value>
|
||||
<value>Nieuw snel uitvoeren venster</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>Drop tab here</value>
|
||||
<value>Plaats tab hier</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 envourment variables met dezelfde naam hebben.</value>
|
||||
<value>Kan niet 2 omgeving variabelen met dezelfde naam hebben.</value>
|
||||
</data>
|
||||
<data name="EmptyEnvironmentVariableName" xml:space="preserve">
|
||||
<value>Kan geen envourment variable aanmaken zonder een naam.</value>
|
||||
<value>Kan geen omgeving variabele aanmaken zonder een naam.</value>
|
||||
</data>
|
||||
<data name="EnvironmentVariables.Text" xml:space="preserve">
|
||||
<value>Environment variables</value>
|
||||
<value>Omgeving variabelen</value>
|
||||
</data>
|
||||
<data name="CloseSearchPanel.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Sluit zoek balk</value>
|
||||
<value>Sluit zoekbalk</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>Enter zoek term</value>
|
||||
<value>Voer zoekterm in</value>
|
||||
</data>
|
||||
<data name="Search.Text" xml:space="preserve">
|
||||
<value>Zoekken</value>
|
||||
<value>Zoeken</value>
|
||||
</data>
|
||||
<data name="PrintableOutputOnly.Content" xml:space="preserve">
|
||||
<value>Print output alleen</value>
|
||||
<value>Print alleen uitvoer</value>
|
||||
<comment>Fuzzy</comment>
|
||||
</data>
|
||||
<data name="EnableLogging.Header" xml:space="preserve">
|
||||
<value>Log output voor debugging</value>
|
||||
<value>Log uitvoer voor debugging</value>
|
||||
</data>
|
||||
<data name="WordSeparator.Header" xml:space="preserve">
|
||||
<value>Woord scheidingstekens</value>
|
||||
@@ -1015,99 +1015,114 @@ Fuzzy</comment>
|
||||
<value>Recent</value>
|
||||
</data>
|
||||
<data name="NewTab_Description" xml:space="preserve">
|
||||
<value>Opens default profile in a new tab.</value>
|
||||
<value>Opent standaard profiel in een nieuw 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>Opens "Quick Launch" dialog and starts session in a new tab.</value>
|
||||
<value>Opent "Snel Laden" dialoog en start een sessie in een nieuwe tab</value>
|
||||
</data>
|
||||
<data name="Settings_Description" xml:space="preserve">
|
||||
<value>Opens settings window.</value>
|
||||
<value>Opent het instellingen venster</value>
|
||||
</data>
|
||||
<data name="About_Description" xml:space="preserve">
|
||||
<value>Basic info about the app.</value>
|
||||
<value>Basisinformatie over de applicatie.</value>
|
||||
</data>
|
||||
<data name="Recent_Description" xml:space="preserve">
|
||||
<value>Recently opened sessions.</value>
|
||||
<value>Recentelijk geopende sessies.</value>
|
||||
</data>
|
||||
<data name="MenuItem_DefaultProfile_Description" xml:space="preserve">
|
||||
<value>Starts new terminal session based on the default profile.</value>
|
||||
<value>Start een nieuwe Terminal sessie, gebaseerd op het standaard profiel.</value>
|
||||
</data>
|
||||
<data name="MenuItem_Remote_Text" xml:space="preserve">
|
||||
<value>Remote Connect...</value>
|
||||
<value>Extern verbinden...</value>
|
||||
</data>
|
||||
<data name="MenuItem_Remote_Description" xml:space="preserve">
|
||||
<value>Opens a dialog for launching a new SSH or Mosh terminal session.</value>
|
||||
<value>Opent een dialoog voor het starten van een nieuwe SSH of Mosh Terminal sessie.</value>
|
||||
</data>
|
||||
<data name="MenuItem_QuickLaunch_Text" xml:space="preserve">
|
||||
<value>Quick Launch...</value>
|
||||
<value>Snel Laden...</value>
|
||||
</data>
|
||||
<data name="MenuItem_QuickLaunch_Description" xml:space="preserve">
|
||||
<value>Opens a "Quick Launch" dialog for starting a new terminal session.</value>
|
||||
<value>Opent een "Snel Laden" dialoog om een nieuwe Terminal sessie te starten.</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewWindow_Text" xml:space="preserve">
|
||||
<value>New Window</value>
|
||||
<value>Nieuw Venster</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewTab_Text" xml:space="preserve">
|
||||
<value>New Tab</value>
|
||||
<value>Nieuwe Tab</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewTab_Description" xml:space="preserve">
|
||||
<value>Launches a session in a new tab.</value>
|
||||
<value>Start een sessie in een nieuw tab</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewWindow_Description" xml:space="preserve">
|
||||
<value>Launches a session in a new window.</value>
|
||||
<value>Start een sessie in een nieuw venster.</value>
|
||||
</data>
|
||||
<data name="AppMenuType.Text" xml:space="preserve">
|
||||
<value>Application menu type</value>
|
||||
<value>Applicatie menu type</value>
|
||||
</data>
|
||||
<data name="AppMenuType_Flat.Content" xml:space="preserve">
|
||||
<value>Flat, honoring "Open new terminals as" setting</value>
|
||||
<value>Plat, naar de "Open nieuwe terminals als" instelling</value>
|
||||
</data>
|
||||
<data name="AppMenuType_Cascading.Content" xml:space="preserve">
|
||||
<value>"New Tab" / "New Window" cascading</value>
|
||||
<value>"Nieuw Tab" / "Nieuw Venster" trapsgewijs</value>
|
||||
</data>
|
||||
<data name="Quit.Text" xml:space="preserve">
|
||||
<value>Quit</value>
|
||||
<value>Stop</value>
|
||||
</data>
|
||||
<data name="Quit.Description" xml:space="preserve">
|
||||
<value>Quit Fluent Terminal</value>
|
||||
<value>Stop Fluent Terminal</value>
|
||||
</data>
|
||||
<data name="EnabledByPolicy" xml:space="preserve">
|
||||
<value>Enabled by policy.</value>
|
||||
<value>Aangezet doot beleid.</value>
|
||||
</data>
|
||||
<data name="BackgroundImage.Content" xml:space="preserve">
|
||||
<value>Background image</value>
|
||||
<value>Achtergrond afbeelding</value>
|
||||
</data>
|
||||
<data name="AcrylicBackground.Header" xml:space="preserve">
|
||||
<value>Use acrylic background</value>
|
||||
<value>Gebruik een acryl achtergrond</value>
|
||||
</data>
|
||||
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this background image?</value>
|
||||
<value>Weet je zeker dat je deze achtergrond wilt verwijderen?</value>
|
||||
</data>
|
||||
<data name="Colors.Text" xml:space="preserve">
|
||||
<value>Colors</value>
|
||||
<value>Kleuren</value>
|
||||
</data>
|
||||
<data name="BrightColors.Text" xml:space="preserve">
|
||||
<value>Bright colors</value>
|
||||
<value>Felle kleuren</value>
|
||||
</data>
|
||||
<data name="CopyLink" xml:space="preserve">
|
||||
<value>Copy link</value>
|
||||
<value>Kopieer link</value>
|
||||
</data>
|
||||
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Regex</value>
|
||||
</data>
|
||||
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Whole word</value>
|
||||
<value>Heel woord</value>
|
||||
</data>
|
||||
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Case sensitive</value>
|
||||
<value>Hoofdlettergevoelig</value>
|
||||
</data>
|
||||
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
|
||||
<value>Copy selection or paste</value>
|
||||
<value>Kopieer selectie of plak</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<value>Gebruik slimme buffer</value>
|
||||
</data>
|
||||
</root>
|
||||
<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>
|
||||
@@ -154,9 +154,8 @@
|
||||
<comment>XtermTerminalView.xaml.cs</comment>
|
||||
</data>
|
||||
<data name="CustomTitle.Header" xml:space="preserve">
|
||||
<value>Pokaż</value>
|
||||
<comment>GeneralSettings.xaml
|
||||
Fuzzy</comment>
|
||||
<value>Pokaż niestandardowe tytuły kart także w pasku tytułu</value>
|
||||
<comment>GeneralSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="EditTitle.Text" xml:space="preserve">
|
||||
<value>Zmień tytuł</value>
|
||||
@@ -772,13 +771,13 @@ Fuzzy</comment>
|
||||
<value>Port nie może być 0</value>
|
||||
</data>
|
||||
<data name="UserAndHostMandatory" xml:space="preserve">
|
||||
<value>Użytkownik i IP są niezbędne</value>
|
||||
<value>Użytkownik i adres hosta 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>IP nie może być puste</value>
|
||||
<value>Adres hosta nie może być pusty</value>
|
||||
</data>
|
||||
<data name="SshConnectionInfoValidationResult.SshPortZeroOrNegative" xml:space="preserve">
|
||||
<value>Port SSH musi być większy od 0</value>
|
||||
@@ -949,102 +948,117 @@ Fuzzy</comment>
|
||||
<value>Znaki seperujące słowa</value>
|
||||
</data>
|
||||
<data name="Recent.Text" xml:space="preserve">
|
||||
<value>Recent</value>
|
||||
<value>Ostatnie</value>
|
||||
</data>
|
||||
<data name="NewTab_Description" xml:space="preserve">
|
||||
<value>Opens default profile in a new tab.</value>
|
||||
<value>Otwórz domyślny profil w nowej karcie.</value>
|
||||
</data>
|
||||
<data name="NewSshTab_Description" xml:space="preserve">
|
||||
<value>Opens a new SSH or Mosh session in a new tab.</value>
|
||||
<value>Otwórz nową sesję SSH lub Mosh w nowej karcie.</value>
|
||||
</data>
|
||||
<data name="NewQuickTab_Description" xml:space="preserve">
|
||||
<value>Opens "Quick Launch" dialog and starts session in a new tab.</value>
|
||||
<value>Otwiera okno dialogowe "Szybkie uruchomienie" i rozpoczyna sesję w nowej karcie.</value>
|
||||
</data>
|
||||
<data name="Settings_Description" xml:space="preserve">
|
||||
<value>Opens settings window.</value>
|
||||
<value>Otwórz okno ustawień.</value>
|
||||
</data>
|
||||
<data name="About_Description" xml:space="preserve">
|
||||
<value>Basic info about the app.</value>
|
||||
<value>Podstawowe informacje o aplikacji.</value>
|
||||
</data>
|
||||
<data name="Recent_Description" xml:space="preserve">
|
||||
<value>Recently opened sessions.</value>
|
||||
<value>Niedawno otwarte sesje.</value>
|
||||
</data>
|
||||
<data name="MenuItem_DefaultProfile_Description" xml:space="preserve">
|
||||
<value>Starts new terminal session based on the default profile.</value>
|
||||
<value>Rozpoczyna nowa sesję terminala bazującą na domyślnym profilu.</value>
|
||||
</data>
|
||||
<data name="MenuItem_Remote_Text" xml:space="preserve">
|
||||
<value>Remote Connect...</value>
|
||||
<value>Połącz zdalnie...</value>
|
||||
</data>
|
||||
<data name="MenuItem_Remote_Description" xml:space="preserve">
|
||||
<value>Opens a dialog for launching a new SSH or Mosh terminal session.</value>
|
||||
<value>Otwiera okno dialogowe do rozpoczynania nowej sesji terminala SSH lub Mosh.</value>
|
||||
</data>
|
||||
<data name="MenuItem_QuickLaunch_Text" xml:space="preserve">
|
||||
<value>Quick Launch...</value>
|
||||
<value>Szybkie uruchomienie...</value>
|
||||
</data>
|
||||
<data name="MenuItem_QuickLaunch_Description" xml:space="preserve">
|
||||
<value>Opens a "Quick Launch" dialog for starting a new terminal session.</value>
|
||||
<value>Otwiera okno dialogowe "Szybkie uruchomienie" aby rozpocząć nową sesje terminala.</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewWindow_Text" xml:space="preserve">
|
||||
<value>New Window</value>
|
||||
<value>Nowe okno</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewTab_Text" xml:space="preserve">
|
||||
<value>New Tab</value>
|
||||
<value>Nowa Karta</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewTab_Description" xml:space="preserve">
|
||||
<value>Launches a session in a new tab.</value>
|
||||
<value>Otwiera sesję w nowej karcie.</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewWindow_Description" xml:space="preserve">
|
||||
<value>Launches a session in a new window.</value>
|
||||
<value>Otwiera sesję w nowym oknie.</value>
|
||||
</data>
|
||||
<data name="AppMenuType.Text" xml:space="preserve">
|
||||
<value>Application menu type</value>
|
||||
<value>Typ menu aplikacji</value>
|
||||
</data>
|
||||
<data name="AppMenuType_Flat.Content" xml:space="preserve">
|
||||
<value>Flat, honoring "Open new terminals as" setting</value>
|
||||
<value>Płaskie, przestrzegające ustawienia "Otwórz nowe terminale jako".</value>
|
||||
</data>
|
||||
<data name="AppMenuType_Cascading.Content" xml:space="preserve">
|
||||
<value>"New Tab" / "New Window" cascading</value>
|
||||
<value>"Nowa karta" / "Nowe okno" kaskadowo</value>
|
||||
</data>
|
||||
<data name="Quit.Text" xml:space="preserve">
|
||||
<value>Quit</value>
|
||||
<value>Zakończ</value>
|
||||
</data>
|
||||
<data name="Quit.Description" xml:space="preserve">
|
||||
<value>Quit Fluent Terminal</value>
|
||||
<value>Wyjdź z Fluent Terminal</value>
|
||||
</data>
|
||||
<data name="EnabledByPolicy" xml:space="preserve">
|
||||
<value>Enabled by policy.</value>
|
||||
<value>Włączone przez polityke.</value>
|
||||
</data>
|
||||
<data name="BackgroundImage.Content" xml:space="preserve">
|
||||
<value>Background image</value>
|
||||
<value>Obraz tła</value>
|
||||
</data>
|
||||
<data name="AcrylicBackground.Header" xml:space="preserve">
|
||||
<value>Use acrylic background</value>
|
||||
<value>Użyj akrylowego tła</value>
|
||||
</data>
|
||||
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this background image?</value>
|
||||
<value>Czy na pewno chcesz usunąć ten obraz tła?</value>
|
||||
</data>
|
||||
<data name="Colors.Text" xml:space="preserve">
|
||||
<value>Colors</value>
|
||||
<value>Kolory</value>
|
||||
</data>
|
||||
<data name="BrightColors.Text" xml:space="preserve">
|
||||
<value>Bright colors</value>
|
||||
<value>Jasne kolory</value>
|
||||
</data>
|
||||
<data name="CopyLink" xml:space="preserve">
|
||||
<value>Copy link</value>
|
||||
<value>Skopiuj łącze</value>
|
||||
</data>
|
||||
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Regex</value>
|
||||
</data>
|
||||
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Whole word</value>
|
||||
<value>Całe słowo</value>
|
||||
</data>
|
||||
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Case sensitive</value>
|
||||
<value>Uwzględnij wielkość liter</value>
|
||||
</data>
|
||||
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
|
||||
<value>Copy selection or paste</value>
|
||||
<value>Skopiuj zaznaczenie lub wklej</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -230,9 +230,8 @@
|
||||
<comment>MainPage.xaml</comment>
|
||||
</data>
|
||||
<data name="SystemTray.Header" xml:space="preserve">
|
||||
<value>Exibir em segundo plano</value>
|
||||
<comment>GeneralSettings.xaml
|
||||
Fuzzy</comment>
|
||||
<value>Exibir na bandeja do sistema</value>
|
||||
<comment>GeneralSettings.xaml</comment>
|
||||
</data>
|
||||
<data name="TabsPostion.Text" xml:space="preserve">
|
||||
<value>Exibir abas em</value>
|
||||
@@ -1015,36 +1014,51 @@ Fuzzy</comment>
|
||||
<value>Habilitado pela política</value>
|
||||
</data>
|
||||
<data name="BackgroundImage.Content" xml:space="preserve">
|
||||
<value>Background image</value>
|
||||
<value>Imagem de fundo</value>
|
||||
</data>
|
||||
<data name="AcrylicBackground.Header" xml:space="preserve">
|
||||
<value>Use acrylic background</value>
|
||||
<value>Usar fundo acrílico</value>
|
||||
</data>
|
||||
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this background image?</value>
|
||||
<value>Tem certeza que deseja remover esta imagem de fundo?</value>
|
||||
</data>
|
||||
<data name="Colors.Text" xml:space="preserve">
|
||||
<value>Colors</value>
|
||||
<value>Cores</value>
|
||||
</data>
|
||||
<data name="BrightColors.Text" xml:space="preserve">
|
||||
<value>Bright colors</value>
|
||||
<value>Cores claras</value>
|
||||
</data>
|
||||
<data name="CopyLink" xml:space="preserve">
|
||||
<value>Copy link</value>
|
||||
<value>Copiar link</value>
|
||||
</data>
|
||||
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Regex</value>
|
||||
</data>
|
||||
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Whole word</value>
|
||||
<value>Toda a palavra</value>
|
||||
</data>
|
||||
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Case sensitive</value>
|
||||
<value>Sensível à maiúsculas</value>
|
||||
</data>
|
||||
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
|
||||
<value>Copy selection or paste</value>
|
||||
<value>Copiar seleção ou colar</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1014,36 +1014,51 @@
|
||||
<value>Activat de politică.</value>
|
||||
</data>
|
||||
<data name="BackgroundImage.Content" xml:space="preserve">
|
||||
<value>Background image</value>
|
||||
<value>Imagine de fundal</value>
|
||||
</data>
|
||||
<data name="AcrylicBackground.Header" xml:space="preserve">
|
||||
<value>Use acrylic background</value>
|
||||
<value>Folosiți fundal acrilic</value>
|
||||
</data>
|
||||
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this background image?</value>
|
||||
<value>Sigur doriți să ștergeți această imagine de fundal?</value>
|
||||
</data>
|
||||
<data name="Colors.Text" xml:space="preserve">
|
||||
<value>Colors</value>
|
||||
<value>Culori</value>
|
||||
</data>
|
||||
<data name="BrightColors.Text" xml:space="preserve">
|
||||
<value>Bright colors</value>
|
||||
<value>Culori deschise</value>
|
||||
</data>
|
||||
<data name="CopyLink" xml:space="preserve">
|
||||
<value>Copy link</value>
|
||||
<value>Copiere link</value>
|
||||
</data>
|
||||
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Regex</value>
|
||||
</data>
|
||||
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Whole word</value>
|
||||
<value>Întregul cuvânt</value>
|
||||
</data>
|
||||
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Case sensitive</value>
|
||||
<value>Potrivire litere</value>
|
||||
</data>
|
||||
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
|
||||
<value>Copy selection or paste</value>
|
||||
<value>Copiați selecția sau lipiți</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -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>C порта</value>
|
||||
<value>От порта</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,6 +1045,21 @@
|
||||
<value>Скопировать выделение или вставить</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1044,6 +1044,21 @@
|
||||
<value>Copy selection or paste</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</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,102 +968,117 @@ Fuzzy</comment>
|
||||
<value>单词分隔符</value>
|
||||
</data>
|
||||
<data name="Recent.Text" xml:space="preserve">
|
||||
<value>Recent</value>
|
||||
<value>最近</value>
|
||||
</data>
|
||||
<data name="NewTab_Description" xml:space="preserve">
|
||||
<value>Opens default profile in a new tab.</value>
|
||||
<value>在新标签打开默认配置。</value>
|
||||
</data>
|
||||
<data name="NewSshTab_Description" xml:space="preserve">
|
||||
<value>Opens a new SSH or Mosh session in a new tab.</value>
|
||||
<value>从新标签页打开SSH或Mosh会话</value>
|
||||
</data>
|
||||
<data name="NewQuickTab_Description" xml:space="preserve">
|
||||
<value>Opens "Quick Launch" dialog and starts session in a new tab.</value>
|
||||
<value>打开“快速启动”对话框并在新标签中开启会话。</value>
|
||||
</data>
|
||||
<data name="Settings_Description" xml:space="preserve">
|
||||
<value>Opens settings window.</value>
|
||||
<value>打开设置页面</value>
|
||||
</data>
|
||||
<data name="About_Description" xml:space="preserve">
|
||||
<value>Basic info about the app.</value>
|
||||
<value>关于</value>
|
||||
</data>
|
||||
<data name="Recent_Description" xml:space="preserve">
|
||||
<value>Recently opened sessions.</value>
|
||||
<value>最近打开的会话</value>
|
||||
</data>
|
||||
<data name="MenuItem_DefaultProfile_Description" xml:space="preserve">
|
||||
<value>Starts new terminal session based on the default profile.</value>
|
||||
<value>基于默认配置开启新的终端会话。</value>
|
||||
</data>
|
||||
<data name="MenuItem_Remote_Text" xml:space="preserve">
|
||||
<value>Remote Connect...</value>
|
||||
<value>远程连接</value>
|
||||
</data>
|
||||
<data name="MenuItem_Remote_Description" xml:space="preserve">
|
||||
<value>Opens a dialog for launching a new SSH or Mosh terminal session.</value>
|
||||
<value>打开对话框开启新的 SSH 或 Mosh 终端会话。</value>
|
||||
</data>
|
||||
<data name="MenuItem_QuickLaunch_Text" xml:space="preserve">
|
||||
<value>Quick Launch...</value>
|
||||
<value>快捷启动</value>
|
||||
</data>
|
||||
<data name="MenuItem_QuickLaunch_Description" xml:space="preserve">
|
||||
<value>Opens a "Quick Launch" dialog for starting a new terminal session.</value>
|
||||
<value>打开“快速启动”对话框并开启终端会话。</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewWindow_Text" xml:space="preserve">
|
||||
<value>New Window</value>
|
||||
<value>新建窗口</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewTab_Text" xml:space="preserve">
|
||||
<value>New Tab</value>
|
||||
<value>新建标签页</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewTab_Description" xml:space="preserve">
|
||||
<value>Launches a session in a new tab.</value>
|
||||
<value>从新标签页启动会话</value>
|
||||
</data>
|
||||
<data name="MenuItem_NewWindow_Description" xml:space="preserve">
|
||||
<value>Launches a session in a new window.</value>
|
||||
<value>从新窗口启动会话</value>
|
||||
</data>
|
||||
<data name="AppMenuType.Text" xml:space="preserve">
|
||||
<value>Application menu type</value>
|
||||
<value>应用菜单类型</value>
|
||||
</data>
|
||||
<data name="AppMenuType_Flat.Content" xml:space="preserve">
|
||||
<value>Flat, honoring "Open new terminals as" setting</value>
|
||||
<value>扁平,荣耀的“打开新的终端”设置</value>
|
||||
</data>
|
||||
<data name="AppMenuType_Cascading.Content" xml:space="preserve">
|
||||
<value>"New Tab" / "New Window" cascading</value>
|
||||
<value>“新标签”/“新窗口”级联菜单</value>
|
||||
</data>
|
||||
<data name="Quit.Text" xml:space="preserve">
|
||||
<value>Quit</value>
|
||||
<value>退出</value>
|
||||
</data>
|
||||
<data name="Quit.Description" xml:space="preserve">
|
||||
<value>Quit Fluent Terminal</value>
|
||||
<value>退出关于</value>
|
||||
</data>
|
||||
<data name="EnabledByPolicy" xml:space="preserve">
|
||||
<value>Enabled by policy.</value>
|
||||
<value>根据策略启用。</value>
|
||||
</data>
|
||||
<data name="BackgroundImage.Content" xml:space="preserve">
|
||||
<value>Background image</value>
|
||||
<value>背景图片</value>
|
||||
</data>
|
||||
<data name="AcrylicBackground.Header" xml:space="preserve">
|
||||
<value>Use acrylic background</value>
|
||||
<value>使用亚克力背景</value>
|
||||
</data>
|
||||
<data name="ConfirmDeleteBackgroundImage" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this background image?</value>
|
||||
<value>你确定你想要删除这个背景图片吗?</value>
|
||||
</data>
|
||||
<data name="Colors.Text" xml:space="preserve">
|
||||
<value>Colors</value>
|
||||
<value>颜色</value>
|
||||
</data>
|
||||
<data name="BrightColors.Text" xml:space="preserve">
|
||||
<value>Bright colors</value>
|
||||
<value>亮色</value>
|
||||
</data>
|
||||
<data name="CopyLink" xml:space="preserve">
|
||||
<value>Copy link</value>
|
||||
<value>复制链接</value>
|
||||
</data>
|
||||
<data name="SearchWithRegex.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Regex</value>
|
||||
<value>正则表达式</value>
|
||||
</data>
|
||||
<data name="SearchWholeWord.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Whole word</value>
|
||||
<value>全字匹配</value>
|
||||
</data>
|
||||
<data name="SearchCaseSensitive.ToolTipService.ToolTip" xml:space="preserve">
|
||||
<value>Case sensitive</value>
|
||||
<value>大小写敏感</value>
|
||||
</data>
|
||||
<data name="MouseCopySelectionOrPaste.Content" xml:space="preserve">
|
||||
<value>Copy selection or paste</value>
|
||||
<value>复制或者粘贴选中的文本</value>
|
||||
</data>
|
||||
<data name="UseBuffer" xml:space="preserve">
|
||||
<value>Use buffer</value>
|
||||
<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>
|
||||
</data>
|
||||
</root>
|
||||
@@ -249,13 +249,6 @@
|
||||
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"
|
||||
@@ -283,11 +276,11 @@
|
||||
Style="{StaticResource SubtitleTextBlockStyle}"
|
||||
Text="{x:Bind Name, Mode=OneWay}" />
|
||||
|
||||
<controls:HeaderedTextBlock
|
||||
<controls:HeaderedContentControl
|
||||
x:Uid="ShellLocation"
|
||||
Margin="{StaticResource ItemMargin}"
|
||||
Header="Shell executable location"
|
||||
Text="{x:Bind ProfileVm.Location, Mode=OneWay}" />
|
||||
Content="{x:Bind ProfileVm.Location, Mode=OneWay}" />
|
||||
|
||||
<controls:HeaderedContentControl
|
||||
x:Uid="WorkingDir"
|
||||
@@ -350,18 +343,6 @@
|
||||
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,12 +291,6 @@
|
||||
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"
|
||||
@@ -468,19 +462,6 @@
|
||||
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"
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
RelativePanel.AlignRightWithPanel="True"
|
||||
Visibility="{x:Bind IsUnderlined, Mode=OneWay, Converter={StaticResource TrueToVisibleConverter}}" />
|
||||
<Grid
|
||||
x:Name="HasExitedWithError"
|
||||
x:Name="HasExitedWithErrorGrid"
|
||||
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="HasExitedWithError"
|
||||
RelativePanel.RightOf="HasExitedWithErrorGrid"
|
||||
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="Close"
|
||||
ToolTipService.ToolTip="{x:Bind Converter={StaticResource I18NConverter}, ConverterParameter=Close}"
|
||||
Visibility="{x:Bind ShowCloseButton, Mode=OneWay, Converter={StaticResource TrueToVisibleConverter}}">
|
||||
<Viewbox Width="12" Height="12">
|
||||
<SymbolIcon Symbol="Cancel" />
|
||||
|
||||
@@ -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:settings="using:FluentTerminal.App.ViewModels.Settings"
|
||||
xmlns:views="using:FluentTerminal.App.Views">
|
||||
<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="" />
|
||||
<TextBlock Text="{x:Bind Name, Mode=OneWay}" />
|
||||
Margin="0,0,6,0"
|
||||
FontFamily="{StaticResource SymbolThemeFontFamily}"
|
||||
Glyph="" />
|
||||
<TextBlock Text="{x:Bind Name, Mode=OneTime, Converter={StaticResource I18NConverter}}" />
|
||||
</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="" />
|
||||
<TextBlock Text="{x:Bind Name, Mode=OneWay}" />
|
||||
Margin="0,0,6,0"
|
||||
FontFamily="{StaticResource SymbolThemeFontFamily}"
|
||||
Foreground="{x:Bind Color}"
|
||||
Glyph="" />
|
||||
<TextBlock Text="{x:Bind Name, Mode=OneTime, Converter={StaticResource I18NConverter}}" />
|
||||
</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>
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
Width="16"
|
||||
Height="16"
|
||||
Margin="6,0,0,0">
|
||||
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="" />
|
||||
<SymbolIcon Symbol="Find" />
|
||||
</Viewbox>
|
||||
<TextBox
|
||||
Name="SearchTextBox"
|
||||
@@ -47,7 +47,9 @@
|
||||
IsTabStop="True"
|
||||
KeyUp="OnSearchTextBoxKeyUp"
|
||||
PlaceholderText="Enter search term"
|
||||
Text="{x:Bind ViewModel.SearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
|
||||
Text="{x:Bind ViewModel.SearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
GotFocus="SearchTextBox_GotFocus"
|
||||
LostFocus="SearchTextBox_LostFocus">
|
||||
<Interactivity:Interaction.Behaviors>
|
||||
<Core:DataTriggerBehavior Binding="{x:Bind ViewModel.ShowSearchPanel, Mode=OneWay}" Value="true">
|
||||
<actions:FocusAction />
|
||||
@@ -124,5 +126,34 @@
|
||||
</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>
|
||||
@@ -28,6 +28,7 @@ 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);
|
||||
@@ -54,6 +55,7 @@ namespace FluentTerminal.App.Views
|
||||
ViewModel.ThemeChanged -= OnThemeChanged;
|
||||
ViewModel.FindNextRequested -= OnFindNextRequested;
|
||||
ViewModel.FindPreviousRequested -= OnFindPreviousRequested;
|
||||
ViewModel.FontSizeChanged -= OnFontSizeChanged;
|
||||
|
||||
ViewModel = null;
|
||||
}
|
||||
@@ -107,10 +109,14 @@ 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;
|
||||
@@ -132,5 +138,15 @@ 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,6 +118,7 @@ namespace FluentTerminal.App.Views
|
||||
|
||||
public event EventHandler<object> OnOutput;
|
||||
public event EventHandler<string> OnPaste;
|
||||
public event EventHandler<string> OnSessionRestart;
|
||||
|
||||
public XtermTerminalView()
|
||||
{
|
||||
@@ -179,6 +180,16 @@ 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)
|
||||
@@ -224,7 +235,31 @@ 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;
|
||||
@@ -255,12 +290,6 @@ 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
|
||||
@@ -274,14 +303,8 @@ namespace FluentTerminal.App.Views
|
||||
}
|
||||
}
|
||||
|
||||
var response = await ViewModel.Terminal.StartShellProcessAsync(ViewModel.ShellProfile, size, sessionType, ViewModel.XtermBufferState).ConfigureAwait(false);
|
||||
if (!response.Success)
|
||||
if (false == await StartShellProcessAsync(size).ConfigureAwait(false))
|
||||
{
|
||||
await Dispatcher.ExecuteAsync(async () =>
|
||||
await ViewModel.DialogService.ShowMessageDialogAsync("Error", response.Error, DialogButton.OK))
|
||||
.ConfigureAwait(false);
|
||||
|
||||
ViewModel.Terminal.ReportLauchFailed();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -562,5 +585,25 @@ 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,17 +10,17 @@
|
||||
"author": "FS Apps",
|
||||
"license": "GPL-3.0",
|
||||
"devDependencies": {
|
||||
"ts-loader": "^6.0.2",
|
||||
"typescript": "^3.5.1",
|
||||
"webpack": "^4.29.6",
|
||||
"webpack-cli": "^3.2.3"
|
||||
"ts-loader": "^7.0.5",
|
||||
"typescript": "^3.9.5",
|
||||
"webpack": "^4.43.0",
|
||||
"webpack-cli": "^3.3.12"
|
||||
},
|
||||
"dependencies": {
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ 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;
|
||||
@@ -29,6 +30,8 @@ let searchAddon: SearchAddon;
|
||||
let serializeAddon: SerializeAddon;
|
||||
let webLinksAddon: WebLinksAddon;
|
||||
let unicode11Addon: Unicode11Addon;
|
||||
let altGrPressed = false;
|
||||
let filterOutOpenSSHOutput = false;
|
||||
|
||||
const terminalContainer = document.getElementById('terminal-container');
|
||||
|
||||
@@ -42,6 +45,13 @@ function DecodeSpecialChars(data: string) {
|
||||
return replaceAll("\", "\\", data);
|
||||
}
|
||||
|
||||
window.setFontSize = (fontSize: number) => {
|
||||
if (fontSize > 0) {
|
||||
term.setOption('fontSize', fontSize);
|
||||
fitAddon.fit();
|
||||
}
|
||||
}
|
||||
|
||||
window.serializeTerminal = () => {
|
||||
let serialized = serializeAddon.serialize();
|
||||
return serialized;
|
||||
@@ -101,7 +111,46 @@ 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);
|
||||
});
|
||||
|
||||
@@ -135,7 +184,7 @@ window.createTerminal = (options, theme, keyBindings) => {
|
||||
|
||||
setPadding(options.padding);
|
||||
|
||||
let resizeTimeout: any;
|
||||
let resizeTimeout: number;
|
||||
window.onresize = function () {
|
||||
clearTimeout(resizeTimeout);
|
||||
resizeTimeout = setTimeout(() => fitAddon.fit(), 500);
|
||||
@@ -165,9 +214,16 @@ window.createTerminal = (options, theme, keyBindings) => {
|
||||
});
|
||||
|
||||
term.attachCustomKeyEventHandler(function (e) {
|
||||
if (e.type != "keydown") {
|
||||
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) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (var i = 0; i < window.keyBindings.length; i++) {
|
||||
var keyBinding = window.keyBindings[i];
|
||||
if (keyBinding.ctrl == e.ctrlKey
|
||||
@@ -189,7 +245,6 @@ window.createTerminal = (options, theme, keyBindings) => {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
e.preventDefault();
|
||||
window.terminalBridge.invokeCommand(keyBinding.command);
|
||||
}
|
||||
|
||||
@@ -30,6 +30,10 @@
|
||||
SwitchToTerm7,
|
||||
SwitchToTerm8,
|
||||
SwitchToTerm9,
|
||||
DuplicateTab
|
||||
DuplicateTab,
|
||||
ReconnectTab,
|
||||
IncreaseFontSize,
|
||||
DecreaseFontSize,
|
||||
ResetFontSize
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@
|
||||
GetCommandPathRequest = 15,
|
||||
PauseTerminalOutputRequest = 16,
|
||||
PauseTerminalOutputResponse = 17,
|
||||
QuitApplicationRequest = 18
|
||||
QuitApplicationRequest = 18,
|
||||
ReadTextFileRequest = 19
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace FluentTerminal.Models.Requests
|
||||
{
|
||||
public class ReadTextFileRequest : IMessage
|
||||
{
|
||||
public byte Identifier => (byte)MessageIdentifiers.ReadTextFileRequest;
|
||||
|
||||
public string Path { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,7 @@
|
||||
namespace FluentTerminal.Models.Responses
|
||||
{
|
||||
public class CommonResponse : IMessage
|
||||
public class CommonResponse : TerminalResponse
|
||||
{
|
||||
public virtual byte Identifier => (byte) MessageIdentifiers.CommonResponse;
|
||||
|
||||
public bool Success { get; set; }
|
||||
|
||||
public string Error { get; set; }
|
||||
public override byte Identifier => (byte) MessageIdentifiers.CommonResponse;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
namespace FluentTerminal.Models.Responses
|
||||
{
|
||||
public class CreateTerminalResponse : TerminalResponse, IMessage
|
||||
public class CreateTerminalResponse : TerminalResponse
|
||||
{
|
||||
public byte Identifier => (byte) MessageIdentifiers.CreateTerminalResponse;
|
||||
public override byte Identifier => (byte) MessageIdentifiers.CreateTerminalResponse;
|
||||
|
||||
public string Name { get; set; }
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
namespace FluentTerminal.Models.Responses
|
||||
{
|
||||
public class PauseTerminalOutputResponse : TerminalResponse, IMessage
|
||||
public class PauseTerminalOutputResponse : TerminalResponse
|
||||
{
|
||||
public byte Identifier => (byte) MessageIdentifiers.PauseTerminalOutputResponse;
|
||||
public override byte Identifier => (byte) MessageIdentifiers.PauseTerminalOutputResponse;
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace FluentTerminal.Models.Responses
|
||||
namespace FluentTerminal.Models.Responses
|
||||
{
|
||||
public class TerminalResponse
|
||||
public abstract class TerminalResponse : IMessage
|
||||
{
|
||||
public abstract byte Identifier { get; }
|
||||
public bool Success { get; set; }
|
||||
public string Error { get; set; }
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
namespace FluentTerminal.Models
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace FluentTerminal.Models
|
||||
{
|
||||
public class TabTheme
|
||||
{
|
||||
|
||||
@@ -71,43 +71,43 @@
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
<DefaultLanguage>en</DefaultLanguage>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
<DefaultLanguage>en</DefaultLanguage>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
<DefaultLanguage>en</DefaultLanguage>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
<DefaultLanguage>en</DefaultLanguage>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
<DefaultLanguage>en</DefaultLanguage>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
<DefaultLanguage>en</DefaultLanguage>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
<DefaultLanguage>en</DefaultLanguage>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
<DefaultLanguage>en</DefaultLanguage>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
<DefaultLanguage>en</DefaultLanguage>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
<DefaultLanguage>en</DefaultLanguage>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<AppxManifest Include="Package.appxmanifest">
|
||||
|
||||
@@ -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.6.1.0" />
|
||||
<Identity Name="53621FSApps.FluentTerminal" Publisher="CN=BDC72197-B634-438A-B863-16DCB7D90C85" Version="0.7.2.0" />
|
||||
|
||||
<Properties>
|
||||
<DisplayName>Fluent Terminal</DisplayName>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<default>
|
||||
<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" />
|
||||
<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" />
|
||||
</default>
|
||||
@@ -24,5 +24,6 @@ namespace FluentTerminal.RuntimeComponent.Interfaces
|
||||
|
||||
event EventHandler<object> OnOutput;
|
||||
event EventHandler<string> OnPaste;
|
||||
event EventHandler<string> OnSessionRestart;
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@ namespace FluentTerminal.RuntimeComponent.WebAllowedObjects
|
||||
_terminalEventListener = terminalEventListener;
|
||||
_terminalEventListener.OnOutput += OnOutput;
|
||||
_terminalEventListener.OnPaste += OnPaste;
|
||||
_terminalEventListener.OnSessionRestart += OnSessionRestart;
|
||||
}
|
||||
|
||||
private void OnPaste(object sender, string e)
|
||||
@@ -29,8 +30,14 @@ 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,6 +53,9 @@ 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</DefineConstants>
|
||||
<DefineConstants>TRACE;X64;STORE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
@@ -203,7 +203,7 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Autofac">
|
||||
<Version>5.1.2</Version>
|
||||
<Version>5.2.0</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="GlobalHotKey">
|
||||
<Version>1.1.0</Version>
|
||||
|
||||
@@ -134,6 +134,9 @@ 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;
|
||||
@@ -214,6 +217,31 @@ 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 = request.Profile.UseBuffer;
|
||||
_enableBuffer = false; // request.Profile.UseBuffer;
|
||||
|
||||
_reader?.Dispose();
|
||||
_reader = null;
|
||||
@@ -91,6 +91,11 @@ namespace FluentTerminal.SystemTray.Services.ConPty
|
||||
_reader?.SetPaused(value);
|
||||
}
|
||||
|
||||
~ConPtySession()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
|
||||
#region IDisposable Support
|
||||
|
||||
private bool _disposed;
|
||||
@@ -113,6 +118,7 @@ namespace FluentTerminal.SystemTray.Services.ConPty
|
||||
public void Dispose()
|
||||
{
|
||||
_terminal.Exited -= _terminal_Exited;
|
||||
_terminal.OutputReady -= _terminal_OutputReady;
|
||||
Dispose(true);
|
||||
}
|
||||
|
||||
|
||||
@@ -42,10 +42,19 @@ 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,9 +175,12 @@ 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 = request.Profile.UseBuffer;
|
||||
_enableBuffer = false; // request.Profile.UseBuffer;
|
||||
|
||||
Id = request.Id;
|
||||
_terminalsManager = terminalsManager;
|
||||
|
||||
@@ -39,6 +39,7 @@ namespace FluentTerminal.SystemTray
|
||||
|
||||
private void Exit(object sender, EventArgs e)
|
||||
{
|
||||
_notifyIcon.Dispose(); // cleans up the tray icon
|
||||
Application.Exit();
|
||||
}
|
||||
|
||||
|
||||
@@ -536,6 +536,11 @@ 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);
|
||||
|
||||
@@ -1,643 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
}
|
||||
@@ -12,6 +12,9 @@
|
||||
|
||||
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
|
||||
@@ -28,48 +31,49 @@ A Terminal Emulator based on UWP and web technologies.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
## Languages
|
||||
- English
|
||||
- German
|
||||
- Spanish
|
||||
- French
|
||||
- Simplified Chinese
|
||||
- Hindi
|
||||
- Italian
|
||||
- Arabic
|
||||
- Arabic (Iraq)
|
||||
- Azerbaijani
|
||||
- Chinese (Simplified)
|
||||
- Chinese (Traditional)
|
||||
- Dutch
|
||||
- English
|
||||
- French
|
||||
- German
|
||||
- Hebrew
|
||||
- Hindi
|
||||
- Indonesian
|
||||
- Italian
|
||||
- Japanese
|
||||
- Korean
|
||||
- Polish
|
||||
- Portuguese (Brazilian)
|
||||
- Romanian
|
||||
- Russians
|
||||
- Hebrew
|
||||
- Russian
|
||||
- Spanish
|
||||
- Ukrainian
|
||||
|
||||
|
||||
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
|
||||
@@ -78,27 +82,10 @@ Sign up to [POEditor](https://poeditor.com/join/project/TfKNIt826z) to help with
|
||||
scoop install fluent-terminal-np
|
||||
```
|
||||
|
||||
### Bundled install script
|
||||
### Manual
|
||||
|
||||
- Download and extract the latest [release](https://github.com/felixse/FluentTerminal/releases).
|
||||
- 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.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
- double click the *.appxbundle
|
||||
- **Optional:** Install Context menu integration from [here](https://github.com/felixse/FluentTerminal/tree/master/Explorer%20Context%20Menu%20Integration)
|
||||
- Double click the *.appxbundle file.
|
||||
|
||||
## 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)
|
||||
|
Before Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 277 KiB |
|
After Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 385 KiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
Before Width: | Height: | Size: 201 KiB |