Skip to content

Commit

Permalink
Merge pull request #5 from DSaladinCH/develop
Browse files Browse the repository at this point in the history
Version 0.6.3
  • Loading branch information
DominicSaladin authored Apr 21, 2023
2 parents 6468df2 + bc31265 commit d1f6bb7
Show file tree
Hide file tree
Showing 10 changed files with 234 additions and 19 deletions.
1 change: 0 additions & 1 deletion speed-time/App.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DSaladin.SpeedTime"
StartupUri="MainWindow.xaml"
SessionEnding="App_SessionEnding"
Exit="Application_Exit">
<Application.Resources>
Expand Down
17 changes: 11 additions & 6 deletions speed-time/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Markup;

namespace DSaladin.SpeedTime
{
Expand All @@ -39,17 +40,16 @@ record AppVersion(string Version, DateTime ReleaseDate);

protected override async void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);

await dbContext.Database.EnsureCreatedAsync();
await dbContext.Database.MigrateAsync();
await DataService.LoadSettings();

if (string.IsNullOrEmpty(SettingsModel.Instance.UiLanguage))
Language.SpeedTime.Culture = Thread.CurrentThread.CurrentCulture;
if (string.IsNullOrEmpty(SettingsModel.Instance.SelectedUiLanguage))
Language.SpeedTime.Culture = new CultureInfo(Thread.CurrentThread.CurrentCulture.Name);
else
Language.SpeedTime.Culture = new CultureInfo(SettingsModel.Instance.UiLanguage);
Language.SpeedTime.Culture = new CultureInfo(SettingsModel.Instance.SelectedUiLanguage);

Thread.CurrentThread.CurrentCulture = Language.SpeedTime.Culture;
Thread.CurrentThread.CurrentUICulture = Language.SpeedTime.Culture;

TrackTime? lastTrackedTime = await dbContext.TrackedTimes.OrderBy(tt => tt.Id).LastOrDefaultAsync();
Expand All @@ -67,6 +67,11 @@ protected override async void OnStartup(StartupEventArgs e)
hotKeyManager.KeyPressed += HotKeyManagerPressed;

SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);

base.OnStartup(e);

MainWindow mainWindow = new();
mainWindow.Show();
}

private async void HotKeyManagerPressed(object? sender, KeyPressedEventArgs e)
Expand Down Expand Up @@ -161,7 +166,7 @@ internal static async Task CheckForUpdate()
if (!responseMessage.IsSuccessStatusCode)
return;


List<AppVersion>? versions = await System.Text.Json.JsonSerializer.DeserializeAsync<List<AppVersion>>(responseMessage.Content.ReadAsStream());
if (versions is null || versions.Count == 0)
return;
Expand Down
4 changes: 3 additions & 1 deletion speed-time/Converter/DateTimeConverter.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
Expand All @@ -20,7 +22,7 @@ public object Convert(object value, Type targetType, object parameter, CultureIn
return value;

SourceValue = (DateTime)value;
return ((DateTime)value).ToString((string)parameter);
return ((DateTime)value).ToString((string)parameter, Language.SpeedTime.Culture);
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
Expand Down
5 changes: 3 additions & 2 deletions speed-time/Dialogs/UserSettings.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,12 @@
<Grid Margin="0,10,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="60" />
<ColumnDefinition Width="150" />
</Grid.ColumnDefinitions>

<Label Grid.Column="0" Content="{x:Static language:SpeedTime.settings_ui_language}" FontWeight="Bold" />
<potato:DSTextBox Grid.Column="1" Height="30" HorizontalContentAlignment="Right" Text="{Binding Source={x:Static models:SettingsModel.Instance}, Path=UiLanguage}" />
<ComboBox Grid.Column="1" Height="30" ItemsSource="{Binding Source={x:Static models:SettingsModel.AvailableLanguages}}" DisplayMemberPath="Name"
SelectedValuePath="Id" SelectedValue="{Binding Source={x:Static models:SettingsModel.Instance}, Path=SelectedUiLanguage}" />
</Grid>
</StackPanel>
<StackPanel Grid.Row="2" HorizontalAlignment="Center">
Expand Down
4 changes: 2 additions & 2 deletions speed-time/Dialogs/UserSettings.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,13 @@ public UserSettings()

private void Close_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrEmpty(SettingsModel.Instance.UiLanguage))
if (string.IsNullOrEmpty(SettingsModel.Instance.SelectedUiLanguage))
{
Close(false);
return;
}

Close(SpeedTime.Language.SpeedTime.Culture.Name != SettingsModel.Instance.UiLanguage);
Close(SpeedTime.Language.SpeedTime.Culture.Name != SettingsModel.Instance.SelectedUiLanguage);
}
}
}
186 changes: 186 additions & 0 deletions speed-time/Language/SpeedTime.es-ES.resx
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Cancel" xml:space="preserve">
<value>Cancelar</value>
</data>
<data name="quicktimetracker.afk" xml:space="preserve">
<value>AFK</value>
</data>
<data name="quicktimetracker.break" xml:space="preserve">
<value>Romper</value>
</data>
<data name="quicktimetracker.last-entry" xml:space="preserve">
<value>Última entrada: {0}</value>
</data>
<data name="quicktimetracker.placeholder" xml:space="preserve">
<value>El título de su trabajo</value>
</data>
<data name="settings.auto-break" xml:space="preserve">
<value>Pausa automática al bloquear</value>
</data>
<data name="settings.title" xml:space="preserve">
<value>Ajustes</value>
</data>
<data name="settings.ui-language" xml:space="preserve">
<value>Idioma de la interfaz</value>
</data>
<data name="settings.weekly-hour" xml:space="preserve">
<value>Horas de trabajo semanales</value>
</data>
<data name="timeeditor.break" xml:space="preserve">
<value>Pausa</value>
</data>
<data name="timeeditor.title" xml:space="preserve">
<value>Editor de tiempo</value>
</data>
<data name="times.current-date-format" xml:space="preserve">
<value>dd MMM yyyy</value>
</data>
<data name="times.current.hours" xml:space="preserve">
<value>Hora: {0:N2}h</value>
</data>
<data name="times.current.title" xml:space="preserve">
<value>Actual: {0}</value>
</data>
<data name="times.date.is-free-day" xml:space="preserve">
<value>Día libre</value>
</data>
<data name="times.totals.title" xml:space="preserve">
<value>Total</value>
</data>
<data name="updateapp.cancel" xml:space="preserve">
<value>No</value>
</data>
<data name="updateapp.download" xml:space="preserve">
<value>Descarga</value>
</data>
<data name="updateapp.release-date-format" xml:space="preserve">
<value>dddd, dd 'de' MMMM 'de' yyyy</value>
</data>
<data name="updateapp.title" xml:space="preserve">
<value>Actualización disponible!</value>
</data>
<data name="updateapp.version-release-date" xml:space="preserve">
<value>Lanzada el: {0}.</value>
</data>
<data name="updateapp.version-text" xml:space="preserve">
<value>La versión {0} está disponible para su descarga.</value>
</data>
</root>
3 changes: 2 additions & 1 deletion speed-time/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
Expand All @@ -25,8 +26,8 @@ public partial class MainWindow : DSWindow
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainWindowViewModel();
InitializeComponent();
}
}
}
2 changes: 2 additions & 0 deletions speed-time/Model/FileDataService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public async Task LoadSettings()
{
FileStream stream = File.OpenRead(filePath);
settings = await JsonSerializer.DeserializeAsync<SettingsModel>(stream);
stream.Close();
}
catch { }

Expand All @@ -44,6 +45,7 @@ public async Task SaveSettings()
Directory.CreateDirectory(appFolderPath);

File.WriteAllText(Path.Combine(appFolderPath, FILENAME), Encoding.UTF8.GetString(stream.ToArray()));
stream.Close();
}
}
}
21 changes: 16 additions & 5 deletions speed-time/Model/SettingsModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ namespace DSaladin.SpeedTime.Model
{
internal class SettingsModel : INotifyPropertyChanged
{
internal record UiLanguage(string Id, string Name);

private static SettingsModel instance = new();
public static SettingsModel Instance
{
Expand Down Expand Up @@ -48,21 +50,30 @@ public double WeeklyWorkHours
}
}

private string uiLanguage = "";
public string UiLanguage
public static List<UiLanguage> AvailableLanguages { get; } = new()
{
new("en-US", "English (USA)"),
new("de-CH", "Deutsch (Schweiz)"),
new("es-ES", "Español (España)")
};

private string selectedUiLanguage = "";
public string SelectedUiLanguage
{
get { return uiLanguage; }
get { return selectedUiLanguage; }
set
{
uiLanguage = value;
selectedUiLanguage = value;
NotifyPropertyChanged();
}
}


public static void Load(SettingsModel settings)
{
Instance = settings;

if (!AvailableLanguages.Exists(l => l.Id == Instance.SelectedUiLanguage))
Instance.SelectedUiLanguage = AvailableLanguages[0].Id;
}

public event PropertyChangedEventHandler? PropertyChanged;
Expand Down
Loading

0 comments on commit d1f6bb7

Please sign in to comment.